public async Task ExecuteValidatePinCommand () { if (App.FakeSignup) { await App.InitDatabase(); CanProgress = true; OnPropertyChanged ("CanProgress"); return; } if (IsBusy) return; CanProgress = false; using (BusyContext ()) { using (App.Logger.TrackTimeContext ("FinalizeSignup")) { try { App.CryptoService.GenerateKeys (); var pk = Convert.ToBase64String (App.CryptoService.PublicKey); var token = await authenticationService.CreateUserDevice ( !string.IsNullOrWhiteSpace(Settings.Email) ? Settings.Email : Settings.PhoneNumber, Pin, pk, nickName); if (token == null || token.AccessToken == null || token.DeviceId == null) { App.MessageDialog.SendToast ("Invalid PIN, please try again"); return; } // Initial "AccessToken" is actually the devices password, and needed to get new tokens Settings.DevicePassword = token.AccessToken; Settings.UserDeviceLoginId = token.DeviceLoginId; Settings.UserDeviceId = token.DeviceId; var finalToken = await authenticationService.Authenticate (Settings.UserDeviceLoginId, Settings.DevicePassword); if (finalToken == null || finalToken.AccessToken == null) { Settings.AccessToken = string.Empty; Settings.UserDeviceId = string.Empty; Settings.UserDeviceLoginId = string.Empty; App.MessageDialog.SendToast ("Invalid PIN, please try again"); return; } Settings.AccessToken = finalToken.AccessToken; var nextTime = DateTime.UtcNow.AddSeconds (finalToken.ExpiresIn).Ticks; Settings.KeyValidUntil = nextTime; //need to store when to refresh var userManager = new UserManager (Settings.AccessToken); User user = !string.IsNullOrWhiteSpace(Settings.Email) ? await userManager.GetUserViaEmail (Settings.Email) : await userManager.GetUserViaPhone(Settings.PhoneNumber); if (user == null || user.Devices == null) { Settings.AccessToken = string.Empty; Settings.UserDeviceId = string.Empty; Settings.UserDeviceLoginId = string.Empty; App.MessageDialog.SendToast ("Issue in registration, please try again."); return; } Settings.MyId = user.Id; Settings.Avatar = user.Avatar.Location; if (App.NotificationsHub != null) { App.NotificationsHub.RegisterForPushNotifications(); } App.Logger.Track ("PickTheme", new Dictionary<string, string> { { "nickname", Settings.NickName }, { "avatar", user.Avatar.Location }, { "theme", Settings.AppTheme == AppTheme.Blue ? "blue" : "red" } }); CanProgress = true; } catch (Exception ex) { Settings.AccessToken = string.Empty; Settings.UserDeviceId = string.Empty; Settings.UserDeviceLoginId = string.Empty; App.Logger.Report (ex); App.MessageDialog.SendToast ("Invalid PIN, please try again"); } } } }
public async Task<Dictionary<string, string>> GetUserDevicesAndPublicKeys(int userId) { var result = await DataManager.GetFriendPublicKeysAsync(userId); if (result.Count < 1) { var userManager = new UserManager(Settings.AccessToken); var user = await userManager.GetUserViaEmail(userId); return await SaveUserDevices(user); } return result; }
public async Task ExecuteSearchForFriendCommand (string search) { search.Trim (); if (IsBusy) return; LoadingMessage = "Finding Friend..."; using (BusyContext ()) { using (App.Logger.TrackTimeContext ("FriendSearch")) { try { App.Logger.Track ("FriendSearch"); if (!search.IsValidEmail ()) { App.MessageDialog.SendToast ("Please enter a valide email address."); return; } if (!await RefreshToken ()) return; var userManager = new UserManager (Settings.AccessToken); var result = await userManager.GetUserViaEmail (search); IsBusy = false; //did not find anyone //add them and send invite if (result == null || result.Devices == null) { var newFriend = new Friend { FriendId = Settings.GenerateTempFriendId (), Name = search }; await DataManager.AddOrSaveFriendAsync (newFriend); await FriendsSemaphore.WaitAsync(); Friends.Add (newFriend); FriendsSemaphore.Release (); await userManager.SendUserInvite (search); RaiseNotification ("Your friend hasn't signed up for Kinder Chat yet. We have sent them an invite!", "Friend Request Sent"); App.Logger.Track ("FriendRequestSent"); return; } //did you enter yourself? if (!string.IsNullOrWhiteSpace(Settings.Email) && result.Email.ToLowerInvariant () == Settings.Email.ToLowerInvariant ()) { RaiseNotification ("This is you!"); return; } //did you already friend them? await FriendsSemaphore.WaitAsync (); var alreadyFriend = Friends.FirstOrDefault (f => f.FriendId == result.Id) != null; FriendsSemaphore.Release (); if (alreadyFriend) { RaiseNotification ("Friend already added."); return; } //new friend found and we want to add them. var msg = string.Format ("We found {0} do you want to add to friend list?", result.NickName); App.MessageDialog.SendConfirmation (msg, "Friend found!", async add => { if (!add) return; var newFriend = new Friend { FriendId = result.Id, Name = result.NickName, Photo = EndPoints.BaseUrl + result.Avatar.Location, AvatarType = result.Avatar.Type }; await DataManager.AddOrSaveFriendAsync (newFriend); await FriendsSemaphore.WaitAsync (); Friends.Add (newFriend); FriendsSemaphore.Release (); RaiseNotification ("Friend added!"); App.Logger.Track ("FriendAdded"); }); } catch (Exception ex) { App.Logger.Report (ex); RaiseError ("Something has gone wrong, please try to search again."); } } } }
public async Task UpdateFriendInfoAsync(Friend item) { if (App.FakeSignup) return; var userManager = new UserManager(Settings.AccessToken); //should it be cached? User user = null; if (item.FriendId < 0) user = await userManager.GetUserViaEmail(item.Name).ConfigureAwait (false); else user = await userManager.GetUserViaEmail((int)item.FriendId).ConfigureAwait (false); if (user != null && user.Devices != null) { //update messages for newly connected friends) if(item.FriendId < 0){ var messages = await DataManager.GetUnsentMessagesAsync (item.FriendId).ConfigureAwait (false); //update each message with new information. foreach (var message in messages) { message.FriendName = user.NickName; message.FriendPhoto = EndPoints.BaseUrl + user.Avatar.Location; message.Recipient = user.Id; message.RecipientName = user.NickName; await DataManager.AddMessageAsync (message).ConfigureAwait (false); } } //user found item.FriendId = user.Id; item.Name = user.NickName; item.Photo = EndPoints.BaseUrl + user.Avatar.Location; item.AvatarType = user.Avatar.Type; await SaveUserDevices(user).ConfigureAwait (false); await DataManager.AddOrSaveFriendAsync(item).ConfigureAwait (false); } }