Example #1
0
        public static void StoreSession(SignalProtocolAddress address, SessionRecord record)
        {
            string index = GetSessionCacheIndex(address.Name, address.DeviceId);

            lock (DBLock)
            {
                using (var ctx = new LibsignalDBContext())
                {
                    var session = ctx.Sessions
                                  .Where(s => s.DeviceId == address.DeviceId && s.Username == address.Name)
                                  .SingleOrDefault();
                    if (session != null)
                    {
                        session.Session = Base64.encodeBytes(record.serialize());
                    }
                    else
                    {
                        ctx.Sessions.Add(new SignalSession()
                        {
                            DeviceId = address.DeviceId,
                            Session  = Base64.encodeBytes(record.serialize()),
                            Username = address.Name
                        });
                    }
                    SessionsCache[index] = record;
                    ctx.SaveChanges();
                }
            }
        }
Example #2
0
 public static void SaveOrUpdateSignalStore(SignalStore store)
 {
     lock (DBLock)
     {
         using (var ctx = new LibsignalDBContext())
         {
             var old = ctx.Store.SingleOrDefault();
             if (old != null)
             {
                 old.DeviceId           = store.DeviceId;
                 old.IdentityKeyPair    = store.IdentityKeyPair;
                 old.NextSignedPreKeyId = store.NextSignedPreKeyId;
                 old.Password           = store.Password;
                 old.PreKeyIdOffset     = store.PreKeyIdOffset;
                 old.Registered         = store.Registered;
                 old.RegistrationId     = store.RegistrationId;
                 old.SignalingKey       = store.SignalingKey;
                 old.Username           = store.Username;
             }
             else
             {
                 ctx.Store.Add(store);
             }
             ctx.SaveChanges();
         }
     }
 }
Example #3
0
 public static void SaveIdentityLocked(SignalProtocolAddress address, string identity)
 {
     lock (DBLock)
     {
         using (var ctx = new LibsignalDBContext())
         {
             var old = ctx.Identities
                       .Where(i => i.Username == address.Name)
                       .FirstOrDefault(); //could contain stale data
             if (old == null)
             {
                 ctx.Identities.Add(new SignalIdentity()
                 {
                     IdentityKey    = identity,
                     Username       = address.Name,
                     VerifiedStatus = VerifiedStatus.Default
                 });
             }
             else if (old.IdentityKey != identity)
             {
                 if (old.VerifiedStatus == VerifiedStatus.Verified)
                 {
                     old.VerifiedStatus = VerifiedStatus.Unverified;
                 }
                 old.IdentityKey = identity;
                 var childSessions = ctx.Sessions
                                     .Where(s => s.Username == address.Name && s.DeviceId != address.DeviceId);
                 ctx.Sessions.RemoveRange(childSessions);
                 var messages = InsertIdentityChangedMessages(address.Name);
                 SignalLibHandle.Instance.DispatchHandleIdentityKeyChange(messages);
             }
             ctx.SaveChanges();
         }
     }
 }
Example #4
0
 public static void UpdateNextSignedPreKeyId(uint nextSignedPreKeyId)
 {
     lock (DBLock)
     {
         using (var ctx = new LibsignalDBContext())
         {
             var s = ctx.Store.Single();
             s.NextSignedPreKeyId = nextSignedPreKeyId;
             ctx.SaveChanges();
         }
     }
 }
Example #5
0
 public static void UpdatePreKeyIdOffset(uint preKeyIdOffset)
 {
     lock (DBLock)
     {
         using (var ctx = new LibsignalDBContext())
         {
             var s = ctx.Store.Single();
             s.PreKeyIdOffset = preKeyIdOffset;
             ctx.SaveChanges();
         }
     }
 }
Example #6
0
 public static void RemoveSignedPreKey(uint id)
 {
     lock (DBLock)
     {
         using (var ctx = new LibsignalDBContext())
         {
             var old = ctx.SignedPreKeys.Where(k => k.Id == id).SingleOrDefault();
             if (old != null)
             {
                 ctx.SignedPreKeys.Remove(old);
                 ctx.SaveChanges();
             }
         }
     }
 }
Example #7
0
 public static void StoreSignedPreKey(uint signedPreKeyId, SignedPreKeyRecord record)
 {
     lock (DBLock)
     {
         using (var ctx = new LibsignalDBContext())
         {
             ctx.SignedPreKeys.Add(new SignalSignedPreKey()
             {
                 Id  = signedPreKeyId,
                 Key = Base64.encodeBytes(record.serialize())
             });
             ctx.SaveChanges();
         }
     }
 }
 public static void DeleteSession(SignalProtocolAddress address)
 {
     lock (DBLock)
     {
         string index = GetSessionCacheIndex(address.Name, address.DeviceId);
         SessionsCache.Remove(index);
         using (var ctx = new LibsignalDBContext())
         {
             var sessions = ctx.Sessions
                            .Where(s => s.Username == address.Name && s.DeviceId == address.DeviceId);
             ctx.Sessions.RemoveRange(sessions);
             ctx.SaveChanges();
         }
     }
 }
        public static async Task SaveIdentityLocked(SignalProtocolAddress address, string identity)
        {
            LinkedList <SignalMessage> messages = null;

            lock (DBLock)
            {
                using (var ctx = new LibsignalDBContext())
                {
                    var old = ctx.Identities
                              .Where(i => i.Username == address.Name)
                              .FirstOrDefault(); //could contain stale data
                    if (old == null)
                    {
                        ctx.Identities.Add(new SignalIdentity()
                        {
                            IdentityKey    = identity,
                            Username       = address.Name,
                            VerifiedStatus = VerifiedStatus.Default
                        });
                    }
                    else if (old.IdentityKey != identity)
                    {
                        if (old.VerifiedStatus == VerifiedStatus.Verified)
                        {
                            old.VerifiedStatus = VerifiedStatus.Unverified;
                        }
                        old.IdentityKey = identity;
                        var oldSessions = ctx.Sessions
                                          .Where(s => s.Username == address.Name);
                        foreach (var oldSession in oldSessions)
                        {
                            SessionRecord sessionRecord = new SessionRecord(Base64.Decode(oldSession.Session));
                            sessionRecord.archiveCurrentState();
                            oldSession.Session = Base64.EncodeBytes(sessionRecord.serialize());
                            SessionsCache[GetSessionCacheIndex(address.Name, oldSession.DeviceId)] = sessionRecord;
                        }
                        messages = InsertIdentityChangedMessages(address.Name);
                    }
                    ctx.SaveChanges();
                }
            }
            if (messages != null)
            {
                await SignalLibHandle.Instance.DispatchHandleIdentityKeyChange(messages);
            }
        }
Example #10
0
 public static void RemovePreKey(uint preKeyId)
 {
     lock (DBLock)
     {
         using (var ctx = new LibsignalDBContext())
         {
             var preKey = ctx.PreKeys
                          .AsNoTracking()
                          .Where(b => b.Id == preKeyId)
                          .SingleOrDefault();
             if (preKey != null)
             {
                 ctx.PreKeys.Remove(preKey);
                 ctx.SaveChanges();
             }
         }
     }
 }
Example #11
0
 public static void DeleteAllSessions(string name)
 {
     lock (DBLock)
     {
         using (var ctx = new LibsignalDBContext())
         {
             var sessions = ctx.Sessions
                            .Where(s => s.Username == name)
                            .ToList();
             foreach (var session in sessions)
             {
                 SessionsCache.Remove(GetSessionCacheIndex(name, session.DeviceId));
             }
             ctx.Sessions.RemoveRange(sessions);
             ctx.SaveChanges();
         }
     }
 }
Example #12
0
 public static void SaveIdentityLocked(SignalProtocolAddress address, string identity)
 {
     lock (DBLock)
     {
         using (var ctx = new LibsignalDBContext())
         {
             var old = ctx.Identities
                       .Where(i => i.Username == address.Name)
                       .FirstOrDefault(); //could contain stale data
             if (old == null)
             {
                 ctx.Identities.Add(new SignalIdentity()
                 {
                     IdentityKey    = identity,
                     Username       = address.Name,
                     VerifiedStatus = VerifiedStatus.Default
                 });
             }
             else if (old.IdentityKey != identity)
             {
                 if (old.VerifiedStatus == VerifiedStatus.Verified)
                 {
                     old.VerifiedStatus = VerifiedStatus.Unverified;
                 }
                 old.IdentityKey = identity;
                 var childSessions = ctx.Sessions
                                     .Where(s => s.Username == address.Name && s.DeviceId != address.DeviceId);
                 ctx.Sessions.RemoveRange(childSessions);
                 Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() =>
                 {
                     await App.ViewModels.MainPageInstance.UIHandleIdentityKeyChange(address.Name);
                 }).AsTask().Wait();
             }
             ctx.SaveChanges();
         }
     }
 }