Skip to content

Commit 771c601

Browse files
committed
Added configuration option that allows users to select private container during install. When selected the blob container is created as a private container and files cannot be viewed directly via the blob url.
1 parent 2726aa5 commit 771c601

File tree

6 files changed

+48
-10
lines changed

6 files changed

+48
-10
lines changed

build/transforms/FileSystemProviders.config.install.xdt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
of the container name.
2323
-->
2424
<add key="useDefaultRoute" value="true" xdt:Locator="Match(key)" xdt:Transform="InsertIfMissing" />
25+
<!--
26+
When true blob containers will be private instead of public what means that you can't access the original blob file directly from its blob url.
27+
-->
28+
<add key="usePrivateContainer" value="false" xdt:Locator="Match(key)" xdt:Transform="InsertIfMissing" />
2529
</Parameters>
2630
</Provider>
2731
<!--

src/UmbracoFileSystemProviders.Azure.Installer/Configurator/Controllers/Configure.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,6 @@ configApp.controller("Loader", function ($scope, $http, $log) {
3838
};
3939

4040
$scope.getInputType = function (param) {
41-
return param.toUpperCase() === "USEDEFAULTROUTE" ? "checkbox" : "text";
41+
return param.toUpperCase() === "USEDEFAULTROUTE" || param.toUpperCase() === "USEPRIVATECONTAINER" ? "checkbox" : "text";
4242
};
4343
});

src/UmbracoFileSystemProviders.Azure.Installer/InstallerController.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public InstallerStatus PostParameters(IEnumerable<Parameter> parameters)
7777
string connection = newParameters.SingleOrDefault(k => k.Key == "connectionString").Value;
7878
string containerName = newParameters.SingleOrDefault(k => k.Key == "containerName").Value;
7979
bool useDefaultRoute = bool.Parse(newParameters.SingleOrDefault(k => k.Key == "useDefaultRoute").Value);
80+
bool usePrivateContainer = bool.Parse(newParameters.SingleOrDefault(k => k.Key == "usePrivateContainer").Value);
8081
string rootUrl = newParameters.SingleOrDefault(k => k.Key == "rootUrl").Value;
8182

8283
if (!TestAzureCredentials(connection, containerName))

src/UmbracoFileSystemProviders.Azure.Tests/AzureBlobFileSystemTestsBase.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,12 @@ public AzureBlobFileSystem CreateAzureBlobFileSystem(bool disableVirtualPathProv
4242
string connectionString = "UseDevelopmentStorage=true";
4343
string maxDays = "30";
4444
string useDefaultRoute = "true";
45+
string usePrivateContainer = "false";
4546

4647
Mock<ILogHelper> logHelper = new Mock<ILogHelper>();
4748
Mock<IMimeTypeResolver> mimeTypeHelper = new Mock<IMimeTypeResolver>();
4849

49-
return new AzureBlobFileSystem(containerName, rootUrl, connectionString, maxDays, useDefaultRoute)
50+
return new AzureBlobFileSystem(containerName, rootUrl, connectionString, maxDays, useDefaultRoute, usePrivateContainer)
5051
{
5152
FileSystem =
5253
{

src/UmbracoFileSystemProviders.Azure/AzureBlobFileSystem.cs

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// Licensed under the Apache License, Version 2.0.
44
// </copyright>
55

6+
using Microsoft.WindowsAzure.Storage.Blob;
7+
68
namespace Our.Umbraco.FileSystemProviders.Azure
79
{
810
using System;
@@ -49,7 +51,19 @@ public class AzureBlobFileSystem : IFileSystem
4951
/// <param name="rootUrl">The root url.</param>
5052
/// <param name="connectionString">The connection string.</param>
5153
public AzureBlobFileSystem(string containerName, string rootUrl, string connectionString)
52-
: this(containerName, rootUrl, connectionString, "365", "true")
54+
: this(containerName, rootUrl, connectionString, "365", "true", "false")
55+
{
56+
}
57+
58+
/// <summary>
59+
/// Initializes a new instance of the <see cref="AzureBlobFileSystem"/> class.
60+
/// </summary>
61+
/// <param name="containerName">The container name.</param>
62+
/// <param name="rootUrl">The root url.</param>
63+
/// <param name="connectionString">The connection string.</param>
64+
/// <param name="maxDays">The maximum number of days to cache blob items for in the browser.</param>
65+
/// <param name="useDefaultRoute">Whether to use the default "media" route in the url independent of the blob container.</param>
66+
public AzureBlobFileSystem(string containerName, string rootUrl, string connectionString, string maxDays, string useDefaultRoute): this(containerName, rootUrl, connectionString, maxDays, useDefaultRoute, "false")
5367
{
5468
}
5569

@@ -61,9 +75,10 @@ public AzureBlobFileSystem(string containerName, string rootUrl, string connecti
6175
/// <param name="connectionString">The connection string.</param>
6276
/// <param name="maxDays">The maximum number of days to cache blob items for in the browser.</param>
6377
/// <param name="useDefaultRoute">Whether to use the default "media" route in the url independent of the blob container.</param>
64-
public AzureBlobFileSystem(string containerName, string rootUrl, string connectionString, string maxDays, string useDefaultRoute)
78+
/// <param name="usePrivateContainer">blob container can be private (no direct access) or public (direct access possible, default)</param>
79+
public AzureBlobFileSystem(string containerName, string rootUrl, string connectionString, string maxDays, string useDefaultRoute, string usePrivateContainer)
6580
{
66-
this.FileSystem = AzureFileSystem.GetInstance(containerName, rootUrl, connectionString, maxDays, useDefaultRoute);
81+
this.FileSystem = AzureFileSystem.GetInstance(containerName, rootUrl, connectionString, maxDays, useDefaultRoute, usePrivateContainer);
6782
}
6883

6984
/// <summary>
@@ -100,7 +115,14 @@ public AzureBlobFileSystem(string alias)
100115
useDefaultRoute = "true";
101116
}
102117

103-
this.FileSystem = AzureFileSystem.GetInstance(containerName, rootUrl, connectionString, maxDays, useDefaultRoute);
118+
string accessType = ConfigurationManager.AppSettings[$"{UseDefaultRootKey}:{alias}"];
119+
if (string.IsNullOrWhiteSpace(useDefaultRoute))
120+
{
121+
useDefaultRoute = "true";
122+
}
123+
124+
125+
this.FileSystem = AzureFileSystem.GetInstance(containerName, rootUrl, connectionString, maxDays, useDefaultRoute,accessType);
104126
}
105127
else
106128
{

src/UmbracoFileSystemProviders.Azure/AzureFileSystem.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,11 @@ internal class AzureFileSystem : IFileSystem
7777
/// <param name="connectionString">The connection string.</param>
7878
/// <param name="maxDays">The maximum number of days to cache blob items for in the browser.</param>
7979
/// <param name="useDefaultRoute">Whether to use the default "media" route in the url independent of the blob container.</param>
80+
/// <param name="accessType"><see cref="BlobContainerPublicAccessType"/> indicating the access permissions.</param>
8081
/// <exception cref="ArgumentNullException">
8182
/// Thrown if <paramref name="containerName"/> is null or whitespace.
8283
/// </exception>
83-
internal AzureFileSystem(string containerName, string rootUrl, string connectionString, int maxDays, bool useDefaultRoute)
84+
internal AzureFileSystem(string containerName, string rootUrl, string connectionString, int maxDays, bool useDefaultRoute, BlobContainerPublicAccessType accessType)
8485
{
8586
if (string.IsNullOrWhiteSpace(containerName))
8687
{
@@ -107,7 +108,7 @@ internal AzureFileSystem(string containerName, string rootUrl, string connection
107108
}
108109

109110
CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
110-
this.cloudBlobContainer = CreateContainer(cloudBlobClient, containerName, BlobContainerPublicAccessType.Blob);
111+
this.cloudBlobContainer = CreateContainer(cloudBlobClient, containerName, accessType);
111112

112113
// First assign a local copy before editing. We use that to track the type.
113114
// TODO: Do we need this? The container should be an identifer.
@@ -166,8 +167,9 @@ internal AzureFileSystem(string containerName, string rootUrl, string connection
166167
/// <param name="connectionString">The connection string.</param>
167168
/// <param name="maxDays">The maximum number of days to cache blob items for in the browser.</param>
168169
/// <param name="useDefaultRoute">Whether to use the default "media" route in the url independent of the blob container.</param>
170+
/// <param name="usePrivateContainer">blob container can be private (no direct access) or public (direct access possible, default)</param>
169171
/// <returns>The <see cref="AzureFileSystem"/></returns>
170-
public static AzureFileSystem GetInstance(string containerName, string rootUrl, string connectionString, string maxDays, string useDefaultRoute)
172+
public static AzureFileSystem GetInstance(string containerName, string rootUrl, string connectionString, string maxDays, string useDefaultRoute, string usePrivateContainer)
171173
{
172174
lock (Locker)
173175
{
@@ -187,7 +189,15 @@ public static AzureFileSystem GetInstance(string containerName, string rootUrl,
187189
defaultRoute = true;
188190
}
189191

190-
fileSystem = new AzureFileSystem(containerName, rootUrl, connectionString, max, defaultRoute);
192+
bool privateContainer;
193+
if (!bool.TryParse(usePrivateContainer, out privateContainer))
194+
{
195+
privateContainer = true;
196+
}
197+
198+
var blobContainerPublicAccessType = privateContainer ? BlobContainerPublicAccessType.Off : BlobContainerPublicAccessType.Blob;
199+
200+
fileSystem = new AzureFileSystem(containerName, rootUrl, connectionString, max, defaultRoute, blobContainerPublicAccessType);
191201
FileSystems.Add(fileSystem);
192202
}
193203

0 commit comments

Comments
 (0)