]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/prekeys/LegacySignedPreKeyStore.java
8e34776c45a6fa90423d8790f38417b73b8fef27
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / storage / prekeys / LegacySignedPreKeyStore.java
1 package org.asamk.signal.manager.storage.prekeys;
2
3 import org.signal.libsignal.protocol.InvalidMessageException;
4 import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
5 import org.slf4j.Logger;
6 import org.slf4j.LoggerFactory;
7
8 import java.io.File;
9 import java.io.FileInputStream;
10 import java.io.IOException;
11 import java.nio.file.Files;
12 import java.util.Arrays;
13 import java.util.regex.Pattern;
14
15 public class LegacySignedPreKeyStore {
16
17 private final static Logger logger = LoggerFactory.getLogger(LegacySignedPreKeyStore.class);
18 static final Pattern signedPreKeyFileNamePattern = Pattern.compile("(\\d+)");
19
20 public static void migrate(File signedPreKeysPath, SignedPreKeyStore signedPreKeyStore) {
21 final var files = signedPreKeysPath.listFiles();
22 if (files == null) {
23 return;
24 }
25 final var signedPreKeyRecords = Arrays.stream(files)
26 .filter(f -> signedPreKeyFileNamePattern.matcher(f.getName()).matches())
27 .map(LegacySignedPreKeyStore::loadSignedPreKeyRecord)
28 .toList();
29 signedPreKeyStore.addLegacySignedPreKeys(signedPreKeyRecords);
30 removeAllSignedPreKeys(signedPreKeysPath);
31 }
32
33 private static void removeAllSignedPreKeys(File signedPreKeysPath) {
34 final var files = signedPreKeysPath.listFiles();
35 if (files == null) {
36 return;
37 }
38
39 for (var file : files) {
40 try {
41 Files.delete(file.toPath());
42 } catch (IOException e) {
43 logger.error("Failed to delete signed pre key file {}: {}", file, e.getMessage());
44 }
45 }
46 try {
47 Files.delete(signedPreKeysPath.toPath());
48 } catch (IOException e) {
49 logger.error("Failed to delete signed pre key directory {}: {}", signedPreKeysPath, e.getMessage());
50 }
51 }
52
53 private static SignedPreKeyRecord loadSignedPreKeyRecord(final File file) {
54 try (var inputStream = new FileInputStream(file)) {
55 return new SignedPreKeyRecord(inputStream.readAllBytes());
56 } catch (IOException | InvalidMessageException e) {
57 logger.error("Failed to load signed pre key: {}", e.getMessage());
58 throw new AssertionError(e);
59 }
60 }
61 }