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 FUNCTIONS_DEFAULTS = new HashMap(); + 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 _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 errors = new ArrayList(); ArrayList warnings = new ArrayList(); 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 _iter = pArgs.keySet().iterator(); + /* check for unknown args and add to warning */ + if (!_my_args.isEmpty()) { + Iterator _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) {