Exemplo n.º 1
0
        private async Task <IUser> GetCurrentUserAsync(WopiRequest wopiRequest, CancellationToken cancellationToken)
        {
            var tokenValue = wopiRequest.AccessTokenValue;
            var contentId  = wopiRequest is FilesRequest fileRequest?int.Parse(fileRequest.FileId) : 0;

            var token = await AccessTokenVault.GetTokenAsync(tokenValue, contentId, AccessTokenFeatureName, cancellationToken)
                        .ConfigureAwait(false);

            if (token == null)
            {
                throw new UnauthorizedAccessException(); // 404
            }
            using (new SystemAccount())
            {
                if (await Node.LoadNodeAsync(token.UserId, cancellationToken).ConfigureAwait(false) is IUser user)
                {
                    // TODO: This method only sets the User.Current property in sensenet, not the
                    // main context User in Asp.Net. Check if it would be better if we changed
                    // or modified the context user earlier in the pipeline.

                    return(user);
                }
            }

            return(null);
        }
Exemplo n.º 2
0
        internal async Task ProcessRequestAsync(HttpContext context, bool calledFromTest)
        {
            var wopiRequest = WopiRequest.Parse(context);

            // set current user based on the access token
            if (!calledFromTest)
            {
                var user = await GetCurrentUserAsync(wopiRequest, context.RequestAborted).ConfigureAwait(false);

                if (user != null)
                {
                    User.Current = user;
                }
            }

            var webResponse  = context.Response;
            var wopiResponse = await GetResponseAsync(wopiRequest, context.RequestAborted).ConfigureAwait(false);

            // Set content type if it is known.
            if (!string.IsNullOrEmpty(wopiResponse.ContentType))
            {
                webResponse.ContentType = wopiResponse.ContentType;
            }

            // Set response headers.
            foreach (var item in wopiResponse.Headers)
            {
                webResponse.Headers.Add(item.Key, item.Value);
            }

            // Set HTTP Status code.
            webResponse.StatusCode = (int)wopiResponse.StatusCode;

            // Write binary content
            if (wopiResponse is IWopiBinaryResponse wopiBinaryResponse)
            {
                //TODO: provide custom binary field name if available
                var binaryHandler = new BinaryHandler(context, wopiBinaryResponse.File);
                await binaryHandler.ProcessRequestCore().ConfigureAwait(false);

                return;
            }

            // Write JSON body
            if (wopiResponse is IWopiObjectResponse)
            {
                var settings = new JsonSerializerSettings {
                    Formatting = Formatting.Indented
                };
                var output = JsonConvert.SerializeObject(wopiResponse, settings);

                var buffer = Encoding.UTF8.GetBytes(output);
                ResponseLimiter.AssertResponseLength(webResponse, buffer.Length);
                await webResponse.Body.WriteAsync(buffer, 0, buffer.Length)
                .ConfigureAwait(false);
            }
        }
Exemplo n.º 3
0
        internal async Task <WopiResponse> GetResponseAsync(WopiRequest wopiRequest, CancellationToken cancellationToken)
        {
            switch (wopiRequest.RequestType)
            {
            case WopiRequestType.CheckFileInfo:
                return(await ProcessCheckFileInfoRequestAsync((CheckFileInfoRequest)wopiRequest, cancellationToken)
                       .ConfigureAwait(false));

            case WopiRequestType.GetLock:
                return(await ProcessGetLockRequestAsync((GetLockRequest)wopiRequest, cancellationToken)
                       .ConfigureAwait(false));

            case WopiRequestType.Lock:
                return(await ProcessLockRequestAsync((LockRequest)wopiRequest, cancellationToken)
                       .ConfigureAwait(false));

            case WopiRequestType.Unlock:
                return(await ProcessUnlockRequestAsync((UnlockRequest)wopiRequest, cancellationToken)
                       .ConfigureAwait(false));

            case WopiRequestType.RefreshLock:
                return(await ProcessRefreshLockRequestAsync((RefreshLockRequest)wopiRequest, cancellationToken)
                       .ConfigureAwait(false));

            case WopiRequestType.UnlockAndRelock:
                return(await ProcessUnlockAndRelockRequestAsync((UnlockAndRelockRequest)wopiRequest, cancellationToken)
                       .ConfigureAwait(false));

            case WopiRequestType.GetFile:
                return(await ProcessGetFileRequestAsync((GetFileRequest)wopiRequest, cancellationToken)
                       .ConfigureAwait(false));

            case WopiRequestType.PutFile:
                return(await ProcessPutFileRequestAsync((PutFileRequest)wopiRequest, cancellationToken)
                       .ConfigureAwait(false));

            case WopiRequestType.PutRelativeFile:
                return(await ProcessPutRelativeFileRequestAsync((PutRelativeFileRequest)wopiRequest, cancellationToken)
                       .ConfigureAwait(false));

            case WopiRequestType.DeleteFile:
            case WopiRequestType.RenameFile:
            case WopiRequestType.CheckContainerInfo:
            case WopiRequestType.CreateChildContainer:
            case WopiRequestType.CreateChildFile:
            case WopiRequestType.DeleteContainer:
            case WopiRequestType.EnumerateAncestors:
            case WopiRequestType.EnumerateChildren:
            case WopiRequestType.RenameContainer:
            case WopiRequestType.CheckEcosystem:
            case WopiRequestType.GetFileWopiSrc:
            case WopiRequestType.GetRootContainer:
            case WopiRequestType.Bootstrap:
            case WopiRequestType.GetNewAccessToken:
                return(new WopiResponse {
                    StatusCode = HttpStatusCode.NotImplemented
                });

            default:
                throw new ArgumentOutOfRangeException();
            }
        }