]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/prekeys/LegacyPreKeyStore.java
f1151b2328b8af6570cba5d28899fa9bd65b717f
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / storage / prekeys / LegacyPreKeyStore.java
1 package org.asamk.signal.manager.storage.prekeys;
2
3 import org.signal.libsignal.protocol.InvalidMessageException;
4 import org.signal.libsignal.protocol.state.PreKeyRecord;
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 LegacyPreKeyStore {
16
17 private final static Logger logger = LoggerFactory.getLogger(LegacyPreKeyStore.class);
18 static final Pattern preKeyFileNamePattern = Pattern.compile("(\\d+)");
19
20 public static void migrate(File preKeysPath, PreKeyStore preKeyStore) {
21 final var files = preKeysPath.listFiles();
22 if (files == null) {
23 return;
24 }
25 final var preKeyRecords = Arrays.stream(files)
26 .filter(f -> preKeyFileNamePattern.matcher(f.getName()).matches())
27 .map(LegacyPreKeyStore::loadPreKeyRecord)
28 .toList();
29 preKeyStore.addLegacyPreKeys(preKeyRecords);
30 removeAllPreKeys(preKeysPath);
31 }
32
33 private static void removeAllPreKeys(File preKeysPath) {
34 final var files = preKeysPath.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 pre key file {}: {}", file, e.getMessage());
44 }
45 }
46 try {
47 Files.delete(preKeysPath.toPath());
48 } catch (IOException e) {
49 logger.error("Failed to delete pre key directory {}: {}", preKeysPath, e.getMessage());
50 }
51 }
52
53 private static PreKeyRecord loadPreKeyRecord(final File file) {
54 try (var inputStream = new FileInputStream(file)) {
55 return new PreKeyRecord(inputStream.readAllBytes());
56 } catch (IOException | InvalidMessageException e) {
57 logger.error("Failed to load pre key: {}", e.getMessage());
58 throw new AssertionError(e);
59 }
60 }
61 }