diff options
| -rw-r--r-- | src/de/blinkt/openvpn/fragments/Settings_Authentication.java | 21 | ||||
| -rw-r--r-- | src/de/blinkt/openvpn/fragments/Settings_Basic.java | 11 | ||||
| -rw-r--r-- | src/de/blinkt/openvpn/fragments/Utils.java | 122 | ||||
| -rw-r--r-- | src/de/blinkt/openvpn/fragments/VPNProfileList.java | 32 | ||||
| -rw-r--r-- | src/de/blinkt/openvpn/views/FileSelectLayout.java | 108 | 
5 files changed, 155 insertions, 139 deletions
| diff --git a/src/de/blinkt/openvpn/fragments/Settings_Authentication.java b/src/de/blinkt/openvpn/fragments/Settings_Authentication.java index d8c4ac6a..ac0d804a 100644 --- a/src/de/blinkt/openvpn/fragments/Settings_Authentication.java +++ b/src/de/blinkt/openvpn/fragments/Settings_Authentication.java @@ -2,6 +2,7 @@ package de.blinkt.openvpn.fragments;  import android.app.Activity;  import android.content.Intent; +import android.os.Build;  import android.os.Bundle;  import android.preference.CheckBoxPreference;  import android.preference.EditTextPreference; @@ -19,7 +20,8 @@ import de.blinkt.openvpn.VpnProfile;  public class Settings_Authentication extends OpenVpnPreferencesFragment implements OnPreferenceChangeListener, OnPreferenceClickListener {  	private static final int SELECT_TLS_FILE = 23223232; -	private CheckBoxPreference mExpectTLSCert; +    private static final int SELECT_TLS_FILE_KITKAT = SELECT_TLS_FILE +1; +    private CheckBoxPreference mExpectTLSCert;  	private CheckBoxPreference mCheckRemoteCN;  	private RemoteCNPreference mRemoteCN;  	private ListPreference mTLSAuthDirection; @@ -159,10 +161,15 @@ public class Settings_Authentication extends OpenVpnPreferencesFragment implemen  	}      void startFileDialog() { -        Intent startFC = new Intent(getActivity(), FileSelect.class); -        startFC.putExtra(FileSelect.START_DATA, mTlsAuthFileData); -        startFC.putExtra(FileSelect.WINDOW_TITLE, R.string.tls_auth_file); -        startActivityForResult(startFC, SELECT_TLS_FILE); +        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { +            Intent startFC = Utils.getFilePickerIntent (Utils.FileType.TLS_AUTH_FILE); +            startActivityForResult(startFC, SELECT_TLS_FILE_KITKAT); +        } else { +            Intent startFC = new Intent(getActivity(), FileSelect.class); +            startFC.putExtra(FileSelect.START_DATA, mTlsAuthFileData); +            startFC.putExtra(FileSelect.WINDOW_TITLE, R.string.tls_auth_file); +            startActivityForResult(startFC, SELECT_TLS_FILE); +        }      }      @Override @@ -180,7 +187,9 @@ public class Settings_Authentication extends OpenVpnPreferencesFragment implemen  			mTlsAuthFileData=result;  			setTlsAuthSummary(result); -		} +		}  else if (requestCode == SELECT_TLS_FILE_KITKAT && requestCode == Activity.RESULT_OK) { + +        }  	}  	private void setTlsAuthSummary(String result) { diff --git a/src/de/blinkt/openvpn/fragments/Settings_Basic.java b/src/de/blinkt/openvpn/fragments/Settings_Basic.java index cf4d22d1..f2fab505 100644 --- a/src/de/blinkt/openvpn/fragments/Settings_Basic.java +++ b/src/de/blinkt/openvpn/fragments/Settings_Basic.java @@ -26,7 +26,6 @@ import android.widget.EditText;  import android.widget.Spinner;  import android.widget.TextView;  import android.widget.ToggleButton; -import de.blinkt.openvpn.activities.FileSelect;  import de.blinkt.openvpn.views.FileSelectLayout;  import de.blinkt.openvpn.R;  import de.blinkt.openvpn.VpnProfile; @@ -64,7 +63,7 @@ public class Settings_Basic extends Fragment implements View.OnClickListener, On -    private void addFileSelectLayout (FileSelectLayout fsl, FileSelectLayout.FileType type) { +    private void addFileSelectLayout (FileSelectLayout fsl, Utils.FileType type) {  		int i = fileselects.size() + CHOOSE_FILE_OFFSET;  		fileselects.put(i, fsl);  		fsl.setFragment(this,i,type); @@ -141,10 +140,10 @@ public class Settings_Basic extends Fragment implements View.OnClickListener, On  		mPassword = (EditText) mView.findViewById(R.id.auth_password);  		mKeyPassword = (EditText) mView.findViewById(R.id.key_password); -		addFileSelectLayout(mCaCert, FileSelectLayout.FileType.CERTIFICATE); -		addFileSelectLayout(mClientCert, FileSelectLayout.FileType.CERTIFICATE); -		addFileSelectLayout(mClientKey, FileSelectLayout.FileType.KEYFILE); -		addFileSelectLayout(mpkcs12, FileSelectLayout.FileType.PKCS12); +		addFileSelectLayout(mCaCert, Utils.FileType.CERTIFICATE); +		addFileSelectLayout(mClientCert, Utils.FileType.CERTIFICATE); +		addFileSelectLayout(mClientKey, Utils.FileType.KEYFILE); +		addFileSelectLayout(mpkcs12, Utils.FileType.PKCS12);  		mCaCert.setShowClear();  		mType.setOnItemSelectedListener(this); diff --git a/src/de/blinkt/openvpn/fragments/Utils.java b/src/de/blinkt/openvpn/fragments/Utils.java new file mode 100644 index 00000000..d7a144ed --- /dev/null +++ b/src/de/blinkt/openvpn/fragments/Utils.java @@ -0,0 +1,122 @@ +package de.blinkt.openvpn.fragments; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.util.Base64; +import android.webkit.MimeTypeMap; + +import java.io.*; +import java.util.TreeSet; +import java.util.Vector; + +public class Utils { + +    @TargetApi(Build.VERSION_CODES.KITKAT) +    public static Intent getFilePickerIntent(FileType fileType) { +        Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT); +        i.addCategory(Intent.CATEGORY_OPENABLE); +        TreeSet<String> supportedMimeTypes = new TreeSet<String>(); +        Vector<String> extensions = new Vector<String>(); + +        switch (fileType) { +            case PKCS12: +                i.setType("application/x-pkcs12"); +                supportedMimeTypes.add("application/x-pkcs12"); +                extensions.add("p12"); +                extensions.add("pfx"); +                break; +            case CERTIFICATE: +                i.setType("application/x-pem-file"); +                supportedMimeTypes.add("application/x-x509-ca-cert"); +                supportedMimeTypes.add("application/x-x509-user-cert"); +                supportedMimeTypes.add("application/x-pem-file"); +                supportedMimeTypes.add("text/plain"); + +                extensions.add("pem"); +                extensions.add("crt"); +                break; +            case KEYFILE: +                i.setType("application/x-pem-file"); +                supportedMimeTypes.add("application/x-pem-file"); +                supportedMimeTypes.add("application/pkcs8"); +                extensions.add("key"); +                break; + +            case OVPN_CONFIG: +                i.setType("application/x-openvpn-profile"); +                supportedMimeTypes.add("application/x-openvpn-profile"); +                supportedMimeTypes.add("application/openvpn-profile"); +                supportedMimeTypes.add("application/ovpn"); +                extensions.add("ovpn"); +                extensions.add("conf"); +                break; +            case TLS_AUTH_FILE: +                i.setType("text/plain"); + +                // Backup .... +                supportedMimeTypes.add("application/pkcs8"); +                extensions.add("txt"); +                extensions.add("key"); +                break; +        } + +        MimeTypeMap mtm = MimeTypeMap.getSingleton(); + +        for (String ext : extensions) { +            String mimeType = mtm.getMimeTypeFromExtension(ext); +            if (mimeType != null) +                supportedMimeTypes.add(mimeType); +            else +                supportedMimeTypes.add("application/octet-stream"); +        } + +        i.putExtra(Intent.EXTRA_MIME_TYPES, supportedMimeTypes.toArray(new String[supportedMimeTypes.size()])); +        return i; +    } + +    public enum FileType { +        PKCS12, +        CERTIFICATE, +        OVPN_CONFIG, +        KEYFILE, +        TLS_AUTH_FILE +    } + +    static private byte[] readBytesFromStream(InputStream input) throws IOException { + +        ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + +        int nRead; +        byte[] data = new byte[16384]; + +        while ((nRead = input.read(data, 0, data.length)) != -1) { +            buffer.write(data, 0, nRead); +        } + +        buffer.flush(); +        input.close(); +        return buffer.toByteArray(); +    } + +    public static String getStringFromFilePickerResult(FileType ft, Intent result, Context c) throws IOException { + +        Uri uri = result.getData(); +        if (uri ==null) +            return null; + +        byte[] fileData = readBytesFromStream(c.getContentResolver().openInputStream(uri)); +        String newData = null; +        switch (ft) { +            case PKCS12: +                newData = Base64.encodeToString(fileData, Base64.DEFAULT); +                break; +            default: +                newData = new String(fileData, "UTF-8"); +                break; +        } +        return newData; +    } +} diff --git a/src/de/blinkt/openvpn/fragments/VPNProfileList.java b/src/de/blinkt/openvpn/fragments/VPNProfileList.java index 1fd875b0..b26f3505 100644 --- a/src/de/blinkt/openvpn/fragments/VPNProfileList.java +++ b/src/de/blinkt/openvpn/fragments/VPNProfileList.java @@ -220,37 +220,7 @@ public class VPNProfileList extends ListFragment {      @TargetApi(Build.VERSION_CODES.KITKAT)      private void startFilePicker() { - - - -        Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT); -        i.addCategory(Intent.CATEGORY_OPENABLE); -        i.setType("application/x-openvpn-profile"); - - -        TreeSet<String> supportedMimeTypes = new TreeSet<String>(); -        supportedMimeTypes.add("application/x-openvpn-profile"); -        supportedMimeTypes.add("application/openvpn-profile"); -        supportedMimeTypes.add("application/ovpn"); - - -        // Webservers unfortunately report this for .conf files sometimes -        supportedMimeTypes.add("text/plain"); -        supportedMimeTypes.add("application/conf"); - -        MimeTypeMap mtm = MimeTypeMap.getSingleton(); - -        for(String ext: new String[] {"ovpn", "conf"}) { -            String mimeType = mtm.getMimeTypeFromExtension(ext); -            if(mimeType!=null) -                supportedMimeTypes.add(mimeType); -            else -                supportedMimeTypes.add("application/octet-stream"); -        } - - - -        i.putExtra(Intent.EXTRA_MIME_TYPES, supportedMimeTypes.toArray(new String[supportedMimeTypes.size()])); +       Intent i = Utils.getFilePickerIntent(Utils.FileType.OVPN_CONFIG);         startActivityForResult(i, FILE_PICKER_RESULT);      } diff --git a/src/de/blinkt/openvpn/views/FileSelectLayout.java b/src/de/blinkt/openvpn/views/FileSelectLayout.java index 57ccd895..18a2a766 100644 --- a/src/de/blinkt/openvpn/views/FileSelectLayout.java +++ b/src/de/blinkt/openvpn/views/FileSelectLayout.java @@ -1,13 +1,7 @@  package de.blinkt.openvpn.views; -import android.annotation.TargetApi; -import android.app.Activity;  import android.net.Uri; -import android.os.Build; -import android.text.TextUtils; -import android.text.style.CharacterStyle;  import android.util.Base64; -import android.webkit.MimeTypeMap;  import de.blinkt.openvpn.R;  import de.blinkt.openvpn.VpnProfile;  import de.blinkt.openvpn.activities.FileSelect; @@ -23,10 +17,9 @@ import android.view.View.OnClickListener;  import android.widget.Button;  import android.widget.LinearLayout;  import android.widget.TextView; +import de.blinkt.openvpn.fragments.Utils;  import java.io.*; -import java.util.TreeSet; -import java.util.Vector;  import static android.os.Build.*; @@ -38,20 +31,10 @@ public class FileSelectLayout extends LinearLayout implements OnClickListener {              String fileData = data.getStringExtra(FileSelect.RESULT_DATA);              setData(fileData, c);          } else if (data != null) { -            Uri uri = data.getData();              try { -                byte[] fileData = readBytesFromStream(c.getContentResolver().openInputStream(uri)); -                String newData = null; -                switch (fileType) { -                    case CERTIFICATE: -                    case KEYFILE: -                        newData = new String(fileData, "UTF-8"); -                        break; -                    case PKCS12: -                        newData = Base64.encodeToString(fileData, Base64.DEFAULT); -                        break; -                } -                setData(VpnProfile.INLINE_TAG + newData, c); +                String newData = Utils.getStringFromFilePickerResult(fileType,data,c); +                if (newData!=null) +                    setData(VpnProfile.INLINE_TAG + newData, c);              } catch (IOException e) {                  VpnStatus.logException(e); @@ -61,35 +44,13 @@ public class FileSelectLayout extends LinearLayout implements OnClickListener {          }      } -    static private byte[] readBytesFromStream(InputStream input) throws IOException { - -        ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - -        int nRead; -        byte[] data = new byte[16384]; - -        while ((nRead = input.read(data, 0, data.length)) != -1) { -            buffer.write(data, 0, nRead); -        } - -        buffer.flush(); -        input.close(); -        return buffer.toByteArray(); -    } - -    public enum FileType { -        PKCS12, -        CERTIFICATE, -        KEYFILE -    } -      private final boolean mIsCertificate;      private TextView mDataView;      private String mData;      private Fragment mFragment;      private int mTaskId;      private Button mSelectButton; -    private FileType fileType; +    private Utils.FileType fileType;      private String mTitle;      private boolean mShowClear;      private TextView mDataDetails; @@ -114,7 +75,7 @@ public class FileSelectLayout extends LinearLayout implements OnClickListener {          ta.recycle();      } -    public void setFragment(Fragment fragment, int i, FileType ft) { +    public void setFragment(Fragment fragment, int i, Utils.FileType ft) {          mTaskId = i;          mFragment = fragment;          fileType = ft; @@ -124,7 +85,7 @@ public class FileSelectLayout extends LinearLayout implements OnClickListener {          Intent startFC = new Intent(getContext(), FileSelect.class);          startFC.putExtra(FileSelect.START_DATA, mData);          startFC.putExtra(FileSelect.WINDOW_TITLE, mTitle); -        if (fileType == FileType.PKCS12) +        if (fileType == Utils.FileType.PKCS12)              startFC.putExtra(FileSelect.DO_BASE64_ENCODE, true);          if (mShowClear)              startFC.putExtra(FileSelect.SHOW_CLEAR_BUTTON, true); @@ -156,62 +117,17 @@ public class FileSelectLayout extends LinearLayout implements OnClickListener {      @Override      public void onClick(View v) {          if (v == mSelectButton) { -            if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) -                startFilePicker(); -            else +            if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { +                Intent startFilePicker = Utils.getFilePickerIntent(fileType); +                mFragment.startActivityForResult(startFilePicker, mTaskId); +            } else {                  getCertificateFileDialog(); +            }          }      } -    @TargetApi(VERSION_CODES.KITKAT) -    private void startFilePicker() { - - -        Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT); -        i.addCategory(Intent.CATEGORY_OPENABLE); -        TreeSet<String> supportedMimeTypes = new TreeSet<String>(); -        Vector<String> extensions = new Vector<String>(); - -        switch (fileType) { -            case PKCS12: -                i.setType("application/x-pkcs12"); -                supportedMimeTypes.add("application/x-pkcs12"); -                extensions.add("p12"); -                extensions.add("pfx"); -                break; -            case CERTIFICATE: -                i.setType("application/x-pem-file"); -                supportedMimeTypes.add("application/x-x509-ca-cert"); -                supportedMimeTypes.add("application/x-x509-user-cert"); -                supportedMimeTypes.add("application/x-pem-file"); -                supportedMimeTypes.add("text/plain"); - -                extensions.add("pem"); -                extensions.add("crt"); -                break; -            case KEYFILE: -                i.setType("application/x-pem-file"); -                supportedMimeTypes.add("application/x-pem-file"); -                supportedMimeTypes.add("application/pkcs8"); -                extensions.add("key"); -                break; -        } -        MimeTypeMap mtm = MimeTypeMap.getSingleton(); - -        for (String ext : new String[]{"ovpn", "conf"}) { -            String mimeType = mtm.getMimeTypeFromExtension(ext); -            if (mimeType != null) -                supportedMimeTypes.add(mimeType); -            else -                supportedMimeTypes.add("application/octet-stream"); -        } - - -        i.putExtra(Intent.EXTRA_MIME_TYPES, supportedMimeTypes.toArray(new String[supportedMimeTypes.size()])); -        mFragment.startActivityForResult(i, mTaskId); -    }      public void setShowClear() {          mShowClear = true; | 
