示例#1
0
        private async Task CopyAsync(IStoreItem source, IStoreCollection destinationCollection, string name, bool overwrite, int depth, IHttpContext httpContext, Uri baseUri, UriResultCollection errors)
        {
            // Determine the new base Uri
            var newBaseUri = UriHelper.Combine(baseUri, name);

            // Copy the item
            var copyResult = await source.CopyAsync(destinationCollection, name, overwrite, httpContext).ConfigureAwait(false);

            if (copyResult.Result != DavStatusCode.Created && copyResult.Result != DavStatusCode.NoContent)
            {
                errors.AddResult(newBaseUri, copyResult.Result);
                return;
            }

            // Check if the source is a collection and we are requested to copy recursively
            var sourceCollection = source as IStoreCollection;

            if (sourceCollection != null && depth > 0)
            {
                // The result should also contain a collection
                var newCollection = (IStoreCollection)copyResult.Item;

                // Copy all childs of the source collection
                foreach (var entry in await sourceCollection.GetItemsAsync(httpContext).ConfigureAwait(false))
                {
                    await CopyAsync(entry, newCollection, entry.Name, overwrite, depth - 1, httpContext, newBaseUri, errors).ConfigureAwait(false);
                }
            }
        }
示例#2
0
        private async Task MoveAsync(IStoreCollection sourceCollection, IStoreItem moveItem, IStoreCollection destinationCollection, string destinationName, bool overwrite, IHttpContext httpContext, Uri baseUri, UriResultCollection errors)
        {
            // Determine the new base URI
            var subBaseUri = UriHelper.Combine(baseUri, destinationName);

            // Obtain the actual item
            if (moveItem is IStoreCollection moveCollection && !moveCollection.SupportsFastMove(destinationCollection, destinationName, overwrite, httpContext))
            {
                // Create a new collection
                var newCollectionResult = await destinationCollection.CreateCollectionAsync(destinationName, overwrite, httpContext).ConfigureAwait(false);

                if (newCollectionResult.Result != DavStatusCode.Created && newCollectionResult.Result != DavStatusCode.NoContent)
                {
                    errors.AddResult(subBaseUri, newCollectionResult.Result);
                    return;
                }

                // Move all sub items
                foreach (var entry in await moveCollection.GetItemsAsync(httpContext).ConfigureAwait(false))
                {
                    await MoveAsync(moveCollection, entry, newCollectionResult.Collection, entry.Name, overwrite, httpContext, subBaseUri, errors).ConfigureAwait(false);
                }

                // Delete the source collection
                var deleteResult = await sourceCollection.DeleteItemAsync(moveItem.Name, httpContext).ConfigureAwait(false);

                if (deleteResult != DavStatusCode.Ok)
                {
                    errors.AddResult(subBaseUri, newCollectionResult.Result);
                }
            }
        public async Task <StoreItemResult> CopyAsync(IStoreCollection destinationCollection, string name, bool overwrite, IHttpContext httpContext)
        {
            var instance = CloudManager.Instance(httpContext.Session.Principal.Identity);
            var res      = await instance.Copy(_directoryInfo, destinationCollection.GetFullPath());

            return(new StoreItemResult(res ? DavStatusCode.Created : DavStatusCode.InternalServerError, null));
        }
示例#4
0
        public async Task <StoreItemResult> CopyAsync(IStoreCollection destinationCollection, string name, bool overwrite, IHttpContext httpContext)
        {
            // Just create the folder itself
            var result = await destinationCollection.CreateCollectionAsync(name, overwrite, httpContext);

            return(new StoreItemResult(result.Result, result.Collection));
        }
示例#5
0
        public async Task <StoreItemResult> CopyAsync(IStoreCollection destination, string name, bool overwrite, IHttpContext httpContext)
        {
            try
            {
                // If the destination is also a disk-store, then we can use the FileCopy API
                // (it's probably a bit more efficient than copying in C#)
                var diskCollection = destination as DiskStoreCollection;
                if (diskCollection != null)
                {
                    // Check if the collection is writable
                    if (!diskCollection.IsWritable)
                    {
                        return(new StoreItemResult(DavStatusCode.PreconditionFailed));
                    }

                    var destinationPath = Path.Combine(diskCollection.FullPath, name);

                    // Check if the file already exists
                    var fileExists = File.Exists(destinationPath);
                    if (fileExists && !overwrite)
                    {
                        return(new StoreItemResult(DavStatusCode.PreconditionFailed));
                    }

                    // Copy the file
                    File.Copy(_fileInfo.FullName, destinationPath, true);

                    // Return the appropriate status
                    return(new StoreItemResult(fileExists ? DavStatusCode.NoContent : DavStatusCode.Created));
                }
                else
                {
                    // Create the item in the destination collection
                    var result = await destination.CreateItemAsync(name, overwrite, httpContext).ConfigureAwait(false);

                    // Check if the item could be created
                    if (result.Item != null)
                    {
                        using (var sourceStream = await GetReadableStreamAsync(httpContext).ConfigureAwait(false))
                        {
                            var copyResult = await result.Item.UploadFromStreamAsync(httpContext, sourceStream).ConfigureAwait(false);

                            if (copyResult != DavStatusCode.Ok)
                            {
                                return(new StoreItemResult(copyResult, result.Item));
                            }
                        }
                    }

                    // Return result
                    return(new StoreItemResult(result.Result, result.Item));
                }
            }
            catch (Exception exc)
            {
                s_log.Log(LogLevel.Error, () => "Unexpected exception while copying data.", exc);
                return(new StoreItemResult(DavStatusCode.InternalServerError));
            }
        }
示例#6
0
        private async Task MoveAsync(IStoreCollection sourceCollection, string sourceName, IStoreCollection destinationCollection, string destinationName, bool overwrite, IHttpContext httpContext, WebDavUri baseUri, UriResultCollection errors)
        {
            // Determine the new base URI
            var subBaseUri = UriHelper.Combine(baseUri, destinationName);

            // Items should be moved directly
            var result = await sourceCollection.MoveItemAsync(sourceName, destinationCollection, destinationName, overwrite, httpContext).ConfigureAwait(false);

            if (result.Result != DavStatusCode.Created && result.Result != DavStatusCode.NoContent)
            {
                errors.AddResult(subBaseUri, result.Result);
            }
        }
        public async Task <StoreItemResult> CopyAsync(IStoreCollection destination, string name, bool overwrite, IHttpContext httpContext)
        {
            try
            {
                var collection = destination as MailruStoreCollection;
                if (collection != null)
                {
                    if (!collection.IsWritable)
                    {
                        return(new StoreItemResult(DavStatusCode.PreconditionFailed));
                    }

                    var destinationPath = WebDavPath.Combine(collection.FullPath, name);

                    // check if the file already exists??

                    await Cloud.Instance(httpContext).Copy(_fileInfo, destinationPath);

                    return(new StoreItemResult(DavStatusCode.Created));
                }


                // Create the item in the destination collection
                var result = await destination.CreateItemAsync(name, overwrite, httpContext).ConfigureAwait(false);

                if (result.Item != null)
                {
                    using (var sourceStream = await GetReadableStreamAsync(httpContext).ConfigureAwait(false))
                    {
                        var copyResult = await result.Item.UploadFromStreamAsync(httpContext, sourceStream).ConfigureAwait(false);

                        if (copyResult != DavStatusCode.Ok)
                        {
                            return(new StoreItemResult(copyResult, result.Item));
                        }
                    }
                }

                return(new StoreItemResult(result.Result, result.Item));
            }
            catch (IOException ioException) when(ioException.IsDiskFull())
            {
                SLog.Log(LogLevel.Error, () => "Out of disk space while copying data.", ioException);
                return(new StoreItemResult(DavStatusCode.InsufficientStorage));
            }
            catch (Exception exc)
            {
                SLog.Log(LogLevel.Error, () => "Unexpected exception while copying data.", exc);
                return(new StoreItemResult(DavStatusCode.InternalServerError));
            }
        }
        //TODO: something wrong with unused depth?
        private async Task CopyAsync(IStoreItem source, IStoreCollection destinationCollection, string name, bool overwrite, int depth, IHttpContext httpContext, WebDavUri baseUri, UriResultCollection errors)
        {
            // Determine the new base Uri
            var newBaseUri = UriHelper.Combine(baseUri, name);

            // Copy the item
            var copyResult = await source.CopyAsync(destinationCollection, name, overwrite, httpContext).ConfigureAwait(false);

            if (copyResult.Result != DavStatusCode.Created && copyResult.Result != DavStatusCode.NoContent)
            {
                errors.AddResult(newBaseUri, copyResult.Result);
            }

            //do not copy recursively
        }
示例#9
0
        private async Task MoveAsync(IStoreCollection sourceCollection, string sourceName, IStoreCollection destinationCollection, string destinationName, bool overwrite, IHttpContext httpContext, Uri baseUri, UriResultCollection errors)
        {
            // Determine the new base URI
            var subBaseUri = UriHelper.Combine(baseUri, destinationName);

            // Obtain the actual item
            var moveCollection = await sourceCollection.GetItemAsync(sourceName, httpContext).ConfigureAwait(false) as IStoreCollection;

            if (moveCollection != null)
            {
                // Create a new collection
                var newCollectionResult = await destinationCollection.CreateCollectionAsync(destinationName, overwrite, httpContext);

                if (newCollectionResult.Result != DavStatusCode.Created && newCollectionResult.Result != DavStatusCode.NoContent)
                {
                    errors.AddResult(subBaseUri, newCollectionResult.Result);
                    return;
                }

                // Move all subitems
                foreach (var entry in await moveCollection.GetItemsAsync(httpContext).ConfigureAwait(false))
                {
                    await MoveAsync(moveCollection, entry.Name, newCollectionResult.Collection, entry.Name, overwrite, httpContext, subBaseUri, errors);
                }

                // Delete the source collection
                var deleteResult = await sourceCollection.DeleteItemAsync(sourceName, httpContext);

                if (deleteResult != DavStatusCode.Ok)
                {
                    errors.AddResult(subBaseUri, newCollectionResult.Result);
                    return;
                }
            }
            else
            {
                // Items should be moved directly
                var result = await sourceCollection.MoveItemAsync(sourceName, destinationCollection, destinationName, overwrite, httpContext);

                if (result.Result != DavStatusCode.Created && result.Result != DavStatusCode.NoContent)
                {
                    errors.AddResult(subBaseUri, result.Result);
                    return;
                }
            }
        }
示例#10
0
        private async Task <DavStatusCode> DeleteItemAsync(IStoreCollection collection, string name, IHttpContext httpContext, Uri baseUri, UriResultCollection errors)
        {
            // Obtain the actual item
            var deleteCollection = await collection.GetItemAsync(name, httpContext).ConfigureAwait(false) as IStoreCollection;

            if (deleteCollection != null)
            {
                // Determine the new base URI
                var subBaseUri = UriHelper.Combine(baseUri, name);

                // Delete all entries first
                foreach (var entry in await deleteCollection.GetItemsAsync(httpContext).ConfigureAwait(false))
                {
                    await DeleteItemAsync(deleteCollection, entry.Name, httpContext, subBaseUri, errors);
                }
            }

            // Attempt to delete the item
            return(await collection.DeleteItemAsync(name, httpContext).ConfigureAwait(false));
        }
示例#11
0
        private async Task AddEntriesAsync(IStoreCollection collection, int depth, IHttpContext httpContext, Uri uri, IList <PropertyEntry> entries)
        {
            // Add the collection to the list
            entries.Add(new PropertyEntry(uri, collection));

            // If we have enough depth, then add the children
            if (depth > 0)
            {
                // Add all child collections
                foreach (var childEntry in await collection.GetItemsAsync(httpContext).ConfigureAwait(false))
                {
                    var subUri = UriHelper.Combine(uri, childEntry.Name);
                    if (childEntry is IStoreCollection subCollection)
                    {
                        await AddEntriesAsync(subCollection, depth - 1, httpContext, subUri, entries).ConfigureAwait(false);
                    }
                    else
                    {
                        entries.Add(new PropertyEntry(subUri, childEntry));
                    }
                }
            }
        }
示例#12
0
 public Task <StoreItemResult> MoveItemAsync(string sourceName, IStoreCollection destination, string destinationName, bool overwrite, IHttpContext context)
 {
     throw new NotImplementedException();
 }
        public async Task <StoreItemResult> MoveItemAsync(string sourceName, IStoreCollection destinationCollection, string destinationName, bool overwrite, IHttpContext httpContext)
        {
            // Return error
            if (!IsWritable)
            {
                return(new StoreItemResult(DavStatusCode.PreconditionFailed));
            }

            // Determine the object that is being moved
            var item = await GetItemAsync(sourceName, httpContext);

            if (item == null)
            {
                return(new StoreItemResult(DavStatusCode.NotFound));
            }

            // Check if the item is actually a file
            var storeItem = item as MailruStoreItem;

            if (storeItem != null)
            {
                // If the destination collection is a directory too, then we can simply move the file
                var destinationStoreCollection = destinationCollection as MailruStoreCollection;
                if (destinationStoreCollection != null)
                {
                    if (!destinationStoreCollection.IsWritable)
                    {
                        return(new StoreItemResult(DavStatusCode.PreconditionFailed));
                    }

                    // Check if the file already exists
                    DavStatusCode result;
                    var           itemexist = destinationStoreCollection.FindSubItem(destinationName);
                    if (itemexist != null)
                    {
                        if (!overwrite)
                        {
                            return(new StoreItemResult(DavStatusCode.Forbidden));
                        }

                        await Cloud.Instance.Remove(itemexist);

                        result = DavStatusCode.NoContent;
                    }
                    else
                    {
                        result = DavStatusCode.Created;
                    }

                    // Move the file
                    //await Cloud.Instance.Rename(FindSubItem(sourceName), destinationName);
                    if (destinationStoreCollection.FullPath == FullPath)
                    {
                        await Cloud.Instance.Rename(storeItem.FileInfo, destinationName);
                    }
                    else
                    {
                        await Cloud.Instance.Move(storeItem.FileInfo, destinationStoreCollection.FullPath);
                    }

                    return(new StoreItemResult(result, new MailruStoreItem(LockingManager, null, IsWritable)));
                }
                else
                {
                    // Attempt to copy the item to the destination collection
                    var result = await item.CopyAsync(destinationCollection, destinationName, overwrite, httpContext);

                    if (result.Result == DavStatusCode.Created || result.Result == DavStatusCode.NoContent)
                    {
                        await DeleteItemAsync(sourceName, httpContext);
                    }

                    // Return the result
                    return(result);
                }
            }

            // If it's not a plain item, then it's a collection
            Debug.Assert(item is MailruStoreCollection);

            // Collections will never be moved, but always be created
            // (we always move the individual items to make sure locking is checked properly)
            throw new InvalidOperationException("Collections should never be moved directly.");
        }
示例#14
0
 public bool SupportsFastMove(IStoreCollection destination, string destinationName, bool overwrite, IHttpContext httpContext)
 {
     // We can only move disk-store collections
     return(destination is DiskStoreCollection);
 }
示例#15
0
        public async Task <StoreItemResult> MoveItemAsync(string sourceName, IStoreCollection destinationCollection, string destinationName, bool overwrite, IHttpContext httpContext)
        {
            // Return error
            if (!IsWritable)
            {
                return(new StoreItemResult(DavStatusCode.PreconditionFailed));
            }

            // Determine the object that is being moved
            var item = await GetItemAsync(sourceName, httpContext);

            if (item == null)
            {
                return(new StoreItemResult(DavStatusCode.NotFound));
            }

            // Check if the item is actually a file
            var diskStoreItem = item as DiskStoreItem;

            if (diskStoreItem != null)
            {
                // If the destination collection is a directory too, then we can simply move the file
                var destinationDiskStoreCollection = destinationCollection as DiskStoreCollection;
                if (destinationDiskStoreCollection != null)
                {
                    // Return error
                    if (!destinationDiskStoreCollection.IsWritable)
                    {
                        return(new StoreItemResult(DavStatusCode.PreconditionFailed));
                    }

                    // Determine source and destination paths
                    var sourcePath      = Path.Combine(_directoryInfo.FullName, sourceName);
                    var destinationPath = Path.Combine(destinationDiskStoreCollection._directoryInfo.FullName, destinationName);

                    // Check if the file already exists
                    DavStatusCode result;
                    if (File.Exists(destinationPath))
                    {
                        // Remove the file if it already exists (if allowed)
                        if (!overwrite)
                        {
                            return(new StoreItemResult(DavStatusCode.Forbidden));
                        }

                        // The file will be overwritten
                        File.Delete(destinationPath);
                        result = DavStatusCode.NoContent;
                    }
                    else
                    {
                        // The file will be "created"
                        result = DavStatusCode.Created;
                    }

                    // Move the file
                    File.Move(sourcePath, destinationPath);
                    return(new StoreItemResult(result, new DiskStoreItem(LockingManager, new FileInfo(destinationPath), IsWritable)));
                }
                else
                {
                    // Attempt to copy the item to the destination collection
                    var result = await item.CopyAsync(destinationCollection, destinationName, overwrite, httpContext);

                    if (result.Result == DavStatusCode.Created || result.Result == DavStatusCode.NoContent)
                    {
                        await DeleteItemAsync(sourceName, httpContext);
                    }

                    // Return the result
                    return(result);
                }
            }

            // If it's not a plain item, then it's a collection
            Debug.Assert(item is DiskStoreCollection);

            // Collections will never be moved, but always be created
            // (we always move the individual items to make sure locking is checked properly)
            throw new InvalidOperationException("Collections should never be moved directly.");
        }
示例#16
0
 private static async Task <DavStatusCode> DeleteItemAsync(IStoreCollection collection, string name, IHttpContext httpContext)
 {
     // Attempt to delete the item
     return(await collection.DeleteItemAsync(name, httpContext).ConfigureAwait(false));
 }
示例#17
0
 public bool SupportsFastMove(IStoreCollection destination, string destinationName, bool overwrite, IHttpContext httpContext)
 {
     return(false);
 }
示例#18
0
 public virtual Task <StoreItemResult> CopyAsync(IStoreCollection destination, string name, bool overwrite, IHttpContext context)
 {
     throw new NotImplementedException();
 }
示例#19
0
 public DavDirectory(IStoreCollection parent, IDirectory coll) : base(parent, coll)
 {
     this.coll = coll;
 }
示例#20
0
 public Task <StoreItemResult> CopyAsync(IStoreCollection destination, string name, bool overwrite, IHttpContext httpContext, CancellationToken cancellationToken)
 {
     return(Task.FromResult(new StoreItemResult(DavStatusCode.NotImplemented)));
 }
示例#21
0
        public async Task <StoreItemResult> MoveItemAsync(string sourceName, IStoreCollection destinationCollection, string destinationName, bool overwrite, IHttpContext httpContext)
        {
            // Return error
            if (!IsWritable)
            {
                return(new StoreItemResult(DavStatusCode.PreconditionFailed));
            }

            // Determine the object that is being moved
            var item = await GetItemAsync(sourceName, httpContext);

            if (item == null)
            {
                return(new StoreItemResult(DavStatusCode.NotFound));
            }


            var destinationStoreCollection = destinationCollection as MailruStoreCollection;

            if (destinationStoreCollection != null)
            {
                if (!destinationStoreCollection.IsWritable)
                {
                    return(new StoreItemResult(DavStatusCode.PreconditionFailed));
                }

                var itemexist = destinationStoreCollection.FindSubItem(destinationName);

                DavStatusCode result;

                if (itemexist != null)
                {
                    if (!overwrite)
                    {
                        return(new StoreItemResult(DavStatusCode.Forbidden));
                    }

                    await Cloud.Instance(httpContext).Remove(itemexist);

                    result = DavStatusCode.NoContent;
                }
                else
                {
                    result = DavStatusCode.Created;
                }


                if (destinationStoreCollection.FullPath == FullPath)
                {
                    await Cloud.Instance(httpContext).Rename(item, destinationName);
                }
                else
                {
                    if (sourceName == destinationName || string.IsNullOrEmpty(destinationName))
                    {
                        await Cloud.Instance(httpContext).Move(item, destinationStoreCollection.FullPath);
                    }
                    else
                    {
                        var fi = ((MailruStoreItem)item).FileInfo;

                        string tmpName = Guid.NewGuid().ToString();
                        await Cloud.Instance(httpContext).Rename(item, tmpName);

                        fi.SetName(tmpName);

                        await Cloud.Instance(httpContext).Move(fi, destinationStoreCollection.FullPath);

                        fi.SetPath(destinationStoreCollection.FullPath);

                        await Cloud.Instance(httpContext).Rename(fi, destinationName);
                    }
                }

                return(new StoreItemResult(result, new MailruStoreItem(LockingManager, null, IsWritable)));
            }
            else
            {
                // Attempt to copy the item to the destination collection
                var result = await item.CopyAsync(destinationCollection, destinationName, overwrite, httpContext);

                if (result.Result == DavStatusCode.Created || result.Result == DavStatusCode.NoContent)
                {
                    await DeleteItemAsync(sourceName, httpContext);
                }

                return(result);
            }
        }
示例#22
0
文件: DavFile.cs 项目: bangush/Ovambo
 public DavFile(IStoreCollection parent, IFile doc) : base(parent, doc)
 {
     this.doc = doc;
 }
示例#23
0
 protected DavEntry(IStoreCollection parent, IEntry entry)
 {
     this.parent = parent;
     this.entry  = entry;
 }
示例#24
0
        public async Task <StoreItemResult> MoveItemAsync(string sourceName, IStoreCollection destinationCollection, string destinationName, bool overwrite, IHttpContext httpContext)
        {
            // Return error
            if (!IsWritable)
            {
                return(new StoreItemResult(DavStatusCode.PreconditionFailed));
            }

            // Determine the object that is being moved
            var item = await GetItemAsync(sourceName, httpContext).ConfigureAwait(false);

            if (item == null)
            {
                return(new StoreItemResult(DavStatusCode.NotFound));
            }

            // If the destination collection is a directory too, then we can simply move the file
            if (destinationCollection is DiskStoreCollection destinationDiskStoreCollection)
            {
                // Return error
                if (!destinationDiskStoreCollection.IsWritable)
                {
                    return(new StoreItemResult(DavStatusCode.PreconditionFailed));
                }

                // Determine source and destination paths
                var sourcePath      = Path.Combine(_directoryInfo.FullName, sourceName);
                var destinationPath = Path.Combine(destinationDiskStoreCollection._directoryInfo.FullName, destinationName);

                // Check if the file already exists
                DavStatusCode result;
                if (File.Exists(destinationPath))
                {
                    // Remove the file if it already exists (if allowed)
                    if (!overwrite)
                    {
                        return(new StoreItemResult(DavStatusCode.Forbidden));
                    }

                    // The file will be overwritten
                    File.Delete(destinationPath);
                    result = DavStatusCode.NoContent;
                }
                else if (Directory.Exists(destinationPath))
                {
                    // Remove the directory if it already exists (if allowed)
                    if (!overwrite)
                    {
                        return(new StoreItemResult(DavStatusCode.Forbidden));
                    }

                    // The file will be overwritten
                    Directory.Delete(destinationPath, true);
                    result = DavStatusCode.NoContent;
                }
                else
                {
                    // The file will be "created"
                    result = DavStatusCode.Created;
                }

                switch (item)
                {
                case DiskStoreItem _:
                    // Move the file
                    File.Move(sourcePath, destinationPath);
                    return(new StoreItemResult(result, new DiskStoreItem(LockingManager, new FileInfo(destinationPath), IsWritable)));

                case DiskStoreCollection _:
                    // Move the directory
                    Directory.Move(sourcePath, destinationPath);
                    return(new StoreItemResult(result, new DiskStoreCollection(LockingManager, new DirectoryInfo(destinationPath), IsWritable)));

                default:
                    // Invalid item
                    Debug.Fail($"Invalid item {item.GetType()} inside the {nameof(DiskStoreCollection)}.");
                    return(new StoreItemResult(DavStatusCode.InternalServerError));
                }
            }
            else
            {
                // Attempt to copy the item to the destination collection
                var result = await item.CopyAsync(destinationCollection, destinationName, overwrite, httpContext).ConfigureAwait(false);

                if (result.Result == DavStatusCode.Created || result.Result == DavStatusCode.NoContent)
                {
                    await DeleteItemAsync(sourceName, httpContext).ConfigureAwait(false);
                }

                // Return the result
                return(result);
            }
        }
示例#25
0
 public StoreCollectionResult(DavStatusCode result, IStoreCollection collection = null)
 {
     Result     = result;
     Collection = collection;
 }
示例#26
0
 private async Task <DavStatusCode> DeleteItemAsync(IStoreCollection collection, string name, IHttpContext httpContext, Uri baseUri, UriResultCollection errors)
 {
     // Attempt to delete the item
     return(await collection.DeleteItemAsync(name, httpContext).ConfigureAwait(false));
 }