]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/util/Utils.java
Use var instead of explicit types
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / util / Utils.java
1 package org.asamk.signal.manager.util;
2
3 import com.fasterxml.jackson.databind.JsonNode;
4
5 import org.whispersystems.libsignal.IdentityKey;
6 import org.whispersystems.libsignal.fingerprint.NumericFingerprintGenerator;
7 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
8 import org.whispersystems.signalservice.api.util.StreamDetails;
9 import org.whispersystems.signalservice.api.util.UuidUtil;
10
11 import java.io.BufferedInputStream;
12 import java.io.File;
13 import java.io.FileInputStream;
14 import java.io.IOException;
15 import java.io.InputStream;
16 import java.io.InvalidObjectException;
17 import java.net.URLConnection;
18 import java.nio.file.Files;
19
20 public class Utils {
21
22 public static String getFileMimeType(File file, String defaultMimeType) throws IOException {
23 var mime = Files.probeContentType(file.toPath());
24 if (mime == null) {
25 try (InputStream bufferedStream = new BufferedInputStream(new FileInputStream(file))) {
26 mime = URLConnection.guessContentTypeFromStream(bufferedStream);
27 }
28 }
29 if (mime == null) {
30 return defaultMimeType;
31 }
32 return mime;
33 }
34
35 public static StreamDetails createStreamDetailsFromFile(File file) throws IOException {
36 InputStream stream = new FileInputStream(file);
37 final var size = file.length();
38 final var mime = getFileMimeType(file, "application/octet-stream");
39 return new StreamDetails(stream, mime, size);
40 }
41
42 public static String computeSafetyNumber(
43 boolean isUuidCapable,
44 SignalServiceAddress ownAddress,
45 IdentityKey ownIdentityKey,
46 SignalServiceAddress theirAddress,
47 IdentityKey theirIdentityKey
48 ) {
49 int version;
50 byte[] ownId;
51 byte[] theirId;
52
53 if (isUuidCapable && ownAddress.getUuid().isPresent() && theirAddress.getUuid().isPresent()) {
54 // Version 2: UUID user
55 version = 2;
56 ownId = UuidUtil.toByteArray(ownAddress.getUuid().get());
57 theirId = UuidUtil.toByteArray(theirAddress.getUuid().get());
58 } else {
59 // Version 1: E164 user
60 version = 1;
61 if (!ownAddress.getNumber().isPresent() || !theirAddress.getNumber().isPresent()) {
62 return "INVALID ID";
63 }
64 ownId = ownAddress.getNumber().get().getBytes();
65 theirId = theirAddress.getNumber().get().getBytes();
66 }
67
68 var fingerprint = new NumericFingerprintGenerator(5200).createFor(version,
69 ownId,
70 ownIdentityKey,
71 theirId,
72 theirIdentityKey);
73 return fingerprint.getDisplayableFingerprint().getDisplayText();
74 }
75
76 public static SignalServiceAddress getSignalServiceAddressFromIdentifier(final String identifier) {
77 if (UuidUtil.isUuid(identifier)) {
78 return new SignalServiceAddress(UuidUtil.parseOrNull(identifier), null);
79 } else {
80 return new SignalServiceAddress(null, identifier);
81 }
82 }
83
84 public static JsonNode getNotNullNode(JsonNode parent, String name) throws InvalidObjectException {
85 var node = parent.get(name);
86 if (node == null || node.isNull()) {
87 throw new InvalidObjectException(String.format("Incorrect file format: expected parameter %s not found ",
88 name));
89 }
90
91 return node;
92 }
93 }