mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
#19503: Ensuring relative paths are used in AzureFileSystem
Work Item: 19503 --HG-- branch : 1.x extra : rebase_source : 1a0c9fb94630b79d28040aaaf0a53be2d9d1c8b9
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user