From 7dd090820b26700cc98ed1adc80c11159fa61c38 Mon Sep 17 00:00:00 2001 From: vfedosevich Date: Tue, 13 Jan 2015 04:18:56 -0800 Subject: [PATCH] webdav portal auth via ad --- .../Entities/AbstractConfigCollection.cs | 2 +- .../Config/Entities/ElementsRendering.cs | 2 +- .../Config/Entities/FileIconsDictionary.cs | 4 +- .../Config/Entities/HttpErrorsCollection.cs | 7 +- .../Config/Entities/OfficeOnlineCollection.cs | 2 +- .../Config/Entities/SessionKeysCollection.cs | 7 +- .../WebsitePanelConstantUserParameters.cs | 2 +- .../Config/IWebDavAppConfig.cs | 4 +- .../ApplicationNameElement.cs | 2 +- .../AuthTimeoutCookieNameElement.cs | 21 ++ .../ElementsRenderingElement.cs | 2 +- .../WebConfigSections/FileIconsElement.cs | 2 +- .../FileIconsElementCollection.cs | 2 +- .../WebConfigSections/OfficeOnlineElement.cs | 0 .../OfficeOnlineElementCollection.cs | 0 .../WebConfigSections/SessionKeysElement.cs | 1 + .../SessionKeysElementCollection.cs | 3 +- .../WebConfigSections/UserDomainElement.cs | 2 +- ...DavExplorerConfigurationSettingsSection.cs | 9 + .../WebsitePanelConstantUserElement.cs | 2 +- .../Config/WebDavAppConfigManager.cs | 9 +- .../Security/IAuthenticationService.cs | 16 + .../Resources/HttpErrors.Designer.cs} | 34 +-- .../Resources/HttpErrors.resx} | 0 .../FormsAuthenticationService.cs | 74 +++++ .../Authentication/Principals/WspPrincipal.cs | 47 +++ .../Security}/Cryptography/CryptoUtils.cs | 9 +- .../Security}/Cryptography/ICryptography.cs | 2 +- .../WebsitePanel.WebDav.Core.csproj | 103 +++++++ .../Wsp/Framework/WSP.cs | 287 ++++++++++++++++++ .../WebsitePanel.WebDav.Core/WspContext.cs | 15 + .../WebsitePanel.WebDav.Core/packages.config | 7 + .../App_Start/BundleConfig.cs | 9 +- .../App_Start/RouteConfig.cs | 2 +- .../OrganizationRouteConstraint.cs | 27 +- .../Controllers/AccountController.cs | 94 ++---- .../Controllers/ErrorController.cs | 2 +- .../Controllers/FileSystemController.cs | 9 +- .../LdapAuthorizationAttribute.cs | 12 - .../DependencyInjection/PortalDependencies.cs | 15 +- .../Providers/AccountInfoProvider.cs | 25 -- .../Providers/WebDavManagerProvider.cs | 17 +- .../FileOperations/FileOpenerManager.cs | 2 +- .../WebsitePanel.WebDavPortal/Global.asax.cs | 46 +++ .../Models/AccountModel.cs | 12 - .../Models/IWebDavManager.cs | 1 - .../Models/WebDavManager.cs | 40 +-- .../Scripts/appScripts/authentication.js | 18 ++ .../Scripts/jquery.cookie.js | 117 +++++++ .../Views/Error/Index.cshtml | 2 + .../Views/FileSystem/ShowContent.cshtml | 7 +- .../Views/FileSystem/_ResoursePartial.cshtml | 6 +- .../Views/Shared/_Layout.cshtml | 23 +- .../WebsitePanel.WebDavPortal/Web.config | 1 + .../WebsitePanel.WebDavPortal.csproj | 41 +-- .../WebsitePanel.WebDavPortal/packages.config | 1 + 56 files changed, 927 insertions(+), 281 deletions(-) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core}/Config/Entities/AbstractConfigCollection.cs (87%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core}/Config/Entities/ElementsRendering.cs (89%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core}/Config/Entities/FileIconsDictionary.cs (90%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core}/Config/Entities/HttpErrorsCollection.cs (52%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core}/Config/Entities/OfficeOnlineCollection.cs (92%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core}/Config/Entities/SessionKeysCollection.cs (88%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core}/Config/Entities/WebsitePanelConstantUserParameters.cs (85%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core}/Config/IWebDavAppConfig.cs (81%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core/Config}/WebConfigSections/ApplicationNameElement.cs (83%) create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/AuthTimeoutCookieNameElement.cs rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core/Config}/WebConfigSections/ElementsRenderingElement.cs (92%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core/Config}/WebConfigSections/FileIconsElement.cs (88%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core/Config}/WebConfigSections/FileIconsElementCollection.cs (90%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core/Config}/WebConfigSections/OfficeOnlineElement.cs (100%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core/Config}/WebConfigSections/OfficeOnlineElementCollection.cs (100%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core/Config}/WebConfigSections/SessionKeysElement.cs (91%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core/Config}/WebConfigSections/SessionKeysElementCollection.cs (78%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core/Config}/WebConfigSections/UserDomainElement.cs (83%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core/Config}/WebConfigSections/WebDavExplorerConfigurationSettingsSection.cs (84%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core/Config}/WebConfigSections/WebsitePanelConstantUserElement.cs (89%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core}/Config/WebDavAppConfigManager.cs (86%) create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Security/IAuthenticationService.cs rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal/App_GlobalResources/Resource.errors.designer.cs => WebsitePanel.WebDav.Core/Resources/HttpErrors.Designer.cs} (82%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal/App_GlobalResources/Resource.errors.resx => WebsitePanel.WebDav.Core/Resources/HttpErrors.resx} (100%) create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Security/Authentication/FormsAuthenticationService.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Security/Authentication/Principals/WspPrincipal.cs rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core/Security}/Cryptography/CryptoUtils.cs (94%) rename WebsitePanel/Sources/{WebsitePanel.WebDavPortal => WebsitePanel.WebDav.Core/Security}/Cryptography/ICryptography.cs (67%) create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/Wsp/Framework/WSP.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/WspContext.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDav.Core/packages.config delete mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/AccountInfoProvider.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/appScripts/authentication.js create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/jquery.cookie.js diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/AbstractConfigCollection.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/AbstractConfigCollection.cs similarity index 87% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/AbstractConfigCollection.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/AbstractConfigCollection.cs index 3dca9866..fb49467c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/AbstractConfigCollection.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/AbstractConfigCollection.cs @@ -1,7 +1,7 @@ using System.Configuration; using WebsitePanel.WebDavPortal.WebConfigSections; -namespace WebsitePanel.WebDavPortal.Config.Entities +namespace WebsitePanel.WebDav.Core.Config.Entities { public abstract class AbstractConfigCollection { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/ElementsRendering.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/ElementsRendering.cs similarity index 89% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/ElementsRendering.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/ElementsRendering.cs index c5703a8a..f6f33649 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/ElementsRendering.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/ElementsRendering.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Linq; -namespace WebsitePanel.WebDavPortal.Config.Entities +namespace WebsitePanel.WebDav.Core.Config.Entities { public class ElementsRendering : AbstractConfigCollection { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/FileIconsDictionary.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/FileIconsDictionary.cs similarity index 90% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/FileIconsDictionary.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/FileIconsDictionary.cs index 45568227..6bd7b26c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/FileIconsDictionary.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/FileIconsDictionary.cs @@ -1,9 +1,9 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -using WebsitePanel.WebDavPortal.WebConfigSections; +using WebsitePanel.WebDav.Core.Config.WebConfigSections; -namespace WebsitePanel.WebDavPortal.Config.Entities +namespace WebsitePanel.WebDav.Core.Config.Entities { public class FileIconsDictionary : AbstractConfigCollection, IReadOnlyDictionary { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/HttpErrorsCollection.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/HttpErrorsCollection.cs similarity index 52% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/HttpErrorsCollection.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/HttpErrorsCollection.cs index 2aab1acb..e2c6b920 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/HttpErrorsCollection.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/HttpErrorsCollection.cs @@ -1,7 +1,6 @@ using System.Globalization; -using Resources.Resource; -namespace WebsitePanel.WebDavPortal.Config.Entities +namespace WebsitePanel.WebDav.Core.Config.Entities { public class HttpErrorsCollection { @@ -9,14 +8,14 @@ namespace WebsitePanel.WebDavPortal.Config.Entities { get { - var message = errors.ResourceManager.GetString("_" + statusCode.ToString(CultureInfo.InvariantCulture)); + var message = Resources.HttpErrors.ResourceManager.GetString("_" + statusCode.ToString(CultureInfo.InvariantCulture)); return message ?? Default; } } public string Default { - get { return errors.Default; } + get { return Resources.HttpErrors.Default; } } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/OfficeOnlineCollection.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/OfficeOnlineCollection.cs similarity index 92% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/OfficeOnlineCollection.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/OfficeOnlineCollection.cs index c247020f..a28114b5 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/OfficeOnlineCollection.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/OfficeOnlineCollection.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using WebsitePanel.WebDavPortal.WebConfigSections; -namespace WebsitePanel.WebDavPortal.Config.Entities +namespace WebsitePanel.WebDav.Core.Config.Entities { public class OfficeOnlineCollection : AbstractConfigCollection, IReadOnlyCollection { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/SessionKeysCollection.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/SessionKeysCollection.cs similarity index 88% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/SessionKeysCollection.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/SessionKeysCollection.cs index c733473d..057be2cf 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/SessionKeysCollection.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/SessionKeysCollection.cs @@ -1,9 +1,8 @@ using System.Collections.Generic; -using System.Configuration; using System.Linq; using WebsitePanel.WebDavPortal.WebConfigSections; -namespace WebsitePanel.WebDavPortal.Config.Entities +namespace WebsitePanel.WebDav.Core.Config.Entities { public class SessionKeysCollection : AbstractConfigCollection { @@ -14,12 +13,12 @@ namespace WebsitePanel.WebDavPortal.Config.Entities _sessionKeys = ConfigSection.SessionKeys.Cast(); } - public string AccountInfo + public string AuthTicket { get { SessionKeysElement sessionKey = - _sessionKeys.FirstOrDefault(x => x.Key == SessionKeysElement.AccountInfoKey); + _sessionKeys.FirstOrDefault(x => x.Key == SessionKeysElement.AuthTicketKey); return sessionKey != null ? sessionKey.Value : null; } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/WebsitePanelConstantUserParameters.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/WebsitePanelConstantUserParameters.cs similarity index 85% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/WebsitePanelConstantUserParameters.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/WebsitePanelConstantUserParameters.cs index 41336fcb..fdc6c99f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/Entities/WebsitePanelConstantUserParameters.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/Entities/WebsitePanelConstantUserParameters.cs @@ -1,4 +1,4 @@ -namespace WebsitePanel.WebDavPortal.Config.Entities +namespace WebsitePanel.WebDav.Core.Config.Entities { public class WebsitePanelConstantUserParameters : AbstractConfigCollection { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/IWebDavAppConfig.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/IWebDavAppConfig.cs similarity index 81% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/IWebDavAppConfig.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/IWebDavAppConfig.cs index efed85e9..9bb3b4d8 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/IWebDavAppConfig.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/IWebDavAppConfig.cs @@ -1,6 +1,6 @@ -using WebsitePanel.WebDavPortal.Config.Entities; +using WebsitePanel.WebDav.Core.Config.Entities; -namespace WebsitePanel.WebDavPortal.Config +namespace WebsitePanel.WebDav.Core.Config { public interface IWebDavAppConfig { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/ApplicationNameElement.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/ApplicationNameElement.cs similarity index 83% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/ApplicationNameElement.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/ApplicationNameElement.cs index 7ab267ea..149c4432 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/ApplicationNameElement.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/ApplicationNameElement.cs @@ -1,6 +1,6 @@ using System.Configuration; -namespace WebsitePanel.WebDavPortal.WebConfigSections +namespace WebsitePanel.WebDav.Core.Config.WebConfigSections { public class ApplicationNameElement : ConfigurationElement { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/AuthTimeoutCookieNameElement.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/AuthTimeoutCookieNameElement.cs new file mode 100644 index 00000000..7585199a --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/AuthTimeoutCookieNameElement.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WebsitePanel.WebDav.Core.Config.WebConfigSections +{ + public class AuthTimeoutCookieNameElement : ConfigurationElement + { + private const string ValueKey = "value"; + + [ConfigurationProperty(ValueKey, IsKey = true, IsRequired = true)] + public string Value + { + get { return (string)this[ValueKey]; } + set { this[ValueKey] = value; } + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/ElementsRenderingElement.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/ElementsRenderingElement.cs similarity index 92% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/ElementsRenderingElement.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/ElementsRenderingElement.cs index a5a9a6ce..f25b2034 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/ElementsRenderingElement.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/ElementsRenderingElement.cs @@ -1,6 +1,6 @@ using System.Configuration; -namespace WebsitePanel.WebDavPortal.WebConfigSections +namespace WebsitePanel.WebDav.Core.Config.WebConfigSections { public class ElementsRenderingElement : ConfigurationElement { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/FileIconsElement.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FileIconsElement.cs similarity index 88% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/FileIconsElement.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FileIconsElement.cs index bd31e4e1..a55039c4 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/FileIconsElement.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FileIconsElement.cs @@ -1,6 +1,6 @@ using System.Configuration; -namespace WebsitePanel.WebDavPortal.WebConfigSections +namespace WebsitePanel.WebDav.Core.Config.WebConfigSections { public class FileIconsElement : ConfigurationElement { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/FileIconsElementCollection.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FileIconsElementCollection.cs similarity index 90% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/FileIconsElementCollection.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FileIconsElementCollection.cs index 90868515..fb3d5340 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/FileIconsElementCollection.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/FileIconsElementCollection.cs @@ -1,6 +1,6 @@ using System.Configuration; -namespace WebsitePanel.WebDavPortal.WebConfigSections +namespace WebsitePanel.WebDav.Core.Config.WebConfigSections { [ConfigurationCollection(typeof (FileIconsElement))] public class FileIconsElementCollection : ConfigurationElementCollection diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/OfficeOnlineElement.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/OfficeOnlineElement.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/OfficeOnlineElement.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/OfficeOnlineElement.cs diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/OfficeOnlineElementCollection.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/OfficeOnlineElementCollection.cs similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/OfficeOnlineElementCollection.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/OfficeOnlineElementCollection.cs diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/SessionKeysElement.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/SessionKeysElement.cs similarity index 91% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/SessionKeysElement.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/SessionKeysElement.cs index d082c528..cfe2e0b9 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/SessionKeysElement.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/SessionKeysElement.cs @@ -8,6 +8,7 @@ namespace WebsitePanel.WebDavPortal.WebConfigSections private const string ValueKey = "value"; public const string AccountInfoKey = "AccountInfoSessionKey"; + public const string AuthTicketKey = "AuthTicketKey"; public const string WebDavManagerKey = "WebDavManagerSessionKey"; public const string ResourseRenderCountKey = "ResourseRenderCountSessionKey"; public const string ItemIdSessionKey = "ItemId"; diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/SessionKeysElementCollection.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/SessionKeysElementCollection.cs similarity index 78% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/SessionKeysElementCollection.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/SessionKeysElementCollection.cs index 31abb74e..b1c67591 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/SessionKeysElementCollection.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/SessionKeysElementCollection.cs @@ -1,6 +1,7 @@ using System.Configuration; +using WebsitePanel.WebDavPortal.WebConfigSections; -namespace WebsitePanel.WebDavPortal.WebConfigSections +namespace WebsitePanel.WebDav.Core.Config.WebConfigSections { [ConfigurationCollection(typeof (SessionKeysElement))] public class SessionKeysElementCollection : ConfigurationElementCollection diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/UserDomainElement.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/UserDomainElement.cs similarity index 83% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/UserDomainElement.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/UserDomainElement.cs index c8ce5ab9..68145beb 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/UserDomainElement.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/UserDomainElement.cs @@ -1,6 +1,6 @@ using System.Configuration; -namespace WebsitePanel.WebDavPortal.WebConfigSections +namespace WebsitePanel.WebDav.Core.Config.WebConfigSections { public class UserDomainElement : ConfigurationElement { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/WebDavExplorerConfigurationSettingsSection.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/WebDavExplorerConfigurationSettingsSection.cs similarity index 84% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/WebDavExplorerConfigurationSettingsSection.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/WebDavExplorerConfigurationSettingsSection.cs index e84491ab..af4e472e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/WebDavExplorerConfigurationSettingsSection.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/WebDavExplorerConfigurationSettingsSection.cs @@ -1,10 +1,12 @@ using System.Configuration; +using WebsitePanel.WebDav.Core.Config.WebConfigSections; namespace WebsitePanel.WebDavPortal.WebConfigSections { public class WebDavExplorerConfigurationSettingsSection : ConfigurationSection { private const string UserDomainKey = "userDomain"; + private const string AuthTimeoutCookieNameKey = "authTimeoutCookieName"; private const string AppName = "applicationName"; private const string WebsitePanelConstantUserKey = "websitePanelConstantUser"; private const string ElementsRenderingKey = "elementsRendering"; @@ -16,6 +18,13 @@ namespace WebsitePanel.WebDavPortal.WebConfigSections public const string SectionName = "webDavExplorerConfigurationSettings"; + [ConfigurationProperty(AuthTimeoutCookieNameKey, IsRequired = true)] + public AuthTimeoutCookieNameElement AuthTimeoutCookieName + { + get { return (AuthTimeoutCookieNameElement)this[AuthTimeoutCookieNameKey]; } + set { this[AuthTimeoutCookieNameKey] = value; } + } + [ConfigurationProperty(UserDomainKey, IsRequired = true)] public UserDomainElement UserDomain { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/WebsitePanelConstantUserElement.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/WebsitePanelConstantUserElement.cs similarity index 89% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/WebsitePanelConstantUserElement.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/WebsitePanelConstantUserElement.cs index dfbb388e..abe87357 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebConfigSections/WebsitePanelConstantUserElement.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebConfigSections/WebsitePanelConstantUserElement.cs @@ -1,6 +1,6 @@ using System.Configuration; -namespace WebsitePanel.WebDavPortal.WebConfigSections +namespace WebsitePanel.WebDav.Core.Config.WebConfigSections { public class WebsitePanelConstantUserElement : ConfigurationElement { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/WebDavAppConfigManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebDavAppConfigManager.cs similarity index 86% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/WebDavAppConfigManager.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebDavAppConfigManager.cs index 31e9d2b9..cd28a090 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Config/WebDavAppConfigManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Config/WebDavAppConfigManager.cs @@ -1,8 +1,8 @@ using System.Configuration; -using WebsitePanel.WebDavPortal.Config.Entities; +using WebsitePanel.WebDav.Core.Config.Entities; using WebsitePanel.WebDavPortal.WebConfigSections; -namespace WebsitePanel.WebDavPortal.Config +namespace WebsitePanel.WebDav.Core.Config { public class WebDavAppConfigManager : IWebDavAppConfig { @@ -35,6 +35,11 @@ namespace WebsitePanel.WebDavPortal.Config get { return _configSection.ApplicationName.Value; } } + public string AuthTimeoutCookieName + { + get { return _configSection.AuthTimeoutCookieName.Value; } + } + public ElementsRendering ElementsRendering { get; private set; } public WebsitePanelConstantUserParameters WebsitePanelConstantUserParameters { get; private set; } public SessionKeysCollection SessionKeys { get; private set; } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Security/IAuthenticationService.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Security/IAuthenticationService.cs new file mode 100644 index 00000000..6bd042a4 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Security/IAuthenticationService.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using WebsitePanel.WebDav.Core.Security.Authentication.Principals; + +namespace WebsitePanel.WebDav.Core.Interfaces.Security +{ + public interface IAuthenticationService + { + WspPrincipal LogIn(string login, string password); + void CreateAuthenticationTicket(WspPrincipal principal); + void LogOut(); + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_GlobalResources/Resource.errors.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Resources/HttpErrors.Designer.cs similarity index 82% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_GlobalResources/Resource.errors.designer.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Resources/HttpErrors.Designer.cs index f673f97d..33bd76c7 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_GlobalResources/Resource.errors.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Resources/HttpErrors.Designer.cs @@ -1,14 +1,14 @@ -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.18449 +// Runtime Version:4.0.30319.33440 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ -namespace Resources.Resource { +namespace WebsitePanel.WebDav.Core.Resources { using System; @@ -18,18 +18,18 @@ namespace Resources.Resource { // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option or rebuild the Visual Studio project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Web.Application.StronglyTypedResourceProxyBuilder", "12.0.0.0")] + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class errors { + internal class HttpErrors { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal errors() { + internal HttpErrors() { } /// @@ -39,7 +39,7 @@ namespace Resources.Resource { internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Resources.Resource.errors", global::System.Reflection.Assembly.Load("App_GlobalResources")); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WebsitePanel.WebDav.Core.Resources.HttpErrors", typeof(HttpErrors).Assembly); resourceMan = temp; } return resourceMan; @@ -60,15 +60,6 @@ namespace Resources.Resource { } } - /// - /// Looks up a localized string similar to Fatal error. - /// - internal static string Default { - get { - return ResourceManager.GetString("Default", resourceCulture); - } - } - /// /// Looks up a localized string similar to The requested content was not found. /// @@ -86,5 +77,14 @@ namespace Resources.Resource { return ResourceManager.GetString("_500", resourceCulture); } } + + /// + /// Looks up a localized string similar to Fatal error. + /// + internal static string Default { + get { + return ResourceManager.GetString("Default", resourceCulture); + } + } } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_GlobalResources/Resource.errors.resx b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Resources/HttpErrors.resx similarity index 100% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_GlobalResources/Resource.errors.resx rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Resources/HttpErrors.resx diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Security/Authentication/FormsAuthenticationService.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Security/Authentication/FormsAuthenticationService.cs new file mode 100644 index 00000000..0c3208e8 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Security/Authentication/FormsAuthenticationService.cs @@ -0,0 +1,74 @@ +using System; +using System.DirectoryServices.AccountManagement; +using System.Web; +using System.Web.Script.Serialization; +using System.Web.Security; +using WebsitePanel.WebDav.Core.Interfaces.Security; +using WebsitePanel.WebDav.Core.Security.Authentication.Principals; +using WebsitePanel.WebDav.Core.Security.Cryptography; +using WebsitePanel.WebDav.Core.Wsp.Framework; + +namespace WebsitePanel.WebDav.Core.Security.Authentication +{ + public class FormsAuthenticationService : IAuthenticationService + { + private readonly ICryptography _cryptography; + private readonly PrincipalContext _principalContext; + + public FormsAuthenticationService(ICryptography cryptography) + { + _cryptography = cryptography; + _principalContext = new PrincipalContext(ContextType.Domain); + } + + public WspPrincipal LogIn(string login, string password) + { + if (_principalContext.ValidateCredentials(login, password) == false) + { + return null; + } + + var principal = new WspPrincipal(login); + + var exchangeAccount = WSP.Services.ExchangeServer.GetAccountByAccountNameWithoutItemId(login); + var organization = WSP.Services.Organizations.GetOrganization(exchangeAccount.ItemId); + + principal.AccountId = exchangeAccount.AccountId; + principal.ItemId = exchangeAccount.ItemId; + principal.OrganizationId = organization.OrganizationId; + principal.DisplayName = exchangeAccount.DisplayName; + principal.EncryptedPassword = _cryptography.Encrypt(password); + + CreateAuthenticationTicket(principal); + + HttpContext.Current.User = principal; + + return principal; + } + + public void CreateAuthenticationTicket(WspPrincipal principal) + { + var serializer = new JavaScriptSerializer(); + string userData = serializer.Serialize(principal); + + var authTicket = new FormsAuthenticationTicket(1, principal.Identity.Name, DateTime.Now, DateTime.Now.Add(FormsAuthentication.Timeout), + FormsAuthentication.SlidingExpiration, userData); + + var encTicket = FormsAuthentication.Encrypt(authTicket); + + var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); + + if (FormsAuthentication.SlidingExpiration) + { + cookie.Expires = authTicket.Expiration; + } + + HttpContext.Current.Response.Cookies.Add(cookie); + } + + public void LogOut() + { + FormsAuthentication.SignOut(); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Security/Authentication/Principals/WspPrincipal.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Security/Authentication/Principals/WspPrincipal.cs new file mode 100644 index 00000000..15401a14 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Security/Authentication/Principals/WspPrincipal.cs @@ -0,0 +1,47 @@ +using System.Security.Principal; +using System.Web.Script.Serialization; +using System.Web.Security; +using System.Xml.Serialization; + +namespace WebsitePanel.WebDav.Core.Security.Authentication.Principals +{ + public class WspPrincipal : IPrincipal + { + public int AccountId { get; set; } + public string OrganizationId { get; set; } + public int ItemId { get; set; } + + public string Login { get; set; } + public string EncryptedPassword { get; set; } + + public string DisplayName { get; set; } + + public string UserName + { + get + { + return !string.IsNullOrEmpty(Login) ? Login.Split('@')[0] : string.Empty; + } + } + + [XmlIgnore, ScriptIgnore] + public IIdentity Identity { get; private set; } + + public WspPrincipal(string username) + { + Identity = new GenericIdentity(username); + Login = username; + } + + public WspPrincipal() + { + } + + public bool IsInRole(string role) + { + return Identity.IsAuthenticated + && !string.IsNullOrWhiteSpace(role) + && Roles.IsUserInRole(Identity.Name, role); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Cryptography/CryptoUtils.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Security/Cryptography/CryptoUtils.cs similarity index 94% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/Cryptography/CryptoUtils.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Security/Cryptography/CryptoUtils.cs index 5251babd..893ebfc1 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Cryptography/CryptoUtils.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Security/Cryptography/CryptoUtils.cs @@ -1,14 +1,11 @@ -using Microsoft.Win32; -using System; -using System.Collections.Generic; +using System; using System.Configuration; using System.IO; -using System.Linq; using System.Security.Cryptography; using System.Text; -using System.Web; +using Microsoft.Win32; -namespace WebsitePanel.WebDavPortal.Cryptography +namespace WebsitePanel.WebDav.Core.Security.Cryptography { public class CryptoUtils : ICryptography { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Cryptography/ICryptography.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Security/Cryptography/ICryptography.cs similarity index 67% rename from WebsitePanel/Sources/WebsitePanel.WebDavPortal/Cryptography/ICryptography.cs rename to WebsitePanel/Sources/WebsitePanel.WebDav.Core/Security/Cryptography/ICryptography.cs index 09eb03a4..b3c8e6a1 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Cryptography/ICryptography.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Security/Cryptography/ICryptography.cs @@ -1,4 +1,4 @@ -namespace WebsitePanel.WebDavPortal.Cryptography +namespace WebsitePanel.WebDav.Core.Security.Cryptography { public interface ICryptography { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebsitePanel.WebDav.Core.csproj b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebsitePanel.WebDav.Core.csproj index 03eaee5a..cdd7e02b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebsitePanel.WebDav.Core.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/WebsitePanel.WebDav.Core.csproj @@ -11,6 +11,8 @@ WebsitePanel.WebDav.Core v4.5 512 + ..\ + true true @@ -30,18 +32,82 @@ 4 + + True + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + + + False + ..\..\..\..\Scheduler Domains\WebsitePanel\Bin\Microsoft.Web.Services3.dll + True + + + C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Web.dll + + + False + ..\packages\Microsoft.AspNet.WebPages.3.2.2\lib\net45\System.Web.Helpers.dll + + + False + ..\packages\Microsoft.AspNet.Mvc.5.2.2\lib\net45\System.Web.Mvc.dll + + + False + ..\packages\Microsoft.AspNet.Razor.3.2.2\lib\net45\System.Web.Razor.dll + + + + False + ..\packages\Microsoft.AspNet.WebPages.3.2.2\lib\net45\System.Web.WebPages.dll + + + False + ..\packages\Microsoft.AspNet.WebPages.3.2.2\lib\net45\System.Web.WebPages.Deployment.dll + + + False + ..\packages\Microsoft.AspNet.WebPages.3.2.2\lib\net45\System.Web.WebPages.Razor.dll + + + ..\WebsitePanel.WebPortal\Bin\WebsitePanel.EnterpriseServer.Client.dll + + + ..\WebsitePanel.WebPortal\Bin\WebsitePanel.Providers.Base.dll + + + + + + + + + + + + + + + + + + + + + + @@ -49,6 +115,7 @@ + @@ -56,9 +123,45 @@ + + True + True + HttpErrors.resx + + + + + + + + + + + + + + + + + {C99EFB18-FFE7-45BB-8CA8-29336F3E8C68} + WebsitePanel.WebPortal + + + + + ResXFileCodeGenerator + HttpErrors.Designer.cs + + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebsitePanel.WebDavPortal.csproj b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebsitePanel.WebDavPortal.csproj index 369a9e7b..bd1bf241 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebsitePanel.WebDavPortal.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebsitePanel.WebDavPortal.csproj @@ -137,31 +137,14 @@ - - True - True - Resource.errors.resx - - - - - - - - - - - - - @@ -186,17 +169,6 @@ - - - - - - - - - - - @@ -248,6 +220,7 @@ Designer + @@ -256,6 +229,7 @@ + @@ -292,22 +266,11 @@ - - - GlobalResourceProxyGenerator - Resource.errors.designer.cs - Designer - - {BA147805-9EF1-45F2-BF32-A5825D4E950D} WebsitePanel.WebDav.Core - - {12232731-5C45-4ED6-98F8-D47ABE728280} - WebsitePanel.Portal.Modules - 10.0 diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/packages.config b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/packages.config index e9fed748..f297089d 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/packages.config +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/packages.config @@ -3,6 +3,7 @@ +