#region License Information (GPL v3) /* ShareX - A program that allows you to take screenshots and share any file type Copyright (c) 2007-2024 ShareX Team This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Optionally you can also view the license at . */ #endregion License Information (GPL v3) using CG.Web.MegaApiClient; using ShareX.HelpersLib; using ShareX.UploadersLib.FileUploaders; using ShareX.UploadersLib.ImageUploaders; using ShareX.UploadersLib.Properties; using ShareX.UploadersLib.TextUploaders; using ShareX.UploadersLib.URLShorteners; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; namespace ShareX.UploadersLib { public partial class UploadersConfigForm : Form { public static bool IsInstanceActive => instance != null && !instance.IsDisposed; private static UploadersConfigForm instance; public UploadersConfig Config { get; private set; } private ImageList uploadersImageList; private UploadersConfigForm(UploadersConfig config) { Config = config; InitializeComponent(); ShareXResources.ApplyTheme(this, true); InitializeControls(); } public static UploadersConfigForm GetFormInstance(UploadersConfig config) { if (!IsInstanceActive) { instance = new UploadersConfigForm(config); } return instance; } private void UploadersConfigForm_Shown(object sender, EventArgs e) { LoadSettings(); } private void UploadersConfigForm_Resize(object sender, EventArgs e) { Refresh(); } private void InitializeControls() { if (!string.IsNullOrEmpty(Config.FilePath)) { Text += " - " + Config.FilePath; } AddIconToTabs(); tttvMain.ImageList = uploadersImageList; tttvMain.MainTabControl = tcUploaders; CodeMenu.Create(txtDropboxPath, CodeMenuEntryFilename.n, CodeMenuEntryFilename.t, CodeMenuEntryFilename.pn); CodeMenu.Create(txtAmazonS3ObjectPrefix, CodeMenuEntryFilename.n, CodeMenuEntryFilename.t, CodeMenuEntryFilename.pn); CodeMenu.Create(txtMediaFirePath, CodeMenuEntryFilename.n, CodeMenuEntryFilename.t, CodeMenuEntryFilename.pn); CodeMenu.Create(txtGoogleCloudStorageObjectPrefix, CodeMenuEntryFilename.n, CodeMenuEntryFilename.t, CodeMenuEntryFilename.pn); CodeMenu.Create(txtB2UploadPath, CodeMenuEntryFilename.n, CodeMenuEntryFilename.t, CodeMenuEntryFilename.pn); CodeMenu.Create(txtB2CustomUrl, CodeMenuEntryFilename.n, CodeMenuEntryFilename.t, CodeMenuEntryFilename.pn); // FTP cbFTPURLPathProtocol.Items.AddRange(Helpers.GetEnumDescriptions()); cbFTPSEncryption.Items.AddRange(Enum.GetNames(typeof(FTPSEncryption))); eiFTP.ObjectType = typeof(FTPAccount); // Backblaze B2 txtB2Bucket.HandleCreated += (sender, e) => txtB2Bucket.SetWatermark(Resources.txtB2BucketWatermark, true); } private void AddIconToTabs() { uploadersImageList = new ImageList(); uploadersImageList.ColorDepth = ColorDepth.Depth32Bit; uploadersImageList.Images.Add(Resources.navigation_270_button_white); foreach (IUploaderService uploaderService in UploaderFactory.AllServices) { TabPage tp = uploaderService.GetUploadersConfigTabPage(this); if (tp != null && string.IsNullOrEmpty(tp.ImageKey)) { Icon icon = uploaderService.ServiceIcon; if (icon != null) { uploadersImageList.Images.Add(tp.Name, icon); tp.ImageKey = tp.Name; } else { Image img = uploaderService.ServiceImage; if (img != null) { uploadersImageList.Images.Add(tp.Name, img); tp.ImageKey = tp.Name; } } } } } public void NavigateToTabPage(TabPage tp) { if (tp != null) { tttvMain.NavigateToTabPage(tp); } } private void LoadSettings() { LoadImageUploaderSettings(); LoadTextUploaderSettings(); LoadFileUploaderSettings(); LoadURLShortenerSettings(); LoadOtherUploaderSettings(); } private void LoadImageUploaderSettings() { #region Imgur oauth2Imgur.Enabled = Config.ImgurAccountType == AccountType.User; if (OAuth2Info.CheckOAuth(Config.ImgurOAuth2Info)) { oauth2Imgur.Status = OAuthLoginStatus.LoginSuccessful; btnImgurRefreshAlbumList.Enabled = true; } atcImgurAccountType.SelectedAccountType = Config.ImgurAccountType; cbImgurDirectLink.Checked = Config.ImgurDirectLink; cbImgurThumbnailType.Items.Clear(); cbImgurThumbnailType.Items.AddRange(Helpers.GetLocalizedEnumDescriptions()); cbImgurThumbnailType.SelectedIndex = (int)Config.ImgurThumbnailType; cbImgurUseGIFV.Checked = Config.ImgurUseGIFV; cbImgurUploadSelectedAlbum.Checked = Config.ImgurUploadSelectedAlbum; ImgurFillAlbumList(); #endregion Imgur #region ImageShack txtImageShackUsername.Text = Config.ImageShackSettings.Username; txtImageShackPassword.Text = Config.ImageShackSettings.Password; cbImageShackIsPublic.Checked = Config.ImageShackSettings.IsPublic; #endregion ImageShack #region Flickr if (OAuthInfo.CheckOAuth(Config.FlickrOAuthInfo)) { oauthFlickr.Status = OAuthLoginStatus.LoginSuccessful; } cbFlickrDirectLink.Checked = Config.FlickrSettings.DirectLink; #endregion Flickr #region Photobucket if (OAuthInfo.CheckOAuth(Config.PhotobucketOAuthInfo)) { lblPhotobucketAccountStatus.Text = Resources.UploadersConfigForm_Login_successful; } if (Config.PhotobucketAccountInfo != null) { txtPhotobucketDefaultAlbumName.Text = Config.PhotobucketAccountInfo.AlbumID; lblPhotobucketParentAlbumPath.Text = Resources.UploadersConfigForm_LoadSettings_Parent_album_path_e_g_ + " " + Config.PhotobucketAccountInfo.AlbumID + "/Personal/" + DateTime.Now.Year; cbPhotobucketAlbumPaths.Items.Clear(); if (Config.PhotobucketAccountInfo.AlbumList.Count > 0) { cbPhotobucketAlbumPaths.Items.AddRange(Config.PhotobucketAccountInfo.AlbumList.ToArray()); cbPhotobucketAlbumPaths.SelectedIndex = Config.PhotobucketAccountInfo.ActiveAlbumID. BetweenOrDefault(0, Config.PhotobucketAccountInfo.AlbumList.Count - 1); } } #endregion Photobucket #region Google Photos oauth2GooglePhotos.UpdateStatus(Config.GooglePhotosOAuth2Info, Config.GooglePhotosUserInfo); btnPicasaRefreshAlbumList.Enabled = oauth2GooglePhotos.Connected; cbGooglePhotosIsPublic.Checked = Config.GooglePhotosIsPublic; txtPicasaAlbumID.Text = Config.GooglePhotosAlbumID; #endregion Google Photos #region Chevereto if (Config.CheveretoUploader == null) Config.CheveretoUploader = new CheveretoUploader(); txtCheveretoUploadURL.Text = Config.CheveretoUploader.UploadURL; txtCheveretoAPIKey.Text = Config.CheveretoUploader.APIKey; cbCheveretoDirectURL.Checked = Config.CheveretoDirectURL; #endregion Chevereto #region vgy.me txtVgymeUserKey.Text = Config.VgymeUserKey; #endregion vgy.me } private void LoadTextUploaderSettings() { #region Pastebin txtPastebinUsername.Text = Config.PastebinSettings.Username; txtPastebinPassword.Text = Config.PastebinSettings.Password; UpdatePastebinStatus(); cbPastebinPrivacy.Items.AddRange(Helpers.GetLocalizedEnumDescriptions()); cbPastebinPrivacy.SelectedIndex = (int)Config.PastebinSettings.Exposure; cbPastebinExpiration.Items.AddRange(Helpers.GetLocalizedEnumDescriptions()); cbPastebinExpiration.SelectedIndex = (int)Config.PastebinSettings.Expiration; cbPastebinSyntax.Items.AddRange(Pastebin.GetSyntaxList().ToArray()); cbPastebinSyntax.SelectedIndex = 0; for (int i = 0; i < cbPastebinSyntax.Items.Count; i++) { PastebinSyntaxInfo pastebinSyntaxInfo = (PastebinSyntaxInfo)cbPastebinSyntax.Items[i]; if (pastebinSyntaxInfo.Value.Equals(Config.PastebinSettings.TextFormat, StringComparison.OrdinalIgnoreCase)) { cbPastebinSyntax.SelectedIndex = i; break; } } txtPastebinTitle.Text = Config.PastebinSettings.Title; cbPastebinRaw.Checked = Config.PastebinSettings.RawURL; #endregion Pastebin #region Paste.ee txtPaste_eeUserAPIKey.Text = Config.Paste_eeUserKey; #endregion Paste.ee #region Gist if (OAuth2Info.CheckOAuth(Config.GistOAuth2Info)) { oAuth2Gist.Status = OAuthLoginStatus.LoginSuccessful; } cbGistPublishPublic.Checked = Config.GistPublishPublic; cbGistUseRawURL.Checked = Config.GistRawURL; txtGistCustomURL.Text = Config.GistCustomURL; #endregion Gist #region Upaste txtUpasteUserKey.Text = Config.UpasteUserKey; cbUpasteIsPublic.Checked = Config.UpasteIsPublic; #endregion Upaste #region Hastebin txtHastebinCustomDomain.Text = Config.HastebinCustomDomain; txtHastebinSyntaxHighlighting.Text = Config.HastebinSyntaxHighlighting; cbHastebinUseFileExtension.Checked = Config.HastebinUseFileExtension; #endregion Hastebin #region OneTimeSecret txtOneTimeSecretEmail.Text = Config.OneTimeSecretAPIUsername; txtOneTimeSecretAPIKey.Text = Config.OneTimeSecretAPIKey; #endregion OneTimeSecret #region Pastie cbPastieIsPublic.Checked = Config.PastieIsPublic; #endregion Pastie } private void LoadFileUploaderSettings() { #region FTP if (Config.FTPAccountList == null) { Config.FTPAccountList = new List(); } FTPUpdateControls(); if (Config.FTPAccountList.Count == 0) { FTPClearFields(); } else { cbFTPAccounts.SelectedIndex = cbFTPImage.SelectedIndex; FTPUpdateEnabledStates(); } #endregion FTP #region Dropbox if (OAuth2Info.CheckOAuth(Config.DropboxOAuth2Info)) { oauth2Dropbox.Status = OAuthLoginStatus.LoginSuccessful; } txtDropboxPath.Text = Config.DropboxUploadPath; cbDropboxAutoCreateShareableLink.Checked = Config.DropboxAutoCreateShareableLink; cbDropboxUseDirectLink.Enabled = Config.DropboxAutoCreateShareableLink; cbDropboxUseDirectLink.Checked = Config.DropboxUseDirectLink; #endregion Dropbox #region OneDrive tvOneDrive.Nodes.Clear(); OneDriveAddFolder(OneDrive.RootFolder, null); if (OAuth2Info.CheckOAuth(Config.OneDriveV2OAuth2Info)) { oAuth2OneDrive.Status = OAuthLoginStatus.LoginSuccessful; tvOneDrive.Enabled = true; } cbOneDriveCreateShareableLink.Checked = Config.OneDriveAutoCreateShareableLink; cbOneDriveUseDirectLink.Checked = Config.OneDriveUseDirectLink; cbOneDriveUseDirectLink.Enabled = Config.OneDriveAutoCreateShareableLink; lblOneDriveFolderID.Text = Resources.UploadersConfigForm_LoadSettings_Selected_folder_ + " " + Config.OneDriveV2SelectedFolder.name; tvOneDrive.CollapseAll(); #endregion OneDrive #region Google Drive oauth2GoogleDrive.UpdateStatus(Config.GoogleDriveOAuth2Info, Config.GoogleDriveUserInfo); btnGoogleDriveRefreshFolders.Enabled = oauth2GoogleDrive.Connected; cbGoogleDriveIsPublic.Checked = Config.GoogleDriveIsPublic; cbGoogleDriveDirectLink.Checked = Config.GoogleDriveDirectLink; cbGoogleDriveSharedDrive.Items.Clear(); cbGoogleDriveSharedDrive.Items.Add(GoogleDrive.MyDrive); if (Config.GoogleDriveSelectedDrive?.id != GoogleDrive.MyDrive.id) { cbGoogleDriveSharedDrive.Items.Add(Config.GoogleDriveSelectedDrive); } cbGoogleDriveUseFolder.Checked = Config.GoogleDriveUseFolder; txtGoogleDriveFolderID.Enabled = Config.GoogleDriveUseFolder; txtGoogleDriveFolderID.Text = Config.GoogleDriveFolderID; GoogleDriveSelectConfigDrive(); #endregion Google Drive #region puush txtPuushAPIKey.Text = Config.PuushAPIKey; #endregion puush #region Box if (OAuth2Info.CheckOAuth(Config.BoxOAuth2Info)) { oauth2Box.Status = OAuthLoginStatus.LoginSuccessful; btnBoxRefreshFolders.Enabled = true; } cbBoxShare.Checked = Config.BoxShare; cbBoxShareAccessLevel.Items.Clear(); cbBoxShareAccessLevel.Items.AddRange(Helpers.GetEnumDescriptions()); cbBoxShareAccessLevel.SelectedIndex = (int)Config.BoxShareAccessLevel; cbBoxShareAccessLevel.Enabled = Config.BoxShare; lblBoxShareAccessLevel.Enabled = Config.BoxShare; lblBoxFolderID.Text = Resources.UploadersConfigForm_LoadSettings_Selected_folder_ + " " + Config.BoxSelectedFolder.name; #endregion Box #region Localhostr txtLocalhostrEmail.Text = Config.LocalhostrEmail; txtLocalhostrPassword.Text = Config.LocalhostrPassword; cbLocalhostrDirectURL.Checked = Config.LocalhostrDirectURL; #endregion Localhostr #region Email txtEmailSmtpServer.Text = Config.EmailSmtpServer; nudEmailSmtpPort.SetValue(Config.EmailSmtpPort); txtEmailFrom.Text = Config.EmailFrom; txtEmailPassword.Text = Config.EmailPassword; cbEmailRememberLastTo.Checked = Config.EmailRememberLastTo; txtEmailDefaultSubject.Text = Config.EmailDefaultSubject; txtEmailDefaultBody.Text = Config.EmailDefaultBody; cbEmailAutomaticSend.Checked = Config.EmailAutomaticSend; txtEmailAutomaticSendTo.Enabled = Config.EmailAutomaticSend; txtEmailAutomaticSendTo.Text = Config.EmailAutomaticSendTo; #endregion Email #region SendSpace atcSendSpaceAccountType.SelectedAccountType = Config.SendSpaceAccountType; txtSendSpacePassword.Text = Config.SendSpacePassword; txtSendSpaceUserName.Text = Config.SendSpaceUsername; #endregion SendSpace #region Shared folder if (Config.LocalhostAccountList == null) { Config.LocalhostAccountList = new List(); } SharedFolderUpdateControls(); #endregion Shared folder #region Jira txtJiraHost.Text = Config.JiraHost; txtJiraIssuePrefix.Text = Config.JiraIssuePrefix; try { txtJiraConfigHelp.Text = string.Format(@"How to configure your Jira server: - Go to 'Administration' -> 'Add-ons' - Select 'Application Links' - Add a new 'Application Link' with following settings: - Server URL: {0} - Application Name: {1} - Application Type: Generic Application - Now, you have to configure Incoming Authentication - Consumer Key: {2} - Consumer Name: {1} - Public Key (without quotes): '{3}' - You can now authenticate to Jira", Links.Website, "ShareX", APIKeys.JiraConsumerKey, Jira.PublicKey); } catch (Exception e) { DebugHelper.WriteException(e); } if (OAuthInfo.CheckOAuth(Config.JiraOAuthInfo)) { oAuthJira.Status = OAuthLoginStatus.LoginSuccessful; } #endregion Jira #region Mega MegaConfigureTab(false); #endregion Mega #region Pushbullet txtPushbulletUserKey.Text = Config.PushbulletSettings.UserAPIKey; if (Config.PushbulletSettings.DeviceList.Count > 0) { Config.PushbulletSettings.DeviceList.ForEach(x => cbPushbulletDevices.Items.Add(x.Name ?? Resources.UploadersConfigForm_LoadSettings_Invalid_device_name)); if (Config.PushbulletSettings.DeviceList.IsValidIndex(Config.PushbulletSettings.SelectedDevice)) { cbPushbulletDevices.SelectedIndex = Config.PushbulletSettings.SelectedDevice; } else { cbPushbulletDevices.SelectedIndex = 0; } } #endregion Pushbullet #region Amazon S3 txtAmazonS3AccessKey.Text = Config.AmazonS3Settings.AccessKeyID; txtAmazonS3SecretKey.Text = Config.AmazonS3Settings.SecretAccessKey; cbAmazonS3Endpoints.Items.AddRange(AmazonS3.Endpoints.ToArray()); for (int i = 0; i < cbAmazonS3Endpoints.Items.Count; i++) { if (((AmazonS3Endpoint)cbAmazonS3Endpoints.Items[i]).Endpoint.Equals(Config.AmazonS3Settings.Endpoint, StringComparison.OrdinalIgnoreCase)) { cbAmazonS3Endpoints.SelectedIndex = i; break; } } txtAmazonS3Endpoint.Text = Config.AmazonS3Settings.Endpoint; txtAmazonS3Region.Text = Config.AmazonS3Settings.Region; cbAmazonS3UsePathStyle.Checked = Config.AmazonS3Settings.UsePathStyle; txtAmazonS3BucketName.Text = Config.AmazonS3Settings.Bucket; txtAmazonS3ObjectPrefix.Text = Config.AmazonS3Settings.ObjectPrefix; cbAmazonS3CustomCNAME.Checked = Config.AmazonS3Settings.UseCustomCNAME; txtAmazonS3CustomDomain.Enabled = Config.AmazonS3Settings.UseCustomCNAME; txtAmazonS3CustomDomain.Text = Config.AmazonS3Settings.CustomDomain; cbAmazonS3StorageClass.Items.AddRange(Helpers.GetEnumDescriptions()); cbAmazonS3StorageClass.SelectedIndex = (int)Config.AmazonS3Settings.StorageClass; cbAmazonS3PublicACL.Checked = Config.AmazonS3Settings.SetPublicACL; cbAmazonS3SignedPayload.Checked = Config.AmazonS3Settings.SignedPayload; cbAmazonS3StripExtensionImage.Checked = Config.AmazonS3Settings.RemoveExtensionImage; cbAmazonS3StripExtensionVideo.Checked = Config.AmazonS3Settings.RemoveExtensionVideo; cbAmazonS3StripExtensionText.Checked = Config.AmazonS3Settings.RemoveExtensionText; UpdateAmazonS3Status(); #endregion Amazon S3 #region ownCloud / Nextcloud txtOwnCloudHost.Text = Config.OwnCloudHost; txtOwnCloudUsername.Text = Config.OwnCloudUsername; txtOwnCloudPassword.Text = Config.OwnCloudPassword; txtOwnCloudPath.Text = Config.OwnCloudPath; txtOwnCloudExpiryTime.Value = Config.OwnCloudExpiryTime; cbOwnCloudCreateShare.Checked = Config.OwnCloudCreateShare; cbOwnCloudDirectLink.Checked = Config.OwnCloudDirectLink; cbOwnCloudAppendFileNameToURL.Checked = Config.OwnCloudAppendFileNameToURL; cbOwnCloud81Compatibility.Checked = Config.OwnCloud81Compatibility; cbOwnCloudUsePreviewLinks.Checked = Config.OwnCloudUsePreviewLinks; cbOwnCloudAutoExpire.Checked = Config.OwnCloudAutoExpire; #endregion ownCloud / Nextcloud #region MediaFire txtMediaFireEmail.Text = Config.MediaFireUsername; txtMediaFirePassword.Text = Config.MediaFirePassword; txtMediaFirePath.Text = Config.MediaFirePath; cbMediaFireUseLongLink.Checked = Config.MediaFireUseLongLink; #endregion MediaFire #region Lambda txtLambdaApiKey.Text = Config.LambdaSettings.UserAPIKey; cbLambdaUploadURL.Items.AddRange(Lambda.UploadURLs); cbLambdaUploadURL.SelectedItem = Config.LambdaSettings.UploadURL; #endregion Lambda #region LobFile txtLithiioApiKey.Text = Config.LithiioSettings.UserAPIKey; #endregion #region Pomf if (Config.PomfUploader == null) Config.PomfUploader = new PomfUploader(); txtPomfUploadURL.Text = Config.PomfUploader.UploadURL; txtPomfResultURL.Text = Config.PomfUploader.ResultURL; #endregion Pomf #region Seafile cbSeafileAPIURL.Text = Config.SeafileAPIURL; txtSeafileAuthToken.Text = Config.SeafileAuthToken; txtSeafileDirectoryPath.Text = Config.SeafilePath; txtSeafileLibraryPassword.Text = Config.SeafileEncryptedLibraryPassword; txtSeafileLibraryPassword.ReadOnly = Config.SeafileIsLibraryEncrypted; btnSeafileLibraryPasswordValidate.Enabled = !Config.SeafileIsLibraryEncrypted; cbSeafileCreateShareableURL.Checked = Config.SeafileCreateShareableURL; cbSeafileCreateShareableURLRaw.Checked = Config.SeafileCreateShareableURLRaw; cbSeafileCreateShareableURLRaw.Enabled = cbSeafileCreateShareableURL.Checked; cbSeafileIgnoreInvalidCert.Checked = Config.SeafileIgnoreInvalidCert; nudSeafileExpireDays.SetValue(Config.SeafileShareDaysToExpire); txtSeafileSharePassword.Text = Config.SeafileSharePassword; txtSeafileAccInfoEmail.Text = Config.SeafileAccInfoEmail; txtSeafileAccInfoUsage.Text = Config.SeafileAccInfoUsage; #endregion Seafile #region Streamable txtStreamablePassword.Text = Config.StreamablePassword; txtStreamableUsername.Text = Config.StreamableUsername; cbStreamableUseDirectURL.Checked = Config.StreamableUseDirectURL; #endregion Streamable #region s-ul txtSulAPIKey.Text = Config.SulAPIKey; #endregion s-ul #region Azure Storage txtAzureStorageAccountName.Text = Config.AzureStorageAccountName; txtAzureStorageAccessKey.Text = Config.AzureStorageAccountAccessKey; txtAzureStorageContainer.Text = Config.AzureStorageContainer; cbAzureStorageEnvironment.Text = Config.AzureStorageEnvironment; txtAzureStorageCustomDomain.Text = Config.AzureStorageCustomDomain; txtAzureStorageUploadPath.Text = Config.AzureStorageUploadPath; txtAzureStorageCacheControl.Text = Config.AzureStorageCacheControl; UpdateAzureStorageStatus(); #endregion Azure Storage #region Backblaze B2 txtB2ApplicationKeyId.Text = Config.B2ApplicationKeyId; txtB2ApplicationKey.Text = Config.B2ApplicationKey; txtB2Bucket.Text = Config.B2BucketName; txtB2UploadPath.Text = Config.B2UploadPath; cbB2CustomUrl.Checked = Config.B2UseCustomUrl; txtB2CustomUrl.ReadOnly = !cbB2CustomUrl.Checked; txtB2CustomUrl.Enabled = cbB2CustomUrl.Checked; txtB2CustomUrl.Text = Config.B2CustomUrl; B2UpdateCustomDomainPreview(); #endregion Backblaze B2 #region Plik txtPlikAPIKey.Text = Config.PlikSettings.APIKey; txtPlikURL.Text = Config.PlikSettings.URL; txtPlikPassword.Text = Config.PlikSettings.Password; txtPlikLogin.Text = Config.PlikSettings.Login; txtPlikComment.Text = Config.PlikSettings.Comment; cbPlikComment.Checked = Config.PlikSettings.HasComment; cbPlikIsSecured.Checked = Config.PlikSettings.IsSecured; cbPlikRemovable.Checked = Config.PlikSettings.Removable; cbPlikOneShot.Checked = Config.PlikSettings.OneShot; nudPlikTTL.Value = Config.PlikSettings.TTL; cbPlikTTLUnit.SelectedIndex = Config.PlikSettings.TTLUnit; txtPlikComment.ReadOnly = !cbPlikComment.Checked; txtPlikLogin.ReadOnly = !cbPlikIsSecured.Checked; txtPlikPassword.ReadOnly = !cbPlikIsSecured.Checked; #endregion Plik #region YouTube oauth2YouTube.UpdateStatus(Config.YouTubeOAuth2Info, Config.YouTubeUserInfo); cbYouTubePrivacyType.Items.Clear(); cbYouTubePrivacyType.Items.AddRange(Helpers.GetLocalizedEnumDescriptions()); cbYouTubePrivacyType.SelectedIndex = (int)Config.YouTubePrivacyType; cbYouTubeUseShortenedLink.Checked = Config.YouTubeUseShortenedLink; cbYouTubeShowDialog.Checked = Config.YouTubeShowDialog; #endregion YouTube #region Google Cloud Storage oauth2GoogleCloudStorage.UpdateStatus(Config.GoogleCloudStorageOAuth2Info, Config.GoogleCloudStorageUserInfo); txtGoogleCloudStorageBucket.Text = Config.GoogleCloudStorageBucket; txtGoogleCloudStorageDomain.Text = Config.GoogleCloudStorageDomain; txtGoogleCloudStorageObjectPrefix.Text = Config.GoogleCloudStorageObjectPrefix; cbGoogleCloudStorageStripExtensionImage.Checked = Config.GoogleCloudStorageRemoveExtensionImage; cbGoogleCloudStorageStripExtensionVideo.Checked = Config.GoogleCloudStorageRemoveExtensionVideo; cbGoogleCloudStorageStripExtensionText.Checked = Config.GoogleCloudStorageRemoveExtensionText; cbGoogleCloudStorageSetPublicACL.Checked = Config.GoogleCloudStorageSetPublicACL; #endregion Google Cloud Storage } private void LoadURLShortenerSettings() { #region bit.ly if (OAuth2Info.CheckOAuth(Config.BitlyOAuth2Info)) { oauth2Bitly.Status = OAuthLoginStatus.LoginSuccessful; } txtBitlyDomain.Text = Config.BitlyDomain; #endregion bit.ly #region yourls.org txtYourlsAPIURL.Text = Config.YourlsAPIURL; txtYourlsSignature.Text = Config.YourlsSignature; txtYourlsUsername.Enabled = txtYourlsPassword.Enabled = string.IsNullOrEmpty(Config.YourlsSignature); txtYourlsUsername.Text = Config.YourlsUsername; txtYourlsPassword.Text = Config.YourlsPassword; #endregion yourls.org #region adf.ly txtAdflyAPIKEY.Text = Config.AdFlyAPIKEY; txtAdflyAPIUID.Text = Config.AdFlyAPIUID; #endregion adf.ly #region Polr txtPolrAPIHostname.Text = Config.PolrAPIHostname; txtPolrAPIKey.Text = Config.PolrAPIKey; cbPolrIsSecret.Checked = Config.PolrIsSecret; cbPolrUseAPIv1.Checked = Config.PolrUseAPIv1; #endregion Polr #region Firebase Dynamic Links txtFirebaseWebAPIKey.Text = Config.FirebaseWebAPIKey; txtFirebaseDomain.Text = Config.FirebaseDynamicLinkDomain; cbFirebaseIsShort.Checked = Config.FirebaseIsShort; #endregion Firebase Dynamic Links #region Kutt txtKuttHost.Text = Config.KuttSettings.Host; txtKuttAPIKey.Text = Config.KuttSettings.APIKey; txtKuttPassword.Text = Config.KuttSettings.Password; txtKuttDomain.Text = Config.KuttSettings.Domain; cbKuttReuse.Checked = Config.KuttSettings.Reuse; #endregion Kutt #region Zero Width Shortener txtZWSURL.Text = Config.ZeroWidthShortenerURL; txtZWSToken.Text = Config.ZeroWidthShortenerToken; #endregion } private void LoadOtherUploaderSettings() { #region Twitter lbTwitterAccounts.Items.Clear(); foreach (OAuthInfo twitterOAuth in Config.TwitterOAuthInfoList) { lbTwitterAccounts.Items.Add(twitterOAuth.Description); } if (CheckTwitterAccounts()) { lbTwitterAccounts.SelectedIndex = Config.TwitterSelectedAccount; } TwitterUpdateSelected(); cbTwitterSkipMessageBox.Checked = Config.TwitterSkipMessageBox; txtTwitterDefaultMessage.Text = Config.TwitterDefaultMessage; #endregion Twitter } #region Image uploaders #region Imgur private void atcImgurAccountType_AccountTypeChanged(AccountType accountType) { Config.ImgurAccountType = accountType; oauth2Imgur.Enabled = Config.ImgurAccountType == AccountType.User; } private void oauth2Imgur_OpenButtonClicked() { OAuth2Info oauth = new OAuth2Info(APIKeys.ImgurClientID, APIKeys.ImgurClientSecret); Config.ImgurOAuth2Info = OAuth2Open(new Imgur(oauth)); } private void oauth2Imgur_CompleteButtonClicked(string code) { btnImgurRefreshAlbumList.Enabled = OAuth2Complete(new Imgur(Config.ImgurOAuth2Info), code, oauth2Imgur); } private void oauth2Imgur_ClearButtonClicked() { Config.ImgurOAuth2Info = null; } private void oauth2Imgur_RefreshButtonClicked() { btnImgurRefreshAlbumList.Enabled = OAuth2Refresh(new Imgur(Config.ImgurOAuth2Info), oauth2Imgur); } private void cbImgurDirectLink_CheckedChanged(object sender, EventArgs e) { Config.ImgurDirectLink = cbImgurDirectLink.Checked; } private void cbImgurThumbnailType_SelectedIndexChanged(object sender, EventArgs e) { Config.ImgurThumbnailType = (ImgurThumbnailType)cbImgurThumbnailType.SelectedIndex; } private void cbImgurUseGIFV_CheckedChanged(object sender, EventArgs e) { Config.ImgurUseGIFV = cbImgurUseGIFV.Checked; } private void cbImgurUploadSelectedAlbum_CheckedChanged(object sender, EventArgs e) { Config.ImgurUploadSelectedAlbum = cbImgurUploadSelectedAlbum.Checked; } private void btnImgurRefreshAlbumList_Click(object sender, EventArgs e) { ImgurRefreshAlbumList(); } private void lvImgurAlbumList_SelectedIndexChanged(object sender, EventArgs e) { if (lvImgurAlbumList.SelectedItems.Count > 0) { ListViewItem lvi = lvImgurAlbumList.SelectedItems[0]; if (lvi.Tag is ImgurAlbumData albumData) { Config.ImgurSelectedAlbum = albumData; } } else { Config.ImgurSelectedAlbum = null; } } #endregion Imgur #region ImageShack private void txtImageShackUsername_TextChanged(object sender, EventArgs e) { Config.ImageShackSettings.Username = txtImageShackUsername.Text; } private void txtImageShackPassword_TextChanged(object sender, EventArgs e) { Config.ImageShackSettings.Password = txtImageShackPassword.Text; } private void btnImageShackLogin_Click(object sender, EventArgs e) { ImageShackUploader imageShackUploader = new ImageShackUploader(APIKeys.ImageShackKey, Config.ImageShackSettings); try { if (imageShackUploader.GetAccessToken()) { MessageBox.Show(Resources.UploadersConfigForm_Login_successful, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show(Resources.UploadersConfigForm_Login_failed, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch (Exception ex) { DebugHelper.WriteException(ex); ex.ShowError(); } } private void cbImageShackIsPublic_CheckedChanged(object sender, EventArgs e) { Config.ImageShackSettings.IsPublic = cbImageShackIsPublic.Checked; } private void btnImageShackOpenPublicProfile_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(Config.ImageShackSettings.Username)) { URLHelpers.OpenURL("https://imageshack.com/user/" + Config.ImageShackSettings.Username); } else { txtImageShackUsername.Focus(); } } private void btnImageShackOpenMyImages_Click(object sender, EventArgs e) { URLHelpers.OpenURL("https://imageshack.com/my/images"); } #endregion ImageShack #region Flickr private void oauthFlickr_OpenButtonClicked() { FlickrAuthOpen(); } private void oauthFlickr_CompleteButtonClicked(string code) { FlickrAuthComplete(code); } private void oauthFlickr_ClearButtonClicked() { Config.FlickrOAuthInfo = null; } private void cbFlickrDirectLink_CheckedChanged(object sender, EventArgs e) { Config.FlickrSettings.DirectLink = cbFlickrDirectLink.Checked; } #endregion Flickr #region Photobucket private void btnPhotobucketAuthOpen_Click(object sender, EventArgs e) { PhotobucketAuthOpen(); } private void btnPhotobucketAuthComplete_Click(object sender, EventArgs e) { PhotobucketAuthComplete(); } private void btnPhotobucketCreateAlbum_Click(object sender, EventArgs e) { PhotobucketCreateAlbum(); } private void cbPhotobucketAlbumPaths_SelectedIndexChanged(object sender, EventArgs e) { if (Config.PhotobucketAccountInfo != null) { Config.PhotobucketAccountInfo.ActiveAlbumID = cbPhotobucketAlbumPaths.SelectedIndex; } } private void btnPhotobucketAddAlbum_Click(object sender, EventArgs e) { string albumPath = cbPhotobucketAlbumPaths.Text; if (!Config.PhotobucketAccountInfo.AlbumList.Contains(albumPath)) { Config.PhotobucketAccountInfo.AlbumList.Add(albumPath); cbPhotobucketAlbumPaths.Items.Add(albumPath); } } private void btnPhotobucketRemoveAlbum_Click(object sender, EventArgs e) { if (cbPhotobucketAlbumPaths.Items.Count > 1) { cbPhotobucketAlbumPaths.Items.RemoveAt(cbPhotobucketAlbumPaths.SelectedIndex); cbPhotobucketAlbumPaths.SelectedIndex = cbPhotobucketAlbumPaths.Items.Count - 1; } } #endregion Photobucket #region Google Photos private void oauth2GooglePhotos_ConnectButtonClicked() { OAuth2Info oauth = new OAuth2Info(APIKeys.GoogleClientID, APIKeys.GoogleClientSecret); IOAuth2Loopback oauthLoopback = new GooglePhotos(oauth).OAuth2; using (OAuthListenerForm form = new OAuthListenerForm(oauthLoopback)) { form.ShowDialog(); Config.GooglePhotosOAuth2Info = form.OAuth2Info; Config.GooglePhotosUserInfo = form.UserInfo; } oauth2GooglePhotos.UpdateStatus(Config.GooglePhotosOAuth2Info, Config.GooglePhotosUserInfo); btnPicasaRefreshAlbumList.Enabled = oauth2GooglePhotos.Connected; this.ForceActivate(); } private void oauth2GooglePhotos_DisconnectButtonClicked() { Config.GooglePhotosOAuth2Info = null; Config.GooglePhotosUserInfo = null; } private void txtPicasaAlbumID_TextChanged(object sender, EventArgs e) { Config.GooglePhotosAlbumID = txtPicasaAlbumID.Text; } private void btnPicasaRefreshAlbumList_Click(object sender, EventArgs e) { GooglePhotosRefreshAlbumList(); } private void lvPicasaAlbumList_SelectedIndexChanged(object sender, EventArgs e) { if (lvPicasaAlbumList.SelectedItems.Count > 0) { ListViewItem lvi = lvPicasaAlbumList.SelectedItems[0]; if (lvi.Tag is GooglePhotosAlbumInfo album) { txtPicasaAlbumID.Text = album.ID; } } } private void cbGooglePhotosIsPublic_CheckedChanged(object sender, EventArgs e) { Config.GooglePhotosIsPublic = cbGooglePhotosIsPublic.Checked; } private void btnGooglePhotosCreateAlbum_Click(object sender, EventArgs e) { GooglePhotosCreateAlbum(txtGooglePhotosCreateAlbumName.Text); GooglePhotosRefreshAlbumList(); } #endregion Google Photos #region Chevereto private void txtCheveretoWebsite_TextChanged(object sender, EventArgs e) { Config.CheveretoUploader.UploadURL = txtCheveretoUploadURL.Text; } private void txtCheveretoAPIKey_TextChanged(object sender, EventArgs e) { Config.CheveretoUploader.APIKey = txtCheveretoAPIKey.Text; } private void cbCheveretoDirectURL_CheckedChanged(object sender, EventArgs e) { Config.CheveretoDirectURL = cbCheveretoDirectURL.Checked; } #endregion Chevereto #region vgy.me private void txtVgymeUserKey_TextChanged(object sender, EventArgs e) { Config.VgymeUserKey = txtVgymeUserKey.Text; } private void llVgymeAccountDetailsPage_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { URLHelpers.OpenURL("http://vgy.me/account/details"); } #endregion vgy.me #endregion Image uploaders #region Text uploaders #region Pastebin private void txtPastebinUsername_TextChanged(object sender, EventArgs e) { Config.PastebinSettings.Username = txtPastebinUsername.Text; } private void txtPastebinPassword_TextChanged(object sender, EventArgs e) { Config.PastebinSettings.Password = txtPastebinPassword.Text; } private void btnPastebinRegister_Click(object sender, EventArgs e) { URLHelpers.OpenURL("http://pastebin.com/signup"); } private void btnPastebinLogin_Click(object sender, EventArgs e) { PastebinLogin(); } private void cbPastebinPrivacy_SelectedIndexChanged(object sender, EventArgs e) { Config.PastebinSettings.Exposure = (PastebinPrivacy)cbPastebinPrivacy.SelectedIndex; } private void cbPastebinExpiration_SelectedIndexChanged(object sender, EventArgs e) { Config.PastebinSettings.Expiration = (PastebinExpiration)cbPastebinExpiration.SelectedIndex; } private void cbPastebinSyntax_SelectedIndexChanged(object sender, EventArgs e) { Config.PastebinSettings.TextFormat = ((PastebinSyntaxInfo)cbPastebinSyntax.SelectedItem).Value; } private void txtPastebinTitle_TextChanged(object sender, EventArgs e) { Config.PastebinSettings.Title = txtPastebinTitle.Text; } private void cbPastebinRaw_CheckedChanged(object sender, EventArgs e) { Config.PastebinSettings.RawURL = cbPastebinRaw.Checked; } #endregion Pastebin #region Paste.ee private void btnPaste_eeGetUserKey_Click(object sender, EventArgs e) { URLHelpers.OpenURL($"https://paste.ee/account/api/authorize/{APIKeys.Paste_eeApplicationKey}"); } private void txtPaste_eeUserAPIKey_TextChanged(object sender, EventArgs e) { Config.Paste_eeUserKey = txtPaste_eeUserAPIKey.Text; } #endregion Paste.ee #region Gist private void oAuth2Gist_OpenButtonClicked() { OAuth2Info oauth = new OAuth2Info(APIKeys.GitHubID, APIKeys.GitHubSecret); Config.GistOAuth2Info = OAuth2Open(new GitHubGist(oauth)); } private void oAuth2Gist_CompleteButtonClicked(string code) { OAuth2Complete(new GitHubGist(Config.GistOAuth2Info), code, oAuth2Gist); } private void oAuth2Gist_ClearButtonClicked() { Config.GistOAuth2Info = null; } private void cbGistPublishPublic_CheckedChanged(object sender, EventArgs e) { Config.GistPublishPublic = cbGistPublishPublic.Checked; } private void cbGistUseRawURL_CheckedChanged(object sender, EventArgs e) { Config.GistRawURL = cbGistUseRawURL.Checked; } private void txtGistCustomURL_TextChanged(object sender, EventArgs e) { Config.GistCustomURL = txtGistCustomURL.Text; } #endregion Gist #region uPaste private void txtUpasteUserKey_TextChanged(object sender, EventArgs e) { Config.UpasteUserKey = txtUpasteUserKey.Text; } private void cbUpasteIsPublic_CheckedChanged(object sender, EventArgs e) { Config.UpasteIsPublic = cbUpasteIsPublic.Checked; } #endregion uPaste #region Hastebin private void txtHastebinCustomDomain_TextChanged(object sender, EventArgs e) { Config.HastebinCustomDomain = txtHastebinCustomDomain.Text; } private void txtHastebinSyntaxHighlighting_TextChanged(object sender, EventArgs e) { Config.HastebinSyntaxHighlighting = txtHastebinSyntaxHighlighting.Text; } private void cbHastebinUseFileExtension_CheckedChanged(object sender, EventArgs e) { Config.HastebinUseFileExtension = cbHastebinUseFileExtension.Checked; } #endregion Hastebin #region OneTimeSecret private void txtOneTimeSecretEmail_TextChanged(object sender, EventArgs e) { Config.OneTimeSecretAPIUsername = txtOneTimeSecretEmail.Text; } private void txtOneTimeSecretAPIKey_TextChanged(object sender, EventArgs e) { Config.OneTimeSecretAPIKey = txtOneTimeSecretAPIKey.Text; } #endregion OneTimeSecret #region Pastie private void cbPastieIsPublic_CheckedChanged(object sender, EventArgs e) { Config.PastieIsPublic = cbPastieIsPublic.Checked; } #endregion Pastie #endregion Text uploaders #region File uploaders #region FTP private void cbFTPImage_SelectedIndexChanged(object sender, EventArgs e) { Config.FTPSelectedImage = cbFTPImage.SelectedIndex; } private void cbFTPText_SelectedIndexChanged(object sender, EventArgs e) { Config.FTPSelectedText = cbFTPText.SelectedIndex; } private void cbFTPFile_SelectedIndexChanged(object sender, EventArgs e) { Config.FTPSelectedFile = cbFTPFile.SelectedIndex; } private void cbFTPAccounts_SelectedIndexChanged(object sender, EventArgs e) { FTPLoadSelectedAccount(); } private void btnFTPAdd_Click(object sender, EventArgs e) { FTPAddAccount(new FTPAccount()); cbFTPAccounts.SelectedIndex = cbFTPAccounts.Items.Count - 1; txtFTPName.Focus(); } private void btnFTPRemove_Click(object sender, EventArgs e) { int selected = cbFTPAccounts.SelectedIndex; if (selected > -1) { cbFTPAccounts.Items.RemoveAt(selected); Config.FTPAccountList.RemoveAt(selected); if (cbFTPAccounts.Items.Count > 0) { cbFTPAccounts.SelectedIndex = selected == cbFTPAccounts.Items.Count ? cbFTPAccounts.Items.Count - 1 : selected; } else { FTPClearFields(); btnFTPAdd.Focus(); } FTPUpdateControls(); } } private void btnFTPDuplicate_Click(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { FTPAccount clone = account.Clone(); FTPAddAccount(clone); cbFTPAccounts.SelectedIndex = cbFTPAccounts.Items.Count - 1; } } private void txtFTPName_TextChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.Name = txtFTPName.Text; FTPRefreshNames(); } } private void rbFTPProtocolFTP_CheckedChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.Protocol = FTPProtocol.FTP; FTPUpdateEnabledStates(); } } private void rbFTPProtocolFTPS_CheckedChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.Protocol = FTPProtocol.FTPS; FTPUpdateEnabledStates(); } } private void rbFTPProtocolSFTP_CheckedChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.Protocol = FTPProtocol.SFTP; FTPUpdateEnabledStates(); } } private void txtFTPHost_TextChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.Host = txtFTPHost.Text; FTPUpdateURLPreview(); FTPRefreshNames(); } } private void nudFTPPort_ValueChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.Port = (int)nudFTPPort.Value; FTPUpdateURLPreview(); } } private void txtFTPUsername_TextChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.Username = txtFTPUsername.Text; } } private void txtFTPPassword_TextChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.Password = txtFTPPassword.Text; } } private void rbFTPTransferModePassive_CheckedChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.IsActive = false; } } private void rbFTPTransferModeActive_CheckedChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.IsActive = true; } } private void txtFTPRemoteDirectory_TextChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.SubFolderPath = txtFTPRemoteDirectory.Text; FTPUpdateURLPreview(); } } private void cbFTPURLPathProtocol_SelectedIndexChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.BrowserProtocol = (BrowserProtocol)cbFTPURLPathProtocol.SelectedIndex; FTPUpdateURLPreview(); } } private void txtFTPURLPath_TextChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.HttpHomePath = txtFTPURLPath.Text; FTPUpdateURLPreview(); } } private void cbFTPAppendRemoteDirectory_CheckedChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.HttpHomePathAutoAddSubFolderPath = cbFTPAppendRemoteDirectory.Checked; FTPUpdateURLPreview(); } } private void cbFTPRemoveFileExtension_CheckedChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.HttpHomePathNoExtension = cbFTPRemoveFileExtension.Checked; FTPUpdateURLPreview(); } } private void cbFTPSEncryption_SelectedIndexChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.FTPSEncryption = (FTPSEncryption)cbFTPSEncryption.SelectedIndex; } } private void txtFTPSCertificateLocation_TextChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.FTPSCertificateLocation = txtFTPSCertificateLocation.Text; } } private void btnFTPSCertificateLocationBrowse_Click(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { using (OpenFileDialog dlg = new OpenFileDialog()) { dlg.Title = Resources.CertFileNameEditor_EditValue_Browse_for_a_certificate_file___; dlg.Filter = "Certificate file (*.cer)|*.cer"; if (dlg.ShowDialog() == DialogResult.OK) { txtFTPSCertificateLocation.Text = dlg.FileName; } } } } private void txtSFTPKeyLocation_TextChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.Keypath = txtSFTPKeyLocation.Text; } } private void btnSFTPKeyLocationBrowse_Click(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { using (OpenFileDialog dlg = new OpenFileDialog()) { dlg.Title = Resources.KeyFileNameEditor_EditValue_Browse_for_a_key_file___; dlg.Filter = "Key file (*.*)|*.*"; if (dlg.ShowDialog() == DialogResult.OK) { txtSFTPKeyLocation.Text = dlg.FileName; } } } } private void txtSFTPKeyPassphrase_TextChanged(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { account.Passphrase = txtSFTPKeyPassphrase.Text; } } private async void btnFTPTest_Click(object sender, EventArgs e) { FTPAccount account = FTPGetSelectedAccount(); if (account != null) { await FTPTestAccountAsync(account); } else { MessageBox.Show(Resources.UploadersConfigForm_FTPOpenClient_Unable_to_find_valid_FTP_account_, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private object eiFTP_ExportRequested() { return FTPGetSelectedAccount(); } private void eiFTP_ImportRequested(object obj) { FTPAddAccount(obj as FTPAccount); } #endregion FTP #region Dropbox private void oauth2Dropbox_OpenButtonClicked() { OAuth2Info oauth = new OAuth2Info(APIKeys.DropboxConsumerKey, APIKeys.DropboxConsumerSecret); Config.DropboxOAuth2Info = OAuth2Open(new Dropbox(oauth)); } private void oauth2Dropbox_CompleteButtonClicked(string code) { OAuth2Complete(new Dropbox(Config.DropboxOAuth2Info), code, oauth2Dropbox); } private void oauth2Dropbox_ClearButtonClicked() { Config.DropboxOAuth2Info = null; } private void txtDropboxPath_TextChanged(object sender, EventArgs e) { Config.DropboxUploadPath = txtDropboxPath.Text; } private void cbDropboxAutoCreateShareableLink_CheckedChanged(object sender, EventArgs e) { Config.DropboxAutoCreateShareableLink = cbDropboxAutoCreateShareableLink.Checked; cbDropboxUseDirectLink.Enabled = Config.DropboxAutoCreateShareableLink; } private void cbDropboxUseDirectLink_CheckedChanged(object sender, EventArgs e) { Config.DropboxUseDirectLink = cbDropboxUseDirectLink.Checked; } #endregion Dropbox #region OneDrive private void oAuth2OneDrive_OpenButtonClicked() { OAuth2Info oauth = new OAuth2Info(APIKeys.OneDriveClientID, APIKeys.OneDriveClientSecret); oauth.Proof = new OAuth2ProofKey(OAuth2ChallengeMethod.SHA256); Config.OneDriveV2OAuth2Info = OAuth2Open(new OneDrive(oauth)); } private void oAuth2OneDrive_CompleteButtonClicked(string code) { tvOneDrive.Enabled = OAuth2Complete(new OneDrive(Config.OneDriveV2OAuth2Info), code, oAuth2OneDrive); } private void oAuth2OneDrive_RefreshButtonClicked() { tvOneDrive.Enabled = OAuth2Refresh(new OneDrive(Config.OneDriveV2OAuth2Info), oAuth2OneDrive); } private void oAuth2OneDrive_ClearButtonClicked() { Config.OneDriveV2OAuth2Info = null; } private void cbOneDriveCreateShareableLink_CheckedChanged(object sender, EventArgs e) { Config.OneDriveAutoCreateShareableLink = cbOneDriveCreateShareableLink.Checked; cbOneDriveUseDirectLink.Enabled = cbOneDriveCreateShareableLink.Checked; } private void cbOneDriveUseDirectLink_CheckedChanged(object sender, EventArgs e) { Config.OneDriveUseDirectLink = cbOneDriveUseDirectLink.Checked; } private void tvOneDrive_AfterSelect(object sender, TreeViewEventArgs e) { if (e.Node.Tag is OneDriveFileInfo file) { lblOneDriveFolderID.Text = Resources.UploadersConfigForm_LoadSettings_Selected_folder_ + " " + file.name; Config.OneDriveV2SelectedFolder = file; } } private void tvOneDrive_AfterExpand(object sender, TreeViewEventArgs e) { if (e.Node.Tag is OneDriveFileInfo file) { OneDriveListFolders(file, e.Node); } } #endregion OneDrive #region Google Drive private void oauth2GoogleDrive_ConnectButtonClicked() { OAuth2Info oauth = new OAuth2Info(APIKeys.GoogleClientID, APIKeys.GoogleClientSecret); IOAuth2Loopback oauthLoopback = new GoogleDrive(oauth).OAuth2; using (OAuthListenerForm form = new OAuthListenerForm(oauthLoopback)) { form.ShowDialog(); Config.GoogleDriveOAuth2Info = form.OAuth2Info; Config.GoogleDriveUserInfo = form.UserInfo; } oauth2GoogleDrive.UpdateStatus(Config.GoogleDriveOAuth2Info, Config.GoogleDriveUserInfo); btnGoogleDriveRefreshFolders.Enabled = oauth2GoogleDrive.Connected; this.ForceActivate(); } private void oauth2GoogleDrive_DisconnectButtonClicked() { Config.GoogleDriveOAuth2Info = null; Config.GoogleDriveUserInfo = null; } private void cbGoogleDriveIsPublic_CheckedChanged(object sender, EventArgs e) { Config.GoogleDriveIsPublic = cbGoogleDriveIsPublic.Checked; } private void cbGoogleDriveDirectLink_CheckedChanged(object sender, EventArgs e) { Config.GoogleDriveDirectLink = cbGoogleDriveDirectLink.Checked; } private void cbGoogleDriveUseFolder_CheckedChanged(object sender, EventArgs e) { Config.GoogleDriveUseFolder = cbGoogleDriveUseFolder.Checked; txtGoogleDriveFolderID.Enabled = Config.GoogleDriveUseFolder; } private void txtGoogleDriveFolderID_TextChanged(object sender, EventArgs e) { Config.GoogleDriveFolderID = txtGoogleDriveFolderID.Text; } private void btnGoogleDriveRefreshFolders_Click(object sender, EventArgs e) { GoogleDriveRefreshFolders(); GoogleDriveRefreshDrives(); } private void lvGoogleDriveFoldersList_SelectedIndexChanged(object sender, EventArgs e) { if (lvGoogleDriveFoldersList.SelectedItems.Count > 0) { ListViewItem lvi = lvGoogleDriveFoldersList.SelectedItems[0]; if (lvi.Tag is GoogleDriveFile folder) { txtGoogleDriveFolderID.Text = folder.id; } } } private void cbGoogleDriveSharedDrive_SelectedIndexChanged(object sender, EventArgs e) { GoogleDriveSharedDrive selectedDrive = cbGoogleDriveSharedDrive.SelectedItem as GoogleDriveSharedDrive; Config.GoogleDriveSelectedDrive = selectedDrive; } #endregion Google Drive #region puush private bool PuushValidationCheck() { bool result = true; if (string.IsNullOrEmpty(txtPuushEmail.Text)) { txtPuushEmail.BackColor = Color.FromArgb(255, 200, 200); result = false; } else { txtPuushEmail.BackColor = SystemColors.Window; } if (string.IsNullOrEmpty(txtPuushPassword.Text)) { txtPuushPassword.BackColor = Color.FromArgb(255, 200, 200); result = false; } else { txtPuushPassword.BackColor = SystemColors.Window; } return result; } private void llPuushForgottenPassword_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { URLHelpers.OpenURL(Puush.PuushResetPasswordURL); } private void btnPuushLogin_Click(object sender, EventArgs e) { if (PuushValidationCheck()) { txtPuushAPIKey.Text = ""; string apiKey = new Puush().Login(txtPuushEmail.Text, txtPuushPassword.Text); if (!string.IsNullOrEmpty(apiKey)) { txtPuushAPIKey.Text = apiKey; } else { MessageBox.Show("Login failed.", "Authentication failure", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private void txtPuushAPIKey_TextChanged(object sender, EventArgs e) { Config.PuushAPIKey = txtPuushAPIKey.Text; } #endregion puush #region Box private void oauth2Box_OpenButtonClicked() { OAuth2Info oauth = new OAuth2Info(APIKeys.BoxClientID, APIKeys.BoxClientSecret); Config.BoxOAuth2Info = OAuth2Open(new Box(oauth)); } private void oauth2Box_CompleteButtonClicked(string code) { btnBoxRefreshFolders.Enabled = OAuth2Complete(new Box(Config.BoxOAuth2Info), code, oauth2Box); } private void oauth2Box_RefreshButtonClicked() { btnBoxRefreshFolders.Enabled = OAuth2Refresh(new Box(Config.BoxOAuth2Info), oauth2Box); } private void oauth2Box_ClearButtonClicked() { Config.BoxOAuth2Info = null; } private void cbBoxShare_CheckedChanged(object sender, EventArgs e) { Config.BoxShare = cbBoxShare.Checked; cbBoxShareAccessLevel.Enabled = Config.BoxShare; lblBoxShareAccessLevel.Enabled = Config.BoxShare; } private void cbBoxShareAccessLevel_SelectedIndexChanged(object sender, EventArgs e) { Config.BoxShareAccessLevel = (BoxShareAccessLevel)cbBoxShareAccessLevel.SelectedIndex; } private void btnBoxRefreshFolders_Click(object sender, EventArgs e) { BoxListFolders(); } private void lvBoxFolders_SelectedIndexChanged(object sender, EventArgs e) { if (lvBoxFolders.SelectedItems.Count > 0) { ListViewItem lvi = lvBoxFolders.SelectedItems[0]; if (lvi.Tag is BoxFileEntry file) { lblBoxFolderID.Text = Resources.UploadersConfigForm_LoadSettings_Selected_folder_ + " " + file.name; Config.BoxSelectedFolder = file; } } } private void lvBoxFolders_MouseDoubleClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && lvBoxFolders.SelectedItems.Count > 0) { ListViewItem lvi = lvBoxFolders.SelectedItems[0]; if (lvi.Tag is BoxFileEntry file) { lvBoxFolders.Items.Clear(); BoxListFolders(file); } } } #endregion Box #region Email private void txtSmtpServer_TextChanged(object sender, EventArgs e) { Config.EmailSmtpServer = txtEmailSmtpServer.Text; } private void nudSmtpPort_ValueChanged(object sender, EventArgs e) { Config.EmailSmtpPort = (int)nudEmailSmtpPort.Value; } private void txtEmail_TextChanged(object sender, EventArgs e) { Config.EmailFrom = txtEmailFrom.Text; } private void txtPassword_TextChanged(object sender, EventArgs e) { Config.EmailPassword = txtEmailPassword.Text; } private void cbRememberLastToEmail_CheckedChanged(object sender, EventArgs e) { Config.EmailRememberLastTo = cbEmailRememberLastTo.Checked; } private void txtDefaultSubject_TextChanged(object sender, EventArgs e) { Config.EmailDefaultSubject = txtEmailDefaultSubject.Text; } private void txtDefaultBody_TextChanged(object sender, EventArgs e) { Config.EmailDefaultBody = txtEmailDefaultBody.Text; } private void cbEmailAutomaticSend_CheckedChanged(object sender, EventArgs e) { Config.EmailAutomaticSend = cbEmailAutomaticSend.Checked; txtEmailAutomaticSendTo.Enabled = Config.EmailAutomaticSend; } private void txtEmailAutomaticSendTo_TextChanged(object sender, EventArgs e) { Config.EmailAutomaticSendTo = txtEmailAutomaticSendTo.Text; } #endregion Email #region SendSpace private void atcSendSpaceAccountType_AccountTypeChanged(AccountType accountType) { Config.SendSpaceAccountType = accountType; } private void btnSendSpaceRegister_Click(object sender, EventArgs e) { using (UserPassBox upb = SendSpaceRegister()) { if (upb.Success) { txtSendSpaceUserName.Text = upb.UserName; txtSendSpacePassword.Text = upb.Password; atcSendSpaceAccountType.SelectedAccountType = AccountType.User; } } } private void txtSendSpaceUserName_TextChanged(object sender, EventArgs e) { Config.SendSpaceUsername = txtSendSpaceUserName.Text; } private void txtSendSpacePassword_TextChanged(object sender, EventArgs e) { Config.SendSpacePassword = txtSendSpacePassword.Text; } #endregion SendSpace #region Localhostr private void txtLocalhostrEmail_TextChanged(object sender, EventArgs e) { Config.LocalhostrEmail = txtLocalhostrEmail.Text; } private void txtLocalhostrPassword_TextChanged(object sender, EventArgs e) { Config.LocalhostrPassword = txtLocalhostrPassword.Text; } private void cbLocalhostrDirectURL_CheckedChanged(object sender, EventArgs e) { Config.LocalhostrDirectURL = cbLocalhostrDirectURL.Checked; } #endregion Localhostr #region Jira private void txtJiraHost_TextChanged(object sender, EventArgs e) { Config.JiraHost = txtJiraHost.Text; } private void txtJiraIssuePrefix_TextChanged(object sender, EventArgs e) { Config.JiraIssuePrefix = txtJiraIssuePrefix.Text; } private void oAuthJira_OpenButtonClicked() { JiraAuthOpen(); } private void oAuthJira_CompleteButtonClicked(string code) { JiraAuthComplete(code); } private void oAuthJira_ClearButtonClicked() { Config.JiraOAuthInfo = null; } private void oAuthJira_RefreshButtonClicked() { MessageBox.Show(Resources.UploadersConfigForm_oAuthJira_RefreshButtonClicked_Refresh_authorization_is_not_supported_, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Information); } #endregion Jira #region Mega private void MegaConfigureTab(bool tryLogin) { Color OkColor = Color.Green; Color NokColor = Color.DarkRed; tpMega.Enabled = false; if (Config.MegaAuthInfos != null) { txtMegaEmail.Text = Config.MegaAuthInfos.Email; } if (Config.MegaAuthInfos == null) { lblMegaStatus.Text = Resources.UploadersConfigForm_MegaConfigureTab_Not_configured; lblMegaStatus.ForeColor = NokColor; } else { cbMegaFolder.Items.Clear(); Mega mega = new Mega(Config.MegaAuthInfos?.GetMegaApiClientAuthInfos()); if (!tryLogin || mega.TryLogin()) { lblMegaStatus.Text = Resources.UploadersConfigForm_MegaConfigureTab_Configured; lblMegaStatus.ForeColor = OkColor; if (tryLogin) { Mega.DisplayNode[] nodes = mega.GetDisplayNodes().ToArray(); cbMegaFolder.Items.AddRange(nodes); cbMegaFolder.SelectedItem = nodes.FirstOrDefault(n => n.Node != null && n.Node.Id == Config.MegaParentNodeId) ?? Mega.DisplayNode.EmptyNode; } else { cbMegaFolder.Items.Add("[" + Resources.UploadersConfigForm_MegaConfigureTab_Click_refresh_button + "]"); cbMegaFolder.SelectedIndex = 0; } } else { lblMegaStatus.Text = Resources.UploadersConfigForm_MegaConfigureTab_Invalid_authentication; lblMegaStatus.ForeColor = NokColor; } } tpMega.Enabled = true; } private void btnMegaLogin_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(txtMegaEmail.Text) || string.IsNullOrEmpty(txtMegaPassword.Text)) { return; } MegaApiClient.AuthInfos megaAuthInfos = new MegaApiClient().GenerateAuthInfos(txtMegaEmail.Text, txtMegaPassword.Text); if (megaAuthInfos != null) { Config.MegaAuthInfos = new MegaAuthInfos(megaAuthInfos); } else { Config.MegaAuthInfos = null; } MegaConfigureTab(true); } private void cbMegaFolder_SelectedIndexChanged(object sender, EventArgs e) { if (((ComboBox)sender).SelectedItem is Mega.DisplayNode selectedNode) { Config.MegaParentNodeId = selectedNode == Mega.DisplayNode.EmptyNode ? null : selectedNode.Node.Id; } } private void btnMegaRegister_Click(object sender, EventArgs e) { URLHelpers.OpenURL("https://mega.co.nz/#register"); } private void btnMegaRefreshFolders_Click(object sender, EventArgs e) { MegaConfigureTab(true); } #endregion Mega #region Amazon S3 private void txtAmazonS3AccessKey_TextChanged(object sender, EventArgs e) { Config.AmazonS3Settings.AccessKeyID = txtAmazonS3AccessKey.Text; } private void btnAmazonS3AccessKeyOpen_Click(object sender, EventArgs e) { URLHelpers.OpenURL("https://console.aws.amazon.com/iam/home?#security_credential"); } private void txtAmazonS3SecretKey_TextChanged(object sender, EventArgs e) { Config.AmazonS3Settings.SecretAccessKey = txtAmazonS3SecretKey.Text; } private void cbAmazonS3Endpoints_SelectedIndexChanged(object sender, EventArgs e) { if (cbAmazonS3Endpoints.SelectedItem is AmazonS3Endpoint endpoint) { txtAmazonS3Region.Text = endpoint.Region; txtAmazonS3Endpoint.Text = endpoint.Endpoint; } } private void txtAmazonS3Endpoint_TextChanged(object sender, EventArgs e) { Config.AmazonS3Settings.Endpoint = txtAmazonS3Endpoint.Text; UpdateAmazonS3Status(); } private void txtAmazonS3Region_TextChanged(object sender, EventArgs e) { Config.AmazonS3Settings.Region = txtAmazonS3Region.Text; UpdateAmazonS3Status(); } private void cbAmazonS3UsePathStyle_CheckedChanged(object sender, EventArgs e) { Config.AmazonS3Settings.UsePathStyle = cbAmazonS3UsePathStyle.Checked; } private void txtAmazonS3BucketName_TextChanged(object sender, EventArgs e) { Config.AmazonS3Settings.Bucket = txtAmazonS3BucketName.Text; UpdateAmazonS3Status(); } private void btnAmazonS3BucketNameOpen_Click(object sender, EventArgs e) { URLHelpers.OpenURL("https://console.aws.amazon.com/s3/home"); } private void txtAmazonS3ObjectPrefix_TextChanged(object sender, EventArgs e) { Config.AmazonS3Settings.ObjectPrefix = txtAmazonS3ObjectPrefix.Text; UpdateAmazonS3Status(); } private void cbAmazonS3CustomCNAME_CheckedChanged(object sender, EventArgs e) { Config.AmazonS3Settings.UseCustomCNAME = cbAmazonS3CustomCNAME.Checked; txtAmazonS3CustomDomain.Enabled = Config.AmazonS3Settings.UseCustomCNAME; UpdateAmazonS3Status(); } private void txtAmazonS3CustomDomain_TextChanged(object sender, EventArgs e) { Config.AmazonS3Settings.CustomDomain = txtAmazonS3CustomDomain.Text; UpdateAmazonS3Status(); } private void cbAmazonS3StorageClass_SelectedIndexChanged(object sender, EventArgs e) { Config.AmazonS3Settings.StorageClass = (AmazonS3StorageClass)cbAmazonS3StorageClass.SelectedIndex; } private void btnAmazonS3StorageClassHelp_Click(object sender, EventArgs e) { URLHelpers.OpenURL("https://aws.amazon.com/s3/storage-classes/"); } private void cbAmazonS3PublicACL_CheckedChanged(object sender, EventArgs e) { Config.AmazonS3Settings.SetPublicACL = cbAmazonS3PublicACL.Checked; } private void cbAmazonS3SignedPayload_CheckedChanged(object sender, EventArgs e) { Config.AmazonS3Settings.SignedPayload = cbAmazonS3SignedPayload.Checked; } private void cbAmazonS3StripExtensionImage_CheckedChanged(object sender, EventArgs e) { Config.AmazonS3Settings.RemoveExtensionImage = cbAmazonS3StripExtensionImage.Checked; UpdateAmazonS3Status(); } private void cbAmazonS3StripExtensionVideo_CheckedChanged(object sender, EventArgs e) { Config.AmazonS3Settings.RemoveExtensionVideo = cbAmazonS3StripExtensionVideo.Checked; UpdateAmazonS3Status(); } private void cbAmazonS3StripExtensionText_CheckedChanged(object sender, EventArgs e) { Config.AmazonS3Settings.RemoveExtensionText = cbAmazonS3StripExtensionText.Checked; UpdateAmazonS3Status(); } #endregion Amazon S3 #region ownCloud / Nextcloud private void txtOwnCloudHost_TextChanged(object sender, EventArgs e) { Config.OwnCloudHost = txtOwnCloudHost.Text; } private void txtOwnCloudUsername_TextChanged(object sender, EventArgs e) { Config.OwnCloudUsername = txtOwnCloudUsername.Text; } private void txtOwnCloudPassword_TextChanged(object sender, EventArgs e) { Config.OwnCloudPassword = txtOwnCloudPassword.Text; } private void txtOwnCloudPath_TextChanged(object sender, EventArgs e) { Config.OwnCloudPath = txtOwnCloudPath.Text; } private void txtOwnExpiryTime_TextChanged(object sender, EventArgs e) { Config.OwnCloudExpiryTime = Convert.ToInt32(txtOwnCloudExpiryTime.Value); } private void cbOwnCloudCreateShare_CheckedChanged(object sender, EventArgs e) { Config.OwnCloudCreateShare = cbOwnCloudCreateShare.Checked; } private void cbOwnCloudDirectLink_CheckedChanged(object sender, EventArgs e) { Config.OwnCloudDirectLink = cbOwnCloudDirectLink.Checked; } private void cbOwnCloudAppendFileNameToURL_CheckedChanged(object sender, EventArgs e) { Config.OwnCloudAppendFileNameToURL = cbOwnCloudAppendFileNameToURL.Checked; } private void cbOwnCloud81Compatibility_CheckedChanged(object sender, EventArgs e) { Config.OwnCloud81Compatibility = cbOwnCloud81Compatibility.Checked; } private void cbOwnCloudUsePreviewLinks_CheckedChanged(object sender, EventArgs e) { Config.OwnCloudUsePreviewLinks = cbOwnCloudUsePreviewLinks.Checked; } private void cbOwnCloudAutoExpire_CheckedChanged(object sender, EventArgs e) { Config.OwnCloudAutoExpire = cbOwnCloudAutoExpire.Checked; } #endregion ownCloud / Nextcloud #region Pushbullet private void txtPushbulletUserKey_TextChanged(object sender, EventArgs e) { bool enable = !string.IsNullOrEmpty(txtPushbulletUserKey.Text.Trim()); cbPushbulletDevices.Enabled = enable; btnPushbulletGetDeviceList.Enabled = enable; Config.PushbulletSettings.UserAPIKey = txtPushbulletUserKey.Text; } private void cbPushbulletDevices_SelectedIndexChanged(object sender, EventArgs e) { Config.PushbulletSettings.SelectedDevice = cbPushbulletDevices.SelectedIndex; } private void btnPushbulletGetDeviceList_Click(object sender, EventArgs e) { PushbulletGetDevices(); } #endregion Pushbullet #region Shared folder private void cbSharedFolderImages_SelectedIndexChanged(object sender, EventArgs e) { Config.LocalhostSelectedImages = cbSharedFolderImages.SelectedIndex; } private void cbSharedFolderText_SelectedIndexChanged(object sender, EventArgs e) { Config.LocalhostSelectedText = cbSharedFolderText.SelectedIndex; } private void cbSharedFolderFiles_SelectedIndexChanged(object sender, EventArgs e) { Config.LocalhostSelectedFiles = cbSharedFolderFiles.SelectedIndex; } private void btnSharedFolderAdd_Click(object sender, EventArgs e) { LocalhostAccount acc = new LocalhostAccount(); SharedFolderAddItem(acc); } private void btnSharedFolderRemove_Click(object sender, EventArgs e) { int index = lbSharedFolderAccounts.SelectedIndex; SharedFolderRemoveItem(index); } private void btnSharedFolderDuplicate_Click(object sender, EventArgs e) { LocalhostAccount account = (LocalhostAccount)lbSharedFolderAccounts.Items[lbSharedFolderAccounts.SelectedIndex]; LocalhostAccount clone = account.Clone(); SharedFolderAddItem(clone); } private void lbSharedFolderAccounts_SelectedIndexChanged(object sender, EventArgs e) { SharedFolderUpdateEnabledStates(); if (lbSharedFolderAccounts.SelectedIndex > -1) { pgSharedFolderAccount.SelectedObject = lbSharedFolderAccounts.Items[lbSharedFolderAccounts.SelectedIndex]; } } private void pgSharedFolderAccount_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) { SharedFolderUpdateControls(); if (lbSharedFolderAccounts.SelectedIndex > -1) { lbSharedFolderAccounts.Items[lbSharedFolderAccounts.SelectedIndex] = pgSharedFolderAccount.SelectedObject; } } #endregion Shared folder #region MediaFire private void txtMediaFireUsername_TextChanged(object sender, EventArgs e) { Config.MediaFireUsername = txtMediaFireEmail.Text; } private void txtMediaFirePassword_TextChanged(object sender, EventArgs e) { Config.MediaFirePassword = txtMediaFirePassword.Text; } private void txtMediaFirePath_TextChanged(object sender, EventArgs e) { Config.MediaFirePath = txtMediaFirePath.Text; } private void cbMediaFireUseLongLink_CheckedChanged(object sender, EventArgs e) { Config.MediaFireUseLongLink = cbMediaFireUseLongLink.Checked; } #endregion MediaFire #region Lambda private void lambdaInfoLabel_Click(object sender, EventArgs e) { URLHelpers.OpenURL("https://lambda.sx/user/manage"); } private void txtLambdaApiKey_TextChanged(object sender, EventArgs e) { Config.LambdaSettings.UserAPIKey = txtLambdaApiKey.Text; } private void cbLambdaUploadURL_SelectedIndexChanged(object sender, EventArgs e) { if (cbLambdaUploadURL.SelectedIndex > -1 && cbLambdaUploadURL.SelectedItem is string url) { Config.LambdaSettings.UploadURL = url; } } #endregion Lambda #region Pomf private void txtPomfUploadURL_TextChanged(object sender, EventArgs e) { Config.PomfUploader.UploadURL = txtPomfUploadURL.Text; } private void txtPomfResultURL_TextChanged(object sender, EventArgs e) { Config.PomfUploader.ResultURL = txtPomfResultURL.Text; } #endregion Pomf #region Seafile private void cbSeafileAPIURL_TextChanged(object sender, EventArgs e) { Config.SeafileAPIURL = cbSeafileAPIURL.Text; } private void btnSeafileCheckAPIURL_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(cbSeafileAPIURL.Text)) { return; } Seafile sf = new Seafile(cbSeafileAPIURL.Text, null, null); bool checkReturned = sf.CheckAPIURL(); if (checkReturned) { MessageBox.Show(Resources.UploadersConfigForm_TestFTPAccount_Connected_, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show(Resources.UploadersConfigForm_Error, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void txtSeafileAuthToken_TextChanged(object sender, EventArgs e) { Config.SeafileAuthToken = txtSeafileAuthToken.Text; } private void btnSeafileCheckAuthToken_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(txtSeafileAuthToken.Text) || string.IsNullOrEmpty(cbSeafileAPIURL.Text)) { return; } Seafile sf = new Seafile(cbSeafileAPIURL.Text, txtSeafileAuthToken.Text, null); bool checkReturned = sf.CheckAuthToken(); if (checkReturned) { MessageBox.Show(Resources.UploadersConfigForm_Login_successful, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show(Resources.UploadersConfigForm_Error, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void txtSeafilePassword_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Return) { btnSeafileGetAuthToken.PerformClick(); } } private void btnSeafileGetAuthToken_Click(object sender, EventArgs e) { string username = txtSeafileUsername.Text; string password = txtSeafilePassword.Text; if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password)) { try { Seafile sf = new Seafile(cbSeafileAPIURL.Text, null, null); string authToken = sf.GetAuthToken(username, password); if (!string.IsNullOrEmpty(authToken)) { txtSeafileUsername.Text = ""; txtSeafilePassword.Text = ""; Config.SeafileAuthToken = authToken; txtSeafileAuthToken.Text = authToken; btnRefreshSeafileAccInfo.PerformClick(); Config.SeafileRepoID = sf.GetOrMakeDefaultLibrary(authToken); txtSeafileUploadLocationRefresh.PerformClick(); MessageBox.Show(Resources.UploadersConfigForm_Login_successful, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show(Resources.UploadersConfigForm_Login_failed, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch (Exception ex) { DebugHelper.WriteException(ex); ex.ShowError(); } } } private void cbSeafileCreateShareableURL_CheckedChanged(object sender, EventArgs e) { Config.SeafileCreateShareableURL = cbSeafileCreateShareableURL.Checked; cbSeafileCreateShareableURLRaw.Enabled = cbSeafileCreateShareableURL.Checked; } private void cbSeafileCreateShareableURLRaw_CheckedChanged(object sender, EventArgs e) { Config.SeafileCreateShareableURLRaw = cbSeafileCreateShareableURLRaw.Checked; } private void cbSeafileIgnoreInvalidCert_CheckedChanged(object sender, EventArgs e) { Config.SeafileIgnoreInvalidCert = cbSeafileIgnoreInvalidCert.Checked; } private void btnRefreshSeafileAccInfo_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(txtSeafileAuthToken.Text) || string.IsNullOrEmpty(cbSeafileAPIURL.Text)) { return; } Seafile sf = new Seafile(cbSeafileAPIURL.Text, txtSeafileAuthToken.Text, null); SeafileCheckAccInfoResponse SeafileCheckAccInfoResponse = sf.GetAccountInfo(); if (SeafileCheckAccInfoResponse == null) { MessageBox.Show(Resources.UploadersConfigForm_Login_failed, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } txtSeafileAccInfoEmail.Text = SeafileCheckAccInfoResponse.email; txtSeafileAccInfoUsage.Text = SeafileCheckAccInfoResponse.usage.ToSizeString() + " / " + SeafileCheckAccInfoResponse.total.ToSizeString(); } private void txtSeafileUploadLocationRefresh_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(txtSeafileAuthToken.Text) || string.IsNullOrEmpty(cbSeafileAPIURL.Text)) { return; } lvSeafileLibraries.Items.Clear(); Seafile sf = new Seafile(cbSeafileAPIURL.Text, txtSeafileAuthToken.Text, null); List SeafileLibraries = sf.GetLibraries(); foreach (SeafileLibraryObj SeafileLibrary in SeafileLibraries) { if (SeafileLibrary.permission == "rw") { ListViewItem libraryItem = lvSeafileLibraries.Items.Add(SeafileLibrary.name); libraryItem.Name = SeafileLibrary.id; libraryItem.Tag = SeafileLibrary; libraryItem.SubItems.Add(SeafileLibrary.size.ToSizeString()); if (SeafileLibrary.encrypted) { libraryItem.SubItems.Add("\u221A"); } if (SeafileLibrary.id == Config.SeafileRepoID) { libraryItem.Selected = true; } } } } private void lvSeafileLibraries_SelectedIndexChanged(object sender, EventArgs e) { int selIndex = lvSeafileLibraries.SelectedIndex; if (selIndex > -1) { ListViewItem selectedItem = lvSeafileLibraries.Items[selIndex]; Config.SeafileRepoID = selectedItem.Name; SeafileLibraryObj SealileLibraryInfo = (SeafileLibraryObj)selectedItem.Tag; if (SealileLibraryInfo.encrypted) { Config.SeafileIsLibraryEncrypted = true; txtSeafileLibraryPassword.ReadOnly = false; btnSeafileLibraryPasswordValidate.Enabled = true; } else { Config.SeafileIsLibraryEncrypted = false; txtSeafileLibraryPassword.ReadOnly = true; txtSeafileLibraryPassword.Text = ""; Config.SeafileEncryptedLibraryPassword = ""; btnSeafileLibraryPasswordValidate.Enabled = false; } } } private void txtSeafileDirectoryPath_TextChanged(object sender, EventArgs e) { Config.SeafilePath = txtSeafileDirectoryPath.Text; } private void btnSeafilePathValidate_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(Config.SeafilePath) || string.IsNullOrEmpty(Config.SeafileAPIURL) || string.IsNullOrEmpty(Config.SeafileAuthToken) || string.IsNullOrEmpty(Config.SeafileRepoID)) { return; } Seafile sf = new Seafile(cbSeafileAPIURL.Text, txtSeafileAuthToken.Text, Config.SeafileRepoID); bool checkReturned = sf.ValidatePath(txtSeafileDirectoryPath.Text); if (checkReturned) { MessageBox.Show(Resources.UploadersConfigForm_TestFTPAccount_Connected_, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show(Resources.UploadersConfigForm_Error, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void txtSeafileLibraryPassword_TextChanged(object sender, EventArgs e) { if (Config.SeafileIsLibraryEncrypted) { Config.SeafileEncryptedLibraryPassword = txtSeafileLibraryPassword.Text; } } private void btnSeafileLibraryPasswordValidate_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(Config.SeafileEncryptedLibraryPassword) || string.IsNullOrEmpty(Config.SeafileAPIURL) || string.IsNullOrEmpty(Config.SeafileAuthToken) || string.IsNullOrEmpty(Config.SeafileRepoID)) { return; } Seafile sf = new Seafile(cbSeafileAPIURL.Text, txtSeafileAuthToken.Text, Config.SeafileRepoID); bool checkReturned = sf.DecryptLibrary(txtSeafileLibraryPassword.Text); if (checkReturned) { MessageBox.Show(Resources.UploadersConfigForm_TestFTPAccount_Connected_, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show(Resources.UploadersConfigForm_Error, "ShareX", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void nudSeafileExpireDays_ValueChanged(object sender, EventArgs e) { Config.SeafileShareDaysToExpire = (int)nudSeafileExpireDays.Value; } private void txtSeafileSharePassword_TextChanged(object sender, EventArgs e) { Config.SeafileSharePassword = txtSeafileSharePassword.Text; } #endregion Seafile #region Streamable private void txtStreamableUsername_TextChanged(object sender, EventArgs e) { Config.StreamableUsername = txtStreamableUsername.Text; } private void txtStreamablePassword_TextChanged(object sender, EventArgs e) { Config.StreamablePassword = txtStreamablePassword.Text; } private void cbStreamableUseDirectURL_CheckedChanged(object sender, EventArgs e) { Config.StreamableUseDirectURL = cbStreamableUseDirectURL.Checked; } #endregion Streamable #region Sul private void txtSulAPIKey_TextChanged(object sender, EventArgs e) { Config.SulAPIKey = txtSulAPIKey.Text; } private void btnSulGetAPIKey_Click(object sender, EventArgs e) { URLHelpers.OpenURL("https://s-ul.eu/account/info"); } #endregion Sul #region LobFile private void txtLithiioApiKey_TextChanged(object sender, EventArgs e) { Config.LithiioSettings.UserAPIKey = txtLithiioApiKey.Text; } private void btnLithiioLogin_Click(object sender, EventArgs e) { try { Cursor = Cursors.WaitCursor; LobFile lobFile = new LobFile(); string apiKey = lobFile.FetchAPIKey(txtLithiioEmail.Text, txtLithiioPassword.Text); txtLithiioApiKey.Text = apiKey ?? ""; } catch (Exception ex) { ex.ShowError(false); } finally { Cursor = Cursors.Default; } } private void btnLithiioGetAPIKey_Click(object sender, EventArgs e) { URLHelpers.OpenURL("https://lobfile.com/my-account"); } #endregion #region Azure Storage private void txtAzureStorageAccountName_TextChanged(object sender, EventArgs e) { Config.AzureStorageAccountName = txtAzureStorageAccountName.Text; UpdateAzureStorageStatus(); } private void btnAzureStoragePortal_Click(object sender, EventArgs e) { URLHelpers.OpenURL("https://portal.azure.com/?feature.customportal=false#blade/HubsExtension/Resources/resourceType/Microsoft.Storage%2FStorageAccounts"); } private void txtAzureStorageAccessKey_TextChanged(object sender, EventArgs e) { Config.AzureStorageAccountAccessKey = txtAzureStorageAccessKey.Text; } private void txtAzureStorageContainer_TextChanged(object sender, EventArgs e) { Config.AzureStorageContainer = txtAzureStorageContainer.Text; UpdateAzureStorageStatus(); } private void cbAzureStorageEnvironment_SelectedIndexChanged(object sender, EventArgs e) { Config.AzureStorageEnvironment = cbAzureStorageEnvironment.Text; UpdateAzureStorageStatus(); } private void txtAzureStorageUploadPath_TextChanged(object sender, EventArgs e) { Config.AzureStorageUploadPath = txtAzureStorageUploadPath.Text; UpdateAzureStorageStatus(); } private void txtAzureStorageCustomDomain_TextChanged(object sender, EventArgs e) { Config.AzureStorageCustomDomain = txtAzureStorageCustomDomain.Text; UpdateAzureStorageStatus(); } private void txtAzureStorageCacheControl_TextChanged(object sender, EventArgs e) { Config.AzureStorageCacheControl = txtAzureStorageCacheControl.Text; UpdateAzureStorageStatus(); } #endregion Azure Storage #region Backblaze B2 private void txtB2ApplicationKeyId_TextChanged(object sender, EventArgs e) { Config.B2ApplicationKeyId = txtB2ApplicationKeyId.Text.Trim(); } private void txtB2ApplicationKey_TextChanged(object sender, EventArgs e) { Config.B2ApplicationKey = txtB2ApplicationKey.Text.Trim(); } private void cbB2CustomUrl_CheckedChanged(object sender, EventArgs e) { txtB2CustomUrl.ReadOnly = !cbB2CustomUrl.Checked; txtB2CustomUrl.Enabled = cbB2CustomUrl.Checked; Config.B2UseCustomUrl = cbB2CustomUrl.Checked; B2UpdateCustomDomainPreview(); } private void txtB2CustomUrl_TextChanged(object sender, EventArgs e) { Config.B2CustomUrl = txtB2CustomUrl.Text.Trim(); B2UpdateCustomDomainPreview(); } private void lblB2ManageLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { URLHelpers.OpenURL("https://secure.backblaze.com/b2_buckets.htm"); } private void txtB2UploadPath_TextChanged(object sender, EventArgs e) { Config.B2UploadPath = txtB2UploadPath.Text.Trim(); B2UpdateCustomDomainPreview(); } private void txtB2Bucket_TextChanged(object sender, EventArgs e) { Config.B2BucketName = txtB2Bucket.Text.Trim(); B2UpdateCustomDomainPreview(); } #endregion Backblaze B2 #region Plik private void txtPlikURL_TextChanged(object sender, EventArgs e) { Config.PlikSettings.URL = txtPlikURL.Text; } private void txtPlikAPIKey_TextChanged(object sender, EventArgs e) { Config.PlikSettings.APIKey = txtPlikAPIKey.Text; } private void txtPlikLogin_TextChanged(object sender, EventArgs e) { Config.PlikSettings.Login = txtPlikLogin.Text; } private void txtPlikPassword_TextChanged(object sender, EventArgs e) { Config.PlikSettings.Password = txtPlikPassword.Text; } private void cbPlikIsSecured_CheckedChanged(object sender, EventArgs e) { Config.PlikSettings.IsSecured = cbPlikIsSecured.Checked; txtPlikLogin.ReadOnly = !cbPlikIsSecured.Checked; txtPlikPassword.ReadOnly = !cbPlikIsSecured.Checked; } private void cbPlikRemovable_CheckedChanged(object sender, EventArgs e) { Config.PlikSettings.Removable = cbPlikRemovable.Checked; } private void cbPlikComment_CheckedChanged(object sender, EventArgs e) { Config.PlikSettings.HasComment = cbPlikComment.Checked; txtPlikComment.ReadOnly = !cbPlikComment.Checked; } private void txtPlikComment_TextChanged(object sender, EventArgs e) { Config.PlikSettings.Comment = txtPlikComment.Text; } private void cbPlikOneShot_CheckedChanged(object sender, EventArgs e) { Config.PlikSettings.OneShot = cbPlikOneShot.Checked; } private void cbPlikTTLUnit_SelectedIndexChanged(object sender, EventArgs e) { Plik.CalculateTTLValue(nudPlikTTL, cbPlikTTLUnit.SelectedIndex, Config.PlikSettings.TTLUnit); Config.PlikSettings.TTLUnit = cbPlikTTLUnit.SelectedIndex; } private void nudPlikTTL_ValueChanged(object sender, EventArgs e) { Config.PlikSettings.TTL = nudPlikTTL.Value; } #endregion Plik #region YouTube private void oauth2YouTube_ConnectButtonClicked() { OAuth2Info oauth = new OAuth2Info(APIKeys.GoogleClientID, APIKeys.GoogleClientSecret); IOAuth2Loopback oauthLoopback = new YouTube(oauth).OAuth2; using (OAuthListenerForm form = new OAuthListenerForm(oauthLoopback)) { form.ShowDialog(); Config.YouTubeOAuth2Info = form.OAuth2Info; Config.YouTubeUserInfo = form.UserInfo; } oauth2YouTube.UpdateStatus(Config.YouTubeOAuth2Info, Config.YouTubeUserInfo); this.ForceActivate(); } private void oauth2YouTube_DisconnectButtonClicked() { Config.YouTubeOAuth2Info = null; Config.YouTubeUserInfo = null; } private void llYouTubePermissionsLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { URLHelpers.OpenURL("https://myaccount.google.com/permissions"); } private void cbYouTubePrivacyType_SelectedIndexChanged(object sender, EventArgs e) { Config.YouTubePrivacyType = (YouTubeVideoPrivacy)cbYouTubePrivacyType.SelectedIndex; } private void cbYouTubeUseShortenedLink_CheckedChanged(object sender, EventArgs e) { Config.YouTubeUseShortenedLink = cbYouTubeUseShortenedLink.Checked; } private void cbYouTubeShowDialog_CheckedChanged(object sender, EventArgs e) { Config.YouTubeShowDialog = cbYouTubeShowDialog.Checked; } #endregion YouTube #region Google Cloud Storage private void oauth2GoogleCloudStorage_ConnectButtonClicked() { OAuth2Info oauth = new OAuth2Info(APIKeys.GoogleClientID, APIKeys.GoogleClientSecret); IOAuth2Loopback oauthLoopback = new GoogleCloudStorage(oauth).OAuth2; using (OAuthListenerForm form = new OAuthListenerForm(oauthLoopback)) { form.ShowDialog(); Config.GoogleCloudStorageOAuth2Info = form.OAuth2Info; Config.GoogleCloudStorageUserInfo = form.UserInfo; } oauth2GoogleCloudStorage.UpdateStatus(Config.GoogleCloudStorageOAuth2Info, Config.GoogleCloudStorageUserInfo); this.ForceActivate(); } private void oauth2GoogleCloudStorage_DisconnectButtonClicked() { Config.GoogleCloudStorageOAuth2Info = null; Config.GoogleCloudStorageUserInfo = null; } private void txtGoogleCloudStorageBucket_TextChanged(object sender, EventArgs e) { Config.GoogleCloudStorageBucket = txtGoogleCloudStorageBucket.Text; UpdateGoogleCloudStorageStatus(); } private void txtGoogleCloudStorageDomain_TextChanged(object sender, EventArgs e) { Config.GoogleCloudStorageDomain = txtGoogleCloudStorageDomain.Text; UpdateGoogleCloudStorageStatus(); } private void txtGoogleCloudStorageObjectPrefix_TextChanged(object sender, EventArgs e) { Config.GoogleCloudStorageObjectPrefix = txtGoogleCloudStorageObjectPrefix.Text; UpdateGoogleCloudStorageStatus(); } private void cbGoogleCloudStorageStripExtensionImage_CheckedChanged(object sender, EventArgs e) { Config.GoogleCloudStorageRemoveExtensionImage = cbGoogleCloudStorageStripExtensionImage.Checked; UpdateGoogleCloudStorageStatus(); } private void cbGoogleCloudStorageStripExtensionVideo_CheckedChanged(object sender, EventArgs e) { Config.GoogleCloudStorageRemoveExtensionVideo = cbGoogleCloudStorageStripExtensionVideo.Checked; UpdateGoogleCloudStorageStatus(); } private void cbGoogleCloudStorageStripExtensionText_CheckedChanged(object sender, EventArgs e) { Config.GoogleCloudStorageRemoveExtensionText = cbGoogleCloudStorageStripExtensionText.Checked; UpdateGoogleCloudStorageStatus(); } private void cbGoogleCloudStorageSetPublicACL_CheckedChanged(object sender, EventArgs e) { Config.GoogleCloudStorageSetPublicACL = cbGoogleCloudStorageSetPublicACL.Checked; UpdateGoogleCloudStorageStatus(); } #endregion Google Cloud Storage #endregion File uploaders #region URL shorteners #region bit.ly private void oauth2Bitly_OpenButtonClicked() { OAuth2Info oauth = new OAuth2Info(APIKeys.BitlyClientID, APIKeys.BitlyClientSecret); Config.BitlyOAuth2Info = OAuth2Open(new BitlyURLShortener(oauth)); } private void oauth2Bitly_CompleteButtonClicked(string code) { OAuth2Complete(new BitlyURLShortener(Config.BitlyOAuth2Info), code, oauth2Bitly); } private void oauth2Bitly_ClearButtonClicked() { Config.BitlyOAuth2Info = null; } private void txtBitlyDomain_TextChanged(object sender, EventArgs e) { Config.BitlyDomain = txtBitlyDomain.Text; } #endregion bit.ly #region yourls.org private void txtYourlsAPIURL_TextChanged(object sender, EventArgs e) { Config.YourlsAPIURL = txtYourlsAPIURL.Text; } private void txtYourlsSignature_TextChanged(object sender, EventArgs e) { Config.YourlsSignature = txtYourlsSignature.Text.Trim(); txtYourlsUsername.Enabled = txtYourlsPassword.Enabled = string.IsNullOrEmpty(Config.YourlsSignature); } private void txtYourlsUsername_TextChanged(object sender, EventArgs e) { Config.YourlsUsername = txtYourlsUsername.Text; } private void txtYourlsPassword_TextChanged(object sender, EventArgs e) { Config.YourlsPassword = txtYourlsPassword.Text; } #endregion yourls.org #region adf.ly private void txtAdflyAPIKEY_TextChanged(object sender, EventArgs e) { Config.AdFlyAPIKEY = txtAdflyAPIKEY.Text; } private void txtAdflyAPIUID_TextChanged(object sender, EventArgs e) { Config.AdFlyAPIUID = txtAdflyAPIUID.Text; } private void llAdflyLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { URLHelpers.OpenURL("https://adf.ly/publisher/tools#tools-api"); } #endregion adf.ly #region Polr private void txtPolrAPIHostname_TextChanged(object sender, EventArgs e) { Config.PolrAPIHostname = txtPolrAPIHostname.Text; } private void txtPolrAPIKey_TextChanged(object sender, EventArgs e) { Config.PolrAPIKey = txtPolrAPIKey.Text; } private void cbPolrIsSecret_CheckedChanged(object sender, EventArgs e) { Config.PolrIsSecret = cbPolrIsSecret.Checked; } private void cbPolrUseAPIv1_CheckedChanged(object sender, EventArgs e) { Config.PolrUseAPIv1 = cbPolrUseAPIv1.Checked; } #endregion Polr #region Firebase Dynamic Links private void txtFirebaseWebAPIKey_TextChanged(object sender, EventArgs e) { Config.FirebaseWebAPIKey = txtFirebaseWebAPIKey.Text; } private void txtFirebaseDomain_TextChanged(object sender, EventArgs e) { Config.FirebaseDynamicLinkDomain = txtFirebaseDomain.Text; } private void cbFirebaseIsShort_CheckedChanged(object sender, EventArgs e) { Config.FirebaseIsShort = cbFirebaseIsShort.Checked; } #endregion Firebase Dynamic Links #region Kutt private void txtKuttHost_TextChanged(object sender, EventArgs e) { Config.KuttSettings.Host = txtKuttHost.Text; } private void txtKuttAPIKey_TextChanged(object sender, EventArgs e) { Config.KuttSettings.APIKey = txtKuttAPIKey.Text; } private void txtKuttPassword_TextChanged(object sender, EventArgs e) { Config.KuttSettings.Password = txtKuttPassword.Text; } private void txtKuttDomain_TextChanged(object sender, EventArgs e) { Config.KuttSettings.Domain = txtKuttDomain.Text; } private void cbKuttReuse_CheckedChanged(object sender, EventArgs e) { Config.KuttSettings.Reuse = cbKuttReuse.Checked; } #endregion Kutt #region Zero Width Shortener private void txtZWSURL_TextChanged(object sender, EventArgs e) { Config.ZeroWidthShortenerURL = txtZWSURL.Text; } private void txtZWSToken_TextChanged(object sender, EventArgs e) { Config.ZeroWidthShortenerToken = txtZWSToken.Text; } #endregion #endregion URL shorteners #region Other uploaders #region Twitter private void btnTwitterAdd_Click(object sender, EventArgs e) { OAuthInfo oauth = new OAuthInfo(); Config.TwitterOAuthInfoList.Add(oauth); lbTwitterAccounts.Items.Add(oauth.Description); lbTwitterAccounts.SelectedIndex = lbTwitterAccounts.Items.Count - 1; TwitterUpdateSelected(); } private void btnTwitterRemove_Click(object sender, EventArgs e) { int selected = lbTwitterAccounts.SelectedIndex; if (selected > -1) { lbTwitterAccounts.Items.RemoveAt(selected); Config.TwitterOAuthInfoList.RemoveAt(selected); if (lbTwitterAccounts.Items.Count > 0) { lbTwitterAccounts.SelectedIndex = selected >= lbTwitterAccounts.Items.Count ? lbTwitterAccounts.Items.Count - 1 : selected; } } TwitterUpdateSelected(); } private void lbTwitterAccounts_SelectedIndexChanged(object sender, EventArgs e) { TwitterUpdateSelected(); } private void btnTwitterNameUpdate_Click(object sender, EventArgs e) { OAuthInfo oauth = GetSelectedTwitterAccount(); if (oauth != null) { oauth.Description = txtTwitterDescription.Text; lbTwitterAccounts.Items[lbTwitterAccounts.SelectedIndex] = oauth.Description; } } private void oauthTwitter_OpenButtonClicked() { TwitterAuthOpen(); } private void oauthTwitter_CompleteButtonClicked(string code) { TwitterAuthComplete(code); } private void oauthTwitter_ClearButtonClicked() { TwitterAuthClear(); } private void cbTwitterSkipMessageBox_CheckedChanged(object sender, EventArgs e) { Config.TwitterSkipMessageBox = cbTwitterSkipMessageBox.Checked; } private void txtTwitterDefaultMessage_TextChanged(object sender, EventArgs e) { Config.TwitterDefaultMessage = txtTwitterDefaultMessage.Text; } #endregion Twitter #endregion Other uploaders } }