From 840d57bf3b2c91f63f0df9d8988c16eb467b4a29 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Fri, 13 Nov 2015 16:56:35 +0100 Subject: passphraseactivity: add inline spinner to password dialog --- .../keychain/service/PassphraseCacheService.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java index 73da3aff9..d4f4998a5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java @@ -120,13 +120,14 @@ public class PassphraseCacheService extends Service { */ public static void addCachedPassphrase(Context context, long masterKeyId, long subKeyId, Passphrase passphrase, - String primaryUserId) { + String primaryUserId, + long timeToLiveSeconds) { Log.d(Constants.TAG, "PassphraseCacheService.addCachedPassphrase() for " + masterKeyId); Intent intent = new Intent(context, PassphraseCacheService.class); intent.setAction(ACTION_PASSPHRASE_CACHE_ADD); - intent.putExtra(EXTRA_TTL, Preferences.getPreferences(context).getPassphraseCacheTtl()); + intent.putExtra(EXTRA_TTL, timeToLiveSeconds); intent.putExtra(EXTRA_PASSPHRASE, passphrase); intent.putExtra(EXTRA_KEY_ID, masterKeyId); intent.putExtra(EXTRA_SUBKEY_ID, subKeyId); @@ -237,7 +238,8 @@ public class PassphraseCacheService extends Service { return null; } addCachedPassphrase(this, Constants.key.symmetric, Constants.key.symmetric, - cachedPassphrase.getPassphrase(), getString(R.string.passp_cache_notif_pwd)); + cachedPassphrase.getPassphrase(), getString(R.string.passp_cache_notif_pwd), + Preferences.getPreferences(getBaseContext()).getPassphraseCacheTtl()); return cachedPassphrase.getPassphrase(); } @@ -285,9 +287,6 @@ public class PassphraseCacheService extends Service { } - // set it again to reset the cache life cycle - Log.d(Constants.TAG, "PassphraseCacheService: Cache passphrase again when getting it!"); - addCachedPassphrase(this, masterKeyId, subKeyId, cachedPassphrase.getPassphrase(), cachedPassphrase.getPrimaryUserID()); return cachedPassphrase.getPassphrase(); } -- cgit v1.2.3 From 1754a88ac39e061dd36afd72f8a04e8d5e59751c Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 17 Nov 2015 00:58:22 +0100 Subject: inline-ttl: create ttl choice customization setting activity --- .../sufficientlysecure/keychain/service/PassphraseCacheService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java index d4f4998a5..6479c01ad 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java @@ -238,8 +238,7 @@ public class PassphraseCacheService extends Service { return null; } addCachedPassphrase(this, Constants.key.symmetric, Constants.key.symmetric, - cachedPassphrase.getPassphrase(), getString(R.string.passp_cache_notif_pwd), - Preferences.getPreferences(getBaseContext()).getPassphraseCacheTtl()); + cachedPassphrase.getPassphrase(), getString(R.string.passp_cache_notif_pwd), 180); return cachedPassphrase.getPassphrase(); } -- cgit v1.2.3 From a75b26be660f33d0a688fb25f8d770cc11d58fc9 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 17 Nov 2015 14:45:17 +0100 Subject: inline-ttl: use ttl preference in ttl spinner --- .../keychain/service/PassphraseCacheService.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java index 6479c01ad..82198120d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java @@ -93,7 +93,7 @@ public class PassphraseCacheService extends Service { public static final String EXTRA_MESSENGER = "messenger"; public static final String EXTRA_USER_ID = "user_id"; - private static final long DEFAULT_TTL = 15; + private static final int DEFAULT_TTL = 15; private static final int MSG_PASSPHRASE_CACHE_GET_OKAY = 1; private static final int MSG_PASSPHRASE_CACHE_GET_KEY_NOT_FOUND = 2; @@ -121,7 +121,7 @@ public class PassphraseCacheService extends Service { public static void addCachedPassphrase(Context context, long masterKeyId, long subKeyId, Passphrase passphrase, String primaryUserId, - long timeToLiveSeconds) { + int timeToLiveSeconds) { Log.d(Constants.TAG, "PassphraseCacheService.addCachedPassphrase() for " + masterKeyId); Intent intent = new Intent(context, PassphraseCacheService.class); @@ -237,8 +237,6 @@ public class PassphraseCacheService extends Service { if (cachedPassphrase == null) { return null; } - addCachedPassphrase(this, Constants.key.symmetric, Constants.key.symmetric, - cachedPassphrase.getPassphrase(), getString(R.string.passp_cache_notif_pwd), 180); return cachedPassphrase.getPassphrase(); } @@ -345,7 +343,7 @@ public class PassphraseCacheService extends Service { String action = intent.getAction(); switch (action) { case ACTION_PASSPHRASE_CACHE_ADD: { - long ttl = intent.getLongExtra(EXTRA_TTL, DEFAULT_TTL); + long ttl = intent.getIntExtra(EXTRA_TTL, DEFAULT_TTL); long masterKeyId = intent.getLongExtra(EXTRA_KEY_ID, -1); long subKeyId = intent.getLongExtra(EXTRA_SUBKEY_ID, -1); -- cgit v1.2.3 From 52ab77d2a41d8d2e61cc864dbfd63dd1185a184b Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Wed, 18 Nov 2015 19:13:21 +0100 Subject: passcache: add support for clear on screen lock (ttl == 0) --- .../keychain/service/PassphraseCacheService.java | 106 ++++++++++++++------- 1 file changed, 70 insertions(+), 36 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java index 82198120d..be14f1586 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java @@ -27,6 +27,8 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Binder; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; @@ -93,7 +95,7 @@ public class PassphraseCacheService extends Service { public static final String EXTRA_MESSENGER = "messenger"; public static final String EXTRA_USER_ID = "user_id"; - private static final int DEFAULT_TTL = 15; + private static final int DEFAULT_TTL = 0; private static final int MSG_PASSPHRASE_CACHE_GET_OKAY = 1; private static final int MSG_PASSPHRASE_CACHE_GET_KEY_NOT_FOUND = 2; @@ -237,7 +239,7 @@ public class PassphraseCacheService extends Service { if (cachedPassphrase == null) { return null; } - return cachedPassphrase.getPassphrase(); + return cachedPassphrase.mPassphrase; } // try to get master key id which is used as an identifier for cached passphrases @@ -284,7 +286,7 @@ public class PassphraseCacheService extends Service { } - return cachedPassphrase.getPassphrase(); + return cachedPassphrase.mPassphrase; } /** @@ -303,13 +305,18 @@ public class PassphraseCacheService extends Service { if (action.equals(BROADCAST_ACTION_PASSPHRASE_CACHE_SERVICE)) { long keyId = intent.getLongExtra(EXTRA_KEY_ID, -1); - timeout(keyId); + removeTimeoutedPassphrase(keyId); + } + + if (action.equals(Intent.ACTION_SCREEN_OFF)) { + removeScreenLockPassphrases(); } } }; IntentFilter filter = new IntentFilter(); filter.addAction(BROADCAST_ACTION_PASSPHRASE_CACHE_SERVICE); + filter.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(mIntentReceiver, filter); } } @@ -337,35 +344,39 @@ public class PassphraseCacheService extends Service { return START_STICKY; } - // register broadcastreceiver - registerReceiver(); - String action = intent.getAction(); switch (action) { case ACTION_PASSPHRASE_CACHE_ADD: { - long ttl = intent.getIntExtra(EXTRA_TTL, DEFAULT_TTL); long masterKeyId = intent.getLongExtra(EXTRA_KEY_ID, -1); long subKeyId = intent.getLongExtra(EXTRA_SUBKEY_ID, -1); + long timeoutTime = intent.getIntExtra(EXTRA_TTL, DEFAULT_TTL); Passphrase passphrase = intent.getParcelableExtra(EXTRA_PASSPHRASE); String primaryUserID = intent.getStringExtra(EXTRA_USER_ID); Log.d(Constants.TAG, "PassphraseCacheService: Received ACTION_PASSPHRASE_CACHE_ADD intent in onStartCommand() with masterkeyId: " - + masterKeyId + ", subKeyId: " + subKeyId + ", ttl: " + ttl + ", usrId: " + primaryUserID + + masterKeyId + ", subKeyId: " + subKeyId + ", ttl: " + timeoutTime + ", usrId: " + primaryUserID ); // if we don't cache by specific subkey id, or the requested subkey is the master key, // just add master key id to the cache, otherwise, add this specific subkey to the cache long referenceKeyId = Preferences.getPreferences(mContext).getPassphraseCacheSubs() ? subKeyId : masterKeyId; - mPassphraseCache.put(referenceKeyId, new CachedPassphrase(passphrase, primaryUserID)); - if (ttl > 0) { + + CachedPassphrase cachedPassphrase; + if (timeoutTime == 0) { + cachedPassphrase = CachedPassphrase.getPassphraseLock(passphrase, primaryUserID); + } else { + cachedPassphrase = CachedPassphrase.getPassphraseTtlTimeout(passphrase, primaryUserID, timeoutTime); + // register new alarm with keyId for this passphrase - long triggerTime = new Date().getTime() + (ttl * 1000); AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); - am.set(AlarmManager.RTC_WAKEUP, triggerTime, buildIntent(this, referenceKeyId)); + am.set(AlarmManager.RTC_WAKEUP, timeoutTime, buildIntent(this, referenceKeyId)); } + + mPassphraseCache.put(referenceKeyId, cachedPassphrase); + break; } case ACTION_PASSPHRASE_CACHE_GET: { @@ -435,16 +446,14 @@ public class PassphraseCacheService extends Service { return START_STICKY; } - /** - * Called when one specific passphrase for keyId timed out - */ - private void timeout(long keyId) { + /** Called when one specific passphrase for keyId timed out. */ + private void removeTimeoutedPassphrase(long keyId) { CachedPassphrase cPass = mPassphraseCache.get(keyId); if (cPass != null) { - if (cPass.getPassphrase() != null) { + if (cPass.mPassphrase != null) { // clean internal char[] from memory! - cPass.getPassphrase().removeFromMemory(); + cPass.mPassphrase.removeFromMemory(); } // remove passphrase object mPassphraseCache.remove(keyId); @@ -455,6 +464,24 @@ public class PassphraseCacheService extends Service { updateService(); } + private void removeScreenLockPassphrases() { + + for (int i = 0; i < mPassphraseCache.size(); ) { + CachedPassphrase cPass = mPassphraseCache.valueAt(i); + if (cPass.mTimeoutMode == TimeoutMode.LOCK) { + // remove passphrase object + mPassphraseCache.removeAt(i); + continue; + } + // only do this if we didn't remove at, which continues loop by reducing size! + i += 1; + } + + Log.d(Constants.TAG, "PassphraseCacheService Removing all cached-until-lock passphrases from memory!"); + + updateService(); + } + private void updateService() { if (mPassphraseCache.size() > 0) { startForeground(Constants.Notification.PASSPHRASE_CACHE, getNotification()); @@ -479,7 +506,7 @@ public class PassphraseCacheService extends Service { // Moves events into the big view for (int i = 0; i < mPassphraseCache.size(); i++) { - inboxStyle.addLine(mPassphraseCache.valueAt(i).getPrimaryUserID()); + inboxStyle.addLine(mPassphraseCache.valueAt(i).mPrimaryUserId); } // Moves the big view style object into the notification object. @@ -512,6 +539,8 @@ public class PassphraseCacheService extends Service { super.onCreate(); mContext = this; Log.d(Constants.TAG, "PassphraseCacheService, onCreate()"); + + registerReceiver(); } @Override @@ -535,29 +564,34 @@ public class PassphraseCacheService extends Service { private final IBinder mBinder = new PassphraseCacheBinder(); - public class CachedPassphrase { - private String primaryUserID; - private Passphrase passphrase; - - public CachedPassphrase(Passphrase passphrase, String primaryUserID) { - setPassphrase(passphrase); - setPrimaryUserID(primaryUserID); - } + private enum TimeoutMode { + NEVER, TTL, LOCK + } - public String getPrimaryUserID() { - return primaryUserID; + private static class CachedPassphrase { + private String mPrimaryUserId; + private Passphrase mPassphrase; + private TimeoutMode mTimeoutMode; + private Long mTimeoutTime; + + private CachedPassphrase(Passphrase passphrase, String primaryUserId, TimeoutMode timeoutMode, Long timeoutTime) { + mPassphrase = passphrase; + mPrimaryUserId = primaryUserId; + mTimeoutMode = timeoutMode; + mTimeoutTime = timeoutTime; } - public Passphrase getPassphrase() { - return passphrase; + static CachedPassphrase getPassphraseNoTimeout(Passphrase passphrase, String primaryUserId) { + return new CachedPassphrase(passphrase, primaryUserId, TimeoutMode.NEVER, null); } - public void setPrimaryUserID(String primaryUserID) { - this.primaryUserID = primaryUserID; + static CachedPassphrase getPassphraseTtlTimeout(Passphrase passphrase, String primaryUserId, long timeoutTime) { + return new CachedPassphrase(passphrase, primaryUserId, TimeoutMode.TTL, timeoutTime); } - public void setPassphrase(Passphrase passphrase) { - this.passphrase = passphrase; + static CachedPassphrase getPassphraseLock(Passphrase passphrase, String primaryUserId) { + return new CachedPassphrase(passphrase, primaryUserId, TimeoutMode.LOCK, null); } } + } -- cgit v1.2.3 From 7eafe5d1e81fe3f72e66b600736e55f8eb21f038 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Wed, 18 Nov 2015 19:23:40 +0100 Subject: inline-ttl: support "screen off" in preference --- .../keychain/service/PassphraseCacheService.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java index be14f1586..606daabed 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java @@ -27,8 +27,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Binder; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; @@ -349,14 +347,14 @@ public class PassphraseCacheService extends Service { case ACTION_PASSPHRASE_CACHE_ADD: { long masterKeyId = intent.getLongExtra(EXTRA_KEY_ID, -1); long subKeyId = intent.getLongExtra(EXTRA_SUBKEY_ID, -1); - long timeoutTime = intent.getIntExtra(EXTRA_TTL, DEFAULT_TTL); + long timeoutTtl = intent.getIntExtra(EXTRA_TTL, DEFAULT_TTL); Passphrase passphrase = intent.getParcelableExtra(EXTRA_PASSPHRASE); String primaryUserID = intent.getStringExtra(EXTRA_USER_ID); Log.d(Constants.TAG, "PassphraseCacheService: Received ACTION_PASSPHRASE_CACHE_ADD intent in onStartCommand() with masterkeyId: " - + masterKeyId + ", subKeyId: " + subKeyId + ", ttl: " + timeoutTime + ", usrId: " + primaryUserID + + masterKeyId + ", subKeyId: " + subKeyId + ", ttl: " + timeoutTtl + ", usrId: " + primaryUserID ); // if we don't cache by specific subkey id, or the requested subkey is the master key, @@ -365,14 +363,15 @@ public class PassphraseCacheService extends Service { Preferences.getPreferences(mContext).getPassphraseCacheSubs() ? subKeyId : masterKeyId; CachedPassphrase cachedPassphrase; - if (timeoutTime == 0) { + if (timeoutTtl == 0L) { cachedPassphrase = CachedPassphrase.getPassphraseLock(passphrase, primaryUserID); } else { - cachedPassphrase = CachedPassphrase.getPassphraseTtlTimeout(passphrase, primaryUserID, timeoutTime); + cachedPassphrase = CachedPassphrase.getPassphraseTtlTimeout(passphrase, primaryUserID, timeoutTtl); + long triggerTime = new Date().getTime() + (timeoutTtl * 1000); // register new alarm with keyId for this passphrase AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); - am.set(AlarmManager.RTC_WAKEUP, timeoutTime, buildIntent(this, referenceKeyId)); + am.set(AlarmManager.RTC_WAKEUP, triggerTime, buildIntent(this, referenceKeyId)); } mPassphraseCache.put(referenceKeyId, cachedPassphrase); -- cgit v1.2.3 From f2ef65ac37bb296392dc1e9ed327dbb595ebf180 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Fri, 20 Nov 2015 19:04:02 +0100 Subject: add method to skip caching --- .../keychain/service/input/RequiredInputParcel.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/RequiredInputParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/RequiredInputParcel.java index 1f99836ea..429d7a7e5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/RequiredInputParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/RequiredInputParcel.java @@ -28,6 +28,8 @@ public class RequiredInputParcel implements Parcelable { private Long mMasterKeyId; private Long mSubKeyId; + public boolean mSkipCaching = false; + private RequiredInputParcel(RequiredInputType type, byte[][] inputData, int[] signAlgos, Date signatureTime, Long masterKeyId, Long subKeyId) { mType = type; @@ -66,6 +68,7 @@ public class RequiredInputParcel implements Parcelable { mSignatureTime = source.readInt() != 0 ? new Date(source.readLong()) : null; mMasterKeyId = source.readInt() != 0 ? source.readLong() : null; mSubKeyId = source.readInt() != 0 ? source.readLong() : null; + mSkipCaching = source.readInt() != 0; } @@ -171,6 +174,7 @@ public class RequiredInputParcel implements Parcelable { } else { dest.writeInt(0); } + dest.writeInt(mSkipCaching ? 1 : 0); } -- cgit v1.2.3