Esempio n. 1
0
        public void SharedLock_LockAndGetLock()
        {
            var node              = CreateTestFolder();
            var nodeId            = node.Id;
            var expectedLockValue = Guid.NewGuid().ToString();

            Assert.IsNull(SharedLock.GetLock(nodeId, CancellationToken.None));

            // ACTION
            SharedLock.Lock(nodeId, expectedLockValue, CancellationToken.None);

            var actualLockValue = SharedLock.GetLock(nodeId, CancellationToken.None);

            Assert.AreEqual(expectedLockValue, actualLockValue);
        }
Esempio n. 2
0
        public void SharedLock_ModifyLock_TimedOut()
        {
            var node   = CreateTestFolder();
            var nodeId = node.Id;

            Assert.IsNull(SharedLock.GetLock(nodeId, CancellationToken.None));
            var oldLockValue = Guid.NewGuid().ToString();
            var newLockValue = Guid.NewGuid().ToString();

            SharedLock.Lock(nodeId, oldLockValue, CancellationToken.None);
            SetSharedLockCreationDate(nodeId, DateTime.UtcNow.AddHours(-1.0d));

            // ACTION
            SharedLock.ModifyLock(nodeId, oldLockValue, newLockValue, CancellationToken.None);
        }
Esempio n. 3
0
        public void SharedLock_ModifyLock()
        {
            var node = CreaeTestContent();
            var nodeId = node.Id;
            var oldLockValue = Guid.NewGuid().ToString();
            var newLockValue = Guid.NewGuid().ToString();
            Assert.IsNull(SharedLock.GetLock(nodeId));
            SharedLock.Lock(nodeId, oldLockValue);
            Assert.AreEqual(oldLockValue, SharedLock.GetLock(nodeId));

            // ACTION
            SharedLock.ModifyLock(nodeId, oldLockValue, newLockValue);

            Assert.AreEqual(newLockValue, SharedLock.GetLock(nodeId));
        }
Esempio n. 4
0
        public void SharedLock_Lock_DifferentTimedOut()
        {
            var node = CreaeTestContent();
            var nodeId = node.Id;
            var oldLockValue = Guid.NewGuid().ToString();
            var newLockValue = Guid.NewGuid().ToString();
            SharedLock.Lock(nodeId, oldLockValue);
            SetSharedLockCreationDate(nodeId, DateTime.UtcNow.AddHours(-1.0d));

            // ACTION
            SharedLock.Lock(nodeId, newLockValue);

            var actualLockValue = SharedLock.GetLock(nodeId);
            Assert.AreEqual(newLockValue, actualLockValue);
        }
Esempio n. 5
0
        private WopiResponse ProcessUnlockAndRelockRequest(UnlockAndRelockRequest wopiReq)
        {
            if (!int.TryParse(wopiReq.FileId, out var contentId))
            {
                return new WopiResponse {
                           StatusCode = HttpStatusCode.NotFound
                }
            }
            ;
            if (!(Node.LoadNode(contentId) is File file))
            {
                return new WopiResponse {
                           StatusCode = HttpStatusCode.NotFound
                }
            }
            ;

            var existingLock = SharedLock.GetLock(file.Id, CancellationToken.None);

            if (existingLock == null)
            {
                return(new WopiResponse
                {
                    StatusCode = HttpStatusCode.Conflict,
                    Headers = new Dictionary <string, string>
                    {
                        { WopiHeader.Lock, string.Empty },
                        { WopiHeader.LockFailureReason, "Unlocked" }
                    }
                });
            }
            if (existingLock != wopiReq.OldLock)
            {
                return(new WopiResponse
                {
                    StatusCode = HttpStatusCode.Conflict,
                    Headers = new Dictionary <string, string>
                    {
                        { WopiHeader.Lock, existingLock },
                        { WopiHeader.LockFailureReason, "LockedByAnother" }
                    }
                });
            }
            SharedLock.ModifyLock(contentId, existingLock, wopiReq.Lock, CancellationToken.None);
            return(new WopiResponse {
                StatusCode = HttpStatusCode.OK
            });
        }
Esempio n. 6
0
        private WopiResponse ProcessRefreshLockRequest(RefreshLockRequest wopiReq, PortalContext portalContext)
        {
            if (!int.TryParse(wopiReq.FileId, out var contentId))
            {
                return new WopiResponse {
                           StatusCode = HttpStatusCode.NotFound
                }
            }
            ;
            if (!(Node.LoadNode(contentId) is File file))
            {
                return new WopiResponse {
                           StatusCode = HttpStatusCode.NotFound
                }
            }
            ;

            var existingLock = SharedLock.GetLock(file.Id);

            if (existingLock == null)
            {
                return(new WopiResponse
                {
                    StatusCode = HttpStatusCode.Conflict,
                    Headers = new Dictionary <string, string>
                    {
                        { WopiHeader.Lock, string.Empty },
                        { WopiHeader.LockFailureReason, "Unlocked" }
                    }
                });
            }
            if (existingLock != wopiReq.Lock)
            {
                return(new WopiResponse
                {
                    StatusCode = HttpStatusCode.Conflict,
                    Headers = new Dictionary <string, string>
                    {
                        { WopiHeader.Lock, existingLock },
                        { WopiHeader.LockFailureReason, "LockedByAnother" }
                    }
                });
            }
            SharedLock.RefreshLock(contentId, existingLock);
            return(new WopiResponse {
                StatusCode = HttpStatusCode.OK
            });
        }
Esempio n. 7
0
        public void SharedLock_GetTimedOut()
        {
            var node      = CreateTestFolder();
            var nodeId    = node.Id;
            var lockValue = Guid.NewGuid().ToString();

            Assert.IsNull(SharedLock.GetLock(nodeId));
            SharedLock.Lock(nodeId, lockValue);

            // ACTION
            var timeout = DataProvider.GetExtension <ISharedLockDataProviderExtension>().SharedLockTimeout;

            SetSharedLockCreationDate(nodeId, DateTime.UtcNow.AddMinutes(-timeout.TotalMinutes - 1));

            Assert.IsNull(SharedLock.GetLock(nodeId));
        }
Esempio n. 8
0
        public void SharedLock_ModifyLockDifferent()
        {
            var node         = CreateTestFolder();
            var nodeId       = node.Id;
            var oldLockValue = Guid.NewGuid().ToString();
            var newLockValue = Guid.NewGuid().ToString();

            Assert.IsNull(SharedLock.GetLock(nodeId));
            SharedLock.Lock(nodeId, oldLockValue);
            Assert.AreEqual(oldLockValue, SharedLock.GetLock(nodeId));

            // ACTION
            var actualLock = SharedLock.ModifyLock(nodeId, "DifferentLock", newLockValue);

            Assert.AreEqual(oldLockValue, actualLock);
        }
Esempio n. 9
0
        public void SharedLock_ModifyLock()
        {
            var node         = CreateTestFolder();
            var nodeId       = node.Id;
            var oldLockValue = Guid.NewGuid().ToString();
            var newLockValue = Guid.NewGuid().ToString();

            Assert.IsNull(SharedLock.GetLock(nodeId, CancellationToken.None));
            SharedLock.Lock(nodeId, oldLockValue, CancellationToken.None);
            Assert.AreEqual(oldLockValue, SharedLock.GetLock(nodeId, CancellationToken.None));

            // ACTION
            SharedLock.ModifyLock(nodeId, oldLockValue, newLockValue, CancellationToken.None);

            Assert.AreEqual(newLockValue, SharedLock.GetLock(nodeId, CancellationToken.None));
        }
Esempio n. 10
0
        public async Task SharedLock_GetTimedOut()
        {
            await NoRepoIntegrationTestAsync(async() =>
            {
                SharedLock.RemoveAllLocks(CancellationToken.None);
                const int nodeId = 42;
                Assert.IsNull(await Provider.GetSharedLockAsync(nodeId, CancellationToken.None));
                var expectedLockValue = Guid.NewGuid().ToString();
                await Provider.CreateSharedLockAsync(nodeId, expectedLockValue, CancellationToken.None);

                // ACTION
                var timeout = Provider.SharedLockTimeout;
                TDP.SetSharedLockCreationDate(nodeId, DateTime.UtcNow.AddMinutes(-timeout.TotalMinutes - 1));

                // ASSERT
                Assert.IsNull(SharedLock.GetLock(nodeId, CancellationToken.None));
            });
        }
Esempio n. 11
0
        /// <summary>Method for tests</summary>
        internal static WopiResponse ProcessPutFileRequest(File file, string lockValue, Stream stream)
        {
            var existingLock = SharedLock.GetLock(file.Id, CancellationToken.None);

            if (existingLock == null)
            {
                if (file.Binary.Size != 0)
                {
                    return new WopiResponse {
                               StatusCode = HttpStatusCode.Conflict
                    }
                }
                ;
            }
            if (existingLock != lockValue)
            {
                return(new WopiResponse
                {
                    StatusCode = HttpStatusCode.Conflict,
                    Headers = new Dictionary <string, string>
                    {
                        { WopiHeader.Lock, existingLock },
                        { WopiHeader.LockFailureReason, "LockedByAnother" }
                    }
                });
            }

            var binaryData = file.Binary;

            binaryData.SetStream(stream);

            file.Binary = binaryData;

            SaveFile(file, existingLock);
            //TODO:WOPI Set X-WOPI-ItemVersion header if needed.
            return(new WopiResponse {
                StatusCode = HttpStatusCode.OK
            });
        }
Esempio n. 12
0
        public bool CheckSaving(Node node, ChangedData[] changeData, out string errorMessage)
        {
            errorMessage = null;

            // Do not check newly created node
            if (changeData == null)
            {
                return(true);
            }

            //TODO: handle non-defaul binary fields
            // Changing metadata is always allowed except rename
            var isFileContentChanged = changeData.Any(x => x.Name == "Binary");
            var isNameChanged        = changeData.Any(x => x.Name == "Name");

            if (!isFileContentChanged && !isNameChanged)
            {
                return(true);
            }

            // Changing file content is always allowed for Wopi
            var expectedSharedLock = node.GetCachedData(WopiService.ExpectedSharedLock);
            var isWopiPutFile      = !string.IsNullOrEmpty(expectedSharedLock as string);

            if (isWopiPutFile)
            {
                return(true);
            }

            // Everything is allowed if the node is not locked
            var existingLock = SharedLock.GetLock(node.Id, CancellationToken.None);

            if (existingLock == null)
            {
                return(true);
            }

            throw new LockedNodeException(node.Lock, "The content is already open elsewhere.");
        }