private IEnumerable <ESPermission> GetFolderEsPermissions(ScpPrincipal principal, string rootFolderName)
        {
            var dictionary = HttpContext.Current.Session != null ?HttpContext.Current.Session[WebDavAppConfigManager.Instance.SessionKeys.WebDavRootFoldersPermissions] as
                             Dictionary <string, IEnumerable <ESPermission> > : null;

            if (dictionary == null)
            {
                dictionary = new Dictionary <string, IEnumerable <ESPermission> >();

                var rootFolders = SCP.Services.EnterpriseStorage.GetEnterpriseFoldersPaged(principal.ItemId, false, false, false, "", "", 0, int.MaxValue).PageItems;

                foreach (var rootFolder in rootFolders)
                {
                    var permissions = SCP.Services.EnterpriseStorage.GetEnterpriseFolderPermissions(principal.ItemId, rootFolder.Name);

                    dictionary.Add(rootFolder.Name, permissions);
                }

                if (HttpContext.Current.Session != null)
                {
                    HttpContext.Current.Session[WebDavAppConfigManager.Instance.SessionKeys.WebDavRootFoldersPermissions] = dictionary;
                }
            }

            return(dictionary.ContainsKey(rootFolderName) ? dictionary[rootFolderName] : new ESPermission[0]);
        }
        public ScpPrincipal LogIn(string login, string password)
        {
            Log.WriteStart("Login");

            if (ValidateAuthenticationData(login, password) == false)
            {
                return(null);
            }

            var principal = new ScpPrincipal(login);

            var exchangeAccount = SCP.Services.ExchangeServer.GetAccountByAccountNameWithoutItemId(login);
            var organization    = SCP.Services.Organizations.GetOrganization(exchangeAccount.ItemId);

            principal.AccountId         = exchangeAccount.AccountId;
            principal.ItemId            = exchangeAccount.ItemId;
            principal.OrganizationId    = organization.OrganizationId;
            principal.DisplayName       = exchangeAccount.DisplayName;
            principal.AccountName       = exchangeAccount.AccountName;
            principal.EncryptedPassword = _cryptography.Encrypt(password);

            if (HttpContext.Current != null)
            {
                HttpContext.Current.User = principal;
            }

            Thread.CurrentPrincipal = principal;

            Log.WriteEnd("Login");

            return(principal);
        }
        private IEnumerable <string> GetOwaFoldersWithEditPermission(ScpPrincipal principal)
        {
            var folders = HttpContext.Current.Session != null ? HttpContext.Current.Session[WebDavAppConfigManager.Instance.SessionKeys.OwaEditFoldersSessionKey] as IEnumerable <string> : null;

            if (folders != null)
            {
                return(folders);
            }

            var accountsIds = new List <int>();

            accountsIds.Add(principal.AccountId);

            var groups = GetUserSecurityGroups(principal);

            accountsIds.AddRange(groups.Select(x => x.AccountId));

            try
            {
                folders = ScpContext.Services.EnterpriseStorage.GetUserEnterpriseFolderWithOwaEditPermission(principal.ItemId, accountsIds.ToArray());
            }
            catch (Exception)
            {
                //TODO remove try catch when es &portal will be updated
                return(new List <string>());
            }


            if (HttpContext.Current.Session != null)
            {
                HttpContext.Current.Session[WebDavAppConfigManager.Instance.SessionKeys.OwaEditFoldersSessionKey] = folders;
            }

            return(folders);
        }
        public bool HasAccess(ScpPrincipal principal, string path)
        {
            path = path.RemoveLeadingFromPath(principal.OrganizationId);

            var permissions = GetPermissions(principal, path);

            return(permissions.HasFlag(WebDavPermissions.Read) || permissions.HasFlag(WebDavPermissions.Write));
        }
Example #5
0
        public WebDavAccessToken CreateToken(ScpPrincipal principal, string filePath)
        {
            var token = new WebDavAccessToken();

            token.AccessToken    = Guid.NewGuid();
            token.AccountId      = principal.AccountId;
            token.ItemId         = principal.ItemId;
            token.AuthData       = principal.EncryptedPassword;
            token.ExpirationDate = DateTime.Now.AddHours(3);
            token.FilePath       = filePath;

            token.Id = SCP.Services.EnterpriseStorage.AddWebDavAccessToken(token);

            return(token);
        }
        public IEnumerable <ExchangeAccount> GetUserSecurityGroups(ScpPrincipal principal)
        {
            var groups = HttpContext.Current.Session != null ? HttpContext.Current.Session[WebDavAppConfigManager.Instance.SessionKeys.UserGroupsKey] as IEnumerable <ExchangeAccount> : null;

            if (groups == null)
            {
                groups = SCP.Services.Organizations.GetSecurityGroupsByMember(principal.ItemId, principal.AccountId);

                if (HttpContext.Current.Session != null)
                {
                    HttpContext.Current.Session[WebDavAppConfigManager.Instance.SessionKeys.UserGroupsKey] = groups;
                }
            }

            return(groups ?? new ExchangeAccount[0]);
        }
        public WebDavPermissions GetPermissions(ScpPrincipal principal, string path)
        {
            if (string.IsNullOrEmpty(path))
            {
                return(WebDavPermissions.Read);
            }

            var resultPermissions = WebDavPermissions.Empty;

            var rootFolder = GetRootFolder(path);

            var userGroups = GetUserSecurityGroups(principal);

            var permissions = GetFolderEsPermissions(principal, rootFolder);

            foreach (var permission in permissions)
            {
                if ((!permission.IsGroup &&
                     (permission.DisplayName == principal.UserName || permission.DisplayName == principal.DisplayName)) ||
                    (permission.IsGroup && userGroups.Any(x => x.DisplayName == permission.DisplayName)))
                {
                    if (permission.Access.ToLowerInvariant().Contains("read"))
                    {
                        resultPermissions |= WebDavPermissions.Read;
                    }

                    if (permission.Access.ToLowerInvariant().Contains("write"))
                    {
                        resultPermissions |= WebDavPermissions.Write;
                    }
                }
            }

            var owaEditFolders = GetOwaFoldersWithEditPermission(principal);

            if (owaEditFolders.Contains(rootFolder))
            {
                resultPermissions |= WebDavPermissions.OwaEdit;
            }
            else
            {
                resultPermissions |= WebDavPermissions.OwaRead;
            }

            return(resultPermissions);
        }
        public void CreateAuthenticationTicket(ScpPrincipal 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);
        }