示例#1
0
        private static JObject GetFile(AssetAggregate asset)
        {
            if (asset == null)
            {
                throw new ArgumentNullException(nameof(asset));
            }

            return(AssetResponse.Create(asset.Name, asset.Hash, Constants.VolumeId + "_", asset.Children.Any(), asset.ResourceParentHash,
                                        asset.MimeType, asset.ResourceId, asset.AuthPolicyIds, new AssetSecurity(asset.CanRead, asset.CanWrite, asset.IsLocked)).GetJson());
        }
示例#2
0
        private async Task <PasteOperation> Copy(AssetAggregate asset, AssetAggregate source, AssetAggregate target, bool isCut = false)
        {
            var children = await _assetRepository.GetAllChildren(asset.Hash);

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

            hashLst.AddRange(children.Select(c => c.Hash));
            var previousPath = target.Path;
            var newPath      = target.Path + Constants.PathSeparator + asset.Name;

            asset.Path = newPath;
            asset.Hash = HashHelper.GetHash(asset.Path);
            asset.ResourceParentHash = target.Hash;

            foreach (var child in children)
            {
                var childPath    = child.Path.Replace(source.Path, target.Path);
                var splittedPath = childPath.Split(Constants.PathSeparator);
                var parentPath   = string.Join(Constants.PathSeparator.ToString(), splittedPath.Take(splittedPath.Count() - 1));
                child.Path = childPath;
                child.Hash = HashHelper.GetHash(childPath);
                child.ResourceParentHash = HashHelper.GetHash(parentPath);
            }

            var newAssets = new List <AssetAggregate> {
                asset
            };

            newAssets.AddRange(children);
            if (!await _assetRepository.Add(newAssets))
            {
                return(new PasteOperation(true));
            }

            if (isCut)
            {
                if (!await _assetRepository.Remove(hashLst))
                {
                    return(new PasteOperation(true));
                }
            }

            return(new PasteOperation(!isCut ? new List <string>() : hashLst, newAssets));
        }
示例#3
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);
        }
        public static AssetResponse ToDto(this AssetAggregate asset)
        {
            if (asset == null)
            {
                throw new ArgumentNullException(nameof(asset));
            }

            return(new AssetResponse
            {
                CanRead = asset.CanRead,
                CanWrite = asset.CanWrite,
                CreatedAt = asset.CreatedAt,
                Hash = asset.Hash,
                IsDefaultWorkingDirectory = asset.IsDefaultWorkingDirectory,
                IsLocked = asset.IsLocked,
                MimeType = asset.MimeType,
                Name = asset.Name,
                Path = asset.Path,
                ResourceId = asset.ResourceId,
                ResourceParentHash = asset.ResourceParentHash
            });
        }
示例#5
0
        private void Rename(AssetAggregate asset, string newName, IEnumerable <AssetAggregate> children)
        {
            var previousPath = asset.Path;
            var splittedPath = asset.Path.Split(Constants.PathSeparator);
            int rootIndex    = splittedPath.Count() - 1;

            splittedPath.SetValue(newName, rootIndex);
            var newPath = string.Join(Constants.PathSeparator.ToString(), splittedPath);

            asset.Name = newName;
            asset.Path = newPath;
            asset.Hash = HashHelper.GetHash(newPath);
            foreach (var child in children)
            {
                splittedPath = child.Path.Split(Constants.PathSeparator);
                splittedPath.SetValue(newName, rootIndex);
                var parentSplittedPath = splittedPath.Take(splittedPath.Count() - 1);
                newPath = string.Join(Constants.PathSeparator.ToString(), splittedPath);
                var parentPath = string.Join(Constants.PathSeparator.ToString(), parentSplittedPath);
                child.Path = newPath;
                child.Hash = HashHelper.GetHash(newPath);
                child.ResourceParentHash = HashHelper.GetHash(parentPath);
            }
        }
示例#6
0
        /*
         * private async Task<GrantedToken> GetToken(string key, IEnumerable<string> scopes)
         * {
         *  GrantedToken grantedToken = null;
         *  var clientId = GetClientId();
         *  var clientSecret = GetClientSecret();
         *  var wellKnownConfiguration = GetWellKnownAuthConfigurationUrl();
         *  var storageRecord = await _storageHelper.GetAsync<GrantedToken>(key);
         *  var clientSelector = _identityServerClientFactory.CreateAuthSelector()
         *      .UseClientSecretPostAuth(clientId, clientSecret);
         *  if (storageRecord != null && storageRecord.Obj != null)
         *  {
         *      var currentDate = DateTime.UtcNow;
         *      var expirationDate = DateTime.UtcNow.AddSeconds(storageRecord.Obj.ExpiresIn);
         *      if (currentDate >= expirationDate) // Check expiration.
         *      {
         *          var refreshToken = storageRecord.Obj.RefreshToken;
         *          await _storageHelper.SetAsync<GrantedToken>(key, null);
         *          if (!string.IsNullOrWhiteSpace(storageRecord.Obj.RefreshToken)) // Get an access token by using the refresh token.
         *          {
         *              try
         *              {
         *                  grantedToken = await clientSelector.UseRefreshToken(storageRecord.Obj.RefreshToken).ResolveAsync(wellKnownConfiguration);
         *              }
         *              catch (Exception) { }
         *          }
         *      }
         *      else
         *      {
         *          grantedToken = storageRecord.Obj;
         *      }
         *  }
         *
         *  if (grantedToken != null)
         *  {
         *      return grantedToken;
         *  }
         *
         *  grantedToken = await _identityServerClientFactory.CreateAuthSelector()
         *      .UseClientSecretPostAuth(clientId, clientSecret)
         *      .UseClientCredentials(scopes.ToArray())
         *      .ResolveAsync(wellKnownConfiguration);
         *  await _storageHelper.SetAsync(key, grantedToken);
         *  return grantedToken;
         * }
         */

        private async Task <KeyValuePair <bool, IEnumerable <AssetAggregate> > > Duplicate(AssetAggregate asset)
        {
            var children = await _assetRepository.GetAllChildren(asset.Hash);

            Rename(asset, asset.Name.Split('_').First() + "_" + DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture), children);
            asset.ResourceId    = null;
            asset.AuthPolicyIds = null;
            var newAssets = new List <AssetAggregate> {
                asset
            };

            newAssets.AddRange(children);
            foreach (var child in children)
            {
                child.ResourceId    = null;
                child.AuthPolicyIds = null;
            }

            if (!await _assetRepository.Add(newAssets))
            {
                return(new KeyValuePair <bool, IEnumerable <AssetAggregate> >(false, null));
            }

            return(new KeyValuePair <bool, IEnumerable <AssetAggregate> >(true, newAssets));;
        }
示例#7
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);
        }