Skip to content

Commit a542964

Browse files
committed
Delete expired messages on startup
1 parent afe26af commit a542964

File tree

6 files changed

+55
-6
lines changed

6 files changed

+55
-6
lines changed

Signal-Windows.Lib/DisappearingMessagesManager.cs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Linq;
55
using System.Text;
66
using System.Threading.Tasks;
7+
using libsignalservice.util;
78
using Signal_Windows.Models;
89
using Signal_Windows.Storage;
910
using Windows.UI.Core;
@@ -35,9 +36,14 @@ public static void RemoveFrontend(CoreDispatcher coreDispatcher)
3536
}
3637
}
3738

38-
public static void AddMessage(SignalMessage message)
39+
/// <summary>
40+
/// Queues a message for deletion.
41+
/// </summary>
42+
/// <param name="message">The message to queue for deletion</param>
43+
/// <remarks>If the message expire time is 0 then the message will not be deleted.</remarks>
44+
public static void QueueForDeletion(SignalMessage message)
3945
{
40-
if (message.ExpiresAt == 0)
46+
if (message.ExpiresAt <= 0)
4147
{
4248
return;
4349
}
@@ -61,6 +67,19 @@ public static void AddMessage(SignalMessage message)
6167
Task.Run(deleteTask);
6268
}
6369

70+
/// <summary>
71+
/// Deletes expired messages from the database.
72+
/// </summary>
73+
public static void DeleteExpiredMessages()
74+
{
75+
long currentTimeMillis = Util.CurrentTimeMillis();
76+
List<SignalMessage> expiredMessages = SignalDBContext.GetExpiredMessages(currentTimeMillis);
77+
foreach (var expiredMessage in expiredMessages)
78+
{
79+
DeleteFromDb(expiredMessage);
80+
}
81+
}
82+
6483
private static async Task DeleteMessage(SignalMessage message)
6584
{
6685
List<Task> operations = new List<Task>();
@@ -89,6 +108,11 @@ await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
89108
await t;
90109
}
91110

111+
DeleteFromDb(message);
112+
}
113+
114+
private static void DeleteFromDb(SignalMessage message)
115+
{
92116
foreach (var attachment in message.Attachments)
93117
{
94118
SignalDBContext.DeleteAttachment(attachment);

Signal-Windows.Lib/IncomingMessages.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,7 @@ private async Task HandleSignalMessage(SignalServiceEnvelope envelope, SignalSer
686686
// Make sure to update attachments count
687687
message.AttachmentsCount = (uint)attachments.Count;
688688
}
689-
DisappearingMessagesManager.AddMessage(message);
689+
DisappearingMessagesManager.QueueForDeletion(message);
690690
await SignalLibHandle.Instance.SaveAndDispatchSignalMessage(message, conversation);
691691
}
692692
}

Signal-Windows.Lib/OutgoingMessages.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public async Task HandleOutgoingMessages()
8181
{
8282
await MessageSender.SendMessage(Token, new SignalServiceAddress(outgoingSignalMessage.ThreadId), message);
8383
UpdateExpiresAt(outgoingSignalMessage);
84-
DisappearingMessagesManager.AddMessage(outgoingSignalMessage);
84+
DisappearingMessagesManager.QueueForDeletion(outgoingSignalMessage);
8585
outgoingSignalMessage.Status = SignalMessageStatus.Confirmed;
8686
}
8787
}
@@ -105,7 +105,7 @@ public async Task HandleOutgoingMessages()
105105
{
106106
await SendMessage(recipients, message);
107107
UpdateExpiresAt(outgoingSignalMessage);
108-
DisappearingMessagesManager.AddMessage(outgoingSignalMessage);
108+
DisappearingMessagesManager.QueueForDeletion(outgoingSignalMessage);
109109
outgoingSignalMessage.Status = SignalMessageStatus.Confirmed;
110110
}
111111
}

Signal-Windows.Lib/Storage/DB.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,29 @@ public static SignalMessage IncreaseReceiptCountLocked(SignalServiceEnvelope env
919919
return set_mark? m : null;
920920
}
921921

922+
/// <summary>
923+
/// Gets messages older than the given timestamp.
924+
/// </summary>
925+
/// <param name="timestamp">Timestamp in millis</param>
926+
/// <returns>Expired messages</returns>
927+
public static List<SignalMessage> GetExpiredMessages(long timestampMillis)
928+
{
929+
lock (DBLock)
930+
{
931+
using (var ctx = new SignalDBContext())
932+
{
933+
var messages = ctx.Messages
934+
.Where(m => m.ExpiresAt > 0)
935+
.Where(m => m.ExpiresAt < timestampMillis)
936+
.Include(m => m.Attachments)
937+
.Include(m => m.Content)
938+
.AsNoTracking()
939+
.ToList();
940+
return messages;
941+
}
942+
}
943+
}
944+
922945
public static void DeleteMessage(SignalMessage message)
923946
{
924947
lock (DBLock)

Signal-Windows.RC/SignalBackgroundTask.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ public sealed class SignalBackgroundTask : IBackgroundTask
3030

3131
public void Run(IBackgroundTaskInstance taskInstance)
3232
{
33-
3433
Logger.LogInformation("Background task starting");
3534
Deferral = taskInstance.GetDeferral();
3635
SignalLogging.SetupLogging(false);

Signal-Windows/App.xaml.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public static SignalWindowsFrontend CurrentSignalWindowsFrontend(int id)
7575
private async void App_Resuming(object sender, object e)
7676
{
7777
Logger.LogInformation("Resuming");
78+
DisappearingMessagesManager.DeleteExpiredMessages();
7879
await Handle.Reacquire();
7980
}
8081

@@ -96,6 +97,7 @@ private void OnUnhandledException(object sender, UnhandledExceptionEventArgs ex)
9697
protected override async void OnActivated(IActivatedEventArgs args)
9798
{
9899
Logger.LogInformation("OnActivated() {0}", args.GetType());
100+
DisappearingMessagesManager.DeleteExpiredMessages();
99101
if (args is ToastNotificationActivatedEventArgs toastArgs)
100102
{
101103
string requestedConversation = toastArgs.Argument;
@@ -148,6 +150,7 @@ await Views[currentId].Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
148150
protected override async void OnLaunched(LaunchActivatedEventArgs e)
149151
{
150152
Logger.LogInformation("Launching (PreviousExecutionState={0})", e.PreviousExecutionState);
153+
DisappearingMessagesManager.DeleteExpiredMessages();
151154
try
152155
{
153156
string taskName = "SignalMessageBackgroundTask";

0 commit comments

Comments
 (0)