]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/manager/storage/messageCache/MessageCache.java
4e48ee76502adf8099e898a2cac3f3294006f3b5
[signal-cli] / src / main / java / org / asamk / signal / manager / storage / messageCache / MessageCache.java
1 package org.asamk.signal.manager.storage.messageCache;
2
3 import org.asamk.signal.manager.util.IOUtils;
4 import org.asamk.signal.manager.util.MessageCacheUtils;
5 import org.slf4j.Logger;
6 import org.slf4j.LoggerFactory;
7 import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
8
9 import java.io.File;
10 import java.io.IOException;
11 import java.nio.file.Files;
12 import java.util.Arrays;
13 import java.util.Collections;
14 import java.util.Date;
15 import java.util.Objects;
16 import java.util.stream.Collectors;
17 import java.util.stream.Stream;
18
19 public class MessageCache {
20
21 final static Logger logger = LoggerFactory.getLogger(MessageCache.class);
22
23 private final File messageCachePath;
24
25 public MessageCache(final File messageCachePath) {
26 this.messageCachePath = messageCachePath;
27 }
28
29 public Iterable<CachedMessage> getCachedMessages() {
30 if (!messageCachePath.exists()) {
31 return Collections.emptyList();
32 }
33
34 return Arrays.stream(Objects.requireNonNull(messageCachePath.listFiles())).flatMap(dir -> {
35 if (dir.isFile()) {
36 return Stream.of(dir);
37 }
38
39 final File[] files = Objects.requireNonNull(dir.listFiles());
40 if (files.length == 0) {
41 try {
42 Files.delete(dir.toPath());
43 } catch (IOException e) {
44 logger.warn("Failed to delete cache dir “{}”, ignoring: {}", dir, e.getMessage());
45 }
46 return Stream.empty();
47 }
48 return Arrays.stream(files).filter(File::isFile);
49 }).map(CachedMessage::new).collect(Collectors.toList());
50 }
51
52 public CachedMessage cacheMessage(SignalServiceEnvelope envelope) {
53 final long now = new Date().getTime();
54 final String source = envelope.hasSource() ? envelope.getSourceAddress().getLegacyIdentifier() : "";
55
56 try {
57 File cacheFile = getMessageCacheFile(source, now, envelope.getTimestamp());
58 MessageCacheUtils.storeEnvelope(envelope, cacheFile);
59 return new CachedMessage(cacheFile);
60 } catch (IOException e) {
61 logger.warn("Failed to store encrypted message in disk cache, ignoring: {}", e.getMessage());
62 return null;
63 }
64 }
65
66 private File getMessageCachePath(String sender) {
67 if (sender == null || sender.isEmpty()) {
68 return messageCachePath;
69 }
70
71 return new File(messageCachePath, sender.replace("/", "_"));
72 }
73
74 private File getMessageCacheFile(String sender, long now, long timestamp) throws IOException {
75 File cachePath = getMessageCachePath(sender);
76 IOUtils.createPrivateDirectories(cachePath);
77 return new File(cachePath, now + "_" + timestamp);
78 }
79 }