]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java
Check for null query when decoding device link uri
[signal-cli] / src / main / java / org / asamk / signal / manager / DeviceLinkInfo.java
1 package org.asamk.signal.manager;
2
3 import org.whispersystems.libsignal.InvalidKeyException;
4 import org.whispersystems.libsignal.ecc.Curve;
5 import org.whispersystems.libsignal.ecc.ECPublicKey;
6 import org.whispersystems.util.Base64;
7
8 import java.io.IOException;
9 import java.net.URI;
10 import java.net.URLDecoder;
11 import java.net.URLEncoder;
12 import java.nio.charset.StandardCharsets;
13 import java.util.HashMap;
14 import java.util.Map;
15
16 import static org.whispersystems.signalservice.internal.util.Util.isEmpty;
17
18 public class DeviceLinkInfo {
19
20 final String deviceIdentifier;
21 final ECPublicKey deviceKey;
22
23 public static DeviceLinkInfo parseDeviceLinkUri(URI linkUri) throws IOException, InvalidKeyException {
24 final String rawQuery = linkUri.getRawQuery();
25 if (isEmpty(rawQuery)) {
26 throw new RuntimeException("Invalid device link uri");
27 }
28
29 Map<String, String> query = getQueryMap(rawQuery);
30 String deviceIdentifier = query.get("uuid");
31 String publicKeyEncoded = query.get("pub_key");
32
33 if (isEmpty(deviceIdentifier) || isEmpty(publicKeyEncoded)) {
34 throw new RuntimeException("Invalid device link uri");
35 }
36
37 ECPublicKey deviceKey = Curve.decodePoint(Base64.decode(publicKeyEncoded), 0);
38
39 return new DeviceLinkInfo(deviceIdentifier, deviceKey);
40 }
41
42 private static Map<String, String> getQueryMap(String query) {
43 String[] params = query.split("&");
44 Map<String, String> map = new HashMap<>();
45 for (String param : params) {
46 final String[] paramParts = param.split("=");
47 String name = URLDecoder.decode(paramParts[0], StandardCharsets.UTF_8);
48 String value = URLDecoder.decode(paramParts[1], StandardCharsets.UTF_8);
49 map.put(name, value);
50 }
51 return map;
52 }
53
54 public DeviceLinkInfo(final String deviceIdentifier, final ECPublicKey deviceKey) {
55 this.deviceIdentifier = deviceIdentifier;
56 this.deviceKey = deviceKey;
57 }
58
59 public String createDeviceLinkUri() {
60 return "tsdevice:/?uuid="
61 + URLEncoder.encode(deviceIdentifier, StandardCharsets.UTF_8)
62 + "&pub_key="
63 + URLEncoder.encode(Base64.encodeBytesWithoutPadding(deviceKey.serialize()), StandardCharsets.UTF_8);
64 }
65 }