public override async Task <WopiResponse> CheckFileInfo(CheckFileInfoRequest checkFileInfoRequest) { // Lookup the file in the database var itemId = new Guid(checkFileInfoRequest.ResourceId); var wopiFile = DocumentDBRepository <DetailedFileModel> .GetItem("Files", file => file.id == itemId); // Check for null file if (wopiFile != null) { // Get discovery information var fileExt = wopiFile.BaseFileName.Substring(wopiFile.BaseFileName.LastIndexOf('.') + 1).ToLower(); var actions = await WopiDiscovery.GetActions(); // Augments the file with additional properties CloseUrl, HostViewUrl, HostEditUrl wopiFile.CloseUrl = String.Format("https://{0}", checkFileInfoRequest.RequestUri.Authority); var view = actions.FirstOrDefault(i => i.ext == fileExt && i.name == "view"); if (view != null) { wopiFile.HostViewUrl = WopiDiscovery.GetActionUrl(view, wopiFile.id.ToString(), checkFileInfoRequest.RequestUri.Authority); } var edit = actions.FirstOrDefault(i => i.ext == fileExt && i.name == "edit"); if (edit != null) { wopiFile.HostEditUrl = WopiDiscovery.GetActionUrl(edit, wopiFile.id.ToString(), checkFileInfoRequest.RequestUri.Authority); } // Get the user from the token (token is already validated) wopiFile.UserId = WopiSecurity.GetUserFromToken(checkFileInfoRequest.AccessToken); // Write the response and return a success 200 var wopiResponse = checkFileInfoRequest.ResponseOK(wopiFile.BaseFileName, wopiFile.OwnerId, wopiFile.Size, wopiFile.UserId, wopiFile.Version.ToString()); // Add optional items wopiResponse.CloseUrl = new Uri(wopiFile.CloseUrl); if (wopiFile.HostViewUrl != null) { wopiResponse.HostViewUrl = new Uri(wopiFile.HostViewUrl); } if (wopiFile.HostEditUrl != null) { wopiResponse.HostEditUrl = new Uri(wopiFile.HostEditUrl); } return(wopiResponse); } else { return(checkFileInfoRequest.ResponseNotFound()); } }
public override async Task <WopiResponse> GetFile(GetFileRequest getFileRequest) { // Lookup the file in the database var itemId = new Guid(getFileRequest.ResourceId); var wopiFile = DocumentDBRepository <DetailedFileModel> .GetItem("Files", file => file.id == itemId); // Check for null file if (wopiFile != null) { // Get discovery information var fileExt = wopiFile.BaseFileName.Substring(wopiFile.BaseFileName.LastIndexOf('.') + 1).ToLower(); var actions = await WopiDiscovery.GetActions(); // Augments the file with additional properties CloseUrl, HostViewUrl, HostEditUrl wopiFile.CloseUrl = String.Format("https://{0}", getFileRequest.RequestUri.Authority); var view = actions.FirstOrDefault(i => i.ext == fileExt && i.name == "view"); if (view != null) { wopiFile.HostViewUrl = WopiDiscovery.GetActionUrl(view, wopiFile.id.ToString(), getFileRequest.RequestUri.Authority); } var edit = actions.FirstOrDefault(i => i.ext == fileExt && i.name == "edit"); if (edit != null) { wopiFile.HostEditUrl = WopiDiscovery.GetActionUrl(edit, wopiFile.id.ToString(), getFileRequest.RequestUri.Authority); } // Get the user from the token (token is already validated) wopiFile.UserId = WopiSecurity.GetUserFromToken(getFileRequest.AccessToken); // Call the appropriate handler for the WOPI request we received // Get the file from blob storage var bytes = await AzureStorageUtil.GetFile(wopiFile.id.ToString(), wopiFile.Container); // Write the response and return success 200 return(getFileRequest.ResponseOK(new ByteArrayContent(bytes))); } else { return(getFileRequest.ResponseNotFound()); } }
/// <summary> /// Processes a WOPI request using the HttpContext of the APIController /// </summary> public async static Task <HttpResponseMessage> ProcessWopiRequest(this HttpContext context) { // Parse the request var request = ParseRequest(context.Request); HttpResponseMessage response = null; try { // Lookup the file in the database var itemId = new Guid(request.Id); var file = DocumentRepository <DetailedFileModel> .GetItem("Files", i => i.id == itemId); // Check for null file if (file == null) { response = returnStatus(HttpStatusCode.NotFound, "File Unknown/User Unauthorized"); } else { // Validate WOPI Proof (ie - ensure request came from Office Online) if (await WopiUtil.ValidateWopiProof(context)) { // Get discovery information var fileExt = file.BaseFileName.Substring(file.BaseFileName.LastIndexOf('.') + 1).ToLower(); var actions = await WopiUtil.GetDiscoveryInfo(); // Augments the file with additional properties CloseUrl, HostViewUrl, HostEditUrl file.CloseUrl = String.Format("https://{0}", context.Request.Url.Authority); var view = actions.FirstOrDefault(i => i.ext == fileExt && i.name == "view"); if (view != null) { file.HostViewUrl = WopiUtil.GetActionUrl(view, file, context.Request.Url.Authority); } var edit = actions.FirstOrDefault(i => i.ext == fileExt && i.name == "edit"); if (edit != null) { file.HostEditUrl = WopiUtil.GetActionUrl(edit, file, context.Request.Url.Authority); } // Get the user from the token (token is already validated) file.UserId = WopiSecurity.GetUserFromToken(request.AccessToken); // Call the appropriate handler for the WOPI request we received switch (request.RequestType) { case WopiRequestType.CheckFileInfo: response = context.CheckFileInfo(file); break; case WopiRequestType.GetFile: response = await context.GetFile(file); break; case WopiRequestType.Lock: response = await context.Lock(file); break; case WopiRequestType.GetLock: response = await context.GetLock(file); break; case WopiRequestType.RefreshLock: response = await context.RefreshLock(file); break; case WopiRequestType.Unlock: response = await context.Unlock(file); break; case WopiRequestType.UnlockAndRelock: response = await context.UnlockAndRelock(file); break; case WopiRequestType.PutFile: response = await context.PutFile(file); break; case WopiRequestType.PutRelativeFile: response = await context.PutRelativeFile(file, actions); break; case WopiRequestType.RenameFile: response = await context.RenameFile(file); break; case WopiRequestType.PutUserInfo: response = await context.PutUserInfo(file); break; default: response = returnStatus(HttpStatusCode.NotImplemented, "Unsupported"); break; } } else { // Proof validation failed...return 500 response = returnStatus(HttpStatusCode.InternalServerError, "Server Error"); } } } catch (Exception) { // An unknown exception occurred...return 500 response = returnStatus(HttpStatusCode.InternalServerError, "Server Error"); } return(response); }