Example #1
0
        public IEnumerable <BaseEntry> GetEntries(EnumerationFilter filter)
        {
            switch (filter)
            {
            case EnumerationFilter.Files:
            {
                return(entries.Values.OfType <FileEntry>());
            }

            case EnumerationFilter.Directories:
            {
                return(entries.Values.OfType <DirectoryEntry>());
            }

            case EnumerationFilter.All:
            {
                return(entries.Values);
            }

            default:
            {
                throw ErrorFactory.Internal.EnumValueUnsupported(filter);
            }
            }
        }
 /// <inheritdoc />
 protected override IEnumerable <(ShortHash key, ContentLocationEntry entry)> EnumerateEntriesWithSortedKeysFromStorage(
     CancellationToken token,
     EnumerationFilter filter = null)
 {
     return(_map
            .OrderBy(kvp => kvp.Key)
            .SkipWhile(kvp => filter?.StartingPoint != null && filter.StartingPoint > kvp.Key)
            .Where(kvp => filter?.ShouldEnumerate == null || filter.ShouldEnumerate?.Invoke(SerializeContentLocationEntry(kvp.Value)) == true)
            .Select(kvp => (kvp.Key, kvp.Value)));
 }
Example #3
0
 /// <inheritdoc />
 public override IEnumerable <(ShortHash key, ContentLocationEntry entry)> EnumerateEntriesWithSortedKeys(
     CancellationToken token,
     EnumerationFilter filter = null)
 {
     foreach (var kvp in _map)
     {
         if (filter == null || filter(Serialize(kvp.Value)))
         {
             yield return(kvp.Key, kvp.Value);
         }
     }
 }
Example #4
0
        private async Task <EnumerationResult> KvpbaseEnumerate(string prefix, string continuationToken)
        {
            int startIndex = 0;
            int count      = 1000;

            if (!String.IsNullOrEmpty(continuationToken))
            {
                if (!KvpbaseParseContinuationToken(continuationToken, out startIndex, out count))
                {
                    throw new ArgumentException("Unable to parse continuation token.");
                }
            }

            ContainerMetadata cmd = null;
            EnumerationResult ret = new EnumerationResult();

            try
            {
                if (String.IsNullOrEmpty(prefix))
                {
                    cmd = await _Kvpbase.EnumerateContainer(_KvpbaseSettings.Container, startIndex, count);
                }
                else
                {
                    EnumerationFilter filter = new EnumerationFilter();
                    filter.Prefix = prefix;
                    cmd           = await _Kvpbase.EnumerateContainer(filter, _KvpbaseSettings.Container, startIndex, count);
                }
            }
            catch (Exception)
            {
                throw new IOException("Unable to enumerate objects.");
            }

            ret.NextContinuationToken = KvpbaseBuildContinuationToken(startIndex + count, count);

            if (cmd.Objects != null && cmd.Objects.Count > 0)
            {
                foreach (ObjectMetadata curr in cmd.Objects)
                {
                    BlobMetadata md = new BlobMetadata();
                    md.Key           = curr.ObjectKey;
                    md.ETag          = curr.Md5;
                    md.ContentLength = Convert.ToInt64(curr.ContentLength);
                    md.ContentType   = curr.ContentType;
                    md.Created       = curr.CreatedUtc.Value;
                    ret.Blobs.Add(md);
                }
            }

            return(ret);
        }
        public DirectoryEnumerateEntriesArguments([NotNull] AbsolutePath path, [NotNull] string incomingPath,
                                                  [NotNull] string searchPattern, SearchOption searchOption, EnumerationFilter filter)
        {
            Guard.NotNull(path, nameof(path));
            Guard.NotNull(incomingPath, nameof(incomingPath));
            Guard.NotNull(searchPattern, nameof(searchPattern));

            Path          = path;
            IncomingPath  = incomingPath;
            SearchPattern = searchPattern;
            SearchOption  = searchOption;
            Filter        = filter;
        }
 /// <inheritdoc />
 protected override IEnumerable <(ShortHash key, ContentLocationEntry entry)> EnumerateEntriesWithSortedKeysFromStorage(
     CancellationToken token,
     EnumerationFilter filter = null)
 {
     return(_map
            // Directly calling OrderBy on ConcurrentDictionary instance is not thread-safe.
            // Making a copy by calling instance ToArray method first.
            .ToArray()
            .OrderBy(kvp => kvp.Key)
            .SkipWhile(kvp => filter?.StartingPoint != null && filter.StartingPoint > kvp.Key)
            .Where(kvp => filter?.ShouldEnumerate == null || filter.ShouldEnumerate?.Invoke(SerializeContentLocationEntry(kvp.Value)) == true)
            .Select(kvp => (kvp.Key, kvp.Value)));
 }
        public IEnumerable <BaseEntry> GetEntries(EnumerationFilter filter)
        {
            switch (filter)
            {
            case EnumerationFilter.Files:
                return(entries.Values.OfType <FileEntry>());

            case EnumerationFilter.Directories:
                return(entries.Values.OfType <DirectoryEntry>());

            case EnumerationFilter.All:
                return(entries.Values);

            default:
                throw new NotSupportedException($"Unsupported filter '{filter}'.");
            }
        }
        /// <inheritdoc />
        protected override IEnumerable <(ShortHash key, ContentLocationEntry entry)> EnumerateEntriesWithSortedKeysFromStorage(
            OperationContext context,
            EnumerationFilter valueFilter,
            bool returnKeysOnly)
        {
            return(_map
                   // Directly calling OrderBy on ConcurrentDictionary instance is not thread-safe.
                   // Making a copy by calling instance ToArray method first.
                   .ToArray()
                   .OrderBy(kvp => kvp.Key)
                   .SkipWhile(kvp => valueFilter?.StartingPoint != null && valueFilter.StartingPoint > kvp.Key)
                   .Where(kvp => {
                if (returnKeysOnly)
                {
                    return true;
                }

                return valueFilter?.ShouldEnumerate == null || valueFilter.ShouldEnumerate?.Invoke(SerializeContentLocationEntry(kvp.Value)) == true;
            })
                   .Select(kvp => (kvp.Key, returnKeysOnly ? null : kvp.Value)));
        }
Example #9
0
        internal static async Task HttpPutContainer(RequestMetadata md)
        {
            string header = _Header + md.Http.Request.SourceIp + ":" + md.Http.Request.SourcePort + " ";

            if (md.User == null)
            {
                _Logging.Warn(header + "HttpPutContainer no authentication material");
                md.Http.Response.StatusCode  = 401;
                md.Http.Response.ContentType = "application/json";
                await md.Http.Response.Send(Common.SerializeJson(new ErrorResponse(3, 401, null, null), true));

                return;
            }

            if (md.Http.Request.RawUrlEntries.Count != 2)
            {
                _Logging.Warn(header + "HttpPutContainer request URL does not have two entries");
                md.Http.Response.StatusCode  = 400;
                md.Http.Response.ContentType = "application.json";
                await md.Http.Response.Send(Common.SerializeJson(new ErrorResponse(2, 400, "URL path must be of the form /[user]/[container]/[key].", null), true));

                return;
            }

            if (!md.Params.UserGuid.ToLower().Equals(md.User.GUID.ToLower()))
            {
                _Logging.Warn(header + "HttpPutContainer user " + md.User.GUID + " attempting to PUT container in user " + md.Params.UserGuid);
                md.Http.Response.StatusCode  = 401;
                md.Http.Response.ContentType = "application/json";
                await md.Http.Response.Send(Common.SerializeJson(new ErrorResponse(3, 401, null, null), true));

                return;
            }

            ContainerClient client = null;

            if (!_ContainerMgr.GetContainerClient(md.Params.UserGuid, md.Params.ContainerName, out client))
            {
                _Logging.Warn(header + "HttpPutContainer unable to find container " + md.Params.UserGuid + "/" + md.Params.ContainerName);
                md.Http.Response.StatusCode  = 404;
                md.Http.Response.ContentType = "application/json";
                await md.Http.Response.Send(Common.SerializeJson(new ErrorResponse(5, 404, null, null), true));

                return;
            }

            if (md.Params.AuditLog)
            {
                #region Audit-Log

                int count = 100;
                int index = 0;
                if (md.Params.Count != null)
                {
                    count = Convert.ToInt32(md.Params.Count);
                }
                if (md.Params.Index != null)
                {
                    index = Convert.ToInt32(md.Params.Index);
                }

                List <AuditLogEntry> entries = client.GetAuditLogEntries(
                    md.Params.AuditKey,
                    md.Params.Action,
                    count,
                    index,
                    md.Params.CreatedBefore,
                    md.Params.CreatedAfter);

                md.Http.Response.StatusCode  = 200;
                md.Http.Response.ContentType = "application/json";
                await md.Http.Response.Send(Common.SerializeJson(entries, true));

                return;

                #endregion
            }
            else if (md.Params.Keys)
            {
                #region Update-Keys

                Dictionary <string, string> keys = null;

                if (md.Http.Request.Data != null && md.Http.Request.ContentLength > 0)
                {
                    byte[] reqData = Common.StreamToBytes(md.Http.Request.Data);

                    try
                    {
                        keys = Common.DeserializeJson <Dictionary <string, string> >(reqData);
                    }
                    catch (Exception)
                    {
                        _Logging.Warn(header + "HttpPutContainer unable to deserialize request body");
                        md.Http.Response.StatusCode  = 400;
                        md.Http.Response.ContentType = "application/json";
                        await md.Http.Response.Send(Common.SerializeJson(new ErrorResponse(9, 400, null, null), true));

                        return;
                    }
                }

                client.WriteContainerKeyValuePairs(keys);
                md.Http.Response.StatusCode = 201;
                await md.Http.Response.Send();

                return;

                #endregion
            }
            else if (md.Params.Search)
            {
                #region Search

                #region Deserialize-Request-Body

                EnumerationFilter filter = null;

                if (md.Http.Request.Data != null && md.Http.Request.ContentLength > 0)
                {
                    byte[] reqData = Common.StreamToBytes(md.Http.Request.Data);

                    try
                    {
                        filter = Common.DeserializeJson <EnumerationFilter>(reqData);
                    }
                    catch (Exception)
                    {
                        _Logging.Warn(header + "HttpPutContainer unable to deserialize request body");
                        md.Http.Response.StatusCode  = 400;
                        md.Http.Response.ContentType = "application/json";
                        await md.Http.Response.Send(Common.SerializeJson(new ErrorResponse(9, 400, null, null), true));

                        return;
                    }
                }

                #endregion

                #region Enumerate-and-Return

                int?index = null;
                if (md.Params.Index != null)
                {
                    index = Convert.ToInt32(md.Params.Index);
                }

                int?count = null;
                if (md.Params.Count != null)
                {
                    count = Convert.ToInt32(md.Params.Count);
                }

                ContainerMetadata meta = client.Enumerate(
                    (int?)md.Params.Index,
                    (int?)md.Params.Count,
                    filter,
                    md.Params.OrderBy);

                if (md.Params.Html)
                {
                    md.Http.Response.StatusCode  = 200;
                    md.Http.Response.ContentType = "text/html";
                    await md.Http.Response.Send(DirectoryListingPage(meta));

                    return;
                }
                else
                {
                    md.Http.Response.StatusCode  = 200;
                    md.Http.Response.ContentType = "application/json";
                    await md.Http.Response.Send(Common.SerializeJson(meta, true));

                    return;
                }

                #endregion

                #endregion
            }
            else
            {
                #region Update

                #region Deserialize-Request-Body

                Container container = null;

                if (md.Http.Request.Data != null && md.Http.Request.ContentLength > 0)
                {
                    byte[] reqData = Common.StreamToBytes(md.Http.Request.Data);

                    try
                    {
                        container = Common.DeserializeJson <Container>(reqData);
                    }
                    catch (Exception)
                    {
                        _Logging.Warn(header + "HttpPutContainer unable to deserialize request body");
                        md.Http.Response.StatusCode  = 400;
                        md.Http.Response.ContentType = "application/json";
                        await md.Http.Response.Send(Common.SerializeJson(new ErrorResponse(9, 400, null, null), true));

                        return;
                    }
                }

                if (container == null)
                {
                    _Logging.Warn(header + "HttpPutContainer no request body");
                    md.Http.Response.StatusCode  = 400;
                    md.Http.Response.ContentType = "application.json";
                    await md.Http.Response.Send(Common.SerializeJson(new ErrorResponse(2, 400, "No container settings found in request body.", null), true));

                    return;
                }

                #endregion

                #region Update

                _DatabaseMgr.Update <Container>(container);
                _ContainerMgr.Delete(container.UserGUID, container.Name, false);
                _ContainerMgr.Add(container);

                md.Http.Response.StatusCode = 200;
                await md.Http.Response.Send();

                return;

                #endregion

                #endregion
            }
        }
Example #10
0
        public static async Task HttpGetContainer(RequestMetadata md)
        {
            string header = md.Http.Request.SourceIp + ":" + md.Http.Request.SourcePort + " ";

            #region Retrieve-Container

            ContainerClient client = null;
            if (!_ContainerMgr.GetContainerClient(md.Params.UserGuid, md.Params.ContainerName, out client))
            {
                _Logging.Warn(header + "HttpGetContainer unable to find container " + md.Params.UserGuid + "/" + md.Params.ContainerName);
                md.Http.Response.StatusCode  = 404;
                md.Http.Response.ContentType = "application/json";
                await md.Http.Response.Send(Common.SerializeJson(new ErrorResponse(5, 404, null, null), true));

                return;
            }

            #endregion

            #region Authenticate-and-Authorize

            if (!client.Container.IsPublicRead)
            {
                if (md.User == null || !(md.User.GUID.ToLower().Equals(md.Params.UserGuid.ToLower())))
                {
                    _Logging.Warn(header + "HttpGetContainer unauthorized unauthenticated access attempt to container " + md.Params.UserGuid + "/" + md.Params.ContainerName);
                    md.Http.Response.StatusCode  = 401;
                    md.Http.Response.ContentType = "application/json";
                    await md.Http.Response.Send(Common.SerializeJson(new ErrorResponse(3, 401, null, null), true));

                    return;
                }
            }

            if (md.Perm != null)
            {
                if (!md.Perm.ReadContainer)
                {
                    _Logging.Warn(header + "HttpGetContainer unauthorized access attempt to container " + md.Params.UserGuid + "/" + md.Params.ContainerName);
                    md.Http.Response.StatusCode  = 401;
                    md.Http.Response.ContentType = "application/json";
                    await md.Http.Response.Send(Common.SerializeJson(new ErrorResponse(3, 401, null, null), true));

                    return;
                }
            }

            #endregion

            #region Process

            if (md.Params.Config)
            {
                md.Http.Response.StatusCode  = 200;
                md.Http.Response.ContentType = "application/json";
                await md.Http.Response.Send(Common.SerializeJson(client.Container, true));

                return;
            }

            EnumerationFilter filter = EnumerationFilter.FromRequestMetadata(md);

            ContainerMetadata meta = client.Enumerate(
                (int?)md.Params.Index,
                (int?)md.Params.Count,
                filter,
                md.Params.OrderBy);

            if (md.Params.Keys)
            {
                Dictionary <string, string> vals = new Dictionary <string, string>();
                client.ReadContainerKeyValues(out vals);
                md.Http.Response.StatusCode  = 200;
                md.Http.Response.ContentType = "application/json";
                await md.Http.Response.Send(Common.SerializeJson(vals, true));

                return;
            }
            else if (md.Params.Html)
            {
                md.Http.Response.StatusCode  = 200;
                md.Http.Response.ContentType = "text/html";
                await md.Http.Response.Send(DirectoryListingPage(meta));

                return;
            }
            else
            {
                md.Http.Response.StatusCode  = 200;
                md.Http.Response.ContentType = "application/json";
                await md.Http.Response.Send(Common.SerializeJson(meta, true));

                return;
            }

            #endregion
        }
        private IEnumerable <string> EnumerateEntriesInDirectory([NotNull] DirectoryEntry directory, [NotNull] PathPattern pattern,
                                                                 [NotNull] AbsolutePath directoryPath, SearchOption searchOption, EnumerationFilter filter)
        {
            PathPattern subPattern = pattern.SubPattern;

            if (subPattern == null)
            {
                Container.ChangeTracker.NotifyContentsAccessed(directory.PathFormatter, FileAccessKinds.Read);

                foreach (BaseEntry entry in directory.EnumerateEntries(filter).Where(x => pattern.IsMatch(x.Name))
                         .OrderBy(x => x.Name))
                {
                    string basePath = directoryPath.GetText();
                    yield return(Path.Combine(basePath, entry.Name));
                }

                if (searchOption == SearchOption.AllDirectories)
                {
                    foreach (DirectoryEntry subdirectory in directory.Directories)
                    {
                        AbsolutePath subdirectoryPath = directoryPath.Append(subdirectory.Name);
                        foreach (string nextPath in EnumerateEntriesInDirectory(subdirectory, pattern, subdirectoryPath,
                                                                                searchOption, filter))
                        {
                            yield return(nextPath);
                        }
                    }
                }
            }
            else
            {
                foreach (DirectoryEntry subdirectory in directory.Directories)
                {
                    if (pattern.IsMatch(subdirectory.Name))
                    {
                        AbsolutePath subdirectoryPath = directoryPath.Append(subdirectory.Name);
                        foreach (string nextPath in EnumerateEntriesInDirectory(subdirectory, subPattern, subdirectoryPath,
                                                                                searchOption, filter))
                        {
                            yield return(nextPath);
                        }
                    }
                }
            }
        }
Example #12
0
        public IEnumerable <BaseEntry> EnumerateEntries(EnumerationFilter filter)
        {
            UpdateLastAccessTime();

            return(contents.GetEntries(filter));
        }