diff --git a/ShareX/UploadTask.cs b/ShareX/UploadTask.cs index 0014fbf70..9d2ae8b15 100644 --- a/ShareX/UploadTask.cs +++ b/ShareX/UploadTask.cs @@ -840,6 +840,9 @@ public UploadResult UploadFile(Stream stream, string fileName) case FileDestination.Mega: fileUploader = new Mega(Program.UploadersConfig.MegaAuthInfos, Program.UploadersConfig.MegaParentNodeId); break; + case FileDestination.AmazonS3: + fileUploader = new AmazonS3(Program.UploadersConfig.AmazonS3Settings); + break; } if (fileUploader != null) diff --git a/UploadersLib/Enums.cs b/UploadersLib/Enums.cs index 33adc3365..dc451e820 100644 --- a/UploadersLib/Enums.cs +++ b/UploadersLib/Enums.cs @@ -84,6 +84,8 @@ public enum TextDestination [Description("File uploaders"), DefaultValue(FileDestination.Dropbox)] public enum FileDestination { + [Description("Amazon S3")] + AmazonS3, [Description("dropbox.com")] Dropbox, [Description("FTP Server")] diff --git a/UploadersLib/Favicons/AmazonS3.ico b/UploadersLib/Favicons/AmazonS3.ico new file mode 100644 index 000000000..6d3301888 Binary files /dev/null and b/UploadersLib/Favicons/AmazonS3.ico differ diff --git a/UploadersLib/FileUploaders/AmazonS3.cs b/UploadersLib/FileUploaders/AmazonS3.cs new file mode 100644 index 000000000..b1d574878 --- /dev/null +++ b/UploadersLib/FileUploaders/AmazonS3.cs @@ -0,0 +1,159 @@ +#region License Information (GPL v3) + +/* + ShareX - A program that allows you to take screenshots and share any file type + Copyright (C) 2008-2014 ShareX Developers + + 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 HelpersLib; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; +using System.Text; +using System; +using System.Text.RegularExpressions; +using UploadersLib.HelperClasses; +using System.Security.Cryptography; +using System.Linq; + +namespace UploadersLib.FileUploaders +{ + public sealed class AmazonS3 : FileUploader + { + const string FILE_INPUT_NAME = "file"; + + public AmazonS3Settings AccessKeys { get; set; } + + public AmazonS3(AmazonS3Settings accessKeys) + { + AccessKeys = accessKeys; + } + + private string GetObjectStorageClass() + { + return AccessKeys.UseReducedRedundancyStorage ? "REDUCED_REDUNDANCY" : "STANDARD"; + } + + private string GetObjectKey(string fileName) + { + var parser = new NameParser(NameParserType.FileName); + return string.Format("{0}{1}", parser.Parse(AccessKeys.ObjectPrefix), fileName); + } + + private string GetPolicyDocument(string fileName) + { + var mimeType = Helpers.GetMimeType(fileName); + var objectKey = GetObjectKey(fileName); + var objectStorageClass = GetObjectStorageClass(); + + var policyDocument = string.Format(@"{{ + 'expiration': '2015-12-01T12:00:00.000Z', + 'conditions': [ + {{'acl': 'public-read' }}, + {{'bucket': '{0}' }}, + {{'Content-Type': '{1}'}}, + {{'key': '{2}'}}, + {{'x-amz-storage-class': '{3}'}}, + ] + }}", AccessKeys.Bucket, mimeType, objectKey, objectStorageClass); + + return Regex.Replace(policyDocument, @"\s", ""); + } + + private string GetEndpoint() + { + return string.Format("{0}{1}", AccessKeys.Endpoint, AccessKeys.Bucket); + } + + // http://codeonaboat.wordpress.com/2011/04/22/uploading-a-file-to-amazon-s3-using-an-asp-net-mvc-application-directly-from-the-users-browser/ + private string CreateSignature(string secretKey, byte[] policyBytes) + { + var encoding = new ASCIIEncoding(); + var base64Policy = Convert.ToBase64String(policyBytes); + var secretKeyBytes = encoding.GetBytes(secretKey); + var hmacsha1 = new HMACSHA1(secretKeyBytes); + var base64PolicyBytes = encoding.GetBytes(base64Policy); + var signatureBytes = hmacsha1.ComputeHash(base64PolicyBytes); + return Convert.ToBase64String(signatureBytes); + } + + private Dictionary GetParameters(string fileName, string objectKey) + { + var policyDocument = GetPolicyDocument(fileName); + var policyBytes = Encoding.ASCII.GetBytes(policyDocument); + var signature = CreateSignature(AccessKeys.SecretAccessKey, policyBytes); + + var parameters = new Dictionary(); + parameters.Add("key", objectKey); + parameters.Add("acl", "public-read"); + parameters.Add("content-type", Helpers.GetMimeType(fileName)); + parameters.Add("AWSAccessKeyId", AccessKeys.AccessKeyID); + parameters.Add("policy", Convert.ToBase64String(policyBytes)); + parameters.Add("signature", signature); + parameters.Add("x-amz-storage-class", GetObjectStorageClass()); + return parameters; + } + + public override UploadResult Upload(Stream stream, string fileName) + { + if (string.IsNullOrEmpty(AccessKeys.AccessKeyID)) throw new Exception("'Access Key' must not be empty."); + if (string.IsNullOrEmpty(AccessKeys.SecretAccessKey)) throw new Exception("'Secret Access Key' must not be empty."); + if (string.IsNullOrEmpty(AccessKeys.Endpoint)) throw new Exception("'Endpoint' must not be emoty."); + if (string.IsNullOrEmpty(AccessKeys.Bucket)) throw new Exception("'Bucket' must not be empty."); + + var objectKey = GetObjectKey(fileName); + + var uploadResult = UploadData(stream, GetEndpoint(), fileName, FILE_INPUT_NAME, GetParameters(fileName, objectKey), null, null, ResponseType.Headers); + + if (uploadResult.IsSuccess) + { + if (AccessKeys.UseCustomCNAME) + { + uploadResult.URL = string.Format("http://{0}/{1}", AccessKeys.Bucket, objectKey); + } + else + { + uploadResult.URL = string.Format("{0}/{1}", GetEndpoint(), objectKey); + } + } + + return uploadResult; + } + } + + public class AmazonS3Settings + { + public string AccessKeyID { get; set; } + public string SecretAccessKey { get; set; } + public bool UseReducedRedundancyStorage { get; set; } + public bool UseCustomCNAME { get; set; } + public string ObjectPrefix { get; set; } + public string Bucket { get; set; } + public string Endpoint { get; set; } + } + + public class AmazonS3Region + { + public string Name { get; set; } + public string Endpoint { get; set; } + } +} \ No newline at end of file diff --git a/UploadersLib/GUI/UploadersConfigForm.Designer.cs b/UploadersLib/GUI/UploadersConfigForm.Designer.cs index f7cae3265..806872570 100644 --- a/UploadersLib/GUI/UploadersConfigForm.Designer.cs +++ b/UploadersLib/GUI/UploadersConfigForm.Designer.cs @@ -34,6 +34,7 @@ private void InitializeComponent() this.tpImageUploaders = new System.Windows.Forms.TabPage(); this.tcImageUploaders = new System.Windows.Forms.TabControl(); this.tpImgur = new System.Windows.Forms.TabPage(); + this.oauth2Imgur = new UploadersLib.GUI.OAuth2Control(); this.txtImgurAlbumID = new System.Windows.Forms.TextBox(); this.lblImgurAlbumID = new System.Windows.Forms.Label(); this.lvImgurAlbumList = new System.Windows.Forms.ListView(); @@ -43,7 +44,9 @@ private void InitializeComponent() this.btnImgurRefreshAlbumList = new System.Windows.Forms.Button(); this.cbImgurThumbnailType = new System.Windows.Forms.ComboBox(); this.lblImgurThumbnailType = new System.Windows.Forms.Label(); + this.atcImgurAccountType = new UploadersLib.GUI.AccountTypeControl(); this.tpImageShack = new System.Windows.Forms.TabPage(); + this.atcImageShackAccountType = new UploadersLib.GUI.AccountTypeControl(); this.btnImageShackLogin = new System.Windows.Forms.Button(); this.btnImageShackOpenPublicProfile = new System.Windows.Forms.Button(); this.cbImageShackIsPublic = new System.Windows.Forms.CheckBox(); @@ -53,6 +56,7 @@ private void InitializeComponent() this.txtImageShackPassword = new System.Windows.Forms.TextBox(); this.lblImageShackPassword = new System.Windows.Forms.Label(); this.tpTinyPic = new System.Windows.Forms.TabPage(); + this.atcTinyPicAccountType = new UploadersLib.GUI.AccountTypeControl(); this.btnTinyPicLogin = new System.Windows.Forms.Button(); this.txtTinyPicPassword = new System.Windows.Forms.TextBox(); this.lblTinyPicPassword = new System.Windows.Forms.Label(); @@ -105,6 +109,7 @@ private void InitializeComponent() this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.btnPicasaRefreshAlbumList = new System.Windows.Forms.Button(); + this.oauth2Picasa = new UploadersLib.GUI.OAuth2Control(); this.tpTextUploaders = new System.Windows.Forms.TabPage(); this.tcTextUploaders = new System.Windows.Forms.TabControl(); this.tpPastebin = new System.Windows.Forms.TabPage(); @@ -115,6 +120,8 @@ private void InitializeComponent() this.txtPaste_eeUserAPIKey = new System.Windows.Forms.TextBox(); this.tpGist = new System.Windows.Forms.TabPage(); this.chkGistPublishPublic = new System.Windows.Forms.CheckBox(); + this.oAuth2Gist = new UploadersLib.GUI.OAuth2Control(); + this.atcGistAccountType = new UploadersLib.GUI.AccountTypeControl(); this.tpUpaste = new System.Windows.Forms.TabPage(); this.cbUpasteIsPublic = new System.Windows.Forms.CheckBox(); this.lblUpasteUserKey = new System.Windows.Forms.Label(); @@ -139,6 +146,7 @@ private void InitializeComponent() this.btnFtpClient = new System.Windows.Forms.Button(); this.btnFTPExport = new System.Windows.Forms.Button(); this.btnFTPImport = new System.Windows.Forms.Button(); + this.ucFTPAccounts = new UploadersLib.AccountsControl(); this.gbFtpSettings = new System.Windows.Forms.GroupBox(); this.lblFtpFiles = new System.Windows.Forms.Label(); this.lblFtpText = new System.Windows.Forms.Label(); @@ -161,6 +169,7 @@ private void InitializeComponent() this.lblMegaStatusTitle = new System.Windows.Forms.Label(); this.tpGoogleDrive = new System.Windows.Forms.TabPage(); this.cbGoogleDriveIsPublic = new System.Windows.Forms.CheckBox(); + this.oauth2GoogleDrive = new UploadersLib.GUI.OAuth2Control(); this.tpBox = new System.Windows.Forms.TabPage(); this.txtBoxFolderID = new System.Windows.Forms.TextBox(); this.lblBoxFolderID = new System.Windows.Forms.Label(); @@ -183,6 +192,7 @@ private void InitializeComponent() this.lblSendSpaceUsername = new System.Windows.Forms.Label(); this.txtSendSpacePassword = new System.Windows.Forms.TextBox(); this.txtSendSpaceUserName = new System.Windows.Forms.TextBox(); + this.atcSendSpaceAccountType = new UploadersLib.GUI.AccountTypeControl(); this.tpGe_tt = new System.Windows.Forms.TabPage(); this.lblGe_ttAccessToken = new System.Windows.Forms.Label(); this.lblGe_ttPassword = new System.Windows.Forms.Label(); @@ -203,6 +213,7 @@ private void InitializeComponent() this.txtJiraConfigHelp = new System.Windows.Forms.TextBox(); this.txtJiraHost = new System.Windows.Forms.TextBox(); this.lblJiraHost = new System.Windows.Forms.Label(); + this.oAuthJira = new UploadersLib.GUI.OAuth2Control(); this.tpMinus = new System.Windows.Forms.TabPage(); this.lblMinusURLType = new System.Windows.Forms.Label(); this.cbMinusURLType = new System.Windows.Forms.ComboBox(); @@ -237,6 +248,7 @@ private void InitializeComponent() this.txtEmailDefaultSubject = new System.Windows.Forms.TextBox(); this.tpSharedFolder = new System.Windows.Forms.TabPage(); this.tlpSharedFolders = new System.Windows.Forms.TableLayoutPanel(); + this.ucLocalhostAccounts = new UploadersLib.AccountsControl(); this.gbSharedFolder = new System.Windows.Forms.GroupBox(); this.lblSharedFolderFiles = new System.Windows.Forms.Label(); this.lblSharedFolderText = new System.Windows.Forms.Label(); @@ -244,10 +256,25 @@ private void InitializeComponent() this.cboSharedFolderFiles = new System.Windows.Forms.ComboBox(); this.cboSharedFolderText = new System.Windows.Forms.ComboBox(); this.cboSharedFolderImages = new System.Windows.Forms.ComboBox(); + this.tpAmazonS3 = new System.Windows.Forms.TabPage(); + this.cbAmazonS3Endpoint = new System.Windows.Forms.ComboBox(); + this.lblAmazonS3BucketName = new System.Windows.Forms.Label(); + this.txtAmazonS3BucketName = new System.Windows.Forms.TextBox(); + this.lblAmazonS3Endpoint = new System.Windows.Forms.Label(); + this.txtAmazonS3ObjectPrefix = new System.Windows.Forms.TextBox(); + this.lblAmazonS3ObjectPrefix = new System.Windows.Forms.Label(); + this.cbAmazonS3UseRRS = new System.Windows.Forms.CheckBox(); + this.txtAmazonS3SecretKey = new System.Windows.Forms.TextBox(); + this.lblAmazonS3SecretKey = new System.Windows.Forms.Label(); + this.lblAmazonS3AccessKey = new System.Windows.Forms.Label(); + this.txtAmazonS3AccessKey = new System.Windows.Forms.TextBox(); this.tpURLShorteners = new System.Windows.Forms.TabPage(); this.tcURLShorteners = new System.Windows.Forms.TabControl(); this.tpBitly = new System.Windows.Forms.TabPage(); + this.oauth2Bitly = new UploadersLib.GUI.OAuth2Control(); this.tpGoogleURLShortener = new System.Windows.Forms.TabPage(); + this.oauth2GoogleURLShortener = new UploadersLib.GUI.OAuth2Control(); + this.atcGoogleURLShortenerAccountType = new UploadersLib.GUI.AccountTypeControl(); this.tpYourls = new System.Windows.Forms.TabPage(); this.txtYourlsPassword = new System.Windows.Forms.TextBox(); this.txtYourlsUsername = new System.Windows.Forms.TextBox(); @@ -262,6 +289,7 @@ private void InitializeComponent() this.tcSocialNetworkingServices = new System.Windows.Forms.TabControl(); this.tpTwitter = new System.Windows.Forms.TabPage(); this.btnTwitterLogin = new System.Windows.Forms.Button(); + this.ucTwitterAccounts = new UploadersLib.AccountsControl(); this.tpCustomUploaders = new System.Windows.Forms.TabPage(); this.btnCustomUploaderHelp = new System.Windows.Forms.Button(); this.lblCustomUploaderImageUploader = new System.Windows.Forms.Label(); @@ -320,23 +348,8 @@ private void InitializeComponent() this.txtCustomUploaderArgName = new System.Windows.Forms.TextBox(); this.txtRapidSharePremiumUserName = new System.Windows.Forms.TextBox(); this.ttHelpTip = new System.Windows.Forms.ToolTip(this.components); - this.oauth2Imgur = new UploadersLib.GUI.OAuth2Control(); - this.atcImgurAccountType = new UploadersLib.GUI.AccountTypeControl(); - this.atcImageShackAccountType = new UploadersLib.GUI.AccountTypeControl(); - this.atcTinyPicAccountType = new UploadersLib.GUI.AccountTypeControl(); - this.oauth2Picasa = new UploadersLib.GUI.OAuth2Control(); - this.oAuth2Gist = new UploadersLib.GUI.OAuth2Control(); - this.atcGistAccountType = new UploadersLib.GUI.AccountTypeControl(); - this.ucFTPAccounts = new UploadersLib.AccountsControl(); - this.oauth2GoogleDrive = new UploadersLib.GUI.OAuth2Control(); - this.atcSendSpaceAccountType = new UploadersLib.GUI.AccountTypeControl(); - this.oAuthJira = new UploadersLib.GUI.OAuth2Control(); - this.ucLocalhostAccounts = new UploadersLib.AccountsControl(); - this.oauth2Bitly = new UploadersLib.GUI.OAuth2Control(); - this.oauth2GoogleURLShortener = new UploadersLib.GUI.OAuth2Control(); - this.atcGoogleURLShortenerAccountType = new UploadersLib.GUI.AccountTypeControl(); - this.ucTwitterAccounts = new UploadersLib.AccountsControl(); this.actRapidShareAccountType = new UploadersLib.GUI.AccountTypeControl(); + this.cbAmazonS3CustomCNAME = new System.Windows.Forms.CheckBox(); this.tcUploaders.SuspendLayout(); this.tpImageUploaders.SuspendLayout(); this.tcImageUploaders.SuspendLayout(); @@ -384,6 +397,7 @@ private void InitializeComponent() this.tpSharedFolder.SuspendLayout(); this.tlpSharedFolders.SuspendLayout(); this.gbSharedFolder.SuspendLayout(); + this.tpAmazonS3.SuspendLayout(); this.tpURLShorteners.SuspendLayout(); this.tcURLShorteners.SuspendLayout(); this.tpBitly.SuspendLayout(); @@ -461,6 +475,18 @@ private void InitializeComponent() this.tpImgur.Text = "Imgur"; this.tpImgur.UseVisualStyleBackColor = true; // + // oauth2Imgur + // + this.oauth2Imgur.Location = new System.Drawing.Point(16, 16); + this.oauth2Imgur.LoginStatus = false; + this.oauth2Imgur.Name = "oauth2Imgur"; + this.oauth2Imgur.Size = new System.Drawing.Size(328, 207); + this.oauth2Imgur.Status = "Status: Login required."; + this.oauth2Imgur.TabIndex = 6; + this.oauth2Imgur.OpenButtonClicked += new UploadersLib.GUI.OAuth2Control.OpenButtonClickedEventHandler(this.oauth2Imgur_OpenButtonClicked); + this.oauth2Imgur.CompleteButtonClicked += new UploadersLib.GUI.OAuth2Control.CompleteButtonClickedEventHandler(this.oauth2Imgur_CompleteButtonClicked); + this.oauth2Imgur.RefreshButtonClicked += new UploadersLib.GUI.OAuth2Control.RefreshButtonClickedEventHandler(this.oauth2Imgur_RefreshButtonClicked); + // // txtImgurAlbumID // this.txtImgurAlbumID.Location = new System.Drawing.Point(592, 28); @@ -539,6 +565,15 @@ private void InitializeComponent() this.lblImgurThumbnailType.TabIndex = 1; this.lblImgurThumbnailType.Text = "Thumbnail type:"; // + // atcImgurAccountType + // + this.atcImgurAccountType.Location = new System.Drawing.Point(8, 232); + this.atcImgurAccountType.Name = "atcImgurAccountType"; + this.atcImgurAccountType.SelectedAccountType = UploadersLib.AccountType.Anonymous; + this.atcImgurAccountType.Size = new System.Drawing.Size(272, 29); + this.atcImgurAccountType.TabIndex = 0; + this.atcImgurAccountType.AccountTypeChanged += new UploadersLib.GUI.AccountTypeControl.AccountTypeChangedEventHandler(this.atcImgurAccountType_AccountTypeChanged); + // // tpImageShack // this.tpImageShack.Controls.Add(this.atcImageShackAccountType); @@ -558,6 +593,15 @@ private void InitializeComponent() this.tpImageShack.Text = "ImageShack"; this.tpImageShack.UseVisualStyleBackColor = true; // + // atcImageShackAccountType + // + this.atcImageShackAccountType.Location = new System.Drawing.Point(8, 16); + this.atcImageShackAccountType.Name = "atcImageShackAccountType"; + this.atcImageShackAccountType.SelectedAccountType = UploadersLib.AccountType.Anonymous; + this.atcImageShackAccountType.Size = new System.Drawing.Size(272, 29); + this.atcImageShackAccountType.TabIndex = 10; + this.atcImageShackAccountType.AccountTypeChanged += new UploadersLib.GUI.AccountTypeControl.AccountTypeChangedEventHandler(this.atcImageShackAccountType_AccountTypeChanged); + // // btnImageShackLogin // this.btnImageShackLogin.Location = new System.Drawing.Point(296, 82); @@ -651,6 +695,15 @@ private void InitializeComponent() this.tpTinyPic.Text = "TinyPic"; this.tpTinyPic.UseVisualStyleBackColor = true; // + // atcTinyPicAccountType + // + this.atcTinyPicAccountType.Location = new System.Drawing.Point(8, 16); + this.atcTinyPicAccountType.Name = "atcTinyPicAccountType"; + this.atcTinyPicAccountType.SelectedAccountType = UploadersLib.AccountType.Anonymous; + this.atcTinyPicAccountType.Size = new System.Drawing.Size(272, 29); + this.atcTinyPicAccountType.TabIndex = 0; + this.atcTinyPicAccountType.AccountTypeChanged += new UploadersLib.GUI.AccountTypeControl.AccountTypeChangedEventHandler(this.atcTinyPicAccountType_AccountTypeChanged); + // // btnTinyPicLogin // this.btnTinyPicLogin.Location = new System.Drawing.Point(296, 82); @@ -1182,6 +1235,18 @@ private void InitializeComponent() this.btnPicasaRefreshAlbumList.UseVisualStyleBackColor = true; this.btnPicasaRefreshAlbumList.Click += new System.EventHandler(this.btnPicasaRefreshAlbumList_Click); // + // oauth2Picasa + // + this.oauth2Picasa.Location = new System.Drawing.Point(16, 16); + this.oauth2Picasa.LoginStatus = false; + this.oauth2Picasa.Name = "oauth2Picasa"; + this.oauth2Picasa.Size = new System.Drawing.Size(328, 207); + this.oauth2Picasa.Status = "Login required."; + this.oauth2Picasa.TabIndex = 0; + this.oauth2Picasa.OpenButtonClicked += new UploadersLib.GUI.OAuth2Control.OpenButtonClickedEventHandler(this.oauth2Picasa_OpenButtonClicked); + this.oauth2Picasa.CompleteButtonClicked += new UploadersLib.GUI.OAuth2Control.CompleteButtonClickedEventHandler(this.oauth2Picasa_CompleteButtonClicked); + this.oauth2Picasa.RefreshButtonClicked += new UploadersLib.GUI.OAuth2Control.RefreshButtonClickedEventHandler(this.oauth2Picasa_RefreshButtonClicked); + // // tpTextUploaders // this.tpTextUploaders.Controls.Add(this.tcTextUploaders); @@ -1289,6 +1354,28 @@ private void InitializeComponent() this.chkGistPublishPublic.UseVisualStyleBackColor = true; this.chkGistPublishPublic.CheckedChanged += new System.EventHandler(this.chkGistPublishPublic_CheckedChanged); // + // oAuth2Gist + // + this.oAuth2Gist.Enabled = false; + this.oAuth2Gist.IsRefreshable = false; + this.oAuth2Gist.Location = new System.Drawing.Point(16, 51); + this.oAuth2Gist.LoginStatus = false; + this.oAuth2Gist.Name = "oAuth2Gist"; + this.oAuth2Gist.Size = new System.Drawing.Size(328, 173); + this.oAuth2Gist.Status = "Status: Login required."; + this.oAuth2Gist.TabIndex = 16; + this.oAuth2Gist.OpenButtonClicked += new UploadersLib.GUI.OAuth2Control.OpenButtonClickedEventHandler(this.oAuth2Gist_OpenButtonClicked); + this.oAuth2Gist.CompleteButtonClicked += new UploadersLib.GUI.OAuth2Control.CompleteButtonClickedEventHandler(this.oAuth2Gist_CompleteButtonClicked); + // + // atcGistAccountType + // + this.atcGistAccountType.Location = new System.Drawing.Point(15, 16); + this.atcGistAccountType.Name = "atcGistAccountType"; + this.atcGistAccountType.SelectedAccountType = UploadersLib.AccountType.Anonymous; + this.atcGistAccountType.Size = new System.Drawing.Size(214, 29); + this.atcGistAccountType.TabIndex = 15; + this.atcGistAccountType.AccountTypeChanged += new UploadersLib.GUI.AccountTypeControl.AccountTypeChangedEventHandler(this.atcGistAccountType_AccountTypeChanged); + // // tpUpaste // this.tpUpaste.Controls.Add(this.cbUpasteIsPublic); @@ -1356,6 +1443,7 @@ private void InitializeComponent() this.tcFileUploaders.Controls.Add(this.tpMinus); this.tcFileUploaders.Controls.Add(this.tpEmail); this.tcFileUploaders.Controls.Add(this.tpSharedFolder); + this.tcFileUploaders.Controls.Add(this.tpAmazonS3); this.tcFileUploaders.Dock = System.Windows.Forms.DockStyle.Fill; this.tcFileUploaders.Location = new System.Drawing.Point(3, 3); this.tcFileUploaders.Name = "tcFileUploaders"; @@ -1571,6 +1659,15 @@ private void InitializeComponent() this.btnFTPImport.UseVisualStyleBackColor = true; this.btnFTPImport.Click += new System.EventHandler(this.btnFTPImport_Click); // + // ucFTPAccounts + // + this.ucFTPAccounts.Dock = System.Windows.Forms.DockStyle.Fill; + this.ucFTPAccounts.Location = new System.Drawing.Point(0, 0); + this.ucFTPAccounts.Margin = new System.Windows.Forms.Padding(4); + this.ucFTPAccounts.Name = "ucFTPAccounts"; + this.ucFTPAccounts.Size = new System.Drawing.Size(792, 345); + this.ucFTPAccounts.TabIndex = 0; + // // gbFtpSettings // this.gbFtpSettings.Controls.Add(this.lblFtpFiles); @@ -1797,6 +1894,18 @@ private void InitializeComponent() this.cbGoogleDriveIsPublic.UseVisualStyleBackColor = true; this.cbGoogleDriveIsPublic.CheckedChanged += new System.EventHandler(this.cbGoogleDriveIsPublic_CheckedChanged); // + // oauth2GoogleDrive + // + this.oauth2GoogleDrive.Location = new System.Drawing.Point(16, 16); + this.oauth2GoogleDrive.LoginStatus = false; + this.oauth2GoogleDrive.Name = "oauth2GoogleDrive"; + this.oauth2GoogleDrive.Size = new System.Drawing.Size(328, 207); + this.oauth2GoogleDrive.Status = "Status: Login required."; + this.oauth2GoogleDrive.TabIndex = 0; + this.oauth2GoogleDrive.OpenButtonClicked += new UploadersLib.GUI.OAuth2Control.OpenButtonClickedEventHandler(this.oauth2GoogleDrive_OpenButtonClicked); + this.oauth2GoogleDrive.CompleteButtonClicked += new UploadersLib.GUI.OAuth2Control.CompleteButtonClickedEventHandler(this.oauth2GoogleDrive_CompleteButtonClicked); + this.oauth2GoogleDrive.RefreshButtonClicked += new UploadersLib.GUI.OAuth2Control.RefreshButtonClickedEventHandler(this.oauth2GoogleDrive_RefreshButtonClicked); + // // tpBox // this.tpBox.Controls.Add(this.txtBoxFolderID); @@ -2018,6 +2127,15 @@ private void InitializeComponent() this.txtSendSpaceUserName.TabIndex = 3; this.txtSendSpaceUserName.TextChanged += new System.EventHandler(this.txtSendSpaceUserName_TextChanged); // + // atcSendSpaceAccountType + // + this.atcSendSpaceAccountType.Location = new System.Drawing.Point(8, 16); + this.atcSendSpaceAccountType.Name = "atcSendSpaceAccountType"; + this.atcSendSpaceAccountType.SelectedAccountType = UploadersLib.AccountType.Anonymous; + this.atcSendSpaceAccountType.Size = new System.Drawing.Size(214, 29); + this.atcSendSpaceAccountType.TabIndex = 0; + this.atcSendSpaceAccountType.AccountTypeChanged += new UploadersLib.GUI.AccountTypeControl.AccountTypeChangedEventHandler(this.atcSendSpaceAccountType_AccountTypeChanged); + // // tpGe_tt // this.tpGe_tt.Controls.Add(this.lblGe_ttAccessToken); @@ -2220,6 +2338,18 @@ private void InitializeComponent() this.lblJiraHost.TabIndex = 0; this.lblJiraHost.Text = "Jira host: "; // + // oAuthJira + // + this.oAuthJira.Location = new System.Drawing.Point(473, 13); + this.oAuthJira.LoginStatus = false; + this.oAuthJira.Name = "oAuthJira"; + this.oAuthJira.Size = new System.Drawing.Size(328, 207); + this.oAuthJira.Status = "Status: Login required."; + this.oAuthJira.TabIndex = 1; + this.oAuthJira.OpenButtonClicked += new UploadersLib.GUI.OAuth2Control.OpenButtonClickedEventHandler(this.oAuthJira_OpenButtonClicked); + this.oAuthJira.CompleteButtonClicked += new UploadersLib.GUI.OAuth2Control.CompleteButtonClickedEventHandler(this.oAuthJira_CompleteButtonClicked); + this.oAuthJira.RefreshButtonClicked += new UploadersLib.GUI.OAuth2Control.RefreshButtonClickedEventHandler(this.oAuthJira_RefreshButtonClicked); + // // tpMinus // this.tpMinus.Controls.Add(this.lblMinusURLType); @@ -2588,6 +2718,15 @@ private void InitializeComponent() this.tlpSharedFolders.Size = new System.Drawing.Size(798, 469); this.tlpSharedFolders.TabIndex = 0; // + // ucLocalhostAccounts + // + this.ucLocalhostAccounts.Dock = System.Windows.Forms.DockStyle.Fill; + this.ucLocalhostAccounts.Location = new System.Drawing.Point(4, 4); + this.ucLocalhostAccounts.Margin = new System.Windows.Forms.Padding(4); + this.ucLocalhostAccounts.Name = "ucLocalhostAccounts"; + this.ucLocalhostAccounts.Size = new System.Drawing.Size(790, 343); + this.ucLocalhostAccounts.TabIndex = 0; + // // gbSharedFolder // this.gbSharedFolder.Controls.Add(this.lblSharedFolderFiles); @@ -2661,6 +2800,140 @@ private void InitializeComponent() this.cboSharedFolderImages.TabIndex = 1; this.cboSharedFolderImages.SelectedIndexChanged += new System.EventHandler(this.cboSharedFolderImages_SelectedIndexChanged); // + // tpAmazonS3 + // + this.tpAmazonS3.Controls.Add(this.cbAmazonS3CustomCNAME); + this.tpAmazonS3.Controls.Add(this.cbAmazonS3Endpoint); + this.tpAmazonS3.Controls.Add(this.lblAmazonS3BucketName); + this.tpAmazonS3.Controls.Add(this.txtAmazonS3BucketName); + this.tpAmazonS3.Controls.Add(this.lblAmazonS3Endpoint); + this.tpAmazonS3.Controls.Add(this.txtAmazonS3ObjectPrefix); + this.tpAmazonS3.Controls.Add(this.lblAmazonS3ObjectPrefix); + this.tpAmazonS3.Controls.Add(this.cbAmazonS3UseRRS); + this.tpAmazonS3.Controls.Add(this.txtAmazonS3SecretKey); + this.tpAmazonS3.Controls.Add(this.lblAmazonS3SecretKey); + this.tpAmazonS3.Controls.Add(this.lblAmazonS3AccessKey); + this.tpAmazonS3.Controls.Add(this.txtAmazonS3AccessKey); + this.tpAmazonS3.Location = new System.Drawing.Point(4, 22); + this.tpAmazonS3.Name = "tpAmazonS3"; + this.tpAmazonS3.Padding = new System.Windows.Forms.Padding(3); + this.tpAmazonS3.Size = new System.Drawing.Size(804, 475); + this.tpAmazonS3.TabIndex = 13; + this.tpAmazonS3.Text = "Amazon S3"; + this.tpAmazonS3.UseVisualStyleBackColor = true; + // + // cbAmazonS3Endpoint + // + this.cbAmazonS3Endpoint.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cbAmazonS3Endpoint.FormattingEnabled = true; + this.cbAmazonS3Endpoint.Items.AddRange(new object[] { + "https://s3-ap-northeast-1.amazonaws.com/", + "https://s3-ap-southeast-1.amazonaws.com/", + "https://s3-ap-southeast-2.amazonaws.com/", + "https://s3-eu-west-1.amazonaws.com/", + "https://s3-sa-east-1.amazonaws.com/", + "https://s3-us-west-1.amazonaws.com/", + "https://s3-us-west-2.amazonaws.com/", + "https://s3.amazonaws.com/"}); + this.cbAmazonS3Endpoint.Location = new System.Drawing.Point(108, 78); + this.cbAmazonS3Endpoint.Name = "cbAmazonS3Endpoint"; + this.cbAmazonS3Endpoint.Size = new System.Drawing.Size(346, 21); + this.cbAmazonS3Endpoint.TabIndex = 19; + this.cbAmazonS3Endpoint.SelectionChangeCommitted += new System.EventHandler(this.cbAmazonS3Endpoint_SelectionChangeCommitted); + this.cbAmazonS3Endpoint.TextChanged += new System.EventHandler(this.cbAmazonS3Endpoint_TextChanged); + // + // lblAmazonS3BucketName + // + this.lblAmazonS3BucketName.AutoSize = true; + this.lblAmazonS3BucketName.Location = new System.Drawing.Point(21, 109); + this.lblAmazonS3BucketName.Name = "lblAmazonS3BucketName"; + this.lblAmazonS3BucketName.Size = new System.Drawing.Size(75, 13); + this.lblAmazonS3BucketName.TabIndex = 18; + this.lblAmazonS3BucketName.Text = "Bucket Name:"; + // + // txtAmazonS3BucketName + // + this.txtAmazonS3BucketName.Location = new System.Drawing.Point(108, 106); + this.txtAmazonS3BucketName.Name = "txtAmazonS3BucketName"; + this.txtAmazonS3BucketName.Size = new System.Drawing.Size(184, 20); + this.txtAmazonS3BucketName.TabIndex = 17; + this.txtAmazonS3BucketName.TextChanged += new System.EventHandler(this.txtAmazonS3BucketName_TextChanged); + // + // lblAmazonS3Endpoint + // + this.lblAmazonS3Endpoint.AutoSize = true; + this.lblAmazonS3Endpoint.Location = new System.Drawing.Point(44, 82); + this.lblAmazonS3Endpoint.Name = "lblAmazonS3Endpoint"; + this.lblAmazonS3Endpoint.Size = new System.Drawing.Size(52, 13); + this.lblAmazonS3Endpoint.TabIndex = 16; + this.lblAmazonS3Endpoint.Text = "Endpoint:"; + // + // txtAmazonS3ObjectPrefix + // + this.txtAmazonS3ObjectPrefix.Location = new System.Drawing.Point(108, 132); + this.txtAmazonS3ObjectPrefix.Name = "txtAmazonS3ObjectPrefix"; + this.txtAmazonS3ObjectPrefix.Size = new System.Drawing.Size(184, 20); + this.txtAmazonS3ObjectPrefix.TabIndex = 14; + this.ttHelpTip.SetToolTip(this.txtAmazonS3ObjectPrefix, "The name to prefix objects with when storing them. The first \"/\" isn\'t necessary." + + ""); + this.txtAmazonS3ObjectPrefix.TextChanged += new System.EventHandler(this.txtAmazonS3ObjectPrefix_TextChanged); + // + // lblAmazonS3ObjectPrefix + // + this.lblAmazonS3ObjectPrefix.AutoSize = true; + this.lblAmazonS3ObjectPrefix.Location = new System.Drawing.Point(26, 135); + this.lblAmazonS3ObjectPrefix.Name = "lblAmazonS3ObjectPrefix"; + this.lblAmazonS3ObjectPrefix.Size = new System.Drawing.Size(70, 13); + this.lblAmazonS3ObjectPrefix.TabIndex = 13; + this.lblAmazonS3ObjectPrefix.Text = "Object Prefix:"; + // + // cbAmazonS3UseRRS + // + this.cbAmazonS3UseRRS.AutoSize = true; + this.cbAmazonS3UseRRS.Location = new System.Drawing.Point(108, 158); + this.cbAmazonS3UseRRS.Name = "cbAmazonS3UseRRS"; + this.cbAmazonS3UseRRS.Size = new System.Drawing.Size(184, 17); + this.cbAmazonS3UseRRS.TabIndex = 11; + this.cbAmazonS3UseRRS.Text = "Use reduced redundancy storage"; + this.ttHelpTip.SetToolTip(this.cbAmazonS3UseRRS, resources.GetString("cbAmazonS3UseRRS.ToolTip")); + this.cbAmazonS3UseRRS.UseVisualStyleBackColor = true; + this.cbAmazonS3UseRRS.CheckedChanged += new System.EventHandler(this.cbAmazonS3UseRRS_CheckedChanged); + // + // txtAmazonS3SecretKey + // + this.txtAmazonS3SecretKey.Location = new System.Drawing.Point(108, 52); + this.txtAmazonS3SecretKey.Name = "txtAmazonS3SecretKey"; + this.txtAmazonS3SecretKey.Size = new System.Drawing.Size(346, 20); + this.txtAmazonS3SecretKey.TabIndex = 4; + this.txtAmazonS3SecretKey.UseSystemPasswordChar = true; + this.txtAmazonS3SecretKey.TextChanged += new System.EventHandler(this.txtAmazonS3SecretKey_TextChanged); + // + // lblAmazonS3SecretKey + // + this.lblAmazonS3SecretKey.AutoSize = true; + this.lblAmazonS3SecretKey.Location = new System.Drawing.Point(34, 55); + this.lblAmazonS3SecretKey.Name = "lblAmazonS3SecretKey"; + this.lblAmazonS3SecretKey.Size = new System.Drawing.Size(62, 13); + this.lblAmazonS3SecretKey.TabIndex = 3; + this.lblAmazonS3SecretKey.Text = "Secret Key:"; + // + // lblAmazonS3AccessKey + // + this.lblAmazonS3AccessKey.AutoSize = true; + this.lblAmazonS3AccessKey.Location = new System.Drawing.Point(30, 26); + this.lblAmazonS3AccessKey.Name = "lblAmazonS3AccessKey"; + this.lblAmazonS3AccessKey.Size = new System.Drawing.Size(66, 13); + this.lblAmazonS3AccessKey.TabIndex = 1; + this.lblAmazonS3AccessKey.Text = "Access Key:"; + // + // txtAmazonS3AccessKey + // + this.txtAmazonS3AccessKey.Location = new System.Drawing.Point(108, 23); + this.txtAmazonS3AccessKey.Name = "txtAmazonS3AccessKey"; + this.txtAmazonS3AccessKey.Size = new System.Drawing.Size(346, 20); + this.txtAmazonS3AccessKey.TabIndex = 2; + this.txtAmazonS3AccessKey.TextChanged += new System.EventHandler(this.txtAmazonS3AccessKey_TextChanged); + // // tpURLShorteners // this.tpURLShorteners.Controls.Add(this.tcURLShorteners); @@ -2695,6 +2968,18 @@ private void InitializeComponent() this.tpBitly.Text = "bit.ly"; this.tpBitly.UseVisualStyleBackColor = true; // + // oauth2Bitly + // + this.oauth2Bitly.IsRefreshable = false; + this.oauth2Bitly.Location = new System.Drawing.Point(16, 16); + this.oauth2Bitly.LoginStatus = false; + this.oauth2Bitly.Name = "oauth2Bitly"; + this.oauth2Bitly.Size = new System.Drawing.Size(328, 168); + this.oauth2Bitly.Status = "Login required."; + this.oauth2Bitly.TabIndex = 0; + this.oauth2Bitly.OpenButtonClicked += new UploadersLib.GUI.OAuth2Control.OpenButtonClickedEventHandler(this.oauth2Bitly_OpenButtonClicked); + this.oauth2Bitly.CompleteButtonClicked += new UploadersLib.GUI.OAuth2Control.CompleteButtonClickedEventHandler(this.oauth2Bitly_CompleteButtonClicked); + // // tpGoogleURLShortener // this.tpGoogleURLShortener.Controls.Add(this.oauth2GoogleURLShortener); @@ -2707,6 +2992,27 @@ private void InitializeComponent() this.tpGoogleURLShortener.Text = "Google"; this.tpGoogleURLShortener.UseVisualStyleBackColor = true; // + // oauth2GoogleURLShortener + // + this.oauth2GoogleURLShortener.Location = new System.Drawing.Point(16, 56); + this.oauth2GoogleURLShortener.LoginStatus = false; + this.oauth2GoogleURLShortener.Name = "oauth2GoogleURLShortener"; + this.oauth2GoogleURLShortener.Size = new System.Drawing.Size(328, 207); + this.oauth2GoogleURLShortener.Status = "Status: Login required."; + this.oauth2GoogleURLShortener.TabIndex = 1; + this.oauth2GoogleURLShortener.OpenButtonClicked += new UploadersLib.GUI.OAuth2Control.OpenButtonClickedEventHandler(this.oauth2GoogleURLShortener_OpenButtonClicked); + this.oauth2GoogleURLShortener.CompleteButtonClicked += new UploadersLib.GUI.OAuth2Control.CompleteButtonClickedEventHandler(this.oauth2GoogleURLShortener_CompleteButtonClicked); + this.oauth2GoogleURLShortener.RefreshButtonClicked += new UploadersLib.GUI.OAuth2Control.RefreshButtonClickedEventHandler(this.oauth2GoogleURLShortener_RefreshButtonClicked); + // + // atcGoogleURLShortenerAccountType + // + this.atcGoogleURLShortenerAccountType.Location = new System.Drawing.Point(8, 16); + this.atcGoogleURLShortenerAccountType.Name = "atcGoogleURLShortenerAccountType"; + this.atcGoogleURLShortenerAccountType.SelectedAccountType = UploadersLib.AccountType.Anonymous; + this.atcGoogleURLShortenerAccountType.Size = new System.Drawing.Size(214, 29); + this.atcGoogleURLShortenerAccountType.TabIndex = 0; + this.atcGoogleURLShortenerAccountType.AccountTypeChanged += new UploadersLib.GUI.AccountTypeControl.AccountTypeChangedEventHandler(this.atcGoogleURLShortenerAccountType_AccountTypeChanged); + // // tpYourls // this.tpYourls.Controls.Add(this.txtYourlsPassword); @@ -2847,6 +3153,14 @@ private void InitializeComponent() this.btnTwitterLogin.UseVisualStyleBackColor = true; this.btnTwitterLogin.Click += new System.EventHandler(this.btnTwitterLogin_Click); // + // ucTwitterAccounts + // + this.ucTwitterAccounts.Dock = System.Windows.Forms.DockStyle.Fill; + this.ucTwitterAccounts.Location = new System.Drawing.Point(3, 3); + this.ucTwitterAccounts.Name = "ucTwitterAccounts"; + this.ucTwitterAccounts.Size = new System.Drawing.Size(798, 469); + this.ucTwitterAccounts.TabIndex = 0; + // // tpCustomUploaders // this.tpCustomUploaders.Controls.Add(this.btnCustomUploaderHelp); @@ -3438,171 +3752,6 @@ private void InitializeComponent() this.ttHelpTip.UseAnimation = false; this.ttHelpTip.UseFading = false; // - // oauth2Imgur - // - this.oauth2Imgur.Location = new System.Drawing.Point(16, 16); - this.oauth2Imgur.LoginStatus = false; - this.oauth2Imgur.Name = "oauth2Imgur"; - this.oauth2Imgur.Size = new System.Drawing.Size(328, 207); - this.oauth2Imgur.Status = "Status: Login required."; - this.oauth2Imgur.TabIndex = 6; - this.oauth2Imgur.OpenButtonClicked += new UploadersLib.GUI.OAuth2Control.OpenButtonClickedEventHandler(this.oauth2Imgur_OpenButtonClicked); - this.oauth2Imgur.CompleteButtonClicked += new UploadersLib.GUI.OAuth2Control.CompleteButtonClickedEventHandler(this.oauth2Imgur_CompleteButtonClicked); - this.oauth2Imgur.RefreshButtonClicked += new UploadersLib.GUI.OAuth2Control.RefreshButtonClickedEventHandler(this.oauth2Imgur_RefreshButtonClicked); - // - // atcImgurAccountType - // - this.atcImgurAccountType.Location = new System.Drawing.Point(8, 232); - this.atcImgurAccountType.Name = "atcImgurAccountType"; - this.atcImgurAccountType.SelectedAccountType = UploadersLib.AccountType.Anonymous; - this.atcImgurAccountType.Size = new System.Drawing.Size(272, 29); - this.atcImgurAccountType.TabIndex = 0; - this.atcImgurAccountType.AccountTypeChanged += new UploadersLib.GUI.AccountTypeControl.AccountTypeChangedEventHandler(this.atcImgurAccountType_AccountTypeChanged); - // - // atcImageShackAccountType - // - this.atcImageShackAccountType.Location = new System.Drawing.Point(8, 16); - this.atcImageShackAccountType.Name = "atcImageShackAccountType"; - this.atcImageShackAccountType.SelectedAccountType = UploadersLib.AccountType.Anonymous; - this.atcImageShackAccountType.Size = new System.Drawing.Size(272, 29); - this.atcImageShackAccountType.TabIndex = 10; - this.atcImageShackAccountType.AccountTypeChanged += new UploadersLib.GUI.AccountTypeControl.AccountTypeChangedEventHandler(this.atcImageShackAccountType_AccountTypeChanged); - // - // atcTinyPicAccountType - // - this.atcTinyPicAccountType.Location = new System.Drawing.Point(8, 16); - this.atcTinyPicAccountType.Name = "atcTinyPicAccountType"; - this.atcTinyPicAccountType.SelectedAccountType = UploadersLib.AccountType.Anonymous; - this.atcTinyPicAccountType.Size = new System.Drawing.Size(272, 29); - this.atcTinyPicAccountType.TabIndex = 0; - this.atcTinyPicAccountType.AccountTypeChanged += new UploadersLib.GUI.AccountTypeControl.AccountTypeChangedEventHandler(this.atcTinyPicAccountType_AccountTypeChanged); - // - // oauth2Picasa - // - this.oauth2Picasa.Location = new System.Drawing.Point(16, 16); - this.oauth2Picasa.LoginStatus = false; - this.oauth2Picasa.Name = "oauth2Picasa"; - this.oauth2Picasa.Size = new System.Drawing.Size(328, 207); - this.oauth2Picasa.Status = "Login required."; - this.oauth2Picasa.TabIndex = 0; - this.oauth2Picasa.OpenButtonClicked += new UploadersLib.GUI.OAuth2Control.OpenButtonClickedEventHandler(this.oauth2Picasa_OpenButtonClicked); - this.oauth2Picasa.CompleteButtonClicked += new UploadersLib.GUI.OAuth2Control.CompleteButtonClickedEventHandler(this.oauth2Picasa_CompleteButtonClicked); - this.oauth2Picasa.RefreshButtonClicked += new UploadersLib.GUI.OAuth2Control.RefreshButtonClickedEventHandler(this.oauth2Picasa_RefreshButtonClicked); - // - // oAuth2Gist - // - this.oAuth2Gist.Enabled = false; - this.oAuth2Gist.IsRefreshable = false; - this.oAuth2Gist.Location = new System.Drawing.Point(16, 51); - this.oAuth2Gist.LoginStatus = false; - this.oAuth2Gist.Name = "oAuth2Gist"; - this.oAuth2Gist.Size = new System.Drawing.Size(328, 173); - this.oAuth2Gist.Status = "Status: Login required."; - this.oAuth2Gist.TabIndex = 16; - this.oAuth2Gist.OpenButtonClicked += new UploadersLib.GUI.OAuth2Control.OpenButtonClickedEventHandler(this.oAuth2Gist_OpenButtonClicked); - this.oAuth2Gist.CompleteButtonClicked += new UploadersLib.GUI.OAuth2Control.CompleteButtonClickedEventHandler(this.oAuth2Gist_CompleteButtonClicked); - // - // atcGistAccountType - // - this.atcGistAccountType.Location = new System.Drawing.Point(15, 16); - this.atcGistAccountType.Name = "atcGistAccountType"; - this.atcGistAccountType.SelectedAccountType = UploadersLib.AccountType.Anonymous; - this.atcGistAccountType.Size = new System.Drawing.Size(214, 29); - this.atcGistAccountType.TabIndex = 15; - this.atcGistAccountType.AccountTypeChanged += new UploadersLib.GUI.AccountTypeControl.AccountTypeChangedEventHandler(this.atcGistAccountType_AccountTypeChanged); - // - // ucFTPAccounts - // - this.ucFTPAccounts.Dock = System.Windows.Forms.DockStyle.Fill; - this.ucFTPAccounts.Location = new System.Drawing.Point(0, 0); - this.ucFTPAccounts.Margin = new System.Windows.Forms.Padding(4); - this.ucFTPAccounts.Name = "ucFTPAccounts"; - this.ucFTPAccounts.Size = new System.Drawing.Size(792, 345); - this.ucFTPAccounts.TabIndex = 0; - // - // oauth2GoogleDrive - // - this.oauth2GoogleDrive.Location = new System.Drawing.Point(16, 16); - this.oauth2GoogleDrive.LoginStatus = false; - this.oauth2GoogleDrive.Name = "oauth2GoogleDrive"; - this.oauth2GoogleDrive.Size = new System.Drawing.Size(328, 207); - this.oauth2GoogleDrive.Status = "Status: Login required."; - this.oauth2GoogleDrive.TabIndex = 0; - this.oauth2GoogleDrive.OpenButtonClicked += new UploadersLib.GUI.OAuth2Control.OpenButtonClickedEventHandler(this.oauth2GoogleDrive_OpenButtonClicked); - this.oauth2GoogleDrive.CompleteButtonClicked += new UploadersLib.GUI.OAuth2Control.CompleteButtonClickedEventHandler(this.oauth2GoogleDrive_CompleteButtonClicked); - this.oauth2GoogleDrive.RefreshButtonClicked += new UploadersLib.GUI.OAuth2Control.RefreshButtonClickedEventHandler(this.oauth2GoogleDrive_RefreshButtonClicked); - // - // atcSendSpaceAccountType - // - this.atcSendSpaceAccountType.Location = new System.Drawing.Point(8, 16); - this.atcSendSpaceAccountType.Name = "atcSendSpaceAccountType"; - this.atcSendSpaceAccountType.SelectedAccountType = UploadersLib.AccountType.Anonymous; - this.atcSendSpaceAccountType.Size = new System.Drawing.Size(214, 29); - this.atcSendSpaceAccountType.TabIndex = 0; - this.atcSendSpaceAccountType.AccountTypeChanged += new UploadersLib.GUI.AccountTypeControl.AccountTypeChangedEventHandler(this.atcSendSpaceAccountType_AccountTypeChanged); - // - // oAuthJira - // - this.oAuthJira.Location = new System.Drawing.Point(473, 13); - this.oAuthJira.LoginStatus = false; - this.oAuthJira.Name = "oAuthJira"; - this.oAuthJira.Size = new System.Drawing.Size(328, 207); - this.oAuthJira.Status = "Status: Login required."; - this.oAuthJira.TabIndex = 1; - this.oAuthJira.OpenButtonClicked += new UploadersLib.GUI.OAuth2Control.OpenButtonClickedEventHandler(this.oAuthJira_OpenButtonClicked); - this.oAuthJira.CompleteButtonClicked += new UploadersLib.GUI.OAuth2Control.CompleteButtonClickedEventHandler(this.oAuthJira_CompleteButtonClicked); - this.oAuthJira.RefreshButtonClicked += new UploadersLib.GUI.OAuth2Control.RefreshButtonClickedEventHandler(this.oAuthJira_RefreshButtonClicked); - // - // ucLocalhostAccounts - // - this.ucLocalhostAccounts.Dock = System.Windows.Forms.DockStyle.Fill; - this.ucLocalhostAccounts.Location = new System.Drawing.Point(4, 4); - this.ucLocalhostAccounts.Margin = new System.Windows.Forms.Padding(4); - this.ucLocalhostAccounts.Name = "ucLocalhostAccounts"; - this.ucLocalhostAccounts.Size = new System.Drawing.Size(790, 343); - this.ucLocalhostAccounts.TabIndex = 0; - // - // oauth2Bitly - // - this.oauth2Bitly.IsRefreshable = false; - this.oauth2Bitly.Location = new System.Drawing.Point(16, 16); - this.oauth2Bitly.LoginStatus = false; - this.oauth2Bitly.Name = "oauth2Bitly"; - this.oauth2Bitly.Size = new System.Drawing.Size(328, 168); - this.oauth2Bitly.Status = "Login required."; - this.oauth2Bitly.TabIndex = 0; - this.oauth2Bitly.OpenButtonClicked += new UploadersLib.GUI.OAuth2Control.OpenButtonClickedEventHandler(this.oauth2Bitly_OpenButtonClicked); - this.oauth2Bitly.CompleteButtonClicked += new UploadersLib.GUI.OAuth2Control.CompleteButtonClickedEventHandler(this.oauth2Bitly_CompleteButtonClicked); - // - // oauth2GoogleURLShortener - // - this.oauth2GoogleURLShortener.Location = new System.Drawing.Point(16, 56); - this.oauth2GoogleURLShortener.LoginStatus = false; - this.oauth2GoogleURLShortener.Name = "oauth2GoogleURLShortener"; - this.oauth2GoogleURLShortener.Size = new System.Drawing.Size(328, 207); - this.oauth2GoogleURLShortener.Status = "Status: Login required."; - this.oauth2GoogleURLShortener.TabIndex = 1; - this.oauth2GoogleURLShortener.OpenButtonClicked += new UploadersLib.GUI.OAuth2Control.OpenButtonClickedEventHandler(this.oauth2GoogleURLShortener_OpenButtonClicked); - this.oauth2GoogleURLShortener.CompleteButtonClicked += new UploadersLib.GUI.OAuth2Control.CompleteButtonClickedEventHandler(this.oauth2GoogleURLShortener_CompleteButtonClicked); - this.oauth2GoogleURLShortener.RefreshButtonClicked += new UploadersLib.GUI.OAuth2Control.RefreshButtonClickedEventHandler(this.oauth2GoogleURLShortener_RefreshButtonClicked); - // - // atcGoogleURLShortenerAccountType - // - this.atcGoogleURLShortenerAccountType.Location = new System.Drawing.Point(8, 16); - this.atcGoogleURLShortenerAccountType.Name = "atcGoogleURLShortenerAccountType"; - this.atcGoogleURLShortenerAccountType.SelectedAccountType = UploadersLib.AccountType.Anonymous; - this.atcGoogleURLShortenerAccountType.Size = new System.Drawing.Size(214, 29); - this.atcGoogleURLShortenerAccountType.TabIndex = 0; - this.atcGoogleURLShortenerAccountType.AccountTypeChanged += new UploadersLib.GUI.AccountTypeControl.AccountTypeChangedEventHandler(this.atcGoogleURLShortenerAccountType_AccountTypeChanged); - // - // ucTwitterAccounts - // - this.ucTwitterAccounts.Dock = System.Windows.Forms.DockStyle.Fill; - this.ucTwitterAccounts.Location = new System.Drawing.Point(3, 3); - this.ucTwitterAccounts.Name = "ucTwitterAccounts"; - this.ucTwitterAccounts.Size = new System.Drawing.Size(798, 469); - this.ucTwitterAccounts.TabIndex = 0; - // // actRapidShareAccountType // this.actRapidShareAccountType.Location = new System.Drawing.Point(8, 16); @@ -3611,6 +3760,20 @@ private void InitializeComponent() this.actRapidShareAccountType.Size = new System.Drawing.Size(214, 29); this.actRapidShareAccountType.TabIndex = 16; // + // cbAmazonS3CustomCNAME + // + this.cbAmazonS3CustomCNAME.AutoSize = true; + this.cbAmazonS3CustomCNAME.Location = new System.Drawing.Point(108, 182); + this.cbAmazonS3CustomCNAME.Name = "cbAmazonS3CustomCNAME"; + this.cbAmazonS3CustomCNAME.Size = new System.Drawing.Size(163, 17); + this.cbAmazonS3CustomCNAME.TabIndex = 20; + this.cbAmazonS3CustomCNAME.Text = "Bucket uses custom CNAME"; + this.ttHelpTip.SetToolTip(this.cbAmazonS3CustomCNAME, "Use this option if you have a bucket set up with a custom CNAME.\r\nFor example, if" + + " your bucket is called bucket.example.com, and is accessible\r\nfrom http://bucket" + + ".example.com/."); + this.cbAmazonS3CustomCNAME.UseVisualStyleBackColor = true; + this.cbAmazonS3CustomCNAME.CheckedChanged += new System.EventHandler(this.cbAmazonS3CustomCNAME_CheckedChanged); + // // UploadersConfigForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -3704,6 +3867,8 @@ private void InitializeComponent() this.tlpSharedFolders.ResumeLayout(false); this.gbSharedFolder.ResumeLayout(false); this.gbSharedFolder.PerformLayout(); + this.tpAmazonS3.ResumeLayout(false); + this.tpAmazonS3.PerformLayout(); this.tpURLShorteners.ResumeLayout(false); this.tcURLShorteners.ResumeLayout(false); this.tpBitly.ResumeLayout(false); @@ -4034,5 +4199,18 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox cbUpasteIsPublic; private System.Windows.Forms.CheckBox cbGoogleDriveIsPublic; private System.Windows.Forms.Label lblMinusAuthStatus; + private System.Windows.Forms.TabPage tpAmazonS3; + private System.Windows.Forms.TextBox txtAmazonS3AccessKey; + private System.Windows.Forms.Label lblAmazonS3SecretKey; + private System.Windows.Forms.Label lblAmazonS3AccessKey; + private System.Windows.Forms.CheckBox cbAmazonS3UseRRS; + private System.Windows.Forms.TextBox txtAmazonS3ObjectPrefix; + private System.Windows.Forms.Label lblAmazonS3ObjectPrefix; + private System.Windows.Forms.Label lblAmazonS3Endpoint; + private System.Windows.Forms.Label lblAmazonS3BucketName; + private System.Windows.Forms.TextBox txtAmazonS3BucketName; + private System.Windows.Forms.ComboBox cbAmazonS3Endpoint; + private System.Windows.Forms.TextBox txtAmazonS3SecretKey; + private System.Windows.Forms.CheckBox cbAmazonS3CustomCNAME; } } \ No newline at end of file diff --git a/UploadersLib/GUI/UploadersConfigForm.cs b/UploadersLib/GUI/UploadersConfigForm.cs index 1fca56486..3a1f2ff3f 100644 --- a/UploadersLib/GUI/UploadersConfigForm.cs +++ b/UploadersLib/GUI/UploadersConfigForm.cs @@ -884,6 +884,50 @@ private void btnMegaRefreshFolders_Click(object sender, EventArgs e) #endregion Mega + #region Amazon S3 + + private void txtAmazonS3AccessKey_TextChanged(object sender, EventArgs e) + { + Config.AmazonS3Settings.AccessKeyID = txtAmazonS3AccessKey.Text; + } + + private void txtAmazonS3SecretKey_TextChanged(object sender, EventArgs e) + { + Config.AmazonS3Settings.SecretAccessKey = txtAmazonS3SecretKey.Text; + } + + private void txtAmazonS3ObjectPrefix_TextChanged(object sender, EventArgs e) + { + Config.AmazonS3Settings.ObjectPrefix = txtAmazonS3ObjectPrefix.Text; + } + + private void cbAmazonS3Endpoint_SelectionChangeCommitted(object sender, EventArgs e) + { + Config.AmazonS3Settings.Endpoint = cbAmazonS3Endpoint.Text; + } + + private void cbAmazonS3Endpoint_TextChanged(object sender, EventArgs e) + { + Config.AmazonS3Settings.Endpoint = cbAmazonS3Endpoint.Text; + } + + private void txtAmazonS3BucketName_TextChanged(object sender, EventArgs e) + { + Config.AmazonS3Settings.Bucket = txtAmazonS3BucketName.Text; + } + + private void cbAmazonS3UseRRS_CheckedChanged(object sender, EventArgs e) + { + Config.AmazonS3Settings.UseReducedRedundancyStorage = cbAmazonS3UseRRS.Checked; + } + + private void cbAmazonS3CustomCNAME_CheckedChanged(object sender, EventArgs e) + { + Config.AmazonS3Settings.UseCustomCNAME = cbAmazonS3CustomCNAME.Checked; + } + + #endregion Amazon S3 + #endregion File Uploaders #region Text Uploaders diff --git a/UploadersLib/GUI/UploadersConfigForm.resx b/UploadersLib/GUI/UploadersConfigForm.resx index 92b411931..305a4e1a2 100644 --- a/UploadersLib/GUI/UploadersConfigForm.resx +++ b/UploadersLib/GUI/UploadersConfigForm.resx @@ -117,6 +117,17 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + 17, 17 + + + Use a lower-redundancy storage class for stored objects. +With this option, objects are cheaper to store, but have 99.99% durability, instead of 99.999999999%. +This means that they may be lost from Amazon S3 at some point. + @@ -234,7 +245,7 @@ cEDOIz9clMt26LAWUUxcLUy92z9hAUk7h0+HDimqY/4fT5V6IeBXOg8AAAAASUVORK5CYII= - - 17, 17 + + 72 \ No newline at end of file diff --git a/UploadersLib/GUI/UploadersConfigFormGUI.cs b/UploadersLib/GUI/UploadersConfigFormGUI.cs index 03c0d9b75..c5b9b4358 100644 --- a/UploadersLib/GUI/UploadersConfigFormGUI.cs +++ b/UploadersLib/GUI/UploadersConfigFormGUI.cs @@ -70,6 +70,7 @@ private void ControlSettings() fileUploadersImageList.Images.Add("Email", Resources.mail); fileUploadersImageList.Images.Add("Jira", Resources.jira); fileUploadersImageList.Images.Add("Mega", Resources.Mega); + fileUploadersImageList.Images.Add("AmazonS3", Resources.AmazonS3); tcFileUploaders.ImageList = fileUploadersImageList; ImageList textUploadersImageList = new ImageList(); @@ -121,6 +122,7 @@ private void ControlSettings() tpMega.ImageKey = "Mega"; tpGist.ImageKey = "Gist"; tpUpaste.ImageKey = "Upaste"; + tpAmazonS3.ImageKey = "AmazonS3"; cmsCustomUploaderArgValue = NameParser.CreateCodesMenu(txtCustomUploaderArgValue, ReplacementVariables.n); @@ -393,6 +395,16 @@ public void LoadSettings(UploadersConfig uploadersConfig) MegaConfigureTab(false); + // Amazon S3 + + txtAmazonS3AccessKey.Text = Config.AmazonS3Settings.AccessKeyID; + txtAmazonS3SecretKey.Text = Config.AmazonS3Settings.SecretAccessKey; + cbAmazonS3UseRRS.Checked = Config.AmazonS3Settings.UseReducedRedundancyStorage; + cbAmazonS3Endpoint.Text = Config.AmazonS3Settings.Endpoint; + cbAmazonS3CustomCNAME.Checked = Config.AmazonS3Settings.UseCustomCNAME; + txtAmazonS3BucketName.Text = Config.AmazonS3Settings.Bucket; + txtAmazonS3ObjectPrefix.Text = Config.AmazonS3Settings.ObjectPrefix; + #endregion File uploaders #region URL Shorteners diff --git a/UploadersLib/Properties/Resources.Designer.cs b/UploadersLib/Properties/Resources.Designer.cs index 268fb76e4..a587cd000 100644 --- a/UploadersLib/Properties/Resources.Designer.cs +++ b/UploadersLib/Properties/Resources.Designer.cs @@ -60,6 +60,16 @@ internal class Resources { } } + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon AmazonS3 { + get { + object obj = ResourceManager.GetObject("AmazonS3", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// diff --git a/UploadersLib/Properties/Resources.resx b/UploadersLib/Properties/Resources.resx index 602ccaa9f..1d8afaa58 100644 --- a/UploadersLib/Properties/Resources.resx +++ b/UploadersLib/Properties/Resources.resx @@ -304,4 +304,7 @@ ..\favicons\bitly.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\favicons\AmazonS3.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/UploadersLib/UploadersConfig.cs b/UploadersLib/UploadersConfig.cs index 4e620d900..6bd278044 100644 --- a/UploadersLib/UploadersConfig.cs +++ b/UploadersLib/UploadersConfig.cs @@ -194,6 +194,13 @@ public class UploadersConfig : SettingsBase public MegaApiClient.AuthInfos MegaAuthInfos = null; public string MegaParentNodeId = null; + // Amazon S3 + + public AmazonS3Settings AmazonS3Settings = new AmazonS3Settings() { + ObjectPrefix = Application.ProductName + "/%y-%mo/", + UseReducedRedundancyStorage = true + }; + #endregion File uploaders #region URL shorteners diff --git a/UploadersLib/UploadersLib.csproj b/UploadersLib/UploadersLib.csproj index 2489728c4..f1ca894db 100644 --- a/UploadersLib/UploadersLib.csproj +++ b/UploadersLib/UploadersLib.csproj @@ -112,6 +112,7 @@ + @@ -437,6 +438,9 @@ + + +