From e1adfaee3686793aae79eca3350aa1909705eaa9 Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 27 May 2025 19:06:04 +0200 Subject: [PATCH] Added S/MIME encrypt/decrypt key aliases --- .../eu/faircode/email/AdapterIdentity.java | 15 +++++++-- .../eu/faircode/email/EntityIdentity.java | 33 +++++++++++++++++++ .../eu/faircode/email/FragmentCompose.java | 18 ++++++---- .../eu/faircode/email/FragmentMessages.java | 14 ++++++-- 4 files changed, 68 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterIdentity.java b/app/src/main/java/eu/faircode/email/AdapterIdentity.java index d39ae5770d..1c6cf5016a 100644 --- a/app/src/main/java/eu/faircode/email/AdapterIdentity.java +++ b/app/src/main/java/eu/faircode/email/AdapterIdentity.java @@ -33,6 +33,7 @@ import android.os.Bundle; import android.text.SpannableString; import android.text.style.RelativeSizeSpan; import android.text.style.StyleSpan; +import android.util.Pair; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -177,9 +178,17 @@ public class AdapterIdentity extends RecyclerView.Adapter aliases = identity.getAliases(); + if (aliases != null && aliases.first != null) { + if (sb.length() != 0) + sb.append(", "); + sb.append(aliases.first); + } + if (aliases != null && aliases.second != null && !aliases.second.equals(aliases.first)) { + if (sb.length() != 0) + sb.append(", "); + sb.append(aliases.second); + } } tvSignKeyId.setText(context.getString(R.string.title_sign_key, sb.toString())); diff --git a/app/src/main/java/eu/faircode/email/EntityIdentity.java b/app/src/main/java/eu/faircode/email/EntityIdentity.java index 24baaa3dc9..bf9055a6d5 100644 --- a/app/src/main/java/eu/faircode/email/EntityIdentity.java +++ b/app/src/main/java/eu/faircode/email/EntityIdentity.java @@ -22,6 +22,7 @@ package eu.faircode.email; import static androidx.room.ForeignKey.CASCADE; import android.text.TextUtils; +import android.util.Pair; import androidx.annotation.NonNull; import androidx.room.ColumnInfo; @@ -205,6 +206,38 @@ public class EntityIdentity { return false; } + Pair getAliases() { + if (sign_key_alias == null) + return null; + + String encrypt = null; + String decrypt = null; + try { + JSONObject jalias = new JSONObject(sign_key_alias); + if (jalias.has("encrypt")) + encrypt = jalias.getString("encrypt"); + if (jalias.has("decrypt")) + decrypt = jalias.getString("decrypt"); + } catch (JSONException ex) { + Log.w(ex); + encrypt = sign_key_alias; + decrypt = sign_key_alias; + } + + return new Pair<>(encrypt, decrypt); + } + + void setAlias(String alias, boolean encrypt) throws JSONException { + Pair aliases = getAliases(); + JSONObject jaliases = new JSONObject(); + if (aliases != null && aliases.first != null) + jaliases.put("encrypt", aliases.first); + if (aliases != null && aliases.second != null) + jaliases.put("decrypt", aliases.second); + jaliases.put(encrypt ? "encrypt" : "decrypt", alias); + sign_key_alias = jaliases.toString(); + } + public JSONObject toJSON() throws JSONException { JSONObject json = new JSONObject(); json.put("id", id); diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index f7f2372f04..adb7264a23 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -3222,8 +3222,12 @@ public class FragmentCompose extends FragmentBase { EntityIdentity identity = db.identity().getIdentity(draft.identity); if (identity != null && identity.sign_key_alias != null) try { - PrivateKey key = KeyChain.getPrivateKey(context, identity.sign_key_alias); - args.putBoolean("available", key != null); + Pair aliases = identity.getAliases(); + if (aliases != null && aliases.first != null) { + args.putString("alias", aliases.first); + PrivateKey key = KeyChain.getPrivateKey(context, aliases.first); + args.putBoolean("available", key != null); + } } catch (Throwable ex) { Log.w(ex); } @@ -3238,13 +3242,13 @@ public class FragmentCompose extends FragmentBase { boolean available = args.getBoolean("available"); if (available) { - args.putString("alias", identity.sign_key_alias); onSmime(args, action, extras); return; } - if (interactive) - Helper.selectKeyAlias(getActivity(), getViewLifecycleOwner(), identity.sign_key_alias, new Helper.IKeyAlias() { + if (interactive) { + String alias = args.getString("alias"); + Helper.selectKeyAlias(getActivity(), getViewLifecycleOwner(), alias, new Helper.IKeyAlias() { @Override public void onSelected(String alias) { args.putString("alias", alias); @@ -3269,6 +3273,7 @@ public class FragmentCompose extends FragmentBase { snackbar.show(); } }); + } } @Override @@ -4463,7 +4468,8 @@ public class FragmentCompose extends FragmentBase { } // Store selected alias - db.identity().setIdentitySignKeyAlias(identity.id, alias); + identity.setAlias(alias, true); + db.identity().setIdentitySignKeyAlias(identity.id, identity.sign_key_alias); // Build content File sinput = new File(tmp, draft.id + ".smime_sign"); diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 74ea66434f..45f14ca16e 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -9436,7 +9436,8 @@ public class FragmentMessages extends FragmentBase if (auto && identity == null) return; - String alias = (identity == null ? null : identity.sign_key_alias); + Pair aliases = (identity == null ? null : identity.getAliases()); + String alias = (aliases == null ? null : aliases.second); Helper.selectKeyAlias(getActivity(), getViewLifecycleOwner(), alias, new Helper.IKeyAlias() { @Override public void onSelected(String alias) { @@ -10765,10 +10766,17 @@ public class FragmentMessages extends FragmentBase db.message().setMessageStored(message.id, new Date().getTime()); db.message().setMessageFts(message.id, false); - if (alias != null && !duplicate && message.identity != null) - db.identity().setIdentitySignKeyAlias(message.identity, alias); + if (alias != null && !duplicate && message.identity != null) { + EntityIdentity identity = db.identity().getIdentity(message.identity); + if (identity != null) { + identity.setAlias(alias, false); + db.identity().setIdentitySignKeyAlias(identity.id, identity.sign_key_alias); + } + } db.setTransactionSuccessful(); + } catch (JSONException ex) { + Log.e(ex); } catch (SQLiteConstraintException ex) { // Message removed Log.w(ex);