/// <summary> /// Returns an active OneDriveApi instance. If a RefreshToken is available, it will set up an instance based on that, otherwise it will show the login dialog /// </summary> /// <param name="databaseConfig">Configuration of the KeePass database</param> /// <returns>Active OneDrive instance or NULL if unable to get an authenticated instance</returns> public static async Task <OneDriveApi> GetOneDriveApi(Configuration databaseConfig) { OneDriveApi cloudStorage; switch (databaseConfig.CloudStorageType.GetValueOrDefault(CloudStorageType.OneDriveConsumer)) { case CloudStorageType.OneDriveConsumer: cloudStorage = new OneDriveConsumerApi(KoenZomersKeePassOneDriveSyncExt.OneDriveConsumerClientId, KoenZomersKeePassOneDriveSyncExt.OneDriveConsumerClientSecret); break; case CloudStorageType.OneDriveForBusiness: cloudStorage = new OneDriveForBusinessO365Api(KoenZomersKeePassOneDriveSyncExt.OneDriveForBusinessClientId, KoenZomersKeePassOneDriveSyncExt.OneDriveForBusinessClientSecret); break; case CloudStorageType.MicrosoftGraph: cloudStorage = new OneDriveGraphApi(KoenZomersKeePassOneDriveSyncExt.GraphApiApplicationId); break; default: throw new ArgumentOutOfRangeException(string.Format("Cloud storage type {0} is not supported", databaseConfig.CloudStorageType)); } if (string.IsNullOrEmpty(databaseConfig.RefreshToken)) { var oneDriveAuthenticateForm = new OneDriveAuthenticateForm(cloudStorage); var result = oneDriveAuthenticateForm.ShowDialog(); if (result != System.Windows.Forms.DialogResult.OK) { return(null); } // Check if we already know where to store the Refresh Token for this database if (!databaseConfig.RefreshTokenStorage.HasValue) { // We don't know yet where the Refresh Token for this database should be stored, ask the user to choose var oneDriveRefreshTokenStorageForm = new OneDriveRefreshTokenStorageDialog(databaseConfig); oneDriveRefreshTokenStorageForm.ShowDialog(); } // Save the configuration so we keep the Refresh Token var oneDriveApi = oneDriveAuthenticateForm.OneDriveApi; databaseConfig.RefreshToken = oneDriveApi.AccessToken.RefreshToken; Configuration.Save(); return(oneDriveApi); } try { ApplyProxySettings(cloudStorage); await cloudStorage.AuthenticateUsingRefreshToken(databaseConfig.RefreshToken); return(cloudStorage); } catch (KoenZomers.OneDrive.Api.Exceptions.TokenRetrievalFailedException e) { // Something went wrong with retrieving the access token throw; } catch (Exception e) { // If specifically the HttpRequestException occurred, it likely contains more information on what went wrong, so pass it up to the callstack if (e.GetType().ToString() == "System.Net.Http.HttpRequestException") { throw; } // Occurs if no connection can be made with the OneDrive service. It will be handled properly in the calling code. return(null); } }
/// <summary> /// Создать подключение с удаленым сервером /// </summary> /// <param name="_typeSunc">Тип синхронизации</param> /// <param name="ftpConf">Конфигурация удаленого сервера 'ftp/sftp'</param> /// <param name="webDavConf">Конфигурация удаленого сервера 'WebDav'</param> /// <param name="oneDriveConf">Конфигурация удаленого сервера 'OneDrive'</param> /// <param name="report">Класс для создания отчета ошибок синхронизации</param> public RemoteServer(TypeSunc _typeSunc, FTP ftpConf, Models.SyncBackup.Tasks.WebDav webDavConf, OneDrive oneDriveConf, Report _report, out string NewRefreshTokenToOneDrive) { NewRefreshTokenToOneDrive = null; try { typeSunc = _typeSunc; report = _report; webDavConfToReport = webDavConf; switch (typeSunc) { case TypeSunc.SFTP: { sftp = new SftpClient(ftpConf.HostOrIP, ftpConf.GetToPort(_typeSunc), ftpConf.Login, ftpConf.Passwd); sftp.Connect(); break; } case TypeSunc.FTP: { try { // create an FTP client ftp = new FtpClient(ftpConf.HostOrIP, ftpConf.GetToPort(_typeSunc), ftpConf.Login, ftpConf.Passwd); // begin connecting to the server ftp.Connect(); } catch { ftp = new FtpClient(ftpConf.HostOrIP, ftpConf.GetToPort(_typeSunc), ftpConf.Login, ftpConf.Passwd); ftp.EncryptionMode = FtpEncryptionMode.Explicit; ftp.SslProtocols = SslProtocols.Tls; ftp.ValidateCertificate += new FtpSslValidation(OnValidateCertificate); ftp.Connect(); void OnValidateCertificate(FtpClient control, FtpSslValidationEventArgs e) { // add logic to test if certificate is valid here e.Accept = true; } } break; } case TypeSunc.WebDav: { webDav = new WebDavClient(new WebDavClientParams { BaseAddress = new Uri(webDavConf.url), Credentials = new NetworkCredential(webDavConf.Login, webDavConf.Passwd), PreAuthenticate = true, UseDefaultCredentials = false // Yandex.Disk на linux так работает }); break; } case TypeSunc.OneDrive: { /// <summary> /// Version 2.0.1.0 /// https://github.com/KoenZomers/OneDriveAPI /// </summary> oneDrive = new OneDriveGraphApi(oneDriveConf.ApplicationId); oneDrive.AuthenticateUsingRefreshToken(oneDriveConf.RefreshToken).Wait(); if (!string.IsNullOrWhiteSpace(oneDrive.AccessToken.RefreshToken)) { IsConnectedToOneDrive = true; NewRefreshTokenToOneDrive = oneDrive.AccessToken.RefreshToken; } break; } } } catch (Exception ex) { report.Connect(_typeSunc, ftpConf, webDavConf, oneDriveConf, ex.ToString()); ConnectionError = true; } }