From: AsamK Date: Sat, 3 Jun 2023 14:10:47 +0000 (+0200) Subject: Refactor trust command implementation X-Git-Tag: v0.12.0~38 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/106af6a801ad12045c3c98f235d5c9176784748f?ds=inline Refactor trust command implementation --- diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index 884871c6..38d9e12c 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -11,6 +11,7 @@ import org.asamk.signal.manager.api.GroupInviteLinkUrl; import org.asamk.signal.manager.api.GroupNotFoundException; import org.asamk.signal.manager.api.GroupSendingNotAllowedException; import org.asamk.signal.manager.api.Identity; +import org.asamk.signal.manager.api.IdentityVerificationCode; import org.asamk.signal.manager.api.InactiveGroupLinkException; import org.asamk.signal.manager.api.InvalidDeviceLinkException; import org.asamk.signal.manager.api.InvalidStickerException; @@ -261,33 +262,12 @@ public interface Manager extends Closeable { List getIdentities(RecipientIdentifier.Single recipient); /** - * Trust this the identity with this fingerprint + * Trust this the identity with this fingerprint/safetyNumber * - * @param recipient account of the identity - * @param fingerprint Fingerprint + * @param recipient account of the identity */ boolean trustIdentityVerified( - RecipientIdentifier.Single recipient, byte[] fingerprint - ) throws UnregisteredRecipientException; - - /** - * Trust this the identity with this safety number - * - * @param recipient account of the identity - * @param safetyNumber Safety number - */ - boolean trustIdentityVerifiedSafetyNumber( - RecipientIdentifier.Single recipient, String safetyNumber - ) throws UnregisteredRecipientException; - - /** - * Trust this the identity with this scannable safety number - * - * @param recipient account of the identity - * @param safetyNumber Scannable safety number - */ - boolean trustIdentityVerifiedSafetyNumber( - RecipientIdentifier.Single recipient, byte[] safetyNumber + RecipientIdentifier.Single recipient, IdentityVerificationCode verificationCode ) throws UnregisteredRecipientException; /** diff --git a/lib/src/main/java/org/asamk/signal/manager/api/IdentityVerificationCode.java b/lib/src/main/java/org/asamk/signal/manager/api/IdentityVerificationCode.java new file mode 100644 index 00000000..0f05b480 --- /dev/null +++ b/lib/src/main/java/org/asamk/signal/manager/api/IdentityVerificationCode.java @@ -0,0 +1,28 @@ +package org.asamk.signal.manager.api; + +import org.signal.libsignal.protocol.util.Hex; + +import java.util.Base64; +import java.util.Locale; + +public sealed interface IdentityVerificationCode { + + record Fingerprint(byte[] fingerprint) implements IdentityVerificationCode {} + + record SafetyNumber(String safetyNumber) implements IdentityVerificationCode {} + + record ScannableSafetyNumber(byte[] safetyNumber) implements IdentityVerificationCode {} + + static IdentityVerificationCode parse(String code) throws Exception { + code = code.replaceAll(" ", ""); + if (code.length() == 66) { + final var fingerprintBytes = Hex.fromStringCondensed(code.toLowerCase(Locale.ROOT)); + return new Fingerprint(fingerprintBytes); + } else if (code.length() == 60) { + return new SafetyNumber(code); + } else { + final var scannableSafetyNumber = Base64.getDecoder().decode(code); + return new ScannableSafetyNumber(scannableSafetyNumber); + } + } +} diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java index 9147eae1..90b2f6a4 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java @@ -28,6 +28,7 @@ import org.asamk.signal.manager.api.GroupInviteLinkUrl; import org.asamk.signal.manager.api.GroupNotFoundException; import org.asamk.signal.manager.api.GroupSendingNotAllowedException; import org.asamk.signal.manager.api.Identity; +import org.asamk.signal.manager.api.IdentityVerificationCode; import org.asamk.signal.manager.api.InactiveGroupLinkException; import org.asamk.signal.manager.api.InvalidDeviceLinkException; import org.asamk.signal.manager.api.InvalidStickerException; @@ -1166,25 +1167,20 @@ public class ManagerImpl implements Manager { @Override public boolean trustIdentityVerified( - RecipientIdentifier.Single recipient, byte[] fingerprint + RecipientIdentifier.Single recipient, IdentityVerificationCode verificationCode ) throws UnregisteredRecipientException { - return trustIdentity(recipient, r -> context.getIdentityHelper().trustIdentityVerified(r, fingerprint)); - } - - @Override - public boolean trustIdentityVerifiedSafetyNumber( - RecipientIdentifier.Single recipient, String safetyNumber - ) throws UnregisteredRecipientException { - return trustIdentity(recipient, - r -> context.getIdentityHelper().trustIdentityVerifiedSafetyNumber(r, safetyNumber)); - } - - @Override - public boolean trustIdentityVerifiedSafetyNumber( - RecipientIdentifier.Single recipient, byte[] safetyNumber - ) throws UnregisteredRecipientException { - return trustIdentity(recipient, - r -> context.getIdentityHelper().trustIdentityVerifiedSafetyNumber(r, safetyNumber)); + if (verificationCode instanceof IdentityVerificationCode.Fingerprint fingerprint) { + return trustIdentity(recipient, + r -> context.getIdentityHelper().trustIdentityVerified(r, fingerprint.fingerprint())); + } else if (verificationCode instanceof IdentityVerificationCode.SafetyNumber safetyNumber) { + return trustIdentity(recipient, + r -> context.getIdentityHelper().trustIdentityVerifiedSafetyNumber(r, safetyNumber.safetyNumber())); + } else if (verificationCode instanceof IdentityVerificationCode.ScannableSafetyNumber safetyNumber) { + return trustIdentity(recipient, + r -> context.getIdentityHelper().trustIdentityVerifiedSafetyNumber(r, safetyNumber.safetyNumber())); + } else { + throw new AssertionError("Invalid verification code type"); + } } @Override diff --git a/src/main/java/org/asamk/signal/commands/TrustCommand.java b/src/main/java/org/asamk/signal/commands/TrustCommand.java index 618655be..7d1dd632 100644 --- a/src/main/java/org/asamk/signal/commands/TrustCommand.java +++ b/src/main/java/org/asamk/signal/commands/TrustCommand.java @@ -7,13 +7,10 @@ import net.sourceforge.argparse4j.inf.Subparser; import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.commands.exceptions.UserErrorException; import org.asamk.signal.manager.Manager; +import org.asamk.signal.manager.api.IdentityVerificationCode; import org.asamk.signal.manager.api.UnregisteredRecipientException; import org.asamk.signal.output.OutputWriter; import org.asamk.signal.util.CommandUtil; -import org.asamk.signal.util.Hex; - -import java.util.Base64; -import java.util.Locale; public class TrustCommand implements JsonRpcLocalCommand { @@ -57,54 +54,22 @@ public class TrustCommand implements JsonRpcLocalCommand { "You need to specify the fingerprint/safety number you have verified with -v SAFETY_NUMBER"); } - safetyNumber = safetyNumber.replaceAll(" ", ""); - if (safetyNumber.length() == 66) { - byte[] fingerprintBytes; - try { - fingerprintBytes = Hex.toByteArray(safetyNumber.toLowerCase(Locale.ROOT)); - } catch (Exception e) { - throw new UserErrorException( - "Failed to parse the fingerprint, make sure the fingerprint is a correctly encoded hex string without additional characters."); - } - boolean res; - try { - res = m.trustIdentityVerified(recipient, fingerprintBytes); - } catch (UnregisteredRecipientException e) { - throw new UserErrorException("The user " + e.getSender().getIdentifier() + " is not registered."); - } - if (!res) { - throw new UserErrorException( - "Failed to set the trust for the fingerprint of this number, make sure the number and the fingerprint are correct."); - } - } else if (safetyNumber.length() == 60) { - boolean res; - try { - res = m.trustIdentityVerifiedSafetyNumber(recipient, safetyNumber); - } catch (UnregisteredRecipientException e) { - throw new UserErrorException("The user " + e.getSender().getIdentifier() + " is not registered."); - } - if (!res) { - throw new UserErrorException( - "Failed to set the trust for the safety number of this phone number, make sure the phone number and the safety number are correct."); - } - } else { - final byte[] scannableSafetyNumber; - try { - scannableSafetyNumber = Base64.getDecoder().decode(safetyNumber); - } catch (IllegalArgumentException e) { - throw new UserErrorException( - "Safety number has invalid format, either specify the old hex fingerprint or the new safety number"); - } - boolean res; - try { - res = m.trustIdentityVerifiedSafetyNumber(recipient, scannableSafetyNumber); - } catch (UnregisteredRecipientException e) { - throw new UserErrorException("The user " + e.getSender().getIdentifier() + " is not registered."); - } + final IdentityVerificationCode verificationCode; + try { + verificationCode = IdentityVerificationCode.parse(safetyNumber); + } catch (Exception e) { + throw new UserErrorException( + "Safety number has invalid format, either specify the old hex fingerprint or the new safety number"); + } + + try { + final var res = m.trustIdentityVerified(recipient, verificationCode); if (!res) { throw new UserErrorException( - "Failed to set the trust for the safety number of this phone number, make sure the phone number and the safety number are correct."); + "Failed to set the trust for this number, make sure the number and the fingerprint/safety number are correct."); } + } catch (UnregisteredRecipientException e) { + throw new UserErrorException("The user " + e.getSender().getIdentifier() + " is not registered."); } } } diff --git a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java index 2871ad5d..0e81e578 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java @@ -15,6 +15,7 @@ import org.asamk.signal.manager.api.GroupNotFoundException; import org.asamk.signal.manager.api.GroupPermission; import org.asamk.signal.manager.api.GroupSendingNotAllowedException; import org.asamk.signal.manager.api.Identity; +import org.asamk.signal.manager.api.IdentityVerificationCode; import org.asamk.signal.manager.api.InactiveGroupLinkException; import org.asamk.signal.manager.api.InvalidDeviceLinkException; import org.asamk.signal.manager.api.InvalidStickerException; @@ -667,20 +668,9 @@ public class DbusManagerImpl implements Manager { } @Override - public boolean trustIdentityVerified(final RecipientIdentifier.Single recipient, final byte[] fingerprint) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean trustIdentityVerifiedSafetyNumber( - final RecipientIdentifier.Single recipient, final String safetyNumber - ) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean trustIdentityVerifiedSafetyNumber( - final RecipientIdentifier.Single recipient, final byte[] safetyNumber + public boolean trustIdentityVerified( + final RecipientIdentifier.Single recipient, + final IdentityVerificationCode verificationCode ) { throw new UnsupportedOperationException(); }