diff options
Diffstat (limited to 'org_apg/src/org/thialfihar')
23 files changed, 440 insertions, 2019 deletions
diff --git a/org_apg/src/org/thialfihar/android/apg/deprecated/ApgCon.java b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgCon.java deleted file mode 100644 index 36b8fa971..000000000 --- a/org_apg/src/org/thialfihar/android/apg/deprecated/ApgCon.java +++ /dev/null @@ -1,836 +0,0 @@ -/* - * Copyright (C) 2011 Markus Doits <markus.doits@googlemail.com> - * - * 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.deprecated; - -import org.thialfihar.android.apg.deprecated.ApgConInterface.OnCallFinishListener; -import org.thialfihar.android.apg.deprecated.IApgService2; - -import android.content.ComponentName; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.content.pm.PackageManager; -import android.content.pm.ServiceInfo; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.IBinder; -import org.thialfihar.android.apg.util.Log; - -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; - -/** - * A APG-AIDL-Wrapper - * - * <p> - * This class can be used by other projects to simplify connecting to the - * APG-AIDL-Service. Kind of wrapper of for AIDL. - * </p> - * - * <p> - * It is not used in this project. - * </p> - * - * @author Markus Doits <markus.doits@googlemail.com> - * @version 1.1rc1 - * - */ -public class ApgCon { - private static final boolean LOCAL_LOGV = true; - private static final boolean LOCAL_LOGD = true; - - private final static String TAG = "ApgCon"; - private final static int API_VERSION = 2; // aidl api-version it expects - private final static String BLOB_URI = "content://org.thialfihar.android.apg.provider.apgserviceblobprovider"; - - /** - * How many seconds to wait for a connection to AGP when connecting. - * Being unsuccessful for this number of seconds, a connection - * is assumed to be failed. - */ - public int secondsToWaitForConnection = 15; - - private class CallAsync extends AsyncTask<String, Void, Void> { - - @Override - protected Void doInBackground(String... arg) { - if( LOCAL_LOGD ) Log.d(TAG, "Async execution starting"); - call(arg[0]); - return null; - } - - protected void onPostExecute(Void res) { - if( LOCAL_LOGD ) Log.d(TAG, "Async execution finished"); - mAsyncRunning = false; - - } - - } - - private final Context mContext; - private final error mConnectionStatus; - private boolean mAsyncRunning = false; - private OnCallFinishListener mOnCallFinishListener; - - private final Bundle mResult = new Bundle(); - private final Bundle mArgs = new Bundle(); - private final ArrayList<String> mErrorList = new ArrayList<String>(); - private final ArrayList<String> mWarningList = new ArrayList<String>(); - - /** Remote service for decrypting and encrypting data */ - private IApgService2 mApgService = null; - - /** Set apgService accordingly to connection status */ - private ServiceConnection mApgConnection = new ServiceConnection() { - public void onServiceConnected(ComponentName className, IBinder service) { - if( LOCAL_LOGD ) Log.d(TAG, "IApgService bound to apgService"); - mApgService = IApgService2.Stub.asInterface(service); - } - - public void onServiceDisconnected(ComponentName className) { - if( LOCAL_LOGD ) Log.d(TAG, "IApgService disconnected"); - mApgService = null; - } - }; - - /** - * Different types of local errors - */ - public static enum error { - /** - * no error - */ - NO_ERROR, - /** - * generic error - */ - GENERIC, - /** - * connection to apg service not possible - */ - CANNOT_BIND_TO_APG, - /** - * function to call not provided - */ - CALL_MISSING, - /** - * apg service does not know what to do - */ - CALL_NOT_KNOWN, - /** - * could not find APG being installed - */ - APG_NOT_FOUND, - /** - * found APG but without AIDL interface - */ - APG_AIDL_MISSING, - /** - * found APG but with wrong API - */ - APG_API_MISSMATCH - } - - private static enum ret { - ERROR, // returned from AIDL - RESULT, // returned from AIDL - WARNINGS, // mixed AIDL and LOCAL - ERRORS, // mixed AIDL and LOCAL - } - - /** - * Constructor - * - * <p> - * Creates a new ApgCon object and searches for the right APG version on - * initialization. If not found, errors are printed to the error log. - * </p> - * - * @param ctx - * the running context - */ - public ApgCon(Context ctx) { - if( LOCAL_LOGV ) Log.v(TAG, "EncryptionService created"); - mContext = ctx; - - error tmpError = null; - try { - if( LOCAL_LOGV ) Log.v(TAG, "Searching for the right APG version"); - ServiceInfo apgServices[] = ctx.getPackageManager().getPackageInfo("org.thialfihar.android.apg", - PackageManager.GET_SERVICES | PackageManager.GET_META_DATA).services; - if (apgServices == null) { - Log.e(TAG, "Could not fetch services"); - tmpError = error.GENERIC; - } else { - boolean apgServiceFound = false; - for (ServiceInfo inf : apgServices) { - if( LOCAL_LOGV ) Log.v(TAG, "Found service of APG: " + inf.name); - if (inf.name.equals("org.thialfihar.android.apg.ApgService")) { - apgServiceFound = true; - if (inf.metaData == null) { - Log.w(TAG, "Could not determine ApgService API"); - Log.w(TAG, "This probably won't work!"); - mWarningList.add("(LOCAL) Could not determine ApgService API"); - tmpError = error.APG_API_MISSMATCH; - } else if (inf.metaData.getInt("api_version") != API_VERSION) { - Log.w(TAG, "Found ApgService API version " + inf.metaData.getInt("api_version") + " but exspected " + API_VERSION); - Log.w(TAG, "This probably won't work!"); - mWarningList.add("(LOCAL) Found ApgService API version " + inf.metaData.getInt("api_version") + " but exspected " + API_VERSION); - tmpError = error.APG_API_MISSMATCH; - } else { - if( LOCAL_LOGV ) Log.v(TAG, "Found api_version " + API_VERSION + ", everything should work"); - tmpError = error.NO_ERROR; - } - } - } - - if (!apgServiceFound) { - Log.e(TAG, "Could not find APG with AIDL interface, this probably won't work"); - mErrorList.add("(LOCAL) Could not find APG with AIDL interface, this probably won't work"); - mResult.putInt(ret.ERROR.name(), error.APG_AIDL_MISSING.ordinal()); - tmpError = error.APG_NOT_FOUND; - } - } - } catch (PackageManager.NameNotFoundException e) { - Log.e(TAG, "Could not find APG, is it installed?", e); - mErrorList.add("(LOCAL) Could not find APG, is it installed?"); - mResult.putInt(ret.ERROR.name(), error.APG_NOT_FOUND.ordinal()); - tmpError = error.APG_NOT_FOUND; - } - - mConnectionStatus = tmpError; - - } - - /** try to connect to the apg service */ - private boolean connect() { - if( LOCAL_LOGV ) Log.v(TAG, "trying to bind the apgService to context"); - - if (mApgService != null) { - if( LOCAL_LOGV ) Log.v(TAG, "allready connected"); - return true; - } - - try { - mContext.bindService(new Intent(IApgService2.class.getName()), mApgConnection, Context.BIND_AUTO_CREATE); - } catch (Exception e) { - Log.e(TAG, "could not bind APG service", e); - return false; - } - - int waitCount = 0; - while (mApgService == null && waitCount++ < secondsToWaitForConnection) { - if( LOCAL_LOGV ) Log.v(TAG, "sleeping 1 second to wait for apg"); - android.os.SystemClock.sleep(1000); - } - - if (waitCount >= secondsToWaitForConnection) { - if( LOCAL_LOGV ) Log.v(TAG, "slept waiting for nothing!"); - return false; - } - - return true; - } - - /** - * Disconnects ApgCon from Apg - * - * <p> - * This should be called whenever all work with APG is done (e.g. everything - * you wanted to encrypt is encrypted), since connections with AIDL should - * not be upheld indefinitely. - * <p> - * - * <p> - * Also, if you destroy you end using your ApgCon-instance, this must be - * called or else the connection to APG is leaked - * </p> - */ - public void disconnect() { - if( LOCAL_LOGV ) Log.v(TAG, "disconnecting apgService"); - if (mApgService != null) { - mContext.unbindService(mApgConnection); - mApgService = null; - } - } - - private boolean initialize() { - if (mApgService == null) { - if (!connect()) { - if( LOCAL_LOGV ) Log.v(TAG, "connection to apg service failed"); - return false; - } - } - return true; - } - - /** - * Calls a function from APG's AIDL-interface - * - * <p> - * After you have set up everything with {@link #setArg(String, String)} - * (and variants), you can call a function of the AIDL-interface. This - * will: - * <ul> - * <li>start connection to the remote interface (if not already connected)</li> - * <li>call the function passed with all parameters synchronously</li> - * <li>set up everything to retrieve the result and/or warnings/errors</li> - * <li>call the callback if provided - * </ul> - * </p> - * - * <p> - * Note your thread will be blocked during execution - if you want to call - * the function asynchronously, see {@link #callAsync(String)}. - * </p> - * - * @param function - * a remote function to call - * @return true, if call successful (= no errors), else false - * - * @see #callAsync(String) - * @see #setArg(String, String) - * @see #setOnCallFinishListener(OnCallFinishListener) - */ - public boolean call(String function) { - boolean success = this.call(function, mArgs, mResult); - if (mOnCallFinishListener != null) { - try { - if( LOCAL_LOGD ) Log.d(TAG, "About to execute callback"); - mOnCallFinishListener.onCallFinish(mResult); - if( LOCAL_LOGD ) Log.d(TAG, "Callback executed"); - } catch (Exception e) { - Log.w(TAG, "Exception on callback: (" + e.getClass() + ") " + e.getMessage(), e); - mWarningList.add("(LOCAL) Could not execute callback (" + e.getClass() + "): " + e.getMessage()); - } - } - return success; - } - - /** - * Calls a function of remote interface asynchronously - * - * <p> - * This does exactly the same as {@link #call(String)}, but asynchronously. - * While connection to APG and work are done in background, your thread can - * go on executing. - * <p> - * - * <p> - * To see whether the task is finished, you have two possibilities: - * <ul> - * <li>In your thread, poll {@link #isRunning()}</li> - * <li>Supply a callback with {@link #setOnCallFinishListener(OnCallFinishListener)}</li> - * </ul> - * </p> - * - * @param function - * a remote function to call - * - * @see #call(String) - * @see #isRunning() - * @see #setOnCallFinishListener(OnCallFinishListener) - */ - public void callAsync(String function) { - mAsyncRunning = true; - new CallAsync().execute(function); - } - - private boolean call(String function, Bundle pArgs, Bundle pReturn) { - - if (!initialize()) { - mErrorList.add("(LOCAL) Cannot bind to ApgService"); - mResult.putInt(ret.ERROR.name(), error.CANNOT_BIND_TO_APG.ordinal()); - return false; - } - - if (function == null || function.length() == 0) { - mErrorList.add("(LOCAL) Function to call missing"); - mResult.putInt(ret.ERROR.name(), error.CALL_MISSING.ordinal()); - return false; - } - - try { - Boolean success = (Boolean) IApgService2.class.getMethod(function, Bundle.class, Bundle.class).invoke(mApgService, pArgs, pReturn); - mErrorList.addAll(pReturn.getStringArrayList(ret.ERRORS.name())); - mWarningList.addAll(pReturn.getStringArrayList(ret.WARNINGS.name())); - return success; - } catch (NoSuchMethodException e) { - Log.e(TAG, "Remote call not known (" + function + "): " + e.getMessage(), e); - mErrorList.add("(LOCAL) Remote call not known (" + function + "): " + e.getMessage()); - mResult.putInt(ret.ERROR.name(), error.CALL_NOT_KNOWN.ordinal()); - return false; - } catch (InvocationTargetException e) { - Throwable orig = e.getTargetException(); - Log.w(TAG, "Exception of type '" + orig.getClass() + "' on AIDL call '" + function + "': " + orig.getMessage(), orig); - mErrorList.add("(LOCAL) Exception of type '" + orig.getClass() + "' on AIDL call '" + function + "': " + orig.getMessage()); - return false; - } catch (Exception e) { - Log.e(TAG, "Generic error (" + e.getClass() + "): " + e.getMessage(), e); - mErrorList.add("(LOCAL) Generic error (" + e.getClass() + "): " + e.getMessage()); - mResult.putInt(ret.ERROR.name(), error.GENERIC.ordinal()); - return false; - } - - } - - /** - * Set a string argument for APG - * - * <p> - * This defines a string argument for APG's AIDL-interface. - * </p> - * - * <p> - * To know what key-value-pairs are possible (or required), take a look into - * the IApgService.aidl - * </p> - * - * <p> - * Note that parameters are not reseted after a call, so you have to - * reset ({@link #clearArgs()}) them manually if you want to. - * </p> - * - * - * @param key - * the key - * @param val - * the value - * - * @see #clearArgs() - */ - public void setArg(String key, String val) { - mArgs.putString(key, val); - } - - /** - * Set a string-array argument for APG - * - * <p> - * If the AIDL-parameter is an {@literal ArrayList<String>}, you have to use - * this function. - * </p> - * - * <code> - * <pre> - * setArg("a key", new String[]{ "entry 1", "entry 2" }); - * </pre> - * </code> - * - * @param key - * the key - * @param vals - * the value - * - * @see #setArg(String, String) - */ - public void setArg(String key, String vals[]) { - ArrayList<String> list = new ArrayList<String>(); - for (String val : vals) { - list.add(val); - } - mArgs.putStringArrayList(key, list); - } - - /** - * Set up a boolean argument for APG - * - * @param key - * the key - * @param vals - * the value - * - * @see #setArg(String, String) - */ - public void setArg(String key, boolean val) { - mArgs.putBoolean(key, val); - } - - /** - * Set up a int argument for APG - * - * @param key - * the key - * @param vals - * the value - * - * @see #setArg(String, String) - */ - public void setArg(String key, int val) { - mArgs.putInt(key, val); - } - - /** - * Set up a int-array argument for APG - * <p> - * If the AIDL-parameter is an {@literal ArrayList<Integer>}, you have to - * use this function. - * </p> - * - * @param key - * the key - * @param vals - * the value - * - * @see #setArg(String, String) - */ - public void setArg(String key, int vals[]) { - ArrayList<Integer> list = new ArrayList<Integer>(); - for (int val : vals) { - list.add(val); - } - mArgs.putIntegerArrayList(key, list); - } - - /** - * Set up binary data to en/decrypt - * - * @param is - * InputStream to get the data from - */ - public void setBlob(InputStream is) { - if( LOCAL_LOGD ) Log.d(TAG, "setBlob() called"); - // 1. get the new contentUri - ContentResolver cr = mContext.getContentResolver(); - Uri contentUri = cr.insert(Uri.parse(BLOB_URI), new ContentValues()); - - // 2. insert binary data - OutputStream os = null; - try { - os = cr.openOutputStream(contentUri, "w"); - } catch( Exception e ) { - Log.e(TAG, "... exception on setBlob", e); - } - - byte[] buffer = new byte[8]; - int len = 0; - try { - while( (len = is.read(buffer)) != -1) { - os.write(buffer, 0, len); - } - if(LOCAL_LOGD) Log.d(TAG, "... write finished, now closing"); - os.close(); - } catch (Exception e) { - Log.e(TAG, "... error on writing buffer", e); - } - - mArgs.putString("BLOB", contentUri.toString() ); - } - - /** - * Clears all arguments - * - * <p> - * Anything the has been set up with the various - * {@link #setArg(String, String)} functions is cleared. - * </p> - * - * <p> - * Note that any warning, error, callback, result, etc. is NOT cleared with - * this. - * </p> - * - * @see #reset() - */ - public void clearArgs() { - mArgs.clear(); - } - - /** - * Return the object associated with the key - * - * @param key - * the object's key you want to return - * @return an object at position key, or null if not set - */ - public Object getArg(String key) { - return mArgs.get(key); - } - - /** - * Iterates through the errors - * - * <p> - * With this method you can iterate through all errors. The errors are only - * returned once and deleted immediately afterwards, so you can only return - * each error once. - * </p> - * - * @return a human readable description of a error that happened, or null if - * no more errors - * - * @see #hasNextError() - * @see #clearErrors() - */ - public String getNextError() { - if (mErrorList.size() != 0) - return mErrorList.remove(0); - else - return null; - } - - /** - * Check if there are any new errors - * - * @return true, if there are unreturned errors, false otherwise - * - * @see #getNextError() - */ - public boolean hasNextError() { - return mErrorList.size() != 0; - } - - /** - * Get the numeric representation of the last error - * - * <p> - * Values <100 mean the error happened locally, values >=100 mean the error - * happened at the remote side (APG). See the IApgService.aidl (or get the - * human readable description with {@link #getNextError()}) for what - * errors >=100 mean. - * </p> - * - * @return the id of the error that happened - */ - public int getError() { - if (mResult.containsKey(ret.ERROR.name())) - return mResult.getInt(ret.ERROR.name()); - else - return -1; - } - - /** - * Iterates through the warnings - * - * <p> - * With this method you can iterate through all warnings. Warnings are - * only returned once and deleted immediately afterwards, so you can only - * return each warning once. - * </p> - * - * @return a human readable description of a warning that happened, or null - * if no more warnings - * - * @see #hasNextWarning() - * @see #clearWarnings() - */ - public String getNextWarning() { - if (mWarningList.size() != 0) - return mWarningList.remove(0); - else - return null; - } - - /** - * Check if there are any new warnings - * - * @return true, if there are unreturned warnings, false otherwise - * - * @see #getNextWarning() - */ - public boolean hasNextWarning() { - return mWarningList.size() != 0; - } - - /** - * Get the result - * - * <p> - * This gets your result. After doing an encryption or decryption with APG, - * you get the output with this function. - * </p> - * - * <p> - * Note when your last remote call is unsuccessful, the result will - * still have the same value like the last successful call (or null, if no - * call was successful). To ensure you do not work with old call's results, - * either be sure to {@link #reset()} (or at least {@link #clearResult()}) - * your instance before each new call or always check that - * {@link #hasNextError()} is false. - * </p> - * - * <p> - * Note: When handling binary data with {@link #setBlob(InputStream)}, you - * get your result with {@link #getBlobResult()}. - * </p> - * - * @return the mResult of the last {@link #call(String)} or - * {@link #callAsync(String)}. - * - * @see #reset() - * @see #clearResult() - * @see #getResultBundle() - * @see #getBlobResult() - */ - public String getResult() { - return mResult.getString(ret.RESULT.name()); - } - - /** - * Get the binary result - * - * <p> - * This gets your binary result. It only works if you called {@link #setBlob(InputStream)} before. - * - * If you did not call encrypt nor decrypt, this will be the same data as you inputed. - * </p> - * - * @return InputStream of the binary data which was en/decrypted - * - * @see #setBlob(InputStream) - * @see #getResult() - */ - public InputStream getBlobResult() { - if(mArgs.containsKey("BLOB")) { - ContentResolver cr = mContext.getContentResolver(); - InputStream in = null; - try { - in = cr.openInputStream(Uri.parse(mArgs.getString("BLOB"))); - } catch( Exception e ) { - Log.e(TAG, "Could not return blob in result", e); - } - return in; - } else { - return null; - } - } - - /** - * Get the result bundle - * - * <p> - * Unlike {@link #getResult()}, which only returns any en-/decrypted - * message, this function returns the complete information that was returned - * by Apg. This also includes the "RESULT", but additionally the warnings, - * errors and any other information. - * </p> - * <p> - * For warnings and errors it is suggested to use the functions that are - * provided here, namely {@link #getError()}, {@link #getNextError()}, - * {@link #get_next_Warning()} etc.), but if any call returns something non - * standard, you have access to the complete result bundle to extract the - * information. - * </p> - * - * @return the complete result bundle of the last call to apg - */ - public Bundle getResultBundle() { - return mResult; - } - - public error getConnectionStatus() { - return mConnectionStatus; - } - - /** - * Clears all unfetched errors - * - * @see #getNextError() - * @see #hasNextError() - */ - public void clearErrors() { - mErrorList.clear(); - mResult.remove(ret.ERROR.name()); - } - - /** - * Clears all unfetched warnings - * - * @see #getNextWarning() - * @see #hasNextWarning() - */ - public void clearWarnings() { - mWarningList.clear(); - } - - /** - * Clears the last mResult - * - * @see #getResult() - */ - public void clearResult() { - mResult.remove(ret.RESULT.name()); - } - - /** - * Set a callback listener when call to AIDL finishes - * - * @param obj - * a object to call back after async execution - * @see ApgConInterface - */ - public void setOnCallFinishListener(OnCallFinishListener lis) { - mOnCallFinishListener = lis; - } - - /** - * Clears any callback object - * - * @see #setOnCallFinishListener(OnCallFinishListener) - */ - public void clearOnCallFinishListener() { - mOnCallFinishListener = null; - } - - /** - * Checks if an async execution is running - * - * <p> - * If you started something with {@link #callAsync(String)}, this will - * return true if the task is still running - * </p> - * - * @return true, if an async task is still running, false otherwise - * - * @see #callAsync(String) - * - */ - public boolean isRunning() { - return mAsyncRunning; - } - - /** - * Completely resets your instance - * - * <p> - * This currently resets everything in this instance. Errors, warnings, - * results, callbacks, ... are removed. Any connection to the remote - * interface is upheld, though. - * </p> - * - * <p> - * Note when an async execution ({@link #callAsync(String)}) is - * running, it's result, warnings etc. will still be evaluated (which might - * be not what you want). Also mind that any callback you set is also - * reseted, so when finishing the execution any before defined callback will - * NOT BE TRIGGERED. - * </p> - */ - public void reset() { - clearErrors(); - clearWarnings(); - clearArgs(); - clearOnCallFinishListener(); - mResult.clear(); - } - -} diff --git a/org_apg/src/org/thialfihar/android/apg/deprecated/ApgConInterface.java b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgConInterface.java deleted file mode 100644 index 45eb3c5ef..000000000 --- a/org_apg/src/org/thialfihar/android/apg/deprecated/ApgConInterface.java +++ /dev/null @@ -1,21 +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.deprecated; - -public interface ApgConInterface { - public static interface OnCallFinishListener { - public abstract void onCallFinish(android.os.Bundle result); - } -} diff --git a/org_apg/src/org/thialfihar/android/apg/deprecated/ApgService2.java b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgService2.java deleted file mode 100644 index cbb033bed..000000000 --- a/org_apg/src/org/thialfihar/android/apg/deprecated/ApgService2.java +++ /dev/null @@ -1,673 +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.deprecated; -// -//import java.io.ByteArrayInputStream; -//import java.io.ByteArrayOutputStream; -//import java.io.IOException; -//import java.io.InputStream; -//import java.io.OutputStream; -//import java.lang.reflect.Method; -//import java.util.ArrayList; -//import java.util.HashMap; -//import java.util.HashSet; -//import java.util.Iterator; -// -//import org.thialfihar.android.apg.deprecated.IApgService2; -//import org.thialfihar.android.apg.Id; -//import org.thialfihar.android.apg.R; -//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.helper.PGPMain; -//import org.thialfihar.android.apg.helper.Preferences; -//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.PassphraseCacheService; -//import org.thialfihar.android.apg.util.InputData; -// -//import android.content.ContentResolver; -//import android.content.Intent; -//import android.database.Cursor; -//import android.database.sqlite.SQLiteQueryBuilder; -//import android.net.Uri; -//import android.os.Bundle; -//import android.os.IBinder; -//import org.thialfihar.android.apg.util.Log; -// -///** -// * ATTENTION: -// * -// * This is the old ApgService used as remote service over aidl interface. It will be reworked! -// * -// */ -//public class ApgService2 extends PassphraseCacheService { -// private final static String TAG = "ApgService"; -// public static final boolean LOCAL_LOGV = true; -// public static final boolean LOCAL_LOGD = true; -// -// @Override -// public IBinder onBind(Intent intent) { -// if (LOCAL_LOGD) -// Log.d(TAG, "bound"); -// return mBinder; -// } -// -// /** error status */ -// private static enum error { -// ARGUMENTS_MISSING, APG_FAILURE, NO_MATCHING_SECRET_KEY, PRIVATE_KEY_PASSPHRASE_WRONG, PRIVATE_KEY_PASSPHRASE_MISSING; -// -// public int shiftedOrdinal() { -// return ordinal() + 100; -// } -// } -// -// private static enum call { -// encrypt_with_passphrase, encrypt_with_public_key, decrypt, get_keys -// } -// -// /** all arguments that can be passed by calling application */ -// public static enum arg { -// MESSAGE, // message to encrypt or to decrypt -// SYMMETRIC_PASSPHRASE, // key for symmetric en/decryption -// PUBLIC_KEYS, // public keys for encryption -// ENCRYPTION_ALGORYTHM, // encryption algorithm -// HASH_ALGORYTHM, // hash algorithm -// ARMORED_OUTPUT, // whether to armor output -// FORCE_V3_SIGNATURE, // whether to force v3 signature -// COMPRESSION, // what compression to use for encrypted output -// SIGNATURE_KEY, // key for signing -// PRIVATE_KEY_PASSPHRASE, // passphrase for encrypted private key -// KEY_TYPE, // type of key (private or public) -// BLOB, // blob passed -// } -// -// /** all things that might be returned */ -// private static enum ret { -// ERRORS, // string array list with errors -// WARNINGS, // string array list with warnings -// ERROR, // numeric error -// RESULT, // en-/decrypted -// FINGERPRINTS, // fingerprints of keys -// USER_IDS, // user ids -// } -// -// /** required arguments for each AIDL function */ -// private static final HashMap<String, HashSet<arg>> FUNCTIONS_REQUIRED_ARGS = new HashMap<String, HashSet<arg>>(); -// static { -// HashSet<arg> args = new HashSet<arg>(); -// args.add(arg.SYMMETRIC_PASSPHRASE); -// FUNCTIONS_REQUIRED_ARGS.put(call.encrypt_with_passphrase.name(), args); -// -// args = new HashSet<arg>(); -// args.add(arg.PUBLIC_KEYS); -// FUNCTIONS_REQUIRED_ARGS.put(call.encrypt_with_public_key.name(), args); -// -// args = new HashSet<arg>(); -// FUNCTIONS_REQUIRED_ARGS.put(call.decrypt.name(), args); -// -// args = new HashSet<arg>(); -// args.add(arg.KEY_TYPE); -// FUNCTIONS_REQUIRED_ARGS.put(call.get_keys.name(), args); -// } -// -// /** optional arguments for each AIDL function */ -// private static final HashMap<String, HashSet<arg>> FUNCTIONS_OPTIONAL_ARGS = new HashMap<String, HashSet<arg>>(); -// static { -// HashSet<arg> args = new HashSet<arg>(); -// args.add(arg.ENCRYPTION_ALGORYTHM); -// args.add(arg.HASH_ALGORYTHM); -// args.add(arg.ARMORED_OUTPUT); -// args.add(arg.FORCE_V3_SIGNATURE); -// args.add(arg.COMPRESSION); -// args.add(arg.PRIVATE_KEY_PASSPHRASE); -// args.add(arg.SIGNATURE_KEY); -// args.add(arg.BLOB); -// args.add(arg.MESSAGE); -// FUNCTIONS_OPTIONAL_ARGS.put(call.encrypt_with_passphrase.name(), args); -// FUNCTIONS_OPTIONAL_ARGS.put(call.encrypt_with_public_key.name(), args); -// -// args = new HashSet<arg>(); -// args.add(arg.SYMMETRIC_PASSPHRASE); -// args.add(arg.PUBLIC_KEYS); -// args.add(arg.PRIVATE_KEY_PASSPHRASE); -// args.add(arg.MESSAGE); -// args.add(arg.BLOB); -// FUNCTIONS_OPTIONAL_ARGS.put(call.decrypt.name(), args); -// } -// -// /** a map from ApgService parameters to function calls to get the default */ -// private static final HashMap<arg, String> FUNCTIONS_DEFAULTS = new HashMap<arg, String>(); -// static { -// FUNCTIONS_DEFAULTS.put(arg.ENCRYPTION_ALGORYTHM, "getDefaultEncryptionAlgorithm"); -// FUNCTIONS_DEFAULTS.put(arg.HASH_ALGORYTHM, "getDefaultHashAlgorithm"); -// FUNCTIONS_DEFAULTS.put(arg.ARMORED_OUTPUT, "getDefaultAsciiArmour"); -// FUNCTIONS_DEFAULTS.put(arg.FORCE_V3_SIGNATURE, "getForceV3Signatures"); -// FUNCTIONS_DEFAULTS.put(arg.COMPRESSION, "getDefaultMessageCompression"); -// } -// -// /** a map of the default function names to their method */ -// private static final HashMap<String, Method> FUNCTIONS_DEFAULTS_METHODS = new HashMap<String, Method>(); -// static { -// try { -// FUNCTIONS_DEFAULTS_METHODS.put("getDefaultEncryptionAlgorithm", -// Preferences.class.getMethod("getDefaultEncryptionAlgorithm")); -// FUNCTIONS_DEFAULTS_METHODS.put("getDefaultHashAlgorithm", -// Preferences.class.getMethod("getDefaultHashAlgorithm")); -// FUNCTIONS_DEFAULTS_METHODS.put("getDefaultAsciiArmour", -// Preferences.class.getMethod("getDefaultAsciiArmour")); -// FUNCTIONS_DEFAULTS_METHODS.put("getForceV3Signatures", -// Preferences.class.getMethod("getForceV3Signatures")); -// FUNCTIONS_DEFAULTS_METHODS.put("getDefaultMessageCompression", -// Preferences.class.getMethod("getDefaultMessageCompression")); -// } catch (Exception e) { -// Log.e(TAG, "Function method exception: " + e.getMessage()); -// } -// } -// -// private static void writeToOutputStream(InputStream is, OutputStream os) throws IOException { -// byte[] buffer = new byte[8]; -// int len = 0; -// while ((len = is.read(buffer)) != -1) { -// os.write(buffer, 0, len); -// } -// } -// -// private static Cursor getKeyEntries(HashMap<String, Object> pParams) { -// SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); -// qb.setTables(KeyRings.TABLE_NAME + " INNER JOIN " + Keys.TABLE_NAME + " ON " + "(" -// + KeyRings.TABLE_NAME + "." + KeyRings._ID + " = " + Keys.TABLE_NAME + "." -// + Keys.KEY_RING_ID + " AND " + Keys.TABLE_NAME + "." + Keys.IS_MASTER_KEY -// + " = '1'" + ") " + " INNER JOIN " + UserIds.TABLE_NAME + " ON " + "(" -// + Keys.TABLE_NAME + "." + Keys._ID + " = " + UserIds.TABLE_NAME + "." -// + UserIds.KEY_ID + " AND " + UserIds.TABLE_NAME + "." + UserIds.RANK + " = '0') "); -// -// String orderBy = pParams.containsKey("order_by") ? (String) pParams.get("order_by") -// : UserIds.TABLE_NAME + "." + UserIds.USER_ID + " ASC"; -// -// String typeVal[] = null; -// String typeWhere = null; -// if (pParams.containsKey("key_type")) { -// typeWhere = KeyRings.TABLE_NAME + "." + KeyRings.TYPE + " = ?"; -// typeVal = new String[] { "" + pParams.get("key_type") }; -// } -// return qb.query(PGPMain.getDatabase().db(), (String[]) pParams.get("columns"), typeWhere, -// typeVal, null, null, orderBy); -// } -// -// /** -// * maps a fingerprint or user id of a key to a master key in database -// * -// * @param search_key -// * fingerprint or user id to search for -// * @return master key if found, or 0 -// */ -// private static long getMasterKey(String pSearchKey, Bundle pReturn) { -// if (pSearchKey == null || pSearchKey.length() != 8) { -// return 0; -// } -// ArrayList<String> keyList = new ArrayList<String>(); -// keyList.add(pSearchKey); -// long[] keys = getMasterKey(keyList, pReturn); -// if (keys.length > 0) { -// return keys[0]; -// } else { -// return 0; -// } -// } -// -// /** -// * maps fingerprints or user ids of keys to master keys in database -// * -// * @param search_keys -// * a list of keys (fingerprints or user ids) to look for in database -// * @return an array of master keys -// */ -// private static long[] getMasterKey(ArrayList<String> pSearchKeys, Bundle pReturn) { -// -// HashMap<String, Object> qParams = new HashMap<String, Object>(); -// qParams.put("columns", new String[] { KeyRings.TABLE_NAME + "." + KeyRings.MASTER_KEY_ID, // 0 -// UserIds.TABLE_NAME + "." + UserIds.USER_ID, // 1 -// }); -// qParams.put("key_type", Id.database.type_public); -// -// Cursor mCursor = getKeyEntries(qParams); -// -// if (LOCAL_LOGV) -// Log.v(TAG, "going through installed user keys"); -// ArrayList<Long> masterKeys = new ArrayList<Long>(); -// while (mCursor.moveToNext()) { -// long curMkey = mCursor.getLong(0); -// String curUser = mCursor.getString(1); -// -// String curFprint = PGPHelper.getSmallFingerPrint(curMkey); -// if (LOCAL_LOGV) -// Log.v(TAG, "current user: " + curUser + " (" + curFprint + ")"); -// if (pSearchKeys.contains(curFprint) || pSearchKeys.contains(curUser)) { -// if (LOCAL_LOGV) -// Log.v(TAG, "master key found for: " + curFprint); -// masterKeys.add(curMkey); -// pSearchKeys.remove(curFprint); -// } else { -// if (LOCAL_LOGV) -// Log.v(TAG, "Installed key " + curFprint -// + " is not in the list of public keys to encrypt with"); -// } -// } -// mCursor.close(); -// -// long[] masterKeyLongs = new long[masterKeys.size()]; -// int i = 0; -// for (Long key : masterKeys) { -// masterKeyLongs[i++] = key; -// } -// -// if (i == 0) { -// Log.w(TAG, "Found not one public key"); -// pReturn.getStringArrayList(ret.WARNINGS.name()).add( -// "Searched for public key(s) but found not one"); -// } -// -// for (String key : pSearchKeys) { -// Log.w(TAG, "Searched for key " + key + " but cannot find it in APG"); -// pReturn.getStringArrayList(ret.WARNINGS.name()).add( -// "Searched for key " + key + " but cannot find it in APG"); -// } -// -// return masterKeyLongs; -// } -// -// /** -// * Add default arguments if missing -// * -// * @param args -// * the bundle to add default parameters to if missing -// */ -// private void addDefaultArguments(String pCall, Bundle pArgs) { -// // check whether there are optional elements defined for that call -// if (FUNCTIONS_OPTIONAL_ARGS.containsKey(pCall)) { -// Preferences preferences = Preferences.getPreferences(getBaseContext(), true); -// -// Iterator<arg> iter = FUNCTIONS_DEFAULTS.keySet().iterator(); -// while (iter.hasNext()) { -// arg currentArg = iter.next(); -// String currentKey = currentArg.name(); -// if (!pArgs.containsKey(currentKey) -// && FUNCTIONS_OPTIONAL_ARGS.get(pCall).contains(currentArg)) { -// String currentFunctionName = FUNCTIONS_DEFAULTS.get(currentArg); -// try { -// Class<?> returnType = FUNCTIONS_DEFAULTS_METHODS.get(currentFunctionName) -// .getReturnType(); -// if (returnType == String.class) { -// pArgs.putString(currentKey, -// (String) FUNCTIONS_DEFAULTS_METHODS.get(currentFunctionName) -// .invoke(preferences)); -// } else if (returnType == boolean.class) { -// pArgs.putBoolean(currentKey, -// (Boolean) FUNCTIONS_DEFAULTS_METHODS.get(currentFunctionName) -// .invoke(preferences)); -// } else if (returnType == int.class) { -// pArgs.putInt(currentKey, -// (Integer) FUNCTIONS_DEFAULTS_METHODS.get(currentFunctionName) -// .invoke(preferences)); -// } else { -// Log.e(TAG, "Unknown return type " + returnType.toString() -// + " for default option"); -// } -// } catch (Exception e) { -// Log.e(TAG, "Exception in add_default_arguments " + e.getMessage()); -// } -// } -// } -// } -// } -// -// /** -// * updates a Bundle with default return values -// * -// * @param pReturn -// * the Bundle to update -// */ -// private void addDefaultReturns(Bundle pReturn) { -// ArrayList<String> errors = new ArrayList<String>(); -// ArrayList<String> warnings = new ArrayList<String>(); -// -// pReturn.putStringArrayList(ret.ERRORS.name(), errors); -// pReturn.putStringArrayList(ret.WARNINGS.name(), warnings); -// } -// -// /** -// * checks for required arguments and adds them to the error if missing -// * -// * @param function -// * the functions required arguments to check for -// * @param pArgs -// * the Bundle of arguments to check -// * @param pReturn -// * the bundle to write errors to -// */ -// private void checkForRequiredArgs(String pFunction, Bundle pArgs, Bundle pReturn) { -// if (FUNCTIONS_REQUIRED_ARGS.containsKey(pFunction)) { -// Iterator<arg> iter = FUNCTIONS_REQUIRED_ARGS.get(pFunction).iterator(); -// while (iter.hasNext()) { -// String curArg = iter.next().name(); -// if (!pArgs.containsKey(curArg)) { -// pReturn.getStringArrayList(ret.ERRORS.name()) -// .add("Argument missing: " + curArg); -// } -// } -// } -// -// if (pFunction.equals(call.encrypt_with_passphrase.name()) -// || pFunction.equals(call.encrypt_with_public_key.name()) -// || pFunction.equals(call.decrypt.name())) { -// // check that either MESSAGE or BLOB are there -// if (!pArgs.containsKey(arg.MESSAGE.name()) && !pArgs.containsKey(arg.BLOB.name())) { -// pReturn.getStringArrayList(ret.ERRORS.name()).add( -// "Arguments missing: Neither MESSAGE nor BLOG found"); -// } -// -// } -// } -// -// /** -// * checks for unknown arguments and add them to warning if found -// * -// * @param function -// * the functions name to check against -// * @param pArgs -// * the Bundle of arguments to check -// * @param pReturn -// * the bundle to write warnings to -// */ -// private void checkForUnknownArgs(String pFunction, Bundle pArgs, Bundle pReturn) { -// -// HashSet<arg> allArgs = new HashSet<arg>(); -// if (FUNCTIONS_REQUIRED_ARGS.containsKey(pFunction)) { -// allArgs.addAll(FUNCTIONS_REQUIRED_ARGS.get(pFunction)); -// } -// if (FUNCTIONS_OPTIONAL_ARGS.containsKey(pFunction)) { -// allArgs.addAll(FUNCTIONS_OPTIONAL_ARGS.get(pFunction)); -// } -// -// ArrayList<String> unknownArgs = new ArrayList<String>(); -// Iterator<String> iter = pArgs.keySet().iterator(); -// while (iter.hasNext()) { -// String curKey = iter.next(); -// try { -// arg curArg = arg.valueOf(curKey); -// if (!allArgs.contains(curArg)) { -// pReturn.getStringArrayList(ret.WARNINGS.name()).add( -// "Unknown argument: " + curKey); -// unknownArgs.add(curKey); -// } -// } catch (Exception e) { -// pReturn.getStringArrayList(ret.WARNINGS.name()).add("Unknown argument: " + curKey); -// unknownArgs.add(curKey); -// } -// } -// -// // remove unknown arguments so our bundle has just what we need -// for (String arg : unknownArgs) { -// pArgs.remove(arg); -// } -// } -// -// private boolean prepareArgs(String pCall, Bundle pArgs, Bundle pReturn) { -// // PGPMain.initialize(getBaseContext()); -// -// /* add default return values for all functions */ -// addDefaultReturns(pReturn); -// -// /* add default arguments if missing */ -// addDefaultArguments(pCall, pArgs); -// if (LOCAL_LOGV) -// Log.v(TAG, "add_default_arguments"); -// -// /* check for required arguments */ -// checkForRequiredArgs(pCall, pArgs, pReturn); -// if (LOCAL_LOGV) -// Log.v(TAG, "check_required_args"); -// -// /* check for unknown arguments and add to warning if found */ -// checkForUnknownArgs(pCall, pArgs, pReturn); -// if (LOCAL_LOGV) -// Log.v(TAG, "check_unknown_args"); -// -// /* return if errors happened */ -// if (pReturn.getStringArrayList(ret.ERRORS.name()).size() != 0) { -// if (LOCAL_LOGV) -// Log.v(TAG, "Errors after preparing, not executing " + pCall); -// pReturn.putInt(ret.ERROR.name(), error.ARGUMENTS_MISSING.shiftedOrdinal()); -// return false; -// } -// if (LOCAL_LOGV) -// Log.v(TAG, "error return"); -// -// return true; -// } -// -// private boolean encrypt(Bundle pArgs, Bundle pReturn) { -// boolean isBlob = pArgs.containsKey(arg.BLOB.name()); -// -// long pubMasterKeys[] = {}; -// if (pArgs.containsKey(arg.PUBLIC_KEYS.name())) { -// ArrayList<String> list = pArgs.getStringArrayList(arg.PUBLIC_KEYS.name()); -// ArrayList<String> pubKeys = new ArrayList<String>(); -// if (LOCAL_LOGV) -// Log.v(TAG, "Long size: " + list.size()); -// Iterator<String> iter = list.iterator(); -// while (iter.hasNext()) { -// pubKeys.add(iter.next()); -// } -// pubMasterKeys = getMasterKey(pubKeys, pReturn); -// } -// -// InputStream inStream = null; -// if (isBlob) { -// ContentResolver cr = getContentResolver(); -// try { -// inStream = cr.openInputStream(Uri.parse(pArgs.getString(arg.BLOB.name()))); -// } catch (Exception e) { -// Log.e(TAG, "... exception on opening blob", e); -// } -// } else { -// inStream = new ByteArrayInputStream(pArgs.getString(arg.MESSAGE.name()).getBytes()); -// } -// InputData in = new InputData(inStream, 0); // XXX Size second param? -// -// OutputStream out = new ByteArrayOutputStream(); -// if (LOCAL_LOGV) -// Log.v(TAG, "About to encrypt"); -// try { -// PGPMain.encrypt(getBaseContext(), // context -// in, // input stream -// out, // output stream -// pArgs.getBoolean(arg.ARMORED_OUTPUT.name()), // ARMORED_OUTPUT -// pubMasterKeys, // encryption keys -// getMasterKey(pArgs.getString(arg.SIGNATURE_KEY.name()), pReturn), // signature -// // key -// pArgs.getString(arg.PRIVATE_KEY_PASSPHRASE.name()), // signature passphrase -// null, // progress -// pArgs.getInt(arg.ENCRYPTION_ALGORYTHM.name()), // encryption -// pArgs.getInt(arg.HASH_ALGORYTHM.name()), // hash -// pArgs.getInt(arg.COMPRESSION.name()), // compression -// pArgs.getBoolean(arg.FORCE_V3_SIGNATURE.name()), // mPreferences.getForceV3Signatures(), -// pArgs.getString(arg.SYMMETRIC_PASSPHRASE.name()) // passPhrase -// ); -// } catch (Exception e) { -// Log.e(TAG, "Exception in encrypt"); -// String msg = e.getMessage(); -// if (msg.equals(getBaseContext().getString(R.string.error_noSignaturePassPhrase))) { -// pReturn.getStringArrayList(ret.ERRORS.name()).add( -// "Cannot encrypt (" + arg.PRIVATE_KEY_PASSPHRASE.name() + " missing): " -// + msg); -// pReturn.putInt(ret.ERROR.name(), -// error.PRIVATE_KEY_PASSPHRASE_MISSING.shiftedOrdinal()); -// } else if (msg.equals(getBaseContext().getString( -// R.string.error_couldNotExtractPrivateKey))) { -// pReturn.getStringArrayList(ret.ERRORS.name()).add( -// "Cannot encrypt (" + arg.PRIVATE_KEY_PASSPHRASE.name() -// + " probably wrong): " + msg); -// pReturn.putInt(ret.ERROR.name(), -// error.PRIVATE_KEY_PASSPHRASE_WRONG.shiftedOrdinal()); -// } else { -// pReturn.getStringArrayList(ret.ERRORS.name()).add( -// "Internal failure (" + e.getClass() + ") in APG when encrypting: " -// + e.getMessage()); -// pReturn.putInt(ret.ERROR.name(), error.APG_FAILURE.shiftedOrdinal()); -// } -// return false; -// } -// if (LOCAL_LOGV) -// Log.v(TAG, "Encrypted"); -// if (isBlob) { -// ContentResolver cr = getContentResolver(); -// try { -// OutputStream outStream = cr.openOutputStream(Uri.parse(pArgs.getString(arg.BLOB -// .name()))); -// writeToOutputStream(new ByteArrayInputStream(out.toString().getBytes()), outStream); -// outStream.close(); -// } catch (Exception e) { -// Log.e(TAG, "... exception on writing blob", e); -// } -// } else { -// pReturn.putString(ret.RESULT.name(), out.toString()); -// } -// return true; -// } -// -// private final IApgService2.Stub mBinder = new IApgService2.Stub() { -// -// public boolean getKeys(Bundle pArgs, Bundle pReturn) { -// -// prepareArgs("get_keys", pArgs, pReturn); -// -// HashMap<String, Object> qParams = new HashMap<String, Object>(); -// qParams.put("columns", new String[] { -// KeyRings.TABLE_NAME + "." + KeyRings.MASTER_KEY_ID, // 0 -// UserIds.TABLE_NAME + "." + UserIds.USER_ID, // 1 -// }); -// -// qParams.put("key_type", pArgs.getInt(arg.KEY_TYPE.name())); -// -// Cursor cursor = getKeyEntries(qParams); -// ArrayList<String> fPrints = new ArrayList<String>(); -// ArrayList<String> ids = new ArrayList<String>(); -// while (cursor.moveToNext()) { -// if (LOCAL_LOGV) -// Log.v(TAG, "adding key " + PGPHelper.getSmallFingerPrint(cursor.getLong(0))); -// fPrints.add(PGPHelper.getSmallFingerPrint(cursor.getLong(0))); -// ids.add(cursor.getString(1)); -// } -// cursor.close(); -// -// pReturn.putStringArrayList(ret.FINGERPRINTS.name(), fPrints); -// pReturn.putStringArrayList(ret.USER_IDS.name(), ids); -// return true; -// } -// -// public boolean encryptWithPublicKey(Bundle pArgs, Bundle pReturn) { -// if (!prepareArgs("encrypt_with_public_key", pArgs, pReturn)) { -// return false; -// } -// -// return encrypt(pArgs, pReturn); -// } -// -// public boolean encryptWithPassphrase(Bundle pArgs, Bundle pReturn) { -// if (!prepareArgs("encrypt_with_passphrase", pArgs, pReturn)) { -// return false; -// } -// -// return encrypt(pArgs, pReturn); -// -// } -// -// public boolean decrypt(Bundle pArgs, Bundle pReturn) { -// if (!prepareArgs("decrypt", pArgs, pReturn)) { -// return false; -// } -// -// boolean isBlob = pArgs.containsKey(arg.BLOB.name()); -// -// String passphrase = pArgs.getString(arg.SYMMETRIC_PASSPHRASE.name()) != null ? pArgs -// .getString(arg.SYMMETRIC_PASSPHRASE.name()) : pArgs -// .getString(arg.PRIVATE_KEY_PASSPHRASE.name()); -// -// InputStream inStream = null; -// if (isBlob) { -// ContentResolver cr = getContentResolver(); -// try { -// inStream = cr.openInputStream(Uri.parse(pArgs.getString(arg.BLOB.name()))); -// } catch (Exception e) { -// Log.e(TAG, "... exception on opening blob", e); -// } -// } else { -// inStream = new ByteArrayInputStream(pArgs.getString(arg.MESSAGE.name()).getBytes()); -// } -// -// InputData in = new InputData(inStream, 0); // XXX what size in second parameter? -// OutputStream out = new ByteArrayOutputStream(); -// if (LOCAL_LOGV) -// Log.v(TAG, "About to decrypt"); -// try { -// PGPMain.decrypt(getBaseContext(), in, out, passphrase, null, // progress -// pArgs.getString(arg.SYMMETRIC_PASSPHRASE.name()) != null // symmetric -// ); -// } catch (Exception e) { -// Log.e(TAG, "Exception in decrypt"); -// String msg = e.getMessage(); -// if (msg.equals(getBaseContext().getString(R.string.error_noSecretKeyFound))) { -// pReturn.getStringArrayList(ret.ERRORS.name()).add("Cannot decrypt: " + msg); -// pReturn.putInt(ret.ERROR.name(), error.NO_MATCHING_SECRET_KEY.shiftedOrdinal()); -// } else if (msg.equals(getBaseContext().getString(R.string.error_wrongPassPhrase))) { -// pReturn.getStringArrayList(ret.ERRORS.name()).add( -// "Cannot decrypt (" + arg.PRIVATE_KEY_PASSPHRASE.name() -// + " wrong/missing): " + msg); -// pReturn.putInt(ret.ERROR.name(), -// error.PRIVATE_KEY_PASSPHRASE_WRONG.shiftedOrdinal()); -// } else { -// pReturn.getStringArrayList(ret.ERRORS.name()).add( -// "Internal failure (" + e.getClass() + ") in APG when decrypting: " -// + msg); -// pReturn.putInt(ret.ERROR.name(), error.APG_FAILURE.shiftedOrdinal()); -// } -// return false; -// } -// if (LOCAL_LOGV) -// Log.v(TAG, "... decrypted"); -// -// if (isBlob) { -// ContentResolver cr = getContentResolver(); -// try { -// OutputStream outStream = cr.openOutputStream(Uri.parse(pArgs.getString(arg.BLOB -// .name()))); -// writeToOutputStream(new ByteArrayInputStream(out.toString().getBytes()), -// outStream); -// outStream.close(); -// } catch (Exception e) { -// Log.e(TAG, "... exception on writing blob", e); -// } -// } else { -// pReturn.putString(ret.RESULT.name(), out.toString()); -// } -// return true; -// } -// -// }; -//} diff --git a/org_apg/src/org/thialfihar/android/apg/deprecated/ApgServiceBlobDatabase.java b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgServiceBlobDatabase.java deleted file mode 100644 index 30d9ea778..000000000 --- a/org_apg/src/org/thialfihar/android/apg/deprecated/ApgServiceBlobDatabase.java +++ /dev/null @@ -1,71 +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.deprecated; -// -// -//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 org.thialfihar.android.apg.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/deprecated/ApgServiceBlobProvider.java b/org_apg/src/org/thialfihar/android/apg/deprecated/ApgServiceBlobProvider.java deleted file mode 100644 index 9d117ac74..000000000 --- a/org_apg/src/org/thialfihar/android/apg/deprecated/ApgServiceBlobProvider.java +++ /dev/null @@ -1,151 +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.deprecated; -// -//import org.thialfihar.android.apg.Constants; -// -//import android.content.ContentProvider; -//import android.content.ContentValues; -//import android.database.Cursor; -//import android.net.Uri; -//import android.os.ParcelFileDescriptor; -//import org.thialfihar.android.apg.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/deprecated/BlobContract.java b/org_apg/src/org/thialfihar/android/apg/deprecated/BlobContract.java deleted file mode 100644 index 0d720dabb..000000000 --- a/org_apg/src/org/thialfihar/android/apg/deprecated/BlobContract.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.thialfihar.android.apg.deprecated; -//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() { -// } -//} diff --git a/org_apg/src/org/thialfihar/android/apg/deprecated/IApgService2.aidl b/org_apg/src/org/thialfihar/android/apg/deprecated/IApgService2.aidl deleted file mode 100644 index 8b8a35bf3..000000000 --- a/org_apg/src/org/thialfihar/android/apg/deprecated/IApgService2.aidl +++ /dev/null @@ -1,125 +0,0 @@ -package org.thialfihar.android.apg.deprecated; - -interface IApgService2 { - - /* All functions fill the returnVals Bundle with the following keys: - * - * ArrayList<String> "WARNINGS" = Warnings, if any - * ArrayList<String> "ERRORS" = Human readable error descriptions, if any - * int "ERROR" = Numeric representation of error, if any - * starting with 100: - * 100: Required argument missing - * 101: Generic failure of APG - * 102: No matching private key found - * 103: Private key's passphrase wrong - * 104: Private key's passphrase missing - */ - - /* ******************************************************** - * Encryption - * ********************************************************/ - - /* All encryption function's arguments - * - * Bundle params' keys: - * (optional/required) - * TYPE "STRING KEY" = EXPLANATION / VALUES - * - * (required) - * String "MESSAGE" = Message to encrypt - * OR - * String "BLOB" = ContentUri to a file handle - * with binary data to encrypt - * (Attention: file will be overwritten - * with encrypted content!) - * - * (optional) - * int "ENCRYPTION_ALGORYTHM" = Encryption Algorithm - * 7: AES-128, 8: AES-192, 9: AES-256, - * 4: Blowfish, 10: Twofish, 3: CAST5, - * 6: DES, 2: Triple DES, 1: IDEA - * (optional) - * int "HASH_ALGORYTHM" = Hash Algorithm - * 1: MD5, 3: RIPEMD-160, 2: SHA-1, - * 11: SHA-224, 8: SHA-256, 9: SHA-384, - * 10: SHA-512 - * (optional) - * Boolean "ARMORED_OUTPUT" = Armor output - * - * (optional) - * Boolean "FORCE_V3_SIGNATURE" = Force V3 Signatures - * - * (optional) - * int "COMPRESSION" = Compression to use - * 0x21070001: none, 1: Zip, 2: Zlib, - * 3: BZip2 - * (optional) - * String "SIGNATURE_KEY" = Key to sign with - * - * (optional) - * String "PRIVATE_KEY_PASSPHRASE" = Passphrase for signing key - * - * Bundle returnVals (in addition to the ERRORS/WARNINGS above): - * If "MESSAGE" was set: - * String "RESULT" = Encrypted message - */ - - /* Additional argument for function below: - * (required) - * String "SYMMETRIC_PASSPHRASE" = Symmetric passphrase to use - */ - boolean encryptWithPassphrase(in Bundle params, out Bundle returnVals); - - /* Additional argument: - * (required) - * ArrayList<String> "PUBLIC_KEYS" = Public keys (8char fingerprint "123ABC12" OR - * complete id "Alice Meyer <ab@email.com>") - */ - boolean encryptWithPublicKey(in Bundle params, out Bundle returnVals); - - /* ******************************************************** - * Decryption - * ********************************************************/ - - /* Bundle params: - * (required) - * String "MESSAGE" = Message to dencrypt - * OR - * String "BLOB" = ContentUri to a file handle - * with binary data to dencrypt - * (Attention: file will be overwritten - * with dencrypted content!) - * - * (optional) - * String "SYMMETRIC_PASSPHRASE" = Symmetric passphrase for decryption - * - * (optional) - * String "PRIVATE_KEY_PASSPHRASE" = Private keys's passphrase on asymmetric encryption - * - * Bundle return_vals: - * If "MESSAGE" was set: - * String "RESULT" = Decrypted message - */ - boolean decrypt(in Bundle params, out Bundle returnVals); - - /* ******************************************************** - * Get key information - * ********************************************************/ - - /* Get info about all available keys - * - * Bundle params: - * (required) - * int "KEY_TYPE" = info about what type of keys to return - * 0: public keys - * 1: private keys - * - * Returns: - * StringArrayList "FINGERPRINTS" = Short fingerprints of keys - * - * StringArrayList "USER_IDS" = User ids of corresponding fingerprints - * (order is the same as in FINGERPRINTS) - */ - boolean getKeys(in Bundle params, out Bundle returnVals); - -}
\ No newline at end of file diff --git a/org_apg/src/org/thialfihar/android/apg/helper/FileHelper.java b/org_apg/src/org/thialfihar/android/apg/helper/FileHelper.java index 9f8b3ca8c..7d3185d86 100644 --- a/org_apg/src/org/thialfihar/android/apg/helper/FileHelper.java +++ b/org_apg/src/org/thialfihar/android/apg/helper/FileHelper.java @@ -1,3 +1,19 @@ +/* + * 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 org.thialfihar.android.apg.R; diff --git a/org_apg/src/org/thialfihar/android/apg/helper/OtherHelper.java b/org_apg/src/org/thialfihar/android/apg/helper/OtherHelper.java index 07fcad33e..531ae20fb 100644 --- a/org_apg/src/org/thialfihar/android/apg/helper/OtherHelper.java +++ b/org_apg/src/org/thialfihar/android/apg/helper/OtherHelper.java @@ -16,8 +16,6 @@ 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; diff --git a/org_apg/src/org/thialfihar/android/apg/helper/PGPConversionHelper.java b/org_apg/src/org/thialfihar/android/apg/helper/PGPConversionHelper.java index e83170fbe..040ff2a9e 100644 --- a/org_apg/src/org/thialfihar/android/apg/helper/PGPConversionHelper.java +++ b/org_apg/src/org/thialfihar/android/apg/helper/PGPConversionHelper.java @@ -23,7 +23,6 @@ import java.util.Iterator; import org.spongycastle.openpgp.PGPKeyRing; import org.spongycastle.openpgp.PGPObjectFactory; -import org.spongycastle.openpgp.PGPPublicKeyRing; import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKeyRing; import org.thialfihar.android.apg.Constants; @@ -31,49 +30,9 @@ import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.util.Log; public class PGPConversionHelper { - /** - * Converts Vector<PGPSecretKey> to a byte[] - * - * @param keys - * @return - */ - public static byte[] PGPSecretKeyListToBytes(ArrayList<PGPSecretKey> keys) { - ByteArrayOutputStream os = new ByteArrayOutputStream(); - for (PGPSecretKey key : keys) { - try { - key.encode(os); - } catch (IOException e) { - Log.e(Constants.TAG, "Error while converting PGPSecretKey to byte[]!", e); - } - } - - byte[] keysBytes = os.toByteArray(); - - return keysBytes; - } /** - * Convert from byte[] to PGPSecretKeyRing - * - * @param keysBytes - * @return - */ - // public static PGPSecretKeyRing BytesToPGPSecretKeyRing(byte[] keysBytes) { - // PGPObjectFactory factory = new PGPObjectFactory(keysBytes); - // PGPSecretKeyRing keyRing = null; - // try { - // if ((keyRing = (PGPSecretKeyRing) factory.nextObject()) == null) { - // Log.e(Constants.TAG, "No keys given!"); - // } - // } catch (IOException e) { - // Log.e(Constants.TAG, "Error while converting to PGPSecretKeyRing!", e); - // } - // - // return keyRing; - // } - - /** - * Convert from byte[] to PGPPublicKeyRing + * Convert from byte[] to PGPKeyRing * * @param keysBytes * @return @@ -86,7 +45,7 @@ public class PGPConversionHelper { Log.e(Constants.TAG, "No keys given!"); } } catch (IOException e) { - Log.e(Constants.TAG, "Error while converting to PGPPublicKeyRing!", e); + Log.e(Constants.TAG, "Error while converting to PGPKeyRing!", e); } return keyRing; @@ -114,6 +73,8 @@ public class PGPConversionHelper { /** * Convert from byte[] to PGPSecretKey * + * Singles keys are encoded as keyRings with one single key in it by Bouncy Castle + * * @param keysBytes * @return */ @@ -124,6 +85,25 @@ public class PGPConversionHelper { } /** + * Convert from ArrayList<PGPSecretKey> to byte[] + * + * @param keys + * @return + */ + public static byte[] PGPSecretKeyArrayListToBytes(ArrayList<PGPSecretKey> keys) { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + for (PGPSecretKey key : keys) { + try { + key.encode(os); + } catch (IOException e) { + Log.e(Constants.TAG, "Error while converting ArrayList<PGPSecretKey> to byte[]!", e); + } + } + + return os.toByteArray(); + } + + /** * Convert from PGPSecretKey to byte[] * * @param keysBytes diff --git a/org_apg/src/org/thialfihar/android/apg/helper/PGPMain.java b/org_apg/src/org/thialfihar/android/apg/helper/PGPMain.java index adccaf038..db9305ffa 100644 --- a/org_apg/src/org/thialfihar/android/apg/helper/PGPMain.java +++ b/org_apg/src/org/thialfihar/android/apg/helper/PGPMain.java @@ -707,8 +707,7 @@ public class PGPMain { } if (signatureKeyId != Id.key.none) { - signingKeyRing = ProviderHelper.getPGPSecretKeyRingByKeyId(context, - signatureKeyId); + signingKeyRing = ProviderHelper.getPGPSecretKeyRingByKeyId(context, signatureKeyId); signingKey = PGPHelper.getSigningKey(context, signatureKeyId); if (signingKey == null) { throw new ApgGeneralException(context.getString(R.string.error_signatureFailed)); @@ -718,8 +717,9 @@ public class PGPMain { throw new ApgGeneralException( context.getString(R.string.error_noSignaturePassPhrase)); } - if (progress != null) - progress.setProgress(R.string.progress_extractingSignatureKey, 0, 100); + + updateProgress(progress, R.string.progress_extractingSignatureKey, 0, 100); + PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider( BOUNCY_CASTLE_PROVIDER_NAME).build(signaturePassphrase.toCharArray()); signaturePrivateKey = signingKey.extractPrivateKey(keyDecryptor); @@ -762,8 +762,7 @@ public class PGPMain { PGPV3SignatureGenerator signatureV3Generator = null; if (signatureKeyId != Id.key.none) { - if (progress != null) - progress.setProgress(R.string.progress_preparingSignature, 10, 100); + updateProgress(progress, R.string.progress_preparingSignature, 10, 100); // content signer based on signing key algorithm and choosen hash algorithm JcaPGPContentSignerBuilder contentSignerBuilder = new JcaPGPContentSignerBuilder( @@ -1079,8 +1078,7 @@ public class PGPMain { if (passphrase == null || passphrase.length() <= 0) { throw new ApgGeneralException("Unable to obtain passphrase"); } else { - PGPPublicKeyRing pubring = ProviderHelper.getPGPPublicKeyRingByKeyId(context, - pubKeyId); + PGPPublicKeyRing pubring = ProviderHelper.getPGPPublicKeyRingByKeyId(context, pubKeyId); PGPSecretKey signingKey = PGPHelper.getSigningKey(context, masterKeyId); if (signingKey == null) { @@ -1199,7 +1197,7 @@ public class PGPMain { if (passphrase == null) { passphrase = ""; } - + Bundle returnData = new Bundle(); InputStream in = PGPUtil.getDecoderStream(data.getInputStream()); PGPObjectFactory pgpF = new PGPObjectFactory(in); @@ -1505,8 +1503,8 @@ public class PGPMain { } else { signatureKeyId = signature.getKeyID(); String userId = null; - PGPPublicKeyRing signKeyRing = ProviderHelper.getPGPPublicKeyRingByKeyId( - context, signatureKeyId); + PGPPublicKeyRing signKeyRing = ProviderHelper.getPGPPublicKeyRingByKeyId(context, + signatureKeyId); if (signKeyRing != null) { userId = PGPHelper.getMainUserId(PGPHelper.getMasterKey(signKeyRing)); } diff --git a/org_apg/src/org/thialfihar/android/apg/provider/ApgProvider.java b/org_apg/src/org/thialfihar/android/apg/provider/ApgProvider.java index ad0bd4a41..8e93365b7 100644 --- a/org_apg/src/org/thialfihar/android/apg/provider/ApgProvider.java +++ b/org_apg/src/org/thialfihar/android/apg/provider/ApgProvider.java @@ -35,7 +35,6 @@ import org.thialfihar.android.apg.util.Log; import android.content.ContentProvider; import android.content.ContentValues; -import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.DatabaseUtils; @@ -199,8 +198,7 @@ public class ApgProvider extends ContentProvider { /** {@inheritDoc} */ @Override public boolean onCreate() { - final Context context = getContext(); - mApgDatabase = new ApgDatabase(context); + mApgDatabase = new ApgDatabase(getContext()); return true; } @@ -315,6 +313,7 @@ public class ApgProvider extends ContentProvider { } /** {@inheritDoc} */ + @SuppressWarnings("deprecation") @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { diff --git a/org_apg/src/org/thialfihar/android/apg/provider/ApgServiceBlobContract.java b/org_apg/src/org/thialfihar/android/apg/provider/ApgServiceBlobContract.java new file mode 100644 index 000000000..5bf1dd329 --- /dev/null +++ b/org_apg/src/org/thialfihar/android/apg/provider/ApgServiceBlobContract.java @@ -0,0 +1,40 @@ +/* + * 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.provider; + +import org.thialfihar.android.apg.Constants; + +import android.net.Uri; +import android.provider.BaseColumns; + +public class ApgServiceBlobContract { + + interface BlobsColumns { + String KEY = "key"; + } + + public static final String CONTENT_AUTHORITY = Constants.PACKAGE_NAME + ".blobs"; + + private static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY); + + public static class Blobs implements BlobsColumns, BaseColumns { + public static final Uri CONTENT_URI = BASE_CONTENT_URI; + } + + private ApgServiceBlobContract() { + } +} diff --git a/org_apg/src/org/thialfihar/android/apg/provider/ApgServiceBlobDatabase.java b/org_apg/src/org/thialfihar/android/apg/provider/ApgServiceBlobDatabase.java new file mode 100644 index 000000000..417486e33 --- /dev/null +++ b/org_apg/src/org/thialfihar/android/apg/provider/ApgServiceBlobDatabase.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de> + * Copyright (C) 2011 Markus Doits <markus.doits@googlemail.com> + * + * 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; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.provider.BaseColumns; + +import org.thialfihar.android.apg.provider.ApgServiceBlobContract.BlobsColumns; + +public class ApgServiceBlobDatabase extends SQLiteOpenHelper { + private static final String DATABASE_NAME = "apg_blob.db"; + private static final int DATABASE_VERSION = 2; + + public static final String TABLE = "data"; + + public ApgServiceBlobDatabase(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL("CREATE TABLE " + TABLE + " ( " + BaseColumns._ID + + " INTEGER PRIMARY KEY AUTOINCREMENT, " + BlobsColumns.KEY + " TEXT NOT NULL)"); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + // no upgrade necessary yet + } +} diff --git a/org_apg/src/org/thialfihar/android/apg/provider/ApgServiceBlobProvider.java b/org_apg/src/org/thialfihar/android/apg/provider/ApgServiceBlobProvider.java new file mode 100644 index 000000000..8053aecbf --- /dev/null +++ b/org_apg/src/org/thialfihar/android/apg/provider/ApgServiceBlobProvider.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de> + * Copyright (C) 2011 Markus Doits <markus.doits@googlemail.com> + * + * 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; + +import org.thialfihar.android.apg.Constants; + +import android.content.ContentProvider; +import android.content.ContentUris; +import android.content.ContentValues; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.net.Uri; +import android.os.ParcelFileDescriptor; +import android.provider.BaseColumns; + +import org.thialfihar.android.apg.provider.ApgServiceBlobContract.Blobs; +import org.thialfihar.android.apg.provider.ApgServiceBlobContract.BlobsColumns; +import org.thialfihar.android.apg.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 STORE_PATH = Constants.path.APP_DIR + "/ApgBlobs"; + + private ApgServiceBlobDatabase mBlobDatabase = null; + + public ApgServiceBlobProvider() { + File dir = new File(STORE_PATH); + dir.mkdirs(); + } + + @Override + public boolean onCreate() { + mBlobDatabase = new ApgServiceBlobDatabase(getContext()); + return true; + } + + /** {@inheritDoc} */ + @Override + public Uri insert(Uri uri, ContentValues ignored) { + // 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(BlobsColumns.KEY, password); + + SQLiteDatabase db = mBlobDatabase.getWritableDatabase(); + long newRowId = db.insert(ApgServiceBlobDatabase.TABLE, null, vals); + Uri insertedUri = ContentUris.withAppendedId(Blobs.CONTENT_URI, newRowId); + + return Uri.withAppendedPath(insertedUri, password); + } + + /** {@inheritDoc} */ + @Override + public ParcelFileDescriptor openFile(Uri uri, String mode) throws SecurityException, + FileNotFoundException { + Log.d(Constants.TAG, "openFile() called with uri: " + uri.toString() + " and 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); + + Log.d(Constants.TAG, "Got id: " + id + " and key: " + key); + + // get the data + SQLiteDatabase db = mBlobDatabase.getReadableDatabase(); + Cursor result = db.query(ApgServiceBlobDatabase.TABLE, new String[] { BaseColumns._ID }, + BaseColumns._ID + " = ? and " + BlobsColumns.KEY + " = ?", + new String[] { id, key }, null, null, null); + + 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")) { + Log.d(Constants.TAG, "Try to open file w"); + if (!targetFile.exists()) { + try { + targetFile.createNewFile(); + } catch (IOException e) { + Log.e(Constants.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")) { + Log.d(Constants.TAG, "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; + } + + /** {@inheritDoc} */ + @Override + public String getType(Uri uri) { + return null; + } + + /** {@inheritDoc} */ + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + return null; + } + + /** {@inheritDoc} */ + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + return 0; + } + + /** {@inheritDoc} */ + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + return 0; + } + +} diff --git a/org_apg/src/org/thialfihar/android/apg/provider/ProviderHelper.java b/org_apg/src/org/thialfihar/android/apg/provider/ProviderHelper.java index ae4b1520c..6b3e94938 100644 --- a/org_apg/src/org/thialfihar/android/apg/provider/ProviderHelper.java +++ b/org_apg/src/org/thialfihar/android/apg/provider/ProviderHelper.java @@ -1,3 +1,19 @@ +/* + * 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.provider; import java.io.IOException; @@ -177,6 +193,7 @@ public class ProviderHelper { * @throws IOException * @throws GeneralException */ + @SuppressWarnings("unchecked") public static void saveKeyRing(Context context, PGPPublicKeyRing keyRing) throws IOException { PGPPublicKey masterKey = keyRing.getPublicKey(); long masterKeyId = masterKey.getKeyID(); @@ -232,6 +249,7 @@ public class ProviderHelper { * @throws IOException * @throws GeneralException */ + @SuppressWarnings("unchecked") public static void saveKeyRing(Context context, PGPSecretKeyRing keyRing) throws IOException { PGPSecretKey masterKey = keyRing.getSecretKey(); long masterKeyId = masterKey.getKeyID(); 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 1404e441d..9e618b545 100644 --- a/org_apg/src/org/thialfihar/android/apg/service/ApgService.java +++ b/org_apg/src/org/thialfihar/android/apg/service/ApgService.java @@ -1,3 +1,19 @@ +/* + * 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.service; import java.io.ByteArrayInputStream; @@ -17,7 +33,6 @@ import org.thialfihar.android.apg.helper.PGPMain; import org.thialfihar.android.apg.helper.PGPMain.ApgGeneralException; import org.thialfihar.android.apg.util.InputData; import org.thialfihar.android.apg.util.Log; -import org.thialfihar.android.apg.util.ProgressDialogUpdater; import android.app.Service; import android.content.Context; @@ -32,7 +47,7 @@ import android.os.RemoteException; * - is this service thread safe? Probably not! * */ -public class ApgService extends Service implements ProgressDialogUpdater { +public class ApgService extends Service { Context mContext; @Override @@ -53,6 +68,14 @@ public class ApgService extends Service implements ProgressDialogUpdater { return mBinder; } + private static void writeToOutputStream(InputStream is, OutputStream os) throws IOException { + byte[] buffer = new byte[8]; + int len = 0; + while ((len = is.read(buffer)) != -1) { + os.write(buffer, 0, len); + } + } + void encryptAndSignImplementation(byte[] inputBytes, String inputUri, boolean useAsciiArmor, int compression, long[] encryptionKeyIds, String encryptionPassphrase, int symmetricEncryptionAlgorithm, long signatureKeyId, int signatureHashAlgorithm, @@ -61,6 +84,19 @@ public class ApgService extends Service implements ProgressDialogUpdater { try { // TODO use inputUri + +// InputStream inStream = null; +// if (isBlob) { +// ContentResolver cr = getContentResolver(); +// try { +// inStream = cr.openInputStream(Uri.parse(pArgs.getString(arg.BLOB.name()))); +// } catch (Exception e) { +// Log.e(TAG, "... exception on opening blob", e); +// } +// } else { +// inStream = new ByteArrayInputStream(pArgs.getString(arg.MESSAGE.name()).getBytes()); +// } +// InputData in = new InputData(inStream, 0); // XXX Size second param? // build InputData and write into OutputStream InputStream inputStream = new ByteArrayInputStream(inputBytes); @@ -69,12 +105,25 @@ public class ApgService extends Service implements ProgressDialogUpdater { OutputStream output = new ByteArrayOutputStream(); - PGPMain.encryptAndSign(mContext, ApgService.this, input, output, useAsciiArmor, - compression, encryptionKeyIds, encryptionPassphrase, - symmetricEncryptionAlgorithm, signatureKeyId, signatureHashAlgorithm, - signatureForceV3, signaturePassphrase); + PGPMain.encryptAndSign(mContext, null, input, output, useAsciiArmor, compression, + encryptionKeyIds, encryptionPassphrase, symmetricEncryptionAlgorithm, + signatureKeyId, signatureHashAlgorithm, signatureForceV3, signaturePassphrase); output.close(); + +// if (isBlob) { +// ContentResolver cr = getContentResolver(); +// try { +// OutputStream outStream = cr.openOutputStream(Uri.parse(pArgs.getString(arg.BLOB +// .name()))); +// writeToOutputStream(new ByteArrayInputStream(out.toString().getBytes()), outStream); +// outStream.close(); +// } catch (Exception e) { +// Log.e(TAG, "... exception on writing blob", e); +// } +// } else { +// pReturn.putString(ret.RESULT.name(), out.toString()); +// } byte[] outputBytes = ((ByteArrayOutputStream) output).toByteArray(); @@ -103,8 +152,8 @@ public class ApgService extends Service implements ProgressDialogUpdater { OutputStream outputStream = new ByteArrayOutputStream(); - Bundle outputBundle = PGPMain.decryptAndVerify(mContext, ApgService.this, inputData, - outputStream, passphrase, assumeSymmetric); + Bundle outputBundle = PGPMain.decryptAndVerify(mContext, null, inputData, outputStream, + passphrase, assumeSymmetric); outputStream.close(); @@ -148,15 +197,13 @@ public class ApgService extends Service implements ProgressDialogUpdater { try { secretKeyId = PGPMain.getDecryptionKeyId(ApgService.this, inputStream); if (secretKeyId == Id.key.none) { - throw new PGPMain.ApgGeneralException( - getString(R.string.error_noSecretKeyFound)); + throw new ApgGeneralException(getString(R.string.error_noSecretKeyFound)); } symmetric = false; } catch (PGPMain.NoAsymmetricEncryptionException e) { secretKeyId = Id.key.symmetric; if (!PGPMain.hasSymmetricEncryption(ApgService.this, inputStream)) { - throw new PGPMain.ApgGeneralException( - getString(R.string.error_noKnownEncryptionFound)); + throw new ApgGeneralException(getString(R.string.error_noKnownEncryptionFound)); } symmetric = true; } @@ -276,21 +323,4 @@ public class ApgService extends Service implements ProgressDialogUpdater { } } - @Override - public void setProgress(String message, int current, int total) { - // TODO Auto-generated method stub - - } - - @Override - public void setProgress(int resourceId, int current, int total) { - // TODO Auto-generated method stub - - } - - @Override - public void setProgress(int current, int total) { - // TODO Auto-generated method stub - - } } diff --git a/org_apg/src/org/thialfihar/android/apg/service/IApgEncryptDecryptHandler.aidl b/org_apg/src/org/thialfihar/android/apg/service/IApgEncryptDecryptHandler.aidl index ff6b7254c..318e5f344 100644 --- a/org_apg/src/org/thialfihar/android/apg/service/IApgEncryptDecryptHandler.aidl +++ b/org_apg/src/org/thialfihar/android/apg/service/IApgEncryptDecryptHandler.aidl @@ -1,3 +1,19 @@ +/* + * 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.service; interface IApgEncryptDecryptHandler { diff --git a/org_apg/src/org/thialfihar/android/apg/service/IApgHelperHandler.aidl b/org_apg/src/org/thialfihar/android/apg/service/IApgHelperHandler.aidl index bb405329a..29ff2dd3e 100644 --- a/org_apg/src/org/thialfihar/android/apg/service/IApgHelperHandler.aidl +++ b/org_apg/src/org/thialfihar/android/apg/service/IApgHelperHandler.aidl @@ -1,3 +1,19 @@ +/* + * 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.service; interface IApgHelperHandler { diff --git a/org_apg/src/org/thialfihar/android/apg/service/IApgService.aidl b/org_apg/src/org/thialfihar/android/apg/service/IApgService.aidl index 71c6a9e42..7753d1e3d 100644 --- a/org_apg/src/org/thialfihar/android/apg/service/IApgService.aidl +++ b/org_apg/src/org/thialfihar/android/apg/service/IApgService.aidl @@ -1,3 +1,19 @@ +/* + * 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.service; import org.thialfihar.android.apg.service.IApgEncryptDecryptHandler; diff --git a/org_apg/src/org/thialfihar/android/apg/service/IApgSignVerifyHandler.aidl b/org_apg/src/org/thialfihar/android/apg/service/IApgSignVerifyHandler.aidl index 1375d1548..cc854e540 100644 --- a/org_apg/src/org/thialfihar/android/apg/service/IApgSignVerifyHandler.aidl +++ b/org_apg/src/org/thialfihar/android/apg/service/IApgSignVerifyHandler.aidl @@ -1,3 +1,19 @@ +/* + * 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.service; interface IApgSignVerifyHandler { 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 96bd0ea5e..cb5808a2a 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/EditKeyActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/EditKeyActivity.java @@ -422,7 +422,7 @@ public class EditKeyActivity extends SherlockFragmentActivity { data.putString(ApgIntentService.NEW_PASSPHRASE, mNewPassPhrase); data.putStringArrayList(ApgIntentService.USER_IDS, getUserIds(mUserIdsView)); ArrayList<PGPSecretKey> keys = getKeys(mKeysView); - data.putByteArray(ApgIntentService.KEYS, PGPConversionHelper.PGPSecretKeyListToBytes(keys)); + data.putByteArray(ApgIntentService.KEYS, PGPConversionHelper.PGPSecretKeyArrayListToBytes(keys)); data.putIntegerArrayList(ApgIntentService.KEYS_USAGES, getKeysUsages(mKeysView)); data.putLong(ApgIntentService.MASTER_KEY_ID, getMasterKeyId()); diff --git a/org_apg/src/org/thialfihar/android/apg/ui/widget/ExpandableListFragment.java b/org_apg/src/org/thialfihar/android/apg/ui/widget/ExpandableListFragment.java index 46239d560..01488909f 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/widget/ExpandableListFragment.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/widget/ExpandableListFragment.java @@ -116,8 +116,8 @@ public class ExpandableListFragment extends Fragment implements OnCreateContextM pframe.addView(progress, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - root.addView(pframe, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, - ViewGroup.LayoutParams.FILL_PARENT)); + root.addView(pframe, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); // ------------------------------------------------------------------ @@ -127,22 +127,22 @@ public class ExpandableListFragment extends Fragment implements OnCreateContextM TextView tv = new TextView(getActivity()); tv.setId(INTERNAL_EMPTY_ID); tv.setGravity(Gravity.CENTER); - lframe.addView(tv, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, - ViewGroup.LayoutParams.FILL_PARENT)); + lframe.addView(tv, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); ExpandableListView lv = new ExpandableListView(getActivity()); lv.setId(android.R.id.list); lv.setDrawSelectorOnTop(false); - lframe.addView(lv, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, - ViewGroup.LayoutParams.FILL_PARENT)); + lframe.addView(lv, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); - root.addView(lframe, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, - ViewGroup.LayoutParams.FILL_PARENT)); + root.addView(lframe, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); // ------------------------------------------------------------------ - root.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, - ViewGroup.LayoutParams.FILL_PARENT)); + root.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); return root; } |