mirror of
https://github.com/ShareX/ShareX.git
synced 2024-10-01 09:47:22 +13:00
Update Azure Storage to include support for root containers, custom upload paths, and masking $root
This commit is contained in:
parent
aa1a3c3287
commit
ef0edfb066
5 changed files with 8858 additions and 2153 deletions
|
@ -51,7 +51,7 @@ public override bool CheckConfig(UploadersConfig config)
|
|||
|
||||
public override GenericUploader CreateUploader(UploadersConfig config, TaskReferenceHelper taskInfo)
|
||||
{
|
||||
return new AzureStorage(config.AzureStorageAccountName, config.AzureStorageAccountAccessKey, config.AzureStorageContainer, config.AzureStorageEnvironment, config.AzureStorageCustomDomain);
|
||||
return new AzureStorage(config.AzureStorageAccountName, config.AzureStorageAccountAccessKey, config.AzureStorageContainer, config.AzureStorageEnvironment, config.AzureStorageCustomDomain, config.AzureStorageUploadPath, config.AzureStorageExcludeContainer);
|
||||
}
|
||||
|
||||
public override TabPage GetUploadersConfigTabPage(UploadersConfigForm form) => form.tpAzureStorage;
|
||||
|
@ -66,14 +66,18 @@ public sealed class AzureStorage : FileUploader
|
|||
public string AzureStorageContainer { get; private set; }
|
||||
public string AzureStorageEnvironment { get; private set; }
|
||||
public string AzureStorageCustomDomain { get; private set; }
|
||||
public string AzureStorageUploadPath { get; private set; }
|
||||
public bool AzureStorageExcludeContainer { get; private set; }
|
||||
|
||||
public AzureStorage(string azureStorageAccountName, string azureStorageAccessKey, string azureStorageContainer, string azureStorageEnvironment, string customDomain)
|
||||
public AzureStorage(string azureStorageAccountName, string azureStorageAccessKey, string azureStorageContainer, string azureStorageEnvironment, string customDomain, string uploadPath, bool excludeContainer)
|
||||
{
|
||||
AzureStorageAccountName = azureStorageAccountName;
|
||||
AzureStorageAccountAccessKey = azureStorageAccessKey;
|
||||
AzureStorageContainer = azureStorageContainer;
|
||||
AzureStorageEnvironment = (!string.IsNullOrEmpty(azureStorageEnvironment)) ? azureStorageEnvironment : "blob.core.windows.net";
|
||||
AzureStorageCustomDomain = customDomain;
|
||||
AzureStorageUploadPath = uploadPath;
|
||||
AzureStorageExcludeContainer = excludeContainer;
|
||||
}
|
||||
|
||||
public override UploadResult Upload(Stream stream, string fileName)
|
||||
|
@ -90,7 +94,12 @@ public override UploadResult Upload(Stream stream, string fileName)
|
|||
CreateContainerIfNotExists();
|
||||
|
||||
string date = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture);
|
||||
string url = $"https://{AzureStorageAccountName}.{AzureStorageEnvironment}/{AzureStorageContainer}/{fileName}";
|
||||
string targetPath = GetUploadPath(fileName);
|
||||
string url = $"https://{AzureStorageAccountName}.{AzureStorageEnvironment}/{AzureStorageContainer}/{targetPath}";
|
||||
if (AzureStorageContainer == "$root")
|
||||
{
|
||||
url = $"https://{AzureStorageAccountName}.{AzureStorageEnvironment}/{targetPath}";
|
||||
}
|
||||
string contentType = Helpers.GetMimeType(fileName);
|
||||
|
||||
NameValueCollection requestHeaders = new NameValueCollection();
|
||||
|
@ -99,7 +108,11 @@ public override UploadResult Upload(Stream stream, string fileName)
|
|||
requestHeaders["x-ms-blob-type"] = "BlockBlob";
|
||||
|
||||
string canonicalizedHeaders = $"x-ms-blob-type:BlockBlob\nx-ms-date:{date}\nx-ms-version:{APIVersion}\n";
|
||||
string canonicalizedResource = $"/{AzureStorageAccountName}/{AzureStorageContainer}/{fileName}";
|
||||
string canonicalizedResource = $"/{AzureStorageAccountName}/{AzureStorageContainer}/{targetPath}";
|
||||
if (AzureStorageContainer == "$root")
|
||||
{
|
||||
canonicalizedResource = $"/{AzureStorageAccountName}/{targetPath}";
|
||||
}
|
||||
string stringToSign = GenerateStringToSign(canonicalizedHeaders, canonicalizedResource, stream.Length.ToString(), contentType);
|
||||
|
||||
requestHeaders["Authorization"] = $"SharedKey {AzureStorageAccountName}:{stringToSign}";
|
||||
|
@ -112,7 +125,14 @@ public override UploadResult Upload(Stream stream, string fileName)
|
|||
|
||||
if (!string.IsNullOrEmpty(AzureStorageCustomDomain))
|
||||
{
|
||||
result = URLHelpers.CombineURL(AzureStorageCustomDomain, AzureStorageContainer, fileName);
|
||||
if (AzureStorageExcludeContainer)
|
||||
{
|
||||
result = URLHelpers.CombineURL(AzureStorageCustomDomain, targetPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = URLHelpers.CombineURL(AzureStorageCustomDomain, AzureStorageContainer, targetPath);
|
||||
}
|
||||
result = URLHelpers.FixPrefix(result);
|
||||
}
|
||||
else
|
||||
|
@ -224,5 +244,18 @@ private string HashRequest(string stringToSign)
|
|||
|
||||
return hashedString;
|
||||
}
|
||||
|
||||
private string GetUploadPath(string fileName)
|
||||
{
|
||||
if (!String.IsNullOrEmpty(AzureStorageUploadPath))
|
||||
{
|
||||
string path = NameParser.Parse(NameParserType.FolderPath, AzureStorageUploadPath.Trim('/'));
|
||||
return URLHelpers.CombineURL(path, fileName);
|
||||
}
|
||||
else
|
||||
{
|
||||
return fileName;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -310,6 +310,9 @@ private void InitializeComponent()
|
|||
this.txtGoogleCloudStorageBucket = new System.Windows.Forms.TextBox();
|
||||
this.oauth2GoogleCloudStorage = new ShareX.UploadersLib.OAuthControl();
|
||||
this.tpAzureStorage = new System.Windows.Forms.TabPage();
|
||||
this.cbAzureStorageExcludeContainer = new System.Windows.Forms.CheckBox();
|
||||
this.txtAzureStorageUploadPath = new System.Windows.Forms.TextBox();
|
||||
this.lblAzureStorageUploadPath = new System.Windows.Forms.Label();
|
||||
this.cbAzureStorageEnvironment = new System.Windows.Forms.ComboBox();
|
||||
this.lblAzureStorageEnvironment = new System.Windows.Forms.Label();
|
||||
this.btnAzureStoragePortal = new System.Windows.Forms.Button();
|
||||
|
@ -1463,7 +1466,6 @@ private void InitializeComponent()
|
|||
//
|
||||
this.eiCustomUploaders.CustomFilter = "ShareX custom uploader (*.sxcu)|*.sxcu";
|
||||
this.eiCustomUploaders.DefaultFileName = null;
|
||||
this.eiCustomUploaders.ExportIgnoreDefaultValue = true;
|
||||
this.eiCustomUploaders.ExportIgnoreNull = true;
|
||||
resources.ApplyResources(this.eiCustomUploaders, "eiCustomUploaders");
|
||||
this.eiCustomUploaders.Name = "eiCustomUploaders";
|
||||
|
@ -2835,6 +2837,9 @@ private void InitializeComponent()
|
|||
// tpAzureStorage
|
||||
//
|
||||
this.tpAzureStorage.BackColor = System.Drawing.SystemColors.Window;
|
||||
this.tpAzureStorage.Controls.Add(this.cbAzureStorageExcludeContainer);
|
||||
this.tpAzureStorage.Controls.Add(this.txtAzureStorageUploadPath);
|
||||
this.tpAzureStorage.Controls.Add(this.lblAzureStorageUploadPath);
|
||||
this.tpAzureStorage.Controls.Add(this.cbAzureStorageEnvironment);
|
||||
this.tpAzureStorage.Controls.Add(this.lblAzureStorageEnvironment);
|
||||
this.tpAzureStorage.Controls.Add(this.btnAzureStoragePortal);
|
||||
|
@ -2849,6 +2854,24 @@ private void InitializeComponent()
|
|||
resources.ApplyResources(this.tpAzureStorage, "tpAzureStorage");
|
||||
this.tpAzureStorage.Name = "tpAzureStorage";
|
||||
//
|
||||
// cbAzureStorageExcludeContainer
|
||||
//
|
||||
resources.ApplyResources(this.cbAzureStorageExcludeContainer, "cbAzureStorageExcludeContainer");
|
||||
this.cbAzureStorageExcludeContainer.Name = "cbAzureStorageExcludeContainer";
|
||||
this.cbAzureStorageExcludeContainer.UseVisualStyleBackColor = true;
|
||||
this.cbAzureStorageExcludeContainer.CheckedChanged += new System.EventHandler(this.cbAzureStorageExcludeContainer_CheckedChanged);
|
||||
//
|
||||
// txtAzureStorageUploadPath
|
||||
//
|
||||
resources.ApplyResources(this.txtAzureStorageUploadPath, "txtAzureStorageUploadPath");
|
||||
this.txtAzureStorageUploadPath.Name = "txtAzureStorageUploadPath";
|
||||
this.txtAzureStorageUploadPath.TextChanged += new System.EventHandler(this.txtAzureStorageUploadPath_TextChanged);
|
||||
//
|
||||
// lblAzureStorageUploadPath
|
||||
//
|
||||
resources.ApplyResources(this.lblAzureStorageUploadPath, "lblAzureStorageUploadPath");
|
||||
this.lblAzureStorageUploadPath.Name = "lblAzureStorageUploadPath";
|
||||
//
|
||||
// cbAzureStorageEnvironment
|
||||
//
|
||||
this.cbAzureStorageEnvironment.FormattingEnabled = true;
|
||||
|
@ -6083,5 +6106,8 @@ private void InitializeComponent()
|
|||
private System.Windows.Forms.ListBox lbSharedFolderAccounts;
|
||||
private System.Windows.Forms.Label lblGoogleCloudStoragePathPreviewLabel;
|
||||
private System.Windows.Forms.Label lblGoogleCloudStoragePathPreview;
|
||||
private System.Windows.Forms.TextBox txtAzureStorageUploadPath;
|
||||
private System.Windows.Forms.Label lblAzureStorageUploadPath;
|
||||
private System.Windows.Forms.CheckBox cbAzureStorageExcludeContainer;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -667,6 +667,8 @@ public void LoadSettings()
|
|||
txtAzureStorageContainer.Text = Config.AzureStorageContainer;
|
||||
cbAzureStorageEnvironment.Text = Config.AzureStorageEnvironment;
|
||||
txtAzureStorageCustomDomain.Text = Config.AzureStorageCustomDomain;
|
||||
txtAzureStorageUploadPath.Text = Config.AzureStorageUploadPath;
|
||||
cbAzureStorageExcludeContainer.Checked = Config.AzureStorageExcludeContainer;
|
||||
|
||||
#endregion Azure Storage
|
||||
|
||||
|
@ -2870,6 +2872,16 @@ private void txtAzureStorageCustomDomain_TextChanged(object sender, EventArgs e)
|
|||
Config.AzureStorageCustomDomain = txtAzureStorageCustomDomain.Text;
|
||||
}
|
||||
|
||||
private void txtAzureStorageUploadPath_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
Config.AzureStorageUploadPath = txtAzureStorageUploadPath.Text;
|
||||
}
|
||||
|
||||
private void cbAzureStorageExcludeContainer_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Config.AzureStorageExcludeContainer = cbAzureStorageExcludeContainer.Checked;
|
||||
}
|
||||
|
||||
private void btnAzureStoragePortal_Click(object sender, EventArgs e)
|
||||
{
|
||||
URLHelpers.OpenURL("https://portal.azure.com/?feature.customportal=false#blade/HubsExtension/Resources/resourceType/Microsoft.Storage%2FStorageAccounts");
|
||||
|
@ -3744,9 +3756,11 @@ private void AddTextToActiveURLField(string text)
|
|||
case URLType.URL:
|
||||
tb = txtCustomUploaderURL;
|
||||
break;
|
||||
|
||||
case URLType.ThumbnailURL:
|
||||
tb = txtCustomUploaderThumbnailURL;
|
||||
break;
|
||||
|
||||
case URLType.DeletionURL:
|
||||
tb = txtCustomUploaderDeletionURL;
|
||||
break;
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -372,6 +372,8 @@ public class UploadersConfig : SettingsBase<UploadersConfig>
|
|||
public string AzureStorageContainer = "";
|
||||
public string AzureStorageEnvironment = "blob.core.windows.net";
|
||||
public string AzureStorageCustomDomain = "";
|
||||
public string AzureStorageUploadPath = "";
|
||||
public bool AzureStorageExcludeContainer = false;
|
||||
|
||||
#endregion Azure Storage
|
||||
|
||||
|
|
Loading…
Reference in a new issue