Beispiel #1
0
        /// <summary>
        /// Processes a RefreshLock request
        /// </summary>
        /// <remarks>
        /// For full documentation on RefreshLock, see https://wopi.readthedocs.org/projects/wopirest/en/latest/files/RefreshLock.html
        /// </remarks>
        private static HttpResponseMessage RefreshLock(this HttpContext context, File file, Token AccessToken)
        {
            // Get the Lock value passed in on the request
            string requestLock = context.Request.Headers[WopiRequestHeaders.LOCK];

            // Ensure the file has a valid lock
            if (String.IsNullOrEmpty(file.LockValue))
            {
                // File isn't locked...pass empty Lock in mismatch response
                //ServerUtil.Log("File isn't locked");

                return(context.returnLockMismatch(String.Empty, "File isn't locked"));
            }
            else if (file.LockExpires != null && file.LockExpires < DateTime.UtcNow)
            {
                // File lock expired, so clear it out
                //file.LockValue = null;
                //file.LockExpires = null;
                ////await DatabaseUtil<FileModel>.UpdateItemAsync("Files", file.id.ToString(), (FileModel)file);
                //DatabaseUtil<DetailedFileModel>.UpdateItem("Files", file);

                file.UnLock();

                // File isn't locked...pass empty Lock in mismatch response
                //ServerUtil.Log("File isn't locked");

                return(context.returnLockMismatch(String.Empty, "File isn't locked"));
            }
            else if (requestLock != file.LockValue)
            {
                // File lock mismatch...pass Lock in mismatch response
                ServerUtil.Log("Lock mismatch");

                return(context.returnLockMismatch(file.LockValue, "Lock mismatch"));
            }
            else
            {
                // Extend the expiration
                //file.LockExpires = DateTime.Now.AddMinutes(30);
                ////await DatabaseUtil<FileModel>.UpdateItemAsync("Files", file.id.ToString(), (FileModel)file);
                //DatabaseUtil<FileModel>.UpdateItem("Files", (FileModel)file);

                file.Lock(requestLock);

                // Return success 200
                return(returnStatus(HttpStatusCode.OK, "Success"));
            }
        }
Beispiel #2
0
        /// <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   = File.Get(itemId); //DatabaseUtil<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 (true)  //(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("http://{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 = request.AccessToken.User;  //WopiSecurity.GetUserFromToken(request.AccessToken);

                        // Call the appropriate handler for the WOPI request we received

                        ServerUtil.Log(request.RequestType.ToString());

                        switch (request.RequestType)
                        {
                        case WopiRequestType.CheckFileInfo:
                            response = context.CheckFileInfo(file, request.AccessToken);
                            break;

                        case WopiRequestType.GetFile:
                            response = context.GetFile(file, request.AccessToken);
                            break;

                        case WopiRequestType.Lock:
                            response = context.Lock(file, request.AccessToken);
                            break;

                        case WopiRequestType.GetLock:
                            response = context.GetLock(file, request.AccessToken);
                            break;

                        case WopiRequestType.RefreshLock:
                            response = context.RefreshLock(file, request.AccessToken);
                            break;

                        case WopiRequestType.Unlock:
                            response = context.Unlock(file, request.AccessToken);
                            break;

                        case WopiRequestType.UnlockAndRelock:
                            response = context.UnlockAndRelock(file, request.AccessToken);
                            break;

                        case WopiRequestType.PutFile:
                            response = context.PutFile(file, request.AccessToken);
                            break;

                        case WopiRequestType.PutRelativeFile:
                            response = await context.PutRelativeFile(file, actions, request.AccessToken);

                            break;

                        case WopiRequestType.RenameFile:
                            response = context.RenameFile(file, request.AccessToken);
                            break;

                        case WopiRequestType.PutUserInfo:
                            response = await context.PutUserInfo(file, request.AccessToken);

                            break;

                        default:
                            response = returnStatus(HttpStatusCode.NotImplemented, "Unsupported");
                            break;
                        }
                    }
                    //else
                    //{
                    //    // Proof validation failed...return 500
                    //    ServerUtil.Log("Proof validation failed!");

                    //    response = returnStatus(HttpStatusCode.InternalServerError, "Server Error");
                    //}
                }
            }
            catch (Exception ex)
            {
                // An unknown exception occurred...return 500
                ServerUtil.LogException(ex);

                response = returnStatus(HttpStatusCode.InternalServerError, "Server Error");
            }

            return(response);
        }