aboutsummaryrefslogtreecommitdiffstats
path: root/org_apg
diff options
context:
space:
mode:
authorDominik <dominik@dominikschuermann.de>2012-06-19 02:25:03 +0300
committerDominik <dominik@dominikschuermann.de>2012-06-19 02:25:03 +0300
commit437ec9c49a61af9949dcb04dedc43d0c074f8f42 (patch)
tree561930f8c9ad3d7d5390c67d636bdfcb8f24de5f /org_apg
parent1de42b0bfb04621ef04c73e33f37ca4b03bc87a1 (diff)
downloadopen-keychain-437ec9c49a61af9949dcb04dedc43d0c074f8f42.tar.gz
open-keychain-437ec9c49a61af9949dcb04dedc43d0c074f8f42.tar.bz2
open-keychain-437ec9c49a61af9949dcb04dedc43d0c074f8f42.zip
fixes for symmetric encryption check and securely deleting reworked
Diffstat (limited to 'org_apg')
-rw-r--r--org_apg/src/org/thialfihar/android/apg/Apg.java10
-rw-r--r--org_apg/src/org/thialfihar/android/apg/service/ApgService.java36
-rw-r--r--org_apg/src/org/thialfihar/android/apg/ui/BaseActivity.java124
-rw-r--r--org_apg/src/org/thialfihar/android/apg/ui/EncryptActivity.java24
-rw-r--r--org_apg/src/org/thialfihar/android/apg/ui/dialog/DeleteFileDialogFragment.java118
5 files changed, 229 insertions, 83 deletions
diff --git a/org_apg/src/org/thialfihar/android/apg/Apg.java b/org_apg/src/org/thialfihar/android/apg/Apg.java
index 66250b4d0..2c939f895 100644
--- a/org_apg/src/org/thialfihar/android/apg/Apg.java
+++ b/org_apg/src/org/thialfihar/android/apg/Apg.java
@@ -1304,7 +1304,7 @@ public class Apg {
context.getString(R.string.error_noEncryptionKeysOrPassPhrase));
}
- if (signatureKeyId != -1) {
+ if (signatureKeyId != Id.key.none) {
signingKeyRing = getSecretKeyRing(signatureKeyId);
signingKey = getSigningKey(signatureKeyId);
if (signingKey == null) {
@@ -1347,7 +1347,7 @@ public class Apg {
PGPSignatureGenerator signatureGenerator = null;
PGPV3SignatureGenerator signatureV3Generator = null;
- if (signatureKeyId != -1) {
+ if (signatureKeyId != Id.key.none) {
if (progress != null)
progress.setProgress(R.string.progress_preparingSignature, 10, 100);
if (forceV3Signature) {
@@ -1374,7 +1374,7 @@ public class Apg {
compressGen = new PGPCompressedDataGenerator(compression);
bcpgOut = new BCPGOutputStream(compressGen.open(encryptOut));
}
- if (signatureKeyId != -1) {
+ if (signatureKeyId != Id.key.none) {
if (forceV3Signature) {
signatureV3Generator.generateOnePassVersion(false).encode(bcpgOut);
} else {
@@ -1395,7 +1395,7 @@ public class Apg {
InputStream in = data.getInputStream();
while ((n = in.read(buffer)) > 0) {
pOut.write(buffer, 0, n);
- if (signatureKeyId != -1) {
+ if (signatureKeyId != Id.key.none) {
if (forceV3Signature) {
signatureV3Generator.update(buffer, 0, n);
} else {
@@ -1411,7 +1411,7 @@ public class Apg {
literalGen.close();
- if (signatureKeyId != -1) {
+ if (signatureKeyId != Id.key.none) {
if (progress != null)
progress.setProgress(R.string.progress_generatingSignature, 95, 100);
if (forceV3Signature) {
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 c36d814ba..6123beee8 100644
--- a/org_apg/src/org/thialfihar/android/apg/service/ApgService.java
+++ b/org_apg/src/org/thialfihar/android/apg/service/ApgService.java
@@ -22,16 +22,14 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
+import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
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.DataDestination;
-import org.thialfihar.android.apg.DataSource;
import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.InputData;
import org.thialfihar.android.apg.Preferences;
@@ -82,10 +80,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
// encrypt
public static final String SECRET_KEY_ID = "secret_key_id";
- // public static final String DATA_SOURCE = "data_source";
- // public static final String DATA_DESTINATION = "data_destination";
public static final String USE_ASCII_AMOR = "use_ascii_amor";
- // public static final String ENCRYPTION_TARGET = "encryption_target";
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";
@@ -96,6 +91,9 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
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;
@@ -105,6 +103,8 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
public static final int ACTION_ENCRYPT_SIGN_FILE = 5;
public static final int ACTION_ENCRYPT_SIGN_STREAM = 6;
+ public static final int ACTION_DELETE_FILE_SECURELY = 7;
+
// possible data keys as result
public static final String RESULT_NEW_KEY = "new_key";
public static final String RESULT_NEW_KEY2 = "new_key2";
@@ -446,6 +446,30 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
break;
+ case ACTION_DELETE_FILE_SECURELY:
+ try {
+ // Input
+ String deleteFile = data.getString(DELETE_FILE);
+
+ // Operation
+ try {
+ Apg.deleteFileSecurely(this, new File(deleteFile), this);
+ } catch (FileNotFoundException e) {
+ throw new Apg.GeneralException(getString(R.string.error_fileNotFound,
+ deleteFile));
+ } catch (IOException e) {
+ throw new Apg.GeneralException(getString(R.string.error_fileDeleteFailed,
+ deleteFile));
+ }
+
+ // Output
+ sendMessageToHandler(ApgHandler.MESSAGE_OKAY);
+ } 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 395ea1b6b..5310c2fb9 100644
--- a/org_apg/src/org/thialfihar/android/apg/ui/BaseActivity.java
+++ b/org_apg/src/org/thialfihar/android/apg/ui/BaseActivity.java
@@ -218,48 +218,48 @@ public class BaseActivity extends SherlockFragmentActivity implements Runnable,
return alert.create();
}
- case Id.dialog.delete_file: {
- AlertDialog.Builder alert = new AlertDialog.Builder(this);
-
- alert.setIcon(android.R.drawable.ic_dialog_alert);
- alert.setTitle(R.string.warning);
- alert.setMessage(this.getString(R.string.fileDeleteConfirmation, getDeleteFile()));
-
- alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- removeDialog(Id.dialog.delete_file);
- final File file = new File(getDeleteFile());
- showDialog(Id.dialog.deleting);
- mDeletingThread = new Thread(new Runnable() {
- public void run() {
- Bundle data = new Bundle();
- data.putInt(Constants.extras.STATUS, Id.message.delete_done);
- try {
- Apg.deleteFileSecurely(BaseActivity.this, file, BaseActivity.this);
- } catch (FileNotFoundException e) {
- data.putString(Apg.EXTRA_ERROR, BaseActivity.this.getString(
- R.string.error_fileNotFound, file));
- } catch (IOException e) {
- data.putString(Apg.EXTRA_ERROR, BaseActivity.this.getString(
- R.string.error_fileDeleteFailed, file));
- }
- Message msg = new Message();
- msg.setData(data);
- sendMessage(msg);
- }
- });
- mDeletingThread.start();
- }
- });
- alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- removeDialog(Id.dialog.delete_file);
- }
- });
- alert.setCancelable(true);
-
- return alert.create();
- }
+// case Id.dialog.delete_file: {
+// AlertDialog.Builder alert = new AlertDialog.Builder(this);
+//
+// alert.setIcon(android.R.drawable.ic_dialog_alert);
+// alert.setTitle(R.string.warning);
+// alert.setMessage(this.getString(R.string.fileDeleteConfirmation, getDeleteFile()));
+//
+// alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+// public void onClick(DialogInterface dialog, int id) {
+// removeDialog(Id.dialog.delete_file);
+// final File file = new File(getDeleteFile());
+// showDialog(Id.dialog.deleting);
+// mDeletingThread = new Thread(new Runnable() {
+// public void run() {
+// Bundle data = new Bundle();
+// data.putInt(Constants.extras.STATUS, Id.message.delete_done);
+// try {
+// Apg.deleteFileSecurely(BaseActivity.this, file, BaseActivity.this);
+// } catch (FileNotFoundException e) {
+// data.putString(Apg.EXTRA_ERROR, BaseActivity.this.getString(
+// R.string.error_fileNotFound, file));
+// } catch (IOException e) {
+// data.putString(Apg.EXTRA_ERROR, BaseActivity.this.getString(
+// R.string.error_fileDeleteFailed, file));
+// }
+// Message msg = new Message();
+// msg.setData(data);
+// sendMessage(msg);
+// }
+// });
+// mDeletingThread.start();
+// }
+// });
+// alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+// public void onClick(DialogInterface dialog, int id) {
+// removeDialog(Id.dialog.delete_file);
+// }
+// });
+// alert.setCancelable(true);
+//
+// return alert.create();
+// }
default: {
break;
@@ -335,11 +335,11 @@ public class BaseActivity extends SherlockFragmentActivity implements Runnable,
break;
}
- case Id.message.delete_done: {
- mProgressDialog = null;
- deleteDoneCallback(msg);
- break;
- }
+// case Id.message.delete_done: {
+// mProgressDialog = null;
+// deleteDoneCallback(msg);
+// break;
+// }
case Id.message.import_done: // intentionally no break
case Id.message.export_done: // intentionally no break
@@ -360,21 +360,21 @@ public class BaseActivity extends SherlockFragmentActivity implements Runnable,
}
- public void deleteDoneCallback(Message msg) {
- removeDialog(Id.dialog.deleting);
- mDeletingThread = null;
-
- Bundle data = msg.getData();
- String error = data.getString(Apg.EXTRA_ERROR);
- String message;
- if (error != null) {
- message = getString(R.string.errorMessage, error);
- } else {
- message = getString(R.string.fileDeleteSuccessful);
- }
-
- Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
- }
+// public void deleteDoneCallback(Message msg) {
+// removeDialog(Id.dialog.deleting);
+// mDeletingThread = null;
+//
+// Bundle data = msg.getData();
+// String error = data.getString(Apg.EXTRA_ERROR);
+// String message;
+// if (error != null) {
+// message = getString(R.string.errorMessage, error);
+// } else {
+// message = getString(R.string.fileDeleteSuccessful);
+// }
+//
+// Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
+// }
public void passPhraseCallback(long keyId, String passPhrase) {
// TODO: Not needed anymore, now implemented in AskForSecretKeyPass
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 5801dd09c..05dd17b8e 100644
--- a/org_apg/src/org/thialfihar/android/apg/ui/EncryptActivity.java
+++ b/org_apg/src/org/thialfihar/android/apg/ui/EncryptActivity.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");
@@ -26,6 +27,7 @@ import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.Preferences;
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;
@@ -115,7 +117,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
private boolean mGenerateSignature = false;
- private long mSecretKeyId = 0;
+ private long mSecretKeyId = Id.key.none;
private ProgressDialogFragment mEncryptingDialog;
private FileDialogFragment mFileDialog;
@@ -698,8 +700,6 @@ public class EncryptActivity extends SherlockFragmentActivity {
}
private void askForOutputFilename() {
- // showDialog(Id.dialog.output_filename);
-
// Message is received after passphrase is cached
Handler returnHandler = new Handler() {
@Override
@@ -733,7 +733,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
boolean useAsciiArmour = true;
long encryptionKeyIds[] = null;
- long signatureKeyId = -1; // -1 means no signature!
+ long signatureKeyId = Id.key.none;
int compressionId = 0;
boolean signOnly = false;
@@ -743,6 +743,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
if (passPhrase.length() == 0) {
passPhrase = null;
}
+ // signatureKeyId = Id.key.symmetric;
data.putString(ApgService.SYMMETRIC_PASSPHRASE, passPhrase);
} else {
@@ -799,7 +800,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
intent.putExtra(ApgService.EXTRA_DATA, data);
- // show progress dialog
+ // create progress dialog
mEncryptingDialog = ProgressDialogFragment.newInstance(R.string.progress_encrypting,
ProgressDialog.STYLE_HORIZONTAL);
@@ -852,10 +853,12 @@ public class EncryptActivity extends SherlockFragmentActivity {
case Id.target.file:
Toast.makeText(EncryptActivity.this, R.string.encryptionSuccessful,
Toast.LENGTH_SHORT).show();
+
if (mDeleteAfter.isChecked()) {
- // TODO: Reimplement that!
- // setDeleteFile(mInputFilename);
- // showDialog(Id.dialog.delete_file);
+ // Create and show dialog to delete original file
+ DeleteFileDialogFragment deleteFileDialog = DeleteFileDialogFragment
+ .newInstance(mInputFilename);
+ deleteFileDialog.show(getSupportFragmentManager(), "deleteDialog");
}
break;
@@ -872,7 +875,8 @@ public class EncryptActivity extends SherlockFragmentActivity {
Messenger messenger = new Messenger(saveHandler);
intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
- mEncryptingDialog.show(getSupportFragmentManager(), "dialog");
+ // show progress dialog
+ mEncryptingDialog.show(getSupportFragmentManager(), "encryptingDialog");
// start service with intent
startService(intent);
@@ -908,7 +912,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
+ getResources().getString(R.string.nKeysSelected));
}
- if (getSecretKeyId() == 0) {
+ if (getSecretKeyId() == Id.key.none) {
mSign.setChecked(false);
mMainUserId.setText("");
mMainUserIdRest.setText("");
diff --git a/org_apg/src/org/thialfihar/android/apg/ui/dialog/DeleteFileDialogFragment.java b/org_apg/src/org/thialfihar/android/apg/ui/dialog/DeleteFileDialogFragment.java
new file mode 100644
index 000000000..4ac3697bb
--- /dev/null
+++ b/org_apg/src/org/thialfihar/android/apg/ui/dialog/DeleteFileDialogFragment.java
@@ -0,0 +1,118 @@
+/*
+ * 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.ui.dialog;
+
+import org.thialfihar.android.apg.R;
+import org.thialfihar.android.apg.service.ApgHandler;
+import org.thialfihar.android.apg.service.ApgService;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.ProgressDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Message;
+import android.os.Messenger;
+import android.support.v4.app.DialogFragment;
+import android.support.v4.app.FragmentActivity;
+import android.widget.Toast;
+
+public class DeleteFileDialogFragment extends DialogFragment {
+
+ private static final String ARG_DELETE_FILE = "delete_file";
+
+ /**
+ * Creates new instance of this delete file dialog fragment
+ */
+ public static DeleteFileDialogFragment newInstance(String deleteFile) {
+ DeleteFileDialogFragment frag = new DeleteFileDialogFragment();
+ Bundle args = new Bundle();
+
+ args.putString(ARG_DELETE_FILE, deleteFile);
+
+ frag.setArguments(args);
+
+ return frag;
+ }
+
+ /**
+ * Creates dialog
+ */
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ final FragmentActivity activity = getActivity();
+
+ final String deleteFile = getArguments().getString(ARG_DELETE_FILE);
+
+ AlertDialog.Builder alert = new AlertDialog.Builder(activity);
+
+ alert.setIcon(android.R.drawable.ic_dialog_alert);
+ alert.setTitle(R.string.warning);
+ alert.setMessage(this.getString(R.string.fileDeleteConfirmation, deleteFile));
+
+ alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dismiss();
+
+ // Send all information needed to service to edit key in other thread
+ Intent intent = new Intent(activity, ApgService.class);
+
+ // fill values for this action
+ Bundle data = new Bundle();
+
+ intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_DELETE_FILE_SECURELY);
+ data.putString(ApgService.DELETE_FILE, deleteFile);
+ intent.putExtra(ApgService.EXTRA_DATA, data);
+
+ ProgressDialogFragment deletingDialog = ProgressDialogFragment.newInstance(
+ R.string.progress_deletingSecurely, ProgressDialog.STYLE_HORIZONTAL);
+
+ // Message is received after deleting is done in ApgService
+ ApgHandler saveHandler = new ApgHandler(activity, deletingDialog) {
+ public void handleMessage(Message message) {
+ // handle messages by standard ApgHandler first
+ super.handleMessage(message);
+
+ if (message.arg1 == ApgHandler.MESSAGE_OKAY) {
+ Toast.makeText(activity, R.string.fileDeleteSuccessful,
+ Toast.LENGTH_SHORT).show();
+ }
+ };
+ };
+
+ // Create a new Messenger for the communication back
+ Messenger messenger = new Messenger(saveHandler);
+ intent.putExtra(ApgService.EXTRA_MESSENGER, messenger);
+
+ // show progress dialog
+ deletingDialog.show(activity.getSupportFragmentManager(), "deletingDialog");
+
+ // start service with intent
+ activity.startService(intent);
+ }
+ });
+ alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dismiss();
+ }
+ });
+ alert.setCancelable(true);
+
+ return alert.create();
+ }
+} \ No newline at end of file