From 2a94840e06a1dc5dc4ce3f0dd369ba643ae1dbf7 Mon Sep 17 00:00:00 2001 From: peli0101 Date: Wed, 8 Apr 2009 19:43:13 +0000 Subject: [PATCH] OI Safe: Add direction decryption of file through content provider. WARNING: This is an experimental feature, and currently not safe yet! git-svn-id: http://openintents.googlecode.com/svn/trunk/Safe@2020 72b678ce-9140-0410-bee8-679b907dd61a --- .../safe/CryptoContentProvider.java | 29 +++++++++++++++++++ src/org/openintents/safe/CryptoHelper.java | 4 ++- src/org/openintents/safe/IntentHandler.java | 2 +- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/org/openintents/safe/CryptoContentProvider.java b/src/org/openintents/safe/CryptoContentProvider.java index 3e09c82..e9afe61 100644 --- a/src/org/openintents/safe/CryptoContentProvider.java +++ b/src/org/openintents/safe/CryptoContentProvider.java @@ -40,6 +40,7 @@ public class CryptoContentProvider extends ContentProvider { private static final int ENCRYPT_ID = 2; private static final int DECRYPT_ID = 3; + private static final int DECRYPT_FILE_ID = 4; private static final UriMatcher sUriMatcher; @@ -47,6 +48,7 @@ public class CryptoContentProvider extends ContentProvider { sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); sUriMatcher.addURI(AUTHORITY, "encrypt/*", ENCRYPT_ID); sUriMatcher.addURI(AUTHORITY, "decrypt/*", DECRYPT_ID); + sUriMatcher.addURI(AUTHORITY, "decryptfile", DECRYPT_FILE_ID); // [Peli] can be renamed to "decrypt/*" if first two options are made obsolete } @Override @@ -105,6 +107,7 @@ public class CryptoContentProvider extends ContentProvider { String path=filesDir; String cryptSession; String sessionFile; + String originalFile; int modeBits = 0; switch (sUriMatcher.match(uri)) { case ENCRYPT_ID: @@ -122,6 +125,28 @@ public class CryptoContentProvider extends ContentProvider { sessionFile=SESSION_FILE+"."+cryptSession; path += "/"+sessionFile; break; + case DECRYPT_FILE_ID: + if (debug) Log.d(TAG,"openFile: DECRYPT_FILE"); + modeBits = ParcelFileDescriptor.MODE_READ_ONLY; + originalFile = "file://" + uri.getQueryParameter("file"); + String sessionKey = uri.getQueryParameter("sessionkey"); + // TODO: Check that sessionKey is valid. + + // Decrypt file + CryptoHelper ch = IntentHandler.ch; // Use the global crypto helper that is connected to the single service we have. + + Log.d(TAG, "Original file path: " + originalFile); + + if (ch == null) { + throw new CryptoHelperException("CryptoHelper not available. Are you logged in?"); + } + Log.d(TAG, "Decrypt.."); + Uri newuri = ch.decryptFileWithSessionKey(this.getContext(), Uri.parse(originalFile)); + cryptSession = newuri.getPathSegments().get(1); + sessionFile=SESSION_FILE+"."+cryptSession; + path += "/"+sessionFile; + Log.d(TAG, "New path: " + path); + break; default: throw new IllegalArgumentException("Unknown URI " + uri); } @@ -143,6 +168,10 @@ public class CryptoContentProvider extends ContentProvider { throw e; } catch (IllegalArgumentException e) { throw e; + } catch (CryptoHelperException e) { + if (debug) Log.d(TAG,"openFile: CryptoHelperException"); + pfd = null; + //throw e; } return pfd; diff --git a/src/org/openintents/safe/CryptoHelper.java b/src/org/openintents/safe/CryptoHelper.java index 750525f..cdb3064 100644 --- a/src/org/openintents/safe/CryptoHelper.java +++ b/src/org/openintents/safe/CryptoHelper.java @@ -822,7 +822,9 @@ public class CryptoHelper { os.close(); // Securely delete the original file: - SecureDelete.delete(new File(fileUri.getPath())); + + // TODO Peli: Only delete if this is not a decryption through ContentProvider. + // SecureDelete.delete(new File(fileUri.getPath())); status=true; diff --git a/src/org/openintents/safe/IntentHandler.java b/src/org/openintents/safe/IntentHandler.java index e2fd9e7..0110db8 100644 --- a/src/org/openintents/safe/IntentHandler.java +++ b/src/org/openintents/safe/IntentHandler.java @@ -57,7 +57,7 @@ public class IntentHandler extends Activity { private String salt; private String masterKey; - private CryptoHelper ch; + public static CryptoHelper ch; // TODO Peli: Could clean this up by moving it into a singleton? Or at least a separate static class? // service elements private ServiceDispatch service; -- 2.50.1