From 0bf9f35c394a2671cbae4b7bc2d2a550edb391bd Mon Sep 17 00:00:00 2001 From: funkatronics Date: Wed, 18 Oct 2023 11:37:09 -0600 Subject: [PATCH] hide protocol version from consumers --- .../protocol/MobileWalletAdapterSession.java | 30 ++++++++++--------- .../LocalAssociationIntentCreator.java | 10 +++---- .../scenario/LocalAssociationScenario.java | 11 +------ 3 files changed, 22 insertions(+), 29 deletions(-) diff --git a/android/clientlib/src/main/java/com/solana/mobilewalletadapter/clientlib/protocol/MobileWalletAdapterSession.java b/android/clientlib/src/main/java/com/solana/mobilewalletadapter/clientlib/protocol/MobileWalletAdapterSession.java index b696301e..de857760 100644 --- a/android/clientlib/src/main/java/com/solana/mobilewalletadapter/clientlib/protocol/MobileWalletAdapterSession.java +++ b/android/clientlib/src/main/java/com/solana/mobilewalletadapter/clientlib/protocol/MobileWalletAdapterSession.java @@ -24,9 +24,8 @@ import java.security.Signature; import java.security.SignatureException; import java.security.interfaces.ECPublicKey; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; +import java.util.Set; public class MobileWalletAdapterSession extends MobileWalletAdapterSessionCommon { private static final String TAG = MobileWalletAdapterSession.class.getSimpleName(); @@ -35,27 +34,27 @@ public class MobileWalletAdapterSession extends MobileWalletAdapterSessionCommon private final KeyPair mAssociationKey; @NonNull - private final List mSupportedProtocolVersions; + private final Set mSupportedProtocolVersions; @Nullable private SessionProperties mSessionProperties; - @Deprecated public MobileWalletAdapterSession(@NonNull MessageReceiver decryptedPayloadReceiver, @Nullable StateCallbacks stateCallbacks) { - this(decryptedPayloadReceiver, stateCallbacks, List.of(SessionProperties.ProtocolVersion.LEGACY)); + this(decryptedPayloadReceiver, stateCallbacks, + Set.of(SessionProperties.ProtocolVersion.LEGACY, SessionProperties.ProtocolVersion.V1)); } - public MobileWalletAdapterSession(@NonNull MessageReceiver decryptedPayloadReceiver, - @Nullable StateCallbacks stateCallbacks, - @NonNull List supportedProtocolVersions) { + protected MobileWalletAdapterSession(@NonNull MessageReceiver decryptedPayloadReceiver, + @Nullable StateCallbacks stateCallbacks, + @NonNull Set supportedProtocolVersions) { super(decryptedPayloadReceiver, stateCallbacks); mAssociationKey = generateECP256KeyPair(); mSupportedProtocolVersions = supportedProtocolVersions; mSessionProperties = null; } - public List getSupportedProtocolVersions() { return mSupportedProtocolVersions; } + public Set getSupportedProtocolVersions() { return mSupportedProtocolVersions; } @NonNull @Override @@ -124,12 +123,15 @@ protected void handleSessionEstablishmentMessage(@NonNull byte[] payload) final ECPublicKey theirPublicKey = parseHelloRsp(payload); generateSessionECDHSecret(theirPublicKey); + SessionProperties sessionProperties = new SessionProperties(SessionProperties.ProtocolVersion.LEGACY); try { - byte[] encryptedSessionProperties = - Arrays.copyOfRange(payload, ECDSAKeys.ENCODED_PUBLIC_KEY_LENGTH_BYTES, payload.length); - mSessionProperties = parseSessionProps(encryptedSessionProperties); - } catch (IndexOutOfBoundsException e) { - mSessionProperties = new SessionProperties(SessionProperties.ProtocolVersion.LEGACY); + if (mSupportedProtocolVersions.contains(SessionProperties.ProtocolVersion.V1)) { + byte[] encryptedSessionProperties = + Arrays.copyOfRange(payload, ECDSAKeys.ENCODED_PUBLIC_KEY_LENGTH_BYTES, payload.length); + sessionProperties = parseSessionProps(encryptedSessionProperties); + } + } finally { + mSessionProperties = sessionProperties; } doSessionEstablished(); diff --git a/android/clientlib/src/main/java/com/solana/mobilewalletadapter/clientlib/scenario/LocalAssociationIntentCreator.java b/android/clientlib/src/main/java/com/solana/mobilewalletadapter/clientlib/scenario/LocalAssociationIntentCreator.java index 4df1ff27..fe1ccbf0 100644 --- a/android/clientlib/src/main/java/com/solana/mobilewalletadapter/clientlib/scenario/LocalAssociationIntentCreator.java +++ b/android/clientlib/src/main/java/com/solana/mobilewalletadapter/clientlib/scenario/LocalAssociationIntentCreator.java @@ -18,8 +18,7 @@ import com.solana.mobilewalletadapter.common.AssociationContract; import com.solana.mobilewalletadapter.common.protocol.SessionProperties; -import java.util.ArrayList; -import java.util.List; +import java.util.Set; public class LocalAssociationIntentCreator { @@ -35,14 +34,15 @@ public static Intent createAssociationIntent(@Nullable Uri endpointPrefix, return new Intent() .setAction(Intent.ACTION_VIEW) .addCategory(Intent.CATEGORY_BROWSABLE) - .setData(createAssociationUri(endpointPrefix, port, associationToken, session.getSupportedProtocolVersions())); + .setData(createAssociationUri(endpointPrefix, port, associationToken, + session.getSupportedProtocolVersions())); } public static boolean isWalletEndpointAvailable(@NonNull PackageManager pm) { final Intent intent = new Intent() .setAction(Intent.ACTION_VIEW) .addCategory(Intent.CATEGORY_BROWSABLE) - .setData(createAssociationUri(null, 0, "", new ArrayList<>())); + .setData(createAssociationUri(null, 0, "", Set.of())); final ResolveInfo resolveInfo = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); return (resolveInfo != null); } @@ -51,7 +51,7 @@ public static boolean isWalletEndpointAvailable(@NonNull PackageManager pm) { private static Uri createAssociationUri(@Nullable Uri endpointPrefix, @IntRange(from = 0, to = 65535) int port, @NonNull String associationToken, - @NonNull List supportedProtocolVersions) { + @NonNull Set supportedProtocolVersions) { if (endpointPrefix != null && (!"https".equals(endpointPrefix.getScheme()) || !endpointPrefix.isHierarchical())) { throw new IllegalArgumentException("Endpoint-specific URI prefix must be absolute with scheme 'https' and hierarchical"); } diff --git a/android/clientlib/src/main/java/com/solana/mobilewalletadapter/clientlib/scenario/LocalAssociationScenario.java b/android/clientlib/src/main/java/com/solana/mobilewalletadapter/clientlib/scenario/LocalAssociationScenario.java index 5c61523a..02d9f9f6 100644 --- a/android/clientlib/src/main/java/com/solana/mobilewalletadapter/clientlib/scenario/LocalAssociationScenario.java +++ b/android/clientlib/src/main/java/com/solana/mobilewalletadapter/clientlib/scenario/LocalAssociationScenario.java @@ -15,14 +15,12 @@ import com.solana.mobilewalletadapter.clientlib.transport.websockets.MobileWalletAdapterWebSocket; import com.solana.mobilewalletadapter.common.WebSocketsTransportContract; import com.solana.mobilewalletadapter.common.protocol.MobileWalletAdapterSessionCommon; -import com.solana.mobilewalletadapter.common.protocol.SessionProperties; import com.solana.mobilewalletadapter.common.util.NotifyOnCompleteFuture; import com.solana.mobilewalletadapter.common.util.NotifyingCompletableFuture; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; -import java.util.List; import java.util.Random; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -57,13 +55,7 @@ public MobileWalletAdapterSession getSession() { return mMobileWalletAdapterSession; } - @Deprecated public LocalAssociationScenario(@IntRange(from = 0) int clientTimeoutMs) { - this(clientTimeoutMs, List.of(SessionProperties.ProtocolVersion.LEGACY)); - } - - public LocalAssociationScenario(@IntRange(from = 0) int clientTimeoutMs, - @NonNull List supportedProtocolVersions) { super(clientTimeoutMs); mPort = new Random().nextInt(WebSocketsTransportContract.WEBSOCKETS_LOCAL_PORT_MAX - @@ -79,8 +71,7 @@ public LocalAssociationScenario(@IntRange(from = 0) int clientTimeoutMs, mMobileWalletAdapterSession = new MobileWalletAdapterSession( mMobileWalletAdapterClient, - mSessionStateCallbacks, - supportedProtocolVersions); + mSessionStateCallbacks); Log.v(TAG, "Creating local association scenario for " + mWebSocketUri); }