Example #1
0
        public static void RefreshPreKeys(SignalServiceAccountManager accountManager) //TODO wrap in extra lock? enforce reload?
        {
            List <PreKeyRecord> oneTimePreKeys     = GeneratePreKeys();
            SignedPreKeyRecord  signedPreKeyRecord = generateSignedPreKey(GetIdentityKeyPair());

            accountManager.setPreKeys(GetIdentityKeyPair().getPublicKey(), signedPreKeyRecord, oneTimePreKeys);
        }
Example #2
0
        protected override async void OnNormalLaunch(LaunchActivatedEventArgs e)
        {
            Frame rootFrame = Window.Current.Content as Frame;



            DispatcherHelper.Initialize();

            accountManager = TextSecureCommunicationFactory.createManager();
            RunWebsocket();



            //await DirectoryHelper.refreshDirectory();

            // var task = new EchoActivity("ASDFFDSA");

            //Worker.AddTaskActivities(websocketTask);
            //App.Current.Worker.AddTaskActivities(new RefreshPreKeysTask());


            if (rootFrame != null && rootFrame.Content == null)
            {
                // When the navigation stack isn't restored navigate to the first page,
                // configuring the new page by passing required information as a navigation
                // parameter
                rootFrame.Navigate(typeof(MainPage), e.Arguments);
            }

            Window.Current.Activate();
        }
 public async Task OnNavigatedTo()
 {
     ContactName    = string.Empty;
     ContactNumber  = string.Empty;
     accountManager = App.Handle.AccountManager;
     await RefreshContacts();
 }
        public async Task TestConnection()
        {
            var cancelSource      = new CancellationTokenSource();
            var pushServiceSocket = new SignalServiceAccountManager(ServiceConfiguration, "A", "B", 1, UserAgent);

            try
            {
                var turn = await pushServiceSocket.GetTurnServerInfo(cancelSource.Token);
            }
            catch (AuthorizationFailedException) { }
        }
        private SignalServiceAccountManager InitRegistration(bool voice)
        {
            App.Handle.PurgeAccountData();
            SignalServiceAccountManager accountManager = new SignalServiceAccountManager(App.ServiceUrls, App.CurrentSignalWindowsFrontend(App.MainViewId).Locator.RegisterPageInstance.FinalNumber, Password, 1 /*device id isn't actually used*/, App.USER_AGENT);

            if (voice)
            {
                accountManager.requestVoiceVerificationCode();
            }
            else
            {
                accountManager.requestSmsVerificationCode();
            }
            return(accountManager);
        }
        private SignalServiceAccountManager InitRegistration(bool voice)
        {
            LibsignalDBContext.PurgeAccountData();
            SignalServiceAccountManager accountManager = new SignalServiceAccountManager(App.ServiceUrls, App.ViewModels.RegisterPageInstance.FinalNumber, Password, 1 /*device id isn't actually used*/, App.USER_AGENT);

            if (voice)
            {
                accountManager.requestVoiceVerificationCode();
            }
            else
            {
                accountManager.requestSmsVerificationCode();
            }
            return(accountManager);
        }
Example #7
0
        private async Task <SignalServiceAccountManager> InitRegistration(bool voice)
        {
            App.Handle.PurgeAccountData();
            SignalServiceAccountManager accountManager = new SignalServiceAccountManager(LibUtils.ServiceConfiguration,
                                                                                         null,
                                                                                         App.CurrentSignalWindowsFrontend(App.MainViewId).Locator.RegisterPageInstance.FinalNumber,
                                                                                         Password, 1 /*device id isn't actually used*/, LibUtils.USER_AGENT, LibUtils.HttpClient);

            string captcha = null;

            if (!string.IsNullOrWhiteSpace(App.CurrentSignalWindowsFrontend(App.MainViewId).Locator.RegisterPageInstance.CaptchaCode))
            {
                captcha = App.CurrentSignalWindowsFrontend(App.MainViewId).Locator.RegisterPageInstance.CaptchaCode;
            }

            try
            {
                if (voice)
                {
                    await accountManager.RequestVoiceVerificationCodeAsync(captcha, CancelSource.Token);
                }
                else
                {
                    await accountManager.RequestSmsVerificationCodeAsync(captcha, CancelSource.Token);
                }
            }
            catch (CaptchaRequiredException)
            {
                App.CurrentSignalWindowsFrontend(App.MainViewId).Locator.RegisterPageInstance.CaptchaWebViewEnabled = true;
                throw;
            }
            catch (Exception ex)
            {
                await Utils.CallOnMainViewUIThreadAsync(async() =>
                {
                    var title            = ex.Message;
                    var content          = "Please ensure your phone number is correct and your device is connected to the internet.";
                    MessageDialog dialog = new MessageDialog(content, title);
                    await dialog.ShowAsync();
                });

                throw;
            }
            return(accountManager);
        }
Example #8
0
        public static async Task <bool> refreshDirectory(SignalServiceAccountManager accountManager, String localNumber)
        {
            TextSecureDirectory directory = DatabaseFactory.getDirectoryDatabase();
            List <string>       eligibleContactNumbers = await directory.GetNumbersAsync(localNumber);

            List <ContactTokenDetails> activeTokens = await accountManager.getContacts(eligibleContactNumbers);

            if (activeTokens != null)
            {
                foreach (ContactTokenDetails activeToken in activeTokens)
                {
                    Debug.WriteLine($"Token {activeToken.getNumber()}, {activeToken.getToken()}");
                    eligibleContactNumbers.Remove(activeToken.getNumber());
                    activeToken.setNumber(activeToken.getNumber());
                }

                directory.setNumbers(activeTokens, eligibleContactNumbers);
            }

            return(true);
        }
Example #9
0
        private async static Task <bool> isPushDestination(String destination)
        {
            TextSecureDirectory directory = DatabaseFactory.getDirectoryDatabase();

            try
            {
                return(directory.isActiveNumber(destination));
            }
            catch (/*NotInDirectory*/ Exception e)
            {
                try
                {
                    SignalServiceAccountManager accountManager = TextSecureCommunicationFactory.createManager();
                    May <ContactTokenDetails>   registeredUser = await App.Current.accountManager.getContact(destination);

                    if (!registeredUser.HasValue)
                    {
                        registeredUser = new May <ContactTokenDetails>(new ContactTokenDetails());
                        registeredUser.ForceGetValue().setNumber(destination);
                        directory.setNumber(registeredUser.ForceGetValue(), false);
                        return(false);
                    }
                    else
                    {
                        registeredUser.ForceGetValue().setNumber(destination);
                        directory.setNumber(registeredUser.ForceGetValue(), true);
                        return(true);
                    }
                }
                catch (Exception e1)
                {
                    //Log.w(TAG, e1);
                    return(false);
                }
            }
        }
Example #10
0
 public static async Task <bool> refreshDirectory(SignalServiceAccountManager accountManager)
 {
     return(await refreshDirectory(accountManager, TextSecurePreferences.getLocalNumber()));
 }
 public static async Task RefreshPreKeysAsync(SignalServiceAccountManager accountManager, CancellationToken token) //TODO wrap in extra lock? enforce reload?
 {
     List <PreKeyRecord> oneTimePreKeys     = GeneratePreKeys();
     SignedPreKeyRecord  signedPreKeyRecord = GenerateSignedPreKey(GetIdentityKeyPair());
     await accountManager.SetPreKeysAsync(GetIdentityKeyPair().getPublicKey(), signedPreKeyRecord, oneTimePreKeys, token);
 }
Example #12
0
        public async Task BeginLinking()
        {
            try
            {
                CancelSource = new CancellationTokenSource();
                string deviceName = DeviceName;
                LinkingTask = Task.Run(() =>
                {
                    /* clean the database from stale values */
                    LibsignalDBContext.PurgeAccountData();

                    /* prepare qrcode */
                    string password             = Base64.encodeBytes(Util.getSecretBytes(18));
                    IdentityKeyPair tmpIdentity = KeyHelper.generateIdentityKeyPair();
                    SignalServiceAccountManager accountManager = new SignalServiceAccountManager(App.ServiceUrls, CancelSource.Token, "Signal-Windows");
                    string uuid     = accountManager.GetNewDeviceUuid(CancelSource.Token);
                    string tsdevice = "tsdevice:/?uuid=" + Uri.EscapeDataString(uuid) + "&pub_key=" + Uri.EscapeDataString(Base64.encodeBytesWithoutPadding(tmpIdentity.getPublicKey().serialize()));
                    Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                    {
                        View.SetQR(tsdevice);
                        QRVisible    = Visibility.Visible;
                        QRCodeString = tsdevice;
                    }).AsTask().Wait();

                    string tmpSignalingKey = Base64.encodeBytes(Util.getSecretBytes(52));
                    int registrationId     = (int)KeyHelper.generateRegistrationId(false);

                    NewDeviceLinkResult result = accountManager.FinishNewDeviceRegistration(tmpIdentity, tmpSignalingKey, password, false, true, registrationId, deviceName);
                    SignalStore store          = new SignalStore()
                    {
                        DeviceId           = (uint)result.DeviceId,
                        IdentityKeyPair    = Base64.encodeBytes(result.Identity.serialize()),
                        NextSignedPreKeyId = 1,
                        Password           = password,
                        PreKeyIdOffset     = 1,
                        Registered         = true,
                        RegistrationId     = (uint)registrationId,
                        SignalingKey       = tmpSignalingKey,
                        Username           = result.Number
                    };
                    LibsignalDBContext.SaveOrUpdateSignalStore(store);

                    /* reload registered state */
                    Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                    {
                        UIEnabled = false;
                        App.Store = store;
                    }).AsTask().Wait();

                    /* create prekeys */
                    LibsignalDBContext.RefreshPreKeys(new SignalServiceAccountManager(App.ServiceUrls, store.Username, store.Password, (int)store.DeviceId, App.USER_AGENT));

                    /* reload again with prekeys and their offsets */
                    store = LibsignalDBContext.GetSignalStore();
                    Debug.WriteLine("success!");
                    Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                    {
                        App.Store = store;
                        View.Finish(true);
                    }).AsTask().Wait();
                });
                await LinkingTask;
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.Message);
                Debug.WriteLine(e.StackTrace);
            }
        }
Example #13
0
        public async Task BeginLinking()
        {
            try
            {
                CancelSource = new CancellationTokenSource();
                // clean the database from stale values
                await Task.Run(() =>
                {
                    LibsignalDBContext.PurgeAccountData();
                });

                (string password, IdentityKeyPair tmpIdentity) = await Task.Run(() =>
                {
                    string newPassword             = Base64.EncodeBytes(Util.GetSecretBytes(18));
                    IdentityKeyPair newTmpIdentity = KeyHelper.generateIdentityKeyPair();
                    return(newPassword, newTmpIdentity);
                });

                // fetch new device uuid
                SignalServiceAccountManager accountManager = new SignalServiceAccountManager(App.ServiceConfiguration, "Signal-Windows", new SignalWebSocketFactory());
                string uuid = await accountManager.GetNewDeviceUuid(CancelSource.Token, new SignalWebSocketFactory());

                string tsdevice = "tsdevice:/?uuid=" + Uri.EscapeDataString(uuid) + "&pub_key=" + Uri.EscapeDataString(Base64.EncodeBytesWithoutPadding(tmpIdentity.getPublicKey().serialize()));

                View.SetQR(tsdevice); //TODO generate qrcode in worker task
                QRVisible    = Visibility.Visible;
                QRCodeString = tsdevice;

                string tmpSignalingKey = Base64.EncodeBytes(Util.GetSecretBytes(52));
                int    registrationId  = (int)KeyHelper.generateRegistrationId(false);

                var provisionMessage = await accountManager.GetProvisioningMessage(CancelSource.Token, tmpIdentity);

                int deviceId = await accountManager.FinishNewDeviceRegistration(CancelSource.Token, provisionMessage, tmpSignalingKey, password, false, true, registrationId, View.GetDeviceName());

                SignalStore store = new SignalStore()
                {
                    DeviceId           = (uint)deviceId,
                    IdentityKeyPair    = Base64.EncodeBytes(provisionMessage.Identity.serialize()),
                    NextSignedPreKeyId = 1,
                    Password           = password,
                    PreKeyIdOffset     = 1,
                    Registered         = true,
                    RegistrationId     = (uint)registrationId,
                    SignalingKey       = tmpSignalingKey,
                    Username           = provisionMessage.Number
                };
                await Task.Run(() =>
                {
                    LibsignalDBContext.SaveOrUpdateSignalStore(store);
                });

                // reload registered state
                UIEnabled        = false;
                App.Handle.Store = store;

                // create prekeys
                await LibsignalDBContext.RefreshPreKeys(CancelSource.Token, new SignalServiceAccountManager(App.ServiceConfiguration, store.Username, store.Password, (int)store.DeviceId, App.USER_AGENT));

                // reload again with prekeys and their offsets
                App.Handle.Store = LibsignalDBContext.GetSignalStore();
                await View.Finish(true);
            }
            catch (Exception e)
            {
                var line = new StackTrace(e, true).GetFrames()[0].GetFileLineNumber();
                Logger.LogError("BeginLinking() failed in line {0}: {1}\n{2}", line, e.Message, e.StackTrace);
            }
        }
        public async Task RefreshContacts(CancellationToken?cancellationToken = null)
        {
            RefreshingContacts = true;
            Contacts.Clear();
            signalContacts.Clear();
            SignalServiceAccountManager accountManager = new SignalServiceAccountManager(App.ServiceUrls, App.Store.Username, App.Store.Password, (int)App.Store.DeviceId, App.USER_AGENT);
            ContactStore contactStore = await ContactManager.RequestStoreAsync(ContactStoreAccessType.AllContactsReadOnly);

            List <PhoneContact> intermediateContacts = new List <PhoneContact>();

            if (contactStore != null)
            {
                HashSet <string> seenNumbers = new HashSet <string>();
                var contacts = await contactStore.FindContactsAsync();

                ContactAnnotationStore contactAnnotationStore = await ContactManager.RequestAnnotationStoreAsync(ContactAnnotationStoreAccessType.AppAnnotationsReadWrite);

                ContactAnnotationList contactAnnotationList;
                var contactAnnotationLists = await contactAnnotationStore.FindAnnotationListsAsync();

                if (contactAnnotationLists.Count == 0)
                {
                    contactAnnotationList = await contactAnnotationStore.CreateAnnotationListAsync();
                }
                else
                {
                    contactAnnotationList = contactAnnotationLists[0];
                }

                foreach (var contact in contacts)
                {
                    var phones = contact.Phones;
                    foreach (var phone in contact.Phones)
                    {
                        if (phone.Kind == ContactPhoneKind.Mobile)
                        {
                            string formattedNumber = null;
                            try
                            {
                                formattedNumber = ParsePhoneNumber(phone.Number);
                            }
                            catch (NumberParseException)
                            {
                                Debug.WriteLine($"Couldn't parse {phone.Number}");
                                continue;
                            }
                            if (!seenNumbers.Contains(formattedNumber))
                            {
                                seenNumbers.Add(formattedNumber);
                                PhoneContact phoneContact = new PhoneContact
                                {
                                    Id          = contact.Id,
                                    Name        = contact.FullName,
                                    PhoneNumber = formattedNumber,
                                    OnSignal    = false
                                };
                                if (contact.SourceDisplayPicture != null)
                                {
                                    using (var stream = await contact.SourceDisplayPicture.OpenReadAsync())
                                    {
                                        BitmapImage bitmapImage = new BitmapImage();
                                        await bitmapImage.SetSourceAsync(stream);

                                        phoneContact.Photo = bitmapImage;
                                    }
                                }
                                intermediateContacts.Add(phoneContact);
                            }
                        }
                    }
                }

                // check if we've annotated a contact as a Signal contact already, if we have we don't need to ask Signal about them
                for (int i = 0; i < intermediateContacts.Count; i++)
                {
                    var annotatedContact = await contactAnnotationList.FindAnnotationsByRemoteIdAsync(intermediateContacts[i].PhoneNumber);

                    if (annotatedContact.Count > 0)
                    {
                        intermediateContacts[i].OnSignal = true;
                        signalContacts.Add(intermediateContacts[i]);
                        intermediateContacts.RemoveAt(i);
                        i--;
                    }
                }

                var signalContactDetails = accountManager.getContacts(intermediateContacts.Select(c => c.PhoneNumber).ToList());
                foreach (var contact in intermediateContacts)
                {
                    var foundContact = signalContactDetails.FirstOrDefault(c => c.getNumber() == contact.PhoneNumber);
                    if (foundContact != null)
                    {
                        contact.OnSignal = true;
                        ContactAnnotation contactAnnotation = new ContactAnnotation();
                        contactAnnotation.ContactId           = contact.Id;
                        contactAnnotation.RemoteId            = contact.PhoneNumber;
                        contactAnnotation.SupportedOperations = ContactAnnotationOperations.Message | ContactAnnotationOperations.ContactProfile;
                        await contactAnnotationList.TrySaveAnnotationAsync(contactAnnotation);

                        signalContacts.Add(contact);
                    }
                }
                Contacts.AddRange(signalContacts);
            }
            else
            {
                ContactsVisible = false;
            }
            RefreshingContacts = false;
        }
Example #15
0
        internal async Task OnNavigatedTo()
        {
            try
            {
                CancellationTokenSource cancelSource = new CancellationTokenSource();
                await Task.Run(async() =>
                {
                    string SignalingKey = Base64.EncodeBytes(Util.GetSecretBytes(52));
                    SignalServiceAccountManager accountManager = App.CurrentSignalWindowsFrontend(App.MainViewId).Locator.RegisterFinalizationPageInstance.AccountManager;

                    Guid ownGuid = await accountManager.VerifyAccountWithCodeAsync(
                        App.CurrentSignalWindowsFrontend(App.MainViewId).Locator.RegisterFinalizationPageInstance.VerificationCode.Replace("-", ""),
                        SignalingKey,
                        App.CurrentSignalWindowsFrontend(App.MainViewId).Locator.RegisterFinalizationPageInstance.SignalRegistrationId,
                        true,
                        null,
                        null,
                        false,
                        cancelSource.Token);
                    SignalStore store = new SignalStore()
                    {
                        DeviceId           = 1,
                        IdentityKeyPair    = Base64.EncodeBytes(App.CurrentSignalWindowsFrontend(App.MainViewId).Locator.RegisterFinalizationPageInstance.IdentityKeyPair.serialize()),
                        NextSignedPreKeyId = 1,
                        Password           = App.CurrentSignalWindowsFrontend(App.MainViewId).Locator.RegisterFinalizationPageInstance.Password,
                        PreKeyIdOffset     = 1,
                        Registered         = true,
                        RegistrationId     = App.CurrentSignalWindowsFrontend(App.MainViewId).Locator.RegisterFinalizationPageInstance.SignalRegistrationId,
                        SignalingKey       = SignalingKey,
                        Username           = App.CurrentSignalWindowsFrontend(App.MainViewId).Locator.RegisterPageInstance.FinalNumber,
                        OwnGuid            = ownGuid
                    };
                    LibsignalDBContext.SaveOrUpdateSignalStore(store);
                    Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                    {
                        App.Handle.Store = store;
                    }).AsTask().Wait();

                    /* create prekeys */
                    await LibsignalDBContext.RefreshPreKeysAsync(new SignalServiceAccountManager(
                                                                     LibUtils.ServiceConfiguration, store.OwnGuid, store.Username, store.Password, (int)store.DeviceId,
                                                                     LibUtils.USER_AGENT, LibUtils.HttpClient),
                                                                 cancelSource.Token);

                    /* reload again with prekeys and their offsets */
                    store = LibsignalDBContext.GetSignalStore();
                    Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                    {
                        App.Handle.Store = store;
                    }).AsTask().Wait();
                });

                var frontend = App.CurrentSignalWindowsFrontend(App.MainViewId);
                await App.Handle.Reacquire();

                View.Frame.Navigate(typeof(MainPage));
            }
            catch (Exception e)
            {
                Logger.LogError("OnNavigatedTo() failed: {0}\n{1}", e.Message, e.StackTrace);
                var           title   = "Verification failed";
                var           content = "Please enter the correct verification code.";
                MessageDialog dialog  = new MessageDialog(content, title);
                var           result  = dialog.ShowAsync();
                View.Frame.Navigate(typeof(RegisterPage));
            }
        }