From 2244ce5add2910a87f808229591141b9b9328e7f Mon Sep 17 00:00:00 2001 From: vfedosevich Date: Sat, 10 Jan 2015 00:49:29 -0800 Subject: [PATCH] webdav portal Dependency resolver added --- .../OrganizationRouteConstraint.cs | 7 ++-- .../Controllers/AccountController.cs | 32 +++++++++++++---- .../Controllers/FileSystemController.cs | 27 ++++++++------ .../LdapAuthorizationAttribute.cs | 10 ++++-- .../NinjectDependecyResolver.cs | 35 +++++++++++++++++++ .../DependencyInjection/PortalDependencies.cs | 23 ++++++++++++ .../Providers/AccountInfoProvider.cs | 25 +++++++++++++ .../Providers/HttpSessionStateProvider.cs | 17 +++++++++ .../Providers/WebDavManagerProvider.cs | 25 +++++++++++++ .../WebsitePanel.WebDavPortal/Global.asax.cs | 3 ++ .../Models/WebDavManager.cs | 9 +++-- .../UI/Routes/FileSystemRouteNames.cs | 12 +++++++ .../Views/FileSystem/ShowContent.cshtml | 2 +- .../Views/FileSystem/_ResoursePartial.cshtml | 3 +- .../Views/Shared/_Layout.cshtml | 7 ++-- .../WebsitePanel.WebDavPortal.csproj | 8 +++-- 16 files changed, 210 insertions(+), 35 deletions(-) create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/NinjectDependecyResolver.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/PortalDependencies.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/AccountInfoProvider.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/HttpSessionStateProvider.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/WebDavManagerProvider.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Routes/FileSystemRouteNames.cs diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Constraints/OrganizationRouteConstraint.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Constraints/OrganizationRouteConstraint.cs index 95e95750..65165a0c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Constraints/OrganizationRouteConstraint.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Constraints/OrganizationRouteConstraint.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Web; +using System.Web.Mvc; using System.Web.Routing; using WebsitePanel.WebDavPortal.Config; using WebsitePanel.WebDavPortal.DependencyInjection; @@ -16,6 +17,8 @@ namespace WebsitePanel.WebDavPortal.Constraints public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { + var webdavManager = DependencyResolver.Current.GetService(); + object value; if (!values.TryGetValue(parameterName, out value)) return false; @@ -30,9 +33,7 @@ namespace WebsitePanel.WebDavPortal.Constraints if (httpContext.Session == null) return false; - IKernel kernel = new StandardKernel(new WebDavExplorerAppModule()); - var webDavManager = kernel.Get(); - if (webDavManager != null && str == webDavManager.OrganizationName) + if (webdavManager != null && str == webdavManager.OrganizationName) { actualOrgName = str; return true; diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs index b95f91d6..7c9f5602 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs @@ -28,13 +28,21 @@ namespace WebsitePanel.WebDavPortal.Controllers { public class AccountController : Controller { - private readonly IKernel _kernel = new StandardKernel(new NinjectSettings {AllowNullInjection = true}, new WebDavExplorerAppModule()); + private readonly AccountModel _accountModel; + private readonly IWebDavManager _webdavManager; + private readonly ICryptography _cryptography; + + public AccountController(AccountModel accountModel, IWebDavManager webdavManager, ICryptography cryptography) + { + _accountModel = accountModel; + _webdavManager = webdavManager; + _cryptography = cryptography; + } [HttpGet] public ActionResult Login() { - object isAuthentication = _kernel.Get(); - if (isAuthentication != null) + if (_accountModel != null) return RedirectToAction("ShowContent", "FileSystem"); return View(); } @@ -54,16 +62,22 @@ namespace WebsitePanel.WebDavPortal.Controllers model.Groups = ES.Services.Organizations.GetSecurityGroupsByMember(exchangeAccount.ItemId, exchangeAccount.AccountId); + WebDavManager manager = null; + try { Session[WebDavAppConfigManager.Instance.SessionKeys.AccountInfo] = model; - Session[WebDavAppConfigManager.Instance.SessionKeys.WebDavManager] = new WebDavManager(new NetworkCredential(model.Login, model.Password, WebDavAppConfigManager.Instance.UserDomain), exchangeAccount.ItemId); + + manager = new WebDavManager(new NetworkCredential(model.Login, model.Password, WebDavAppConfigManager.Instance.UserDomain), exchangeAccount.ItemId); + + Session[WebDavAppConfigManager.Instance.SessionKeys.WebDavManager] = manager; } catch (ConnectToWebDavServerException exception) { return View(new AccountModel { LdapError = exception.Message }); } - return RedirectToAction("ShowContent", "FileSystem", new { org = _kernel.Get().OrganizationName }); + + return RedirectToAction("ShowContent", "FileSystem", new { org = manager.OrganizationName }); } return View(new AccountModel { LdapError = "The user name or password is incorrect" }); } @@ -78,15 +92,19 @@ namespace WebsitePanel.WebDavPortal.Controllers private void AutheticationToServicesUsingWebsitePanelUser() { - var crypto = _kernel.Get(); var websitePanelLogin = WebDavAppConfigManager.Instance.WebsitePanelConstantUserParameters.Login; - var websitePanelPassword = crypto.Decrypt(WebDavAppConfigManager.Instance.WebsitePanelConstantUserParameters.Password); + var websitePanelPassword = _cryptography.Decrypt(WebDavAppConfigManager.Instance.WebsitePanelConstantUserParameters.Password); + var authTicket = new FormsAuthenticationTicket(1, websitePanelLogin, DateTime.Now, DateTime.Now.Add(FormsAuthentication.Timeout), FormsAuthentication.SlidingExpiration, websitePanelPassword + Environment.NewLine); var encryptedTicket = FormsAuthentication.Encrypt(authTicket); var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); + if (FormsAuthentication.SlidingExpiration) + { authCookie.Expires = authTicket.Expiration; + } + Response.Cookies.Add(authCookie); } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/FileSystemController.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/FileSystemController.cs index 482a1fea..81a54ce1 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/FileSystemController.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/FileSystemController.cs @@ -22,26 +22,30 @@ namespace WebsitePanel.WebDavPortal.Controllers [LdapAuthorization] public class FileSystemController : Controller { - private readonly IKernel _kernel = new StandardKernel(new WebDavExplorerAppModule()); + private readonly IWebDavManager _webdavManager; + + public FileSystemController(IWebDavManager webdavManager) + { + _webdavManager = webdavManager; + } [HttpGet] public ActionResult ShowContent(string org, string pathPart = "") { - var webDavManager = new StandardKernel(new WebDavExplorerAppModule()).Get(); - if (org != webDavManager.OrganizationName) + if (org != _webdavManager.OrganizationName) return new HttpStatusCodeResult(HttpStatusCode.NoContent); string fileName = pathPart.Split('/').Last(); - if (webDavManager.IsFile(fileName)) + if (_webdavManager.IsFile(fileName)) { - var fileBytes = webDavManager.GetFileBytes(fileName); + var fileBytes = _webdavManager.GetFileBytes(fileName); return File(fileBytes, MediaTypeNames.Application.Octet, fileName); } try { - webDavManager.OpenFolder(pathPart); - IEnumerable children = webDavManager.GetChildren().Where(x => !WebDavAppConfigManager.Instance.ElementsRendering.ElementsToIgnore.Contains(x.DisplayName.Trim('/'))); + _webdavManager.OpenFolder(pathPart); + IEnumerable children = _webdavManager.GetChildren().Where(x => !WebDavAppConfigManager.Instance.ElementsRendering.ElementsToIgnore.Contains(x.DisplayName.Trim('/'))); var model = new ModelForWebDav { Items = children.Take(WebDavAppConfigManager.Instance.ElementsRendering.DefaultCount), UrlSuffix = pathPart }; Session[WebDavAppConfigManager.Instance.SessionKeys.ResourseRenderCount] = WebDavAppConfigManager.Instance.ElementsRendering.DefaultCount; @@ -56,8 +60,7 @@ namespace WebsitePanel.WebDavPortal.Controllers public ActionResult ShowOfficeDocument(string org, string pathPart = "") { - var webDavManager = _kernel.Get(); - string fileUrl = webDavManager.RootPath.TrimEnd('/') + "/" + pathPart.TrimStart('/'); + string fileUrl = _webdavManager.RootPath.TrimEnd('/') + "/" + pathPart.TrimStart('/'); var uri = new Uri(WebDavAppConfigManager.Instance.OfficeOnline.Url).AddParameter("src", fileUrl).ToString(); return View(new OfficeOnlineModel(uri, new Uri(fileUrl).Segments.Last())); @@ -69,9 +72,11 @@ namespace WebsitePanel.WebDavPortal.Controllers if (Session[WebDavAppConfigManager.Instance.SessionKeys.ResourseRenderCount] != null) { var renderedElementsCount = (int)Session[WebDavAppConfigManager.Instance.SessionKeys.ResourseRenderCount]; - var webDavManager = _kernel.Get(); - IEnumerable children = webDavManager.GetChildren(); + + IEnumerable children = _webdavManager.GetChildren(); + var result = children.Skip(renderedElementsCount).Take(WebDavAppConfigManager.Instance.ElementsRendering.AddElementsCount); + Session[WebDavAppConfigManager.Instance.SessionKeys.ResourseRenderCount] = renderedElementsCount + WebDavAppConfigManager.Instance.ElementsRendering.AddElementsCount; return PartialView("_ResourseCollectionPartial", result); diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/CustomAttributes/LdapAuthorizationAttribute.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/CustomAttributes/LdapAuthorizationAttribute.cs index 3d51c373..69d87efc 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/CustomAttributes/LdapAuthorizationAttribute.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/CustomAttributes/LdapAuthorizationAttribute.cs @@ -4,6 +4,7 @@ using System.Web.Routing; using Ninject; using WebsitePanel.WebDavPortal.DependencyInjection; using WebsitePanel.WebDavPortal.Models; +using WebsitePanel.WebDavPortal.UI.Routes; namespace WebsitePanel.WebDavPortal.CustomAttributes { @@ -11,16 +12,19 @@ namespace WebsitePanel.WebDavPortal.CustomAttributes { protected override bool AuthorizeCore(HttpContextBase httpContext) { - IKernel kernel = new StandardKernel(new NinjectSettings { AllowNullInjection = true }, new WebDavExplorerAppModule()); - var accountInfo = kernel.Get(); + var accountInfo = DependencyResolver.Current.GetService(); + if (accountInfo == null) + { return false; + } + return true; } protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { - filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Account", action = "Login" })); + filterContext.Result = new RedirectToRouteResult(AccountRouteNames.Login, null); } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/NinjectDependecyResolver.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/NinjectDependecyResolver.cs new file mode 100644 index 00000000..480cb19e --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/NinjectDependecyResolver.cs @@ -0,0 +1,35 @@ +using Ninject; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Mvc; + +namespace WebsitePanel.WebDavPortal.DependencyInjection +{ + public class NinjectDependecyResolver : IDependencyResolver + { + IKernel kernal; + + public NinjectDependecyResolver() + { + kernal = new StandardKernel(new NinjectSettings { AllowNullInjection = true }); + AddBindings(); + } + + public object GetService(Type serviceType) + { + return kernal.TryGet(serviceType); + } + + public IEnumerable GetServices(Type serviceType) + { + return kernal.GetAll(serviceType); + } + + private void AddBindings() + { + PortalDependencies.Configure(kernal); + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/PortalDependencies.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/PortalDependencies.cs new file mode 100644 index 00000000..be866fab --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/PortalDependencies.cs @@ -0,0 +1,23 @@ +using Ninject; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.SessionState; +using WebsitePanel.WebDavPortal.Cryptography; +using WebsitePanel.WebDavPortal.DependencyInjection.Providers; +using WebsitePanel.WebDavPortal.Models; + +namespace WebsitePanel.WebDavPortal.DependencyInjection +{ + public class PortalDependencies + { + public static void Configure(IKernel kernerl) + { + kernerl.Bind().ToProvider(); + kernerl.Bind().ToProvider(); + kernerl.Bind().ToProvider(); + kernerl.Bind().To(); + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/AccountInfoProvider.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/AccountInfoProvider.cs new file mode 100644 index 00000000..6a2f8dc0 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/AccountInfoProvider.cs @@ -0,0 +1,25 @@ +using System.Web.SessionState; +using Ninject; +using Ninject.Activation; +using WebsitePanel.WebDavPortal.Config; +using WebsitePanel.WebDavPortal.Models; + +namespace WebsitePanel.WebDavPortal.DependencyInjection.Providers +{ + public class AccountInfoProvider : Provider + { + protected override AccountModel CreateInstance(IContext context) + { + var session = context.Kernel.Get(); + + AccountModel accountInfo = null; + + if (session != null) + { + accountInfo = session[WebDavAppConfigManager.Instance.SessionKeys.AccountInfo] as AccountModel; + } + + return accountInfo; + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/HttpSessionStateProvider.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/HttpSessionStateProvider.cs new file mode 100644 index 00000000..738312bf --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/HttpSessionStateProvider.cs @@ -0,0 +1,17 @@ +using Ninject.Activation; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.SessionState; + +namespace WebsitePanel.WebDavPortal.DependencyInjection.Providers +{ + public class HttpSessionStateProvider : Provider + { + protected override HttpSessionState CreateInstance(IContext context) + { + return HttpContext.Current.Session; + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/WebDavManagerProvider.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/WebDavManagerProvider.cs new file mode 100644 index 00000000..b52d83a3 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/DependencyInjection/Providers/WebDavManagerProvider.cs @@ -0,0 +1,25 @@ +using System.Web.SessionState; +using Ninject; +using Ninject.Activation; +using WebsitePanel.WebDavPortal.Config; +using WebsitePanel.WebDavPortal.Models; + +namespace WebsitePanel.WebDavPortal.DependencyInjection.Providers +{ + public class WebDavManagerProvider : Provider + { + protected override WebDavManager CreateInstance(IContext context) + { + var session = context.Kernel.Get(); + + WebDavManager webDavManager = null; + + if (session != null) + { + webDavManager = session[WebDavAppConfigManager.Instance.SessionKeys.WebDavManager] as WebDavManager; + } + + return webDavManager; + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Global.asax.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Global.asax.cs index 69fb92f6..f62048b9 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Global.asax.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Global.asax.cs @@ -4,6 +4,7 @@ using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; using WebsitePanel.WebDavPortal.Controllers; +using WebsitePanel.WebDavPortal.DependencyInjection; namespace WebsitePanel.WebDavPortal { @@ -15,6 +16,8 @@ namespace WebsitePanel.WebDavPortal FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); + + DependencyResolver.SetResolver(new NinjectDependecyResolver()); } protected void Application_Error(object sender, EventArgs e) diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/WebDavManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/WebDavManager.cs index 319a54bb..d4ba4fba 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/WebDavManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/WebDavManager.cs @@ -11,12 +11,15 @@ using WebsitePanel.Portal; using WebsitePanel.Providers.OS; using Ninject; using WebsitePanel.WebDavPortal.DependencyInjection; +using System.Web.Mvc; namespace WebsitePanel.WebDavPortal.Models { public class WebDavManager : IWebDavManager { private readonly WebDavSession _webDavSession = new WebDavSession(); + private readonly AccountModel _accountModel; + private IList _rootFolders; private int _itemId; private IFolder _currentFolder; @@ -36,11 +39,11 @@ namespace WebsitePanel.WebDavPortal.Models public WebDavManager(NetworkCredential credential, int itemId) { + _accountModel = DependencyResolver.Current.GetService(); + _webDavSession.Credentials = credential; _itemId = itemId; - IKernel _kernel = new StandardKernel(new NinjectSettings { AllowNullInjection = true }, new WebDavExplorerAppModule()); - var accountModel = _kernel.Get(); - _rootFolders = ConnectToWebDavServer(accountModel); + _rootFolders = ConnectToWebDavServer(_accountModel); if (_rootFolders.Any()) { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Routes/FileSystemRouteNames.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Routes/FileSystemRouteNames.cs new file mode 100644 index 00000000..80d0d67d --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Routes/FileSystemRouteNames.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace WebsitePanel.WebDavPortal.UI.Routes +{ + public class FileSystemRouteNames + { + public const string FilePath = "FilePathRoute"; + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/ShowContent.cshtml b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/ShowContent.cshtml index dbd14ec9..0d7d6f9f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/ShowContent.cshtml +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/ShowContent.cshtml @@ -2,7 +2,7 @@ @using Ninject @model WebsitePanel.WebDavPortal.Models.ModelForWebDav @{ - var webDavManager = (new StandardKernel(new WebsitePanel.WebDavPortal.DependencyInjection.WebDavExplorerAppModule())).Get(); + var webDavManager = DependencyResolver.Current.GetService(); ViewBag.Title = (string.IsNullOrEmpty(Model.UrlSuffix) ? webDavManager.OrganizationName : Model.UrlSuffix); } @Scripts.Render("~/bundles/jquery") diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/_ResoursePartial.cshtml b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/_ResoursePartial.cshtml index 8e6a0663..1bd9cf33 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/_ResoursePartial.cshtml +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/_ResoursePartial.cshtml @@ -18,8 +18,7 @@ break; default: isTargetBlank = false; - IKernel _kernel = new StandardKernel(new WebsitePanel.WebDavPortal.DependencyInjection.WebDavExplorerAppModule()); - var webDavManager = _kernel.Get(); + var webDavManager = DependencyResolver.Current.GetService(); href = Model.Href.AbsolutePath; break; } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Shared/_Layout.cshtml b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Shared/_Layout.cshtml index 323bb3a5..ea0501a0 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Shared/_Layout.cshtml +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Shared/_Layout.cshtml @@ -3,6 +3,11 @@ @using WebsitePanel.WebDavPortal.DependencyInjection @using WebsitePanel.WebDavPortal.Models @using WebsitePanel.WebDavPortal.UI.Routes; + +@{ + var account = DependencyResolver.Current.GetService(); +} + @@ -25,8 +30,6 @@