Update Azure Storage to include support for root containers, custom upload paths, and masking $root

This commit is contained in:
William Saulnier 2018-06-05 17:39:50 -07:00
parent aa1a3c3287
commit ef0edfb066
5 changed files with 8858 additions and 2153 deletions

View file

@ -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;
}
}
}
}

View file

@ -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;
}
}

View file

@ -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

View file

@ -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