diff options
57 files changed, 1496 insertions, 1352 deletions
diff --git a/org_apg/AndroidManifest.xml b/org_apg/AndroidManifest.xml index 64bb29ede..34d34c4ae 100644 --- a/org_apg/AndroidManifest.xml +++ b/org_apg/AndroidManifest.xml @@ -42,7 +42,7 @@ android:protectionLevel="dangerous" /> <application - android:name="ApgApplication" + android:name=".ApgApplication" android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name" @@ -217,9 +217,11 @@ android:configChanges="keyboardHidden|orientation|keyboard" android:label="@string/title_preferences" /> <activity - android:name=".ui.KeyServerPreferenceActivity" + android:name=".ui.PreferencesKeyServerActivity" android:configChanges="keyboardHidden|orientation|keyboard" - android:label="@string/title_keyServerPreference" /> + android:label="@string/title_keyServerPreference" + android:uiOptions="splitActionBarWhenNarrow" + android:windowSoftInputMode="stateHidden" /> <activity android:name=".ui.SignKeyActivity" android:configChanges="keyboardHidden|orientation|keyboard" @@ -237,7 +239,7 @@ <!-- TODO: need to be moved into new service model --> <service - android:name=".service.ApgService2" + android:name=".deprecated.ApgService2" android:enabled="true" android:exported="true" android:permission="org.thialfihar.android.apg.permission.READ_KEY_DETAILS" @@ -256,7 +258,7 @@ android:authorities="org.thialfihar.android.apg.provider" android:readPermission="org.thialfihar.android.apg.permission.READ_KEY_DETAILS" /> <provider - android:name=".provider.blob.ApgServiceBlobProvider" + android:name=".deprecated.ApgServiceBlobProvider" android:authorities="org.thialfihar.android.apg.provider.apgserviceblobprovider" android:permission="org.thialfihar.android.apg.permission.STORE_BLOBS" /> </application> diff --git a/org_apg/res/layout/key_server_preference.xml b/org_apg/res/layout/key_server_preference.xml index 2f5645f62..e9b1d5a95 100644 --- a/org_apg/res/layout/key_server_preference.xml +++ b/org_apg/res/layout/key_server_preference.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 Thialfihar <thi@thialfihar.org> +<!-- + Copyright (C) 2010 Thialfihar <thi@thialfihar.org> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,30 +15,29 @@ limitations under the License. --> -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" - android:orientation="vertical"> + android:orientation="vertical" > <LinearLayout android:id="@+android:id/text_layout" android:layout_width="fill_parent" android:layout_height="wrap_content" - android:orientation="horizontal" + android:gravity="center_vertical" android:minHeight="?android:attr/listPreferredItemHeight" - android:gravity="center_vertical"> + android:orientation="horizontal" > <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginBottom="6sp" android:layout_marginLeft="16sp" android:layout_marginRight="6sp" android:layout_marginTop="6sp" - android:layout_marginBottom="6sp" android:layout_weight="1" - android:focusable="true" - android:background="@android:drawable/menuitem_background"> + android:background="@android:drawable/menuitem_background" + android:focusable="true" > <TextView android:id="@+id/title" @@ -51,65 +51,40 @@ android:id="@+id/summary" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_below="@android:id/title" android:layout_alignLeft="@android:id/title" - android:textAppearance="?android:attr/textAppearanceSmall" - android:maxLines="2" /> - + android:layout_below="@android:id/title" + android:maxLines="2" + android:textAppearance="?android:attr/textAppearanceSmall" /> </RelativeLayout> <ImageView android:id="@+id/add" + style="@style/PlusButton" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_gravity="center_vertical" android:layout_marginLeft="4dip" android:layout_marginRight="6dip" - android:layout_gravity="center_vertical" - android:clickable="true" - style="@style/PlusButton"/> - + android:clickable="true" /> </LinearLayout> <View android:id="@+id/separator" android:layout_width="fill_parent" android:layout_height="1dip" - android:background="?android:attr/listDivider"/> + android:background="?android:attr/listDivider" /> <ScrollView android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" - android:orientation="vertical"> + android:orientation="vertical" > <LinearLayout android:id="@+id/editors" android:layout_width="fill_parent" android:layout_height="fill_parent" - android:orientation="vertical"/> - + android:orientation="vertical" /> </ScrollView> - <LinearLayout - android:orientation="horizontal" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - style="@android:style/ButtonBar"> - - <Button - android:text="@android:string/ok" - android:id="@+id/btn_ok" - android:layout_width="0dip" - android:layout_height="wrap_content" - android:layout_weight="1"/> - - <Button - android:text="@android:string/cancel" - android:id="@+id/btn_cancel" - android:layout_width="0dip" - android:layout_height="wrap_content" - android:layout_weight="1"/> - - </LinearLayout> - -</LinearLayout> +</LinearLayout>
\ No newline at end of file diff --git a/org_apg/res/raw/help_about.html b/org_apg/res/raw/help_about.html index 62b577031..3cd5dadf7 100644 --- a/org_apg/res/raw/help_about.html +++ b/org_apg/res/raw/help_about.html @@ -8,7 +8,7 @@ And don't add newlines before or after p tags because of transifex --> <p><a href="https://github.com/dschuermann/apg">https://github.com/dschuermann/apg</a></p> <p>Android Privacy Guard (APG) is a OpenPGP implementation for Android.</p> <p>License: Apache License v2</p> -<p>Developer: Thialfihar (Main developer), Senecaso (QRCode, sign key, upload key), Markus Doits (AIDL), Oliver Runge, Dominik Schürmann (Version 2 and up)</p> +<p>Developer: Thialfihar (Main developer v1.x), Senecaso (QRCode, sign key, upload key), Markus Doits (AIDL), Oliver Runge, Dominik Schürmann (Developer v2.x)</p> <h2>Libraries</h2> <p>• <a href="http://actionbarsherlock.com/">ActionBarSherlock</a> (Apache License v2) diff --git a/org_apg/src/org/thialfihar/android/apg/ApgApplication.java b/org_apg/src/org/thialfihar/android/apg/ApgApplication.java index b56e3182d..586685109 100644 --- a/org_apg/src/org/thialfihar/android/apg/ApgApplication.java +++ b/org_apg/src/org/thialfihar/android/apg/ApgApplication.java @@ -26,7 +26,7 @@ public class ApgApplication extends Application { public void onCreate() { super.onCreate(); - /** Start passphrase cache service */ + /* Start passphrase cache service */ PassphraseCacheService.startCacheService(this); } diff --git a/org_apg/src/org/thialfihar/android/apg/Constants.java b/org_apg/src/org/thialfihar/android/apg/Constants.java index a0aaf5b5f..a9c4d04df 100644 --- a/org_apg/src/org/thialfihar/android/apg/Constants.java +++ b/org_apg/src/org/thialfihar/android/apg/Constants.java @@ -27,8 +27,6 @@ public final class Constants { } public static final class pref { - public static final String HAS_SEEN_HELP = "seenHelp"; - public static final String HAS_SEEN_CHANGE_LOG = "seenChangeLogDialog"; public static final String DEFAULT_ENCRYPTION_ALGORITHM = "defaultEncryptionAlgorithm"; public static final String DEFAULT_HASH_ALGORITHM = "defaultHashAlgorithm"; public static final String DEFAULT_ASCII_ARMOUR = "defaultAsciiArmour"; @@ -44,6 +42,7 @@ public final class Constants { public static final String KEY_SERVERS = "pool.sks-keyservers.net, subkeys.pgp.net, pgp.mit.edu"; } + // TODO: rework! public static final class extras { public static final String PROGRESS = "progress"; public static final String PROGRESS_MAX = "max"; diff --git a/org_apg/src/org/thialfihar/android/apg/DataDestination.java b/org_apg/src/org/thialfihar/android/apg/DataDestination.java deleted file mode 100644 index 6fa60889c..000000000 --- a/org_apg/src/org/thialfihar/android/apg/DataDestination.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.thialfihar.android.apg; - -import java.io.ByteArrayOutputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.Serializable; - -import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.Apg.GeneralException; - -import android.content.Context; -import android.os.Environment; - -public class DataDestination implements Serializable { - - private static final long serialVersionUID = -6478075911319320498L; - - private String mStreamFilename; - private String mFilename; - private int mMode = Id.mode.undefined; - - public DataDestination() { - - } - - public void setMode(int mode) { - mMode = mode; - } - - public void setFilename(String filename) { - mFilename = filename; - } - - public String getStreamFilename() { - return mStreamFilename; - } - - public OutputStream getOutputStream(Context context) throws Apg.GeneralException, - FileNotFoundException, IOException { - OutputStream out = null; - mStreamFilename = null; - - switch (mMode) { - case Id.mode.stream: { - try { - while (true) { - mStreamFilename = Apg.generateRandomString(32); - if (mStreamFilename == null) { - throw new Apg.GeneralException("couldn't generate random file name"); - } - context.openFileInput(mStreamFilename).close(); - } - } catch (FileNotFoundException e) { - // found a name that isn't used yet - } - out = context.openFileOutput(mStreamFilename, Context.MODE_PRIVATE); - break; - } - - case Id.mode.byte_array: { - out = new ByteArrayOutputStream(); - break; - } - - case Id.mode.file: { - if (mFilename.startsWith(Environment.getExternalStorageDirectory().getAbsolutePath())) { - if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - throw new GeneralException( - context.getString(R.string.error_externalStorageNotReady)); - } - } - out = new FileOutputStream(mFilename); - break; - } - - default: { - break; - } - } - - return out; - } -} diff --git a/org_apg/src/org/thialfihar/android/apg/DataSource.java b/org_apg/src/org/thialfihar/android/apg/DataSource.java deleted file mode 100644 index 503e0867f..000000000 --- a/org_apg/src/org/thialfihar/android/apg/DataSource.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.thialfihar.android.apg; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.Serializable; - -import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.Apg.GeneralException; - -import android.content.Context; -import android.net.Uri; -import android.os.Environment; - -public class DataSource implements Serializable { - - private static final long serialVersionUID = 2377217399907415255L; - - private Uri mContentUri = null; - private String mText = null; - private byte[] mData = null; - - public DataSource() { - - } - - public void setUri(Uri uri) { - mContentUri = uri; - mText = null; - mData = null; - } - - public void setUri(String uri) { - if (uri.startsWith("/")) { - setUri(Uri.parse("file://" + uri)); - } else { - setUri(Uri.parse(uri)); - } - } - - public Uri getUri() { - return mContentUri; - } - - public void setText(String text) { - mText = text; - mData = null; - mContentUri = null; - } - - public void setData(byte[] data) { - mData = data; - mText = null; - mContentUri = null; - } - - public boolean isText() { - return mText != null; - } - - public boolean isBinary() { - return mData != null || mContentUri != null; - } - - public byte[] getBytes() { - byte[] bytes = null; - if (mData != null) { - bytes = mData; - } else { - bytes = mText.getBytes(); - } - - return bytes; - } - - public InputData getInputData(Context context, boolean withSize) throws GeneralException, - FileNotFoundException, IOException { - InputStream in = null; - long size = 0; - - if (mContentUri != null) { - if (mContentUri.getScheme().equals("file")) { - // get the rest after "file://" - String path = Uri.decode(mContentUri.toString().substring(7)); - if (path.startsWith(Environment.getExternalStorageDirectory().getAbsolutePath())) { - if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - throw new GeneralException( - context.getString(R.string.error_externalStorageNotReady)); - } - } - in = new FileInputStream(path); - File file = new File(path); - if (withSize) { - size = file.length(); - } - } else { - in = context.getContentResolver().openInputStream(mContentUri); - if (withSize) { - InputStream tmp = context.getContentResolver().openInputStream(mContentUri); - size = Apg.getLengthOfStream(tmp); - tmp.close(); - } - } - } else if (mText != null || mData != null) { - byte[] bytes = null; - if (mData != null) { - bytes = mData; - } else { - bytes = mText.getBytes(); - } - in = new ByteArrayInputStream(bytes); - if (withSize) { - size = bytes.length; - } - } - - return new InputData(in, size); - } - -} diff --git a/org_apg/src/org/thialfihar/android/apg/FileDialog.java b/org_apg/src/org/thialfihar/android/apg/FileDialog.java deleted file mode 100644 index 742379a27..000000000 --- a/org_apg/src/org/thialfihar/android/apg/FileDialog.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2010 Thialfihar <thi@thialfihar.org> - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.thialfihar.android.apg; - -import org.thialfihar.android.apg.R; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.net.Uri; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.ImageButton; -import android.widget.Toast; - -/** - * - * - * SHOUDL BE DELTED, DileDialogFragment is the new implementation - * - * - * @author ds1 - * - */ -public class FileDialog { - private static EditText mFilename; - private static ImageButton mBrowse; - private static CheckBox mCheckBox; - private static Activity mActivity; - private static int mRequestCode; - - public static interface OnClickListener { - public void onCancelClick(); - - public void onOkClick(String filename, boolean checkbox); - } - - public static AlertDialog build(Activity activity, String title, String message, - String defaultFile, OnClickListener onClickListener, String fileManagerTitle, - String fileManagerButton, String checkboxText, int requestCode) { - // TODO: fileManagerTitle and fileManagerButton are deprecated, no use for them right now, - // but maybe the Intent now used will someday support them again, so leaving them in - LayoutInflater inflater = (LayoutInflater) activity - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - AlertDialog.Builder alert = new AlertDialog.Builder(activity); - - alert.setTitle(title); - alert.setMessage(message); - - View view = inflater.inflate(R.layout.file_dialog, null); - - mActivity = activity; - mFilename = (EditText) view.findViewById(R.id.input); - mFilename.setText(defaultFile); - mBrowse = (ImageButton) view.findViewById(R.id.btn_browse); - mBrowse.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - openFile(); - } - }); - mRequestCode = requestCode; - mCheckBox = (CheckBox) view.findViewById(R.id.checkbox); - if (checkboxText == null) { - mCheckBox.setEnabled(false); - mCheckBox.setVisibility(View.GONE); - } else { - mCheckBox.setEnabled(true); - mCheckBox.setVisibility(View.VISIBLE); - mCheckBox.setText(checkboxText); - } - - alert.setView(view); - - final OnClickListener clickListener = onClickListener; - - alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - boolean checked = false; - if (mCheckBox.isEnabled()) { - checked = mCheckBox.isChecked(); - } - clickListener.onOkClick(mFilename.getText().toString(), checked); - } - }); - - alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - clickListener.onCancelClick(); - } - }); - return alert.create(); - } - - public static void setFilename(String filename) { - if (mFilename != null) { - mFilename.setText(filename); - } - } - - /** - * Opens the file manager to select a file to open. - */ - private static void openFile() { - String filename = mFilename.getText().toString(); - - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.addCategory(Intent.CATEGORY_OPENABLE); - - intent.setData(Uri.parse("file://" + filename)); - intent.setType("text/plain"); // only .asc or .gpg files - - try { - mActivity.startActivityForResult(intent, mRequestCode); - } catch (ActivityNotFoundException e) { - // No compatible file manager was found. - Toast.makeText(mActivity, R.string.noFilemanagerInstalled, Toast.LENGTH_SHORT).show(); - } - } -} diff --git a/org_apg/src/org/thialfihar/android/apg/HkpKeyServer.java b/org_apg/src/org/thialfihar/android/apg/HkpKeyServer.java index bfbb30c8c..aa3131a92 100644 --- a/org_apg/src/org/thialfihar/android/apg/HkpKeyServer.java +++ b/org_apg/src/org/thialfihar/android/apg/HkpKeyServer.java @@ -1,4 +1,6 @@ /* + * Copyright (C) 2011 Senecaso + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -42,6 +44,7 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; +import org.thialfihar.android.apg.helper.PGPHelper; import android.text.Html; @@ -178,8 +181,8 @@ public class HkpKeyServer extends KeyServer { KeyInfo info = new KeyInfo(); info.size = Integer.parseInt(matcher.group(1)); info.algorithm = matcher.group(2); - info.keyId = Apg.keyFromHex(matcher.group(3)); - info.fingerPrint = Apg.getSmallFingerPrint(info.keyId); + info.keyId = PGPHelper.keyFromHex(matcher.group(3)); + info.fingerPrint = PGPHelper.getSmallFingerPrint(info.keyId); String chunks[] = matcher.group(4).split("-"); info.date = new GregorianCalendar(Integer.parseInt(chunks[0]), Integer.parseInt(chunks[1]), Integer.parseInt(chunks[2])).getTime(); @@ -210,7 +213,7 @@ public class HkpKeyServer extends KeyServer { HttpClient client = new DefaultHttpClient(); try { HttpGet get = new HttpGet("http://" + mHost + ":" + mPort - + "/pks/lookup?op=get&search=0x" + Apg.keyToHex(keyId)); + + "/pks/lookup?op=get&search=0x" + PGPHelper.keyToHex(keyId)); HttpResponse response = client.execute(get); if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { @@ -220,7 +223,7 @@ public class HkpKeyServer extends KeyServer { HttpEntity entity = response.getEntity(); InputStream is = entity.getContent(); String data = readAll(is, EntityUtils.getContentCharSet(entity)); - Matcher matcher = Apg.PGP_PUBLIC_KEY.matcher(data); + Matcher matcher = PGPHelper.PGP_PUBLIC_KEY.matcher(data); if (matcher.find()) { return matcher.group(1); } @@ -234,7 +237,7 @@ public class HkpKeyServer extends KeyServer { } @Override - void add(String armouredText) throws AddKeyException { + public void add(String armouredText) throws AddKeyException { HttpClient client = new DefaultHttpClient(); try { HttpPost post = new HttpPost("http://" + mHost + ":" + mPort + "/pks/add"); diff --git a/org_apg/src/org/thialfihar/android/apg/Id.java b/org_apg/src/org/thialfihar/android/apg/Id.java index d4d23b80e..bc40f59e6 100644 --- a/org_apg/src/org/thialfihar/android/apg/Id.java +++ b/org_apg/src/org/thialfihar/android/apg/Id.java @@ -18,6 +18,13 @@ package org.thialfihar.android.apg; import org.spongycastle.bcpg.CompressionAlgorithmTags; +/** + * + * TODO: + * + * - refactor ids, some are not needed and can be done with xml + * + */ public final class Id { public static final String TAG = "APG"; @@ -83,7 +90,7 @@ public final class Id { // public static final int query_done = 0x21070010; // public static final int unknown_signature_key = 0x21070011; // } - + // use only lower 16 bits due to compatibility lib public static final class request { public static final int public_keys = 0x00007001; @@ -96,18 +103,18 @@ public final class Id { public static final int import_from_qr_code = 0x00007008; public static final int sign_key = 0x00007009; } - -// public static final class request { -// public static final int public_keys = 0x21070001; -// public static final int secret_keys = 0x21070002; -// public static final int filename = 0x21070003; -// public static final int output_filename = 0x21070004; -// public static final int key_server_preference = 0x21070005; -// public static final int look_up_key_id = 0x21070006; -// public static final int export_to_server = 0x21070007; -// public static final int import_from_qr_code = 0x21070008; -// public static final int sign_key = 0x21070009; -// } + + // public static final class request { + // public static final int public_keys = 0x21070001; + // public static final int secret_keys = 0x21070002; + // public static final int filename = 0x21070003; + // public static final int output_filename = 0x21070004; + // public static final int key_server_preference = 0x21070005; + // public static final int look_up_key_id = 0x21070006; + // public static final int export_to_server = 0x21070007; + // public static final int import_from_qr_code = 0x21070008; + // public static final int sign_key = 0x21070009; + // } public static final class dialog { public static final int pass_phrase = 0x21070001; diff --git a/org_apg/src/org/thialfihar/android/apg/KeyServer.java b/org_apg/src/org/thialfihar/android/apg/KeyServer.java index bf9335a0c..b1420ad0f 100644 --- a/org_apg/src/org/thialfihar/android/apg/KeyServer.java +++ b/org_apg/src/org/thialfihar/android/apg/KeyServer.java @@ -1,4 +1,6 @@ /* + * Copyright (C) 2011 Senecaso + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/org_apg/src/org/thialfihar/android/apg/Preferences.java b/org_apg/src/org/thialfihar/android/apg/Preferences.java index d0b19b5d0..5c7c348ed 100644 --- a/org_apg/src/org/thialfihar/android/apg/Preferences.java +++ b/org_apg/src/org/thialfihar/android/apg/Preferences.java @@ -1,4 +1,7 @@ /* + * Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de> + * Copyright (C) 2010 Thialfihar <thi@thialfihar.org> + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -23,8 +26,7 @@ import android.content.SharedPreferences; import java.util.Vector; /** - * Singelton Implementation of a Preference Helper - * + * Singleton Implementation of a Preference Helper */ public class Preferences { private static Preferences mPreferences; diff --git a/org_apg/src/org/thialfihar/android/apg/util/ApgCon.java b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgCon.java index 7341341d5..d4d8d9a9c 100644 --- a/org_apg/src/org/thialfihar/android/apg/util/ApgCon.java +++ b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgCon.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package org.thialfihar.android.apg.util; +package org.thialfihar.android.apg.deprecated; -import org.thialfihar.android.apg.service.IApgService2; -import org.thialfihar.android.apg.util.ApgConInterface.OnCallFinishListener; +import org.thialfihar.android.apg.deprecated.ApgConInterface.OnCallFinishListener; +import org.thialfihar.android.apg.deprecated.IApgService2; import android.content.ComponentName; import android.content.ContentResolver; diff --git a/org_apg/src/org/thialfihar/android/apg/util/ApgConInterface.java b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgConInterface.java index 406427231..45eb3c5ef 100644 --- a/org_apg/src/org/thialfihar/android/apg/util/ApgConInterface.java +++ b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgConInterface.java @@ -12,7 +12,7 @@ * limitations under the License. */ -package org.thialfihar.android.apg.util; +package org.thialfihar.android.apg.deprecated; public interface ApgConInterface { public static interface OnCallFinishListener { diff --git a/org_apg/src/org/thialfihar/android/apg/service/ApgService2.java b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgService2.java index 5b3de8050..e424c200c 100644 --- a/org_apg/src/org/thialfihar/android/apg/service/ApgService2.java +++ b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgService2.java @@ -12,7 +12,7 @@ * limitations under the License. */ -package org.thialfihar.android.apg.service; +package org.thialfihar.android.apg.deprecated; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -25,19 +25,19 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import org.thialfihar.android.apg.Apg; -import org.thialfihar.android.apg.service.IApgService2; +import org.thialfihar.android.apg.deprecated.IApgService2; import org.thialfihar.android.apg.Id; -import org.thialfihar.android.apg.InputData; import org.thialfihar.android.apg.Preferences; import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.service.IApgService2.Stub; +import org.thialfihar.android.apg.deprecated.IApgService2.Stub; import org.thialfihar.android.apg.Id.database; import org.thialfihar.android.apg.R.string; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.passphrase.PassphraseCacheService; import org.thialfihar.android.apg.provider.KeyRings; import org.thialfihar.android.apg.provider.Keys; import org.thialfihar.android.apg.provider.UserIds; +import org.thialfihar.android.apg.util.InputData; import android.content.ContentResolver; import android.content.Intent; @@ -204,7 +204,7 @@ public class ApgService2 extends PassphraseCacheService { typeWhere = KeyRings.TABLE_NAME + "." + KeyRings.TYPE + " = ?"; typeVal = new String[] { "" + pParams.get("key_type") }; } - return qb.query(Apg.getDatabase().db(), (String[]) pParams.get("columns"), typeWhere, + return qb.query(PGPHelper.getDatabase().db(), (String[]) pParams.get("columns"), typeWhere, typeVal, null, null, orderBy); } @@ -253,7 +253,7 @@ public class ApgService2 extends PassphraseCacheService { long curMkey = mCursor.getLong(0); String curUser = mCursor.getString(1); - String curFprint = Apg.getSmallFingerPrint(curMkey); + String curFprint = PGPHelper.getSmallFingerPrint(curMkey); if (LOCAL_LOGV) Log.v(TAG, "current user: " + curUser + " (" + curFprint + ")"); if (pSearchKeys.contains(curFprint) || pSearchKeys.contains(curUser)) { @@ -427,7 +427,7 @@ public class ApgService2 extends PassphraseCacheService { } private boolean prepareArgs(String pCall, Bundle pArgs, Bundle pReturn) { - Apg.initialize(getBaseContext()); + PGPHelper.initialize(getBaseContext()); /* add default return values for all functions */ addDefaultReturns(pReturn); @@ -493,7 +493,7 @@ public class ApgService2 extends PassphraseCacheService { if (LOCAL_LOGV) Log.v(TAG, "About to encrypt"); try { - Apg.encrypt(getBaseContext(), // context + PGPHelper.encrypt(getBaseContext(), // context in, // input stream out, // output stream pArgs.getBoolean(arg.ARMORED_OUTPUT.name()), // ARMORED_OUTPUT @@ -569,8 +569,8 @@ public class ApgService2 extends PassphraseCacheService { ArrayList<String> ids = new ArrayList<String>(); while (cursor.moveToNext()) { if (LOCAL_LOGV) - Log.v(TAG, "adding key " + Apg.getSmallFingerPrint(cursor.getLong(0))); - fPrints.add(Apg.getSmallFingerPrint(cursor.getLong(0))); + Log.v(TAG, "adding key " + PGPHelper.getSmallFingerPrint(cursor.getLong(0))); + fPrints.add(PGPHelper.getSmallFingerPrint(cursor.getLong(0))); ids.add(cursor.getString(1)); } cursor.close(); @@ -625,7 +625,7 @@ public class ApgService2 extends PassphraseCacheService { if (LOCAL_LOGV) Log.v(TAG, "About to decrypt"); try { - Apg.decrypt(getBaseContext(), in, out, passphrase, null, // progress + PGPHelper.decrypt(getBaseContext(), in, out, passphrase, null, // progress pArgs.getString(arg.SYMMETRIC_PASSPHRASE.name()) != null // symmetric ); } catch (Exception e) { diff --git a/org_apg/src/org/thialfihar/android/apg/provider/blob/ApgServiceBlobDatabase.java b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgServiceBlobDatabase.java index 5122f9da1..cb06ee9ae 100644 --- a/org_apg/src/org/thialfihar/android/apg/provider/blob/ApgServiceBlobDatabase.java +++ b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgServiceBlobDatabase.java @@ -12,9 +12,8 @@ * limitations under the License. */ -package org.thialfihar.android.apg.provider.blob; +package org.thialfihar.android.apg.deprecated; -import org.thialfihar.android.apg.service.ApgService2; import android.content.ContentUris; import android.content.ContentValues; diff --git a/org_apg/src/org/thialfihar/android/apg/provider/blob/ApgServiceBlobProvider.java b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgServiceBlobProvider.java index b16bc398e..823aac989 100644 --- a/org_apg/src/org/thialfihar/android/apg/provider/blob/ApgServiceBlobProvider.java +++ b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgServiceBlobProvider.java @@ -12,10 +12,9 @@ * limitations under the License. */ -package org.thialfihar.android.apg.provider.blob; +package org.thialfihar.android.apg.deprecated; import org.thialfihar.android.apg.Constants; -import org.thialfihar.android.apg.service.ApgService2; import android.content.ContentProvider; import android.content.ContentValues; diff --git a/org_apg/src/org/thialfihar/android/apg/provider/blob/BlobContract.java b/org_apg/src/org/thialfihar/android/apg/deprecated/BlobContract.java index dd9bd2069..0d720dabb 100644 --- a/org_apg/src/org/thialfihar/android/apg/provider/blob/BlobContract.java +++ b/org_apg/src/org/thialfihar/android/apg/deprecated/BlobContract.java @@ -1,3 +1,4 @@ +package org.thialfihar.android.apg.deprecated; //package org.thialfihar.android.apg.provider.blob; // //import android.net.Uri; diff --git a/org_apg/src/org/thialfihar/android/apg/service/IApgService2.aidl b/org_apg/src/org/thialfihar/android/apg/deprecated/IApgService2.aidl index 4eba62655..8b8a35bf3 100644 --- a/org_apg/src/org/thialfihar/android/apg/service/IApgService2.aidl +++ b/org_apg/src/org/thialfihar/android/apg/deprecated/IApgService2.aidl @@ -1,4 +1,4 @@ -package org.thialfihar.android.apg.service; +package org.thialfihar.android.apg.deprecated; interface IApgService2 { diff --git a/org_apg/src/org/thialfihar/android/apg/helper/FileHelper.java b/org_apg/src/org/thialfihar/android/apg/helper/FileHelper.java new file mode 100644 index 000000000..9f8b3ca8c --- /dev/null +++ b/org_apg/src/org/thialfihar/android/apg/helper/FileHelper.java @@ -0,0 +1,57 @@ +package org.thialfihar.android.apg.helper; + +import org.thialfihar.android.apg.R; + +import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.Intent; +import android.net.Uri; +import android.os.Environment; +import android.widget.Toast; + +public class FileHelper { + + /** + * Checks if external storage is mounted if file is located on external storage + * + * @param file + * @return true if storage is mounted + */ + public static boolean isStorageMounted(String file) { + if (file.startsWith(Environment.getExternalStorageDirectory().getAbsolutePath())) { + if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + return false; + } + } + + return true; + } + + /** + * Opens the preferred installed file manager on Android and shows a toast if no manager is + * installed. + * + * @param activity + * @param filename + * default selected file, not supported by all file managers + * @param type + * can be text/plain for example + * @param requestCode + * requestCode used to identify the result coming back from file manager to + * onActivityResult() in your activity + */ + public static void openFile(Activity activity, String filename, String type, int requestCode) { + Intent intent = new Intent(Intent.ACTION_GET_CONTENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + + intent.setData(Uri.parse("file://" + filename)); + intent.setType(type); + + try { + activity.startActivityForResult(intent, requestCode); + } catch (ActivityNotFoundException e) { + // No compatible file manager was found. + Toast.makeText(activity, R.string.noFilemanagerInstalled, Toast.LENGTH_SHORT).show(); + } + } +} diff --git a/org_apg/src/org/thialfihar/android/apg/helper/OtherHelper.java b/org_apg/src/org/thialfihar/android/apg/helper/OtherHelper.java new file mode 100644 index 000000000..6833e9060 --- /dev/null +++ b/org_apg/src/org/thialfihar/android/apg/helper/OtherHelper.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.thialfihar.android.apg.helper; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Calendar; +import java.util.GregorianCalendar; +import android.content.Context; + +public class OtherHelper { + + /** + * Reads html files from /res/raw/example.html to output them as string. See + * http://www.monocube.com/2011/02/08/android-tutorial-html-file-in-webview/ + * + * @param context + * current context + * @param resourceID + * of html file to read + * @return content of html file with formatting + */ + public static String readContentFromResource(Context context, int resourceID) { + InputStream raw = context.getResources().openRawResource(resourceID); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + int i; + try { + i = raw.read(); + while (i != -1) { + stream.write(i); + i = raw.read(); + } + raw.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return stream.toString(); + } + + /** + * Return the number if days between two dates + * + * @param first + * @param second + * @return number of days + */ + public static long getNumDaysBetween(GregorianCalendar first, GregorianCalendar second) { + GregorianCalendar tmp = new GregorianCalendar(); + tmp.setTime(first.getTime()); + long numDays = (second.getTimeInMillis() - first.getTimeInMillis()) / 1000 / 86400; + tmp.add(Calendar.DAY_OF_MONTH, (int) numDays); + while (tmp.before(second)) { + tmp.add(Calendar.DAY_OF_MONTH, 1); + ++numDays; + } + return numDays; + } + +} diff --git a/org_apg/src/org/thialfihar/android/apg/util/Utils.java b/org_apg/src/org/thialfihar/android/apg/helper/PGPConversionHelper.java index d8b76ad33..a406bf6e8 100644 --- a/org_apg/src/org/thialfihar/android/apg/util/Utils.java +++ b/org_apg/src/org/thialfihar/android/apg/helper/PGPConversionHelper.java @@ -14,14 +14,11 @@ * limitations under the License. */ -package org.thialfihar.android.apg.util; +package org.thialfihar.android.apg.helper; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; -import java.util.Calendar; -import java.util.GregorianCalendar; import java.util.Iterator; import java.util.Vector; @@ -29,82 +26,10 @@ import org.spongycastle.openpgp.PGPObjectFactory; import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKeyRing; import org.thialfihar.android.apg.Constants; -import org.thialfihar.android.apg.R; -import android.app.Activity; -import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; import android.util.Log; -import android.widget.Toast; - -public class Utils { - - /** - * Opens the file manager to select a file to open. - */ - public static void openFile(Activity activity, String filename, String type, int requestCode) { - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.addCategory(Intent.CATEGORY_OPENABLE); - - intent.setData(Uri.parse("file://" + filename)); - intent.setType(type); - - try { - activity.startActivityForResult(intent, requestCode); - } catch (ActivityNotFoundException e) { - // No compatible file manager was found. - Toast.makeText(activity, R.string.noFilemanagerInstalled, Toast.LENGTH_SHORT).show(); - } - } - - /** - * Reads html files from /res/raw/example.html to output them as string. See - * http://www.monocube.com/2011/02/08/android-tutorial-html-file-in-webview/ - * - * @param context - * current context - * @param resourceID - * of html file to read - * @return content of html file with formatting - */ - public static String readContentFromResource(Context context, int resourceID) { - InputStream raw = context.getResources().openRawResource(resourceID); - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - int i; - try { - i = raw.read(); - while (i != -1) { - stream.write(i); - i = raw.read(); - } - raw.close(); - } catch (IOException e) { - e.printStackTrace(); - } - return stream.toString(); - } - - /** - * Return the number if days between two dates - * - * @param first - * @param second - * @return number of days - */ - public static long getNumDaysBetween(GregorianCalendar first, GregorianCalendar second) { - GregorianCalendar tmp = new GregorianCalendar(); - tmp.setTime(first.getTime()); - long numDays = (second.getTimeInMillis() - first.getTimeInMillis()) / 1000 / 86400; - tmp.add(Calendar.DAY_OF_MONTH, (int) numDays); - while (tmp.before(second)) { - tmp.add(Calendar.DAY_OF_MONTH, 1); - ++numDays; - } - return numDays; - } +public class PGPConversionHelper { /** * Converts Vector<PGPSecretKey> to a byte[] array to send it by intent to service * @@ -185,5 +110,4 @@ public class Utils { return null; } } - } diff --git a/org_apg/src/org/thialfihar/android/apg/Apg.java b/org_apg/src/org/thialfihar/android/apg/helper/PGPHelper.java index 2c939f895..5eb83363f 100644 --- a/org_apg/src/org/thialfihar/android/apg/Apg.java +++ b/org_apg/src/org/thialfihar/android/apg/helper/PGPHelper.java @@ -1,4 +1,5 @@ /* + * Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de> * Copyright (C) 2010 Thialfihar <thi@thialfihar.org> * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,7 +15,7 @@ * limitations under the License. */ -package org.thialfihar.android.apg; +package org.thialfihar.android.apg.helper; import org.spongycastle.bcpg.ArmoredInputStream; import org.spongycastle.bcpg.ArmoredOutputStream; @@ -62,20 +63,37 @@ import org.spongycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBu import org.spongycastle.openpgp.operator.jcajce.JcaPGPKeyPair; import org.spongycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder; import org.spongycastle.openpgp.operator.jcajce.JcePBESecretKeyEncryptorBuilder; +import org.thialfihar.android.apg.Id.choice; +import org.thialfihar.android.apg.Id.content; +import org.thialfihar.android.apg.Id.database; +import org.thialfihar.android.apg.Id.key; import org.thialfihar.android.apg.Id.return_value; +import org.thialfihar.android.apg.Id.type; +import org.thialfihar.android.apg.Id.choice.algorithm; +import org.thialfihar.android.apg.Id.choice.compression; +import org.thialfihar.android.apg.Id.choice.usage; import org.thialfihar.android.apg.KeyServer.AddKeyException; +import org.thialfihar.android.apg.R.string; import org.thialfihar.android.apg.passphrase.CachedPassPhrase; import org.thialfihar.android.apg.provider.DataProvider; import org.thialfihar.android.apg.provider.Database; import org.thialfihar.android.apg.provider.KeyRings; import org.thialfihar.android.apg.provider.Keys; import org.thialfihar.android.apg.provider.UserIds; +import org.thialfihar.android.apg.service.ApgService; import org.thialfihar.android.apg.ui.BaseActivity; import org.thialfihar.android.apg.ui.widget.KeyEditor; import org.thialfihar.android.apg.ui.widget.SectionView; import org.thialfihar.android.apg.ui.widget.UserIdEditor; +import org.thialfihar.android.apg.util.InputData; import org.thialfihar.android.apg.util.IterableIterator; -import org.thialfihar.android.apg.util.Utils; +import org.thialfihar.android.apg.util.PositionAwareInputStream; +import org.thialfihar.android.apg.util.Primes; +import org.thialfihar.android.apg.Constants; +import org.thialfihar.android.apg.HkpKeyServer; +import org.thialfihar.android.apg.Id; +import org.thialfihar.android.apg.KeyServer; +import org.thialfihar.android.apg.ProgressDialogUpdater; import org.thialfihar.android.apg.R; import android.app.Activity; @@ -122,7 +140,15 @@ import java.util.Map; import java.util.Vector; import java.util.regex.Pattern; -public class Apg { +/** + * TODO: + * + * - Externalize the constants + * + * - Separate this file into different helpers + * + */ +public class PGPHelper { static { // register spongy castle provider @@ -161,13 +187,9 @@ public class Apg { public static final String EXTRA_ENCRYPTED_MESSAGE = "encryptedMessage"; public static final String EXTRA_ENCRYPTED_DATA = "encryptedData"; public static final String EXTRA_RESULT_URI = "resultUri"; - public static final String EXTRA_SIGNATURE = "signature"; - public static final String EXTRA_SIGNATURE_KEY_ID = "signatureKeyId"; - public static final String EXTRA_SIGNATURE_USER_ID = "signatureUserId"; - public static final String EXTRA_SIGNATURE_SUCCESS = "signatureSuccess"; - public static final String EXTRA_SIGNATURE_UNKNOWN = "signatureUnknown"; public static final String EXTRA_SIGNATURE_DATA = "signatureData"; public static final String EXTRA_SIGNATURE_TEXT = "signatureText"; + public static final String EXTRA_SIGNATURE_KEY_ID = "signatureKeyId"; public static final String EXTRA_USER_ID = "userId"; public static final String EXTRA_USER_IDS = "userIds"; public static final String EXTRA_KEY_ID = "keyId"; @@ -426,7 +448,7 @@ public class Apg { public static void buildSecretKey(Context context, ArrayList<String> userIds, ArrayList<PGPSecretKey> keys, ArrayList<Integer> keysUsages, long masterKeyId, String oldPassPhrase, String newPassPhrase, ProgressDialogUpdater progress) - throws Apg.GeneralException, NoSuchProviderException, PGPException, + throws PGPHelper.GeneralException, NoSuchProviderException, PGPException, NoSuchAlgorithmException, SignatureException, IOException, Database.GeneralException { if (progress != null) @@ -1143,9 +1165,9 @@ public class Apg { } public static String getFingerPrint(long keyId) { - PGPPublicKey key = Apg.getPublicKey(keyId); + PGPPublicKey key = PGPHelper.getPublicKey(keyId); if (key == null) { - PGPSecretKey secretKey = Apg.getSecretKey(keyId); + PGPSecretKey secretKey = PGPHelper.getSecretKey(keyId); if (secretKey == null) { return ""; } @@ -1654,9 +1676,9 @@ public class Apg { progress.setProgress(R.string.progress_done, 100, 100); } - public static long getDecryptionKeyId(Context context, InputData data) throws GeneralException, - NoAsymmetricEncryptionException, IOException { - InputStream in = PGPUtil.getDecoderStream(data.getInputStream()); + public static long getDecryptionKeyId(Context context, InputStream inputStream) + throws GeneralException, NoAsymmetricEncryptionException, IOException { + InputStream in = PGPUtil.getDecoderStream(inputStream); PGPObjectFactory pgpF = new PGPObjectFactory(in); PGPEncryptedDataList enc; Object o = pgpF.nextObject(); @@ -1700,9 +1722,9 @@ public class Apg { return secretKey.getKeyID(); } - public static boolean hasSymmetricEncryption(Context context, InputData data) + public static boolean hasSymmetricEncryption(Context context, InputStream inputStream) throws GeneralException, IOException { - InputStream in = PGPUtil.getDecoderStream(data.getInputStream()); + InputStream in = PGPUtil.getDecoderStream(inputStream); PGPObjectFactory pgpF = new PGPObjectFactory(in); PGPEncryptedDataList enc; Object o = pgpF.nextObject(); @@ -1850,7 +1872,7 @@ public class Apg { if (dataChunk instanceof PGPOnePassSignatureList) { if (progress != null) progress.setProgress(R.string.progress_processingSignature, currentProgress, 100); - returnData.putBoolean(EXTRA_SIGNATURE, true); + returnData.putBoolean(ApgService.EXTRA_SIGNATURE, true); PGPOnePassSignatureList sigList = (PGPOnePassSignatureList) dataChunk; for (int i = 0; i < sigList.size(); ++i) { signature = sigList.get(i); @@ -1868,17 +1890,17 @@ public class Apg { if (sigKeyRing != null) { userId = getMainUserId(getMasterKey(sigKeyRing)); } - returnData.putString(EXTRA_SIGNATURE_USER_ID, userId); + returnData.putString(ApgService.EXTRA_SIGNATURE_USER_ID, userId); break; } } - returnData.putLong(EXTRA_SIGNATURE_KEY_ID, signatureKeyId); + returnData.putLong(ApgService.EXTRA_SIGNATURE_KEY_ID, signatureKeyId); if (signature != null) { signature.initVerify(signatureKey, new BouncyCastleProvider()); } else { - returnData.putBoolean(EXTRA_SIGNATURE_UNKNOWN, true); + returnData.putBoolean(ApgService.EXTRA_SIGNATURE_UNKNOWN, true); } dataChunk = plainFact.nextObject(); @@ -1915,7 +1937,7 @@ public class Apg { try { signature.update(buffer, 0, n); } catch (SignatureException e) { - returnData.putBoolean(EXTRA_SIGNATURE_SUCCESS, false); + returnData.putBoolean(ApgService.EXTRA_SIGNATURE_SUCCESS, false); signature = null; } } @@ -1938,9 +1960,9 @@ public class Apg { PGPSignatureList signatureList = (PGPSignatureList) plainFact.nextObject(); PGPSignature messageSignature = signatureList.get(signatureIndex); if (signature.verify(messageSignature)) { - returnData.putBoolean(EXTRA_SIGNATURE_SUCCESS, true); + returnData.putBoolean(ApgService.EXTRA_SIGNATURE_SUCCESS, true); } else { - returnData.putBoolean(EXTRA_SIGNATURE_SUCCESS, false); + returnData.putBoolean(ApgService.EXTRA_SIGNATURE_SUCCESS, false); } } } @@ -1963,7 +1985,7 @@ public class Apg { return returnData; } - public static Bundle verifyText(BaseActivity context, InputData data, OutputStream outStream, + public static Bundle verifyText(Context context, InputData data, OutputStream outStream, ProgressDialogUpdater progress) throws IOException, GeneralException, PGPException, SignatureException { Bundle returnData = new Bundle(); @@ -1995,7 +2017,7 @@ public class Apg { byte[] clearText = out.toByteArray(); outStream.write(clearText); - returnData.putBoolean(EXTRA_SIGNATURE, true); + returnData.putBoolean(ApgService.EXTRA_SIGNATURE, true); if (progress != null) progress.setProgress(R.string.progress_processingSignature, 60, 100); @@ -2015,16 +2037,17 @@ public class Apg { signatureKeyId = signature.getKeyID(); } if (signatureKey == null) { - Bundle pauseData = new Bundle(); - pauseData.putInt(Constants.extras.STATUS, Id.message.unknown_signature_key); - pauseData.putLong(Constants.extras.KEY_ID, signatureKeyId); - Message msg = new Message(); - msg.setData(pauseData); - context.sendMessage(msg); - // pause here - context.getRunningThread().pause(); - // see whether the key was found in the meantime - signatureKey = getPublicKey(signature.getKeyID()); + // TODO: reimplement! + // Bundle pauseData = new Bundle(); + // pauseData.putInt(Constants.extras.STATUS, Id.message.unknown_signature_key); + // pauseData.putLong(Constants.extras.KEY_ID, signatureKeyId); + // Message msg = new Message(); + // msg.setData(pauseData); + // context.sendMessage(msg); + // // pause here + // context.getRunningThread().pause(); + // // see whether the key was found in the meantime + // signatureKey = getPublicKey(signature.getKeyID()); } if (signatureKey == null) { @@ -2036,15 +2059,15 @@ public class Apg { if (sigKeyRing != null) { userId = getMainUserId(getMasterKey(sigKeyRing)); } - returnData.putString(EXTRA_SIGNATURE_USER_ID, userId); + returnData.putString(ApgService.EXTRA_SIGNATURE_USER_ID, userId); break; } } - returnData.putLong(EXTRA_SIGNATURE_KEY_ID, signatureKeyId); + returnData.putLong(ApgService.EXTRA_SIGNATURE_KEY_ID, signatureKeyId); if (signature == null) { - returnData.putBoolean(EXTRA_SIGNATURE_UNKNOWN, true); + returnData.putBoolean(ApgService.EXTRA_SIGNATURE_UNKNOWN, true); if (progress != null) progress.setProgress(R.string.progress_done, 100, 100); return returnData; @@ -2069,7 +2092,7 @@ public class Apg { } while (lookAhead != -1); } - returnData.putBoolean(EXTRA_SIGNATURE_SUCCESS, signature.verify()); + returnData.putBoolean(ApgService.EXTRA_SIGNATURE_SUCCESS, signature.verify()); if (progress != null) progress.setProgress(R.string.progress_done, 100, 100); diff --git a/org_apg/src/org/thialfihar/android/apg/passphrase/AskForPassphrase.java b/org_apg/src/org/thialfihar/android/apg/passphrase/AskForPassphrase.java index 27cb0a41e..5711a16a8 100644 --- a/org_apg/src/org/thialfihar/android/apg/passphrase/AskForPassphrase.java +++ b/org_apg/src/org/thialfihar/android/apg/passphrase/AskForPassphrase.java @@ -20,9 +20,9 @@ import org.spongycastle.jce.provider.BouncyCastleProvider; import org.spongycastle.openpgp.PGPException; import org.spongycastle.openpgp.PGPPrivateKey; import org.spongycastle.openpgp.PGPSecretKey; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.R; +import org.thialfihar.android.apg.helper.PGPHelper; import android.app.Activity; import android.app.AlertDialog; @@ -55,7 +55,7 @@ public class AskForPassphrase { secretKey = null; alert.setMessage(context.getString(R.string.passPhraseForSymmetricEncryption)); } else { - secretKey = Apg.getMasterKey(Apg.getSecretKeyRing(secretKeyId)); + secretKey = PGPHelper.getMasterKey(PGPHelper.getSecretKeyRing(secretKeyId)); if (secretKey == null) { alert.setTitle(R.string.title_keyNotFound); alert.setMessage(context.getString(R.string.keyNotFound, secretKeyId)); @@ -67,7 +67,7 @@ public class AskForPassphrase { alert.setCancelable(false); return alert.create(); } - String userId = Apg.getMainUserIdSafe(context, secretKey); + String userId = PGPHelper.getMainUserIdSafe(context, secretKey); alert.setMessage(context.getString(R.string.passPhraseFor, userId)); } @@ -111,7 +111,7 @@ public class AskForPassphrase { } // cache again - Apg.setCachedPassPhrase(keyId, passPhrase); + PGPHelper.setCachedPassPhrase(keyId, passPhrase); // return by callback cb.passPhraseCallback(keyId, passPhrase); } @@ -133,7 +133,7 @@ public class AskForPassphrase { Log.d("APG", "Key has no passphrase!"); // cache null - Apg.setCachedPassPhrase(secretKey.getKeyID(), null); + PGPHelper.setCachedPassPhrase(secretKey.getKeyID(), null); // return by callback cb.passPhraseCallback(secretKey.getKeyID(), null); diff --git a/org_apg/src/org/thialfihar/android/apg/passphrase/PassphraseCacheService.java b/org_apg/src/org/thialfihar/android/apg/passphrase/PassphraseCacheService.java index 9ef6eedb8..d38d0391f 100644 --- a/org_apg/src/org/thialfihar/android/apg/passphrase/PassphraseCacheService.java +++ b/org_apg/src/org/thialfihar/android/apg/passphrase/PassphraseCacheService.java @@ -14,8 +14,8 @@ package org.thialfihar.android.apg.passphrase; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Preferences; +import org.thialfihar.android.apg.helper.PGPHelper; import android.app.Service; import android.content.Context; @@ -47,7 +47,7 @@ public class PassphraseCacheService extends Service { delay = 60000; } - delay = Apg.cleanUpCache(mPassPhraseCacheTtl, delay); + delay = PGPHelper.cleanUpCache(mPassPhraseCacheTtl, delay); // don't check too often, even if we were close if (delay < 5000) { delay = 5000; diff --git a/org_apg/src/org/thialfihar/android/apg/provider/Database.java b/org_apg/src/org/thialfihar/android/apg/provider/Database.java index 8040eb56c..40e2b9203 100644 --- a/org_apg/src/org/thialfihar/android/apg/provider/Database.java +++ b/org_apg/src/org/thialfihar/android/apg/provider/Database.java @@ -19,8 +19,8 @@ import org.spongycastle.openpgp.PGPPublicKey; import org.spongycastle.openpgp.PGPPublicKeyRing; import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKeyRing; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Id; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.util.IterableIterator; import android.content.ContentValues; @@ -318,11 +318,11 @@ public class Database extends SQLiteOpenHelper { values.put(Keys.IS_MASTER_KEY, key.isMasterKey()); values.put(Keys.ALGORITHM, key.getAlgorithm()); values.put(Keys.KEY_SIZE, key.getBitStrength()); - values.put(Keys.CAN_SIGN, Apg.isSigningKey(key)); - values.put(Keys.CAN_ENCRYPT, Apg.isEncryptionKey(key)); + values.put(Keys.CAN_SIGN, PGPHelper.isSigningKey(key)); + values.put(Keys.CAN_ENCRYPT, PGPHelper.isEncryptionKey(key)); values.put(Keys.IS_REVOKED, key.isRevoked()); - values.put(Keys.CREATION, Apg.getCreationDate(key).getTime() / 1000); - Date expiryDate = Apg.getExpiryDate(key); + values.put(Keys.CREATION, PGPHelper.getCreationDate(key).getTime() / 1000); + Date expiryDate = PGPHelper.getExpiryDate(key); if (expiryDate != null) { values.put(Keys.EXPIRY, expiryDate.getTime() / 1000); } @@ -367,11 +367,11 @@ public class Database extends SQLiteOpenHelper { values.put(Keys.IS_MASTER_KEY, key.isMasterKey()); values.put(Keys.ALGORITHM, key.getPublicKey().getAlgorithm()); values.put(Keys.KEY_SIZE, key.getPublicKey().getBitStrength()); - values.put(Keys.CAN_SIGN, Apg.isSigningKey(key)); - values.put(Keys.CAN_ENCRYPT, Apg.isEncryptionKey(key)); + values.put(Keys.CAN_SIGN, PGPHelper.isSigningKey(key)); + values.put(Keys.CAN_ENCRYPT, PGPHelper.isEncryptionKey(key)); values.put(Keys.IS_REVOKED, key.getPublicKey().isRevoked()); - values.put(Keys.CREATION, Apg.getCreationDate(key).getTime() / 1000); - Date expiryDate = Apg.getExpiryDate(key); + values.put(Keys.CREATION, PGPHelper.getCreationDate(key).getTime() / 1000); + Date expiryDate = PGPHelper.getExpiryDate(key); if (expiryDate != null) { values.put(Keys.EXPIRY, expiryDate.getTime() / 1000); } diff --git a/org_apg/src/org/thialfihar/android/apg/service/ApgService.java b/org_apg/src/org/thialfihar/android/apg/service/ApgService.java index 6123beee8..ca9d7a817 100644 --- a/org_apg/src/org/thialfihar/android/apg/service/ApgService.java +++ b/org_apg/src/org/thialfihar/android/apg/service/ApgService.java @@ -28,23 +28,23 @@ import java.util.ArrayList; import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKeyRing; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Id; -import org.thialfihar.android.apg.InputData; import org.thialfihar.android.apg.Preferences; import org.thialfihar.android.apg.ProgressDialogUpdater; import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.Apg.GeneralException; +import org.thialfihar.android.apg.helper.FileHelper; +import org.thialfihar.android.apg.helper.PGPHelper; +import org.thialfihar.android.apg.helper.PGPHelper.GeneralException; +import org.thialfihar.android.apg.helper.PGPConversionHelper; import org.thialfihar.android.apg.provider.DataProvider; -import org.thialfihar.android.apg.util.Utils; +import org.thialfihar.android.apg.util.InputData; import android.app.IntentService; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.os.Environment; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; @@ -55,7 +55,16 @@ import android.util.Log; * data from the activities or other apps, queues these intents, executes them, and stops itself * after doing them. */ -// TODO: ProgressDialogUpdater rework??? + +/** + * TODO: + * + * - ProgressDialogUpdater rework??? + * + * - put recurring things into private functions when possible + * + * + */ public class ApgService extends IntentService implements ProgressDialogUpdater { // extras that can be given by intent @@ -64,6 +73,26 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { public static final String EXTRA_DATA = "data"; // keys for data bundle + + // encrypt + public static final String SECRET_KEY_ID = "secret_key_id"; + public static final String USE_ASCII_AMOR = "use_ascii_amor"; + public static final String ENCRYPTION_KEYS_IDS = "encryption_keys_ids"; + public static final String SIGNATURE_KEY_ID = "signature_key_id"; + public static final String COMPRESSION_ID = "compression_id"; + public static final String GENERATE_SIGNATURE = "generate_signature"; + public static final String SIGN_ONLY = "sign_only"; + public static final String MESSAGE_BYTES = "message_bytes"; + public static final String INPUT_FILE = "input_file"; + public static final String OUTPUT_FILE = "output_file"; + public static final String PROVIDER_URI = "provider_uri"; + + // decrypt + public static final String SIGNED_ONLY = "signed_only"; + public static final String RETURN_BYTES = "return_binary"; + public static final String CIPHERTEXT_BYTES = "ciphertext_bytes"; + public static final String ASSUME_SYMMETRIC = "assume_symmetric"; + // edit keys public static final String NEW_PASSPHRASE = "new_passphrase"; public static final String CURRENT_PASSPHRASE = "current_passphrase"; @@ -78,41 +107,44 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { public static final String SYMMETRIC_PASSPHRASE = "passphrase"; public static final String MASTER_KEY = "master_key"; - // encrypt - public static final String SECRET_KEY_ID = "secret_key_id"; - public static final String USE_ASCII_AMOR = "use_ascii_amor"; - public static final String ENCRYPTION_KEYS_IDS = "encryption_keys_ids"; - public static final String SIGNATURE_KEY_ID = "signature_key_id"; - public static final String COMPRESSION_ID = "compression_id"; - public static final String GENERATE_SIGNATURE = "generate_signature"; - public static final String SIGN_ONLY = "sign_only"; - public static final String BYTES = "bytes"; - public static final String INPUT_FILE = "input_file"; - public static final String OUTPUT_FILE = "output_file"; - public static final String PROVIDER_URI = "provider_uri"; - // delete file securely public static final String DELETE_FILE = "delete_file"; - // possible ints for EXTRA_ACTION - public static final int ACTION_SAVE_KEYRING = 1; - public static final int ACTION_GENERATE_KEY = 2; - public static final int ACTION_GENERATE_DEFAULT_RSA_KEYS = 3; + // possible EXTRA_ACTIONs + public static final int ACTION_ENCRYPT_SIGN_BYTES = 10; + public static final int ACTION_ENCRYPT_SIGN_FILE = 11; + public static final int ACTION_ENCRYPT_SIGN_STREAM = 12; - public static final int ACTION_ENCRYPT_SIGN_BYTES = 4; - public static final int ACTION_ENCRYPT_SIGN_FILE = 5; - public static final int ACTION_ENCRYPT_SIGN_STREAM = 6; + public static final int ACTION_DECRYPT_BYTES = 20; + public static final int ACTION_DECRYPT_FILE = 21; + public static final int ACTION_DECRYPT_STREAM = 22; - public static final int ACTION_DELETE_FILE_SECURELY = 7; + public static final int ACTION_SAVE_KEYRING = 30; + public static final int ACTION_GENERATE_KEY = 31; + public static final int ACTION_GENERATE_DEFAULT_RSA_KEYS = 32; + + public static final int ACTION_DELETE_FILE_SECURELY = 40; // possible data keys as result + // keys public static final String RESULT_NEW_KEY = "new_key"; public static final String RESULT_NEW_KEY2 = "new_key2"; - public static final String RESULT_SIGNATURE_DATA = "signatureData"; - public static final String RESULT_SIGNATURE_TEXT = "signatureText"; - public static final String RESULT_ENCRYPTED_MESSAGE = "encryptedMessage"; - public static final String RESULT_ENCRYPTED_DATA = "encryptedData"; - public static final String RESULT_URI = "resultUri"; + + // encrypt + public static final String RESULT_SIGNATURE_DATA = "signature_data"; + public static final String RESULT_SIGNATURE_TEXT = "signature_text"; + public static final String RESULT_ENCRYPTED_MESSAGE = "encrypted_message"; + public static final String RESULT_ENCRYPTED_DATA = "encrypted_data"; + public static final String RESULT_URI = "result_uri"; + + // decrypt + public static final String RESULT_DECRYPTED_MESSAGE = "decrypted_message"; + public static final String RESULT_DECRYPTED_DATA = "decrypted_data"; + public static final String EXTRA_SIGNATURE = "signature"; + public static final String EXTRA_SIGNATURE_KEY_ID = "signature_key_id"; + public static final String EXTRA_SIGNATURE_USER_ID = "signature_user_id"; + public static final String EXTRA_SIGNATURE_SUCCESS = "signature_success"; + public static final String EXTRA_SIGNATURE_UNKNOWN = "signature_unknown"; Messenger mMessenger; @@ -149,7 +181,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { case ACTION_SAVE_KEYRING: try { - // Input + /* Input */ String oldPassPhrase = data.getString(CURRENT_PASSPHRASE); String newPassPhrase = data.getString(NEW_PASSPHRASE); if (newPassPhrase == null) { @@ -157,19 +189,19 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { } @SuppressWarnings("unchecked") ArrayList<String> userIds = (ArrayList<String>) data.getSerializable(USER_IDS); - ArrayList<PGPSecretKey> keys = Utils.BytesToPGPSecretKeyList(data + ArrayList<PGPSecretKey> keys = PGPConversionHelper.BytesToPGPSecretKeyList(data .getByteArray(KEYS)); @SuppressWarnings("unchecked") ArrayList<Integer> keysUsages = (ArrayList<Integer>) data .getSerializable(KEYS_USAGES); long masterKeyId = data.getLong(MASTER_KEY_ID); - // Operation - Apg.buildSecretKey(this, userIds, keys, keysUsages, masterKeyId, oldPassPhrase, - newPassPhrase, this); - Apg.setCachedPassPhrase(masterKeyId, newPassPhrase); + /* Operation */ + PGPHelper.buildSecretKey(this, userIds, keys, keysUsages, masterKeyId, + oldPassPhrase, newPassPhrase, this); + PGPHelper.setCachedPassPhrase(masterKeyId, newPassPhrase); - // Output + /* Output */ sendMessageToHandler(ApgHandler.MESSAGE_OKAY); } catch (Exception e) { sendErrorToHandler(e); @@ -180,22 +212,24 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { case ACTION_GENERATE_KEY: try { - // Input + /* Input */ int algorithm = data.getInt(ALGORITHM); String passphrase = data.getString(SYMMETRIC_PASSPHRASE); int keysize = data.getInt(KEY_SIZE); PGPSecretKey masterKey = null; if (data.containsKey(MASTER_KEY)) { - masterKey = Utils.BytesToPGPSecretKey(data.getByteArray(MASTER_KEY)); + masterKey = PGPConversionHelper.BytesToPGPSecretKey(data + .getByteArray(MASTER_KEY)); } - // Operation - PGPSecretKeyRing newKeyRing = Apg.createKey(this, algorithm, keysize, passphrase, - masterKey); + /* Operation */ + PGPSecretKeyRing newKeyRing = PGPHelper.createKey(this, algorithm, keysize, + passphrase, masterKey); - // Output + /* Output */ Bundle resultData = new Bundle(); - resultData.putByteArray(RESULT_NEW_KEY, Utils.PGPSecretKeyRingToBytes(newKeyRing)); + resultData.putByteArray(RESULT_NEW_KEY, + PGPConversionHelper.PGPSecretKeyRingToBytes(newKeyRing)); sendMessageToHandler(ApgHandler.MESSAGE_OKAY, resultData); } catch (Exception e) { sendErrorToHandler(e); @@ -206,20 +240,22 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { case ACTION_GENERATE_DEFAULT_RSA_KEYS: // generate one RSA 2048 key for signing and one subkey for encrypting! try { + /* Input */ String passphrase = data.getString(SYMMETRIC_PASSPHRASE); - // Operation - PGPSecretKeyRing masterKeyRing = Apg.createKey(this, Id.choice.algorithm.rsa, 2048, - passphrase, null); + /* Operation */ + PGPSecretKeyRing masterKeyRing = PGPHelper.createKey(this, Id.choice.algorithm.rsa, + 2048, passphrase, null); - PGPSecretKeyRing subKeyRing = Apg.createKey(this, Id.choice.algorithm.rsa, 2048, - passphrase, masterKeyRing.getSecretKey()); + PGPSecretKeyRing subKeyRing = PGPHelper.createKey(this, Id.choice.algorithm.rsa, + 2048, passphrase, masterKeyRing.getSecretKey()); - // Output + /* Output */ Bundle resultData = new Bundle(); resultData.putByteArray(RESULT_NEW_KEY, - Utils.PGPSecretKeyRingToBytes(masterKeyRing)); - resultData.putByteArray(RESULT_NEW_KEY2, Utils.PGPSecretKeyRingToBytes(subKeyRing)); + PGPConversionHelper.PGPSecretKeyRingToBytes(masterKeyRing)); + resultData.putByteArray(RESULT_NEW_KEY2, + PGPConversionHelper.PGPSecretKeyRingToBytes(subKeyRing)); sendMessageToHandler(ApgHandler.MESSAGE_OKAY, resultData); } catch (Exception e) { sendErrorToHandler(e); @@ -230,11 +266,11 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { case ACTION_ENCRYPT_SIGN_BYTES: try { - // Input + /* Input */ long secretKeyId = data.getLong(SECRET_KEY_ID); String passphrase = data.getString(SYMMETRIC_PASSPHRASE); - byte[] bytes = data.getByteArray(BYTES); + byte[] bytes = data.getByteArray(MESSAGE_BYTES); boolean useAsciiArmour = data.getBoolean(USE_ASCII_AMOR); long encryptionKeyIds[] = data.getLongArray(ENCRYPTION_KEYS_IDS); @@ -243,7 +279,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { boolean generateSignature = data.getBoolean(GENERATE_SIGNATURE); boolean signOnly = data.getBoolean(SIGN_ONLY); - // Operation + /* Operation */ ByteArrayInputStream inStream = new ByteArrayInputStream(bytes); int inLength = bytes.length; @@ -252,20 +288,20 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { if (generateSignature) { Log.d(Constants.TAG, "generate signature..."); - Apg.generateSignature(this, inputData, outStream, useAsciiArmour, false, - secretKeyId, Apg.getCachedPassPhrase(secretKeyId), Preferences + PGPHelper.generateSignature(this, inputData, outStream, useAsciiArmour, false, + secretKeyId, PGPHelper.getCachedPassPhrase(secretKeyId), Preferences .getPreferences(this).getDefaultHashAlgorithm(), Preferences .getPreferences(this).getForceV3Signatures(), this); } else if (signOnly) { Log.d(Constants.TAG, "sign only..."); - Apg.signText(this, inputData, outStream, secretKeyId, Apg + PGPHelper.signText(this, inputData, outStream, secretKeyId, PGPHelper .getCachedPassPhrase(secretKeyId), Preferences.getPreferences(this) .getDefaultHashAlgorithm(), Preferences.getPreferences(this) .getForceV3Signatures(), this); } else { Log.d(Constants.TAG, "encrypt..."); - Apg.encrypt(this, inputData, outStream, useAsciiArmour, encryptionKeyIds, - signatureKeyId, Apg.getCachedPassPhrase(signatureKeyId), this, + PGPHelper.encrypt(this, inputData, outStream, useAsciiArmour, encryptionKeyIds, + signatureKeyId, PGPHelper.getCachedPassPhrase(signatureKeyId), this, Preferences.getPreferences(this).getDefaultEncryptionAlgorithm(), Preferences.getPreferences(this).getDefaultHashAlgorithm(), compressionId, Preferences.getPreferences(this).getForceV3Signatures(), @@ -274,7 +310,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { outStream.close(); - // Output + /* Output */ Bundle resultData = new Bundle(); if (useAsciiArmour) { @@ -302,7 +338,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { case ACTION_ENCRYPT_SIGN_FILE: try { - // Input + /* Input */ long secretKeyId = data.getLong(SECRET_KEY_ID); String passphrase = data.getString(SYMMETRIC_PASSPHRASE); @@ -316,51 +352,41 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { boolean generateSignature = data.getBoolean(GENERATE_SIGNATURE); boolean signOnly = data.getBoolean(SIGN_ONLY); + /* Operation */ + // check if storage is ready + if (!FileHelper.isStorageMounted(inputFile) + || !FileHelper.isStorageMounted(outputFile)) { + sendErrorToHandler(new GeneralException( + getString(R.string.error_externalStorageNotReady))); + return; + } + // InputStream long inLength = -1; - FileInputStream inStream = null; - if (inputFile.startsWith(Environment.getExternalStorageDirectory() - .getAbsolutePath())) { - if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - sendErrorToHandler(new GeneralException( - getString(R.string.error_externalStorageNotReady))); - return; - } - } - inStream = new FileInputStream(inputFile); + FileInputStream inStream = new FileInputStream(inputFile); File file = new File(inputFile); inLength = file.length(); - InputData inputData = new InputData(inStream, inLength); // OutputStream - if (outputFile.startsWith(Environment.getExternalStorageDirectory() - .getAbsolutePath())) { - if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - sendErrorToHandler(new GeneralException( - getString(R.string.error_externalStorageNotReady))); - return; - } - } FileOutputStream outStream = new FileOutputStream(outputFile); - // Operation if (generateSignature) { Log.d(Constants.TAG, "generate signature..."); - Apg.generateSignature(this, inputData, outStream, useAsciiArmour, true, - secretKeyId, Apg.getCachedPassPhrase(secretKeyId), Preferences + PGPHelper.generateSignature(this, inputData, outStream, useAsciiArmour, true, + secretKeyId, PGPHelper.getCachedPassPhrase(secretKeyId), Preferences .getPreferences(this).getDefaultHashAlgorithm(), Preferences .getPreferences(this).getForceV3Signatures(), this); } else if (signOnly) { Log.d(Constants.TAG, "sign only..."); - Apg.signText(this, inputData, outStream, secretKeyId, Apg + PGPHelper.signText(this, inputData, outStream, secretKeyId, PGPHelper .getCachedPassPhrase(secretKeyId), Preferences.getPreferences(this) .getDefaultHashAlgorithm(), Preferences.getPreferences(this) .getForceV3Signatures(), this); } else { Log.d(Constants.TAG, "encrypt..."); - Apg.encrypt(this, inputData, outStream, useAsciiArmour, encryptionKeyIds, - signatureKeyId, Apg.getCachedPassPhrase(signatureKeyId), this, + PGPHelper.encrypt(this, inputData, outStream, useAsciiArmour, encryptionKeyIds, + signatureKeyId, PGPHelper.getCachedPassPhrase(signatureKeyId), this, Preferences.getPreferences(this).getDefaultEncryptionAlgorithm(), Preferences.getPreferences(this).getDefaultHashAlgorithm(), compressionId, Preferences.getPreferences(this).getForceV3Signatures(), @@ -369,6 +395,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { outStream.close(); + /* Output */ sendMessageToHandler(ApgHandler.MESSAGE_OKAY); } catch (Exception e) { sendErrorToHandler(e); @@ -377,7 +404,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { case ACTION_ENCRYPT_SIGN_STREAM: try { - // Input + /* Input */ long secretKeyId = data.getLong(SECRET_KEY_ID); String passphrase = data.getString(SYMMETRIC_PASSPHRASE); @@ -389,20 +416,21 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { int compressionId = data.getInt(COMPRESSION_ID); boolean generateSignature = data.getBoolean(GENERATE_SIGNATURE); boolean signOnly = data.getBoolean(SIGN_ONLY); - + + /* Operation */ // InputStream InputStream in = getContentResolver().openInputStream(providerUri); - long inLength = Apg.getLengthOfStream(in); - + long inLength = PGPHelper.getLengthOfStream(in); InputData inputData = new InputData(in, inLength); // OutputStream String streamFilename = null; try { while (true) { - streamFilename = Apg.generateRandomString(32); + streamFilename = PGPHelper.generateRandomString(32); if (streamFilename == null) { - throw new Apg.GeneralException("couldn't generate random file name"); + throw new PGPHelper.GeneralException( + "couldn't generate random file name"); } openFileInput(streamFilename).close(); } @@ -411,20 +439,19 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { } FileOutputStream outStream = openFileOutput(streamFilename, Context.MODE_PRIVATE); - // Operation if (generateSignature) { - Apg.generateSignature(this, inputData, outStream, useAsciiArmour, true, - secretKeyId, Apg.getCachedPassPhrase(secretKeyId), Preferences + PGPHelper.generateSignature(this, inputData, outStream, useAsciiArmour, true, + secretKeyId, PGPHelper.getCachedPassPhrase(secretKeyId), Preferences .getPreferences(this).getDefaultHashAlgorithm(), Preferences .getPreferences(this).getForceV3Signatures(), this); } else if (signOnly) { - Apg.signText(this, inputData, outStream, secretKeyId, Apg + PGPHelper.signText(this, inputData, outStream, secretKeyId, PGPHelper .getCachedPassPhrase(secretKeyId), Preferences.getPreferences(this) .getDefaultHashAlgorithm(), Preferences.getPreferences(this) .getForceV3Signatures(), this); } else { - Apg.encrypt(this, inputData, outStream, useAsciiArmour, encryptionKeyIds, - signatureKeyId, Apg.getCachedPassPhrase(signatureKeyId), this, + PGPHelper.encrypt(this, inputData, outStream, useAsciiArmour, encryptionKeyIds, + signatureKeyId, PGPHelper.getCachedPassPhrase(signatureKeyId), this, Preferences.getPreferences(this).getDefaultEncryptionAlgorithm(), Preferences.getPreferences(this).getDefaultHashAlgorithm(), compressionId, Preferences.getPreferences(this).getForceV3Signatures(), @@ -433,7 +460,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { outStream.close(); - // Output + /* Output */ Bundle resultData = new Bundle(); String uri = "content://" + DataProvider.AUTHORITY + "/data/" + streamFilename; @@ -448,21 +475,21 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { case ACTION_DELETE_FILE_SECURELY: try { - // Input + /* Input */ String deleteFile = data.getString(DELETE_FILE); - // Operation + /* Operation */ try { - Apg.deleteFileSecurely(this, new File(deleteFile), this); + PGPHelper.deleteFileSecurely(this, new File(deleteFile), this); } catch (FileNotFoundException e) { - throw new Apg.GeneralException(getString(R.string.error_fileNotFound, + throw new PGPHelper.GeneralException(getString(R.string.error_fileNotFound, deleteFile)); } catch (IOException e) { - throw new Apg.GeneralException(getString(R.string.error_fileDeleteFailed, + throw new PGPHelper.GeneralException(getString(R.string.error_fileDeleteFailed, deleteFile)); } - // Output + /* Output */ sendMessageToHandler(ApgHandler.MESSAGE_OKAY); } catch (Exception e) { sendErrorToHandler(e); @@ -470,6 +497,157 @@ public class ApgService extends IntentService implements ProgressDialogUpdater { break; + case ACTION_DECRYPT_BYTES: + try { + /* Input */ + long secretKeyId = data.getLong(SECRET_KEY_ID); + byte[] bytes = data.getByteArray(CIPHERTEXT_BYTES); + boolean signedOnly = data.getBoolean(SIGNED_ONLY); + boolean returnBytes = data.getBoolean(RETURN_BYTES); + boolean assumeSymmetricEncryption = data.getBoolean(ASSUME_SYMMETRIC); + + /* Operation */ + ByteArrayInputStream inStream = new ByteArrayInputStream(bytes); + int inLength = bytes.length; + + InputData inputData = new InputData(inStream, inLength); + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + + Bundle resultData = new Bundle(); + + // verifyText and decrypt returning additional resultData values for the + // verification of signatures + if (signedOnly) { + resultData = PGPHelper.verifyText(this, inputData, outStream, this); + } else { + resultData = PGPHelper.decrypt(this, inputData, outStream, + PGPHelper.getCachedPassPhrase(secretKeyId), this, + assumeSymmetricEncryption); + } + + outStream.close(); + + /* Output */ + if (returnBytes) { + byte output[] = outStream.toByteArray(); + resultData.putByteArray(RESULT_DECRYPTED_DATA, output); + } else { + String output = new String(outStream.toByteArray()); + resultData.putString(RESULT_DECRYPTED_MESSAGE, output); + } + + sendMessageToHandler(ApgHandler.MESSAGE_OKAY, resultData); + } catch (Exception e) { + sendErrorToHandler(e); + } + + break; + + case ACTION_DECRYPT_FILE: + try { + /* Input */ + long secretKeyId = data.getLong(SECRET_KEY_ID); + boolean signedOnly = data.getBoolean(SIGNED_ONLY); + boolean assumeSymmetricEncryption = data.getBoolean(ASSUME_SYMMETRIC); + + String inputFile = data.getString(INPUT_FILE); + String outputFile = data.getString(OUTPUT_FILE); + + /* Operation */ + // check if storage is ready + if (!FileHelper.isStorageMounted(inputFile) + || !FileHelper.isStorageMounted(outputFile)) { + sendErrorToHandler(new GeneralException( + getString(R.string.error_externalStorageNotReady))); + return; + } + + // InputStream + long inLength = -1; + FileInputStream inStream = new FileInputStream(inputFile); + File file = new File(inputFile); + inLength = file.length(); + InputData inputData = new InputData(inStream, inLength); + + // OutputStream + FileOutputStream outStream = new FileOutputStream(outputFile); + + Bundle resultData = new Bundle(); + + // verifyText and decrypt returning additional output values for the + // verification of signatures + if (signedOnly) { + resultData = PGPHelper.verifyText(this, inputData, outStream, this); + } else { + resultData = PGPHelper.decrypt(this, inputData, outStream, + PGPHelper.getCachedPassPhrase(secretKeyId), this, + assumeSymmetricEncryption); + } + + outStream.close(); + + /* Output */ + sendMessageToHandler(ApgHandler.MESSAGE_OKAY, resultData); + } catch (Exception e) { + sendErrorToHandler(e); + } + break; + + case ACTION_DECRYPT_STREAM: + try { + /* Input */ + long secretKeyId = data.getLong(SECRET_KEY_ID); + boolean signedOnly = data.getBoolean(SIGNED_ONLY); + boolean assumeSymmetricEncryption = data.getBoolean(ASSUME_SYMMETRIC); + Uri providerUri = Uri.parse(data.getString(PROVIDER_URI)); + + /* Operation */ + // InputStream + InputStream in = getContentResolver().openInputStream(providerUri); + long inLength = PGPHelper.getLengthOfStream(in); + InputData inputData = new InputData(in, inLength); + + // OutputStream + String streamFilename = null; + try { + while (true) { + streamFilename = PGPHelper.generateRandomString(32); + if (streamFilename == null) { + throw new PGPHelper.GeneralException( + "couldn't generate random file name"); + } + openFileInput(streamFilename).close(); + } + } catch (FileNotFoundException e) { + // found a name that isn't used yet + } + FileOutputStream outStream = openFileOutput(streamFilename, Context.MODE_PRIVATE); + + Bundle resultData = new Bundle(); + + // verifyText and decrypt returning additional output values for the + // verification of signatures + if (signedOnly) { + resultData = PGPHelper.verifyText(this, inputData, outStream, this); + } else { + resultData = PGPHelper.decrypt(this, inputData, outStream, + PGPHelper.getCachedPassPhrase(secretKeyId), this, + assumeSymmetricEncryption); + } + + outStream.close(); + + /* Output */ + String uri = "content://" + DataProvider.AUTHORITY + "/data/" + streamFilename; + resultData.putString(RESULT_URI, uri); + + sendMessageToHandler(ApgHandler.MESSAGE_OKAY, resultData); + } catch (Exception e) { + sendErrorToHandler(e); + } + + break; + default: break; } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/BaseActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/BaseActivity.java index 5310c2fb9..39fc30347 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/BaseActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/BaseActivity.java @@ -21,12 +21,12 @@ import java.io.FileNotFoundException; import java.io.IOException; import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.PausableThread; import org.thialfihar.android.apg.Preferences; import org.thialfihar.android.apg.ProgressDialogUpdater; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.passphrase.AskForPassphrase; import org.thialfihar.android.apg.passphrase.PassphraseCacheService; @@ -79,7 +79,7 @@ public class BaseActivity extends SherlockFragmentActivity implements Runnable, // not needed later: mPreferences = Preferences.getPreferences(this); - Apg.initialize(this); + PGPHelper.initialize(this); if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File dir = new File(Constants.path.APP_DIR); @@ -275,7 +275,7 @@ public class BaseActivity extends SherlockFragmentActivity implements Runnable, case Id.request.secret_keys: { if (resultCode == RESULT_OK) { Bundle bundle = data.getExtras(); - setSecretKeyId(bundle.getLong(Apg.EXTRA_KEY_ID)); + setSecretKeyId(bundle.getLong(PGPHelper.EXTRA_KEY_ID)); } else { setSecretKeyId(Id.key.none); } @@ -378,7 +378,7 @@ public class BaseActivity extends SherlockFragmentActivity implements Runnable, public void passPhraseCallback(long keyId, String passPhrase) { // TODO: Not needed anymore, now implemented in AskForSecretKeyPass - Apg.setCachedPassPhrase(keyId, passPhrase); + PGPHelper.setCachedPassPhrase(keyId, passPhrase); } public void sendMessage(Message msg) { diff --git a/org_apg/src/org/thialfihar/android/apg/ui/DecryptActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/DecryptActivity.java index 63adb9826..a19f6c5b6 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/DecryptActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/DecryptActivity.java @@ -19,31 +19,40 @@ package org.thialfihar.android.apg.ui; import org.spongycastle.jce.provider.BouncyCastleProvider; import org.spongycastle.openpgp.PGPException; import org.spongycastle.openpgp.PGPPublicKeyRing; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Constants; -import org.thialfihar.android.apg.DataDestination; -import org.thialfihar.android.apg.DataSource; -import org.thialfihar.android.apg.FileDialog; import org.thialfihar.android.apg.Id; -import org.thialfihar.android.apg.InputData; import org.thialfihar.android.apg.PausableThread; +import org.thialfihar.android.apg.helper.FileHelper; +import org.thialfihar.android.apg.helper.PGPHelper; +import org.thialfihar.android.apg.helper.OtherHelper; +import org.thialfihar.android.apg.helper.PGPHelper.GeneralException; import org.thialfihar.android.apg.provider.DataProvider; +import org.thialfihar.android.apg.service.ApgHandler; +import org.thialfihar.android.apg.service.ApgService; +import org.thialfihar.android.apg.ui.dialog.DeleteFileDialogFragment; +import org.thialfihar.android.apg.ui.dialog.FileDialogFragment; +import org.thialfihar.android.apg.ui.dialog.PassphraseDialogFragment; +import org.thialfihar.android.apg.ui.dialog.ProgressDialogFragment; import org.thialfihar.android.apg.util.Compatibility; -import org.thialfihar.android.apg.util.Utils; +import org.thialfihar.android.apg.util.InputData; import org.thialfihar.android.apg.R; import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import android.app.AlertDialog; import android.app.Dialog; +import android.app.ProgressDialog; import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import android.os.Message; +import android.os.Messenger; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; @@ -57,8 +66,10 @@ import android.widget.TextView; import android.widget.Toast; import android.widget.ViewFlipper; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -67,7 +78,7 @@ import java.security.Security; import java.security.SignatureException; import java.util.regex.Matcher; -public class DecryptActivity extends BaseActivity { +public class DecryptActivity extends SherlockFragmentActivity { private long mSignatureKeyId = 0; private Intent mIntent; @@ -110,11 +121,24 @@ public class DecryptActivity extends BaseActivity { private byte[] mData = null; private boolean mReturnBinary = false; - private DataSource mDataSource = null; - private DataDestination mDataDestination = null; + // private DataSource mDataSource = null; + // private DataDestination mDataDestination = null; private long mUnknownSignatureKeyId = 0; + private long mSecretKeyId = Id.key.none; + + private ProgressDialogFragment mDecryptingDialog; + private FileDialogFragment mFileDialog; + + public void setSecretKeyId(long id) { + mSecretKeyId = id; + } + + public long getSecretKeyId() { + return mSecretKeyId; + } + @Override public boolean onCreateOptionsMenu(Menu menu) { @@ -163,6 +187,18 @@ public class DecryptActivity extends BaseActivity { super.onCreate(savedInstanceState); setContentView(R.layout.decrypt); + // set actionbar without home button if called from another app + final ActionBar actionBar = getSupportActionBar(); + Log.d(Constants.TAG, "calling package (only set when using startActivityForResult)=" + + getCallingPackage()); + if (getCallingPackage() != null && getCallingPackage().equals(PGPHelper.PACKAGE_NAME)) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setHomeButtonEnabled(true); + } else { + actionBar.setDisplayHomeAsUpEnabled(false); + actionBar.setHomeButtonEnabled(false); + } + mSource = (ViewFlipper) findViewById(R.id.source); mSourceLabel = (TextView) findViewById(R.id.sourceLabel); mSourcePrevious = (ImageView) findViewById(R.id.sourcePrevious); @@ -213,7 +249,7 @@ public class DecryptActivity extends BaseActivity { mBrowse = (ImageButton) findViewById(R.id.btn_browse); mBrowse.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - Utils.openFile(DecryptActivity.this, mFilename.getText().toString(), "*/*", + FileHelper.openFile(DecryptActivity.this, mFilename.getText().toString(), "*/*", Id.request.filename); } }); @@ -246,7 +282,7 @@ public class DecryptActivity extends BaseActivity { } catch (IOException e) { // ignore, then } - } else if (Apg.Intent.DECRYPT.equals(mIntent.getAction())) { + } else if (PGPHelper.Intent.DECRYPT.equals(mIntent.getAction())) { Log.d(Constants.TAG, "Apg Intent DECRYPT startet"); Bundle extras = mIntent.getExtras(); if (extras == null) { @@ -256,17 +292,17 @@ public class DecryptActivity extends BaseActivity { Log.d(Constants.TAG, "got extras"); } - mData = extras.getByteArray(Apg.EXTRA_DATA); + mData = extras.getByteArray(PGPHelper.EXTRA_DATA); String textData = null; if (mData == null) { Log.d(Constants.TAG, "EXTRA_DATA was null"); - textData = extras.getString(Apg.EXTRA_TEXT); + textData = extras.getString(PGPHelper.EXTRA_TEXT); } else { Log.d(Constants.TAG, "Got data from EXTRA_DATA"); } if (textData != null) { Log.d(Constants.TAG, "textData null, matching text ..."); - Matcher matcher = Apg.PGP_MESSAGE.matcher(textData); + Matcher matcher = PGPHelper.PGP_MESSAGE.matcher(textData); if (matcher.matches()) { Log.d(Constants.TAG, "PGP_MESSAGE matched"); textData = matcher.group(1); @@ -274,7 +310,7 @@ public class DecryptActivity extends BaseActivity { textData = textData.replaceAll("\\xa0", " "); mMessage.setText(textData); } else { - matcher = Apg.PGP_SIGNED_MESSAGE.matcher(textData); + matcher = PGPHelper.PGP_SIGNED_MESSAGE.matcher(textData); if (matcher.matches()) { Log.d(Constants.TAG, "PGP_SIGNED_MESSAGE matched"); textData = matcher.group(1); @@ -290,9 +326,9 @@ public class DecryptActivity extends BaseActivity { } } } - mReplyTo = extras.getString(Apg.EXTRA_REPLY_TO); - mSubject = extras.getString(Apg.EXTRA_SUBJECT); - } else if (Apg.Intent.DECRYPT_FILE.equals(mIntent.getAction())) { + mReplyTo = extras.getString(PGPHelper.EXTRA_REPLY_TO); + mSubject = extras.getString(PGPHelper.EXTRA_SUBJECT); + } else if (PGPHelper.Intent.DECRYPT_FILE.equals(mIntent.getAction())) { mInputFilename = mIntent.getDataString(); if ("file".equals(mIntent.getScheme())) { mInputFilename = Uri.decode(mInputFilename.substring(7)); @@ -304,37 +340,27 @@ public class DecryptActivity extends BaseActivity { while (mSource.getCurrentView().getId() != R.id.sourceFile) { mSource.showNext(); } - } else if (Apg.Intent.DECRYPT_AND_RETURN.equals(mIntent.getAction())) { + } else if (PGPHelper.Intent.DECRYPT_AND_RETURN.equals(mIntent.getAction())) { mContentUri = mIntent.getData(); Bundle extras = mIntent.getExtras(); if (extras == null) { extras = new Bundle(); } - // set actionbar without home button if called from another app - final ActionBar actionBar = getSupportActionBar(); - if (getCallingPackage() != null && getCallingPackage().equals(Apg.PACKAGE_NAME)) { - actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setHomeButtonEnabled(true); - } else { - actionBar.setDisplayHomeAsUpEnabled(false); - actionBar.setHomeButtonEnabled(false); - } - - mReturnBinary = extras.getBoolean(Apg.EXTRA_BINARY, false); + mReturnBinary = extras.getBoolean(PGPHelper.EXTRA_BINARY, false); if (mContentUri == null) { - mData = extras.getByteArray(Apg.EXTRA_DATA); - String data = extras.getString(Apg.EXTRA_TEXT); + mData = extras.getByteArray(PGPHelper.EXTRA_DATA); + String data = extras.getString(PGPHelper.EXTRA_TEXT); if (data != null) { - Matcher matcher = Apg.PGP_MESSAGE.matcher(data); + Matcher matcher = PGPHelper.PGP_MESSAGE.matcher(data); if (matcher.matches()) { data = matcher.group(1); // replace non breakable spaces data = data.replaceAll("\\xa0", " "); mMessage.setText(data); } else { - matcher = Apg.PGP_SIGNED_MESSAGE.matcher(data); + matcher = PGPHelper.PGP_SIGNED_MESSAGE.matcher(data); if (matcher.matches()) { data = matcher.group(1); // replace non breakable spaces @@ -358,9 +384,9 @@ public class DecryptActivity extends BaseActivity { String data = ""; if (clipboardText != null) { - Matcher matcher = Apg.PGP_MESSAGE.matcher(clipboardText); + Matcher matcher = PGPHelper.PGP_MESSAGE.matcher(clipboardText); if (!matcher.matches()) { - matcher = Apg.PGP_SIGNED_MESSAGE.matcher(clipboardText); + matcher = PGPHelper.PGP_SIGNED_MESSAGE.matcher(clipboardText); } if (matcher.matches()) { data = matcher.group(1); @@ -376,11 +402,11 @@ public class DecryptActivity extends BaseActivity { if (mSignatureKeyId == 0) { return; } - PGPPublicKeyRing key = Apg.getPublicKeyRing(mSignatureKeyId); + PGPPublicKeyRing key = PGPHelper.getPublicKeyRing(mSignatureKeyId); if (key != null) { Intent intent = new Intent(DecryptActivity.this, KeyServerQueryActivity.class); - intent.setAction(Apg.Intent.LOOK_UP_KEY_ID); - intent.putExtra(Apg.EXTRA_KEY_ID, mSignatureKeyId); + intent.setAction(PGPHelper.Intent.LOOK_UP_KEY_ID); + intent.putExtra(PGPHelper.EXTRA_KEY_ID, mSignatureKeyId); startActivity(intent); } } @@ -483,7 +509,7 @@ public class DecryptActivity extends BaseActivity { if (mDecryptTarget == Id.target.message) { String messageData = mMessage.getText().toString(); - Matcher matcher = Apg.PGP_SIGNED_MESSAGE.matcher(messageData); + Matcher matcher = PGPHelper.PGP_SIGNED_MESSAGE.matcher(messageData); if (matcher.matches()) { mSignedOnly = true; decryptStart(); @@ -493,248 +519,466 @@ public class DecryptActivity extends BaseActivity { // else treat it as an decrypted message/file mSignedOnly = false; - String error = null; - fillDataSource(); + + getDecryptionKeyFromInputStream(); + + Log.d(Constants.TAG, "secretKeyId: " + getSecretKeyId()); + + // if we need a symmetric passphrase or a passphrase to use a sekret key ask for it + if (getSecretKeyId() == Id.key.symmetric + || PGPHelper.getCachedPassPhrase(getSecretKeyId()) == null) { + // showDialog(Id.dialog.pass_phrase); + showPassphraseDialog(); + } else { + if (mDecryptTarget == Id.target.file) { + askForOutputFilename(); + } else { + decryptStart(); + } + } + } + + /** + * Shows passphrase dialog to cache a new passphrase the user enters for using it later for + * encryption. Based on mSecretKeyId it asks for a passphrase to open a private key or it asks + * for a symmetric passphrase + */ + private void showPassphraseDialog() { + // Message is received after passphrase is cached + Handler returnHandler = new Handler() { + @Override + public void handleMessage(Message message) { + if (message.what == PassphraseDialogFragment.MESSAGE_OKAY) { + if (mDecryptTarget == Id.target.file) { + askForOutputFilename(); + } else { + decryptStart(); + } + } + } + }; + + // Create a new Messenger for the communication back + Messenger messenger = new Messenger(returnHandler); + try { - InputData in = mDataSource.getInputData(this, false); + PassphraseDialogFragment passphraseDialog = PassphraseDialogFragment.newInstance( + messenger, mSecretKeyId); + + passphraseDialog.show(getSupportFragmentManager(), "passphraseDialog"); + } catch (PGPHelper.GeneralException e) { + Log.d(Constants.TAG, "No passphrase for this secret key, encrypt directly!"); + // send message to handler to start encryption directly + returnHandler.sendEmptyMessage(PassphraseDialogFragment.MESSAGE_OKAY); + } + } + + /** + * TODO: externalize this into ApgService??? + */ + private void getDecryptionKeyFromInputStream() { + InputStream inStream = null; + if (mContentUri != null) { + try { + inStream = getContentResolver().openInputStream(mContentUri); + } catch (FileNotFoundException e) { + Log.e(Constants.TAG, "File not found!", e); + Toast.makeText(this, getString(R.string.error_fileNotFound, e.getMessage()), + Toast.LENGTH_SHORT).show(); + } + } else if (mDecryptTarget == Id.target.file) { + // check if storage is ready + if (!FileHelper.isStorageMounted(mInputFilename)) { + Toast.makeText(this, getString(R.string.error_externalStorageNotReady), + Toast.LENGTH_SHORT).show(); + return; + } + try { - setSecretKeyId(Apg.getDecryptionKeyId(this, in)); + inStream = new FileInputStream(mInputFilename); + } catch (FileNotFoundException e) { + Log.e(Constants.TAG, "File not found!", e); + Toast.makeText(this, getString(R.string.error_fileNotFound, e.getMessage()), + Toast.LENGTH_SHORT).show(); + } + } else { + if (mData != null) { + inStream = new ByteArrayInputStream(mData); + } else { + inStream = new ByteArrayInputStream(mMessage.getText().toString().getBytes()); + + } + } + + try { + try { + setSecretKeyId(PGPHelper.getDecryptionKeyId(this, inStream)); if (getSecretKeyId() == Id.key.none) { - throw new Apg.GeneralException(getString(R.string.error_noSecretKeyFound)); + throw new PGPHelper.GeneralException(getString(R.string.error_noSecretKeyFound)); } mAssumeSymmetricEncryption = false; - } catch (Apg.NoAsymmetricEncryptionException e) { + } catch (PGPHelper.NoAsymmetricEncryptionException e) { setSecretKeyId(Id.key.symmetric); - in = mDataSource.getInputData(this, false); - if (!Apg.hasSymmetricEncryption(this, in)) { - throw new Apg.GeneralException(getString(R.string.error_noKnownEncryptionFound)); + if (!PGPHelper.hasSymmetricEncryption(this, inStream)) { + throw new PGPHelper.GeneralException( + getString(R.string.error_noKnownEncryptionFound)); } mAssumeSymmetricEncryption = true; } - - if (getSecretKeyId() == Id.key.symmetric - || Apg.getCachedPassPhrase(getSecretKeyId()) == null) { - showDialog(Id.dialog.pass_phrase); - } else { - if (mDecryptTarget == Id.target.file) { - askForOutputFilename(); - } else { - decryptStart(); - } - } - } catch (FileNotFoundException e) { - error = getString(R.string.error_fileNotFound); - } catch (IOException e) { - error = "" + e; - } catch (Apg.GeneralException e) { - error = "" + e; - } - if (error != null) { - Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT) - .show(); + } catch (Exception e) { + Toast.makeText(this, getString(R.string.errorMessage, e.getMessage()), + Toast.LENGTH_SHORT).show(); } } private void replyClicked() { Intent intent = new Intent(this, EncryptActivity.class); - intent.setAction(Apg.Intent.ENCRYPT); + intent.setAction(PGPHelper.Intent.ENCRYPT); String data = mMessage.getText().toString(); data = data.replaceAll("(?m)^", "> "); data = "\n\n" + data; - intent.putExtra(Apg.EXTRA_TEXT, data); - intent.putExtra(Apg.EXTRA_SUBJECT, "Re: " + mSubject); - intent.putExtra(Apg.EXTRA_SEND_TO, mReplyTo); - intent.putExtra(Apg.EXTRA_SIGNATURE_KEY_ID, getSecretKeyId()); - intent.putExtra(Apg.EXTRA_ENCRYPTION_KEY_IDS, new long[] { mSignatureKeyId }); + intent.putExtra(PGPHelper.EXTRA_TEXT, data); + intent.putExtra(PGPHelper.EXTRA_SUBJECT, "Re: " + mSubject); + intent.putExtra(PGPHelper.EXTRA_SEND_TO, mReplyTo); + intent.putExtra(PGPHelper.EXTRA_SIGNATURE_KEY_ID, getSecretKeyId()); + intent.putExtra(PGPHelper.EXTRA_ENCRYPTION_KEY_IDS, new long[] { mSignatureKeyId }); startActivity(intent); } private void askForOutputFilename() { - showDialog(Id.dialog.output_filename); - } + // Message is received after passphrase is cached + Handler returnHandler = new Handler() { + @Override + public void handleMessage(Message message) { + if (message.what == FileDialogFragment.MESSAGE_OKAY) { + Bundle data = message.getData(); + mOutputFilename = data.getString(FileDialogFragment.MESSAGE_DATA_FILENAME); + decryptStart(); + } + } + }; + + // Create a new Messenger for the communication back + Messenger messenger = new Messenger(returnHandler); + + mFileDialog = FileDialogFragment.newInstance(messenger, + getString(R.string.title_decryptToFile), + getString(R.string.specifyFileToDecryptTo), mOutputFilename, null, + Id.request.output_filename); + + mFileDialog.show(getSupportFragmentManager(), "fileDialog"); - @Override - public void passPhraseCallback(long keyId, String passPhrase) { - super.passPhraseCallback(keyId, passPhrase); - if (mDecryptTarget == Id.target.file) { - askForOutputFilename(); - } else { - decryptStart(); - } } private void decryptStart() { - showDialog(Id.dialog.decrypting); - startThread(); - } + Log.d(Constants.TAG, "decryptStart"); - @Override - public void run() { - String error = null; - Security.addProvider(new BouncyCastleProvider()); + // Send all information needed to service to edit key in other thread + Intent intent = new Intent(this, ApgService.class); + // fill values for this action Bundle data = new Bundle(); - Message msg = new Message(); - fillDataSource(); - fillDataDestination(); - try { - InputData in = mDataSource.getInputData(this, true); - OutputStream out = mDataDestination.getOutputStream(this); - if (mSignedOnly) { - data = Apg.verifyText(this, in, out, this); - } else { - data = Apg.decrypt(this, in, out, Apg.getCachedPassPhrase(getSecretKeyId()), this, - mAssumeSymmetricEncryption); - } + // choose action based on input: decrypt stream, file or bytes + if (mContentUri != null) { + intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_DECRYPT_STREAM); + data.putString(ApgService.PROVIDER_URI, mContentUri.toString()); - out.close(); + } else if (mDecryptTarget == Id.target.file) { + intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_DECRYPT_FILE); - if (mDataDestination.getStreamFilename() != null) { - data.putString(Apg.EXTRA_RESULT_URI, "content://" + DataProvider.AUTHORITY - + "/data/" + mDataDestination.getStreamFilename()); - } else if (mDecryptTarget == Id.target.message) { - if (mReturnBinary) { - data.putByteArray(Apg.EXTRA_DECRYPTED_DATA, - ((ByteArrayOutputStream) out).toByteArray()); - } else { - data.putString(Apg.EXTRA_DECRYPTED_MESSAGE, new String( - ((ByteArrayOutputStream) out).toByteArray())); - } + Log.d(Constants.TAG, "mInputFilename=" + mInputFilename + ", mOutputFilename=" + + mOutputFilename); + + data.putString(ApgService.INPUT_FILE, mInputFilename); + data.putString(ApgService.OUTPUT_FILE, mOutputFilename); + + } else { + intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_DECRYPT_BYTES); + + if (mData != null) { + data.putByteArray(ApgService.CIPHERTEXT_BYTES, mData); + } else { + String message = mMessage.getText().toString(); + data.putByteArray(ApgService.CIPHERTEXT_BYTES, message.getBytes()); } - } catch (PGPException e) { - error = "" + e; - } catch (IOException e) { - error = "" + e; - } catch (SignatureException e) { - error = "" + e; - } catch (Apg.GeneralException e) { - error = "" + e; } - data.putInt(Constants.extras.STATUS, Id.message.done); + data.putLong(ApgService.SECRET_KEY_ID, getSecretKeyId()); - if (error != null) { - data.putString(Apg.EXTRA_ERROR, error); - } + data.putBoolean(ApgService.SIGNED_ONLY, mSignedOnly); + data.putBoolean(ApgService.RETURN_BYTES, mReturnBinary); + data.putBoolean(ApgService.ASSUME_SYMMETRIC, mAssumeSymmetricEncryption); - msg.setData(data); - sendMessage(msg); - } + intent.putExtra(ApgService.EXTRA_DATA, data); - @Override - public void handlerCallback(Message msg) { - Bundle data = msg.getData(); - if (data == null) { - return; - } + // create progress dialog + mDecryptingDialog = ProgressDialogFragment.newInstance(R.string.progress_decrypting, + ProgressDialog.STYLE_HORIZONTAL); - if (data.getInt(Constants.extras.STATUS) == Id.message.unknown_signature_key) { - mUnknownSignatureKeyId = data.getLong(Constants.extras.KEY_ID); - showDialog(Id.dialog.lookup_unknown_key); - return; - } + // Message is received after encrypting is done in ApgService + ApgHandler saveHandler = new ApgHandler(this, mDecryptingDialog) { + public void handleMessage(Message message) { + // handle messages by standard ApgHandler first + super.handleMessage(message); - super.handlerCallback(msg); - } + if (message.arg1 == ApgHandler.MESSAGE_OKAY) { + // get returned data bundle + Bundle data = message.getData(); - @Override - public void doneCallback(Message msg) { - super.doneCallback(msg); + mSignatureKeyId = 0; + mSignatureLayout.setVisibility(View.GONE); + mReplyEnabled = false; - Bundle data = msg.getData(); - removeDialog(Id.dialog.decrypting); - mSignatureKeyId = 0; - mSignatureLayout.setVisibility(View.GONE); - mReplyEnabled = false; + // build new action bar + invalidateOptionsMenu(); - // build new action bar - invalidateOptionsMenu(); + Toast.makeText(DecryptActivity.this, R.string.decryptionSuccessful, + Toast.LENGTH_SHORT).show(); + if (mReturnResult) { + Intent intent = new Intent(); + intent.putExtras(data); + setResult(RESULT_OK, intent); + finish(); + return; + } - String error = data.getString(Apg.EXTRA_ERROR); - if (error != null) { - Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT) - .show(); - return; - } + switch (mDecryptTarget) { + case Id.target.message: { + String decryptedMessage = data + .getString(ApgService.RESULT_DECRYPTED_MESSAGE); + mMessage.setText(decryptedMessage); + mMessage.setHorizontallyScrolling(false); + mReplyEnabled = false; - Toast.makeText(this, R.string.decryptionSuccessful, Toast.LENGTH_SHORT).show(); - if (mReturnResult) { - Intent intent = new Intent(); - intent.putExtras(data); - setResult(RESULT_OK, intent); - finish(); - return; - } + // build new action bar + invalidateOptionsMenu(); + break; + } - switch (mDecryptTarget) { - case Id.target.message: { - String decryptedMessage = data.getString(Apg.EXTRA_DECRYPTED_MESSAGE); - mMessage.setText(decryptedMessage); - mMessage.setHorizontallyScrolling(false); - mReplyEnabled = false; + case Id.target.file: { + if (mDeleteAfter.isChecked()) { + // Create and show dialog to delete original file + DeleteFileDialogFragment deleteFileDialog = DeleteFileDialogFragment + .newInstance(mInputFilename); + deleteFileDialog.show(getSupportFragmentManager(), "deleteDialog"); + } + break; + } - // build new action bar - invalidateOptionsMenu(); - break; - } + default: { + // shouldn't happen + break; + } + } - case Id.target.file: { - if (mDeleteAfter.isChecked()) { - setDeleteFile(mInputFilename); - showDialog(Id.dialog.delete_file); - } - break; - } + if (data.getBoolean(ApgService.EXTRA_SIGNATURE)) { + String userId = data.getString(ApgService.EXTRA_SIGNATURE_USER_ID); + mSignatureKeyId = data.getLong(ApgService.EXTRA_SIGNATURE_KEY_ID); + mUserIdRest + .setText("id: " + PGPHelper.getSmallFingerPrint(mSignatureKeyId)); + if (userId == null) { + userId = getResources().getString(R.string.unknownUserId); + } + String chunks[] = userId.split(" <", 2); + userId = chunks[0]; + if (chunks.length > 1) { + mUserIdRest.setText("<" + chunks[1]); + } + mUserId.setText(userId); + + if (data.getBoolean(ApgService.EXTRA_SIGNATURE_SUCCESS)) { + mSignatureStatusImage.setImageResource(R.drawable.overlay_ok); + } else if (data.getBoolean(ApgService.EXTRA_SIGNATURE_UNKNOWN)) { + mSignatureStatusImage.setImageResource(R.drawable.overlay_error); + Toast.makeText(DecryptActivity.this, + R.string.unknownSignatureKeyTouchToLookUp, Toast.LENGTH_LONG) + .show(); + } else { + mSignatureStatusImage.setImageResource(R.drawable.overlay_error); + } + mSignatureLayout.setVisibility(View.VISIBLE); + } + } + }; + }; - default: { - // shouldn't happen - break; - } - } + // Create a new Messenger for the communication back + Messenger messenger = new Messenger(saveHandler); + intent.putExtra(ApgService.EXTRA_MESSENGER, messenger); - if (data.getBoolean(Apg.EXTRA_SIGNATURE)) { - String userId = data.getString(Apg.EXTRA_SIGNATURE_USER_ID); - mSignatureKeyId = data.getLong(Apg.EXTRA_SIGNATURE_KEY_ID); - mUserIdRest.setText("id: " + Apg.getSmallFingerPrint(mSignatureKeyId)); - if (userId == null) { - userId = getResources().getString(R.string.unknownUserId); - } - String chunks[] = userId.split(" <", 2); - userId = chunks[0]; - if (chunks.length > 1) { - mUserIdRest.setText("<" + chunks[1]); - } - mUserId.setText(userId); - - if (data.getBoolean(Apg.EXTRA_SIGNATURE_SUCCESS)) { - mSignatureStatusImage.setImageResource(R.drawable.overlay_ok); - } else if (data.getBoolean(Apg.EXTRA_SIGNATURE_UNKNOWN)) { - mSignatureStatusImage.setImageResource(R.drawable.overlay_error); - Toast.makeText(this, R.string.unknownSignatureKeyTouchToLookUp, Toast.LENGTH_LONG) - .show(); - } else { - mSignatureStatusImage.setImageResource(R.drawable.overlay_error); - } - mSignatureLayout.setVisibility(View.VISIBLE); - } + // show progress dialog + mDecryptingDialog.show(getSupportFragmentManager(), "decryptingDialog"); + + // start service with intent + startService(intent); } + // @Override + // public void run() { + // String error = null; + // Security.addProvider(new BouncyCastleProvider()); + // + // Bundle data = new Bundle(); + // Message msg = new Message(); + // fillDataSource(); + // fillDataDestination(); + // try { + // InputData in = mDataSource.getInputData(this, true); + // OutputStream out = mDataDestination.getOutputStream(this); + // + // if (mSignedOnly) { + // data = Apg.verifyText(this, in, out, this); + // } else { + // data = Apg.decrypt(this, in, out, Apg.getCachedPassPhrase(getSecretKeyId()), this, + // mAssumeSymmetricEncryption); + // } + // + // out.close(); + // + // if (mDataDestination.getStreamFilename() != null) { + // data.putString(Apg.EXTRA_RESULT_URI, "content://" + DataProvider.AUTHORITY + // + "/data/" + mDataDestination.getStreamFilename()); + // } else if (mDecryptTarget == Id.target.message) { + // if (mReturnBinary) { + // data.putByteArray(Apg.EXTRA_DECRYPTED_DATA, + // ((ByteArrayOutputStream) out).toByteArray()); + // } else { + // data.putString(Apg.EXTRA_DECRYPTED_MESSAGE, new String( + // ((ByteArrayOutputStream) out).toByteArray())); + // } + // } + // } catch (PGPException e) { + // error = "" + e; + // } catch (IOException e) { + // error = "" + e; + // } catch (SignatureException e) { + // error = "" + e; + // } catch (Apg.GeneralException e) { + // error = "" + e; + // } + // + // data.putInt(Constants.extras.STATUS, Id.message.done); + // + // if (error != null) { + // data.putString(Apg.EXTRA_ERROR, error); + // } + // + // msg.setData(data); + // sendMessage(msg); + // } + // + // @Override + // public void handlerCallback(Message msg) { + // Bundle data = msg.getData(); + // if (data == null) { + // return; + // } + // + // if (data.getInt(Constants.extras.STATUS) == Id.message.unknown_signature_key) { + // mUnknownSignatureKeyId = data.getLong(Constants.extras.KEY_ID); + // showDialog(Id.dialog.lookup_unknown_key); + // return; + // } + // + // super.handlerCallback(msg); + // } + // + // @Override + // public void doneCallback(Message msg) { + // super.doneCallback(msg); + // + // Bundle data = msg.getData(); + // removeDialog(Id.dialog.decrypting); + // mSignatureKeyId = 0; + // mSignatureLayout.setVisibility(View.GONE); + // mReplyEnabled = false; + // + // // build new action bar + // invalidateOptionsMenu(); + // + // String error = data.getString(Apg.EXTRA_ERROR); + // if (error != null) { + // Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT) + // .show(); + // return; + // } + // + // Toast.makeText(this, R.string.decryptionSuccessful, Toast.LENGTH_SHORT).show(); + // if (mReturnResult) { + // Intent intent = new Intent(); + // intent.putExtras(data); + // setResult(RESULT_OK, intent); + // finish(); + // return; + // } + // + // switch (mDecryptTarget) { + // case Id.target.message: { + // String decryptedMessage = data.getString(Apg.EXTRA_DECRYPTED_MESSAGE); + // mMessage.setText(decryptedMessage); + // mMessage.setHorizontallyScrolling(false); + // mReplyEnabled = false; + // + // // build new action bar + // invalidateOptionsMenu(); + // break; + // } + // + // case Id.target.file: { + // if (mDeleteAfter.isChecked()) { + // //TODO + // // setDeleteFile(mInputFilename); + // // showDialog(Id.dialog.delete_file); + // } + // break; + // } + // + // default: { + // // shouldn't happen + // break; + // } + // } + // + // if (data.getBoolean(Apg.EXTRA_SIGNATURE)) { + // String userId = data.getString(Apg.EXTRA_SIGNATURE_USER_ID); + // mSignatureKeyId = data.getLong(Apg.EXTRA_SIGNATURE_KEY_ID); + // mUserIdRest.setText("id: " + Apg.getSmallFingerPrint(mSignatureKeyId)); + // if (userId == null) { + // userId = getResources().getString(R.string.unknownUserId); + // } + // String chunks[] = userId.split(" <", 2); + // userId = chunks[0]; + // if (chunks.length > 1) { + // mUserIdRest.setText("<" + chunks[1]); + // } + // mUserId.setText(userId); + // + // if (data.getBoolean(Apg.EXTRA_SIGNATURE_SUCCESS)) { + // mSignatureStatusImage.setImageResource(R.drawable.overlay_ok); + // } else if (data.getBoolean(Apg.EXTRA_SIGNATURE_UNKNOWN)) { + // mSignatureStatusImage.setImageResource(R.drawable.overlay_error); + // Toast.makeText(this, R.string.unknownSignatureKeyTouchToLookUp, Toast.LENGTH_LONG) + // .show(); + // } else { + // mSignatureStatusImage.setImageResource(R.drawable.overlay_error); + // } + // mSignatureLayout.setVisibility(View.VISIBLE); + // } + // } + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case Id.request.filename: { if (resultCode == RESULT_OK && data != null) { - String filename = data.getDataString(); - if (filename != null) { - // Get rid of URI prefix: - if (filename.startsWith("file://")) { - filename = filename.substring(7); - } - // replace %20 and so on - filename = Uri.decode(filename); + try { + String path = data.getData().getPath(); + Log.d(Constants.TAG, "path=" + path); - mFilename.setText(filename); + mFilename.setText(path); + } catch (NullPointerException e) { + Log.e(Constants.TAG, "Nullpointer while retrieving path!"); } } return; @@ -742,26 +986,24 @@ public class DecryptActivity extends BaseActivity { case Id.request.output_filename: { if (resultCode == RESULT_OK && data != null) { - String filename = data.getDataString(); - if (filename != null) { - // Get rid of URI prefix: - if (filename.startsWith("file://")) { - filename = filename.substring(7); - } - // replace %20 and so on - filename = Uri.decode(filename); + try { + String path = data.getData().getPath(); + Log.d(Constants.TAG, "path=" + path); - FileDialog.setFilename(filename); + mFileDialog.setFilename(path); + } catch (NullPointerException e) { + Log.e(Constants.TAG, "Nullpointer while retrieving path!"); } } return; } case Id.request.look_up_key_id: { - PausableThread thread = getRunningThread(); - if (thread != null && thread.isPaused()) { - thread.unpause(); - } + // TODO + // PausableThread thread = getRunningThread(); + // if (thread != null && thread.isPaused()) { + // thread.unpause(); + // } return; } @@ -776,22 +1018,22 @@ public class DecryptActivity extends BaseActivity { @Override protected Dialog onCreateDialog(int id) { switch (id) { - case Id.dialog.output_filename: { - return FileDialog.build(this, getString(R.string.title_decryptToFile), - getString(R.string.specifyFileToDecryptTo), mOutputFilename, - new FileDialog.OnClickListener() { - public void onOkClick(String filename, boolean checked) { - removeDialog(Id.dialog.output_filename); - mOutputFilename = filename; - decryptStart(); - } - - public void onCancelClick() { - removeDialog(Id.dialog.output_filename); - } - }, getString(R.string.filemanager_titleSave), - getString(R.string.filemanager_btnSave), null, Id.request.output_filename); - } + // case Id.dialog.output_filename: { + // return FileDialog.build(this, getString(R.string.title_decryptToFile), + // getString(R.string.specifyFileToDecryptTo), mOutputFilename, + // new FileDialog.OnClickListener() { + // public void onOkClick(String filename, boolean checked) { + // removeDialog(Id.dialog.output_filename); + // mOutputFilename = filename; + // decryptStart(); + // } + // + // public void onCancelClick() { + // removeDialog(Id.dialog.output_filename); + // } + // }, getString(R.string.filemanager_titleSave), + // getString(R.string.filemanager_btnSave), null, Id.request.output_filename); + // } case Id.dialog.lookup_unknown_key: { AlertDialog.Builder alert = new AlertDialog.Builder(this); @@ -799,24 +1041,25 @@ public class DecryptActivity extends BaseActivity { alert.setIcon(android.R.drawable.ic_dialog_alert); alert.setTitle(R.string.title_unknownSignatureKey); alert.setMessage(getString(R.string.lookupUnknownKey, - Apg.getSmallFingerPrint(mUnknownSignatureKeyId))); + PGPHelper.getSmallFingerPrint(mUnknownSignatureKeyId))); alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { removeDialog(Id.dialog.lookup_unknown_key); Intent intent = new Intent(DecryptActivity.this, KeyServerQueryActivity.class); - intent.setAction(Apg.Intent.LOOK_UP_KEY_ID); - intent.putExtra(Apg.EXTRA_KEY_ID, mUnknownSignatureKeyId); + intent.setAction(PGPHelper.Intent.LOOK_UP_KEY_ID); + intent.putExtra(PGPHelper.EXTRA_KEY_ID, mUnknownSignatureKeyId); startActivityForResult(intent, Id.request.look_up_key_id); } }); alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { removeDialog(Id.dialog.lookup_unknown_key); - PausableThread thread = getRunningThread(); - if (thread != null && thread.isPaused()) { - thread.unpause(); - } + // TODO + // PausableThread thread = getRunningThread(); + // if (thread != null && thread.isPaused()) { + // thread.unpause(); + // } } }); alert.setCancelable(true); @@ -831,31 +1074,4 @@ public class DecryptActivity extends BaseActivity { return super.onCreateDialog(id); } - - protected void fillDataSource() { - mDataSource = new DataSource(); - if (mContentUri != null) { - mDataSource.setUri(mContentUri); - } else if (mDecryptTarget == Id.target.file) { - mDataSource.setUri(mInputFilename); - } else { - if (mData != null) { - mDataSource.setData(mData); - } else { - mDataSource.setText(mMessage.getText().toString()); - } - } - } - - protected void fillDataDestination() { - mDataDestination = new DataDestination(); - if (mContentUri != null) { - mDataDestination.setMode(Id.mode.stream); - } else if (mDecryptTarget == Id.target.file) { - mDataDestination.setFilename(mOutputFilename); - mDataDestination.setMode(Id.mode.file); - } else { - mDataDestination.setMode(Id.mode.byte_array); - } - } } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/EditKeyActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/EditKeyActivity.java index ab3956abc..7870a80c3 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/EditKeyActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/EditKeyActivity.java @@ -19,9 +19,11 @@ package org.thialfihar.android.apg.ui; import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKeyRing; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Id; +import org.thialfihar.android.apg.helper.PGPHelper; +import org.thialfihar.android.apg.helper.OtherHelper; +import org.thialfihar.android.apg.helper.PGPConversionHelper; import org.thialfihar.android.apg.service.ApgHandler; import org.thialfihar.android.apg.service.ApgService; import org.thialfihar.android.apg.ui.dialog.ProgressDialogFragment; @@ -29,7 +31,6 @@ import org.thialfihar.android.apg.ui.widget.KeyEditor; import org.thialfihar.android.apg.ui.widget.SectionView; import org.thialfihar.android.apg.ui.widget.UserIdEditor; import org.thialfihar.android.apg.util.IterableIterator; -import org.thialfihar.android.apg.util.Utils; import org.thialfihar.android.apg.R; import com.actionbarsherlock.app.ActionBar; @@ -132,7 +133,7 @@ public class EditKeyActivity extends SherlockFragmentActivity { mActionBar.setDisplayShowTitleEnabled(true); // set actionbar without home button if called from another app - if (getCallingPackage() != null && getCallingPackage().equals(Apg.PACKAGE_NAME)) { + if (getCallingPackage() != null && getCallingPackage().equals(PGPHelper.PACKAGE_NAME)) { mActionBar.setDisplayHomeAsUpEnabled(true); mActionBar.setHomeButtonEnabled(true); } else { @@ -153,7 +154,7 @@ public class EditKeyActivity extends SherlockFragmentActivity { // Handle intents Bundle extras = mIntent.getExtras(); - if (Apg.Intent.CREATE_KEY.equals(mIntent.getAction())) { + if (PGPHelper.Intent.CREATE_KEY.equals(mIntent.getAction())) { mActionBar.setTitle(R.string.title_createKey); @@ -161,14 +162,14 @@ public class EditKeyActivity extends SherlockFragmentActivity { if (extras != null) { // if userId is given, prefill the fields - if (extras.containsKey(Apg.EXTRA_USER_IDS)) { + if (extras.containsKey(PGPHelper.EXTRA_USER_IDS)) { Log.d(Constants.TAG, "UserIds are given!"); - mUserIds.add(extras.getString(Apg.EXTRA_USER_IDS)); + mUserIds.add(extras.getString(PGPHelper.EXTRA_USER_IDS)); } // if no passphrase is given - if (extras.containsKey(Apg.EXTRA_NO_PASSPHRASE)) { - boolean noPassphrase = extras.getBoolean(Apg.EXTRA_NO_PASSPHRASE); + if (extras.containsKey(PGPHelper.EXTRA_NO_PASSPHRASE)) { + boolean noPassphrase = extras.getBoolean(PGPHelper.EXTRA_NO_PASSPHRASE); if (noPassphrase) { // check "no passphrase" checkbox and remove button mNoPassphrase.setChecked(true); @@ -177,9 +178,9 @@ public class EditKeyActivity extends SherlockFragmentActivity { } // generate key - if (extras.containsKey(Apg.EXTRA_GENERATE_DEFAULT_KEYS)) { + if (extras.containsKey(PGPHelper.EXTRA_GENERATE_DEFAULT_KEYS)) { boolean generateDefaultKeys = extras - .getBoolean(Apg.EXTRA_GENERATE_DEFAULT_KEYS); + .getBoolean(PGPHelper.EXTRA_GENERATE_DEFAULT_KEYS); if (generateDefaultKeys) { // build layout in handler after generating keys not directly in onCreate @@ -209,10 +210,10 @@ public class EditKeyActivity extends SherlockFragmentActivity { if (message.arg1 == ApgHandler.MESSAGE_OKAY) { // get new key from data bundle returned from service Bundle data = message.getData(); - PGPSecretKeyRing masterKeyRing = Utils + PGPSecretKeyRing masterKeyRing = PGPConversionHelper .BytesToPGPSecretKeyRing(data .getByteArray(ApgService.RESULT_NEW_KEY)); - PGPSecretKeyRing subKeyRing = Utils + PGPSecretKeyRing subKeyRing = PGPConversionHelper .BytesToPGPSecretKeyRing(data .getByteArray(ApgService.RESULT_NEW_KEY2)); @@ -243,11 +244,11 @@ public class EditKeyActivity extends SherlockFragmentActivity { } } } - } else if (Apg.Intent.EDIT_KEY.equals(mIntent.getAction())) { + } else if (PGPHelper.Intent.EDIT_KEY.equals(mIntent.getAction())) { mActionBar.setTitle(R.string.title_editKey); - mCurrentPassPhrase = Apg.getEditPassPhrase(); + mCurrentPassPhrase = PGPHelper.getEditPassPhrase(); if (mCurrentPassPhrase == null) { mCurrentPassPhrase = ""; } @@ -260,14 +261,14 @@ public class EditKeyActivity extends SherlockFragmentActivity { if (extras != null) { - if (extras.containsKey(Apg.EXTRA_KEY_ID)) { - long keyId = mIntent.getExtras().getLong(Apg.EXTRA_KEY_ID); + if (extras.containsKey(PGPHelper.EXTRA_KEY_ID)) { + long keyId = mIntent.getExtras().getLong(PGPHelper.EXTRA_KEY_ID); if (keyId != 0) { PGPSecretKey masterKey = null; - mKeyRing = Apg.getSecretKeyRing(keyId); + mKeyRing = PGPHelper.getSecretKeyRing(keyId); if (mKeyRing != null) { - masterKey = Apg.getMasterKey(mKeyRing); + masterKey = PGPHelper.getMasterKey(mKeyRing); for (PGPSecretKey key : new IterableIterator<PGPSecretKey>( mKeyRing.getSecretKeys())) { mKeys.add(key); @@ -411,7 +412,7 @@ public class EditKeyActivity extends SherlockFragmentActivity { try { if (!isPassphraseSet()) { - throw new Apg.GeneralException(this.getString(R.string.setAPassPhrase)); + throw new PGPHelper.GeneralException(this.getString(R.string.setAPassPhrase)); } // Send all information needed to service to edit key in other thread @@ -425,7 +426,7 @@ public class EditKeyActivity extends SherlockFragmentActivity { data.putString(ApgService.NEW_PASSPHRASE, mNewPassPhrase); data.putSerializable(ApgService.USER_IDS, getUserIds(mUserIdsView)); Vector<PGPSecretKey> keys = getKeys(mKeysView); - data.putByteArray(ApgService.KEYS, Utils.PGPSecretKeyListToBytes(keys)); + data.putByteArray(ApgService.KEYS, PGPConversionHelper.PGPSecretKeyListToBytes(keys)); data.putSerializable(ApgService.KEYS_USAGES, getKeysUsages(mKeysView)); data.putLong(ApgService.MASTER_KEY_ID, getMasterKeyId()); @@ -455,7 +456,7 @@ public class EditKeyActivity extends SherlockFragmentActivity { // start service with intent startService(intent); - } catch (Apg.GeneralException e) { + } catch (PGPHelper.GeneralException e) { Toast.makeText(this, getString(R.string.errorMessage, e.getMessage()), Toast.LENGTH_SHORT).show(); } @@ -467,7 +468,8 @@ public class EditKeyActivity extends SherlockFragmentActivity { * @param userIdsView * @return */ - private Vector<String> getUserIds(SectionView userIdsView) throws Apg.GeneralException { + private Vector<String> getUserIds(SectionView userIdsView) + throws PGPHelper.GeneralException { Vector<String> userIds = new Vector<String>(); ViewGroup userIdEditors = userIdsView.getEditors(); @@ -479,12 +481,13 @@ public class EditKeyActivity extends SherlockFragmentActivity { try { userId = editor.getValue(); } catch (UserIdEditor.NoNameException e) { - throw new Apg.GeneralException(this.getString(R.string.error_userIdNeedsAName)); + throw new PGPHelper.GeneralException( + this.getString(R.string.error_userIdNeedsAName)); } catch (UserIdEditor.NoEmailException e) { - throw new Apg.GeneralException( + throw new PGPHelper.GeneralException( this.getString(R.string.error_userIdNeedsAnEmailAddress)); } catch (UserIdEditor.InvalidEmailException e) { - throw new Apg.GeneralException(e.getMessage()); + throw new PGPHelper.GeneralException(e.getMessage()); } if (userId.equals("")) { @@ -500,11 +503,12 @@ public class EditKeyActivity extends SherlockFragmentActivity { } if (userIds.size() == 0) { - throw new Apg.GeneralException(getString(R.string.error_keyNeedsAUserId)); + throw new PGPHelper.GeneralException(getString(R.string.error_keyNeedsAUserId)); } if (!gotMainUserId) { - throw new Apg.GeneralException(getString(R.string.error_mainUserIdMustNotBeEmpty)); + throw new PGPHelper.GeneralException( + getString(R.string.error_mainUserIdMustNotBeEmpty)); } return userIds; @@ -516,13 +520,14 @@ public class EditKeyActivity extends SherlockFragmentActivity { * @param keysView * @return */ - private Vector<PGPSecretKey> getKeys(SectionView keysView) throws Apg.GeneralException { + private Vector<PGPSecretKey> getKeys(SectionView keysView) + throws PGPHelper.GeneralException { Vector<PGPSecretKey> keys = new Vector<PGPSecretKey>(); ViewGroup keyEditors = keysView.getEditors(); if (keyEditors.getChildCount() == 0) { - throw new Apg.GeneralException(getString(R.string.error_keyNeedsMasterKey)); + throw new PGPHelper.GeneralException(getString(R.string.error_keyNeedsMasterKey)); } for (int i = 0; i < keyEditors.getChildCount(); ++i) { @@ -539,13 +544,14 @@ public class EditKeyActivity extends SherlockFragmentActivity { * @param keysView * @return */ - private Vector<Integer> getKeysUsages(SectionView keysView) throws Apg.GeneralException { + private Vector<Integer> getKeysUsages(SectionView keysView) + throws PGPHelper.GeneralException { Vector<Integer> getKeysUsages = new Vector<Integer>(); ViewGroup keyEditors = keysView.getEditors(); if (keyEditors.getChildCount() == 0) { - throw new Apg.GeneralException(getString(R.string.error_keyNeedsMasterKey)); + throw new PGPHelper.GeneralException(getString(R.string.error_keyNeedsMasterKey)); } for (int i = 0; i < keyEditors.getChildCount(); ++i) { diff --git a/org_apg/src/org/thialfihar/android/apg/ui/EncryptActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/EncryptActivity.java index 05dd17b8e..2d365f926 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/EncryptActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/EncryptActivity.java @@ -21,10 +21,11 @@ import org.spongycastle.openpgp.PGPPublicKey; import org.spongycastle.openpgp.PGPPublicKeyRing; import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKeyRing; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Preferences; +import org.thialfihar.android.apg.helper.FileHelper; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.service.ApgHandler; import org.thialfihar.android.apg.service.ApgService; import org.thialfihar.android.apg.ui.dialog.DeleteFileDialogFragment; @@ -33,7 +34,6 @@ import org.thialfihar.android.apg.ui.dialog.PassphraseDialogFragment; import org.thialfihar.android.apg.ui.dialog.ProgressDialogFragment; import org.thialfihar.android.apg.util.Choice; import org.thialfihar.android.apg.util.Compatibility; -import org.thialfihar.android.apg.util.Utils; import org.thialfihar.android.apg.R; import com.actionbarsherlock.app.ActionBar; @@ -181,6 +181,18 @@ public class EncryptActivity extends SherlockFragmentActivity { super.onCreate(savedInstanceState); setContentView(R.layout.encrypt); + // set actionbar without home button if called from another app + final ActionBar actionBar = getSupportActionBar(); + Log.d(Constants.TAG, "calling package (only set when using startActivityForResult)=" + + getCallingPackage()); + if (getCallingPackage() != null && getCallingPackage().equals(PGPHelper.PACKAGE_NAME)) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setHomeButtonEnabled(true); + } else { + actionBar.setDisplayHomeAsUpEnabled(false); + actionBar.setHomeButtonEnabled(false); + } + mGenerateSignature = false; mSource = (ViewFlipper) findViewById(R.id.source); @@ -268,7 +280,7 @@ public class EncryptActivity extends SherlockFragmentActivity { mBrowse = (ImageButton) findViewById(R.id.btn_browse); mBrowse.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - Utils.openFile(EncryptActivity.this, mFilename.getText().toString(), "*/*", + FileHelper.openFile(EncryptActivity.this, mFilename.getText().toString(), "*/*", Id.request.filename); } }); @@ -323,61 +335,49 @@ public class EncryptActivity extends SherlockFragmentActivity { }); mIntent = getIntent(); - if (Apg.Intent.ENCRYPT.equals(mIntent.getAction()) - || Apg.Intent.ENCRYPT_FILE.equals(mIntent.getAction()) - || Apg.Intent.ENCRYPT_AND_RETURN.equals(mIntent.getAction()) - || Apg.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) { + if (PGPHelper.Intent.ENCRYPT.equals(mIntent.getAction()) + || PGPHelper.Intent.ENCRYPT_FILE.equals(mIntent.getAction()) + || PGPHelper.Intent.ENCRYPT_AND_RETURN.equals(mIntent.getAction()) + || PGPHelper.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) { mContentUri = mIntent.getData(); Bundle extras = mIntent.getExtras(); if (extras == null) { extras = new Bundle(); } - // set actionbar without home button if called from another app - final ActionBar actionBar = getSupportActionBar(); - Log.d(Constants.TAG, "calling package (only set when using startActivityForResult)=" - + getCallingPackage()); - if (getCallingPackage() != null && getCallingPackage().equals(Apg.PACKAGE_NAME)) { - actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setHomeButtonEnabled(true); - } else { - actionBar.setDisplayHomeAsUpEnabled(false); - actionBar.setHomeButtonEnabled(false); - } - - if (Apg.Intent.ENCRYPT_AND_RETURN.equals(mIntent.getAction()) - || Apg.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) { + if (PGPHelper.Intent.ENCRYPT_AND_RETURN.equals(mIntent.getAction()) + || PGPHelper.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) { mReturnResult = true; } - if (Apg.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) { + if (PGPHelper.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) { mGenerateSignature = true; mOverrideAsciiArmour = true; mAsciiArmourDemand = false; } - if (extras.containsKey(Apg.EXTRA_ASCII_ARMOUR)) { - mAsciiArmourDemand = extras.getBoolean(Apg.EXTRA_ASCII_ARMOUR, true); + if (extras.containsKey(PGPHelper.EXTRA_ASCII_ARMOUR)) { + mAsciiArmourDemand = extras.getBoolean(PGPHelper.EXTRA_ASCII_ARMOUR, true); mOverrideAsciiArmour = true; mAsciiArmour.setChecked(mAsciiArmourDemand); } - mData = extras.getByteArray(Apg.EXTRA_DATA); + mData = extras.getByteArray(PGPHelper.EXTRA_DATA); String textData = null; if (mData == null) { - textData = extras.getString(Apg.EXTRA_TEXT); + textData = extras.getString(PGPHelper.EXTRA_TEXT); } - mSendTo = extras.getString(Apg.EXTRA_SEND_TO); - mSubject = extras.getString(Apg.EXTRA_SUBJECT); - long signatureKeyId = extras.getLong(Apg.EXTRA_SIGNATURE_KEY_ID); - long encryptionKeyIds[] = extras.getLongArray(Apg.EXTRA_ENCRYPTION_KEY_IDS); + mSendTo = extras.getString(PGPHelper.EXTRA_SEND_TO); + mSubject = extras.getString(PGPHelper.EXTRA_SUBJECT); + long signatureKeyId = extras.getLong(PGPHelper.EXTRA_SIGNATURE_KEY_ID); + long encryptionKeyIds[] = extras.getLongArray(PGPHelper.EXTRA_ENCRYPTION_KEY_IDS); if (signatureKeyId != 0) { - PGPSecretKeyRing keyRing = Apg.getSecretKeyRing(signatureKeyId); + PGPSecretKeyRing keyRing = PGPHelper.getSecretKeyRing(signatureKeyId); PGPSecretKey masterKey = null; if (keyRing != null) { - masterKey = Apg.getMasterKey(keyRing); + masterKey = PGPHelper.getMasterKey(keyRing); if (masterKey != null) { - Vector<PGPSecretKey> signKeys = Apg.getUsableSigningKeys(keyRing); + Vector<PGPSecretKey> signKeys = PGPHelper.getUsableSigningKeys(keyRing); if (signKeys.size() > 0) { setSecretKeyId(masterKey.getKeyID()); } @@ -388,16 +388,16 @@ public class EncryptActivity extends SherlockFragmentActivity { if (encryptionKeyIds != null) { Vector<Long> goodIds = new Vector<Long>(); for (int i = 0; i < encryptionKeyIds.length; ++i) { - PGPPublicKeyRing keyRing = Apg.getPublicKeyRing(encryptionKeyIds[i]); + PGPPublicKeyRing keyRing = PGPHelper.getPublicKeyRing(encryptionKeyIds[i]); PGPPublicKey masterKey = null; if (keyRing == null) { continue; } - masterKey = Apg.getMasterKey(keyRing); + masterKey = PGPHelper.getMasterKey(keyRing); if (masterKey == null) { continue; } - Vector<PGPPublicKey> encryptKeys = Apg.getUsableEncryptKeys(keyRing); + Vector<PGPPublicKey> encryptKeys = PGPHelper.getUsableEncryptKeys(keyRing); if (encryptKeys.size() == 0) { continue; } @@ -411,9 +411,9 @@ public class EncryptActivity extends SherlockFragmentActivity { } } - if (Apg.Intent.ENCRYPT.equals(mIntent.getAction()) - || Apg.Intent.ENCRYPT_AND_RETURN.equals(mIntent.getAction()) - || Apg.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) { + if (PGPHelper.Intent.ENCRYPT.equals(mIntent.getAction()) + || PGPHelper.Intent.ENCRYPT_AND_RETURN.equals(mIntent.getAction()) + || PGPHelper.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) { if (textData != null) { mMessage.setText(textData); } @@ -422,7 +422,7 @@ public class EncryptActivity extends SherlockFragmentActivity { while (mSource.getCurrentView().getId() != R.id.sourceMessage) { mSource.showNext(); } - } else if (Apg.Intent.ENCRYPT_FILE.equals(mIntent.getAction())) { + } else if (PGPHelper.Intent.ENCRYPT_FILE.equals(mIntent.getAction())) { if ("file".equals(mIntent.getScheme())) { mInputFilename = Uri.decode(mIntent.getDataString().replace("file://", "")); mFilename.setText(mInputFilename); @@ -651,7 +651,7 @@ public class EncryptActivity extends SherlockFragmentActivity { return; } - if (getSecretKeyId() != 0 && Apg.getCachedPassPhrase(getSecretKeyId()) == null) { + if (getSecretKeyId() != 0 && PGPHelper.getCachedPassPhrase(getSecretKeyId()) == null) { showPassphraseDialog(); return; @@ -659,7 +659,7 @@ public class EncryptActivity extends SherlockFragmentActivity { } if (mEncryptTarget == Id.target.file) { - askForOutputFilename(); + showOutputFileDialog(); } else { encryptStart(); } @@ -676,7 +676,7 @@ public class EncryptActivity extends SherlockFragmentActivity { public void handleMessage(Message message) { if (message.what == PassphraseDialogFragment.MESSAGE_OKAY) { if (mEncryptTarget == Id.target.file) { - askForOutputFilename(); + showOutputFileDialog(); } else { encryptStart(); } @@ -692,15 +692,15 @@ public class EncryptActivity extends SherlockFragmentActivity { messenger, mSecretKeyId); passphraseDialog.show(getSupportFragmentManager(), "passphraseDialog"); - } catch (Apg.GeneralException e) { + } catch (PGPHelper.GeneralException e) { Log.d(Constants.TAG, "No passphrase for this secret key, encrypt directly!"); // send message to handler to start encryption directly returnHandler.sendEmptyMessage(PassphraseDialogFragment.MESSAGE_OKAY); } } - private void askForOutputFilename() { - // Message is received after passphrase is cached + private void showOutputFileDialog() { + // Message is received after file is selected Handler returnHandler = new Handler() { @Override public void handleMessage(Message message) { @@ -721,7 +721,6 @@ public class EncryptActivity extends SherlockFragmentActivity { Id.request.output_filename); mFileDialog.show(getSupportFragmentManager(), "fileDialog"); - } private void encryptStart() { @@ -743,7 +742,6 @@ public class EncryptActivity extends SherlockFragmentActivity { if (passPhrase.length() == 0) { passPhrase = null; } - // signatureKeyId = Id.key.symmetric; data.putString(ApgService.SYMMETRIC_PASSPHRASE, passPhrase); } else { @@ -776,13 +774,13 @@ public class EncryptActivity extends SherlockFragmentActivity { intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_ENCRYPT_SIGN_BYTES); if (mData != null) { - data.putByteArray(ApgService.BYTES, mData); + data.putByteArray(ApgService.MESSAGE_BYTES, mData); } else { String message = mMessage.getText().toString(); if (signOnly && !mReturnResult) { fixBadCharactersForGmail(message); } - data.putByteArray(ApgService.BYTES, message.getBytes()); + data.putByteArray(ApgService.MESSAGE_BYTES, message.getBytes()); } } @@ -919,11 +917,11 @@ public class EncryptActivity extends SherlockFragmentActivity { } else { String uid = getResources().getString(R.string.unknownUserId); String uidExtra = ""; - PGPSecretKeyRing keyRing = Apg.getSecretKeyRing(getSecretKeyId()); + PGPSecretKeyRing keyRing = PGPHelper.getSecretKeyRing(getSecretKeyId()); if (keyRing != null) { - PGPSecretKey key = Apg.getMasterKey(keyRing); + PGPSecretKey key = PGPHelper.getMasterKey(keyRing); if (key != null) { - String userId = Apg.getMainUserIdSafe(this, key); + String userId = PGPHelper.getMainUserIdSafe(this, key); String chunks[] = userId.split(" <", 2); uid = chunks[0]; if (chunks.length > 1) { @@ -957,7 +955,7 @@ public class EncryptActivity extends SherlockFragmentActivity { initialKeyIds[i] = keyIds.get(i); } } - intent.putExtra(Apg.EXTRA_SELECTION, initialKeyIds); + intent.putExtra(PGPHelper.EXTRA_SELECTION, initialKeyIds); startActivityForResult(intent, Id.request.public_keys); } @@ -1000,7 +998,7 @@ public class EncryptActivity extends SherlockFragmentActivity { case Id.request.public_keys: { if (resultCode == RESULT_OK) { Bundle bundle = data.getExtras(); - mEncryptionKeyIds = bundle.getLongArray(Apg.EXTRA_SELECTION); + mEncryptionKeyIds = bundle.getLongArray(PGPHelper.EXTRA_SELECTION); } updateView(); break; @@ -1009,7 +1007,7 @@ public class EncryptActivity extends SherlockFragmentActivity { case Id.request.secret_keys: { if (resultCode == RESULT_OK) { Bundle bundle = data.getExtras(); - setSecretKeyId(bundle.getLong(Apg.EXTRA_KEY_ID)); + setSecretKeyId(bundle.getLong(PGPHelper.EXTRA_KEY_ID)); } else { setSecretKeyId(Id.key.none); } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/GeneralActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/GeneralActivity.java index 76a5dc92c..dde247bdf 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/GeneralActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/GeneralActivity.java @@ -21,8 +21,8 @@ import java.io.InputStream; import java.util.Vector; import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Id; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.util.Choice; import android.content.Intent; @@ -83,7 +83,7 @@ public class GeneralActivity extends BaseActivity { int contentType = Id.content.unknown; try { - contentType = Apg.getStreamContent(this, inStream); + contentType = PGPHelper.getStreamContent(this, inStream); inStream.close(); } catch (IOException e) { // just means that there's no PGP data in there @@ -134,10 +134,10 @@ public class GeneralActivity extends BaseActivity { case Id.choice.action.encrypt: { intent.setClass(this, EncryptActivity.class); if (mDataString != null) { - intent.setAction(Apg.Intent.ENCRYPT); - intent.putExtra(Apg.EXTRA_TEXT, mDataString); + intent.setAction(PGPHelper.Intent.ENCRYPT); + intent.putExtra(PGPHelper.EXTRA_TEXT, mDataString); } else if (mDataUri != null) { - intent.setAction(Apg.Intent.ENCRYPT_FILE); + intent.setAction(PGPHelper.Intent.ENCRYPT_FILE); intent.setDataAndType(mDataUri, mIntent.getType()); } @@ -147,10 +147,10 @@ public class GeneralActivity extends BaseActivity { case Id.choice.action.decrypt: { intent.setClass(this, DecryptActivity.class); if (mDataString != null) { - intent.setAction(Apg.Intent.DECRYPT); - intent.putExtra(Apg.EXTRA_TEXT, mDataString); + intent.setAction(PGPHelper.Intent.DECRYPT); + intent.putExtra(PGPHelper.EXTRA_TEXT, mDataString); } else if (mDataUri != null) { - intent.setAction(Apg.Intent.DECRYPT_FILE); + intent.setAction(PGPHelper.Intent.DECRYPT_FILE); intent.setDataAndType(mDataUri, mIntent.getType()); } @@ -159,9 +159,9 @@ public class GeneralActivity extends BaseActivity { case Id.choice.action.import_public: { intent.setClass(this, PublicKeyListActivity.class); - intent.setAction(Apg.Intent.IMPORT); + intent.setAction(PGPHelper.Intent.IMPORT); if (mDataString != null) { - intent.putExtra(Apg.EXTRA_TEXT, mDataString); + intent.putExtra(PGPHelper.EXTRA_TEXT, mDataString); } else if (mDataUri != null) { intent.setDataAndType(mDataUri, mIntent.getType()); } @@ -170,9 +170,9 @@ public class GeneralActivity extends BaseActivity { case Id.choice.action.import_secret: { intent.setClass(this, SecretKeyListActivity.class); - intent.setAction(Apg.Intent.IMPORT); + intent.setAction(PGPHelper.Intent.IMPORT); if (mDataString != null) { - intent.putExtra(Apg.EXTRA_TEXT, mDataString); + intent.putExtra(PGPHelper.EXTRA_TEXT, mDataString); } else if (mDataUri != null) { intent.setDataAndType(mDataUri, mIntent.getType()); } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/HelpFragmentAbout.java b/org_apg/src/org/thialfihar/android/apg/ui/HelpFragmentAbout.java index 3dec32446..bb42aa20c 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/HelpFragmentAbout.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/HelpFragmentAbout.java @@ -18,7 +18,7 @@ package org.thialfihar.android.apg.ui; import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.util.Utils; +import org.thialfihar.android.apg.helper.OtherHelper; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; @@ -52,7 +52,7 @@ public class HelpFragmentAbout extends SherlockFragment { View view = inflater.inflate(R.layout.help_fragment_about, container, false); // load html from html file from /res/raw - String aboutText = Utils.readContentFromResource(this.getActivity(), R.raw.help_about); + String aboutText = OtherHelper.readContentFromResource(this.getActivity(), R.raw.help_about); TextView versionText = (TextView) view.findViewById(R.id.help_about_version); versionText.setText(getString(R.string.help_about_version) + " " + getVersion()); diff --git a/org_apg/src/org/thialfihar/android/apg/ui/HelpFragmentHtml.java b/org_apg/src/org/thialfihar/android/apg/ui/HelpFragmentHtml.java index 35f6fb3e6..ea90d6855 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/HelpFragmentHtml.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/HelpFragmentHtml.java @@ -16,7 +16,7 @@ package org.thialfihar.android.apg.ui; -import org.thialfihar.android.apg.util.Utils; +import org.thialfihar.android.apg.helper.OtherHelper; import android.app.Activity; import android.os.Bundle; @@ -68,7 +68,7 @@ public class HelpFragmentHtml extends SherlockFragment { htmlFile = getArguments().getInt(ARG_HTML_FILE); // load html from html file from /res/raw - String helpText = Utils.readContentFromResource(this.getActivity(), htmlFile); + String helpText = OtherHelper.readContentFromResource(this.getActivity(), htmlFile); mActivity = getActivity(); diff --git a/org_apg/src/org/thialfihar/android/apg/ui/ImportFromQRCodeActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/ImportFromQRCodeActivity.java index 6f1043467..c9fb89cc7 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/ImportFromQRCodeActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/ImportFromQRCodeActivity.java @@ -1,4 +1,6 @@ /* + * Copyright (C) 2011 Senecaso + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -19,11 +21,11 @@ import java.io.IOException; import org.spongycastle.openpgp.PGPKeyRing; import org.spongycastle.openpgp.PGPPublicKeyRing; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.HkpKeyServer; import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.KeyServer.QueryException; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.R; import android.content.Intent; @@ -60,33 +62,33 @@ public class ImportFromQRCodeActivity extends BaseActivity { HkpKeyServer server = new HkpKeyServer(mPreferences.getKeyServers()[0]); // TODO: there should be only 1 String encodedKey = server.get(keyId); - PGPKeyRing keyring = Apg.decodeKeyRing(new ByteArrayInputStream(encodedKey.getBytes())); + PGPKeyRing keyring = PGPHelper.decodeKeyRing(new ByteArrayInputStream(encodedKey.getBytes())); if (keyring != null && keyring instanceof PGPPublicKeyRing) { PGPPublicKeyRing publicKeyRing = (PGPPublicKeyRing) keyring; // make sure the fingerprints match before we cache this thing - String actualFingerprint = Apg.convertToHex(publicKeyRing.getPublicKey().getFingerprint()); + String actualFingerprint = PGPHelper.convertToHex(publicKeyRing.getPublicKey().getFingerprint()); if (expectedFingerprint.equals(actualFingerprint)) { // store the signed key in our local cache - int retval = Apg.storeKeyRingInCache(publicKeyRing); + int retval = PGPHelper.storeKeyRingInCache(publicKeyRing); if (retval != Id.return_value.ok && retval != Id.return_value.updated) { - status.putString(Apg.EXTRA_ERROR, "Failed to store signed key in local cache"); + status.putString(PGPHelper.EXTRA_ERROR, "Failed to store signed key in local cache"); } else { Intent intent = new Intent(ImportFromQRCodeActivity.this, SignKeyActivity.class); - intent.putExtra(Apg.EXTRA_KEY_ID, keyId); + intent.putExtra(PGPHelper.EXTRA_KEY_ID, keyId); startActivityForResult(intent, Id.request.sign_key); } } else { - status.putString(Apg.EXTRA_ERROR, "Scanned fingerprint does NOT match the fingerprint of the received key. You shouldnt trust this key."); + status.putString(PGPHelper.EXTRA_ERROR, "Scanned fingerprint does NOT match the fingerprint of the received key. You shouldnt trust this key."); } } } catch (QueryException e) { Log.e(TAG, "Failed to query KeyServer", e); - status.putString(Apg.EXTRA_ERROR, "Failed to query KeyServer"); + status.putString(PGPHelper.EXTRA_ERROR, "Failed to query KeyServer"); status.putInt(Constants.extras.STATUS, Id.message.done); } catch (IOException e) { Log.e(TAG, "Failed to query KeyServer", e); - status.putString(Apg.EXTRA_ERROR, "Failed to query KeyServer"); + status.putString(PGPHelper.EXTRA_ERROR, "Failed to query KeyServer"); status.putInt(Constants.extras.STATUS, Id.message.done); } } @@ -140,7 +142,7 @@ public class ImportFromQRCodeActivity extends BaseActivity { super.doneCallback(msg); Bundle data = msg.getData(); - String error = data.getString(Apg.EXTRA_ERROR); + String error = data.getString(PGPHelper.EXTRA_ERROR); if (error != null) { Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT).show(); return; diff --git a/org_apg/src/org/thialfihar/android/apg/ui/KeyListActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/KeyListActivity.java index 787afd431..8e2bcaecb 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/KeyListActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/KeyListActivity.java @@ -19,14 +19,14 @@ package org.thialfihar.android.apg.ui; import org.spongycastle.openpgp.PGPException; import org.spongycastle.openpgp.PGPPublicKeyRing; import org.spongycastle.openpgp.PGPSecretKeyRing; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Constants; -import org.thialfihar.android.apg.FileDialog; import org.thialfihar.android.apg.Id; -import org.thialfihar.android.apg.InputData; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.provider.KeyRings; import org.thialfihar.android.apg.provider.Keys; import org.thialfihar.android.apg.provider.UserIds; +import org.thialfihar.android.apg.ui.dialog.FileDialogFragment; +import org.thialfihar.android.apg.util.InputData; import org.thialfihar.android.apg.R; import com.actionbarsherlock.view.MenuItem; @@ -42,7 +42,10 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import android.os.Message; +import android.os.Messenger; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -83,6 +86,8 @@ public class KeyListActivity extends BaseActivity { protected int mKeyType = Id.type.public_key; + FileDialogFragment mFileDialog; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -134,11 +139,11 @@ public class KeyListActivity extends BaseActivity { mListAdapter = new KeyListAdapter(this, searchString); mList.setAdapter(mListAdapter); - if (Apg.Intent.IMPORT.equals(intent.getAction())) { + if (PGPHelper.Intent.IMPORT.equals(intent.getAction())) { if ("file".equals(intent.getScheme()) && intent.getDataString() != null) { mImportFilename = Uri.decode(intent.getDataString().replace("file://", "")); } else { - mImportData = intent.getStringExtra(Apg.EXTRA_TEXT); + mImportData = intent.getStringExtra(PGPHelper.EXTRA_TEXT); } importKeys(); } @@ -148,12 +153,14 @@ public class KeyListActivity extends BaseActivity { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case Id.menu.option.import_keys: { - showDialog(Id.dialog.import_keys); + // showDialog(Id.dialog.import_keys); + showImportKeysDialog(); return true; } case Id.menu.option.export_keys: { - showDialog(Id.dialog.export_keys); + // showDialog(Id.dialog.export_keys); + showExportKeysDialog(false); return true; } @@ -163,6 +170,59 @@ public class KeyListActivity extends BaseActivity { } } + private void showImportKeysDialog() { + // Message is received after file is selected + Handler returnHandler = new Handler() { + @Override + public void handleMessage(Message message) { + if (message.what == FileDialogFragment.MESSAGE_OKAY) { + Bundle data = message.getData(); + mImportFilename = data.getString(FileDialogFragment.MESSAGE_DATA_FILENAME); + + mDeleteAfterImport = data.getBoolean(FileDialogFragment.MESSAGE_DATA_CHECKED); + importKeys(); + } + } + }; + + // Create a new Messenger for the communication back + Messenger messenger = new Messenger(returnHandler); + + mFileDialog = FileDialogFragment.newInstance(messenger, + getString(R.string.title_importKeys), getString(R.string.specifyFileToImportFrom), + mImportFilename, null, Id.request.filename); + + mFileDialog.show(getSupportFragmentManager(), "fileDialog"); + } + + private void showExportKeysDialog(boolean singleKeyExport) { + String title = (singleKeyExport ? getString(R.string.title_exportKey) + : getString(R.string.title_exportKeys)); + String message = getString(mKeyType == Id.type.public_key ? R.string.specifyFileToExportTo + : R.string.specifyFileToExportSecretKeysTo); + + // Message is received after file is selected + Handler returnHandler = new Handler() { + @Override + public void handleMessage(Message message) { + if (message.what == FileDialogFragment.MESSAGE_OKAY) { + Bundle data = message.getData(); + mExportFilename = data.getString(FileDialogFragment.MESSAGE_DATA_FILENAME); + + exportKeys(); + } + } + }; + + // Create a new Messenger for the communication back + Messenger messenger = new Messenger(returnHandler); + + mFileDialog = FileDialogFragment.newInstance(messenger, title, message, mExportFilename, + null, Id.request.filename); + + mFileDialog.show(getSupportFragmentManager(), "fileDialog"); + } + @Override public boolean onContextItemSelected(android.view.MenuItem menuItem) { ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) menuItem.getMenuInfo(); @@ -176,7 +236,7 @@ public class KeyListActivity extends BaseActivity { switch (menuItem.getItemId()) { case Id.menu.export: { mSelectedItem = groupPosition; - showDialog(Id.dialog.export_key); + showExportKeysDialog(true); return true; } @@ -194,7 +254,6 @@ public class KeyListActivity extends BaseActivity { @Override protected Dialog onCreateDialog(int id) { - boolean singleKeyExport = false; switch (id) { case Id.dialog.delete_key: { @@ -202,14 +261,14 @@ public class KeyListActivity extends BaseActivity { mSelectedItem = -1; // TODO: better way to do this? String userId = "<unknown>"; - Object keyRing = Apg.getKeyRing(keyRingId); + Object keyRing = PGPHelper.getKeyRing(keyRingId); if (keyRing != null) { if (keyRing instanceof PGPPublicKeyRing) { - userId = Apg.getMainUserIdSafe(this, - Apg.getMasterKey((PGPPublicKeyRing) keyRing)); + userId = PGPHelper.getMainUserIdSafe(this, + PGPHelper.getMasterKey((PGPPublicKeyRing) keyRing)); } else { - userId = Apg.getMainUserIdSafe(this, - Apg.getMasterKey((PGPSecretKeyRing) keyRing)); + userId = PGPHelper.getMainUserIdSafe(this, + PGPHelper.getMasterKey((PGPSecretKeyRing) keyRing)); } } @@ -234,54 +293,6 @@ public class KeyListActivity extends BaseActivity { return builder.create(); } - case Id.dialog.import_keys: { - return FileDialog.build(this, getString(R.string.title_importKeys), - getString(R.string.specifyFileToImportFrom), mImportFilename, - new FileDialog.OnClickListener() { - public void onOkClick(String filename, boolean checked) { - removeDialog(Id.dialog.import_keys); - mDeleteAfterImport = checked; - mImportFilename = filename; - importKeys(); - } - - public void onCancelClick() { - removeDialog(Id.dialog.import_keys); - } - }, getString(R.string.filemanager_titleOpen), - getString(R.string.filemanager_btnOpen), - getString(R.string.label_deleteAfterImport), Id.request.filename); - } - - case Id.dialog.export_key: { - singleKeyExport = true; - // break intentionally omitted, to use the Id.dialog.export_keys dialog - } - - case Id.dialog.export_keys: { - String title = (singleKeyExport ? getString(R.string.title_exportKey) - : getString(R.string.title_exportKeys)); - - final int thisDialogId = (singleKeyExport ? Id.dialog.export_key - : Id.dialog.export_keys); - - return FileDialog.build(this, title, - getString(mKeyType == Id.type.public_key ? R.string.specifyFileToExportTo - : R.string.specifyFileToExportSecretKeysTo), mExportFilename, - new FileDialog.OnClickListener() { - public void onOkClick(String filename, boolean checked) { - removeDialog(thisDialogId); - mExportFilename = filename; - exportKeys(); - } - - public void onCancelClick() { - removeDialog(thisDialogId); - } - }, getString(R.string.filemanager_titleSave), - getString(R.string.filemanager_btnSave), null, Id.request.filename); - } - default: { return super.onCreateDialog(id); } @@ -325,12 +336,12 @@ public class KeyListActivity extends BaseActivity { } if (mTask == Id.task.import_keys) { - data = Apg.importKeyRings(this, mKeyType, new InputData(importInputStream, size), - this); + data = PGPHelper.importKeyRings(this, mKeyType, new InputData(importInputStream, + size), this); } else { Vector<Integer> keyRingIds = new Vector<Integer>(); if (mSelectedItem == -1) { - keyRingIds = Apg + keyRingIds = PGPHelper .getKeyRingIds(mKeyType == Id.type.public_key ? Id.database.type_public : Id.database.type_secret); } else { @@ -338,7 +349,7 @@ public class KeyListActivity extends BaseActivity { keyRingIds.add(keyRingId); mSelectedItem = -1; } - data = Apg.exportKeyRings(this, keyRingIds, exportOutputStream, this); + data = PGPHelper.exportKeyRings(this, keyRingIds, exportOutputStream, this); } } catch (FileNotFoundException e) { error = getString(R.string.error_fileNotFound); @@ -346,7 +357,7 @@ public class KeyListActivity extends BaseActivity { error = "" + e; } catch (PGPException e) { error = "" + e; - } catch (Apg.GeneralException e) { + } catch (PGPHelper.GeneralException e) { error = "" + e; } @@ -359,7 +370,7 @@ public class KeyListActivity extends BaseActivity { } if (error != null) { - data.putString(Apg.EXTRA_ERROR, error); + data.putString(PGPHelper.EXTRA_ERROR, error); } msg.setData(data); @@ -367,7 +378,7 @@ public class KeyListActivity extends BaseActivity { } protected void deleteKey(int keyRingId) { - Apg.deleteKey(keyRingId); + PGPHelper.deleteKey(keyRingId); refreshList(); } @@ -387,7 +398,7 @@ public class KeyListActivity extends BaseActivity { case Id.message.import_done: { removeDialog(Id.dialog.importing); - String error = data.getString(Apg.EXTRA_ERROR); + String error = data.getString(PGPHelper.EXTRA_ERROR); if (error != null) { Toast.makeText(KeyListActivity.this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT).show(); @@ -434,7 +445,7 @@ public class KeyListActivity extends BaseActivity { case Id.message.export_done: { removeDialog(Id.dialog.exporting); - String error = data.getString(Apg.EXTRA_ERROR); + String error = data.getString(PGPHelper.EXTRA_ERROR); if (error != null) { Toast.makeText(KeyListActivity.this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT).show(); @@ -508,7 +519,7 @@ public class KeyListActivity extends BaseActivity { mSearchString = searchString; mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - mDatabase = Apg.getDatabase().db(); + mDatabase = PGPHelper.getDatabase().db(); SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.setTables(KeyRings.TABLE_NAME + " INNER JOIN " + Keys.TABLE_NAME + " ON " + "(" + KeyRings.TABLE_NAME + "." + KeyRings._ID + " = " + Keys.TABLE_NAME + "." @@ -600,7 +611,8 @@ public class KeyListActivity extends BaseActivity { c.close(); if (masterKeyId != -1) { - children.insertElementAt(new KeyChild(Apg.getFingerPrint(fingerPrintId), true), 0); + children.insertElementAt( + new KeyChild(PGPHelper.getFingerPrint(fingerPrintId), true), 0); c = mDatabase.query(UserIds.TABLE_NAME, new String[] { UserIds.USER_ID, // 0 }, UserIds.KEY_ID + " = ? AND " + UserIds.RANK + " > 0", new String[] { "" + masterKeyId }, null, null, UserIds.RANK + " ASC"); @@ -703,10 +715,10 @@ public class KeyListActivity extends BaseActivity { } TextView keyId = (TextView) view.findViewById(R.id.keyId); - String keyIdStr = Apg.getSmallFingerPrint(child.keyId); + String keyIdStr = PGPHelper.getSmallFingerPrint(child.keyId); keyId.setText(keyIdStr); TextView keyDetails = (TextView) view.findViewById(R.id.keyDetails); - String algorithmStr = Apg.getAlgorithmInfo(child.algorithm, child.keySize); + String algorithmStr = PGPHelper.getAlgorithmInfo(child.algorithm, child.keySize); keyDetails.setText("(" + algorithmStr + ")"); ImageView encryptIcon = (ImageView) view.findViewById(R.id.ic_encryptKey); @@ -745,16 +757,13 @@ public class KeyListActivity extends BaseActivity { switch (requestCode) { case Id.request.filename: { if (resultCode == RESULT_OK && data != null) { - String filename = data.getDataString(); - if (filename != null) { - // Get rid of URI prefix: - if (filename.startsWith("file://")) { - filename = filename.substring(7); - } - // replace %20 and so on - filename = Uri.decode(filename); + try { + String path = data.getData().getPath(); + Log.d(Constants.TAG, "path=" + path); - FileDialog.setFilename(filename); + mFileDialog.setFilename(path); + } catch (NullPointerException e) { + Log.e(Constants.TAG, "Nullpointer while retrieving path!"); } } return; diff --git a/org_apg/src/org/thialfihar/android/apg/ui/KeyServerExportActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/KeyServerExportActivity.java index 877ae0164..17d80296b 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/KeyServerExportActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/KeyServerExportActivity.java @@ -1,4 +1,6 @@ /* + * Copyright (C) 2011 Senecaso + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -16,11 +18,11 @@ package org.thialfihar.android.apg.ui; import org.spongycastle.openpgp.PGPKeyRing; import org.spongycastle.openpgp.PGPPublicKeyRing; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.HkpKeyServer; import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.R; +import org.thialfihar.android.apg.helper.PGPHelper; import com.actionbarsherlock.view.MenuItem; @@ -49,7 +51,10 @@ public class KeyServerExportActivity extends BaseActivity { switch (item.getItemId()) { case android.R.id.home: - startActivity(new Intent(this, PublicKeyListActivity.class)); + // app icon in Action Bar clicked; go home + Intent intent = new Intent(this, PublicKeyListActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); return true; default: @@ -94,11 +99,11 @@ public class KeyServerExportActivity extends BaseActivity { HkpKeyServer server = new HkpKeyServer((String) keyServer.getSelectedItem()); - int keyRingId = getIntent().getIntExtra(Apg.EXTRA_KEY_ID, -1); + int keyRingId = getIntent().getIntExtra(PGPHelper.EXTRA_KEY_ID, -1); - PGPKeyRing keyring = Apg.getKeyRing(keyRingId); + PGPKeyRing keyring = PGPHelper.getKeyRing(keyRingId); if (keyring != null && keyring instanceof PGPPublicKeyRing) { - boolean uploaded = Apg.uploadKeyRingToServer(server, (PGPPublicKeyRing) keyring); + boolean uploaded = PGPHelper.uploadKeyRingToServer(server, (PGPPublicKeyRing) keyring); if (!uploaded) { error = "Unable to export key to selected server"; } @@ -107,7 +112,7 @@ public class KeyServerExportActivity extends BaseActivity { data.putInt(Constants.extras.STATUS, Id.message.export_done); if (error != null) { - data.putString(Apg.EXTRA_ERROR, error); + data.putString(PGPHelper.EXTRA_ERROR, error); } msg.setData(data); @@ -119,7 +124,7 @@ public class KeyServerExportActivity extends BaseActivity { super.doneCallback(msg); Bundle data = msg.getData(); - String error = data.getString(Apg.EXTRA_ERROR); + String error = data.getString(PGPHelper.EXTRA_ERROR); if (error != null) { Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT) .show(); diff --git a/org_apg/src/org/thialfihar/android/apg/ui/KeyServerQueryActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/KeyServerQueryActivity.java index 2009441ab..7a1b94335 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/KeyServerQueryActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/KeyServerQueryActivity.java @@ -18,7 +18,6 @@ import java.util.List; import java.util.Vector; import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.HkpKeyServer; import org.thialfihar.android.apg.Id; @@ -26,6 +25,7 @@ import org.thialfihar.android.apg.KeyServer.InsufficientQuery; import org.thialfihar.android.apg.KeyServer.KeyInfo; import org.thialfihar.android.apg.KeyServer.QueryException; import org.thialfihar.android.apg.KeyServer.TooManyResponses; +import org.thialfihar.android.apg.helper.PGPHelper; import com.actionbarsherlock.view.MenuItem; @@ -71,7 +71,10 @@ public class KeyServerQueryActivity extends BaseActivity { switch (item.getItemId()) { case android.R.id.home: - startActivity(new Intent(this, PublicKeyListActivity.class)); + // app icon in Action Bar clicked; go home + Intent intent = new Intent(this, PublicKeyListActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); return true; default: @@ -118,11 +121,11 @@ public class KeyServerQueryActivity extends BaseActivity { }); Intent intent = getIntent(); - if (Apg.Intent.LOOK_UP_KEY_ID.equals(intent.getAction()) - || Apg.Intent.LOOK_UP_KEY_ID_AND_RETURN.equals(intent.getAction())) { - long keyId = intent.getLongExtra(Apg.EXTRA_KEY_ID, 0); + if (PGPHelper.Intent.LOOK_UP_KEY_ID.equals(intent.getAction()) + || PGPHelper.Intent.LOOK_UP_KEY_ID_AND_RETURN.equals(intent.getAction())) { + long keyId = intent.getLongExtra(PGPHelper.EXTRA_KEY_ID, 0); if (keyId != 0) { - String query = "0x" + Apg.keyToHex(keyId); + String query = "0x" + PGPHelper.keyToHex(keyId); mQuery.setText(query); search(query); } @@ -176,7 +179,7 @@ public class KeyServerQueryActivity extends BaseActivity { data.putInt(Constants.extras.STATUS, Id.message.done); if (error != null) { - data.putString(Apg.EXTRA_ERROR, error); + data.putString(PGPHelper.EXTRA_ERROR, error); } msg.setData(data); @@ -190,7 +193,7 @@ public class KeyServerQueryActivity extends BaseActivity { removeDialog(Id.dialog.querying); Bundle data = msg.getData(); - String error = data.getString(Apg.EXTRA_ERROR); + String error = data.getString(PGPHelper.EXTRA_ERROR); if (error != null) { Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT) .show(); @@ -205,10 +208,10 @@ public class KeyServerQueryActivity extends BaseActivity { } } else if (mQueryType == Id.keyserver.get) { Intent orgIntent = getIntent(); - if (Apg.Intent.LOOK_UP_KEY_ID_AND_RETURN.equals(orgIntent.getAction())) { + if (PGPHelper.Intent.LOOK_UP_KEY_ID_AND_RETURN.equals(orgIntent.getAction())) { if (mKeyData != null) { Intent intent = new Intent(); - intent.putExtra(Apg.EXTRA_TEXT, mKeyData); + intent.putExtra(PGPHelper.EXTRA_TEXT, mKeyData); setResult(RESULT_OK, intent); } else { setResult(RESULT_CANCELED); @@ -217,8 +220,8 @@ public class KeyServerQueryActivity extends BaseActivity { } else { if (mKeyData != null) { Intent intent = new Intent(this, PublicKeyListActivity.class); - intent.setAction(Apg.Intent.IMPORT); - intent.putExtra(Apg.EXTRA_TEXT, mKeyData); + intent.setAction(PGPHelper.Intent.IMPORT); + intent.putExtra(PGPHelper.EXTRA_TEXT, mKeyData); startActivity(intent); } } @@ -284,7 +287,7 @@ public class KeyServerQueryActivity extends BaseActivity { mainUserId.setText(userId); } - keyId.setText(Apg.getSmallFingerPrint(keyInfo.keyId)); + keyId.setText(PGPHelper.getSmallFingerPrint(keyInfo.keyId)); if (mainUserIdRest.getText().length() == 0) { mainUserIdRest.setVisibility(View.GONE); diff --git a/org_apg/src/org/thialfihar/android/apg/ui/MailListActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/MailListActivity.java index 639aab6eb..fd8efb530 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/MailListActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/MailListActivity.java @@ -20,8 +20,8 @@ import java.util.Vector; import java.util.regex.Matcher; import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Preferences; +import org.thialfihar.android.apg.helper.PGPHelper; import android.app.ListActivity; import android.content.Context; @@ -121,11 +121,11 @@ public class MailListActivity extends ListActivity { String data = messageCursor.getString(bodyIndex); data = Html.fromHtml(data).toString(); boolean signedOnly = false; - Matcher matcher = Apg.PGP_MESSAGE.matcher(data); + Matcher matcher = PGPHelper.PGP_MESSAGE.matcher(data); if (matcher.matches()) { data = matcher.group(1); } else { - matcher = Apg.PGP_SIGNED_MESSAGE.matcher(data); + matcher = PGPHelper.PGP_SIGNED_MESSAGE.matcher(data); if (matcher.matches()) { data = matcher.group(1); signedOnly = true; @@ -149,11 +149,11 @@ public class MailListActivity extends ListActivity { getListView().setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View v, int position, long id) { Intent intent = new Intent(MailListActivity.this, DecryptActivity.class); - intent.setAction(Apg.Intent.DECRYPT); + intent.setAction(PGPHelper.Intent.DECRYPT); Message message = (Message) ((MailboxAdapter) getListAdapter()).getItem(position); - intent.putExtra(Apg.EXTRA_TEXT, message.data); - intent.putExtra(Apg.EXTRA_SUBJECT, message.subject); - intent.putExtra(Apg.EXTRA_REPLY_TO, message.replyTo); + intent.putExtra(PGPHelper.EXTRA_TEXT, message.data); + intent.putExtra(PGPHelper.EXTRA_SUBJECT, message.subject); + intent.putExtra(PGPHelper.EXTRA_REPLY_TO, message.replyTo); startActivity(intent); } }); diff --git a/org_apg/src/org/thialfihar/android/apg/ui/MainActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/MainActivity.java index 4bfee0e14..24d636627 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/MainActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/MainActivity.java @@ -20,9 +20,9 @@ package org.thialfihar.android.apg.ui; import java.security.Security; import org.spongycastle.jce.provider.BouncyCastleProvider; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.R; +import org.thialfihar.android.apg.helper.PGPHelper; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.SherlockActivity; @@ -48,19 +48,19 @@ public class MainActivity extends SherlockActivity { public void encryptOnClick(View view) { Intent intent = new Intent(MainActivity.this, EncryptActivity.class); - intent.setAction(Apg.Intent.ENCRYPT); + intent.setAction(PGPHelper.Intent.ENCRYPT); startActivityForResult(intent, 0); // used instead of startActivity to get callingPackage } public void decryptOnClick(View view) { Intent intent = new Intent(MainActivity.this, DecryptActivity.class); - intent.setAction(Apg.Intent.DECRYPT); + intent.setAction(PGPHelper.Intent.DECRYPT); startActivityForResult(intent, 0); // used instead of startActivity to get callingPackage } public void scanQrcodeOnClick(View view) { Intent intent = new Intent(this, ImportFromQRCodeActivity.class); - intent.setAction(Apg.Intent.IMPORT_FROM_QR_CODE); + intent.setAction(PGPHelper.Intent.IMPORT_FROM_QR_CODE); startActivityForResult(intent, Id.request.import_from_qr_code); } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/PreferencesActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/PreferencesActivity.java index b602e92b8..3cc6155b0 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/PreferencesActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/PreferencesActivity.java @@ -18,10 +18,10 @@ package org.thialfihar.android.apg.ui; import org.spongycastle.bcpg.HashAlgorithmTags; import org.spongycastle.openpgp.PGPEncryptedData; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Preferences; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.passphrase.PassphraseCacheService; import org.thialfihar.android.apg.ui.widget.IntegerListPreference; import org.thialfihar.android.apg.R; @@ -36,7 +36,6 @@ import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceScreen; - public class PreferencesActivity extends SherlockPreferenceActivity { private IntegerListPreference mPassPhraseCacheTtl = null; private IntegerListPreference mEncryptionAlgorithm = null; @@ -56,6 +55,7 @@ public class PreferencesActivity extends SherlockPreferenceActivity { final ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayShowTitleEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setHomeButtonEnabled(true); addPreferencesFromResource(R.xml.apg_preferences); @@ -68,7 +68,7 @@ public class PreferencesActivity extends SherlockPreferenceActivity { mPassPhraseCacheTtl.setValue(newValue.toString()); mPassPhraseCacheTtl.setSummary(mPassPhraseCacheTtl.getEntry()); mPreferences.setPassPhraseCacheTtl(Integer.parseInt(newValue.toString())); - + // restart cache service with new ttl PassphraseCacheService.startCacheService(PreferencesActivity.this); return false; @@ -194,8 +194,8 @@ public class PreferencesActivity extends SherlockPreferenceActivity { .setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { Intent intent = new Intent(PreferencesActivity.this, - KeyServerPreferenceActivity.class); - intent.putExtra(Apg.EXTRA_KEY_SERVERS, mPreferences.getKeyServers()); + PreferencesKeyServerActivity.class); + intent.putExtra(PGPHelper.EXTRA_KEY_SERVERS, mPreferences.getKeyServers()); startActivityForResult(intent, Id.request.key_server_preference); return false; } @@ -209,7 +209,7 @@ public class PreferencesActivity extends SherlockPreferenceActivity { if (resultCode == RESULT_CANCELED || data == null) { return; } - String servers[] = data.getStringArrayExtra(Apg.EXTRA_KEY_SERVERS); + String servers[] = data.getStringArrayExtra(PGPHelper.EXTRA_KEY_SERVERS); mPreferences.setKeyServers(servers); mKeyServerPreference.setSummary(getResources().getString(R.string.nKeyServers, servers.length)); @@ -228,7 +228,10 @@ public class PreferencesActivity extends SherlockPreferenceActivity { switch (item.getItemId()) { case android.R.id.home: - startActivity(new Intent(this, MainActivity.class)); + // app icon in Action Bar clicked; go home + Intent intent = new Intent(this, MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); return true; default: diff --git a/org_apg/src/org/thialfihar/android/apg/ui/KeyServerPreferenceActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/PreferencesKeyServerActivity.java index e1233661f..ae2cfa0ea 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/KeyServerPreferenceActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/PreferencesKeyServerActivity.java @@ -18,13 +18,17 @@ package org.thialfihar.android.apg.ui; import java.util.Vector; +import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.Apg; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.ui.widget.Editor; import org.thialfihar.android.apg.ui.widget.KeyServerEditor; import org.thialfihar.android.apg.ui.widget.Editor.EditorListener; +import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.app.SherlockActivity; import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; import android.content.Context; import android.content.Intent; @@ -33,10 +37,9 @@ import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; -import android.widget.Button; import android.widget.TextView; -public class KeyServerPreferenceActivity extends BaseActivity implements OnClickListener, +public class PreferencesKeyServerActivity extends SherlockActivity implements OnClickListener, EditorListener { private LayoutInflater mInflater; private ViewGroup mEditors; @@ -45,10 +48,60 @@ public class KeyServerPreferenceActivity extends BaseActivity implements OnClick private TextView mSummary; @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + + case android.R.id.home: + // app icon in Action Bar clicked; go home + Intent intent = new Intent(this, PreferencesActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + + return true; + + case Id.menu.option.okay: + okClicked(); + + return true; + + case Id.menu.option.cancel: + cancelClicked(); + + return true; + + default: + break; + + } + return false; + } + + /** + * ActionBar menu is created based on class variables to change it at runtime + * + */ + @Override + public boolean onCreateOptionsMenu(Menu menu) { + + menu.add(1, Id.menu.option.cancel, 0, android.R.string.cancel).setShowAsAction( + MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); + + menu.add(1, Id.menu.option.okay, 1, android.R.string.ok).setShowAsAction( + MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); + + return true; + } + + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.key_server_preference); + final ActionBar actionBar = getSupportActionBar(); + actionBar.setDisplayShowTitleEnabled(true); + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setHomeButtonEnabled(true); + mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); mTitle = (TextView) findViewById(R.id.title); @@ -61,7 +114,7 @@ public class KeyServerPreferenceActivity extends BaseActivity implements OnClick mAdd.setOnClickListener(this); Intent intent = getIntent(); - String servers[] = intent.getStringArrayExtra(Apg.EXTRA_KEY_SERVERS); + String servers[] = intent.getStringArrayExtra(PGPHelper.EXTRA_KEY_SERVERS); if (servers != null) { for (int i = 0; i < servers.length; ++i) { KeyServerEditor view = (KeyServerEditor) mInflater.inflate( @@ -71,20 +124,6 @@ public class KeyServerPreferenceActivity extends BaseActivity implements OnClick mEditors.addView(view); } } - - Button okButton = (Button) findViewById(R.id.btn_ok); - okButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - okClicked(); - } - }); - - Button cancelButton = (Button) findViewById(R.id.btn_cancel); - cancelButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - cancelClicked(); - } - }); } public void onDeleted(Editor editor) { @@ -114,15 +153,8 @@ public class KeyServerPreferenceActivity extends BaseActivity implements OnClick } } String[] dummy = new String[0]; - data.putExtra(Apg.EXTRA_KEY_SERVERS, servers.toArray(dummy)); + data.putExtra(PGPHelper.EXTRA_KEY_SERVERS, servers.toArray(dummy)); setResult(RESULT_OK, data); finish(); } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // override this, so no option menu is added (as would be in BaseActivity), since - // we're still in preferences - return true; - } } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/PublicKeyListActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/PublicKeyListActivity.java index a2551b769..21a7ddee5 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/PublicKeyListActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/PublicKeyListActivity.java @@ -17,10 +17,10 @@ package org.thialfihar.android.apg.ui; import org.spongycastle.openpgp.PGPPublicKeyRing; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.R; +import org.thialfihar.android.apg.helper.PGPHelper; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; @@ -71,7 +71,7 @@ public class PublicKeyListActivity extends KeyListActivity { } case Id.menu.option.scanQRCode: { Intent intent = new Intent(this, ImportFromQRCodeActivity.class); - intent.setAction(Apg.Intent.IMPORT_FROM_QR_CODE); + intent.setAction(PGPHelper.Intent.IMPORT_FROM_QR_CODE); startActivityForResult(intent, Id.request.import_from_qr_code); return true; @@ -114,9 +114,9 @@ public class PublicKeyListActivity extends KeyListActivity { mSelectedItem = groupPosition; final int keyRingId = mListAdapter.getKeyRingId(groupPosition); long keyId = 0; - Object keyRing = Apg.getKeyRing(keyRingId); + Object keyRing = PGPHelper.getKeyRing(keyRingId); if (keyRing != null && keyRing instanceof PGPPublicKeyRing) { - keyId = Apg.getMasterKey((PGPPublicKeyRing) keyRing).getKeyID(); + keyId = PGPHelper.getMasterKey((PGPPublicKeyRing) keyRing).getKeyID(); } if (keyId == 0) { // this shouldn't happen @@ -124,8 +124,8 @@ public class PublicKeyListActivity extends KeyListActivity { } Intent intent = new Intent(this, KeyServerQueryActivity.class); - intent.setAction(Apg.Intent.LOOK_UP_KEY_ID_AND_RETURN); - intent.putExtra(Apg.EXTRA_KEY_ID, keyId); + intent.setAction(PGPHelper.Intent.LOOK_UP_KEY_ID_AND_RETURN); + intent.putExtra(PGPHelper.EXTRA_KEY_ID, keyId); startActivityForResult(intent, Id.request.look_up_key_id); return true; @@ -136,8 +136,8 @@ public class PublicKeyListActivity extends KeyListActivity { final int keyRingId = mListAdapter.getKeyRingId(groupPosition); Intent intent = new Intent(this, KeyServerExportActivity.class); - intent.setAction(Apg.Intent.EXPORT_KEY_TO_SERVER); - intent.putExtra(Apg.EXTRA_KEY_ID, keyRingId); + intent.setAction(PGPHelper.Intent.EXPORT_KEY_TO_SERVER); + intent.putExtra(PGPHelper.EXTRA_KEY_ID, keyRingId); startActivityForResult(intent, Id.request.export_to_server); return true; @@ -147,9 +147,9 @@ public class PublicKeyListActivity extends KeyListActivity { mSelectedItem = groupPosition; final int keyRingId = mListAdapter.getKeyRingId(groupPosition); long keyId = 0; - Object keyRing = Apg.getKeyRing(keyRingId); + Object keyRing = PGPHelper.getKeyRing(keyRingId); if (keyRing != null && keyRing instanceof PGPPublicKeyRing) { - keyId = Apg.getMasterKey((PGPPublicKeyRing) keyRing).getKeyID(); + keyId = PGPHelper.getMasterKey((PGPPublicKeyRing) keyRing).getKeyID(); } if (keyId == 0) { @@ -158,7 +158,7 @@ public class PublicKeyListActivity extends KeyListActivity { } Intent intent = new Intent(this, SignKeyActivity.class); - intent.putExtra(Apg.EXTRA_KEY_ID, keyId); + intent.putExtra(PGPHelper.EXTRA_KEY_ID, keyId); startActivity(intent); return true; @@ -175,13 +175,13 @@ public class PublicKeyListActivity extends KeyListActivity { switch (requestCode) { case Id.request.look_up_key_id: { if (resultCode == RESULT_CANCELED || data == null - || data.getStringExtra(Apg.EXTRA_TEXT) == null) { + || data.getStringExtra(PGPHelper.EXTRA_TEXT) == null) { return; } Intent intent = new Intent(this, PublicKeyListActivity.class); - intent.setAction(Apg.Intent.IMPORT); - intent.putExtra(Apg.EXTRA_TEXT, data.getStringExtra(Apg.EXTRA_TEXT)); + intent.setAction(PGPHelper.Intent.IMPORT); + intent.putExtra(PGPHelper.EXTRA_TEXT, data.getStringExtra(PGPHelper.EXTRA_TEXT)); handleIntent(intent); break; } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/SecretKeyListActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/SecretKeyListActivity.java index b0475c147..290fe7479 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/SecretKeyListActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/SecretKeyListActivity.java @@ -17,9 +17,9 @@ package org.thialfihar.android.apg.ui; import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Id; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.passphrase.AskForPassphrase; import com.actionbarsherlock.view.Menu; @@ -111,7 +111,7 @@ public class SecretKeyListActivity extends KeyListActivity implements OnChildCli long keyId = ((KeyListAdapter) mList.getExpandableListAdapter()) .getGroupId(mSelectedItem); - String msg = keyId + "," + Apg.getFingerPrint(keyId); + String msg = keyId + "," + PGPHelper.getFingerPrint(keyId); new IntentIntegrator(this).shareText(msg); } @@ -146,11 +146,11 @@ public class SecretKeyListActivity extends KeyListActivity implements OnChildCli public void checkPassPhraseAndEdit() { long keyId = ((KeyListAdapter) mList.getExpandableListAdapter()).getGroupId(mSelectedItem); - String passPhrase = Apg.getCachedPassPhrase(keyId); + String passPhrase = PGPHelper.getCachedPassPhrase(keyId); if (passPhrase == null) { showDialog(Id.dialog.pass_phrase); } else { - Apg.setEditPassPhrase(passPhrase); + PGPHelper.setEditPassPhrase(passPhrase); editKey(); } } @@ -158,20 +158,20 @@ public class SecretKeyListActivity extends KeyListActivity implements OnChildCli @Override public void passPhraseCallback(long keyId, String passPhrase) { super.passPhraseCallback(keyId, passPhrase); - Apg.setEditPassPhrase(passPhrase); + PGPHelper.setEditPassPhrase(passPhrase); editKey(); } private void createKey() { - Apg.setEditPassPhrase(""); - Intent intent = new Intent(Apg.Intent.CREATE_KEY); + PGPHelper.setEditPassPhrase(""); + Intent intent = new Intent(PGPHelper.Intent.CREATE_KEY); startActivityForResult(intent, Id.message.create_key); } private void editKey() { long keyId = ((KeyListAdapter) mList.getExpandableListAdapter()).getGroupId(mSelectedItem); - Intent intent = new Intent(Apg.Intent.EDIT_KEY); - intent.putExtra(Apg.EXTRA_KEY_ID, keyId); + Intent intent = new Intent(PGPHelper.Intent.EDIT_KEY); + intent.putExtra(PGPHelper.EXTRA_KEY_ID, keyId); startActivityForResult(intent, Id.message.edit_key); } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/SelectPublicKeyListActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/SelectPublicKeyListActivity.java index 07ad60d89..93434912d 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/SelectPublicKeyListActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/SelectPublicKeyListActivity.java @@ -19,8 +19,8 @@ package org.thialfihar.android.apg.ui; import java.util.Vector; import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Id; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.ui.widget.SelectPublicKeyListAdapter; import com.actionbarsherlock.app.ActionBar; @@ -89,7 +89,7 @@ public class SelectPublicKeyListActivity extends BaseActivity { } long selectedKeyIds[] = null; - selectedKeyIds = intent.getLongArrayExtra(Apg.EXTRA_SELECTION); + selectedKeyIds = intent.getLongArrayExtra(PGPHelper.EXTRA_SELECTION); if (selectedKeyIds == null) { Vector<Long> vector = new Vector<Long>(); @@ -151,8 +151,8 @@ public class SelectPublicKeyListActivity extends BaseActivity { selectedKeyIds[i] = keys.get(i); } String userIdArray[] = new String[0]; - data.putExtra(Apg.EXTRA_SELECTION, selectedKeyIds); - data.putExtra(Apg.EXTRA_USER_IDS, userIds.toArray(userIdArray)); + data.putExtra(PGPHelper.EXTRA_SELECTION, selectedKeyIds); + data.putExtra(PGPHelper.EXTRA_USER_IDS, userIds.toArray(userIdArray)); setResult(RESULT_OK, data); finish(); } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/SelectSecretKeyListActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/SelectSecretKeyListActivity.java index dec88dd7f..1f5607d94 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/SelectSecretKeyListActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/SelectSecretKeyListActivity.java @@ -17,8 +17,8 @@ package org.thialfihar.android.apg.ui; import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Id; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.ui.widget.SelectSecretKeyListAdapter; import com.actionbarsherlock.app.ActionBar; @@ -62,8 +62,8 @@ public class SelectSecretKeyListActivity extends BaseActivity { mList.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { Intent data = new Intent(); - data.putExtra(Apg.EXTRA_KEY_ID, id); - data.putExtra(Apg.EXTRA_USER_ID, (String) mList.getItemAtPosition(position)); + data.putExtra(PGPHelper.EXTRA_KEY_ID, id); + data.putExtra(PGPHelper.EXTRA_USER_ID, (String) mList.getItemAtPosition(position)); setResult(RESULT_OK, data); finish(); } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/SignKeyActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/SignKeyActivity.java index d853873e1..43c481a74 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/SignKeyActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/SignKeyActivity.java @@ -1,4 +1,6 @@ /* + * Copyright (C) 2011 Senecaso + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -30,11 +32,11 @@ import org.spongycastle.openpgp.PGPSignatureGenerator; import org.spongycastle.openpgp.PGPSignatureSubpacketGenerator; import org.spongycastle.openpgp.PGPSignatureSubpacketVector; import org.spongycastle.openpgp.PGPUtil; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.HkpKeyServer; import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.R; +import org.thialfihar.android.apg.helper.PGPHelper; import com.actionbarsherlock.view.MenuItem; @@ -122,7 +124,7 @@ public class SignKeyActivity extends BaseActivity { } }); - pubKeyId = getIntent().getLongExtra(Apg.EXTRA_KEY_ID, 0); + pubKeyId = getIntent().getLongExtra(PGPHelper.EXTRA_KEY_ID, 0); if (pubKeyId == 0) { finish(); // nothing to do if we dont know what key to sign } else { @@ -137,7 +139,7 @@ public class SignKeyActivity extends BaseActivity { * handles the UI bits of the signing process on the UI thread */ private void initiateSigning() { - PGPPublicKeyRing pubring = Apg.getPublicKeyRing(pubKeyId); + PGPPublicKeyRing pubring = PGPHelper.getPublicKeyRing(pubKeyId); if (pubring != null) { // if we have already signed this key, dont bother doing it again boolean alreadySigned = false; @@ -156,7 +158,7 @@ public class SignKeyActivity extends BaseActivity { /* * get the user's passphrase for this key (if required) */ - String passphrase = Apg.getCachedPassPhrase(masterKeyId); + String passphrase = PGPHelper.getCachedPassPhrase(masterKeyId); if (passphrase == null) { showDialog(Id.dialog.pass_phrase); return; // bail out; need to wait until the user has entered the passphrase @@ -168,7 +170,7 @@ public class SignKeyActivity extends BaseActivity { final Bundle status = new Bundle(); Message msg = new Message(); - status.putString(Apg.EXTRA_ERROR, "Key has already been signed"); + status.putString(PGPHelper.EXTRA_ERROR, "Key has already been signed"); status.putInt(Constants.extras.STATUS, Id.message.done); @@ -206,16 +208,16 @@ public class SignKeyActivity extends BaseActivity { Message msg = new Message(); try { - String passphrase = Apg.getCachedPassPhrase(masterKeyId); + String passphrase = PGPHelper.getCachedPassPhrase(masterKeyId); if (passphrase == null || passphrase.length() <= 0) { - status.putString(Apg.EXTRA_ERROR, "Unable to obtain passphrase"); + status.putString(PGPHelper.EXTRA_ERROR, "Unable to obtain passphrase"); } else { - PGPPublicKeyRing pubring = Apg.getPublicKeyRing(pubKeyId); + PGPPublicKeyRing pubring = PGPHelper.getPublicKeyRing(pubKeyId); /* * sign the incoming key */ - PGPSecretKey secretKey = Apg.getSecretKey(masterKeyId); + PGPSecretKey secretKey = PGPHelper.getSecretKey(masterKeyId); PGPPrivateKey signingKey = secretKey.extractPrivateKey(passphrase.toCharArray(), BouncyCastleProvider.PROVIDER_NAME); PGPSignatureGenerator sGen = new PGPSignatureGenerator(secretKey.getPublicKey() @@ -241,33 +243,33 @@ public class SignKeyActivity extends BaseActivity { * upload the newly signed key to the key server */ - Apg.uploadKeyRingToServer(server, pubring); + PGPHelper.uploadKeyRingToServer(server, pubring); } // store the signed key in our local cache - int retval = Apg.storeKeyRingInCache(pubring); + int retval = PGPHelper.storeKeyRingInCache(pubring); if (retval != Id.return_value.ok && retval != Id.return_value.updated) { - status.putString(Apg.EXTRA_ERROR, "Failed to store signed key in local cache"); + status.putString(PGPHelper.EXTRA_ERROR, "Failed to store signed key in local cache"); } } } catch (PGPException e) { Log.e(TAG, "Failed to sign key", e); - status.putString(Apg.EXTRA_ERROR, "Failed to sign key"); + status.putString(PGPHelper.EXTRA_ERROR, "Failed to sign key"); status.putInt(Constants.extras.STATUS, Id.message.done); return; } catch (NoSuchAlgorithmException e) { Log.e(TAG, "Failed to sign key", e); - status.putString(Apg.EXTRA_ERROR, "Failed to sign key"); + status.putString(PGPHelper.EXTRA_ERROR, "Failed to sign key"); status.putInt(Constants.extras.STATUS, Id.message.done); return; } catch (NoSuchProviderException e) { Log.e(TAG, "Failed to sign key", e); - status.putString(Apg.EXTRA_ERROR, "Failed to sign key"); + status.putString(PGPHelper.EXTRA_ERROR, "Failed to sign key"); status.putInt(Constants.extras.STATUS, Id.message.done); return; } catch (SignatureException e) { Log.e(TAG, "Failed to sign key", e); - status.putString(Apg.EXTRA_ERROR, "Failed to sign key"); + status.putString(PGPHelper.EXTRA_ERROR, "Failed to sign key"); status.putInt(Constants.extras.STATUS, Id.message.done); return; } @@ -277,7 +279,7 @@ public class SignKeyActivity extends BaseActivity { msg.setData(status); sendMessage(msg); - if (status.containsKey(Apg.EXTRA_ERROR)) { + if (status.containsKey(PGPHelper.EXTRA_ERROR)) { setResult(Id.return_value.error); } else { setResult(Id.return_value.ok); @@ -291,7 +293,7 @@ public class SignKeyActivity extends BaseActivity { switch (requestCode) { case Id.request.secret_keys: { if (resultCode == RESULT_OK) { - masterKeyId = data.getLongExtra(Apg.EXTRA_KEY_ID, 0); + masterKeyId = data.getLongExtra(PGPHelper.EXTRA_KEY_ID, 0); // re-enable the sign button so the user can initiate the sign process Button sign = (Button) findViewById(R.id.sign); @@ -314,7 +316,7 @@ public class SignKeyActivity extends BaseActivity { removeDialog(Id.dialog.signing); Bundle data = msg.getData(); - String error = data.getString(Apg.EXTRA_ERROR); + String error = data.getString(PGPHelper.EXTRA_ERROR); if (error != null) { Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT) .show(); diff --git a/org_apg/src/org/thialfihar/android/apg/ui/dialog/FileDialogFragment.java b/org_apg/src/org/thialfihar/android/apg/ui/dialog/FileDialogFragment.java index 7f1fbf87b..531cddfcf 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/dialog/FileDialogFragment.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/dialog/FileDialogFragment.java @@ -18,7 +18,8 @@ package org.thialfihar.android.apg.ui.dialog; import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.util.Utils; +import org.thialfihar.android.apg.helper.FileHelper; +import org.thialfihar.android.apg.helper.OtherHelper; import android.app.Activity; import android.app.AlertDialog; @@ -51,7 +52,7 @@ public class FileDialogFragment extends DialogFragment { public static final int MESSAGE_OKAY = 1; public static final String MESSAGE_DATA_FILENAME = "filename"; - public static final String MESSAGE_CHECKED = "checked"; + public static final String MESSAGE_DATA_CHECKED = "checked"; /** * Creates new instance of this file dialog fragment @@ -107,7 +108,7 @@ public class FileDialogFragment extends DialogFragment { mBrowse.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // only .asc or .gpg files - Utils.openFile(activity, mFilename.getText().toString(), "text/plain", requestCode); + FileHelper.openFile(activity, mFilename.getText().toString(), "text/plain", requestCode); } }); @@ -135,7 +136,7 @@ public class FileDialogFragment extends DialogFragment { // return resulting data back to activity Bundle data = new Bundle(); data.putString(MESSAGE_DATA_FILENAME, mFilename.getText().toString()); - data.putBoolean(MESSAGE_CHECKED, checked); + data.putBoolean(MESSAGE_DATA_CHECKED, checked); sendMessageToHandler(MESSAGE_OKAY, data); diff --git a/org_apg/src/org/thialfihar/android/apg/ui/dialog/PassphraseDialogFragment.java b/org_apg/src/org/thialfihar/android/apg/ui/dialog/PassphraseDialogFragment.java index 3b83aaaa3..ce08c6c86 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/dialog/PassphraseDialogFragment.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/dialog/PassphraseDialogFragment.java @@ -21,8 +21,8 @@ import org.spongycastle.openpgp.PGPPrivateKey; import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.operator.PBESecretKeyDecryptor; import org.spongycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder; -import org.thialfihar.android.apg.Apg; -import org.thialfihar.android.apg.Apg.GeneralException; +import org.thialfihar.android.apg.helper.PGPHelper; +import org.thialfihar.android.apg.helper.PGPHelper.GeneralException; import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.R; @@ -68,7 +68,7 @@ public class PassphraseDialogFragment extends DialogFragment { // check if secret key has a passphrase if (!(secretKeyId == Id.key.symmetric || secretKeyId == Id.key.none)) { if (!hasPassphrase(secretKeyId)) { - throw new Apg.GeneralException("No passphrase! No passphrase dialog needed!"); + throw new PGPHelper.GeneralException("No passphrase! No passphrase dialog needed!"); } } @@ -91,7 +91,7 @@ public class PassphraseDialogFragment extends DialogFragment { private static boolean hasPassphrase(long secretKeyId) { // check if the key has no passphrase try { - PGPSecretKey secretKey = Apg.getMasterKey(Apg.getSecretKeyRing(secretKeyId)); + PGPSecretKey secretKey = PGPHelper.getMasterKey(PGPHelper.getSecretKeyRing(secretKeyId)); Log.d(Constants.TAG, "Check if key has no passphrase..."); PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider( @@ -101,7 +101,7 @@ public class PassphraseDialogFragment extends DialogFragment { Log.d(Constants.TAG, "Key has no passphrase! Caches empty passphrase!"); // cache empty passphrase - Apg.setCachedPassPhrase(secretKey.getKeyID(), ""); + PGPHelper.setCachedPassPhrase(secretKey.getKeyID(), ""); return false; } @@ -132,7 +132,7 @@ public class PassphraseDialogFragment extends DialogFragment { secretKey = null; alert.setMessage(getString(R.string.passPhraseForSymmetricEncryption)); } else { - secretKey = Apg.getMasterKey(Apg.getSecretKeyRing(secretKeyId)); + secretKey = PGPHelper.getMasterKey(PGPHelper.getSecretKeyRing(secretKeyId)); if (secretKey == null) { alert.setTitle(R.string.title_keyNotFound); alert.setMessage(getString(R.string.keyNotFound, secretKeyId)); @@ -144,7 +144,7 @@ public class PassphraseDialogFragment extends DialogFragment { alert.setCancelable(false); return alert.create(); } - String userId = Apg.getMainUserIdSafe(activity, secretKey); + String userId = PGPHelper.getMainUserIdSafe(activity, secretKey); alert.setMessage(getString(R.string.passPhraseFor, userId)); } @@ -189,7 +189,7 @@ public class PassphraseDialogFragment extends DialogFragment { // cache the new passphrase Log.d(Constants.TAG, "Everything okay! Caching entered passphrase"); - Apg.setCachedPassPhrase(keyId, passPhrase); + PGPHelper.setCachedPassPhrase(keyId, passPhrase); sendMessageToHandler(MESSAGE_OKAY); } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/widget/KeyEditor.java b/org_apg/src/org/thialfihar/android/apg/ui/widget/KeyEditor.java index 9f7b756eb..87d715fd9 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/widget/KeyEditor.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/widget/KeyEditor.java @@ -18,8 +18,8 @@ package org.thialfihar.android.apg.ui.widget; import org.spongycastle.openpgp.PGPPublicKey; import org.spongycastle.openpgp.PGPSecretKey; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Id; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.util.Choice; import org.thialfihar.android.apg.R; @@ -133,9 +133,9 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener { mDeleteButton.setVisibility(View.INVISIBLE); } - mAlgorithm.setText(Apg.getAlgorithmInfo(key)); - String keyId1Str = Apg.getSmallFingerPrint(key.getKeyID()); - String keyId2Str = Apg.getSmallFingerPrint(key.getKeyID() >> 32); + mAlgorithm.setText(PGPHelper.getAlgorithmInfo(key)); + String keyId1Str = PGPHelper.getSmallFingerPrint(key.getKeyID()); + String keyId2Str = PGPHelper.getSmallFingerPrint(key.getKeyID() >> 32); mKeyId.setText(keyId1Str + " " + keyId2Str); Vector<Choice> choices = new Vector<Choice>(); @@ -160,8 +160,8 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener { // Set value in choice dropdown to key int selectId = 0; - if (Apg.isEncryptionKey(key)) { - if (Apg.isSigningKey(key)) { + if (PGPHelper.isEncryptionKey(key)) { + if (PGPHelper.isSigningKey(key)) { selectId = Id.choice.usage.sign_and_encrypt; } else { selectId = Id.choice.usage.encrypt_only; @@ -184,14 +184,14 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener { } GregorianCalendar cal = new GregorianCalendar(); - cal.setTime(Apg.getCreationDate(key)); + cal.setTime(PGPHelper.getCreationDate(key)); mCreationDate.setText(DateFormat.getDateInstance().format(cal.getTime())); cal = new GregorianCalendar(); - Date date = Apg.getExpiryDate(key); + Date date = PGPHelper.getExpiryDate(key); if (date == null) { setExpiryDate(null); } else { - cal.setTime(Apg.getExpiryDate(key)); + cal.setTime(PGPHelper.getExpiryDate(key)); setExpiryDate(cal); } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/widget/SectionView.java b/org_apg/src/org/thialfihar/android/apg/ui/widget/SectionView.java index 98532a00b..22a2ecb5b 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/widget/SectionView.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/widget/SectionView.java @@ -18,14 +18,14 @@ package org.thialfihar.android.apg.ui.widget; import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKeyRing; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Id; +import org.thialfihar.android.apg.helper.PGPHelper; +import org.thialfihar.android.apg.helper.PGPConversionHelper; import org.thialfihar.android.apg.service.ApgHandler; import org.thialfihar.android.apg.service.ApgService; import org.thialfihar.android.apg.ui.dialog.ProgressDialogFragment; import org.thialfihar.android.apg.ui.widget.Editor.EditorListener; import org.thialfihar.android.apg.util.Choice; -import org.thialfihar.android.apg.util.Utils; import org.thialfihar.android.apg.R; import com.actionbarsherlock.app.SherlockFragmentActivity; @@ -259,9 +259,10 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor String passPhrase; if (mEditors.getChildCount() > 0) { PGPSecretKey masterKey = ((KeyEditor) mEditors.getChildAt(0)).getValue(); - passPhrase = Apg.getCachedPassPhrase(masterKey.getKeyID()); + passPhrase = PGPHelper.getCachedPassPhrase(masterKey.getKeyID()); - data.putByteArray(ApgService.MASTER_KEY, Utils.PGPSecretKeyToBytes(masterKey)); + data.putByteArray(ApgService.MASTER_KEY, + PGPConversionHelper.PGPSecretKeyToBytes(masterKey)); } else { passPhrase = ""; } @@ -284,7 +285,7 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor if (message.arg1 == ApgHandler.MESSAGE_OKAY) { // get new key from data bundle returned from service Bundle data = message.getData(); - PGPSecretKeyRing newKeyRing = Utils.BytesToPGPSecretKeyRing(data + PGPSecretKeyRing newKeyRing = PGPConversionHelper.BytesToPGPSecretKeyRing(data .getByteArray(ApgService.RESULT_NEW_KEY)); boolean isMasterKey = (mEditors.getChildCount() == 0); diff --git a/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyListAdapter.java b/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyListAdapter.java index 39e68fb81..240d6a078 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyListAdapter.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyListAdapter.java @@ -19,8 +19,8 @@ package org.thialfihar.android.apg.ui.widget; import java.util.Date; import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Id; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.provider.KeyRings; import org.thialfihar.android.apg.provider.Keys; import org.thialfihar.android.apg.provider.UserIds; @@ -53,7 +53,7 @@ public class SelectPublicKeyListAdapter extends BaseAdapter { mActivity = activity; mParent = parent; - mDatabase = Apg.getDatabase().db(); + mDatabase = PGPHelper.getDatabase().db(); mInflater = (LayoutInflater) parent.getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); long now = new Date().getTime() / 1000; @@ -177,7 +177,7 @@ public class SelectPublicKeyListAdapter extends BaseAdapter { } long masterKeyId = mCursor.getLong(1); // MASTER_KEY_ID - keyId.setText(Apg.getSmallFingerPrint(masterKeyId)); + keyId.setText(PGPHelper.getSmallFingerPrint(masterKeyId)); if (mainUserIdRest.getText().length() == 0) { mainUserIdRest.setVisibility(View.GONE); diff --git a/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectSecretKeyListAdapter.java b/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectSecretKeyListAdapter.java index 0f4c8e6d1..fc8c4e8b0 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectSecretKeyListAdapter.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectSecretKeyListAdapter.java @@ -17,8 +17,8 @@ package org.thialfihar.android.apg.ui.widget; import java.util.Date; import org.thialfihar.android.apg.R; -import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.Id; +import org.thialfihar.android.apg.helper.PGPHelper; import org.thialfihar.android.apg.provider.KeyRings; import org.thialfihar.android.apg.provider.Keys; import org.thialfihar.android.apg.provider.UserIds; @@ -48,7 +48,7 @@ public class SelectSecretKeyListAdapter extends BaseAdapter { mActivity = activity; mParent = parent; - mDatabase = Apg.getDatabase().db(); + mDatabase = PGPHelper.getDatabase().db(); mInflater = (LayoutInflater) parent.getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); long now = new Date().getTime() / 1000; @@ -151,7 +151,7 @@ public class SelectSecretKeyListAdapter extends BaseAdapter { } long masterKeyId = mCursor.getLong(1); // MASTER_KEY_ID - keyId.setText(Apg.getSmallFingerPrint(masterKeyId)); + keyId.setText(PGPHelper.getSmallFingerPrint(masterKeyId)); if (mainUserIdRest.getText().length() == 0) { mainUserIdRest.setVisibility(View.GONE); diff --git a/org_apg/src/org/thialfihar/android/apg/util/Constants.java b/org_apg/src/org/thialfihar/android/apg/util/Constants.java deleted file mode 100644 index fac9be649..000000000 --- a/org_apg/src/org/thialfihar/android/apg/util/Constants.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.thialfihar.android.apg.util; - -public class Constants { - public static final String TAG = "APG"; - -} diff --git a/org_apg/src/org/thialfihar/android/apg/InputData.java b/org_apg/src/org/thialfihar/android/apg/util/InputData.java index ba6caa1c5..6b357e6de 100644 --- a/org_apg/src/org/thialfihar/android/apg/InputData.java +++ b/org_apg/src/org/thialfihar/android/apg/util/InputData.java @@ -12,10 +12,11 @@ * limitations under the License. */ -package org.thialfihar.android.apg; +package org.thialfihar.android.apg.util; import java.io.InputStream; + public class InputData { private PositionAwareInputStream mInputStream; private long mSize; diff --git a/org_apg/src/org/thialfihar/android/apg/PositionAwareInputStream.java b/org_apg/src/org/thialfihar/android/apg/util/PositionAwareInputStream.java index d49713ae6..7850e2513 100644 --- a/org_apg/src/org/thialfihar/android/apg/PositionAwareInputStream.java +++ b/org_apg/src/org/thialfihar/android/apg/util/PositionAwareInputStream.java @@ -12,7 +12,7 @@ * limitations under the License. */ -package org.thialfihar.android.apg; +package org.thialfihar.android.apg.util; import java.io.IOException; import java.io.InputStream; diff --git a/org_apg/src/org/thialfihar/android/apg/Primes.java b/org_apg/src/org/thialfihar/android/apg/util/Primes.java index f0f391291..071673c13 100644 --- a/org_apg/src/org/thialfihar/android/apg/Primes.java +++ b/org_apg/src/org/thialfihar/android/apg/util/Primes.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.thialfihar.android.apg; +package org.thialfihar.android.apg.util; import java.math.BigInteger; |