public async Task <IActionResult> LockAsync( string path, [FromBody] lockinfo lockinfo, CancellationToken cancellationToken = default(CancellationToken)) { if (_dispatcher.Class2 == null) { throw new NotSupportedException(); } IWebDavResult result; if (lockinfo == null) { // Refresh var ifHeader = _context.RequestHeaders.If; if (ifHeader == null || ifHeader.Lists.Count == 0) { return(BadRequest()); } var timeoutHeader = _context.RequestHeaders.Timeout; result = await _dispatcher.Class2.RefreshLockAsync(path ?? string.Empty, ifHeader, timeoutHeader, cancellationToken).ConfigureAwait(false); } else { // Lock result = await _dispatcher.Class2.LockAsync(path ?? string.Empty, lockinfo, cancellationToken).ConfigureAwait(false); } return(new WebDavIndirectResult(_dispatcher, result, _responseLogger)); }
/// <inheritdoc /> public Task <IWebDavResult> LockAsync(string path, lockinfo info, CancellationToken cancellationToken) { if (_lockHandler == null) { throw new NotSupportedException(); } return(_lockHandler.LockAsync(path, info, cancellationToken)); }
/// <inheritdoc /> public async Task <IWebDavResult> LockAsync(string path, lockinfo info, CancellationToken cancellationToken) { if (_lockManager == null) { throw new NotSupportedException(); } var owner = info.owner; var recursive = (_context.RequestHeaders.Depth ?? DepthHeader.Infinity) == DepthHeader.Infinity; var accessType = LockAccessType.Write; var shareType = info.lockscope.ItemElementName == ItemChoiceType.exclusive ? LockShareMode.Exclusive : LockShareMode.Shared; var timeout = _timeoutPolicy?.SelectTimeout( _context.RequestHeaders.Timeout?.Values ?? new[] { TimeoutHeader.Infinite }) ?? TimeoutHeader.Infinite; var href = GetHref(path); var l = new Lock( path, href, recursive, owner, accessType, shareType, timeout); Debug.Assert(_lockManager != null, "_lockManager != null"); var lockResult = await _lockManager.LockAsync(l, cancellationToken); if (lockResult.ConflictingLocks != null) { // Lock cannot be acquired if (lockResult.ConflictingLocks.ChildLocks.Count == 0) { return(new WebDavResult <error>(WebDavStatusCode.Locked, CreateError(lockResult.ConflictingLocks.GetLocks()))); } var errorResponses = new List <response>(); if (lockResult.ConflictingLocks.ChildLocks.Count != 0 || lockResult.ConflictingLocks.ReferenceLocks.Count != 0) { errorResponses.Add(CreateErrorResponse( WebDavStatusCode.Forbidden, lockResult.ConflictingLocks.ChildLocks.Concat(lockResult.ConflictingLocks.ReferenceLocks))); } if (lockResult.ConflictingLocks.ParentLocks.Count != 0) { var errorResponse = CreateErrorResponse( WebDavStatusCode.Forbidden, lockResult.ConflictingLocks.ChildLocks); errorResponse.error = CreateError(new IActiveLock[0]); errorResponses.Add(errorResponse); } errorResponses.Add(new response() { href = GetHref(l.Path), ItemsElementName = new[] { ItemsChoiceType2.status, }, Items = new object[] { new Status(_context.RequestProtocol, WebDavStatusCode.FailedDependency).ToString(), }, }); var multistatus = new multistatus() { response = errorResponses.ToArray(), }; return(new WebDavResult <multistatus>(WebDavStatusCode.MultiStatus, multistatus)); } var activeLock = lockResult.Lock; Debug.Assert(activeLock != null, "activeLock != null"); try { var selectionResult = await _rootFileSystem.SelectAsync(path, cancellationToken); WebDavStatusCode statusCode; if (selectionResult.IsMissing) { if (_context.RequestHeaders.IfNoneMatch != null) { throw new WebDavException(WebDavStatusCode.PreconditionFailed); } if (selectionResult.MissingNames.Count > 1) { return(new WebDavResult(WebDavStatusCode.Conflict)); } var current = selectionResult.Collection; var docName = selectionResult.MissingNames.Single(); await current.CreateDocumentAsync(docName, cancellationToken); statusCode = WebDavStatusCode.Created; } else { await _context .RequestHeaders.ValidateAsync(selectionResult.TargetEntry, cancellationToken) ; statusCode = WebDavStatusCode.OK; } var activeLockXml = activeLock.ToXElement(); var result = new prop() { Any = new[] { new XElement(WebDavXml.Dav + "lockdiscovery", activeLockXml) }, }; var webDavResult = new WebDavResult <prop>(statusCode, result); webDavResult.Headers["Lock-Token"] = new[] { new LockTokenHeader(new Uri(activeLock.StateToken)).ToString() }; return(webDavResult); } catch { await _lockManager .ReleaseAsync(activeLock.Path, new Uri(activeLock.StateToken, UriKind.RelativeOrAbsolute), cancellationToken) ; throw; } }