Exemplo n.º 1
0
		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");
					}
				}
			}
		}