コード例 #1
0
        public async Task <HttpResponseMessage> PutFile(string file_id)
        {
            var          putFileRequest = new PutFileRequest(this.Request, file_id);
            WopiResponse wopiResponse   = null;

            try
            {
                if (await Authorize(putFileRequest))
                {
                    if (await WopiProof.Validate(putFileRequest))
                    {
                        wopiResponse = await PutFile(putFileRequest);
                    }
                    else
                    {
                        wopiResponse = putFileRequest.ResponseServerError("Proof validation failed");
                    }
                }
                else
                {
                    wopiResponse = putFileRequest.ResponseUnauthorized();
                }
            }
            catch (Exception ex)
            {
                wopiResponse = putFileRequest.ResponseServerError(ex.Message);
            }
            return(wopiResponse.ToHttpResponse());
        }
コード例 #2
0
        public async Task <PutFileResponse> PutFileEx(string filespaceId, string path, string filename, Stream contents,
                                                      long sizeOfContents)
        {
            Log.LogDebug("PutFileEx: filespaceId={0}, fullName={1} {2}", filespaceId, path, filename);

            //NOTE: for this to work in TCC the path must exist otherwise TCC either gives an error or creates the file as the folder name
            var sendFileParams = new PutFileRequest
            {
                filespaceid  = filespaceId,
                path         = path,
                replace      = true,
                commitUpload = true,
                filename     = filename
            };

            if (string.IsNullOrEmpty(tccBaseUrl))
            {
                throw new Exception("Configuration Error - no TCC url specified");
            }

            var gracefulClient = new GracefulWebRequest(logFactory, configStore, _httpClientFactory);

            var(requestString, headers) = FormRequest(sendFileParams, "PutFile");

            headers.Add("X-File-Name", WebUtility.UrlEncode(filename));
            headers.Add("X-File-Size", sizeOfContents.ToString());
            headers.Add("X-FileType", "");
            headers.Add("Content-Type", ContentTypeConstants.ApplicationOctetStream);

            var result = default(PutFileResponse);

            try
            {
                result = await gracefulClient.ExecuteRequest <PutFileResponse>(requestString, contents, headers, HttpMethod.Put);
            }
            catch (WebException webException)
            {
                using (var response = webException.Response)
                {
                    Log.LogWarning(
                        $"Can not execute request TCC request with error {webException.Status} and {webException.Message}. {GetStringFromResponseStream(response)}");
                }
            }
            catch (Exception exception)
            {
                Log.LogWarning($"TCC request failed: {exception.Message}");
            }

            return(result);
        }
コード例 #3
0
        /// <summary>
        /// Implements a put file request.
        /// </summary>
        private async Task <PutFileResponse> PutFileAsync(PutFileRequest request, CancellationToken token)
        {
            LogRequestHandling();

            DateTime startTime    = DateTime.UtcNow;
            var      cacheContext = new Context(new Guid(request.Header.TraceId), _logger);

            return(await RunFuncAndReportAsync(
                       request.Header.SessionId,
                       async session =>
            {
                PutResult putResult;
                if (request.ContentHash == ByteString.Empty)
                {
                    putResult = await session.PutFileAsync(
                        cacheContext,
                        (HashType)request.HashType,
                        new AbsolutePath(request.Path),
                        (FileRealizationMode)request.FileRealizationMode,
                        token);
                }
                else
                {
                    putResult = await session.PutFileAsync(
                        cacheContext,
                        request.ContentHash.ToContentHash((HashType)request.HashType),
                        new AbsolutePath(request.Path),
                        (FileRealizationMode)request.FileRealizationMode,
                        token);
                }

                return new PutFileResponse
                {
                    Header =
                        new ResponseHeader(
                            startTime,
                            putResult.Succeeded,
                            putResult.Succeeded ? 0 : 1,
                            putResult.ErrorMessage,
                            putResult.Diagnostics),
                    ContentSize = putResult.ContentSize,
                    ContentHash = putResult.ContentHash.ToByteString(),
                    HashType = (int)putResult.ContentHash.HashType
                };
            },
                       errorMessage => new PutFileResponse {
                Header = ResponseHeader.Failure(startTime, errorMessage)
            }));
        }
コード例 #4
0
        private Task <PutFileResponse> PutFileAsync(PutFileRequest request, CancellationToken token)
        {
            return(RunFuncAsync(
                       request.Header,
                       async(context, session) =>
            {
                PutResult putResult;
                if (request.ContentHash == ByteString.Empty)
                {
                    putResult = await session.PutFileAsync(
                        context.OperationContext,
                        (HashType)request.HashType,
                        new AbsolutePath(request.Path),
                        (FileRealizationMode)request.FileRealizationMode,
                        context.Token);
                }
                else
                {
                    putResult = await session.PutFileAsync(
                        context.OperationContext,
                        request.ContentHash.ToContentHash((HashType)request.HashType),
                        new AbsolutePath(request.Path),
                        (FileRealizationMode)request.FileRealizationMode,
                        context.Token);
                }

                return new PutFileResponse
                {
                    Header =
                        new ResponseHeader(
                            context.StartTime,
                            putResult.Succeeded,
                            putResult.Succeeded ? 0 : 1,
                            putResult.ErrorMessage,
                            putResult.Diagnostics),
                    ContentSize = putResult.ContentSize,
                    ContentHash = putResult.ContentHash.ToByteString(),
                    HashType = (int)putResult.ContentHash.HashType
                };
            },
                       (context, errorMessage) => new PutFileResponse {
                Header = ResponseHeader.Failure(context.StartTime, errorMessage)
            },
                       token: token));
        }
コード例 #5
0
        public override async Task <WopiResponse> PutFile(PutFileRequest putFileRequest)
        {
            var userId = WopiSecurity.GetIdentityNameFromToken(putFileRequest.AccessToken);
            var wopiFileRespository = new WopiFileRepository();
            var response            = await wopiFileRespository.UpdateFileContent(putFileRequest.ResourceId, userId, putFileRequest.Lock, await putFileRequest.Content.ReadAsStreamAsync());

            if (response.Item1 == HttpStatusCode.NotFound)
            {
                return(putFileRequest.ResponseNotFound());
            }
            else if (response.Item1 == HttpStatusCode.Conflict)
            {
                return(putFileRequest.ResponseLockConflict(response.Item2));
            }
            else if (response.Item1 == HttpStatusCode.OK)
            {
                return(putFileRequest.ResponseOK(response.Item3));
            }
            else
            {
                return(putFileRequest.ResponseServerError(string.Format("Unknown HTTPStatusCode from WopiFileRepository.UpdateFileContent: {0}", response.Item1)));
            }
        }
コード例 #6
0
ファイル: FileService.cs プロジェクト: night-king/BetterCMS
        /// <summary>
        /// Replaces the file or if it doesn't exist, creates it.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>
        ///   <c>PutFileResponse</c> with a file id.
        /// </returns>
        public PutFileResponse Put(PutFileRequest request)
        {
            IEnumerable <MediaFolder> parentFolderFuture = null;

            if (request.Data.FolderId.HasValue)
            {
                parentFolderFuture = repository.AsQueryable <MediaFolder>()
                                     .Where(c => c.Id == request.Data.FolderId.Value && !c.IsDeleted)
                                     .ToFuture();
            }

            var mediaFile = repository.AsQueryable <MediaFile>()
                            .Where(file => file.Id == request.Id)
                            .FetchMany(f => f.AccessRules)
                            .ToFuture()
                            .FirstOrDefault();

            MediaFolder parentFolder = null;

            if (parentFolderFuture != null)
            {
                parentFolder = parentFolderFuture.First();
                if (parentFolder.Type != Module.MediaManager.Models.MediaType.File)
                {
                    throw new CmsApiValidationException("Folder must be type of an file.");
                }
            }

            var createFile = mediaFile == null;

            if (createFile)
            {
                mediaFile = new MediaFile
                {
                    Id          = request.Id.GetValueOrDefault(),
                    Type        = Module.MediaManager.Models.MediaType.File,
                    AccessRules = new List <AccessRule>()
                };
            }
            else if (request.Data.Version > 0)
            {
                mediaFile.Version = request.Data.Version;
            }

            unitOfWork.BeginTransaction();

            if (!createFile)
            {
                repository.Save(mediaFile.CreateHistoryItem());
            }

            mediaFile.Title                 = request.Data.Title;
            mediaFile.Description           = request.Data.Description;
            mediaFile.Size                  = request.Data.FileSize;
            mediaFile.PublicUrl             = request.Data.PublicUrl;
            mediaFile.Folder                = parentFolder;
            mediaFile.PublishedOn           = request.Data.PublishedOn;
            mediaFile.OriginalFileName      = request.Data.OriginalFileName;
            mediaFile.OriginalFileExtension = request.Data.OriginalFileExtension;

            mediaFile.Image = request.Data.ThumbnailId.GetValueOrDefault() != default(Guid)
                ? repository.AsProxy <MediaImage>(request.Data.ThumbnailId.Value)
                : null;

            mediaFile.FileUri     = new Uri(request.Data.FileUri);
            mediaFile.IsUploaded  = request.Data.IsUploaded;
            mediaFile.IsTemporary = request.Data.IsTemporary;
            mediaFile.IsCanceled  = request.Data.IsCanceled;

            var archivedMedias   = new List <Media>();
            var unarchivedMedias = new List <Media>();

            if (mediaFile.IsArchived != request.Data.IsArchived)
            {
                if (request.Data.IsArchived)
                {
                    archivedMedias.Add(mediaFile);
                    mediaService.ArchiveSubMedias(mediaFile, archivedMedias);
                }
                else
                {
                    unarchivedMedias.Add(mediaFile);
                    mediaService.UnarchiveSubMedias(mediaFile, unarchivedMedias);
                }
            }

            mediaFile.IsArchived = request.Data.IsArchived;

            IList <Tag> newTags = null;

            if (request.Data.Tags != null)
            {
                tagService.SaveMediaTags(mediaFile, request.Data.Tags, out newTags);
            }

            if (request.Data.AccessRules != null)
            {
                mediaFile.AccessRules.RemoveDuplicateEntities();
                var accessRules =
                    request.Data.AccessRules.Select(
                        r => (IAccessRule) new AccessRule {
                    AccessLevel = (Core.Security.AccessLevel)(int) r.AccessLevel, Identity = r.Identity, IsForRole = r.IsForRole
                })
                    .ToList();
                accessControlService.UpdateAccessControl(mediaFile, accessRules);
            }

            if (request.Data.Categories != null)
            {
                categoryService.CombineEntityCategories <Media, MediaCategory>(mediaFile, request.Data.Categories);
            }

            repository.Save(mediaFile);

            unitOfWork.Commit();

            // Fire events.
            Events.RootEvents.Instance.OnTagCreated(newTags);
            if (createFile)
            {
                Events.MediaManagerEvents.Instance.OnMediaFileUploaded(mediaFile);
            }
            else
            {
                Events.MediaManagerEvents.Instance.OnMediaFileUpdated(mediaFile);
            }

            foreach (var archivedMedia in archivedMedias.Distinct())
            {
                Events.MediaManagerEvents.Instance.OnMediaArchived(archivedMedia);
            }

            foreach (var archivedMedia in unarchivedMedias.Distinct())
            {
                Events.MediaManagerEvents.Instance.OnMediaUnarchived(archivedMedia);
            }

            return(new PutFileResponse
            {
                Data = mediaFile.Id
            });
        }
コード例 #7
0
ファイル: FileService.cs プロジェクト: Steinerd/BetterCMS
        /// <summary>
        /// Replaces the file or if it doesn't exist, creates it.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>
        ///   <c>PutFileResponse</c> with a file id.
        /// </returns>
        public PutFileResponse Put(PutFileRequest request)
        {
            IEnumerable<MediaFolder> parentFolderFuture = null;
            if (request.Data.FolderId.HasValue)
            {
                parentFolderFuture = repository.AsQueryable<MediaFolder>()
                    .Where(c => c.Id == request.Data.FolderId.Value && !c.IsDeleted)
                    .ToFuture();
            }

            var mediaFile = repository.AsQueryable<MediaFile>()
                .Where(file => file.Id == request.Id)
                .FetchMany(f => f.AccessRules)
                .ToFuture()
                .FirstOrDefault();

            MediaFolder parentFolder = null;
            if (parentFolderFuture != null)
            {
                parentFolder = parentFolderFuture.First();
                if (parentFolder.Type != Module.MediaManager.Models.MediaType.File)
                {
                    throw new CmsApiValidationException("Folder must be type of an file.");
                }
            }

            var createFile = mediaFile == null;
            if (createFile)
            {
                mediaFile = new MediaFile
                {
                    Id = request.Id.GetValueOrDefault(),
                    Type = Module.MediaManager.Models.MediaType.File,
                    AccessRules = new List<AccessRule>()
                };
            }
            else if (request.Data.Version > 0)
            {
                mediaFile.Version = request.Data.Version;
            }

            unitOfWork.BeginTransaction();

            if (!createFile)
            {
                repository.Save(mediaFile.CreateHistoryItem());
            }

            mediaFile.Title = request.Data.Title;
            mediaFile.Description = request.Data.Description;
            mediaFile.Size = request.Data.FileSize;
            mediaFile.PublicUrl = request.Data.PublicUrl;
            mediaFile.Folder = parentFolder;
            mediaFile.PublishedOn = request.Data.PublishedOn;
            mediaFile.OriginalFileName = request.Data.OriginalFileName;
            mediaFile.OriginalFileExtension = request.Data.OriginalFileExtension;

            mediaFile.Image = request.Data.ThumbnailId.GetValueOrDefault() != default(Guid)
                ? repository.AsProxy<MediaImage>(request.Data.ThumbnailId.Value)
                : null;

            mediaFile.FileUri = new Uri(request.Data.FileUri);
            mediaFile.IsUploaded = request.Data.IsUploaded;
            mediaFile.IsTemporary = request.Data.IsTemporary;
            mediaFile.IsCanceled = request.Data.IsCanceled;

            var archivedMedias = new List<Media>();
            var unarchivedMedias = new List<Media>();
            if (mediaFile.IsArchived != request.Data.IsArchived)
            {
                if (request.Data.IsArchived)
                {
                    archivedMedias.Add(mediaFile);
                    mediaService.ArchiveSubMedias(mediaFile, archivedMedias);
                }
                else
                {
                    unarchivedMedias.Add(mediaFile);
                    mediaService.UnarchiveSubMedias(mediaFile, unarchivedMedias);
                }
            }

            mediaFile.IsArchived = request.Data.IsArchived;

            IList<Tag> newTags = null;
            if (request.Data.Tags != null)
            {
                tagService.SaveMediaTags(mediaFile, request.Data.Tags, out newTags);
            }

            if (request.Data.AccessRules != null)
            {
                mediaFile.AccessRules.RemoveDuplicateEntities();
                var accessRules =
                    request.Data.AccessRules.Select(
                        r => (IAccessRule)new AccessRule { AccessLevel = (Core.Security.AccessLevel)(int)r.AccessLevel, Identity = r.Identity, IsForRole = r.IsForRole })
                        .ToList();
                accessControlService.UpdateAccessControl(mediaFile, accessRules);
            }

            if (request.Data.Categories != null)
            {
                categoryService.CombineEntityCategories<Media, MediaCategory>(mediaFile, request.Data.Categories);
            }

            repository.Save(mediaFile);

            unitOfWork.Commit();

            // Fire events.
            Events.RootEvents.Instance.OnTagCreated(newTags);
            if (createFile)
            {
                Events.MediaManagerEvents.Instance.OnMediaFileUploaded(mediaFile);
            }
            else
            {
                Events.MediaManagerEvents.Instance.OnMediaFileUpdated(mediaFile);
            }

            foreach (var archivedMedia in archivedMedias.Distinct())
            {
                Events.MediaManagerEvents.Instance.OnMediaArchived(archivedMedia);
            }

            foreach (var archivedMedia in unarchivedMedias.Distinct())
            {
                Events.MediaManagerEvents.Instance.OnMediaUnarchived(archivedMedia);
            }

            return new PutFileResponse
            {
                Data = mediaFile.Id
            };
        }
コード例 #8
0
 /// <inheritdoc />
 public override Task <PutFileResponse> PutFile(PutFileRequest request, ServerCallContext context) => _contentServer.PutFileAsync(request, context.CancellationToken);
コード例 #9
0
 public abstract Task <WopiResponse> PutFile(PutFileRequest putFileRequest);
コード例 #10
0
ファイル: WebSocketClient.cs プロジェクト: Jackie-Innover/3VR
        public bool SendRequest(WebSocketRequest request, bool isAsync = false)
        {
            request.ClientGuid = _applianceGuid;
            if (Status == WebSessionStatus.Logging)
            {
                _waitConnectionOpenedEvent.WaitOne(TimeSpan.FromSeconds(20));
            }
            if (Status != WebSessionStatus.Active)
            {
                Console.WriteLine("Inactive connection. Refuse this request " + request);
                if (isAsync)
                {
                    WebSocketNotificationHandler.ReceiveResponse(request.RequestId, false);
                }
                return false;
            }

            if (request.RequestType == WebSocketRequestType.PutFileProxyRequest)
            {
                PutFileProxyRequest putFileProxyRequest = (PutFileProxyRequest)request;
                foreach (NeedSendData needSendData in NeedSendDataManager.Instance.NeedSendDatas)
                {
                    PutFileRequest putFileRequest = new PutFileRequest
                    {
                        RequestId = RequestHelper.NextRequestId(),
                        FilePath = putFileProxyRequest.FilePath,
                        FileData = needSendData.FileData,
                        Position = needSendData.Position
                    };

                    bool isSuccess = (bool)WebSocketHandler.SendRequestReturnResult(this, putFileRequest);
                    Interlocked.Add(ref _sendDataLengthCount, needSendData.FileData.Length);
                    if (!isSuccess)
                    {
                        WebSocketNotificationHandler.ReceiveResponse(putFileProxyRequest.RequestId, false);
                        return false;
                    }
                }

                WebSocketNotificationHandler.ReceiveResponse(putFileProxyRequest.RequestId, true);
                return true;
            }
            //Send file bytes directly to ESS Server without Json because frequent Json deserialization costs high
            // CPU in ESS Server.
            if (request.RequestType == WebSocketRequestType.PutFileRequest)
            {
                Interlocked.Increment(ref _getPutRequestCnt);
                PutFileRequest putFileRequest = (PutFileRequest)request;
                var data = WebSocketBlockWrite.PutFileRequestToByte(putFileRequest);
                var arrayList = new List<ArraySegment<byte>>();
                var array = new ArraySegment<byte>(data);
                arrayList.Add(array);
                _webSocket.Send(arrayList);
            }
            return true;
        }
コード例 #11
0
        public override async Task <WopiResponse> PutFile(PutFileRequest putFileRequest)
        {
            WopiResponse wopiResponse = null;
            var          file         = DocumentDBRepository <DetailedFileModel> .GetItem("Files", i => i.id.ToString() == putFileRequest.ResourceId);

            // Check for null file
            if (file != null)
            {
                var inputStream = await putFileRequest.Content.ReadAsStreamAsync();

                // Ensure the file has a valid lock
                if (String.IsNullOrEmpty(file.LockValue))
                {
                    // If the file is 0 bytes, this is document creation
                    if (inputStream.Length == 0)
                    {
                        // Update the file in blob storage
                        var bytes = new byte[inputStream.Length];
                        inputStream.Read(bytes, 0, bytes.Length);
                        file.Size = bytes.Length;
                        await AzureStorageUtil.UploadFile(file.id.ToString(), file.Container, bytes);

                        // Update version
                        file.Version++;
                        await DocumentDBRepository <FileModel> .UpdateItemAsync("Files", file.id.ToString(), file);

                        // Return success 200
                        wopiResponse = putFileRequest.ResponseOK();
                    }
                    else
                    {
                        // File isn't locked...pass empty Lock in mismatch response
                        wopiResponse = putFileRequest.ResponseLockConflict(String.Empty, "File isn't locked");
                    }
                }
                else if (file.LockExpires != null && file.LockExpires < DateTime.Now)
                {
                    // File lock expired, so clear it out
                    file.LockValue   = null;
                    file.LockExpires = null;
                    await DocumentDBRepository <FileModel> .UpdateItemAsync("Files", file.id.ToString(), file);

                    // File isn't locked...pass empty Lock in mismatch response
                    wopiResponse = putFileRequest.ResponseLockConflict(String.Empty, "File isn't locked");
                }
                else if (putFileRequest.Lock != file.LockValue)
                {
                    // File lock mismatch...pass Lock in mismatch response
                    wopiResponse = putFileRequest.ResponseLockConflict(file.LockValue, "Lock mismatch");
                }
                else
                {
                    // Update the file in blob storage
                    var bytes = new byte[inputStream.Length];
                    inputStream.Read(bytes, 0, bytes.Length);
                    file.Size = bytes.Length;
                    await AzureStorageUtil.UploadFile(file.id.ToString(), file.Container, bytes);

                    // Update version
                    file.Version++;
                    await DocumentDBRepository <FileModel> .UpdateItemAsync("Files", file.id.ToString(), (FileModel)file);

                    // Return success 200
                    wopiResponse = putFileRequest.ResponseOK();
                }
            }
            else
            {
                wopiResponse = putFileRequest.ResponseNotFound();
            }
            return(wopiResponse);
        }
コード例 #12
0
 public HttpResponseMessage PutFile(int id, PutFileRequest request)
 {
     try
     {
         if (request.FileType == FileType.JavaScriptLib)
         {
             this.repository.UpdateLibrary(
                     new JackrabbitLibrary(request.FileType, request.LibraryName, request.Version, request.Specificity));
             return this.Request.CreateResponse(HttpStatusCode.OK, this.GetAllItems(this.ActiveModule.ModuleID));
         }
         else
         {
             this.repository.UpdateFile(
                     new JackrabbitFile(request.FileType, id, request.PathPrefixName, request.FilePath, request.Provider, request.Priority));
             return this.Request.CreateResponse(HttpStatusCode.OK, this.GetAllItems(this.ActiveModule.ModuleID));
         }
     }
     catch (Exception exc)
     {
         return this.HandleException(exc);
     }
 }