private int DavLockBase_InternalProcessDavRequest(object sender, EventArgs e) { int _responseCode = (int)DavLockResponseCode.Ok; string[] _lockTokens = this.RequestLock.GetLockTokens(); //Check to see if a lock refresh was requested if (base.HttpApplication.Request.Headers["If"] != null) { if (_lockTokens.Length == 1) { DavRefreshEventArgs _refreshEventArgs = new DavRefreshEventArgs(_lockTokens[0], this.RequestLock.LockTimeout); OnRefreshLockDavRequest(_refreshEventArgs); } base.HttpApplication.Response.AppendHeader("Timeout", "Second-" + this.ResponseLock.LockTimeout); } else { //New lock request StringBuilder _opaquelockTokens = new StringBuilder(); foreach (string _lockToken in _lockTokens) _opaquelockTokens.Append("<opaquelocktoken:" + _lockToken + ">"); base.HttpApplication.Response.AppendHeader("Lock-Token", _opaquelockTokens.ToString()); } //Check to see if there were any process errors... Enum[] _errorResources = this.ProcessErrorResources; if (_errorResources.Length > 0) { //Append a response node XmlDocument _xmlDocument = new XmlDocument(); XmlNode _responseNode = _xmlDocument.CreateNode(XmlNodeType.Element, _xmlDocument.GetPrefixOfNamespace("DAV:"), "response", "DAV:"); //Add the HREF XmlElement _requestLockHrefElement = _xmlDocument.CreateElement("href", "DAV:"); _requestLockHrefElement.InnerText = base.RelativeRequestPath; _responseNode.AppendChild(_requestLockHrefElement); //Add the propstat XmlElement _propstatElement = _xmlDocument.CreateElement("propstat", "DAV:"); XmlElement _propElement = _xmlDocument.CreateElement("prop", "DAV:"); XmlElement _lockDiscoveryElement = _xmlDocument.CreateElement("lockdiscovery", "DAV:"); _propElement.AppendChild(_lockDiscoveryElement); _propstatElement.AppendChild(_propElement); XmlElement _statusElement = _xmlDocument.CreateElement("status", "DAV:"); _statusElement.InnerText = InternalFunctions.GetEnumHttpResponse(DavLockResponseCode.FailedDependency); _propstatElement.AppendChild(_statusElement); _responseNode.AppendChild(_propstatElement); base.SetResponseXml(InternalFunctions.ProcessErrorRequest(this.ProcessErrors, _responseNode)); _responseCode = (int)ServerResponseCode.MultiStatus; } else { //No issues using (Stream _responseStream = new MemoryStream()) { XmlTextWriter _xmlWriter = new XmlTextWriter(_responseStream, new UTF8Encoding(false)); _xmlWriter.Formatting = Formatting.Indented; _xmlWriter.IndentChar = '\t'; _xmlWriter.Indentation = 1; _xmlWriter.WriteStartDocument(); //Open the prop element section _xmlWriter.WriteStartElement("D", "prop", "DAV:"); _xmlWriter.WriteStartElement("lockdiscovery", "DAV:"); this.ResponseLock.ActiveLock.WriteTo(_xmlWriter); _xmlWriter.WriteEndElement(); _xmlWriter.WriteEndElement(); _xmlWriter.WriteEndDocument(); _xmlWriter.Flush(); base.SetResponseXml(_responseStream); _xmlWriter.Close(); } } return _responseCode; }
/// <summary> /// Create a repsonse for a PUT request - uploading a file /// </summary> /// <param name="properties"></param> /// <returns></returns> private Byte[] CreatePutResponse(HTTPHeader header, Byte[] body, params string[] properties) { #region Get Owner XmlDocument OwnerXmlDocument = new XmlDocument(); OwnerXmlDocument.LoadXml(Encoding.UTF8.GetString(body)); String NamespacePrefix = OwnerXmlDocument.GetPrefixOfNamespace(S_DAV_NAMESPACE_URI); if (NamespacePrefix == "") NamespacePrefix = S_DAV_PREFIX; XmlNamespaceManager XmlNamespaceManager = new XmlNamespaceManager(OwnerXmlDocument.NameTable); XmlNamespaceManager.AddNamespace(NamespacePrefix, S_DAV_NAMESPACE_URI); XmlElement OwnerRoot = OwnerXmlDocument.DocumentElement; XmlNode OwnerNode = OwnerRoot.SelectSingleNode(String.Concat("/", S_DAV_PREFIX, ":lockinfo/", S_DAV_PREFIX, ":owner/", S_DAV_PREFIX, ":href"), XmlNamespaceManager); String Owner = OwnerNode.InnerText; #endregion #region Create XmlDocument XmlDocument XmlDocument = new XmlDocument(); XmlElement Root = XmlDocument.CreateElement(S_DAV_PREFIX, "prop", S_DAV_NAMESPACE_URI); XmlElement LockDiscovery = XmlDocument.CreateElement(S_DAV_PREFIX, "lockdiscovery", S_DAV_NAMESPACE_URI); XmlElement ActiveLock = XmlDocument.CreateElement(S_DAV_PREFIX, "activelock", S_DAV_NAMESPACE_URI); XmlElement LockType = XmlDocument.CreateElement(S_DAV_PREFIX, "locktype", S_DAV_NAMESPACE_URI); LockType.AppendChild(XmlDocument.CreateElement(S_DAV_PREFIX, "write", S_DAV_NAMESPACE_URI)); XmlElement LockScope = XmlDocument.CreateElement(S_DAV_PREFIX, "lockscope", S_DAV_NAMESPACE_URI); LockType.AppendChild(XmlDocument.CreateElement(S_DAV_PREFIX, "exclusive", S_DAV_NAMESPACE_URI)); Dictionary<String, String> MoreProps = new Dictionary<String, String>(); MoreProps.Add("depth", "0"); MoreProps.Add("owner", Owner); MoreProps.Add("timeout", "Second-3600"); XmlElement ElemMoreActivelockProps = CreatePropstatElement(header, XmlDocument, MoreProps, header.Destination); #region LockToken XmlElement LockToken = XmlDocument.CreateElement(S_DAV_PREFIX, "locktoken", S_DAV_NAMESPACE_URI); XmlElement LockTokenHRef = XmlDocument.CreateElement(S_DAV_PREFIX, "href", S_DAV_NAMESPACE_URI); //"opaquelocktoken:{A2E9F1BD-47DB-487E-AA85-8A10ACFA391D}20090323T091747Z"; LockTokenHRef.InnerText = "opaquelocktoken:{" + Guid.NewGuid().ToString() + "}" + TimestampNonce.AsString(S_DATETIME_FORMAT); //20090323T091747Z"; LockToken.AppendChild(LockTokenHRef); #endregion ActiveLock.AppendChild(LockType); ActiveLock.AppendChild(LockScope); ActiveLock.AppendChild(ElemMoreActivelockProps); ActiveLock.AppendChild(LockToken); LockDiscovery.AppendChild(ActiveLock); Root.AppendChild(LockDiscovery); XmlDocument.AppendChild(Root); #endregion #region Stream XmlDocument to ByteArray XmlWriterSettings settings; settings = new XmlWriterSettings(); settings.Encoding = Encoding.UTF8; using (MemoryStream stream = new MemoryStream()) { using (XmlWriter writer = XmlWriter.Create(stream, settings)) { XmlDocument.WriteContentTo(writer); writer.Flush(); return stream.ToArray(); } } #endregion }
/// <summary> /// Parses a webDAV request body for some properties and return them /// </summary> /// <param name="body"></param> /// <returns></returns> private PropfindProperties ParsePropfindBody(Byte[] body) { PropfindProperties FoundPropfindProperties = PropfindProperties.NONE; String BodyString = Encoding.UTF8.GetString(body); try { XmlDocument XmlDocument = new XmlDocument(); XmlDocument.LoadXml(BodyString); String NamespacePrefix = XmlDocument.GetPrefixOfNamespace(S_DAV_NAMESPACE_URI); if (NamespacePrefix == "") NamespacePrefix = S_DAV_PREFIX; XmlNamespaceManager XmlNamespaceManager = new XmlNamespaceManager(XmlDocument.NameTable); XmlNamespaceManager.AddNamespace(NamespacePrefix, S_DAV_NAMESPACE_URI); if (XmlDocument.SelectSingleNode(String.Concat("/", NamespacePrefix, ":propfind/", NamespacePrefix, ":allprop"), XmlNamespaceManager) != null) return PropfindProperties.AllProp; XmlNode Node = XmlDocument.SelectSingleNode(String.Concat("/",NamespacePrefix,":propfind/",NamespacePrefix,":prop"), XmlNamespaceManager); if (Node != null) { foreach (XmlNode ChildNodes in Node.ChildNodes) { String Prop = ChildNodes.LocalName; switch (Prop.ToLower()) { case "creationdate": FoundPropfindProperties |= PropfindProperties.Creationdate; break; case "displayname": FoundPropfindProperties |= PropfindProperties.Displayname; break; case "getcontentlanguage": FoundPropfindProperties |= PropfindProperties.Getcontentlanguage; break; case "getcontentlength": FoundPropfindProperties |= PropfindProperties.Getcontentlength; break; case "getcontenttype": FoundPropfindProperties |= PropfindProperties.Getcontenttype; break; case "getetag": FoundPropfindProperties |= PropfindProperties.Getetag; break; case "getlastmodified": FoundPropfindProperties |= PropfindProperties.Getlastmodified; break; case "lockdiscovery": FoundPropfindProperties |= PropfindProperties.Lockdiscovery; break; case "resourcetype": FoundPropfindProperties |= PropfindProperties.Resourcetype; break; case "supportedlock": FoundPropfindProperties |= PropfindProperties.Supportedlock; break; #region SVN case "version-controlled-configuration": FoundPropfindProperties |= PropfindProperties.VersionControlledConfiguration; break; case "baseline-relative-path": FoundPropfindProperties |= PropfindProperties.BaselineRelativePath; break; case "repository-uuid": FoundPropfindProperties |= PropfindProperties.RepositoryUuid; break; case "checked-in": FoundPropfindProperties |= PropfindProperties.CheckedIn; break; case "baseline-collection": FoundPropfindProperties |= PropfindProperties.BaselineCollection; break; case "version-Name": FoundPropfindProperties |= PropfindProperties.VersionName; break; case "creator-displayname": FoundPropfindProperties |= PropfindProperties.CreatorDisplayname; break; case "deadprop-count": FoundPropfindProperties |= PropfindProperties.DeadpropCount; break; #endregion default: //FoundPropfindProperties |= PropfindProperties.NONE; break; } } } } catch { return PropfindProperties.NONE; } return FoundPropfindProperties; }
/// <summary> /// Create a repsonse for a LOCK request - introducing a file copy (get) /// </summary> /// <param name="properties"></param> /// <returns></returns> private Byte[] CreateLockResponse(HTTPHeader header, Byte[] body, WebDAVDepth depth, params string[] properties) { #region Get Owner XmlDocument OwnerXmlDocument = new XmlDocument(); OwnerXmlDocument.LoadXml(Encoding.UTF8.GetString(body)); String NamespacePrefix = OwnerXmlDocument.GetPrefixOfNamespace(S_DAV_NAMESPACE_URI); if (NamespacePrefix == "") NamespacePrefix = S_DAV_PREFIX; XmlNamespaceManager XmlNamespaceManager = new XmlNamespaceManager(OwnerXmlDocument.NameTable); XmlNamespaceManager.AddNamespace(NamespacePrefix, S_DAV_NAMESPACE_URI); XmlElement OwnerRoot = OwnerXmlDocument.DocumentElement; XmlNode OwnerNode = OwnerRoot.SelectSingleNode(String.Concat("/", S_DAV_PREFIX, ":lockinfo/", S_DAV_PREFIX, ":owner/", S_DAV_PREFIX, ":href"), XmlNamespaceManager); String Owner = OwnerNode.InnerText; #endregion String LockTokenString = String.Concat("{" + Guid.NewGuid().ToString() + "}"); TimeSpan LockLifetime; try { LockLifetime = TimeSpan.FromSeconds(Double.Parse(header.Headers["Timeout"].Substring(header.Headers["Timeout"].IndexOf('-') + 1))); } catch { LockLifetime = TimeSpan.FromSeconds(60 * 60); } RessourceLock.LockRessource(LockTokenString, header.Destination, LockLifetime); #region Create XmlDocument XmlDocument XmlDocument = new XmlDocument(); XmlElement Root = XmlDocument.CreateElement(S_DAV_PREFIX, "prop", S_DAV_NAMESPACE_URI); AddPropfindLockdiscoveryElements(Root, header.Destination, header.FullHTTPDestinationPath()); XmlDocument.AppendChild(Root); #endregion #region Stream XmlDocument to ByteArray XmlWriterSettings settings; settings = new XmlWriterSettings(); settings.Encoding = Encoding.UTF8; using (MemoryStream stream = new MemoryStream()) { using (XmlWriter writer = XmlWriter.Create(stream, settings)) { XmlDocument.WriteContentTo(writer); writer.Flush(); return CleanContent(stream.ToArray()); } } #endregion }