1 package org
.asamk
.signal
.manager
.storage
.prekeys
;
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
;
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
;
15 public class LegacySignedPreKeyStore
{
17 private final static Logger logger
= LoggerFactory
.getLogger(LegacySignedPreKeyStore
.class);
18 static final Pattern signedPreKeyFileNamePattern
= Pattern
.compile("(\\d+)");
20 public static void migrate(File signedPreKeysPath
, SignedPreKeyStore signedPreKeyStore
) {
21 final var files
= signedPreKeysPath
.listFiles();
25 final var signedPreKeyRecords
= Arrays
.stream(files
)
26 .filter(f
-> signedPreKeyFileNamePattern
.matcher(f
.getName()).matches())
27 .map(LegacySignedPreKeyStore
::loadSignedPreKeyRecord
)
29 signedPreKeyStore
.addLegacySignedPreKeys(signedPreKeyRecords
);
30 removeAllSignedPreKeys(signedPreKeysPath
);
33 private static void removeAllSignedPreKeys(File signedPreKeysPath
) {
34 final var files
= signedPreKeysPath
.listFiles();
39 for (var file
: files
) {
41 Files
.delete(file
.toPath());
42 } catch (IOException e
) {
43 logger
.error("Failed to delete signed pre key file {}: {}", file
, e
.getMessage());
47 Files
.delete(signedPreKeysPath
.toPath());
48 } catch (IOException e
) {
49 logger
.error("Failed to delete signed pre key directory {}: {}", signedPreKeysPath
, e
.getMessage());
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
);