diff options
author | Markus Doits <markus.doits@gmail.com> | 2011-01-09 19:16:45 +0000 |
---|---|---|
committer | Markus Doits <markus.doits@gmail.com> | 2011-01-09 19:16:45 +0000 |
commit | c84c449035db1498414486b13e63e590ddf49a58 (patch) | |
tree | 34a2015c3a08dcab2bfb634b828d952e60038079 | |
parent | 9e089f03b6efb656650be7fa465833f189398af5 (diff) | |
download | open-keychain-c84c449035db1498414486b13e63e590ddf49a58.tar.gz open-keychain-c84c449035db1498414486b13e63e590ddf49a58.tar.bz2 open-keychain-c84c449035db1498414486b13e63e590ddf49a58.zip |
Respect options but allow to overwrite them for each call
By default the values set in APG's options are respected now. But they
can be overwritten by special parameters passed through.
-rw-r--r-- | src/org/thialfihar/android/apg/ApgService.java | 99 |
1 files changed, 84 insertions, 15 deletions
diff --git a/src/org/thialfihar/android/apg/ApgService.java b/src/org/thialfihar/android/apg/ApgService.java index ec744448b..4d38f9693 100644 --- a/src/org/thialfihar/android/apg/ApgService.java +++ b/src/org/thialfihar/android/apg/ApgService.java @@ -5,6 +5,7 @@ import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import android.content.Intent; @@ -13,7 +14,7 @@ import android.os.IBinder; import android.util.Log; public class ApgService extends Service { - static String TAG = "ApgService"; + final static String TAG = "ApgService"; @Override public IBinder onBind(Intent intent) { @@ -26,21 +27,89 @@ public class ApgService extends Service { APG_FAILURE } + /** a map from ApgService parameters to function calls to get the default */ + static final HashMap<String, String> FUNCTIONS_DEFAULTS = new HashMap<String, String>(); + static { + FUNCTIONS_DEFAULTS.put("ENCRYPTION_ALGO", "getDefaultEncryptionAlgorithm"); + FUNCTIONS_DEFAULTS.put("HASH_ALGO", "getDefaultHashAlgorithm"); + FUNCTIONS_DEFAULTS.put("ARMORED", "getDefaultAsciiArmour"); + FUNCTIONS_DEFAULTS.put("FORCE_V3_SIG", "getForceV3Signatures"); + FUNCTIONS_DEFAULTS.put("COMPRESSION", "getDefaultMessageCompression"); + } + + /** + * Add default arguments if missing + * + * @param args + * the bundle to add default parameters to if missing + * + */ + private void add_defaults(Bundle args) { + Preferences _mPreferences = Preferences.getPreferences(getBaseContext(), true); + + Iterator<String> _iter = FUNCTIONS_DEFAULTS.keySet().iterator(); + while (_iter.hasNext()) { + String _current_key = _iter.next(); + if (!args.containsKey(_current_key)) { + String _current_function_name = FUNCTIONS_DEFAULTS.get(_current_key); + try { + @SuppressWarnings("unchecked") + Class _ret_type = Preferences.class.getMethod(_current_function_name).getReturnType(); + if (_ret_type == String.class) { + args.putString(_current_key, (String) Preferences.class.getMethod(_current_function_name).invoke(_mPreferences)); + } else if (_ret_type == boolean.class) { + args.putBoolean(_current_key, (Boolean) Preferences.class.getMethod(_current_function_name).invoke(_mPreferences)); + } else if (_ret_type == int.class) { + args.putInt(_current_key, (Integer) Preferences.class.getMethod(_current_function_name).invoke(_mPreferences)); + } else { + Log.e(TAG, "Unknown return type " + _ret_type.toString() + " for default option"); + } + } catch (Exception e) { + Log.e(TAG, "Exception in add_defaults " + e.getMessage()); + } + } + } + } + private final IApgService.Stub mBinder = new IApgService.Stub() { public boolean encrypt_with_passphrase(Bundle pArgs, Bundle pReturn) { + ArrayList<String> errors = new ArrayList<String>(); ArrayList<String> warnings = new ArrayList<String>(); pReturn.putStringArrayList("ERRORS", errors); pReturn.putStringArrayList("WARNINGS", warnings); - String msg = pArgs.getString("MSG"); - pArgs.remove("MSG"); + Bundle _my_args = new Bundle(pArgs); - String passphrase = pArgs.getString("SYM_KEY"); - pArgs.remove("SYM_KEY"); + /* add default values if missing */ + add_defaults(_my_args); + + /* required args */ + String msg = _my_args.getString("MSG"); + _my_args.remove("MSG"); + + String passphrase = _my_args.getString("SYM_KEY"); + _my_args.remove("SYM_KEY"); + + /* optional args */ + Boolean armored = _my_args.getBoolean("ARMORED"); + _my_args.remove("ARMORED"); + + int encryption_algorithm = _my_args.getInt("ENCRYPTION_ALGO"); + _my_args.remove("ENCRYPTION_ALGO"); + int hash_algorithm = _my_args.getInt("HASH_ALGO"); + _my_args.remove("HASH_ALGO"); + + int compression = _my_args.getInt("COMPRESSION"); + _my_args.remove("COMPRESSION"); + + Boolean force_v3_signatures = _my_args.getBoolean("FORCE_V3_SIG"); + _my_args.remove("FORCE_V3_SIG"); + + /* check required args */ if (msg == null) { errors.add("Message to encrypt (MSG) missing"); } @@ -49,38 +118,38 @@ public class ApgService extends Service { errors.add("Symmetric key (SYM_KEY) missing"); } - if (!pArgs.isEmpty()) { - Iterator<String> _iter = pArgs.keySet().iterator(); + /* check for unknown args and add to warning */ + if (!_my_args.isEmpty()) { + Iterator<String> _iter = _my_args.keySet().iterator(); while (_iter.hasNext()) { warnings.add("Unknown key: " + _iter.next()); } } + /* return if errors happened */ if (errors.size() != 0) { pReturn.putInt("ERROR", error.ARGUMENTS_MISSING.ordinal()); return false; } - Preferences _mPreferences = Preferences.getPreferences(getBaseContext(), true); InputStream _inStream = new ByteArrayInputStream(msg.getBytes()); InputData _in = new InputData(_inStream, 9999); OutputStream _out = new ByteArrayOutputStream(); - long _enc_keys[] = {}; Apg.initialize(getApplicationContext()); try { Apg.encrypt(getApplicationContext(), // context _in, // input stream _out, // output stream - true, // armored - _enc_keys, // encryption keys + armored, // armored + new long[0], // encryption keys 0, // signature key null, // signature passphrase null, // progress - _mPreferences.getDefaultEncryptionAlgorithm(), // encryption - _mPreferences.getDefaultHashAlgorithm(), // hash - Id.choice.compression.none, // compression - false, // mPreferences.getForceV3Signatures(), + encryption_algorithm, // encryption + hash_algorithm, // hash + compression, // compression + force_v3_signatures, // mPreferences.getForceV3Signatures(), passphrase // passPhrase ); } catch (Exception e) { |