#19503: Ensuring relative paths are used in AzureFileSystem

Work Item: 19503

--HG--
branch : 1.x
extra : rebase_source : 1a0c9fb94630b79d28040aaaf0a53be2d9d1c8b9
This commit is contained in:
Decorum
2013-06-07 16:51:27 -07:00
parent 88a91ddd02
commit c2ef1f3baf

View File

@@ -30,10 +30,10 @@ namespace Orchard.Azure {
// Setup the connection to custom storage accountm, e.g. Development Storage // Setup the connection to custom storage accountm, e.g. Development Storage
_storageAccount = storageAccount; _storageAccount = storageAccount;
ContainerName = containerName; ContainerName = containerName;
_root = String.IsNullOrEmpty(root) ? "": root + "/"; _root = String.IsNullOrEmpty(root) ? "" : root + "/";
_absoluteRoot = Combine(Combine(_storageAccount.BlobEndpoint.AbsoluteUri, containerName), root); _absoluteRoot = Combine(Combine(_storageAccount.BlobEndpoint.AbsoluteUri, containerName), root);
using ( new HttpContextWeaver() ) { using (new HttpContextWeaver()) {
BlobClient = _storageAccount.CreateCloudBlobClient(); BlobClient = _storageAccount.CreateCloudBlobClient();
// Get and create the container if it does not exist // Get and create the container if it does not exist
@@ -43,37 +43,39 @@ namespace Orchard.Azure {
Container.CreateIfNotExist(); Container.CreateIfNotExist();
Container.SetPermissions(isPrivate Container.SetPermissions(isPrivate
? new BlobContainerPermissions ? new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Off }
{PublicAccess = BlobContainerPublicAccessType.Off} : new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Container });
: new BlobContainerPermissions
{PublicAccess = BlobContainerPublicAccessType.Container});
} }
} }
private static void EnsurePathIsRelative(string path) { private static string ConvertToRelativeUriPath(string path) {
if ( path.StartsWith("/") || path.StartsWith("http://") || path.StartsWith("https://") ) var newPath = path.Replace(@"\", "/");
if (newPath.StartsWith("/") || newPath.StartsWith("http://") || newPath.StartsWith("https://"))
throw new ArgumentException("Path must be relative"); throw new ArgumentException("Path must be relative");
return newPath;
} }
public string Combine(string path1, string path2) { public string Combine(string path1, string path2) {
if ( path1 == null) { if (path1 == null) {
throw new ArgumentNullException("path1"); throw new ArgumentNullException("path1");
} }
if ( path2 == null ) { if (path2 == null) {
throw new ArgumentNullException("path2"); throw new ArgumentNullException("path2");
} }
if ( String.IsNullOrEmpty(path2) ) { if (String.IsNullOrEmpty(path2)) {
return path1; return path1;
} }
if ( String.IsNullOrEmpty(path1) ) { if (String.IsNullOrEmpty(path1)) {
return path2; return path2;
} }
if ( path2.StartsWith("http://") || path2.StartsWith("https://") ) { if (path2.StartsWith("http://") || path2.StartsWith("https://")) {
return path2; return path2;
} }
@@ -87,16 +89,17 @@ namespace Orchard.Azure {
} }
public IStorageFile GetFile(string path) { public IStorageFile GetFile(string path) {
EnsurePathIsRelative(path);
using ( new HttpContextWeaver() ) { path = ConvertToRelativeUriPath(path);
using (new HttpContextWeaver()) {
Container.EnsureBlobExists(String.Concat(_root, path)); Container.EnsureBlobExists(String.Concat(_root, path));
return new AzureBlobFileStorage(Container.GetBlockBlobReference(String.Concat(_root, path)), _absoluteRoot); return new AzureBlobFileStorage(Container.GetBlockBlobReference(String.Concat(_root, path)), _absoluteRoot);
} }
} }
public bool FileExists(string path) { public bool FileExists(string path) {
using ( new HttpContextWeaver() ) { using (new HttpContextWeaver()) {
return Container.BlobExists(String.Concat(_root, path)); return Container.BlobExists(String.Concat(_root, path));
} }
} }
@@ -108,13 +111,13 @@ namespace Orchard.Azure {
} }
public IEnumerable<IStorageFile> ListFiles(string path) { public IEnumerable<IStorageFile> ListFiles(string path) {
path = path ?? String.Empty; path = path ?? String.Empty;
path = ConvertToRelativeUriPath(path);
EnsurePathIsRelative(path);
string prefix = Combine(Combine(Container.Name, _root), path); string prefix = Combine(Combine(Container.Name, _root), path);
if ( !prefix.EndsWith("/") ) if (!prefix.EndsWith("/"))
prefix += "/"; prefix += "/";
using (new HttpContextWeaver()) { using (new HttpContextWeaver()) {
@@ -128,10 +131,11 @@ namespace Orchard.Azure {
} }
public IEnumerable<IStorageFolder> ListFolders(string path) { public IEnumerable<IStorageFolder> ListFolders(string path) {
path = path ?? String.Empty;
EnsurePathIsRelative(path); path = path ?? String.Empty;
using ( new HttpContextWeaver() ) { path = ConvertToRelativeUriPath(path);
using (new HttpContextWeaver()) {
// return root folders // return root folders
if (String.Concat(_root, path) == String.Empty) { if (String.Concat(_root, path) == String.Empty) {
@@ -141,11 +145,11 @@ namespace Orchard.Azure {
.ToList(); .ToList();
} }
if (!Container.DirectoryExists(String.Concat(_root, path)) ) { if (!Container.DirectoryExists(String.Concat(_root, path))) {
try { try {
CreateFolder(path); CreateFolder(path);
} }
catch ( Exception ex ) { catch (Exception ex) {
throw new ArgumentException(string.Format("The folder could not be created at path: {0}. {1}", throw new ArgumentException(string.Format("The folder could not be created at path: {0}. {1}",
path, ex)); path, ex));
} }
@@ -175,7 +179,7 @@ namespace Orchard.Azure {
} }
public void CreateFolder(string path) { public void CreateFolder(string path) {
EnsurePathIsRelative(path); path = ConvertToRelativeUriPath(path);
using (new HttpContextWeaver()) { using (new HttpContextWeaver()) {
Container.EnsureDirectoryDoesNotExist(String.Concat(_root, path)); Container.EnsureDirectoryDoesNotExist(String.Concat(_root, path));
@@ -185,7 +189,7 @@ namespace Orchard.Azure {
int lastIndex; int lastIndex;
while ((lastIndex = path.LastIndexOf('/')) > 0) { while ((lastIndex = path.LastIndexOf('/')) > 0) {
path = path.Substring(0, lastIndex); path = path.Substring(0, lastIndex);
if(!Container.DirectoryExists(String.Concat(_root, path))) { if (!Container.DirectoryExists(String.Concat(_root, path))) {
CreateFile(Combine(path, FolderEntry)); CreateFile(Combine(path, FolderEntry));
} }
} }
@@ -193,13 +197,13 @@ namespace Orchard.Azure {
} }
public void DeleteFolder(string path) { public void DeleteFolder(string path) {
EnsurePathIsRelative(path); path = ConvertToRelativeUriPath(path);
using ( new HttpContextWeaver() ) { using (new HttpContextWeaver()) {
Container.EnsureDirectoryExists(String.Concat(_root, path)); Container.EnsureDirectoryExists(String.Concat(_root, path));
foreach ( var blob in Container.GetDirectoryReference(String.Concat(_root, path)).ListBlobs() ) { foreach (var blob in Container.GetDirectoryReference(String.Concat(_root, path)).ListBlobs()) {
if (blob is CloudBlob) if (blob is CloudBlob)
((CloudBlob) blob).Delete(); ((CloudBlob)blob).Delete();
if (blob is CloudBlobDirectory) if (blob is CloudBlobDirectory)
DeleteFolder(blob.Uri.ToString().Substring(Container.Uri.ToString().Length + 1 + _root.Length)); DeleteFolder(blob.Uri.ToString().Substring(Container.Uri.ToString().Length + 1 + _root.Length));
@@ -208,15 +212,15 @@ namespace Orchard.Azure {
} }
public void RenameFolder(string path, string newPath) { public void RenameFolder(string path, string newPath) {
EnsurePathIsRelative(path); path = ConvertToRelativeUriPath(path);
EnsurePathIsRelative(newPath); newPath = ConvertToRelativeUriPath(newPath);
if ( !path.EndsWith("/") ) if (!path.EndsWith("/"))
path += "/"; path += "/";
if ( !newPath.EndsWith("/") ) if (!newPath.EndsWith("/"))
newPath += "/"; newPath += "/";
using ( new HttpContextWeaver() ) { using (new HttpContextWeaver()) {
foreach (var blob in Container.GetDirectoryReference(_root + path).ListBlobs()) { foreach (var blob in Container.GetDirectoryReference(_root + path).ListBlobs()) {
if (blob is CloudBlob) { if (blob is CloudBlob) {
string filename = Path.GetFileName(blob.Uri.ToString()); string filename = Path.GetFileName(blob.Uri.ToString());
@@ -236,9 +240,9 @@ namespace Orchard.Azure {
} }
public void DeleteFile(string path) { public void DeleteFile(string path) {
EnsurePathIsRelative(path); path = ConvertToRelativeUriPath(path);
using ( new HttpContextWeaver() ) { using (new HttpContextWeaver()) {
Container.EnsureBlobExists(Combine(_root, path)); Container.EnsureBlobExists(Combine(_root, path));
var blob = Container.GetBlockBlobReference(Combine(_root, path)); var blob = Container.GetBlockBlobReference(Combine(_root, path));
blob.Delete(); blob.Delete();
@@ -246,10 +250,10 @@ namespace Orchard.Azure {
} }
public void RenameFile(string path, string newPath) { public void RenameFile(string path, string newPath) {
EnsurePathIsRelative(path); path = ConvertToRelativeUriPath(path);
EnsurePathIsRelative(newPath); newPath = ConvertToRelativeUriPath(newPath);
using ( new HttpContextWeaver() ) { using (new HttpContextWeaver()) {
Container.EnsureBlobExists(String.Concat(_root, path)); Container.EnsureBlobExists(String.Concat(_root, path));
Container.EnsureBlobDoesNotExist(String.Concat(_root, newPath)); Container.EnsureBlobDoesNotExist(String.Concat(_root, newPath));
@@ -261,9 +265,9 @@ namespace Orchard.Azure {
} }
public IStorageFile CreateFile(string path) { public IStorageFile CreateFile(string path) {
EnsurePathIsRelative(path); path = ConvertToRelativeUriPath(path);
if ( Container.BlobExists(String.Concat(_root, path)) ) { if (Container.BlobExists(String.Concat(_root, path))) {
throw new ArgumentException("File " + path + " already exists"); throw new ArgumentException("File " + path + " already exists");
} }
@@ -287,9 +291,9 @@ namespace Orchard.Azure {
} }
public string GetPublicUrl(string path) { public string GetPublicUrl(string path) {
EnsurePathIsRelative(path); path = ConvertToRelativeUriPath(path);
using ( new HttpContextWeaver() ) { using (new HttpContextWeaver()) {
Container.EnsureBlobExists(String.Concat(_root, path)); Container.EnsureBlobExists(String.Concat(_root, path));
return Container.GetBlockBlobReference(String.Concat(_root, path)).Uri.ToString(); return Container.GetBlockBlobReference(String.Concat(_root, path)).Uri.ToString();
} }
@@ -310,7 +314,7 @@ namespace Orchard.Azure {
string webConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(null).FilePath; string webConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(null).FilePath;
// search for custom mime types in web.config and applicationhost.config // search for custom mime types in web.config and applicationhost.config
foreach (var configFile in new[] {webConfig, applicationHost}) { foreach (var configFile in new[] { webConfig, applicationHost }) {
if (File.Exists(configFile)) { if (File.Exists(configFile)) {
var xdoc = XDocument.Load(configFile); var xdoc = XDocument.Load(configFile);
var mimeMap = xdoc.XPathSelectElements("//staticContent/mimeMap[@fileExtension='" + extension + "']").FirstOrDefault(); var mimeMap = xdoc.XPathSelectElements("//staticContent/mimeMap[@fileExtension='" + extension + "']").FirstOrDefault();
@@ -403,7 +407,7 @@ namespace Orchard.Azure {
public string GetName() { public string GetName() {
var path = GetPath(); var path = GetPath();
return path.Substring(path.LastIndexOf('/') +1 ); return path.Substring(path.LastIndexOf('/') + 1);
} }
public string GetPath() { public string GetPath() {
@@ -434,11 +438,11 @@ namespace Orchard.Azure {
private static long GetDirectorySize(CloudBlobDirectory directoryBlob) { private static long GetDirectorySize(CloudBlobDirectory directoryBlob) {
long size = 0; long size = 0;
foreach ( var blobItem in directoryBlob.ListBlobs() ) { foreach (var blobItem in directoryBlob.ListBlobs()) {
if ( blobItem is CloudBlob ) if (blobItem is CloudBlob)
size += ( (CloudBlob)blobItem ).Properties.Length; size += ((CloudBlob)blobItem).Properties.Length;
if ( blobItem is CloudBlobDirectory ) if (blobItem is CloudBlobDirectory)
size += GetDirectorySize((CloudBlobDirectory)blobItem); size += GetDirectorySize((CloudBlobDirectory)blobItem);
} }