示例#1
0
        public CheckFileInfoResponse InitializeValidatorParams(string file_id, string access_token, string access_token_ttl)
        {
            var documentId = Convert.ToInt64(file_id);
            var document   = FB.GetDocument(documentId);

            BaseFileName     = "document.wopitest";
            OwnerId          = "1";
            Size             = document.BinaryData.Length;
            UserId           = "1";
            Version          = "1.0";
            UserFriendlyName = "Lloyd";
            UserInfo         = JsonConvert.SerializeObject(new { userName = "******", userId = 1 });

            //SupportedShareUrlTypes = new string[] { "ReadWrite" }; //  is another option

            ReadOnly = false;
            RestrictedWebViewOnly = false;
            // UserCanAttend = true;
            //UserCanPresent = true;
            UserCanNotWriteRelative = false;
            UserCanRename           = true;
            UserCanWrite            = true;

            SupportsUpdate             = true;
            SupportsLocks              = true;
            SupportsExtendedLockLength = true;
            SupportsGetLock            = true;
            SupportsRename             = true;
            SupportsUserInfo           = true;
            SupportsDeleteFile         = true;

            IsAnonymousUser = false;
            return(this);
        }
示例#2
0
        public WopiResponse HandleRefresh()
        {
            var requestData = WopiRequest.ParseRequest(_request);
            var documentId  = Convert.ToInt64(requestData.Id);
            var document    = FB.GetDocument(documentId);

            if (document == null)
            {
                return(new WopiResponse()
                {
                    ResponseType = WopiResponseType.FileUnknown, Message = "File not found"
                });
            }

            var newLock = new LockInfo()
            {
                DateCreated = DateTime.UtcNow, Lock = _request.Headers[WopiHeaders.Lock]
            };

            var currentLockInfo = FB.GetLockInfo(document);
            var currentLock     = !string.IsNullOrEmpty(currentLockInfo)
                ? Newtonsoft.Json.JsonConvert.DeserializeObject <LockInfo>(currentLockInfo)
                : null;

            if (currentLock == null)
            {
                // on refresh, there should already be a lock
                return(new WopiResponse()
                {
                    ResponseType = WopiResponseType.LockMismatch, Message = ""
                });
            }

            lock (currentLock)
            {
                if (currentLock.Lock != newLock.Lock)
                {
                    // trying to lock again with a different lock? YEAH RIGHT
                    return(new WopiResponse()
                    {
                        ResponseType = WopiResponseType.LockMismatch, Message = currentLock.Lock
                    });
                }

                // update the lock (refresh) and return success:
                FB.UpdateLockInfo(document, Newtonsoft.Json.JsonConvert.SerializeObject(newLock));
                return(new WopiResponse()
                {
                    ResponseType = WopiResponseType.Success
                });
            }
        }
        public FileContentResult GetFile(long file_id, string access_token, string access_token_ttl)
        {
            var document = FB.GetDocument(file_id);

            return(File(document.BinaryData, FB.GetContentType(document.Extension)));
        }
示例#4
0
        public WopiResponse Handle()
        {
            var requestData = WopiRequest.ParseRequest(_request);

            try
            {
                var documentId = Convert.ToInt64(requestData.Id);
                var document   = FB.GetDocument(documentId);

                if (document == null)
                {
                    return(new WopiResponse()
                    {
                        ResponseType = WopiResponseType.FileUnknown, Message = "File not found"
                    });
                }

                var currentLock = "";
                if (LockHelper.IsLockMismatch(_request, document, out currentLock))
                {
                    return(new WopiResponse()
                    {
                        ResponseType = WopiResponseType.LockMismatch, Message = currentLock
                    });
                }

                // FileInfo putTargetFileInfo = new FileInfo(requestData.FullPath);

                // The WOPI spec allows for a PutFile to succeed on a non-locked file if the file is currently zero bytes in length.
                // This allows for a more efficient Create New File flow that saves the Lock roundtrips.
                //if (!hasExistingLock && putTargetFileInfo.Length != 0)
                //{
                //    // With no lock and a non-zero file, a PutFile could potentially result in data loss by clobbering
                //    // existing content.  Therefore, return a lock mismatch error.
                //    ReturnLockMismatch(context.Response, reason: "PutFile on unlocked file with current size != 0");
                //}

                // Either the file has a valid lock that matches the lock in the request, or the file is unlocked
                // and is zero bytes.  Either way, proceed with the PutFile.

                var binary = IOHelper.StreamToBytes(_request.InputStream);
                FB.SaveDocument(document, binary);
            }
            catch (UnauthorizedAccessException uex)
            {
                return(new WopiResponse()
                {
                    ResponseType = WopiResponseType.FileUnknown, Message = uex.Message
                });
            }
            catch (Exception ex)
            {
                return(new WopiResponse()
                {
                    ResponseType = WopiResponseType.ServerError, Message = ex.Message
                });
            }

            return(new WopiResponse()
            {
                ResponseType = WopiResponseType.Success
            });
        }
示例#5
0
        public WopiResponse Handle()
        {
            var requestData = WopiRequest.ParseRequest(_request);
            var documentId  = Convert.ToInt64(requestData.Id);
            var document    = FB.GetDocument(documentId);

            if (document == null)
            {
                return(new WopiResponse()
                {
                    ResponseType = WopiResponseType.FileUnknown, Message = "File not found"
                });
            }

            var newLock = new LockInfo()
            {
                DateCreated = DateTime.UtcNow, Lock = _request.Headers[WopiHeaders.Lock]
            };
            var oldLock = _request.Headers[WopiHeaders.OldLock];

            var currentLockInfo = FB.GetLockInfo(document);
            var currentLock     = !string.IsNullOrEmpty(currentLockInfo)
                ? Newtonsoft.Json.JsonConvert.DeserializeObject <LockInfo>(currentLockInfo)
                : null;

            if (currentLock == null)
            {
                // The file is not currently locked or the lock has already expired
                FB.UpdateLockInfo(document, Newtonsoft.Json.JsonConvert.SerializeObject(newLock));
                return(new WopiResponse()
                {
                    ResponseType = WopiResponseType.Success
                });
            }

            lock (currentLock)
            {
                // unlock & relock:
                if (!string.IsNullOrEmpty(oldLock))
                {
                    if (oldLock == currentLock.Lock && oldLock != newLock.Lock)
                    {
                        FB.UpdateLockInfo(document, Newtonsoft.Json.JsonConvert.SerializeObject(newLock));
                        return(new WopiResponse()
                        {
                            ResponseType = WopiResponseType.Success
                        });
                    }

                    if (oldLock != currentLock.Lock)
                    {
                        return(new WopiResponse()
                        {
                            ResponseType = WopiResponseType.LockMismatch, Message = currentLock.Lock
                        });
                    }
                }

                if (currentLock.Lock != newLock.Lock)
                {
                    // trying to lock again with a different lock? YEAH RIGHT
                    return(new WopiResponse()
                    {
                        ResponseType = WopiResponseType.LockMismatch, Message = currentLock.Lock
                    });
                }

                // locking with the same lock? validator says this should be ok:
                return(new WopiResponse()
                {
                    ResponseType = WopiResponseType.Success
                });
            }
        }
示例#6
0
        public WopiJsonResponse Handle()
        {
            var requestData = WopiRequest.ParseRequest(_request);
            var newName     = _request.Headers[WopiHeaders.RequestedName];

            try
            {
                // if the file name is illegal then
                // return 400
                // add response header WopiHeaders.InvalidFileNameError - describing the reason the rename operation could not be completed
                if (string.IsNullOrEmpty(newName))
                {
                    return(new WopiJsonResponse()
                    {
                        StatusCode = 400,
                        Headers = new NameValueCollection {
                            { WopiHeaders.InvalidFileNameError, "Invalid filename for rename" }
                        },
                    });
                }

                newName = IOHelper.Utf7Encode(newName);

                var documentId = Convert.ToInt64(requestData.Id);
                var document   = FB.GetDocument(documentId);

                if (document == null)
                {
                    return(new WopiJsonResponse()
                    {
                        StatusCode = 404, Json = new RenameResponse()
                    });
                }

                var currentLock = "";
                if (LockHelper.IsLockMismatch(_request, document, out currentLock))
                {
                    return(new WopiJsonResponse()
                    {
                        StatusCode = 409, Json = new RenameResponse()
                    });
                }

                // rename the document:
                FB.RenameDocument(document, newName);
            }
            catch (Exception ex)
            {
                //return new WopiResponse() { ResponseType = WopiResponseType.ServerError, Message = ex.Message };
                return(new WopiJsonResponse()
                {
                    StatusCode = 500, Json = new { Message = ex.Message }
                });
            }

            //return new WopiResponse() { ResponseType = WopiResponseType.Success };
            return(new WopiJsonResponse()
            {
                StatusCode = 200, Json = new RenameResponse()
                {
                    Name = newName
                }
            });
        }
示例#7
0
        public WopiResponse Handle()
        {
            var requestData = WopiRequest.ParseRequest(_request);
            var documentId  = Convert.ToInt64(requestData.Id);
            var document    = FB.GetDocument(documentId);

            try
            {
                if (document == null)
                {
                    return(new WopiResponse()
                    {
                        ResponseType = WopiResponseType.FileUnknown, Message = "File not found"
                    });
                }

                var newLock = _request.Headers[WopiHeaders.Lock];

                var currentLockInfo = FB.GetLockInfo(document);
                var currentLock     = !string.IsNullOrEmpty(currentLockInfo)
                    ? Newtonsoft.Json.JsonConvert.DeserializeObject <LockInfo>(currentLockInfo)
                    : null;

                if (currentLock == null)
                {
                    return(new WopiResponse()
                    {
                        ResponseType = WopiResponseType.LockMismatch
                    });
                }

                lock (currentLock)
                {
                    if (currentLock.Lock == newLock)
                    {
                        // There is a valid lock on the file and the existing lock matches the provided one
                        FB.UpdateLockInfo(document, string.Empty);
                        return(new WopiResponse()
                        {
                            ResponseType = WopiResponseType.Success
                        });
                    }
                    else
                    {
                        // The existing lock doesn't match the requested one.  Return a lock mismatch error
                        return(new WopiResponse()
                        {
                            ResponseType = WopiResponseType.LockMismatch, Message = currentLock.Lock
                        });
                    }
                }
            }
            catch (Exception ex)
            {
                FB.UpdateLockInfo(document, ex.Message);
                return(new WopiResponse()
                {
                    ResponseType = WopiResponseType.ServerError, Message = ex.Message
                });
            }
        }