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); }
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); }
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)); }
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); }
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 }); }
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 }); }
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)); }
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); }
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)); }
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)); }); }
/// <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 }); }
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."); }