Esempio n. 1
0
        private async Task <JObject> ExecuteUmaAuthPolicies(ElFinderParameter elFinderParameter)
        {
            if (string.IsNullOrWhiteSpace(elFinderParameter.Target))
            {
                return(new ErrorResponse(string.Format(Constants.Errors.ErrParamNotSpecified, Constants.ElFinderDtoNames.Target)).GetJson());
            }

            if (string.IsNullOrWhiteSpace(elFinderParameter.ResourceId))
            {
                return(new ErrorResponse(string.Format(Constants.Errors.ErrParamNotSpecified, Constants.ElFinderDtoNames.ResourceId)).GetJson());
            }

            var asset = await _assetRepository.Get(elFinderParameter.Target);

            if (asset == null)
            {
                return(new ErrorResponse(Constants.ElFinderErrors.ErrTrgFolderNotFound).GetJson());
            }

            asset.AuthPolicyIds = elFinderParameter.AuthPolicyIds;
            await _assetRepository.Update(new[] { asset });

            var jObj = new JObject();

            return(jObj);
        }
Esempio n. 2
0
        /// <summary>
        /// https://github.com/Studio-42/elFinder/wiki/Client-Server-API-2.0#rm
        /// </summary>
        /// <param name="elFinderParameter"></param>
        /// <returns></returns>
        private async Task <JObject> ExecuteRm(ElFinderParameter elFinderParameter)
        {
            var targets = elFinderParameter.Targets;
            var assets  = await _assetRepository.Search(new SearchAssetsParameter
            {
                HashLst = targets
            });

            if (assets.Count() != targets.Count())
            {
                return(new ErrorResponse(Constants.Errors.ErrTargetsNotFound).GetJson());
            }

            if (!await _assetRepository.Remove(targets))
            {
                return(new ErrorResponse(Constants.Errors.ErrRemoveAssets).GetJson());
            }

            /*
             * foreach(var asset in assets)
             * {
             *  await Remove(asset);
             * }
             */

            var removed = new JArray(targets);
            var result  = new JObject();

            result.Add(Constants.ElFinderResponseNames.Removed, removed);
            return(result);
        }
Esempio n. 3
0
        /// <summary>
        /// https://github.com/Studio-42/elFinder/wiki/Client-Server-API-2.0#parents
        /// </summary>
        /// <param name="elFinderParameter"></param>
        /// <returns></returns>
        private async Task <JObject> ExecuteParents(ElFinderParameter elFinderParameter)
        {
            var target = elFinderParameter.Target;

            if (string.IsNullOrWhiteSpace(target))
            {
                return(new ErrorResponse(string.Format(Constants.Errors.ErrParamNotSpecified, Constants.ElFinderDtoNames.Target)).GetJson());
            }

            var asset = await _assetRepository.Get(target);

            if (asset == null)
            {
                return(new ErrorResponse(Constants.ElFinderErrors.ErrTrgFolderNotFound).GetJson());
            }

            var parents = await _assetRepository.GetAllParents(target);

            var files = new JArray();

            foreach (var parent in parents)
            {
                files.Add(GetFile(parent));
            }

            var result = new JObject();

            result.Add(Constants.ElFinderResponseNames.Tree, files);
            return(result);
        }
Esempio n. 4
0
        public async Task <IActionResult> Index([FromBody] JObject json)
        {
            if (json == null)
            {
                throw new ArgumentNullException(nameof(json));
            }

            var deserializedParameter = ElFinderParameter.Deserialize(json); // 1. Extract the parameter.

            if (deserializedParameter.ErrorResponse != null)
            {
                return(new OkObjectResult(deserializedParameter.ErrorResponse.GetJson()));
            }

            switch (deserializedParameter.ElFinderParameter.Command)
            {
            case ElFinderCommands.Open:
                return(new OkObjectResult(await ExecuteOpen(deserializedParameter.ElFinderParameter)));

            case ElFinderCommands.Parents:
                return(new OkObjectResult(await ExecuteParents(deserializedParameter.ElFinderParameter)));

            case ElFinderCommands.Mkdir:
                return(new OkObjectResult(await ExecuteMkdir(deserializedParameter.ElFinderParameter)));

            case ElFinderCommands.Rm:
                return(new OkObjectResult(await ExecuteRm(deserializedParameter.ElFinderParameter)));

            case ElFinderCommands.Rename:
                return(new OkObjectResult(await ExecuteRename(deserializedParameter.ElFinderParameter)));

            case ElFinderCommands.Mkfile:
                return(new OkObjectResult(await ExecuteMkfile(deserializedParameter.ElFinderParameter)));

            case ElFinderCommands.Tree:
                return(new OkObjectResult(await ExecuteTree(deserializedParameter.ElFinderParameter)));

            case ElFinderCommands.Duplicate:
                return(new OkObjectResult(await ExecuteDuplicate(deserializedParameter.ElFinderParameter)));

            case ElFinderCommands.Paste:
                return(new OkObjectResult(await ExecutePaste(deserializedParameter.ElFinderParameter)));

            case ElFinderCommands.Ls:
                return(new OkObjectResult(await ExecuteLs(deserializedParameter.ElFinderParameter)));

            case ElFinderCommands.Search:
                return(new OkObjectResult(await ExecuteSearch(deserializedParameter.ElFinderParameter)));

            case ElFinderCommands.UmaResource:
                return(new OkObjectResult(await ExecuteUmaResource(deserializedParameter.ElFinderParameter)));

            case ElFinderCommands.UmaPolicies:
                return(new OkObjectResult(await ExecuteUmaAuthPolicies(deserializedParameter.ElFinderParameter)));
            }

            return(new OkResult());
        }
Esempio n. 5
0
        /// <summary>
        /// https://github.com/Studio-42/elFinder/wiki/Client-Server-API-2.0#tree
        /// </summary>
        /// <param name="elFinderParameter"></param>
        /// <returns></returns>
        private async Task <JObject> ExecuteTree(ElFinderParameter elFinderParameter)
        {
            if (string.IsNullOrWhiteSpace(elFinderParameter.Target))
            {
                return(new ErrorResponse(string.Format(Constants.Errors.ErrParamNotSpecified, Constants.ElFinderDtoNames.Target)).GetJson());
            }

            var targetedAsset = await _assetRepository.Get(elFinderParameter.Target);

            if (targetedAsset == null)
            {
                return(new ErrorResponse(Constants.ElFinderErrors.ErrTrgFolderNotFound).GetJson());
            }

            var assets = new List <AssetAggregate>();

            assets.Add(targetedAsset);
            foreach (var child in targetedAsset.Children)
            {
                assets.Add(child);
            }

            var parents = await _assetRepository.GetAllParents(elFinderParameter.Target);

            foreach (var parent in parents)
            {
                if (!assets.Any(a => a.Hash == parent.Hash))
                {
                    assets.Add(parent);
                }

                foreach (var child in parent.Children)
                {
                    if (assets.Any(a => a.Hash == child.Hash))
                    {
                        continue;
                    }
                    assets.Add(child);
                }
            }

            var files = new JArray();

            foreach (var asset in assets)
            {
                files.Add(GetFile(asset));
            }

            var result = new JObject();

            result.Add(Constants.ElFinderResponseNames.Tree, files);
            return(result);
        }
Esempio n. 6
0
        /// <summary>
        /// https://github.com/Studio-42/elFinder/wiki/Client-Server-API-2.0#rename
        /// </summary>
        /// <param name="elFinderParameter"></param>
        /// <returns></returns>
        private async Task <JObject> ExecuteRename(ElFinderParameter elFinderParameter)
        {
            var target = elFinderParameter.Target;

            if (string.IsNullOrWhiteSpace(target))
            {
                return(new ErrorResponse(string.Format(Constants.Errors.ErrParamNotSpecified, Constants.ElFinderDtoNames.Target)).GetJson());
            }

            var asset = await _assetRepository.Get(target); // 1. Check the asset exists.

            if (asset == null)
            {
                return(new ErrorResponse(Constants.ElFinderErrors.ErrTrgFolderNotFound).GetJson());
            }

            var children = await _assetRepository.GetAllChildren(target); // 2. Get all the children & remove the assets.

            var assetIds = new List <string> {
                asset.Hash
            };

            assetIds.AddRange(children.Select(c => c.Hash));
            if (!await _assetRepository.Remove(assetIds))
            {
                return(new ErrorResponse(Constants.Errors.ErrRemoveAssets).GetJson());
            }

            Rename(asset, elFinderParameter.Name, children);
            var newAssets = new List <AssetAggregate> {
                asset
            };

            newAssets.AddRange(children);
            if (!await _assetRepository.Add(newAssets))
            {
                return(new ErrorResponse(Constants.Errors.ErrInsertAsset).GetJson());
            }

            var removed = new JArray(assetIds);
            var added   = new JArray();

            foreach (var newAsset in newAssets)
            {
                added.Add(GetFile(newAsset));
            }

            var result = new JObject();

            result.Add(Constants.ElFinderResponseNames.Removed, removed);
            result.Add(Constants.ElFinderResponseNames.Added, added);
            return(result);
        }
Esempio n. 7
0
        /// <summary>
        /// https://github.com/Studio-42/elFinder/wiki/Client-Server-API-2.0#duplicate
        /// </summary>
        /// <param name="elFinderParameter"></param>
        /// <returns></returns>
        private async Task <JObject> ExecuteDuplicate(ElFinderParameter elFinderParameter)
        {
            if (elFinderParameter.Targets == null)
            {
                return(new ErrorResponse(string.Format(Constants.Errors.ErrParamNotSpecified, Constants.ElFinderDtoNames.Targets)).GetJson());
            }

            var targetAssets = await _assetRepository.Search(new SearchAssetsParameter
            {
                HashLst = elFinderParameter.Targets
            });

            if (targetAssets.Count() != elFinderParameter.Targets.Count())
            {
                return(new ErrorResponse(Constants.Errors.ErrTargetsNotFound).GetJson());
            }

            var tasks = new List <Task <KeyValuePair <bool, IEnumerable <AssetAggregate> > > >();

            foreach (var targetAsset in targetAssets)
            {
                tasks.Add(Duplicate(targetAsset));
            }

            var result = await Task.WhenAll(tasks);

            if (result.Any(b => !b.Key))
            {
                return(new ErrorResponse(Constants.Errors.ErrDuplicateAsset).GetJson());
            }

            var files = new JArray();

            foreach (var kvp in result)
            {
                foreach (var assetAgg in kvp.Value)
                {
                    files.Add(GetFile(assetAgg));
                }
            }

            var resp = new JObject();

            resp.Add(Constants.ElFinderResponseNames.Added, files);
            return(resp);
        }
Esempio n. 8
0
        /// <summary>
        /// https://github.com/Studio-42/elFinder/wiki/Client-Server-API-2.0#search
        /// </summary>
        /// <param name="elFinderParameter"></param>
        /// <returns></returns>
        private async Task <JObject> ExecuteSearch(ElFinderParameter elFinderParameter)
        {
            if (string.IsNullOrWhiteSpace(elFinderParameter.Q))
            {
                return(new ErrorResponse(string.Format(Constants.Errors.ErrParamNotSpecified, Constants.ElFinderDtoNames.Q)).GetJson());
            }

            var target = elFinderParameter.Target;
            IEnumerable <AssetAggregate> assets;

            if (!string.IsNullOrWhiteSpace(target))
            {
                var targetAsset = await _assetRepository.Get(target);

                if (targetAsset == null)
                {
                    return(new ErrorResponse(Constants.ElFinderErrors.ErrTrgFolderNotFound).GetJson());
                }

                var children = await _assetRepository.GetAllChildren(target);

                assets = children.Where(c => c.Name.Contains(elFinderParameter.Q));
            }
            else
            {
                assets = await _assetRepository.Search(new SearchAssetsParameter
                {
                    Names = new[] { elFinderParameter.Q }
                });
            }

            var files = new JArray();

            foreach (var asset in assets)
            {
                files.Add(GetFile(asset));
            }

            var jObj = new JObject();

            jObj.Add(Constants.ElFinderResponseNames.Files, files);
            return(jObj);
        }
Esempio n. 9
0
        /// <summary>
        /// https://github.com/Studio-42/elFinder/wiki/Client-Server-API-2.0#ls
        /// </summary>
        /// <param name="elFinderParameter"></param>
        /// <returns></returns>
        private async Task <JObject> ExecuteLs(ElFinderParameter elFinderParameter)
        {
            if (string.IsNullOrWhiteSpace(elFinderParameter.Target))
            {
                return(new ErrorResponse(string.Format(Constants.Errors.ErrParamNotSpecified, Constants.ElFinderDtoNames.Target)).GetJson());
            }

            var targetAsset = await _assetRepository.Get(elFinderParameter.Target);

            if (targetAsset == null)
            {
                return(new ErrorResponse(Constants.ElFinderErrors.ErrTrgFolderNotFound).GetJson());
            }

            var jObj = new JObject();

            jObj.Add(Constants.ElFinderResponseNames.List, new JArray(targetAsset.Children.Select(c => c.Name)));
            return(jObj);
        }
Esempio n. 10
0
        /// <summary>
        /// https://github.com/Studio-42/elFinder/wiki/Client-Server-API-2.0#mkfile
        /// </summary>
        /// <param name="elFinderParameter"></param>
        /// <returns></returns>
        private async Task <JObject> ExecuteMkfile(ElFinderParameter elFinderParameter)
        {
            var target = elFinderParameter.Target;

            if (string.IsNullOrWhiteSpace(target))
            {
                return(new ErrorResponse(string.Format(Constants.Errors.ErrParamNotSpecified, Constants.ElFinderDtoNames.Target)).GetJson());
            }

            var asset = await _assetRepository.Get(target);

            if (asset == null)
            {
                return(new ErrorResponse(Constants.ElFinderErrors.ErrTrgFolderNotFound).GetJson());
            }

            var recordPath = asset.Path + Constants.PathSeparator + elFinderParameter.Name;
            var record     = new AssetAggregate
            {
                CanRead            = true,
                CanWrite           = true,
                IsLocked           = false,
                Name               = elFinderParameter.Name,
                CreatedAt          = DateTime.UtcNow,
                ResourceParentHash = asset.Hash,
                Path               = recordPath,
                Hash               = HashHelper.GetHash(recordPath),
                MimeType           = Constants.MimeNames.TextPlain
            };

            if (!(await _assetRepository.Add(new[] { record })))
            {
                return(new ErrorResponse(Constants.Errors.ErrInsertAsset).GetJson());
            }

            var files  = new JArray(GetFile(record));
            var result = new JObject();

            result.Add(Constants.ElFinderResponseNames.Added, files);
            return(result);
        }
Esempio n. 11
0
        /// <summary>
        /// https://github.com/Studio-42/elFinder/wiki/Client-Server-API-2.0#paste
        /// </summary>
        /// <param name="elFinderParameter"></param>
        /// <returns></returns>
        private async Task <JObject> ExecutePaste(ElFinderParameter elFinderParameter)
        {
            if (string.IsNullOrWhiteSpace(elFinderParameter.Source))
            {
                return(new ErrorResponse(string.Format(Constants.Errors.ErrParamNotSpecified, Constants.ElFinderDtoNames.Source)).GetJson());
            }

            if (string.IsNullOrWhiteSpace(elFinderParameter.Destination))
            {
                return(new ErrorResponse(string.Format(Constants.Errors.ErrParamNotSpecified, Constants.ElFinderDtoNames.Destination)).GetJson());
            }

            if (elFinderParameter.Targets == null)
            {
                return(new ErrorResponse(string.Format(Constants.Errors.ErrParamNotSpecified, Constants.ElFinderDtoNames.Targets)).GetJson());
            }

            var sourceAsset = await _assetRepository.Get(elFinderParameter.Source);

            if (sourceAsset == null)
            {
                return(new ErrorResponse(Constants.ElFinderErrors.ErrTrgFolderNotFound).GetJson());
            }

            var destinationAsset = await _assetRepository.Get(elFinderParameter.Destination);

            if (destinationAsset == null)
            {
                return(new ErrorResponse(Constants.ElFinderErrors.ErrTrgFolderNotFound).GetJson());
            }

            var assets = await _assetRepository.Search(new SearchAssetsParameter
            {
                HashLst = elFinderParameter.Targets
            });

            if (assets.Count() != elFinderParameter.Targets.Count())
            {
                return(new ErrorResponse(Constants.Errors.ErrTargetsNotFound).GetJson());
            }

            var tasks = new List <Task <PasteOperation> >();

            foreach (var asset in assets)
            {
                tasks.Add(Copy(asset, sourceAsset, destinationAsset, elFinderParameter.Cut));
            }

            var tasksResult = await Task.WhenAll(tasks);

            if (tasksResult.Any(t => t.IsError))
            {
                if (elFinderParameter.Cut)
                {
                    return(new ErrorResponse(Constants.Errors.ErrCutAsset).GetJson());
                }
                else
                {
                    return(new ErrorResponse(Constants.Errors.ErrPasteAsset).GetJson());
                }
            }

            var added   = new JArray();
            var removed = new JArray();

            foreach (var kvp in tasksResult)
            {
                foreach (var r in kvp.Removed)
                {
                    removed.Add(r);
                }

                foreach (var a in kvp.Added)
                {
                    added.Add(GetFile(a));
                }
            }

            var jObj = new JObject();

            jObj.Add(Constants.ElFinderResponseNames.Added, added);
            jObj.Add(Constants.ElFinderResponseNames.Removed, removed);
            return(jObj);
        }
Esempio n. 12
0
        /// <summary>
        /// https://github.com/Studio-42/elFinder/wiki/Client-Server-API-2.0#open
        /// </summary>
        /// <param name="elFinderParameter"></param>
        /// <returns></returns>
        private async Task <JObject> ExecuteOpen(ElFinderParameter elFinderParameter)
        {
            if (!elFinderParameter.Init && string.IsNullOrWhiteSpace(elFinderParameter.Target))
            {
                return(new ErrorResponse(string.Format(Constants.Errors.ErrParamNotSpecified, Constants.ElFinderDtoNames.Target)).GetJson());
            }

            var            assets        = new List <AssetAggregate>();
            AssetAggregate rootDirectory = null;

            if (!string.IsNullOrWhiteSpace(elFinderParameter.Target)) // Search the target.
            {
                rootDirectory = await _assetRepository.Get(elFinderParameter.Target);
            }

            if (elFinderParameter.Init || rootDirectory == null) // Returns the default root directory of the default volume.
            {
                var searchRootParameter = new SearchAssetsParameter
                {
                    AssetLevelType            = AssetLevelTypes.ROOT,
                    IsDefaultWorkingDirectory = true
                };
                rootDirectory = (await _assetRepository.Search(searchRootParameter)).First();
            }

            assets.Add(rootDirectory);
            foreach (var child in rootDirectory.Children)
            {
                assets.Add(child);
            }

            if (elFinderParameter.Tree)
            {
                var searchRootParameter = new SearchAssetsParameter // Search all the roots.
                {
                    AssetLevelType  = AssetLevelTypes.ROOT,
                    ExcludedHashLst = assets.Select(a => a.Hash)
                };
                var searchResult = await _assetRepository.Search(searchRootParameter);

                foreach (var record in searchResult)
                {
                    assets.Add(record);
                    foreach (var child in record.Children)
                    {
                        if (assets.Any(a => a.Hash == child.Hash))
                        {
                            continue;
                        }
                        assets.Add(child);
                    }
                }
                if (!string.IsNullOrWhiteSpace(elFinderParameter.Target)) // Search the parents.
                {
                    var parents = await _assetRepository.GetAllParents(elFinderParameter.Target);

                    foreach (var parent in parents)
                    {
                        if (!assets.Any(a => a.Hash == parent.Hash))
                        {
                            assets.Add(parent);
                        }

                        foreach (var child in parent.Children)
                        {
                            if (assets.Any(a => a.Hash == child.Hash))
                            {
                                continue;
                            }
                            assets.Add(child);
                        }
                    }
                }
            }

            var files = new JArray();

            foreach (var asset in assets)
            {
                files.Add(GetFile(asset));
            }

            var result = new JObject(); // 3. Return the result.

            if (elFinderParameter.Init)
            {
                result.Add(Constants.ElFinderResponseNames.Api, "2.1");
            }

            var opts = new JObject();

            opts.Add(Constants.ElFinderOptionNames.Disabled, new JArray(new[] { "chmod" }));
            opts.Add(Constants.ElFinderOptionNames.Separator, Constants.PathSeparator);
            opts.Add(Constants.ElFinderOptionNames.Path, rootDirectory.Path);
            result.Add(Constants.ElFinderResponseNames.UplMaxSize, "0");
            result.Add(Constants.ElFinderResponseNames.Cwd, GetFile(rootDirectory));
            result.Add(Constants.ElFinderResponseNames.Files, files);
            result.Add(Constants.ElFinderResponseNames.Options, opts);
            return(result);
        }