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(); } } }
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(); } } }
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(); } } }
public static void UpdateNextSignedPreKeyId(uint nextSignedPreKeyId) { lock (DBLock) { using (var ctx = new LibsignalDBContext()) { var s = ctx.Store.Single(); s.NextSignedPreKeyId = nextSignedPreKeyId; ctx.SaveChanges(); } } }
public static void UpdatePreKeyIdOffset(uint preKeyIdOffset) { lock (DBLock) { using (var ctx = new LibsignalDBContext()) { var s = ctx.Store.Single(); s.PreKeyIdOffset = preKeyIdOffset; ctx.SaveChanges(); } } }
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(); } } } }
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); } }
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(); } } } }
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(); } } }
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(); } } }