diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IFolder.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IFolder.cs index 1f45f389..6d587fc9 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IFolder.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IFolder.cs @@ -301,6 +301,36 @@ namespace WebsitePanel.WebDav.Core XmlCurrentPropNode.NamespaceURI), XmlCurrentPropNode.InnerXml)); break; + //case "lockdiscovery": + //{ + // if (XmlCurrentPropNode.HasChildNodes == false) + // { + // break; + // } + + // foreach (XmlNode activeLockNode in XmlCurrentPropNode.FirstChild) + // { + // switch (activeLockNode.LocalName) + // { + // case "owner": + // item.SetProperty( + // new Property( + // new PropertyName("owner", + // activeLockNode.NamespaceURI), + // activeLockNode.InnerXml)); + // break; + // case "locktoken": + // var lockTokenNode = activeLockNode.FirstChild; + // item.SetProperty( + // new Property( + // new PropertyName("locktoken", + // lockTokenNode.NamespaceURI), + // lockTokenNode.InnerXml)); + // break; + // } + // } + // break; + //} } } break; diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IResource.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IResource.cs index 4470ac67..a4c2fc08 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IResource.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IResource.cs @@ -337,6 +337,69 @@ namespace WebsitePanel.WebDav.Core } } + + /// + /// Lock this item. + /// + public string Lock() + { + var credentials = (NetworkCredential)_credentials; + string lockToken = string.Empty; + + + string lockXml =string.Format( "" + + "" + + "" + + "" + + "{0}" + + "", WspContext.User.Login); + + string auth = "Basic " + + Convert.ToBase64String( + Encoding.Default.GetBytes(credentials.UserName + ":" + credentials.Password)); + + WebRequest webRequest = WebRequest.Create(Href); + + webRequest.Method = "LOCK"; + webRequest.Credentials = credentials; + webRequest.Headers.Add("Authorization", auth); + webRequest.PreAuthenticate = true; + webRequest.ContentType = "application/xml"; + + // Retrieve the request stream. + using (Stream requestStream = webRequest.GetRequestStream()) + { + // Write the lock XML to the destination. + requestStream.Write(Encoding.UTF8.GetBytes(lockXml), 0, lockXml.Length); + } + + using (WebResponse webResponse = webRequest.GetResponse()) + { + lockToken = webResponse.Headers["Lock-Token"]; + } + + return lockToken; + } + + /// + /// Lock this item. + /// + public void UnLock() + { + WebRequest webRequest = WebRequest.Create(Href); + + webRequest.Method = "UNLOCK"; + webRequest.Credentials = _credentials; + webRequest.PreAuthenticate = true; + + webRequest.Headers.Add(@"Lock-Token", Properties.First(x => x.Name.Name == "locktoken").StringValue); + + using (WebResponse webResponse = webRequest.GetResponse()) + { + //TODO unlock + } + } + public bool AllowWriteStreamBuffering { get; set; } public bool SendChunked { get; set; } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Managers/IWebDavManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Managers/IWebDavManager.cs index cfa6a8b5..12f99b70 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Managers/IWebDavManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Managers/IWebDavManager.cs @@ -16,5 +16,6 @@ namespace WebsitePanel.WebDav.Core.Interfaces.Managers IResource GetResource(string path); string GetFileUrl(string path); void DeleteResource(string path); + void LockFile(string path); } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Owa/IWopiFileManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Owa/IWopiFileManager.cs index 4dd65f51..54ba88da 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Owa/IWopiFileManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Owa/IWopiFileManager.cs @@ -5,8 +5,8 @@ namespace WebsitePanel.WebDav.Core.Interfaces.Owa public interface IWopiFileManager { CobaltFile Create(int accessTokenId); - CobaltFile Get(int accessTokenId); - bool Add(int accessTokenId, CobaltFile file); - bool Delete(int accessTokenId); + CobaltFile Get(string filePath); + bool Add(string filePath, CobaltFile file); + bool Delete(string filePath); } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs index 4dca416b..a6699870 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs @@ -173,6 +173,20 @@ namespace WebsitePanel.WebDav.Core.Managers resource.Upload(bytes); } + public void LockFile(string path) + { + var resource = new WebDavResource(); + + var fileUrl = new Uri(WebDavAppConfigManager.Instance.WebdavRoot) + .Append(WspContext.User.OrganizationId) + .Append(path); + + resource.SetHref(fileUrl); + resource.SetCredentials(new NetworkCredential(WspContext.User.Login, _cryptography.Decrypt(WspContext.User.EncryptedPassword))); + + resource.Lock(); + } + public void DeleteResource(string path) { path = RemoveLeadingFromPath(path, "office365"); diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Owa/CobaltManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Owa/CobaltManager.cs index 986bb5f0..b33ae340 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Owa/CobaltManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Owa/CobaltManager.cs @@ -27,7 +27,7 @@ namespace WebsitePanel.WebDav.Core.Owa var requestBatch = new RequestBatch(); - var cobaltFile = _fileManager.Get(accessTokenId) ?? _fileManager.Create(accessTokenId); + var cobaltFile = _fileManager.Get(token.FilePath) ?? _fileManager.Create(accessTokenId); Object ctx; ProtocolVersion protocolVersion; diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Owa/CobaltFileManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Owa/CobaltSessionManager.cs similarity index 80% rename from WebsitePanel/Sources/WebsitePanel.WebDav.Core/Owa/CobaltFileManager.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Owa/CobaltSessionManager.cs index e8627682..2684bf83 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Owa/CobaltFileManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Owa/CobaltSessionManager.cs @@ -13,13 +13,13 @@ using WebsitePanel.WebDav.Core.Interfaces.Storages; namespace WebsitePanel.WebDav.Core.Owa { - public class CobaltFileManager : IWopiFileManager + public class CobaltSessionManager : IWopiFileManager { private readonly IWebDavManager _webDavManager; private readonly IAccessTokenManager _tokenManager; private readonly ITtlStorage _storage; - public CobaltFileManager(IWebDavManager webDavManager, IAccessTokenManager tokenManager, ITtlStorage storage) + public CobaltSessionManager(IWebDavManager webDavManager, IAccessTokenManager tokenManager, ITtlStorage storage) { _webDavManager = webDavManager; @@ -80,29 +80,29 @@ namespace WebsitePanel.WebDav.Core.Owa cobaltFile.GetCobaltFilePartition(FilePartitionId.Content).SetStream(RootId.Default.Value, atom, out o1); cobaltFile.GetCobaltFilePartition(FilePartitionId.Content).GetStream(RootId.Default.Value).Flush(); - Add(accessTokenId, cobaltFile); + Add(token.FilePath, cobaltFile); return cobaltFile; } - public CobaltFile Get(int accessTokenId) + public CobaltFile Get(string filePath) { - return _storage.Get(GetFileKey(accessTokenId)); + return _storage.Get(GetSessionKey(filePath)); } - public bool Add(int accessTokenId, CobaltFile file) + public bool Add(string filePath, CobaltFile file) { - return _storage.Add(GetFileKey(accessTokenId), file); + return _storage.Add(GetSessionKey(filePath), file); } - public bool Delete(int accessTokenId) + public bool Delete(string filePath) { - return _storage.Delete(GetFileKey(accessTokenId)); + return _storage.Delete(GetSessionKey(filePath)); } - private string GetFileKey(int accessTokenId) + private string GetSessionKey(string filePath) { - return string.Format("{0}", accessTokenId); + return string.Format("{0}/{1}", WspContext.User.AccountId, filePath); } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebsitePanel.WebDav.Core.csproj b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebsitePanel.WebDav.Core.csproj index 81a0c36c..bf910311 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebsitePanel.WebDav.Core.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebsitePanel.WebDav.Core.csproj @@ -148,7 +148,7 @@ - + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs index 2642f2f5..6af67e4b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs @@ -59,6 +59,8 @@ namespace WebsitePanel.WebDavPortal.Controllers { _authenticationService.LogOut(); + Session.Clear(); + return RedirectToRoute(AccountRouteNames.Login); } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/Api/OwaController.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/Api/OwaController.cs index 79bf0713..a43e95c0 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/Api/OwaController.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/Api/OwaController.cs @@ -34,7 +34,6 @@ namespace WebsitePanel.WebDavPortal.Controllers.Api private readonly IAuthenticationService _authenticationService; private readonly IAccessTokenManager _tokenManager; private readonly ICryptography _cryptography; - //private static WopiSession _session; private readonly ICobaltManager _cobaltManager; public OwaController(IWopiServer wopiServer, IWebDavManager webDavManager, IAuthenticationService authenticationService, IAccessTokenManager tokenManager, ICryptography cryptography, ICobaltManager cobaltManager) @@ -105,6 +104,10 @@ namespace WebsitePanel.WebDavPortal.Controllers.Api [HttpPost] public HttpResponseMessage Lock(int accessTokenId) { + // var token = _tokenManager.GetToken(accessTokenId); + + //_webDavManager.LockFile(token.FilePath); + return new HttpResponseMessage(HttpStatusCode.OK); } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/PortalDependencies.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/PortalDependencies.cs index 704e5ee2..1e3c37e4 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/PortalDependencies.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/PortalDependencies.cs @@ -24,7 +24,7 @@ namespace WebsitePanel.WebDavPortal.DependencyInjection kernel.Bind().To(); kernel.Bind().To(); kernel.Bind().To(); - kernel.Bind().To(); + kernel.Bind().To(); kernel.Bind().To(); kernel.Bind().To(); kernel.Bind().To(); diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Web.config b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Web.config index 4028afc3..ad65ed86 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Web.config +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Web.config @@ -62,11 +62,11 @@ - + - + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebsitePanel.WebDavPortal.csproj b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebsitePanel.WebDavPortal.csproj index 59aa1925..86479359 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebsitePanel.WebDavPortal.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebsitePanel.WebDavPortal.csproj @@ -163,7 +163,6 @@ -