1 package org
.asamk
.signal
.manager
.storage
.messageCache
;
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
;
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
;
19 public class MessageCache
{
21 private final static Logger logger
= LoggerFactory
.getLogger(MessageCache
.class);
23 private final File messageCachePath
;
25 public MessageCache(final File messageCachePath
) {
26 this.messageCachePath
= messageCachePath
;
29 public Iterable
<CachedMessage
> getCachedMessages() {
30 if (!messageCachePath
.exists()) {
31 return Collections
.emptyList();
34 return Arrays
.stream(Objects
.requireNonNull(messageCachePath
.listFiles())).flatMap(dir
-> {
36 return Stream
.of(dir
);
39 final File
[] files
= Objects
.requireNonNull(dir
.listFiles());
40 if (files
.length
== 0) {
42 Files
.delete(dir
.toPath());
43 } catch (IOException e
) {
44 logger
.warn("Failed to delete cache dir “{}”, ignoring: {}", dir
, e
.getMessage());
46 return Stream
.empty();
48 return Arrays
.stream(files
).filter(File
::isFile
);
49 }).map(CachedMessage
::new).collect(Collectors
.toList());
52 public CachedMessage
cacheMessage(SignalServiceEnvelope envelope
) {
53 final long now
= new Date().getTime();
54 final String source
= envelope
.hasSource() ? envelope
.getSourceAddress().getLegacyIdentifier() : "";
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());
66 private File
getMessageCachePath(String sender
) {
67 if (sender
== null || sender
.isEmpty()) {
68 return messageCachePath
;
71 return new File(messageCachePath
, sender
.replace("/", "_"));
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
);