mirror of
https://github.com/schwabe/ics-openvpn.git
synced 2024-09-20 12:02:28 +02:00
Add certificate CN print
Need to fix string for email and order --HG-- extra : rebase_source : c3d5858d53d2f8f340b0d4a07434021f194a247a
This commit is contained in:
parent
ffcd37e623
commit
2a9037c749
@ -51,5 +51,17 @@
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
android:text="@string/file_nothing_selected" />
|
||||
</RelativeLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/file_selected_description"
|
||||
android:layout_width="wrap_content"
|
||||
android:textIsSelectable="true"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_below="@+id/file_selected_item"
|
||||
android:layout_marginLeft="16dip"
|
||||
android:layout_toLeftOf="@+id/file_select_button"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true" />
|
||||
|
||||
</RelativeLayout>
|
@ -1,5 +1,6 @@
|
||||
package de.blinkt.openvpn;
|
||||
|
||||
import de.blinkt.openvpn.core.X509Utils;
|
||||
import android.app.Fragment;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@ -22,19 +23,21 @@ public class FileSelectLayout extends LinearLayout implements OnClickListener {
|
||||
private boolean mBase64Encode;
|
||||
private String mTitle;
|
||||
private boolean mShowClear;
|
||||
private TextView mDataDetails;
|
||||
|
||||
public FileSelectLayout( Context context,AttributeSet attrset) {
|
||||
super(context,attrset);
|
||||
inflate(getContext(), R.layout.file_select, this);
|
||||
|
||||
|
||||
TypedArray ta = context.obtainStyledAttributes(attrset,R.styleable.FileSelectLayout);
|
||||
|
||||
|
||||
mTitle = ta.getString(R.styleable.FileSelectLayout_title);
|
||||
|
||||
|
||||
TextView tview = (TextView) findViewById(R.id.file_title);
|
||||
tview.setText(mTitle);
|
||||
|
||||
|
||||
mDataView = (TextView) findViewById(R.id.file_selected_item);
|
||||
mDataDetails = (TextView) findViewById(R.id.file_selected_description);
|
||||
mSelectButton = (Button) findViewById(R.id.file_select_button);
|
||||
mSelectButton.setOnClickListener(this);
|
||||
|
||||
@ -46,7 +49,7 @@ public class FileSelectLayout extends LinearLayout implements OnClickListener {
|
||||
mTaskId = i;
|
||||
mFragment = fragment;
|
||||
}
|
||||
|
||||
|
||||
public void getCertificateFileDialog() {
|
||||
Intent startFC = new Intent(getContext(),FileSelect.class);
|
||||
startFC.putExtra(FileSelect.START_DATA, mData);
|
||||
@ -58,20 +61,24 @@ public class FileSelectLayout extends LinearLayout implements OnClickListener {
|
||||
mFragment.startActivityForResult(startFC,mTaskId);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public String getData() {
|
||||
return mData;
|
||||
}
|
||||
|
||||
public void setData(String data) {
|
||||
mData = data;
|
||||
if(data==null)
|
||||
if(data==null) {
|
||||
mDataView.setText(mFragment.getString(R.string.no_data));
|
||||
else if(mData.startsWith(VpnProfile.INLINE_TAG))
|
||||
mDataView.setText(R.string.inline_file_data);
|
||||
else
|
||||
mDataView.setText(data);
|
||||
|
||||
mDataDetails.setText("");
|
||||
}else {
|
||||
if(mData.startsWith(VpnProfile.INLINE_TAG))
|
||||
mDataView.setText(R.string.inline_file_data);
|
||||
else
|
||||
mDataView.setText(data);
|
||||
mDataDetails.setText(X509Utils.getCertificateFriendlyName(data));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -88,5 +95,5 @@ public class FileSelectLayout extends LinearLayout implements OnClickListener {
|
||||
public void setShowClear() {
|
||||
mShowClear=true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -45,6 +45,7 @@ import de.blinkt.openvpn.R;
|
||||
import de.blinkt.openvpn.core.NativeUtils;
|
||||
import de.blinkt.openvpn.core.OpenVPN;
|
||||
import de.blinkt.openvpn.core.OpenVpnService;
|
||||
import de.blinkt.openvpn.core.X509Utils;
|
||||
|
||||
public class VpnProfile implements Serializable{
|
||||
// Note that this class cannot be moved to core where it belongs since
|
||||
@ -52,7 +53,7 @@ public class VpnProfile implements Serializable{
|
||||
// The Serializable documentation mentions that class name change are possible
|
||||
// but the how is unclear
|
||||
//
|
||||
|
||||
|
||||
private static final long serialVersionUID = 7085688938959334563L;
|
||||
public static final int TYPE_CERTIFICATES=0;
|
||||
public static final int TYPE_PKCS12=1;
|
||||
@ -79,7 +80,7 @@ public class VpnProfile implements Serializable{
|
||||
public transient String mTransientPW=null;
|
||||
public transient String mTransientPCKS12PW=null;
|
||||
private transient PrivateKey mPrivateKey;
|
||||
|
||||
|
||||
// variable named wrong and should haven beeen transient
|
||||
// but needs to keep wrong name to guarante loading of old
|
||||
// profiles
|
||||
@ -590,7 +591,7 @@ public class VpnProfile implements Serializable{
|
||||
|
||||
if(nonNull(mCaFilename)) {
|
||||
try {
|
||||
Certificate cacert = getCacertFromFile();
|
||||
Certificate cacert = X509Utils.getCertificateFromFile(mCaFilename);
|
||||
X509Certificate[] newcachain = new X509Certificate[cachain.length+1];
|
||||
for(int i=0;i<cachain.length;i++)
|
||||
newcachain[i]=cachain[i];
|
||||
@ -645,18 +646,6 @@ public class VpnProfile implements Serializable{
|
||||
}
|
||||
return null;
|
||||
}
|
||||
private Certificate getCacertFromFile() throws FileNotFoundException, CertificateException {
|
||||
CertificateFactory certFact = CertificateFactory.getInstance("X.509");
|
||||
|
||||
InputStream inStream;
|
||||
|
||||
if(mCaFilename.startsWith(INLINE_TAG))
|
||||
inStream = new ByteArrayInputStream(mCaFilename.replace(INLINE_TAG,"").getBytes());
|
||||
else
|
||||
inStream = new FileInputStream(mCaFilename);
|
||||
|
||||
return certFact.generateCertificate(inStream);
|
||||
}
|
||||
|
||||
|
||||
//! Return an error if somethign is wrong
|
||||
@ -681,6 +670,8 @@ public class VpnProfile implements Serializable{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//! Openvpn asks for a "Private Key", this should be pkcs12 key
|
||||
//
|
||||
public String getPasswordPrivateKey() {
|
||||
|
78
src/de/blinkt/openvpn/core/X509Utils.java
Normal file
78
src/de/blinkt/openvpn/core/X509Utils.java
Normal file
@ -0,0 +1,78 @@
|
||||
package de.blinkt.openvpn.core;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.Reader;
|
||||
import java.io.StringReader;
|
||||
import java.security.KeyFactory;
|
||||
import java.security.KeyPair;
|
||||
import java.security.Principal;
|
||||
import java.security.cert.Certificate;
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.CertificateFactory;
|
||||
import java.security.cert.X509Certificate;
|
||||
|
||||
import javax.security.auth.x500.X500Principal;
|
||||
|
||||
import org.spongycastle.util.io.pem.PemObject;
|
||||
import org.spongycastle.util.io.pem.PemReader;
|
||||
|
||||
import android.text.TextUtils;
|
||||
|
||||
import de.blinkt.openvpn.VpnProfile;
|
||||
|
||||
public class X509Utils {
|
||||
public static Certificate getCertificateFromFile(String certfilename) throws FileNotFoundException, CertificateException {
|
||||
CertificateFactory certFact = CertificateFactory.getInstance("X.509");
|
||||
|
||||
InputStream inStream;
|
||||
|
||||
if(certfilename.startsWith(VpnProfile.INLINE_TAG))
|
||||
inStream = new ByteArrayInputStream(certfilename.replace(VpnProfile.INLINE_TAG,"").getBytes());
|
||||
else
|
||||
inStream = new FileInputStream(certfilename);
|
||||
|
||||
return certFact.generateCertificate(inStream);
|
||||
}
|
||||
|
||||
public static PemObject readPemObjectFromFile (String keyfilename) throws CertificateException, IOException {
|
||||
|
||||
Reader inStream;
|
||||
|
||||
if(keyfilename.startsWith(VpnProfile.INLINE_TAG))
|
||||
inStream = new StringReader(keyfilename.replace(VpnProfile.INLINE_TAG,""));
|
||||
else
|
||||
inStream = new FileReader(new File(keyfilename));
|
||||
|
||||
PemReader pr = new PemReader(inStream);
|
||||
PemObject r = pr.readPemObject();
|
||||
pr.close();
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public static String getCertificateFriendlyName (String filename) {
|
||||
if(!TextUtils.isEmpty(filename)) {
|
||||
try {
|
||||
X509Certificate cert = (X509Certificate) getCertificateFromFile(filename);
|
||||
|
||||
String friendly = cert.getSubjectDN().getName();
|
||||
|
||||
return friendly;
|
||||
|
||||
} catch (Exception e) {
|
||||
OpenVPN.logError("Could not read certificate" + e.getLocalizedMessage());
|
||||
}
|
||||
}
|
||||
return "Could not read/parse certificate";
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -116,7 +116,7 @@ public class Settings_Basic extends Fragment implements View.OnClickListener, On
|
||||
return mView;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
@ -138,7 +138,7 @@ public class Settings_Basic extends Fragment implements View.OnClickListener, On
|
||||
// Private key files may result in showing/hiding the private key password dialog
|
||||
if(fsl==mClientKey) {
|
||||
changeType(mType.getSelectedItemPosition());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -183,13 +183,13 @@ public class Settings_Basic extends Fragment implements View.OnClickListener, On
|
||||
if(mProfile.requireTLSKeyPassword())
|
||||
mView.findViewById(R.id.key_password_layout).setVisibility(View.VISIBLE);
|
||||
break;
|
||||
|
||||
|
||||
case VpnProfile.TYPE_USERPASS_PKCS12:
|
||||
mView.findViewById(R.id.userpassword).setVisibility(View.VISIBLE);
|
||||
case VpnProfile.TYPE_PKCS12:
|
||||
mView.findViewById(R.id.pkcs12).setVisibility(View.VISIBLE);
|
||||
break;
|
||||
|
||||
|
||||
case VpnProfile.TYPE_STATICKEYS:
|
||||
mView.findViewById(R.id.statickeys).setVisibility(View.VISIBLE);
|
||||
break;
|
||||
|
84
src/org/spongycastle/util/io/pem/PemReader.java
Normal file
84
src/org/spongycastle/util/io/pem/PemReader.java
Normal file
@ -0,0 +1,84 @@
|
||||
package org.spongycastle.util.io.pem;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.spongycastle.util.encoders.Base64;
|
||||
|
||||
public class PemReader
|
||||
extends BufferedReader
|
||||
{
|
||||
private static final String BEGIN = "-----BEGIN ";
|
||||
private static final String END = "-----END ";
|
||||
|
||||
public PemReader(Reader reader)
|
||||
{
|
||||
super(reader);
|
||||
}
|
||||
|
||||
public PemObject readPemObject()
|
||||
throws IOException
|
||||
{
|
||||
String line = readLine();
|
||||
|
||||
while (line != null && !line.startsWith(BEGIN))
|
||||
{
|
||||
line = readLine();
|
||||
}
|
||||
|
||||
if (line != null)
|
||||
{
|
||||
line = line.substring(BEGIN.length());
|
||||
int index = line.indexOf('-');
|
||||
String type = line.substring(0, index);
|
||||
|
||||
if (index > 0)
|
||||
{
|
||||
return loadObject(type);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private PemObject loadObject(String type)
|
||||
throws IOException
|
||||
{
|
||||
String line;
|
||||
String endMarker = END + type;
|
||||
StringBuffer buf = new StringBuffer();
|
||||
List headers = new ArrayList();
|
||||
|
||||
while ((line = readLine()) != null)
|
||||
{
|
||||
if (line.indexOf(":") >= 0)
|
||||
{
|
||||
int index = line.indexOf(':');
|
||||
String hdr = line.substring(0, index);
|
||||
String value = line.substring(index + 1).trim();
|
||||
|
||||
headers.add(new PemHeader(hdr, value));
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (line.indexOf(endMarker) != -1)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
buf.append(line.trim());
|
||||
}
|
||||
|
||||
if (line == null)
|
||||
{
|
||||
throw new IOException(endMarker + " not found");
|
||||
}
|
||||
|
||||
return new PemObject(type, headers, Base64.decode(buf.toString()));
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user