added secure file deletion, overwriting the file with random data before actual deletion

Update issue 56
Added a method for secure file deletion. We'll possibly have to test this a bit and make sure it actually *is* secure on the filesystems used (vfat for SD card, yaffs2 for phone flash memory by default). This sort of overwrite might be absolutely useless on some filesystems.
I also wanted to add an option at first, but this seems reasonably fast and in general it should be what the user wants, so for now it will ALWAYS securely delete. If there is a demand for plain deletion, then options can be added.

Update issue 39
A new string:
<string name="progress_deletingSecurely">deleting \'%s\' securely...</string>
This commit is contained in:
Thialfihar
2010-07-24 14:24:42 +00:00
parent 2407f3b989
commit b650b30a11
6 changed files with 83 additions and 19 deletions

View File

@@ -17,6 +17,8 @@
package org.thialfihar.android.apg;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Locale;
import android.app.Activity;
@@ -44,6 +46,7 @@ public class BaseActivity extends Activity
private ProgressDialog mProgressDialog = null;
private Thread mRunningThread = null;
private Thread mDeletingThread = null;
private long mSecretKeyId = 0;
private String mDeleteFile = null;
@@ -149,6 +152,11 @@ public class BaseActivity extends Activity
return mProgressDialog;
}
case Id.dialog.deleting: {
mProgressDialog.setMessage(this.getString(R.string.progress_initializing));
return mProgressDialog;
}
default: {
break;
}
@@ -235,19 +243,30 @@ public class BaseActivity extends Activity
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
removeDialog(Id.dialog.delete_file);
File file = new File(getDeleteFile());
String msg = "";
if (file.delete()) {
msg = BaseActivity.this.getString(
R.string.fileDeleteSuccessful);
} else {
msg = BaseActivity.this.getString(
R.string.errorMessage,
BaseActivity.this.getString(
R.string.error_fileDeleteFailed, file));
}
Toast.makeText(BaseActivity.this,
msg, Toast.LENGTH_SHORT).show();
final File file = new File(getDeleteFile());
showDialog(Id.dialog.deleting);
mDeletingThread = new Thread(new Runnable() {
@Override
public void run() {
Bundle data = new Bundle();
data.putInt(Apg.EXTRA_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,
@@ -335,8 +354,14 @@ public class BaseActivity extends Activity
break;
}
case Id.message.import_done: // intentionall no break
case Id.message.export_done: // intentionall no 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
case Id.message.done: {
mProgressDialog = null;
doneCallback(msg);
@@ -349,6 +374,22 @@ public class BaseActivity extends Activity
}
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) {
Apg.setCachedPassPhrase(keyId, passPhrase);
}