diff options
author | Dominik <dominik@dominikschuermann.de> | 2012-06-09 03:46:30 +0300 |
---|---|---|
committer | Dominik <dominik@dominikschuermann.de> | 2012-06-13 19:28:23 +0300 |
commit | 5a51f7912694db0f24588b07cd21ca4f94fe9101 (patch) | |
tree | 4f45e02f5aef854b22e92ca7a5de878278121157 /org_apg/src/org/thialfihar/android/apg/provider/blob | |
parent | 7b61ad24d7b9b4d633d924dd7db38758012e4a8e (diff) | |
download | open-keychain-5a51f7912694db0f24588b07cd21ca4f94fe9101.tar.gz open-keychain-5a51f7912694db0f24588b07cd21ca4f94fe9101.tar.bz2 open-keychain-5a51f7912694db0f24588b07cd21ca4f94fe9101.zip |
working on externalizing encrypt methods into the service
Diffstat (limited to 'org_apg/src/org/thialfihar/android/apg/provider/blob')
3 files changed, 266 insertions, 0 deletions
diff --git a/org_apg/src/org/thialfihar/android/apg/provider/blob/ApgServiceBlobDatabase.java b/org_apg/src/org/thialfihar/android/apg/provider/blob/ApgServiceBlobDatabase.java new file mode 100644 index 000000000..5122f9da1 --- /dev/null +++ b/org_apg/src/org/thialfihar/android/apg/provider/blob/ApgServiceBlobDatabase.java @@ -0,0 +1,72 @@ +/* + * 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.provider.blob; + +import org.thialfihar.android.apg.service.ApgService2; + +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.net.Uri; +import android.util.Log; + +public class ApgServiceBlobDatabase extends SQLiteOpenHelper { + + private static final String TAG = "ApgServiceBlobDatabase"; + + private static final int VERSION = 1; + private static final String NAME = "apg_service_blob_data"; + private static final String TABLE = "data"; + + public ApgServiceBlobDatabase(Context context) { + super(context, NAME, null, VERSION); + if (ApgService2.LOCAL_LOGD) + Log.d(TAG, "constructor called"); + } + + @Override + public void onCreate(SQLiteDatabase db) { + if (ApgService2.LOCAL_LOGD) + Log.d(TAG, "onCreate() called"); + db.execSQL("create table " + TABLE + " ( _id integer primary key autoincrement," + + "key text not null)"); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + if (ApgService2.LOCAL_LOGD) + Log.d(TAG, "onUpgrade() called"); + // no upgrade necessary yet + } + + public Uri insert(ContentValues vals) { + if (ApgService2.LOCAL_LOGD) + Log.d(TAG, "insert() called"); + SQLiteDatabase db = this.getWritableDatabase(); + long newId = db.insert(TABLE, null, vals); + return ContentUris.withAppendedId(ApgServiceBlobProvider.CONTENT_URI, newId); + } + + public Cursor query(String id, String key) { + if (ApgService2.LOCAL_LOGD) + Log.d(TAG, "query() called"); + SQLiteDatabase db = this.getReadableDatabase(); + return db.query(TABLE, new String[] { "_id" }, "_id = ? and key = ?", new String[] { id, + key }, null, null, null); + } +} diff --git a/org_apg/src/org/thialfihar/android/apg/provider/blob/ApgServiceBlobProvider.java b/org_apg/src/org/thialfihar/android/apg/provider/blob/ApgServiceBlobProvider.java new file mode 100644 index 000000000..b16bc398e --- /dev/null +++ b/org_apg/src/org/thialfihar/android/apg/provider/blob/ApgServiceBlobProvider.java @@ -0,0 +1,152 @@ +/* + * 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.provider.blob; + +import org.thialfihar.android.apg.Constants; +import org.thialfihar.android.apg.service.ApgService2; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.net.Uri; +import android.os.ParcelFileDescriptor; +import android.util.Log; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.List; +import java.util.UUID; + +public class ApgServiceBlobProvider extends ContentProvider { + + private static final String TAG = "ApgServiceBlobProvider"; + + public static final Uri CONTENT_URI = Uri.parse("content://org.thialfihar.android.apg.provider.apgserviceblobprovider"); + + private static final String COLUMN_KEY = "key"; + + private static final String STORE_PATH = Constants.path.APP_DIR+"/ApgServiceBlobs"; + + private ApgServiceBlobDatabase mDb = null; + + public ApgServiceBlobProvider() { + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "Constructor called"); + File dir = new File(STORE_PATH); + dir.mkdirs(); + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "Constructor finished"); + } + + @Override + public int delete(Uri arg0, String arg1, String[] arg2) { + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "delete() called"); + // TODO Auto-generated method stub + return 0; + } + + @Override + public String getType(Uri arg0) { + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "getType() called"); + // not needed for now + return null; + } + + @Override + public Uri insert(Uri uri, ContentValues ignored) { + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "insert() called"); + // ContentValues are actually ignored, because we want to store a blob with no more information + // but have to create an record with the password generated here first + + ContentValues vals = new ContentValues(); + + // Insert a random key in the database. This has to provided by the caller when updating or + // getting the blob + String password = UUID.randomUUID().toString(); + vals.put(COLUMN_KEY, password); + + Uri insertedUri = mDb.insert(vals); + return Uri.withAppendedPath(insertedUri, password); + } + + @Override + public boolean onCreate() { + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "onCreate() called"); + mDb = new ApgServiceBlobDatabase(getContext()); + // TODO Auto-generated method stub + return true; + } + + @Override + public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3, String arg4) { + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "query() called"); + // TODO Auto-generated method stub + return null; + } + + @Override + public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) { + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "update() called"); + // TODO Auto-generated method stub + return 0; + } + + @Override + public ParcelFileDescriptor openFile(Uri uri, String mode) throws SecurityException, FileNotFoundException { + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "openFile() called"); + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "... with uri: "+uri.toString()); + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "... with mode: "+mode); + + List<String> segments = uri.getPathSegments(); + if(segments.size() < 2) { + throw new SecurityException("Password not found in URI"); + } + String id = segments.get(0); + String key = segments.get(1); + + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "... got id: "+id); + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "... and key: "+key); + + // get the data + Cursor result = mDb.query(id, key); + + if(result.getCount() == 0) { + // either the key is wrong or no id exists + throw new FileNotFoundException("No file found with that ID and/or password"); + } + + File targetFile = new File(STORE_PATH, id); + if(mode.equals("w")) { + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "... will try to open file w"); + if( !targetFile.exists() ) { + try { + targetFile.createNewFile(); + } catch (IOException e) { + Log.e(TAG, "... got IEOException on creating new file", e); + throw new FileNotFoundException("Could not create file to write to"); + } + } + return ParcelFileDescriptor.open(targetFile, ParcelFileDescriptor.MODE_WRITE_ONLY | ParcelFileDescriptor.MODE_TRUNCATE ); + } else if(mode.equals("r")) { + if(ApgService2.LOCAL_LOGD) Log.d(TAG, "... will try to open file r"); + if( !targetFile.exists() ) { + throw new FileNotFoundException("Error: Could not find the file requested"); + } + return ParcelFileDescriptor.open(targetFile, ParcelFileDescriptor.MODE_READ_ONLY); + } + + return null; + } + +} diff --git a/org_apg/src/org/thialfihar/android/apg/provider/blob/BlobContract.java b/org_apg/src/org/thialfihar/android/apg/provider/blob/BlobContract.java new file mode 100644 index 000000000..dd9bd2069 --- /dev/null +++ b/org_apg/src/org/thialfihar/android/apg/provider/blob/BlobContract.java @@ -0,0 +1,42 @@ +//package org.thialfihar.android.apg.provider.blob; +// +//import android.net.Uri; +//import android.provider.BaseColumns; +// +//public class BlobContract { +// +// interface BlobColumns { +// String DATA = "data"; +// } +// +// public static final String CONTENT_AUTHORITY = "org.thialfihar.android.apg"; +// +// private static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY); +// +// public static final String PATH_BLOB = "blob"; +// +// public static class Blobs implements BlobColumns, BaseColumns { +// public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH_BLOB) +// .build(); +// +// /** Use if multiple items get returned */ +// public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.apg.blob"; +// +// /** Use if a single item is returned */ +// public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.apg.blob"; +// +// /** Default "ORDER BY" clause. */ +// public static final String DEFAULT_SORT = BaseColumns._ID + " ASC"; +// +// public static Uri buildUri(String id) { +// return CONTENT_URI.buildUpon().appendPath(id).build(); +// } +// +// public static String getId(Uri uri) { +// return uri.getLastPathSegment(); +// } +// } +// +// private BlobContract() { +// } +//} |