/// <inheritdoc/> public override Task Run() { if (StoryBoard.Mode.ShouldUseGui()) { SerializeableCloudStorageCredentials credentials = StoryBoard.LoadFromSession <SerializeableCloudStorageCredentials>(SynchronizationStorySessionKey.CloudStorageCredentials.ToInt()); ICloudStorageClient cloudStorageClient = _cloudStorageClientFactory.GetOrCreate(credentials.CloudStorageId); if (cloudStorageClient is IOAuth2CloudStorageClient oauthStorageClient) { // Show waiting page _navigationService.Navigate(ControllerNames.CloudStorageOauthWaiting); // Open OAuth2 login page in external browser string oauthState = CryptoUtils.GenerateRandomBase62String(16, _randomSource); string oauthCodeVerifier = CryptoUtils.GenerateRandomBase62String(64, _randomSource); StoryBoard.StoreToSession(SynchronizationStorySessionKey.OauthState.ToInt(), oauthState); StoryBoard.StoreToSession(SynchronizationStorySessionKey.OauthCodeVerifier.ToInt(), oauthCodeVerifier); string url = oauthStorageClient.BuildAuthorizationRequestUrl(oauthState, oauthCodeVerifier); _nativeBrowserService.OpenWebsiteInApp(url); } else { _navigationService.Navigate(ControllerNames.CloudStorageAccount); } } return(Task.CompletedTask); }
/// <inheritdoc/> public override async Task Run() { SerializeableCloudStorageCredentials credentials = StoryBoard.LoadFromSession <SerializeableCloudStorageCredentials>(SynchronizationStorySessionKey.CloudStorageCredentials.ToInt()); ICloudStorageClient cloudStorageClient = _cloudStorageClientFactory.GetOrCreate(credentials.CloudStorageId); try { bool stopBecauseNewOAuthLoginIsRequired = false; if ((cloudStorageClient is OAuth2CloudStorageClient oauthStorageClient) && credentials.Token.NeedsRefresh()) { try { // Get a new access token by using the refresh token credentials.Token = await oauthStorageClient.RefreshTokenAsync(credentials.Token); SaveCredentialsToSettings(credentials); } catch (RefreshTokenExpiredException) { // Refresh-token cannot be used to get new access-tokens anymore, a new // authorization by the user is required. stopBecauseNewOAuthLoginIsRequired = true; switch (StoryBoard.Mode) { case StoryBoardMode.GuiAndToasts: await StoryBoard.ContinueWith(SynchronizationStoryStepId.ShowCloudStorageAccount.ToInt()); break; case StoryBoardMode.ToastsOnly: _feedbackService.ShowToast(_languageService["sync_error_generic"]); break; } } } if (!stopBecauseNewOAuthLoginIsRequired) { bool repositoryExists = await cloudStorageClient.ExistsFileAsync(Config.RepositoryFileName, credentials); // If no error occured the credentials are ok and we can safe them SaveCredentialsToSettings(credentials); if (repositoryExists) { await StoryBoard.ContinueWith(SynchronizationStoryStepId.DownloadCloudRepository.ToInt()); } else { await StoryBoard.ContinueWith(SynchronizationStoryStepId.StoreLocalRepositoryToCloudAndQuit.ToInt()); } } } catch (Exception ex) { // Keep the current page open and show the error message ShowExceptionMessage(ex, _feedbackService, _languageService); } }
public override async Task Run() { try { if (!StoryBoard.TryLoadFromSession(SynchronizationStorySessionKey.CloudStorageCredentials, out SerializeableCloudStorageCredentials credentials)) { throw new ArgumentNullException(nameof(credentials)); } if (!StoryBoard.TryLoadFromSession(SynchronizationStorySessionKey.OauthState, out string oauthState)) { throw new ArgumentNullException(nameof(oauthState)); } if (!StoryBoard.TryLoadFromSession(SynchronizationStorySessionKey.OauthCodeVerifier, out string oauthCodeVerifier)) { throw new ArgumentNullException(nameof(oauthState)); } if (!StoryBoard.TryLoadFromSession(SynchronizationStorySessionKey.OauthRedirectUrl, out string redirectUrl)) { throw new ArgumentNullException(nameof(redirectUrl)); } StoryBoard.RemoveFromSession(SynchronizationStorySessionKey.OauthState); StoryBoard.RemoveFromSession(SynchronizationStorySessionKey.OauthCodeVerifier); StoryBoard.RemoveFromSession(SynchronizationStorySessionKey.OauthRedirectUrl); ICloudStorageClient cloudStorageClient = _cloudStorageClientFactory.GetOrCreate(credentials.CloudStorageId); if (cloudStorageClient is IOAuth2CloudStorageClient oauthStorageClient) { CloudStorageToken token = await oauthStorageClient.FetchTokenAsync(redirectUrl, oauthState, oauthCodeVerifier); if (token != null) { // User has granted access. credentials.Token = token; await StoryBoard.ContinueWith(SynchronizationStoryStepId.ExistsCloudRepository); } else { // User has rejected access. _feedbackService.ShowToast(_languageService.LoadText("sync_reject")); await StoryBoard.ContinueWith(SynchronizationStoryStepId.StopAndShowRepository); } } } catch (Exception ex) { // Keep the current page open and show the error message ShowExceptionMessage(ex, _feedbackService, _languageService); } }
private async Task <bool> TryDeleteCloudNoteRepository() { var credentials = Model.Credentials; ICloudStorageClient cloudStorageClient = _cloudStorageClientFactory.GetOrCreate(credentials.CloudStorageId); try { await cloudStorageClient.DeleteFileAsync(Config.RepositoryFileName, credentials); return(true); } catch (Exception) { return(false); } }
/// <inheritdoc/> public override async Task Run() { try { SerializeableCloudStorageCredentials credentials = StoryBoard.LoadFromSession <SerializeableCloudStorageCredentials>(SynchronizationStorySessionKey.CloudStorageCredentials); _repositoryStorageService.LoadRepositoryOrDefault(out NoteRepositoryModel localRepository); SettingsModel settings = _settingsService.LoadSettingsOrDefault(); string transferCode = settings.TransferCode; bool needsNewTransferCode = !TransferCode.IsCodeSet(transferCode); if (needsNewTransferCode) { transferCode = TransferCode.GenerateCode(_cryptoRandomService); } byte[] encryptedRepository = EncryptRepository( localRepository, transferCode, _cryptoRandomService, settings.SelectedEncryptionAlgorithm); ICloudStorageClient cloudStorageClient = _cloudStorageClientFactory.GetOrCreate(credentials.CloudStorageId); await cloudStorageClient.UploadFileAsync(Config.RepositoryFileName, encryptedRepository, credentials); // All went well, time to save the transfer code, if a new one was created if (needsNewTransferCode) { settings.TransferCode = transferCode; _settingsService.TrySaveSettingsToLocalDevice(settings); string formattedTransferCode = TransferCode.FormatTransferCodeForDisplay(transferCode).Replace(' ', '-'); string messageNewCreated = _languageService.LoadTextFmt("transfer_code_created", formattedTransferCode); string messageWriteDown = _languageService.LoadText("transfer_code_writedown"); if (StoryBoard.Mode.ShouldUseGui()) { await _feedbackService.ShowMessageAsync(messageNewCreated + Environment.NewLine + messageWriteDown, null, MessageBoxButtons.Ok, false); } } await StoryBoard.ContinueWith(SynchronizationStoryStepId.StopAndShowRepository); _feedbackService.ShowToast(_languageService["sync_success"]); } catch (Exception ex) { // Keep the current page open and show the error message ShowExceptionMessage(ex, _feedbackService, _languageService); } }
/// <inheritdoc/> public override async Task Run() { try { NoteRepositoryModel cloudRepository = StoryBoard.LoadFromSession <NoteRepositoryModel>(SynchronizationStorySessionKey.CloudRepository.ToInt()); SerializeableCloudStorageCredentials credentials = StoryBoard.LoadFromSession <SerializeableCloudStorageCredentials>(SynchronizationStorySessionKey.CloudStorageCredentials.ToInt()); _repositoryStorageService.LoadRepositoryOrDefault(out NoteRepositoryModel localRepository); SettingsModel settings = _settingsService.LoadSettingsOrDefault(); // Merge repositories NoteRepositoryMerger merger = new NoteRepositoryMerger(); NoteRepositoryModel mergedRepository = merger.Merge(localRepository, cloudRepository); // Store merged repository locally when different if (!RepositoriesAreEqual(mergedRepository, localRepository)) { _repositoryStorageService.TrySaveRepository(mergedRepository); } // Store merged repository to the cloud when different, otherwise spare the slow upload if (!RepositoriesAreEqual(mergedRepository, cloudRepository)) { byte[] encryptedRepository = EncryptRepository( mergedRepository, settings.TransferCode, _cryptoRandomService, settings.SelectedEncryptionAlgorithm); ICloudStorageClient cloudStorageClient = _cloudStorageClientFactory.GetOrCreate(credentials.CloudStorageId); await cloudStorageClient.UploadFileAsync(Config.RepositoryFileName, encryptedRepository, credentials); } await StoryBoard.ContinueWith(SynchronizationStoryStepId.StopAndShowRepository.ToInt()); _feedbackService.ShowToast(_languageService["sync_success"]); } catch (Exception ex) { // Keep the current page open and show the error message ShowExceptionMessage(ex, _feedbackService, _languageService); } }
public CloudStorageAccountViewModel( INavigationService navigationService, ILanguageService languageService, ISvgIconService svgIconService, IBaseUrlService webviewBaseUrl, IStoryBoardService storyBoardService, IFeedbackService feedbackService, ICloudStorageClientFactory cloudStorageClientFactory, SerializeableCloudStorageCredentials model) : base(navigationService, languageService, svgIconService, webviewBaseUrl) { _storyBoardService = storyBoardService ?? throw new ArgumentNullException(nameof(storyBoardService)); _feedbackService = feedbackService ?? throw new ArgumentNullException(nameof(feedbackService)); Model = model; _credentialsRequirements = cloudStorageClientFactory.GetOrCreate(Model.CloudStorageId).CredentialsRequirements; CloudServiceName = cloudStorageClientFactory.GetCloudStorageMetadata(Model.CloudStorageId).Title; GoBackCommand = new RelayCommand(GoBack); CancelCommand = new RelayCommand(Cancel); OkCommand = new RelayCommand(Ok); }
/// <inheritdoc/> public override async Task Run() { SerializeableCloudStorageCredentials credentials = StoryBoard.LoadFromSession <SerializeableCloudStorageCredentials>(SynchronizationStorySessionKey.CloudStorageCredentials.ToInt()); ICloudStorageClient cloudStorageClient = _cloudStorageClientFactory.GetOrCreate(credentials.CloudStorageId); try { // The repository can be cached for this story, download the repository only once. byte[] binaryCloudRepository; if (!StoryBoard.TryLoadFromSession(SynchronizationStorySessionKey.BinaryCloudRepository.ToInt(), out binaryCloudRepository)) { binaryCloudRepository = await cloudStorageClient.DownloadFileAsync(Config.RepositoryFileName, credentials); StoryBoard.StoreToSession(SynchronizationStorySessionKey.BinaryCloudRepository.ToInt(), binaryCloudRepository); } await StoryBoard.ContinueWith(SynchronizationStoryStepId.ExistsTransferCode.ToInt()); } catch (Exception ex) { // Keep the current page open and show the error message ShowExceptionMessage(ex, _feedbackService, _languageService); } }