Skip to content

Commit 5d08183

Browse files
committed
Sealed senders
1 parent d6c24cb commit 5d08183

File tree

13 files changed

+109
-35
lines changed

13 files changed

+109
-35
lines changed

Signal-Windows.Lib/IncomingMessages.cs

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,9 @@ public async Task OnMessage(SignalServiceMessagePipeMessage message)
7676
await SignalLibHandle.Instance.DispatchMessageUpdate(update);
7777
}
7878
}
79-
else if (envelope.IsPreKeySignalMessage() || envelope.IsSignalMessage())
80-
{
81-
await HandleMessage(envelope);
82-
}
8379
else
8480
{
85-
Logger.LogWarning("OnMessage() could not handle unknown message type {0}", envelope.GetEnvelopeType());
81+
await HandleMessage(envelope);
8682
}
8783
}
8884
else if (message is SignalServiceMessagePipeEmptyMessage)
@@ -107,7 +103,7 @@ public async Task OnMessage(SignalServiceMessagePipeMessage message)
107103

108104
private async Task HandleMessage(SignalServiceEnvelope envelope)
109105
{
110-
var cipher = new SignalServiceCipher(new SignalServiceAddress(SignalLibHandle.Instance.Store.Username), new Store());
106+
var cipher = new SignalServiceCipher(new SignalServiceAddress(SignalLibHandle.Instance.Store.Username), new Store(), LibUtils.GetCertificateValidator());
111107
var content = cipher.Decrypt(envelope);
112108
long timestamp = Util.CurrentTimeMillis();
113109

@@ -318,7 +314,7 @@ private async Task HandleExpirationUpdateMessage(SignalServiceEnvelope envelope,
318314
{
319315
status = 0;
320316
type = SignalMessageDirection.Incoming;
321-
author = await SignalDBContext.GetOrCreateContactLocked(envelope.GetSource(), timestamp);
317+
author = await SignalDBContext.GetOrCreateContactLocked(content.Sender, timestamp);
322318
prefix = $"{author.ThreadDisplayName} has";
323319
composedTimestamp = envelope.GetTimestamp();
324320
if (message.Group != null)
@@ -327,7 +323,7 @@ private async Task HandleExpirationUpdateMessage(SignalServiceEnvelope envelope,
327323
}
328324
else
329325
{
330-
conversation = await SignalDBContext.GetOrCreateContactLocked(envelope.GetSource(), 0);
326+
conversation = await SignalDBContext.GetOrCreateContactLocked(content.Sender, 0);
331327
}
332328
}
333329
conversation.ExpiresInSeconds = (uint) message.ExpiresInSeconds;
@@ -372,10 +368,10 @@ private async Task HandleSessionResetMessage(SignalServiceEnvelope envelope, Sig
372368
{
373369
status = 0;
374370
type = SignalMessageDirection.Incoming;
375-
author = await SignalDBContext.GetOrCreateContactLocked(envelope.GetSource(), timestamp);
371+
author = await SignalDBContext.GetOrCreateContactLocked(content.Sender, timestamp);
376372
prefix = $"{author.ThreadDisplayName} has";
377373
composedTimestamp = envelope.GetTimestamp();
378-
conversationId = envelope.GetSource();
374+
conversationId = content.Sender;
379375
}
380376
LibsignalDBContext.DeleteAllSessions(conversationId);
381377
conversation = await SignalDBContext.GetOrCreateContactLocked(conversationId, 0);
@@ -437,7 +433,7 @@ private async Task HandleGroupLeaveMessage(SignalServiceEnvelope envelope, Signa
437433
SignalGroup group = await SignalDBContext.GetOrCreateGroupLocked(groupid, 0);
438434
if (isSync)
439435
{
440-
SignalContact author = await SignalDBContext.GetOrCreateContactLocked(envelope.GetSource(), 0);
436+
SignalContact author = await SignalDBContext.GetOrCreateContactLocked(content.Sender, 0);
441437
SignalMessage sm = new SignalMessage()
442438
{
443439
Direction = SignalMessageDirection.Incoming,
@@ -456,7 +452,7 @@ private async Task HandleGroupLeaveMessage(SignalServiceEnvelope envelope, Signa
456452
}
457453
else
458454
{
459-
SignalContact author = await SignalDBContext.GetOrCreateContactLocked(envelope.GetSource(), 0);
455+
SignalContact author = await SignalDBContext.GetOrCreateContactLocked(content.Sender, 0);
460456
SignalMessage sm = new SignalMessage()
461457
{
462458
Direction = SignalMessageDirection.Incoming,
@@ -522,7 +518,7 @@ private async Task HandleGroupUpdateMessage(SignalServiceEnvelope envelope, Sign
522518
{
523519
status = 0;
524520
type = SignalMessageDirection.Incoming;
525-
author = await SignalDBContext.GetOrCreateContactLocked(envelope.GetSource(), timestamp);
521+
author = await SignalDBContext.GetOrCreateContactLocked(content.Sender, timestamp);
526522
prefix = $"{author.ThreadDisplayName} has";
527523
composedTimestamp = envelope.GetTimestamp();
528524
}
@@ -600,7 +596,7 @@ private async Task HandleSignalMessage(SignalServiceEnvelope envelope, SignalSer
600596
}
601597
else
602598
{
603-
conversation = await SignalDBContext.GetOrCreateContactLocked(envelope.GetSource(), timestamp);
599+
conversation = await SignalDBContext.GetOrCreateContactLocked(content.Sender, timestamp);
604600
composedTimestamp = envelope.GetTimestamp();
605601
}
606602
}
@@ -615,7 +611,7 @@ private async Task HandleSignalMessage(SignalServiceEnvelope envelope, SignalSer
615611
{
616612
status = 0;
617613
type = SignalMessageDirection.Incoming;
618-
author = await SignalDBContext.GetOrCreateContactLocked(envelope.GetSource(), timestamp);
614+
author = await SignalDBContext.GetOrCreateContactLocked(content.Sender, timestamp);
619615
}
620616

621617
if (author != null && author.Blocked)
@@ -652,7 +648,7 @@ private async Task HandleSignalMessage(SignalServiceEnvelope envelope, SignalSer
652648
SentFileName = pointer.FileName,
653649
ContentType = receivedAttachment.ContentType,
654650
Key = pointer.Key,
655-
Relay = pointer.Relay,
651+
Relay = null,
656652
StorageId = pointer.Id,
657653
Size = (long)pointer.Size,
658654
Digest = pointer.Digest

Signal-Windows.Lib/Models/SignalAttachment.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ public SignalServiceAttachmentPointer ToAttachmentPointer()
2929
return new SignalServiceAttachmentPointer(StorageId,
3030
ContentType,
3131
Key,
32-
Relay,
3332
(uint)Util.ToIntExact(Size),
3433
null,
3534
0,

Signal-Windows.Lib/OutgoingMessages.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using libsignalservice.push;
77
using libsignalservice.push.exceptions;
88
using libsignalservice.util;
9+
using libsignalservicedotnet.crypto;
910
using Microsoft.Extensions.Logging;
1011
using Signal_Windows.Models;
1112
using Signal_Windows.Storage;
@@ -39,7 +40,7 @@ public SignalServiceSyncMessageSendable(SignalServiceSyncMessage message)
3940

4041
public async Task Send(SignalServiceMessageSender messageSender, CancellationToken token)
4142
{
42-
await messageSender.SendMessage(token, SyncMessage);
43+
await messageSender.SendMessage(token, SyncMessage, null);
4344
}
4445
}
4546

@@ -57,7 +58,7 @@ public SignalServiceDataMessageSendable(SignalServiceDataMessage dataMessage, Si
5758

5859
public async Task Send(SignalServiceMessageSender messageSender, CancellationToken token)
5960
{
60-
await messageSender.SendMessage(token, Recipient, DataMessage);
61+
await messageSender.SendMessage(token, Recipient, null, DataMessage);
6162
}
6263
}
6364

@@ -111,7 +112,7 @@ public async Task Send(SignalServiceMessageSender messageSender, CancellationTok
111112
{
112113
if (!token.IsCancellationRequested)
113114
{
114-
await messageSender.SendMessage(token, new SignalServiceAddress(OutgoingSignalMessage.ThreadId), message);
115+
await messageSender.SendMessage(token, new SignalServiceAddress(OutgoingSignalMessage.ThreadId), null, message);
115116
OutgoingSignalMessage.Status = SignalMessageStatus.Confirmed;
116117
}
117118
}
@@ -133,7 +134,12 @@ public async Task Send(SignalServiceMessageSender messageSender, CancellationTok
133134
};
134135
if (!token.IsCancellationRequested)
135136
{
136-
await messageSender.SendMessage(token, recipients, message);
137+
var uaps = new List<UnidentifiedAccessPair>();
138+
foreach (var _ in recipients)
139+
{
140+
uaps.Add(null);
141+
}
142+
await messageSender.SendMessage(token, recipients, uaps, message);
137143
OutgoingSignalMessage.Status = SignalMessageStatus.Confirmed;
138144
}
139145
}
@@ -161,7 +167,7 @@ public async Task HandleOutgoingMessages()
161167
Logger.LogDebug("HandleOutgoingMessages()");
162168
try
163169
{
164-
var messageSender = new SignalServiceMessageSender(Token, LibUtils.ServiceConfiguration, Store.Username, Store.Password, (int)Store.DeviceId, new Store(), Pipe, null, LibUtils.USER_AGENT);
170+
var messageSender = new SignalServiceMessageSender(Token, LibUtils.ServiceConfiguration, Store.Username, Store.Password, (int)Store.DeviceId, new Store(), LibUtils.USER_AGENT, Store.DeviceId != 1, Pipe, null, null);
165171
while (!Token.IsCancellationRequested)
166172
{
167173
ISendable sendable = null;

Signal-Windows.Lib/Signal-Windows.Lib.csproj

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,6 @@
165165
<EmbeddedResource Include="Properties\Signal_Windows.Lib.rd.xml" />
166166
</ItemGroup>
167167
<ItemGroup>
168-
<PackageReference Include="libsignal-service-dotnet">
169-
<Version>2.7.5.17</Version>
170-
</PackageReference>
171168
<PackageReference Include="Microsoft.EntityFrameworkCore">
172169
<Version>1.1.5</Version>
173170
</PackageReference>
@@ -192,6 +189,17 @@
192189
<Name>Windows Mobile Extensions for the UWP</Name>
193190
</SDKReference>
194191
</ItemGroup>
192+
<ItemGroup>
193+
<ProjectReference Include="..\..\libsignal-service-dotnet\libsignal-service-dotnet\libsignal-service-dotnet.csproj">
194+
<Project>{e9a53462-4f57-4a4b-bcf8-7954c6f53e27}</Project>
195+
<Name>libsignal-service-dotnet</Name>
196+
</ProjectReference>
197+
</ItemGroup>
198+
<ItemGroup>
199+
<Reference Include="libsignal-metadata-dotnet">
200+
<HintPath>..\..\libsignal-service-dotnet\libsignal-metadata-dotnet\bin\Debug\netstandard1.4\libsignal-metadata-dotnet.dll</HintPath>
201+
</Reference>
202+
</ItemGroup>
195203
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
196204
<VisualStudioVersion>14.0</VisualStudioVersion>
197205
</PropertyGroup>

Signal-Windows.Lib/SignalLibHandle.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ await Task.Run(async () =>
259259
Logger.LogTrace($"Reacquire() updating frame {f.Value}");
260260
var conversations = GetConversations();
261261
var taskCompletionSource = new TaskCompletionSource<bool>();
262+
Logger.LogTrace($"Invoking CoreDispatcher {f.Key.GetHashCode()}");
262263
await f.Key.RunAsync(CoreDispatcherPriority.Normal, () =>
263264
{
264265
try
@@ -294,6 +295,10 @@ await f.Key.RunAsync(CoreDispatcherPriority.Normal, () =>
294295
InitNetwork();
295296
}
296297
}
298+
catch (Exception e)
299+
{
300+
Logger.LogError($"Reacquire() failed: {e.Message}\n{e.StackTrace}");
301+
}
297302
finally
298303
{
299304
SemaphoreSlim.Release();
@@ -465,11 +470,12 @@ public async Task SendBlockedMessage()
465470
{
466471
List<SignalContact> blockedContacts = SignalDBContext.GetAllContactsLocked().Where(c => c.Blocked).ToList();
467472
List<string> blockedNumbers = new List<string>();
473+
List<byte[]> blockedGroups = new List<byte[]>();
468474
foreach (var contact in blockedContacts)
469475
{
470476
blockedNumbers.Add(contact.ThreadId);
471477
}
472-
var blockMessage = SignalServiceSyncMessage.ForBlocked(new BlockedListMessage(blockedNumbers));
478+
var blockMessage = SignalServiceSyncMessage.ForBlocked(new BlockedListMessage(blockedNumbers, blockedGroups));
473479
OutgoingQueue.Add(new SignalServiceSyncMessageSendable(blockMessage));
474480
await DispatchHandleBlockedContacts(blockedContacts);
475481
}

Signal-Windows.Lib/Storage/DB.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,19 @@ public static async Task SaveIdentityLocked(SignalProtocolAddress address, strin
198198
await SignalLibHandle.Instance.DispatchHandleIdentityKeyChange(messages);
199199
}
200200
}
201+
202+
internal static IdentityKey GetIdentityKey(SignalProtocolAddress address)
203+
{
204+
lock(DBLock)
205+
{
206+
using (var ctx = new LibsignalDBContext())
207+
{
208+
return new IdentityKey(Base64.Decode(ctx.Identities
209+
.Where(identity => identity.Username == address.Name)
210+
.Single().IdentityKey), 0);
211+
}
212+
}
213+
}
201214
#endregion Identities
202215

203216
#region Account
@@ -798,11 +811,12 @@ private static SignalConversation SaveMessage(SignalDBContext ctx, SignalMessage
798811
public static IEnumerable<SignalMessage> GetMessagesLocked(SignalConversation thread, int startIndex, int count)
799812
{
800813
Logger.LogTrace("GetMessagesLocked() skip {0} take {1}", startIndex, count);
814+
var messages = new List<SignalMessage>();
801815
lock (DBLock)
802816
{
803817
using (var ctx = new SignalDBContext())
804818
{
805-
var messages = ctx.Messages
819+
messages = ctx.Messages
806820
.Where(m => m.ThreadId == thread.ThreadId)
807821
.Include(m => m.Content)
808822
.Include(m => m.Author)
@@ -812,9 +826,10 @@ public static IEnumerable<SignalMessage> GetMessagesLocked(SignalConversation th
812826
.AsNoTracking()
813827
.Take(count)
814828
.ToList();
815-
return messages;
816829
}
817830
}
831+
Logger.LogTrace($"GetMessagesLocked() returning {messages.Count} messages");
832+
return messages;
818833
}
819834

820835
public static SignalMessage UpdateMessageStatus(SignalMessage outgoingSignalMessage)

Signal-Windows.Lib/Storage/Store.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,5 +117,10 @@ public void RemoveSignedPreKey(uint signedPreKeyId)
117117
{
118118
LibsignalDBContext.RemoveSignedPreKey(signedPreKeyId);
119119
}
120+
121+
public IdentityKey GetIdentity(SignalProtocolAddress address)
122+
{
123+
return LibsignalDBContext.GetIdentityKey(address);
124+
}
120125
}
121126
}

Signal-Windows.Lib/Util/LibUtils.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
using libsignal.ecc;
2+
using libsignalmetadatadotnet.certificate;
13
using libsignalservice;
24
using libsignalservice.configuration;
35
using libsignalservice.push;
6+
using libsignalservice.util;
47
using Microsoft.Extensions.Logging;
58
using Microsoft.Toolkit.Uwp.Notifications;
69
using System;
@@ -24,6 +27,7 @@ public class LibUtils
2427
private static readonly ILogger Logger = LibsignalLogging.CreateLogger<LibUtils>();
2528
public const string GlobalMutexName = "SignalWindowsPrivateMessenger_Mutex";
2629
public const string GlobalEventWaitHandleName = "SignalWindowsPrivateMessenger_EventWaitHandle";
30+
public static string UNIDENTIFIED_SENDER_TRUST_ROOT = "BXu6QIKVz5MA8gstzfOgRQGqyLqOwNKHL6INkv3IHWMF";
2731
public static string URL = "https://textsecure-service.whispersystems.org";
2832
public static SignalServiceUrl[] ServiceUrls = new SignalServiceUrl[] { new SignalServiceUrl("https://textsecure-service.whispersystems.org") };
2933
public static SignalServiceConfiguration ServiceConfiguration = new SignalServiceConfiguration(ServiceUrls, null);
@@ -60,7 +64,7 @@ public static bool Lock(int timeout)
6064
{
6165
success = GlobalLock.WaitOne(timeout);
6266
}
63-
catch(AbandonedMutexException e)
67+
catch (AbandonedMutexException e)
6468
{
6569
Logger.LogWarning("System lock was abandoned! {0}", e.Message);
6670
success = true;
@@ -74,7 +78,7 @@ public static void Unlock()
7478
Logger.LogTrace("System lock releasing, sync context = {0}", SynchronizationContext.Current);
7579
try
7680
{
77-
if(GlobalLockContext != null)
81+
if (GlobalLockContext != null)
7882
{
7983
GlobalLockContext.Post((a) =>
8084
{
@@ -86,7 +90,7 @@ public static void Unlock()
8690
GlobalLock.ReleaseMutex();
8791
}
8892
}
89-
catch(Exception e)
93+
catch (Exception e)
9094
{
9195
Logger.LogWarning("System lock failed to unlock! {0}\n{1}", e.Message, e.StackTrace);
9296
}
@@ -97,7 +101,7 @@ public static EventWaitHandle OpenResetEventSet()
97101
{
98102
Logger.LogTrace("OpenResetEventSet()");
99103
var handle = new EventWaitHandle(true, EventResetMode.ManualReset, GlobalEventWaitHandleName, out bool createdNew);
100-
if(!createdNew)
104+
if (!createdNew)
101105
{
102106
Logger.LogTrace("OpenResetEventSet() setting old event");
103107
handle.Set();
@@ -133,6 +137,12 @@ public static string GetBGStartMessage()
133137
String.Format(" Signal-Windows BG {0}.{1}.{2}.{3} starting\n", version.Major, version.Minor, version.Build, version.Revision) +
134138
"-------------------------------------------------\n";
135139
}
140+
141+
public static CertificateValidator GetCertificateValidator()
142+
{
143+
ECPublicKey unidentifiedSenderTrustRoot = Curve.decodePoint(Base64.Decode(UNIDENTIFIED_SENDER_TRUST_ROOT), 0);
144+
return new CertificateValidator(unidentifiedSenderTrustRoot);
145+
}
136146
}
137147

138148
public static class StringExt

Signal-Windows.RC/Signal-Windows.RC.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,10 @@
119119
</PackageReference>
120120
</ItemGroup>
121121
<ItemGroup>
122+
<ProjectReference Include="..\..\libsignal-service-dotnet\libsignal-service-dotnet\libsignal-service-dotnet.csproj">
123+
<Project>{e9a53462-4f57-4a4b-bcf8-7954c6f53e27}</Project>
124+
<Name>libsignal-service-dotnet</Name>
125+
</ProjectReference>
122126
<ProjectReference Include="..\Signal-Windows.Lib\Signal-Windows.Lib.csproj">
123127
<Project>{1934fd82-a5ea-4b71-b915-a1826593cb6e}</Project>
124128
<Name>Signal-Windows.Lib</Name>

0 commit comments

Comments
 (0)