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); }
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); } }
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(); } }