Merge branch 'master' of github.com:ONLYOFFICE/CommunityServer-AspNetCore

This commit is contained in:
Alexey Safronov 2019-08-08 12:50:56 +03:00
commit 019c5d0a22
130 changed files with 1451 additions and 1168 deletions

View File

@ -27,6 +27,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using ASC.Core;
using ASC.Core.Tenants;
using Microsoft.AspNetCore.Http;
namespace ASC.Api.Core
@ -34,12 +36,20 @@ namespace ASC.Api.Core
public class ApiContext : ICloneable
{
public HttpContext HttpContext { get; set; }
private IQueryCollection Query { get; set; }
private Tenant tenant;
public Tenant Tenant { get { return tenant ?? (tenant = CoreContext.TenantManager.GetCurrentTenant()); } }
public ApiContext(HttpContext httpContext)
{
if (httpContext == null) return;
HttpContext = httpContext;
if (HttpContext.Request.QueryString != null)
{
Query = HttpContext.Request.Query;
}
//TODO
uint ItemsPerPage = 1000;
Count = 0;
@ -90,14 +100,14 @@ namespace ASC.Api.Core
private string[] GetRequestArray(string key)
{
if (HttpContext.Request.QueryString != null)
if (Query != null)
{
var values = HttpContext.Request.Query[key + "[]"];
if (values.Any())
var values = Query[key + "[]"];
if (values.Count > 0)
return values;
values = HttpContext.Request.Query[key];
if (values.Any())
values = Query[key];
if (values.Count > 0)
{
if (values.Count == 1) //If it's only one element
{

View File

@ -69,7 +69,7 @@ namespace ASC.Api.Core.Middleware
{
CallContext.SetData("asc.web.product_id", pid);
}
if (!WebItemSecurity.IsAvailableForMe(pid))
if (!WebItemSecurity.IsAvailableForMe(CoreContext.TenantManager.GetCurrentTenant(), pid))
{
context.Result = new StatusCodeResult((int)HttpStatusCode.Forbidden);
log.WarnFormat("Product {0} denied for user {1}", controllerActionDescriptor.ControllerName, SecurityContext.CurrentAccount);

View File

@ -61,4 +61,9 @@
<Protobuf Include="protos\DistributedTaskCache.proto" />
<Protobuf Include="protos\DistributedTaskCancelation.proto" />
</ItemGroup>
<ItemGroup>
<Folder Include="Notify\" />
<Folder Include="Tests\Notify\" />
<Folder Include="Tests\Security\Authorizing\" />
</ItemGroup>
</Project>

View File

@ -23,11 +23,6 @@
*
*/
using Microsoft.AspNetCore.Http.Extensions;
using System;
using System.Diagnostics;
namespace ASC.Collections
{
public sealed class HttpRequestDictionary<T> : CachedDictionaryBase<T>
@ -87,17 +82,10 @@ namespace ASC.Collections
protected override void OnHit(string fullKey)
{
Debug.Print("{0} http cache hit:{1}", Common.HttpContext.Current.Request.GetDisplayUrl(), fullKey);
}
protected override void OnMiss(string fullKey)
{
Uri uri = null;
if (Common.HttpContext.Current != null)
{
uri = new Uri(Common.HttpContext.Current.Request.GetDisplayUrl());
}
Debug.Print("{0} http cache miss:{1}", uri == null ? "no-context" : uri.AbsolutePath, fullKey);
}
}

View File

@ -25,6 +25,7 @@
using System.Globalization;
using System.Linq;
using System.Reflection;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
@ -40,7 +41,7 @@ namespace System.Web
public static Uri GetUrlRewriter(this HttpRequest request)
{
return request != null ? GetUrlRewriter(request.Headers, request.Url()) : null;
return request != null ? GetUrlRewriter(request.Headers, request) : null;
}
public static Uri Url(this HttpRequest request)
{
@ -52,20 +53,14 @@ namespace System.Web
return request != null ? GetUrlRewriter(request.Headers, request.Url) : null;
}*/
public static Uri GetUrlRewriter(IHeaderDictionary headers, Uri requestUri)
public static Uri GetUrlRewriter(IHeaderDictionary headers, HttpRequest request)
{
if (requestUri == null)
if (request.Query != null && request.Query.Any())
{
return null;
}
if (!string.IsNullOrEmpty(requestUri.Query))
{
var urlRewriterQuery = HttpUtility.ParseQueryString(requestUri.Query);
var rewriterUri = ParseRewriterUrl(urlRewriterQuery[UrlRewriterHeader]);
var rewriterUri = ParseRewriterUrl(request.Query[UrlRewriterHeader]);
if (rewriterUri != null)
{
var result = new UriBuilder(requestUri)
var result = new UriBuilder(request.Url())
{
Scheme = rewriterUri.Scheme,
Host = rewriterUri.Host,
@ -80,7 +75,7 @@ namespace System.Web
var rewriterUri = ParseRewriterUrl(headers[UrlRewriterHeader]);
if (rewriterUri != null)
{
var result = new UriBuilder(requestUri)
var result = new UriBuilder(request.Url())
{
Scheme = rewriterUri.Scheme,
Host = rewriterUri.Host,
@ -90,7 +85,7 @@ namespace System.Web
}
}
return requestUri;
return request.Url();
}
public static Uri PushRewritenUri(this HttpContext context)

View File

@ -31,7 +31,7 @@ using ASC.Common.Logging;
using ASC.Common.Web;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
using HttpContext = ASC.Common.HttpContext;
using HttpContext = Microsoft.AspNetCore.Http.HttpContext;
namespace ASC.Core.Common
{
@ -77,58 +77,58 @@ namespace ASC.Core.Common
get { return ToAbsolute("~"); }
}
public static string ServerRootPath
{
get
{
var result = new UriBuilder(_serverRoot.Uri);
// first, take from current request
if (HttpContext.Current != null && ASC.Common.HttpContext.Current.Request != null)
{
var u = ASC.Common.HttpContext.Current.Request.GetUrlRewriter();
result = new UriBuilder(u.Scheme, u.Host, u.Port);
if (CoreContext.Configuration.Standalone && !result.Uri.IsLoopback)
{
// save for stanalone
_serverRoot.Host = result.Host;
}
}
if (result.Uri.IsLoopback)
{
// take values from db if localhost or no http context thread
var tenant = CoreContext.TenantManager.GetCurrentTenant();
result.Host = tenant.TenantDomain;
public static string ServerRootPath(HttpContext context)
{
UriBuilder result;
// first, take from current request
if (context != null && context.Request != null)
{
var u = context.Request.GetUrlRewriter();
result = new UriBuilder(u.Scheme, u.Host, u.Port);
if (CoreContext.Configuration.Standalone && !result.Uri.IsLoopback)
{
// save for stanalone
_serverRoot.Host = result.Host;
}
}
else
{
result = new UriBuilder(_serverRoot.Uri);
}
if (result.Uri.IsLoopback)
{
// take values from db if localhost or no http context thread
var tenant = CoreContext.TenantManager.GetCurrentTenant();
result.Host = tenant.TenantDomain;
#if DEBUG
// for Visual Studio debug
if (tenant.TenantAlias == LOCALHOST)
{
result.Host = LOCALHOST;
}
// for Visual Studio debug
if (tenant.TenantAlias == LOCALHOST)
{
result.Host = LOCALHOST;
}
#endif
if (!string.IsNullOrEmpty(tenant.MappedDomain))
{
var mapped = tenant.MappedDomain.ToLowerInvariant();
if (!mapped.Contains(Uri.SchemeDelimiter))
{
mapped = Uri.UriSchemeHttp + Uri.SchemeDelimiter + mapped;
}
result = new UriBuilder(mapped);
}
}
return result.Uri.ToString().TrimEnd('/');
}
if (!string.IsNullOrEmpty(tenant.MappedDomain))
{
var mapped = tenant.MappedDomain.ToLowerInvariant();
if (!mapped.Contains(Uri.SchemeDelimiter))
{
mapped = Uri.UriSchemeHttp + Uri.SchemeDelimiter + mapped;
}
result = new UriBuilder(mapped);
}
}
return result.Uri.ToString().TrimEnd('/');
}
public static string GetFullAbsolutePath(string virtualPath)
public static string GetFullAbsolutePath(HttpContext context, string virtualPath)
{
if (String.IsNullOrEmpty(virtualPath))
return ServerRootPath;
if (string.IsNullOrEmpty(virtualPath))
return ServerRootPath(context);
if (virtualPath.StartsWith("http://", StringComparison.InvariantCultureIgnoreCase) ||
virtualPath.StartsWith("mailto:", StringComparison.InvariantCultureIgnoreCase) ||
@ -138,9 +138,9 @@ namespace ASC.Core.Common
if (string.IsNullOrEmpty(virtualPath) || virtualPath.StartsWith("/"))
{
return ServerRootPath + virtualPath;
return ServerRootPath(context) + virtualPath;
}
return ServerRootPath + VirtualRoot.TrimEnd('/') + "/" + virtualPath.TrimStart('~', '/');
return ServerRootPath(context) + VirtualRoot.TrimEnd('/') + "/" + virtualPath.TrimStart('~', '/');
}
public static string ToAbsolute(string virtualPath)

View File

@ -179,7 +179,7 @@ namespace ASC.Core.Billing
if (license.ActiveUsers.Equals(default(int)) || license.ActiveUsers < 1)
license.ActiveUsers = MaxUserCount;
if (license.ActiveUsers < CoreContext.UserManager.GetUsers(EmployeeStatus.Default, EmployeeType.User).Length)
if (license.ActiveUsers < CoreContext.UserManager.GetUsers(CoreContext.TenantManager.GetCurrentTenant(), EmployeeStatus.Default, EmployeeType.User).Length)
{
throw new LicenseQuotaException("License quota", license.OriginalLicense);
}

View File

@ -28,6 +28,7 @@ using System;
using System.Linq;
using ASC.Common.Security.Authentication;
using ASC.Core.Security.Authentication;
using ASC.Core.Tenants;
using ASC.Core.Users;
namespace ASC.Core
@ -43,9 +44,9 @@ namespace ASC.Core
}
public IUserAccount[] GetUserAccounts()
public IUserAccount[] GetUserAccounts(Tenant tenant)
{
return CoreContext.UserManager.GetUsers(EmployeeStatus.Active).Select(u => ToAccount(u)).ToArray();
return CoreContext.UserManager.GetUsers(tenant, EmployeeStatus.Active).Select(u => ToAccount(u)).ToArray();
}
public void SetUserPassword(Guid userID, string password)

View File

@ -145,14 +145,15 @@ namespace ASC.Core
public Tenant GetCurrentTenant(bool throwIfNotFound)
{
Tenant tenant = null;
if (HttpContext.Current != null)
Tenant tenant = null;
var context = HttpContext.Current;
if (context != null)
{
tenant = HttpContext.Current.Items[CURRENT_TENANT] as Tenant;
if (tenant == null && HttpContext.Current.Request != null)
tenant = context.Items[CURRENT_TENANT] as Tenant;
if (tenant == null && context.Request != null)
{
tenant = GetTenant(HttpContext.Current.Request.GetUrlRewriter().Host);
HttpContext.Current.Items[CURRENT_TENANT] = tenant;
tenant = GetTenant(context.Request.GetUrlRewriter().Host);
context.Items[CURRENT_TENANT] = tenant;
}
}
if (tenant == null)
@ -180,14 +181,18 @@ namespace ASC.Core
}
}
public void SetCurrentTenant(int tenantId)
{
SetCurrentTenant(GetTenant(tenantId));
public Tenant SetCurrentTenant(int tenantId)
{
var result = GetTenant(tenantId);
SetCurrentTenant(result);
return result;
}
public void SetCurrentTenant(string domain)
{
SetCurrentTenant(GetTenant(domain));
public Tenant SetCurrentTenant(string domain)
{
var result = GetTenant(domain);
SetCurrentTenant(result);
return result;
}
public void CheckTenantAddress(string address)

View File

@ -62,81 +62,84 @@ namespace ASC.Core
#region Users
public UserInfo[] GetUsers()
public UserInfo[] GetUsers(Tenant tenant)
{
return GetUsers(EmployeeStatus.Default);
return GetUsers(tenant, EmployeeStatus.Default);
}
public UserInfo[] GetUsers(EmployeeStatus status)
public UserInfo[] GetUsers(Tenant tenant, EmployeeStatus status)
{
return GetUsers(status, EmployeeType.All);
return GetUsers(tenant, status, EmployeeType.All);
}
public UserInfo[] GetUsers(EmployeeStatus status, EmployeeType type)
public UserInfo[] GetUsers(Tenant tenant, EmployeeStatus status, EmployeeType type)
{
var users = GetUsersInternal().Where(u => (u.Status & status) == u.Status);
var users = GetUsersInternal(tenant.TenantId).Where(u => (u.Status & status) == u.Status);
switch (type)
{
case EmployeeType.User:
users = users.Where(u => !u.IsVisitor());
users = users.Where(u => !u.IsVisitor(tenant));
break;
case EmployeeType.Visitor:
users = users.Where(u => u.IsVisitor());
users = users.Where(u => u.IsVisitor(tenant));
break;
}
return users.ToArray();
}
public IEnumerable<UserInfo> GetUsers(bool isAdmin, EmployeeStatus? employeeStatus, List<Guid> includeGroups, List<Guid> excludeGroups, EmployeeActivationStatus? activationStatus, string text, string sortBy, bool sortOrderAsc, long limit, long offset, out int total)
public IEnumerable<UserInfo> GetUsers(int tenantId, bool isAdmin, EmployeeStatus? employeeStatus, List<Guid> includeGroups, List<Guid> excludeGroups, EmployeeActivationStatus? activationStatus, string text, string sortBy, bool sortOrderAsc, long limit, long offset, out int total)
{
var tenantId = CoreContext.TenantManager.GetCurrentTenant().TenantId;
return userService.GetUsers(tenantId, isAdmin, employeeStatus, includeGroups, excludeGroups, activationStatus, text, sortBy, sortOrderAsc, limit, offset, out total).Values;
}
public DateTime GetMaxUsersLastModified()
public DateTime GetMaxUsersLastModified(int tenantId)
{
return userService.GetUsers(CoreContext.TenantManager.GetCurrentTenant().TenantId, default(DateTime))
return userService.GetUsers(tenantId, default)
.Values
.Select(g => g.LastModified)
.DefaultIfEmpty()
.Max();
}
public string[] GetUserNames(EmployeeStatus status)
public string[] GetUserNames(Tenant tenant, EmployeeStatus status)
{
return GetUsers(status)
return GetUsers(tenant, status)
.Select(u => u.UserName)
.Where(s => !string.IsNullOrEmpty(s))
.ToArray();
}
public UserInfo GetUserByUserName(string username)
public UserInfo GetUserByUserName(int tenantId, string username)
{
return GetUsersInternal()
return GetUsersInternal(tenantId)
.FirstOrDefault(u => string.Compare(u.UserName, username, StringComparison.CurrentCultureIgnoreCase) == 0) ?? Constants.LostUser;
}
public UserInfo GetUserBySid(string sid)
public UserInfo GetUserBySid(int tenantId, string sid)
{
return GetUsersInternal()
return GetUsersInternal(tenantId)
.FirstOrDefault(u => u.Sid != null && string.Compare(u.Sid, sid, StringComparison.CurrentCultureIgnoreCase) == 0) ?? Constants.LostUser;
}
public UserInfo GetSsoUserByNameId(string nameId)
public UserInfo GetSsoUserByNameId(int tenantId, string nameId)
{
return GetUsersInternal()
return GetUsersInternal(tenantId)
.FirstOrDefault(u => !string.IsNullOrEmpty(u.SsoNameId) && string.Compare(u.SsoNameId, nameId, StringComparison.CurrentCultureIgnoreCase) == 0) ?? Constants.LostUser;
}
public bool IsUserNameExists(string username)
public bool IsUserNameExists(Tenant tenant, string username)
{
return GetUserNames(EmployeeStatus.All)
return GetUserNames(tenant, EmployeeStatus.All)
.Contains(username, StringComparer.CurrentCultureIgnoreCase);
}
public UserInfo GetUsers(Guid id)
{
return GetUsers(id, CoreContext.TenantManager.GetCurrentTenant().TenantId);
}
public UserInfo GetUsers(Guid id, int tenantId)
{
if (IsSystemUser(id)) return systemUsers[id];
var u = userService.GetUser(CoreContext.TenantManager.GetCurrentTenant().TenantId, id);
var u = userService.GetUser(tenantId, id);
return u != null && !u.Removed ? u : Constants.LostUser;
}
@ -146,9 +149,9 @@ namespace ASC.Core
return u != null && !u.Removed ? u : Constants.LostUser;
}
public bool UserExists(Guid id)
public bool UserExists(Guid id, int tenantId)
{
return !GetUsers(id).Equals(Constants.LostUser);
return !GetUsers(id, tenantId).Equals(Constants.LostUser);
}
public bool IsSystemUser(Guid id)
@ -156,20 +159,20 @@ namespace ASC.Core
return systemUsers.ContainsKey(id);
}
public UserInfo GetUserByEmail(string email)
public UserInfo GetUserByEmail(int tenantId, string email)
{
if (string.IsNullOrEmpty(email)) return Constants.LostUser;
return GetUsersInternal()
return GetUsersInternal(tenantId)
.FirstOrDefault(u => string.Compare(u.Email, email, StringComparison.CurrentCultureIgnoreCase) == 0) ?? Constants.LostUser;
}
public UserInfo[] Search(string text, EmployeeStatus status)
public UserInfo[] Search(Tenant tenant, string text, EmployeeStatus status)
{
return Search(text, status, Guid.Empty);
return Search(tenant, text, status, Guid.Empty);
}
public UserInfo[] Search(string text, EmployeeStatus status, Guid groupId)
public UserInfo[] Search(Tenant tenant, string text, EmployeeStatus status, Guid groupId)
{
if (text == null || text.Trim() == string.Empty) return new UserInfo[0];
@ -177,8 +180,8 @@ namespace ASC.Core
if (words.Length == 0) return new UserInfo[0];
var users = groupId == Guid.Empty ?
GetUsers(status) :
GetUsersByGroup(groupId).Where(u => (u.Status & status) == status);
GetUsers(tenant, status) :
GetUsersByGroup(tenant, groupId).Where(u => (u.Status & status) == status);
var findUsers = new List<UserInfo>();
foreach (var user in users)
@ -199,83 +202,83 @@ namespace ASC.Core
return findUsers.ToArray();
}
public UserInfo SaveUserInfo(UserInfo u, bool isVisitor = false)
public UserInfo SaveUserInfo(Tenant tenant, UserInfo u, bool isVisitor = false)
{
if (IsSystemUser(u.ID)) return systemUsers[u.ID];
if (u.ID == Guid.Empty) SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
else SecurityContext.DemandPermissions(new UserSecurityProvider(u.ID), Constants.Action_EditUser);
if (u.ID == Guid.Empty) SecurityContext.DemandPermissions(tenant, Constants.Action_AddRemoveUser);
else SecurityContext.DemandPermissions(tenant, new UserSecurityProvider(u.ID), Constants.Action_EditUser);
if (Constants.MaxEveryoneCount <= GetUsersByGroup(Constants.GroupEveryone.ID).Length)
if (Constants.MaxEveryoneCount <= GetUsersByGroup(tenant, Constants.GroupEveryone.ID).Length)
{
throw new TenantQuotaException("Maximum number of users exceeded");
}
if (u.Status == EmployeeStatus.Active)
{
var q = CoreContext.TenantManager.GetTenantQuota(CoreContext.TenantManager.GetCurrentTenant().TenantId);
if (q.ActiveUsers < GetUsersByGroup(Constants.GroupUser.ID).Length)
var q = CoreContext.TenantManager.GetTenantQuota(tenant.TenantId);
if (q.ActiveUsers < GetUsersByGroup(tenant, Constants.GroupUser.ID).Length)
{
throw new TenantQuotaException(string.Format("Exceeds the maximum active users ({0})", q.ActiveUsers));
}
}
var newUser = userService.SaveUser(CoreContext.TenantManager.GetCurrentTenant().TenantId, u);
var newUser = userService.SaveUser(tenant.TenantId, u);
return newUser;
}
public void DeleteUser(Guid id)
public void DeleteUser(Tenant tenant, Guid id)
{
if (IsSystemUser(id)) return;
SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
if (id == CoreContext.TenantManager.GetCurrentTenant().OwnerId)
SecurityContext.DemandPermissions(tenant, Constants.Action_AddRemoveUser);
if (id == tenant.OwnerId)
{
throw new InvalidOperationException("Can not remove tenant owner.");
}
userService.RemoveUser(CoreContext.TenantManager.GetCurrentTenant().TenantId, id);
userService.RemoveUser(tenant.TenantId, id);
}
public void SaveUserPhoto(Guid id, byte[] photo)
public void SaveUserPhoto(Tenant tenant, Guid id, byte[] photo)
{
if (IsSystemUser(id)) return;
SecurityContext.DemandPermissions(new UserSecurityProvider(id), Constants.Action_EditUser);
SecurityContext.DemandPermissions(tenant, new UserSecurityProvider(id), Constants.Action_EditUser);
userService.SetUserPhoto(CoreContext.TenantManager.GetCurrentTenant().TenantId, id, photo);
userService.SetUserPhoto(tenant.TenantId, id, photo);
}
public byte[] GetUserPhoto(Guid id)
public byte[] GetUserPhoto(int tenantId, Guid id)
{
if (IsSystemUser(id)) return null;
return userService.GetUserPhoto(CoreContext.TenantManager.GetCurrentTenant().TenantId, id);
return userService.GetUserPhoto(tenantId, id);
}
public IEnumerable<Guid> GetUserGroupsId(Guid id)
public IEnumerable<Guid> GetUserGroupsId(int tenantId, Guid id)
{
return GetUsers(id).GetUserGroupsId();
return GetUsers(id, tenantId).GetUserGroupsId(tenantId);
}
public GroupInfo[] GetUserGroups(Guid id)
public GroupInfo[] GetUserGroups(Tenant tenant, Guid id)
{
return GetUsers(id).GetGroups(IncludeType.Distinct, Guid.Empty);
return GetUsers(id, tenant.TenantId).GetGroups(tenant, IncludeType.Distinct, Guid.Empty);
}
public GroupInfo[] GetUserGroups(Guid id, Guid categoryID)
public GroupInfo[] GetUserGroups(Tenant tenant, Guid id, Guid categoryID)
{
return GetUsers(id).GetGroups(IncludeType.Distinct, categoryID);
return GetUsers(id, tenant.TenantId).GetGroups(tenant, IncludeType.Distinct, categoryID);
}
public GroupInfo[] GetUserGroups(Guid userID, IncludeType includeType)
public GroupInfo[] GetUserGroups(Tenant tenant, Guid userID, IncludeType includeType)
{
return GetUsers(userID).GetGroups(includeType, null);
return GetUsers(userID, tenant.TenantId).GetGroups(tenant, includeType, null);
}
internal GroupInfo[] GetUserGroups(Guid userID, IncludeType includeType, Guid? categoryId)
internal GroupInfo[] GetUserGroups(Tenant tenant, Guid userID, IncludeType includeType, Guid? categoryId)
{
var result = new List<GroupInfo>();
var distinctUserGroups = new List<GroupInfo>();
var refs = GetRefsInternal();
var refs = GetRefsInternal(tenant.TenantId);
IEnumerable<UserGroupRef> userRefs = null;
var store = refs as UserGroupRefStore;
if (store != null)
@ -285,9 +288,9 @@ namespace ASC.Core
var userRefsContainsNotRemoved = userRefs != null ? userRefs.Where(r => !r.Removed && r.RefType == UserGroupRefType.Contains).ToList() : null;
foreach (var g in GetGroupsInternal().Where(g => !categoryId.HasValue || g.CategoryID == categoryId))
foreach (var g in GetGroupsInternal(tenant.TenantId).Where(g => !categoryId.HasValue || g.CategoryID == categoryId))
{
if (((g.CategoryID == Constants.SysGroupCategoryId || userRefs == null) && IsUserInGroupInternal(userID, g.ID, refs)) ||
if (((g.CategoryID == Constants.SysGroupCategoryId || userRefs == null) && IsUserInGroupInternal(tenant, userID, g.ID, refs)) ||
(userRefsContainsNotRemoved != null && userRefsContainsNotRemoved.Any(r => r.GroupId == g.ID)))
{
distinctUserGroups.Add(g);
@ -304,11 +307,11 @@ namespace ASC.Core
return result.ToArray();
}
internal IEnumerable<Guid> GetUserGroupsGuids(Guid userID)
internal IEnumerable<Guid> GetUserGroupsGuids(int tenantId, Guid userID)
{
var result = new List<Guid>();
var refs = GetRefsInternal();
var refs = GetRefsInternal(tenantId);
var store = refs as UserGroupRefStore;
if (store != null)
@ -328,38 +331,36 @@ namespace ASC.Core
return result;
}
public bool IsUserInGroup(Guid userId, Guid groupId)
public bool IsUserInGroup(Tenant tenant, Guid userId, Guid groupId)
{
return IsUserInGroupInternal(userId, groupId, GetRefsInternal());
return IsUserInGroupInternal(tenant, userId, groupId, GetRefsInternal(tenant.TenantId));
}
public UserInfo[] GetUsersByGroup(Guid groupId, EmployeeStatus employeeStatus = EmployeeStatus.Default)
public UserInfo[] GetUsersByGroup(Tenant tenant, Guid groupId, EmployeeStatus employeeStatus = EmployeeStatus.Default)
{
var refs = GetRefsInternal();
return GetUsers(employeeStatus).Where(u => IsUserInGroupInternal(u.ID, groupId, refs)).ToArray();
var refs = GetRefsInternal(tenant.TenantId);
return GetUsers(tenant, employeeStatus).Where(u => IsUserInGroupInternal(tenant, u.ID, groupId, refs)).ToArray();
}
public void AddUserIntoGroup(Guid userId, Guid groupId)
public void AddUserIntoGroup(Tenant tenant, Guid userId, Guid groupId)
{
if (Constants.LostUser.ID == userId || Constants.LostGroupInfo.ID == groupId)
{
return;
}
SecurityContext.DemandPermissions(Constants.Action_EditGroups);
SecurityContext.DemandPermissions(tenant, Constants.Action_EditGroups);
userService.SaveUserGroupRef(
CoreContext.TenantManager.GetCurrentTenant().TenantId,
new UserGroupRef(userId, groupId, UserGroupRefType.Contains));
userService.SaveUserGroupRef(tenant.TenantId, new UserGroupRef(userId, groupId, UserGroupRefType.Contains));
GetUsers(userId).ResetGroupCache();
}
public void RemoveUserFromGroup(Guid userId, Guid groupId)
public void RemoveUserFromGroup(Tenant tenant, Guid userId, Guid groupId)
{
if (Constants.LostUser.ID == userId || Constants.LostGroupInfo.ID == groupId) return;
SecurityContext.DemandPermissions(Constants.Action_EditGroups);
SecurityContext.DemandPermissions(tenant, Constants.Action_EditGroups);
userService.RemoveUserGroupRef(CoreContext.TenantManager.GetCurrentTenant().TenantId, userId, groupId, UserGroupRefType.Contains);
userService.RemoveUserGroupRef(tenant.TenantId, userId, groupId, UserGroupRefType.Contains);
GetUsers(userId).ResetGroupCache();
}
@ -369,46 +370,46 @@ namespace ASC.Core
#region Company
public GroupInfo[] GetDepartments()
public GroupInfo[] GetDepartments(int tenantId)
{
return CoreContext.UserManager.GetGroups();
return GetGroups(tenantId);
}
public Guid GetDepartmentManager(Guid deparmentID)
public Guid GetDepartmentManager(int tenantId, Guid deparmentID)
{
return GetRefsInternal()
return GetRefsInternal(tenantId)
.Values
.Where(r => r.RefType == UserGroupRefType.Manager && r.GroupId == deparmentID && !r.Removed)
.Select(r => r.UserId)
.SingleOrDefault();
}
public void SetDepartmentManager(Guid deparmentID, Guid userID)
public void SetDepartmentManager(int tenantId, Guid deparmentID, Guid userID)
{
var managerId = GetDepartmentManager(deparmentID);
var managerId = GetDepartmentManager(tenantId, deparmentID);
if (managerId != Guid.Empty)
{
userService.RemoveUserGroupRef(
CoreContext.TenantManager.GetCurrentTenant().TenantId,
tenantId,
managerId, deparmentID, UserGroupRefType.Manager);
}
if (userID != Guid.Empty)
{
userService.SaveUserGroupRef(
CoreContext.TenantManager.GetCurrentTenant().TenantId,
tenantId,
new UserGroupRef(userID, deparmentID, UserGroupRefType.Manager));
}
}
public UserInfo GetCompanyCEO()
public UserInfo GetCompanyCEO(int tenantId)
{
var id = GetDepartmentManager(Guid.Empty);
var id = GetDepartmentManager(tenantId, Guid.Empty);
return id != Guid.Empty ? GetUsers(id) : null;
}
public void SetCompanyCEO(Guid userId)
public void SetCompanyCEO(int tenantId, Guid userId)
{
SetDepartmentManager(Guid.Empty, userId);
SetDepartmentManager(tenantId, Guid.Empty, userId);
}
#endregion Company
@ -416,56 +417,56 @@ namespace ASC.Core
#region Groups
public GroupInfo[] GetGroups()
public GroupInfo[] GetGroups(int tenantId)
{
return GetGroups(Guid.Empty);
return GetGroups(tenantId, Guid.Empty);
}
public GroupInfo[] GetGroups(Guid categoryID)
public GroupInfo[] GetGroups(int tenantId, Guid categoryID)
{
return GetGroupsInternal()
return GetGroupsInternal(tenantId)
.Where(g => g.CategoryID == categoryID)
.ToArray();
}
public GroupInfo GetGroupInfo(Guid groupID)
public GroupInfo GetGroupInfo(int tenantId, Guid groupID)
{
return GetGroupsInternal()
return GetGroupsInternal(tenantId)
.SingleOrDefault(g => g.ID == groupID) ?? Constants.LostGroupInfo;
}
public GroupInfo GetGroupInfoBySid(string sid)
public GroupInfo GetGroupInfoBySid(int tenantId, string sid)
{
return GetGroupsInternal()
return GetGroupsInternal(tenantId)
.SingleOrDefault(g => g.Sid == sid) ?? Constants.LostGroupInfo;
}
public DateTime GetMaxGroupsLastModified()
public DateTime GetMaxGroupsLastModified(int tenantId)
{
return userService.GetGroups(CoreContext.TenantManager.GetCurrentTenant().TenantId, default(DateTime))
return userService.GetGroups(tenantId, default)
.Values
.Select(g => g.LastModified)
.DefaultIfEmpty()
.Max();
}
public GroupInfo SaveGroupInfo(GroupInfo g)
public GroupInfo SaveGroupInfo(Tenant tenant, GroupInfo g)
{
if (Constants.LostGroupInfo.Equals(g)) return Constants.LostGroupInfo;
if (Constants.BuildinGroups.Any(b => b.ID == g.ID)) return Constants.BuildinGroups.Single(b => b.ID == g.ID);
SecurityContext.DemandPermissions(Constants.Action_EditGroups);
SecurityContext.DemandPermissions(tenant, Constants.Action_EditGroups);
var newGroup = userService.SaveGroup(CoreContext.TenantManager.GetCurrentTenant().TenantId, ToGroup(g));
var newGroup = userService.SaveGroup(tenant.TenantId, ToGroup(g));
return new GroupInfo(newGroup.CategoryId) { ID = newGroup.Id, Name = newGroup.Name, Sid = newGroup.Sid };
}
public void DeleteGroup(Guid id)
public void DeleteGroup(Tenant tenant, Guid id)
{
if (Constants.LostGroupInfo.Equals(id)) return;
if (Constants.BuildinGroups.Any(b => b.ID == id)) return;
SecurityContext.DemandPermissions(Constants.Action_EditGroups);
SecurityContext.DemandPermissions(tenant, Constants.Action_EditGroups);
userService.RemoveGroup(CoreContext.TenantManager.GetCurrentTenant().TenantId, id);
userService.RemoveGroup(tenant.TenantId, id);
}
#endregion Groups
@ -487,31 +488,29 @@ namespace ASC.Core
}
private IEnumerable<UserInfo> GetUsersInternal()
private IEnumerable<UserInfo> GetUsersInternal(int tenantId)
{
return userService.GetUsers(CoreContext.TenantManager.GetCurrentTenant().TenantId, default(DateTime))
return userService.GetUsers(tenantId, default)
.Values
.Where(u => !u.Removed);
}
private IEnumerable<GroupInfo> GetGroupsInternal()
private IEnumerable<GroupInfo> GetGroupsInternal(int tenantId)
{
return userService.GetGroups(CoreContext.TenantManager.GetCurrentTenant().TenantId, default(DateTime))
return userService.GetGroups(tenantId, default)
.Values
.Where(g => !g.Removed)
.Select(g => new GroupInfo(g.CategoryId) { ID = g.Id, Name = g.Name, Sid = g.Sid })
.Concat(Constants.BuildinGroups);
}
private IDictionary<string, UserGroupRef> GetRefsInternal()
private IDictionary<string, UserGroupRef> GetRefsInternal(int tenantId)
{
return userService.GetUserGroupRefs(CoreContext.TenantManager.GetCurrentTenant().TenantId, default(DateTime));
return userService.GetUserGroupRefs(tenantId, default);
}
private bool IsUserInGroupInternal(Guid userId, Guid groupId, IDictionary<string, UserGroupRef> refs)
private bool IsUserInGroupInternal(Tenant tenant, Guid userId, Guid groupId, IDictionary<string, UserGroupRef> refs)
{
var tenant = CoreContext.TenantManager.GetCurrentTenant();
if (groupId == Constants.GroupEveryone.ID)
{
return true;

View File

@ -199,15 +199,16 @@ namespace ASC.Core
{
throw new SecurityException("Account disabled.");
}
var tenant = CoreContext.TenantManager.GetCurrentTenant();
// for LDAP users only
if (u.Sid != null)
{
if (!CoreContext.TenantManager.GetTenantQuota(CoreContext.TenantManager.GetCurrentTenant().TenantId).Ldap)
if (!CoreContext.TenantManager.GetTenantQuota(tenant.TenantId).Ldap)
{
throw new BillingException("Your tariff plan does not support this option.", "Ldap");
}
}
if (CoreContext.UserManager.IsUserInGroup(u.ID, Users.Constants.GroupAdmin.ID))
if (CoreContext.UserManager.IsUserInGroup(tenant, u.ID, Users.Constants.GroupAdmin.ID))
{
roles.Add(Role.Administrators);
}
@ -238,34 +239,34 @@ namespace ASC.Core
}
public static bool CheckPermissions(params IAction[] actions)
public static bool CheckPermissions(Tenant tenant, params IAction[] actions)
{
return PermissionResolver.Check(CurrentAccount, actions);
return PermissionResolver.Check(tenant, CurrentAccount, actions);
}
public static bool CheckPermissions(ISecurityObject securityObject, params IAction[] actions)
public static bool CheckPermissions(Tenant tenant, ISecurityObject securityObject, params IAction[] actions)
{
return CheckPermissions(securityObject, null, actions);
return CheckPermissions(tenant, securityObject, null, actions);
}
public static bool CheckPermissions(ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider, params IAction[] actions)
public static bool CheckPermissions(Tenant tenant, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider, params IAction[] actions)
{
return PermissionResolver.Check(CurrentAccount, objectId, securityObjProvider, actions);
return PermissionResolver.Check(tenant, CurrentAccount, objectId, securityObjProvider, actions);
}
public static void DemandPermissions(params IAction[] actions)
public static void DemandPermissions(Tenant tenant, params IAction[] actions)
{
PermissionResolver.Demand(CurrentAccount, actions);
PermissionResolver.Demand(tenant, CurrentAccount, actions);
}
public static void DemandPermissions(ISecurityObject securityObject, params IAction[] actions)
public static void DemandPermissions(Tenant tenant, ISecurityObject securityObject, params IAction[] actions)
{
DemandPermissions(securityObject, null, actions);
DemandPermissions(tenant, securityObject, null, actions);
}
public static void DemandPermissions(ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider, params IAction[] actions)
public static void DemandPermissions(Tenant tenant, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider, params IAction[] actions)
{
PermissionResolver.Demand(CurrentAccount, objectId, securityObjProvider, actions);
PermissionResolver.Demand(tenant, CurrentAccount, objectId, securityObjProvider, actions);
}

View File

@ -31,7 +31,8 @@ using System.Text;
using System.Linq;
using ASC.Collections;
using ASC.Notify.Recipients;
using ASC.Core.Tenants;
namespace ASC.Core.Users
{
[Serializable]
@ -150,9 +151,9 @@ namespace ASC.Core.Users
return MemberwiseClone();
}
internal GroupInfo[] GetGroups(IncludeType includeType, Guid? categoryId)
internal GroupInfo[] GetGroups(Tenant tenant, IncludeType includeType, Guid? categoryId)
{
var groups = groupCache.Get(ID.ToString(), () => CoreContext.UserManager.GetUserGroups(ID, IncludeType.Distinct, null));
var groups = groupCache.Get(ID.ToString(), () => CoreContext.UserManager.GetUserGroups(tenant, ID, IncludeType.Distinct, null));
if (categoryId.HasValue)
{
@ -162,9 +163,9 @@ namespace ASC.Core.Users
return groups;
}
internal IEnumerable<Guid> GetUserGroupsId()
internal IEnumerable<Guid> GetUserGroupsId(int tenantId)
{
return groupCacheId.Get(ID.ToString(), () => CoreContext.UserManager.GetUserGroupsGuids(ID));
return groupCacheId.Get(ID.ToString(), () => CoreContext.UserManager.GetUserGroupsGuids(tenantId, ID));
}
internal void ResetGroupCache()

View File

@ -26,6 +26,7 @@
using System;
using System.Linq;
using ASC.Core.Tenants;
using ASC.Notify.Model;
using ASC.Notify.Recipients;
@ -50,7 +51,7 @@ namespace ASC.Core.Notify
}
public object GetSubscriptionRecord(INotifyAction action, IRecipient recipient, string objectID)
public object GetSubscriptionRecord(Tenant tenant, INotifyAction action, IRecipient recipient, string objectID)
{
if (action == null) throw new ArgumentNullException("action");
if (recipient == null) throw new ArgumentNullException("recipient");
@ -58,7 +59,7 @@ namespace ASC.Core.Notify
return subscriptionManager.GetSubscriptionRecord(sourceID, action.ID, recipient.ID, objectID);
}
public string[] GetSubscriptions(INotifyAction action, IRecipient recipient, bool checkSubscribe = true)
public string[] GetSubscriptions(Tenant tenant, INotifyAction action, IRecipient recipient, bool checkSubscribe = true)
{
if (action == null) throw new ArgumentNullException("action");
if (recipient == null) throw new ArgumentNullException("recipient");
@ -66,17 +67,17 @@ namespace ASC.Core.Notify
return subscriptionManager.GetSubscriptions(sourceID, action.ID, recipient.ID, checkSubscribe);
}
public IRecipient[] GetRecipients(INotifyAction action, string objectID)
public IRecipient[] GetRecipients(int tenantId, INotifyAction action, string objectID)
{
if (action == null) throw new ArgumentNullException("action");
return subscriptionManager.GetRecipients(sourceID, action.ID, objectID)
.Select(r => recipientProvider.GetRecipient(r))
.Select(r => recipientProvider.GetRecipient(tenantId, r))
.Where(r => r != null)
.ToArray();
}
public string[] GetSubscriptionMethod(INotifyAction action, IRecipient recipient)
public string[] GetSubscriptionMethod(Tenant tenant, INotifyAction action, IRecipient recipient)
{
if (action == null) throw new ArgumentNullException("action");
if (recipient == null) throw new ArgumentNullException("recipient");
@ -130,7 +131,7 @@ namespace ASC.Core.Notify
}
[Obsolete("Use UnSubscribe(INotifyAction, string, IRecipient)", true)]
public void UnSubscribe(INotifyAction action, IRecipient recipient)
public void UnSubscribe(Tenant tenant, INotifyAction action, IRecipient recipient)
{
throw new NotSupportedException("use UnSubscribe(INotifyAction, string, IRecipient )");
}

View File

@ -31,6 +31,8 @@ using System.Threading;
using System.Threading.Tasks;
using ASC.Common.Logging;
using ASC.Common.Notify.Patterns;
using ASC.Core;
using ASC.Core.Tenants;
using ASC.Notify.Channels;
using ASC.Notify.Cron;
using ASC.Notify.Messages;
@ -217,7 +219,7 @@ namespace ASC.Notify.Engine
}
try
{
SendNotify(request);
SendNotify(CoreContext.TenantManager.GetCurrentTenant(), request);
}
catch (Exception e)
{
@ -241,7 +243,7 @@ namespace ASC.Notify.Engine
}
private NotifyResult SendNotify(NotifyRequest request)
private NotifyResult SendNotify(Tenant tenant, NotifyRequest request)
{
var sendResponces = new List<SendResponse>();
@ -252,7 +254,7 @@ namespace ASC.Notify.Engine
}
else
{
sendResponces.AddRange(SendGroupNotify(request));
sendResponces.AddRange(SendGroupNotify(tenant, request));
}
NotifyResult result = null;
@ -273,14 +275,14 @@ namespace ASC.Notify.Engine
return request.Intercept(place) ? new SendResponse(request.NotifyAction, sender, request.Recipient, SendResult.Prevented) : null;
}
private List<SendResponse> SendGroupNotify(NotifyRequest request)
private List<SendResponse> SendGroupNotify(Tenant tenant, NotifyRequest request)
{
var responces = new List<SendResponse>();
SendGroupNotify(request, responces);
SendGroupNotify(tenant, request, responces);
return responces;
}
private void SendGroupNotify(NotifyRequest request, List<SendResponse> responces)
private void SendGroupNotify(Tenant tenant, NotifyRequest request, List<SendResponse> responces)
{
if (request.Recipient is IDirectRecipient)
{
@ -290,7 +292,7 @@ namespace ASC.Notify.Engine
var directresponses = new List<SendResponse>(1);
try
{
directresponses = SendDirectNotify(request);
directresponses = SendDirectNotify(tenant, request);
}
catch (Exception exc)
{
@ -314,13 +316,13 @@ namespace ASC.Notify.Engine
try
{
var recipients = recipientProvider.GetGroupEntries(request.Recipient as IRecipientsGroup) ?? new IRecipient[0];
var recipients = recipientProvider.GetGroupEntries(tenant, request.Recipient as IRecipientsGroup) ?? new IRecipient[0];
foreach (var recipient in recipients)
{
try
{
var newRequest = request.Split(recipient);
SendGroupNotify(newRequest, responces);
SendGroupNotify(tenant, newRequest, responces);
}
catch (Exception exc)
{
@ -345,7 +347,7 @@ namespace ASC.Notify.Engine
}
}
private List<SendResponse> SendDirectNotify(NotifyRequest request)
private List<SendResponse> SendDirectNotify(Tenant tenant, NotifyRequest request)
{
if (!(request.Recipient is IDirectRecipient)) throw new ArgumentException("request.Recipient not IDirectRecipient", "request");
@ -359,7 +361,7 @@ namespace ASC.Notify.Engine
try
{
PrepareRequestFillSenders(request);
PrepareRequestFillSenders(tenant, request);
PrepareRequestFillPatterns(request);
PrepareRequestFillTags(request);
}
@ -377,7 +379,7 @@ namespace ASC.Notify.Engine
{
try
{
response = SendDirectNotify(request, channel);
response = SendDirectNotify(tenant.TenantId, request, channel);
}
catch (Exception exc)
{
@ -399,7 +401,7 @@ namespace ASC.Notify.Engine
return responses;
}
private SendResponse SendDirectNotify(NotifyRequest request, ISenderChannel channel)
private SendResponse SendDirectNotify(int tenantId, NotifyRequest request, ISenderChannel channel)
{
var recipient = request.Recipient as IDirectRecipient;
if (recipient == null) throw new ArgumentException("request.Recipient not IDirectRecipient", "request");
@ -407,7 +409,7 @@ namespace ASC.Notify.Engine
request.CurrentSender = channel.SenderName;
NoticeMessage noticeMessage;
var oops = CreateNoticeMessageFromNotifyRequest(request, channel.SenderName, out noticeMessage);
var oops = CreateNoticeMessageFromNotifyRequest(tenantId, request, channel.SenderName, out noticeMessage);
if (oops != null) return oops;
request.CurrentMessage = noticeMessage;
@ -419,7 +421,7 @@ namespace ASC.Notify.Engine
return new SendResponse(noticeMessage, channel.SenderName, SendResult.Inprogress);
}
private SendResponse CreateNoticeMessageFromNotifyRequest(NotifyRequest request, string sender, out NoticeMessage noticeMessage)
private SendResponse CreateNoticeMessageFromNotifyRequest(int tenantId, NotifyRequest request, string sender, out NoticeMessage noticeMessage)
{
if (request == null) throw new ArgumentNullException("request");
@ -433,7 +435,7 @@ namespace ASC.Notify.Engine
recipient = new DirectRecipient(request.Recipient.ID, request.Recipient.Name, addresses);
}
recipient = recipientProvider.FilterRecipientAddresses(recipient);
recipient = recipientProvider.FilterRecipientAddresses(tenantId, recipient);
noticeMessage = request.CreateMessage(recipient);
addresses = recipient.Addresses;
@ -503,14 +505,14 @@ namespace ASC.Notify.Engine
}
}
private void PrepareRequestFillSenders(NotifyRequest request)
private void PrepareRequestFillSenders(Tenant tenant, NotifyRequest request)
{
if (request.SenderNames == null)
{
var subscriptionProvider = request.NotifySource.GetSubscriptionProvider();
var senderNames = new List<string>();
senderNames.AddRange(subscriptionProvider.GetSubscriptionMethod(request.NotifyAction, request.Recipient) ?? new string[0]);
senderNames.AddRange(subscriptionProvider.GetSubscriptionMethod(tenant, request.NotifyAction, request.Recipient) ?? new string[0]);
senderNames.AddRange(request.Arguments.OfType<AdditionalSenderTag>().Select(tag => (string) tag.Value));
request.SenderNames = senderNames.ToArray();

View File

@ -44,7 +44,7 @@ namespace ASC.Notify
void SendNoticeToAsync(INotifyAction action, string objectID, IRecipient[] recipients, bool checkSubscription, params ITagValue[] args);
void SendNoticeAsync(INotifyAction action, string objectID, params ITagValue[] args);
void SendNoticeAsync(int tenantId, INotifyAction action, string objectID, params ITagValue[] args);
void SendNoticeAsync(INotifyAction action, string objectID, IRecipient recipient, params ITagValue[] args);

View File

@ -24,18 +24,20 @@
*/
using ASC.Core.Tenants;
namespace ASC.Notify.Recipients
{
public interface IRecipientProvider
{
IRecipient GetRecipient(string id);
IRecipient GetRecipient(int tenantId, string id);
IRecipient[] GetGroupEntries(IRecipientsGroup group);
IRecipient[] GetGroupEntries(Tenant tenant, IRecipientsGroup group);
IRecipientsGroup[] GetGroups(IRecipient recipient);
IRecipientsGroup[] GetGroups(Tenant tenant, IRecipient recipient);
string[] GetRecipientAddresses(IDirectRecipient recipient, string senderName);
IDirectRecipient FilterRecipientAddresses(IDirectRecipient recipient);
IDirectRecipient FilterRecipientAddresses(int tenantId, IDirectRecipient recipient);
}
}

View File

@ -24,26 +24,23 @@
*/
#region usings
using System;
using System.Linq;
using ASC.Common.Logging;
using ASC.Core.Tenants;
using ASC.Notify.Recipients;
#endregion
namespace ASC.Notify.Model
{
public interface ISubscriptionProvider
{
string[] GetSubscriptions(INotifyAction action, IRecipient recipient, bool checkSubscribe = true);
string[] GetSubscriptions(Tenant tenant, INotifyAction action, IRecipient recipient, bool checkSubscribe = true);
string[] GetSubscriptionMethod(INotifyAction action, IRecipient recipient);
string[] GetSubscriptionMethod(Tenant tenant, INotifyAction action, IRecipient recipient);
IRecipient[] GetRecipients(INotifyAction action, string objectID);
IRecipient[] GetRecipients(int tenantId, INotifyAction action, string objectID);
object GetSubscriptionRecord(INotifyAction action, IRecipient recipient, string objectID);
object GetSubscriptionRecord(Tenant tenant, INotifyAction action, IRecipient recipient, string objectID);
bool IsUnsubscribe(IDirectRecipient recipient, INotifyAction action, string objectID);
@ -55,20 +52,20 @@ namespace ASC.Notify.Model
void UnSubscribe(INotifyAction action);
void UnSubscribe(INotifyAction action, IRecipient recipient);
void UnSubscribe(Tenant tenant, INotifyAction action, IRecipient recipient);
void UpdateSubscriptionMethod(INotifyAction action, IRecipient recipient, params string[] senderNames);
}
public static class SubscriptionProviderHelper
{
public static bool IsSubscribed(this ISubscriptionProvider provider, INotifyAction action, IRecipient recipient, string objectID)
public static bool IsSubscribed(this ISubscriptionProvider provider, Tenant tenant, INotifyAction action, IRecipient recipient, string objectID)
{
var result = false;
try
{
var subscriptionRecord = provider.GetSubscriptionRecord(action, recipient, objectID);
var subscriptionRecord = provider.GetSubscriptionRecord(tenant, action, recipient, objectID);
if (subscriptionRecord != null)
{
var properties = subscriptionRecord.GetType().GetProperties();

View File

@ -69,10 +69,10 @@ namespace ASC.Notify.Model
SendNoticeToAsync(action, objectID, new[] { recipient }, null, false, args);
}
public void SendNoticeAsync(INotifyAction action, string objectID, params ITagValue[] args)
public void SendNoticeAsync(int tenantId, INotifyAction action, string objectID, params ITagValue[] args)
{
var subscriptionSource = notifySource.GetSubscriptionProvider();
var recipients = subscriptionSource.GetRecipients(action, objectID);
var recipients = subscriptionSource.GetRecipients(tenantId, action, objectID);
SendNoticeToAsync(action, objectID, recipients, null, false, args);
}

View File

@ -27,6 +27,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using ASC.Core.Tenants;
using ASC.Core.Users;
using ASC.Notify.Recipients;
@ -34,7 +36,7 @@ namespace ASC.Core.Notify
{
public class RecipientProviderImpl : IRecipientProvider
{
public virtual IRecipient GetRecipient(string id)
public virtual IRecipient GetRecipient(int tenantId, string id)
{
var recID = Guid.Empty;
if (TryParseGuid(id, out recID))
@ -42,13 +44,13 @@ namespace ASC.Core.Notify
var user = CoreContext.UserManager.GetUsers(recID);
if (user.ID != Constants.LostUser.ID) return new DirectRecipient(user.ID.ToString(), user.ToString());
var group = CoreContext.UserManager.GetGroupInfo(recID);
var group = CoreContext.UserManager.GetGroupInfo(tenantId, recID);
if (group.ID != Constants.LostGroupInfo.ID) return new RecipientsGroup(group.ID.ToString(), group.Name);
}
return null;
}
public virtual IRecipient[] GetGroupEntries(IRecipientsGroup group)
public virtual IRecipient[] GetGroupEntries(Tenant tenant, IRecipientsGroup group)
{
if (group == null) throw new ArgumentNullException("group");
@ -56,17 +58,17 @@ namespace ASC.Core.Notify
var groupID = Guid.Empty;
if (TryParseGuid(group.ID, out groupID))
{
var coreGroup = CoreContext.UserManager.GetGroupInfo(groupID);
var coreGroup = CoreContext.UserManager.GetGroupInfo(tenant.TenantId, groupID);
if (coreGroup.ID != Constants.LostGroupInfo.ID)
{
var users = CoreContext.UserManager.GetUsersByGroup(coreGroup.ID);
var users = CoreContext.UserManager.GetUsersByGroup(tenant, coreGroup.ID);
Array.ForEach(users, u => result.Add(new DirectRecipient(u.ID.ToString(), u.ToString())));
}
}
return result.ToArray();
}
public virtual IRecipientsGroup[] GetGroups(IRecipient recipient)
public virtual IRecipientsGroup[] GetGroups(Tenant tenant, IRecipient recipient)
{
if (recipient == null) throw new ArgumentNullException("recipient");
@ -76,7 +78,7 @@ namespace ASC.Core.Notify
{
if (recipient is IRecipientsGroup)
{
var group = CoreContext.UserManager.GetGroupInfo(recID);
var group = CoreContext.UserManager.GetGroupInfo(tenant.TenantId, recID);
while (group != null && group.Parent != null)
{
result.Add(new RecipientsGroup(group.Parent.ID.ToString(), group.Parent.Name));
@ -85,7 +87,7 @@ namespace ASC.Core.Notify
}
else if (recipient is IDirectRecipient)
{
foreach (var group in CoreContext.UserManager.GetUserGroups(recID, IncludeType.Distinct))
foreach (var group in CoreContext.UserManager.GetUserGroups(tenant, recID, IncludeType.Distinct))
{
result.Add(new RecipientsGroup(group.ID.ToString(), group.Name));
}
@ -117,7 +119,7 @@ namespace ASC.Core.Notify
/// </summary>
/// <param name="recipient"></param>
/// <returns></returns>
public IDirectRecipient FilterRecipientAddresses(IDirectRecipient recipient)
public IDirectRecipient FilterRecipientAddresses(int tenantId, IDirectRecipient recipient)
{
//Check activation
if (recipient.CheckActivation)
@ -127,7 +129,7 @@ namespace ASC.Core.Notify
{
//Filtering only missing users and users who activated already
var filteredAddresses = from address in recipient.Addresses
let user = CoreContext.UserManager.GetUserByEmail(address)
let user = CoreContext.UserManager.GetUserByEmail(tenantId, address)
where user.ID == Constants.LostUser.ID || (user.IsActive && (user.Status & EmployeeStatus.Default) == user.Status)
select address;

View File

@ -26,6 +26,7 @@
using System;
using System.Collections.Generic;
using ASC.Core.Tenants;
using ASC.Notify.Recipients;
@ -54,18 +55,18 @@ namespace ASC.Notify.Model
}
public virtual string[] GetSubscriptionMethod(INotifyAction action, IRecipient recipient)
public virtual string[] GetSubscriptionMethod(Tenant tenant,INotifyAction action, IRecipient recipient)
{
if (action == null) throw new ArgumentNullException("action");
if (recipient == null) throw new ArgumentNullException("recipient");
var senders = subscriptionProvider.GetSubscriptionMethod(action, recipient);
var senders = subscriptionProvider.GetSubscriptionMethod(tenant, action, recipient);
if (senders == null || senders.Length == 0)
{
var parents = WalkUp(recipient);
var parents = WalkUp(tenant, recipient);
foreach (var parent in parents)
{
senders = subscriptionProvider.GetSubscriptionMethod(action, parent);
senders = subscriptionProvider.GetSubscriptionMethod(tenant, action, parent);
if (senders != null && senders.Length != 0) break;
}
}
@ -73,12 +74,12 @@ namespace ASC.Notify.Model
return senders != null && 0 < senders.Length ? senders : defaultSenderMethods;
}
public virtual IRecipient[] GetRecipients(INotifyAction action, string objectID)
public virtual IRecipient[] GetRecipients(int tenantId, INotifyAction action, string objectID)
{
if (action == null) throw new ArgumentNullException("action");
var recipents = new List<IRecipient>(5);
var directRecipients = subscriptionProvider.GetRecipients(action, objectID) ?? new IRecipient[0];
var directRecipients = subscriptionProvider.GetRecipients(tenantId, action, objectID) ?? new IRecipient[0];
recipents.AddRange(directRecipients);
return recipents.ToArray();
}
@ -122,9 +123,9 @@ namespace ASC.Notify.Model
subscriptionProvider.UnSubscribe(action);
}
public virtual void UnSubscribe(INotifyAction action, IRecipient recipient)
public virtual void UnSubscribe(Tenant tenant, INotifyAction action, IRecipient recipient)
{
var objects = GetSubscriptions(action, recipient);
var objects = GetSubscriptions(tenant, action, recipient);
foreach (string objectID in objects)
{
subscriptionProvider.UnSubscribe(action, objectID, recipient);
@ -140,20 +141,20 @@ namespace ASC.Notify.Model
subscriptionProvider.UpdateSubscriptionMethod(action, recipient, senderNames);
}
public virtual object GetSubscriptionRecord(INotifyAction action, IRecipient recipient, string objectID)
public virtual object GetSubscriptionRecord(Tenant tenant, INotifyAction action, IRecipient recipient, string objectID)
{
if (recipient == null) throw new ArgumentNullException("recipient");
if (action == null) throw new ArgumentNullException("action");
var subscriptionRecord = subscriptionProvider.GetSubscriptionRecord(action, recipient, objectID);
var subscriptionRecord = subscriptionProvider.GetSubscriptionRecord(tenant, action, recipient, objectID);
if (subscriptionRecord != null) return subscriptionRecord;
var parents = WalkUp(recipient);
var parents = WalkUp(tenant, recipient);
foreach (var parent in parents)
{
subscriptionRecord = subscriptionProvider.GetSubscriptionRecord(action, parent, objectID);
subscriptionRecord = subscriptionProvider.GetSubscriptionRecord(tenant, action, parent, objectID);
if (subscriptionRecord != null) break;
}
@ -161,18 +162,18 @@ namespace ASC.Notify.Model
return subscriptionRecord;
}
public virtual string[] GetSubscriptions(INotifyAction action, IRecipient recipient, bool checkSubscription = true)
public virtual string[] GetSubscriptions(Tenant tenant, INotifyAction action, IRecipient recipient, bool checkSubscription = true)
{
if (recipient == null) throw new ArgumentNullException("recipient");
if (action == null) throw new ArgumentNullException("action");
var objects = new List<string>();
var direct = subscriptionProvider.GetSubscriptions(action, recipient, checkSubscription) ?? new string[0];
var direct = subscriptionProvider.GetSubscriptions(tenant, action, recipient, checkSubscription) ?? new string[0];
MergeObjects(objects, direct);
var parents = WalkUp(recipient);
var parents = WalkUp(tenant, recipient);
foreach (var parent in parents)
{
direct = subscriptionProvider.GetSubscriptions(action, parent, checkSubscription) ?? new string[0];
direct = subscriptionProvider.GetSubscriptions(tenant, action, parent, checkSubscription) ?? new string[0];
if (recipient is IDirectRecipient)
{
foreach (var groupsubscr in direct)
@ -192,14 +193,14 @@ namespace ASC.Notify.Model
}
private List<IRecipient> WalkUp(IRecipient recipient)
private List<IRecipient> WalkUp(Tenant tenant,IRecipient recipient)
{
var parents = new List<IRecipient>();
var groups = recipientProvider.GetGroups(recipient) ?? new IRecipientsGroup[0];
var groups = recipientProvider.GetGroups(tenant, recipient) ?? new IRecipientsGroup[0];
foreach (var group in groups)
{
parents.Add(group);
parents.AddRange(WalkUp(group));
parents.AddRange(WalkUp(tenant, group));
}
return parents;
}

View File

@ -26,7 +26,8 @@
using System;
using System.Collections.Generic;
using ASC.Core.Tenants;
namespace ASC.Common.Security.Authorizing
{
public class AzManager
@ -50,22 +51,22 @@ namespace ASC.Common.Security.Authorizing
}
public bool CheckPermission(ISubject subject, IAction action, ISecurityObjectId objectId,
public bool CheckPermission(Tenant tenant, ISubject subject, IAction action, ISecurityObjectId objectId,
ISecurityObjectProvider securityObjProvider, out ISubject denySubject,
out IAction denyAction)
{
if (subject == null) throw new ArgumentNullException("subject");
if (action == null) throw new ArgumentNullException("action");
var acl = GetAzManagerAcl(subject, action, objectId, securityObjProvider);
var acl = GetAzManagerAcl(tenant, subject, action, objectId, securityObjProvider);
denySubject = acl.DenySubject;
denyAction = acl.DenyAction;
return acl.IsAllow;
}
internal AzManagerAcl GetAzManagerAcl(ISubject subject, IAction action, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider)
internal AzManagerAcl GetAzManagerAcl(Tenant tenant, ISubject subject, IAction action, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider)
{
if (action.AdministratorAlwaysAllow && (Constants.Admin.ID == subject.ID || roleProvider.IsSubjectInRole(subject, Constants.Admin)))
if (action.AdministratorAlwaysAllow && (Constants.Admin.ID == subject.ID || roleProvider.IsSubjectInRole(tenant, subject, Constants.Admin)))
{
return AzManagerAcl.Allow;
}
@ -73,7 +74,7 @@ namespace ASC.Common.Security.Authorizing
var acl = AzManagerAcl.Default;
var exit = false;
foreach (var s in GetSubjects(subject, objectId, securityObjProvider))
foreach (var s in GetSubjects(tenant, subject, objectId, securityObjProvider))
{
var aceList = permissionProvider.GetAcl(s, action, objectId, securityObjProvider);
foreach (var ace in aceList)
@ -101,12 +102,12 @@ namespace ASC.Common.Security.Authorizing
return acl;
}
internal IEnumerable<ISubject> GetSubjects(ISubject subject, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider)
internal IEnumerable<ISubject> GetSubjects(Tenant tenant, ISubject subject, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider)
{
var subjects = new List<ISubject>();
subjects.Add(subject);
subjects.AddRange(
roleProvider.GetRoles(subject)
roleProvider.GetRoles(tenant, subject)
.ConvertAll(r => { return (ISubject)r; })
);
if (objectId != null)

View File

@ -25,17 +25,18 @@
using ASC.Common.Security.Authorizing;
using ASC.Core.Tenants;
namespace ASC.Common.Security
{
public interface IPermissionResolver
{
bool Check(ISubject subject, params IAction[] actions);
bool Check(Tenant tenant, ISubject subject, params IAction[] actions);
bool Check(ISubject subject, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider, params IAction[] actions);
bool Check(Tenant tenant, ISubject subject, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider, params IAction[] actions);
void Demand(ISubject subject, params IAction[] actions);
void Demand(Tenant tenant, ISubject subject, params IAction[] actions);
void Demand(ISubject subject, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider, params IAction[] actions);
void Demand(Tenant tenant, ISubject subject, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider, params IAction[] actions);
}
}

View File

@ -30,6 +30,7 @@ using System.Linq;
using ASC.Common.Security;
using ASC.Common.Security.Authentication;
using ASC.Common.Security.Authorizing;
using ASC.Core.Tenants;
using Constants = ASC.Core.Configuration.Constants;
namespace ASC.Core.Security.Authorizing
@ -46,25 +47,25 @@ namespace ASC.Core.Security.Authorizing
}
public bool Check(ISubject subject, params IAction[] actions)
public bool Check(Tenant tenant, ISubject subject, params IAction[] actions)
{
return Check(subject, null, null, actions);
return Check(tenant, subject, null, null, actions);
}
public bool Check(ISubject subject, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider, params IAction[] actions)
public bool Check(Tenant tenant, ISubject subject, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider, params IAction[] actions)
{
var denyActions = GetDenyActions(subject, actions, objectId, securityObjProvider);
var denyActions = GetDenyActions(tenant, subject, actions, objectId, securityObjProvider);
return denyActions.Length == 0;
}
public void Demand(ISubject subject, params IAction[] actions)
public void Demand(Tenant tenant, ISubject subject, params IAction[] actions)
{
Demand(subject, null, null, actions);
Demand(tenant, subject, null, null, actions);
}
public void Demand(ISubject subject, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider, params IAction[] actions)
public void Demand(Tenant tenant, ISubject subject, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider, params IAction[] actions)
{
var denyActions = GetDenyActions(subject, actions, objectId, securityObjProvider);
var denyActions = GetDenyActions(tenant, subject, actions, objectId, securityObjProvider);
if (0 < denyActions.Length)
{
throw new AuthorizingException(
@ -76,7 +77,7 @@ namespace ASC.Core.Security.Authorizing
}
private DenyResult[] GetDenyActions(ISubject subject, IAction[] actions, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider)
private DenyResult[] GetDenyActions(Tenant tenant, ISubject subject, IAction[] actions, ISecurityObjectId objectId, ISecurityObjectProvider securityObjProvider)
{
var denyActions = new List<DenyResult>();
if (actions == null) actions = new IAction[0];
@ -95,7 +96,7 @@ namespace ASC.Core.Security.Authorizing
IAction denyAction = null;
foreach (var action in actions)
{
var allow = azManager.CheckPermission(subject, action, objectId, securityObjProvider, out denySubject, out denyAction);
var allow = azManager.CheckPermission(tenant, subject, action, objectId, securityObjProvider, out denySubject, out denyAction);
if (!allow)
{
denyActions.Add(new DenyResult(action, denySubject, denyAction));

View File

@ -30,6 +30,7 @@ using System.Linq;
using ASC.Common.Security;
using ASC.Common.Security.Authentication;
using ASC.Common.Security.Authorizing;
using ASC.Core.Tenants;
using ASC.Core.Users;
using AuthConst = ASC.Common.Security.Authorizing.Constants;
using ConfConst = ASC.Core.Configuration.Constants;
@ -38,19 +39,19 @@ namespace ASC.Core.Security.Authorizing
{
class RoleProvider : IRoleProvider
{
public List<IRole> GetRoles(ISubject account)
public List<IRole> GetRoles(Tenant tenant, ISubject account)
{
var roles = new List<IRole>();
if (!(account is ISystemAccount))
{
if (account is IRole)
{
roles = GetParentRoles(account.ID).ToList();
roles = GetParentRoles(tenant.TenantId, account.ID).ToList();
}
else if (account is IUserAccount)
{
roles = CoreContext.UserManager
.GetUserGroups(account.ID, IncludeType.Distinct | IncludeType.InParent)
.GetUserGroups(tenant, account.ID, IncludeType.Distinct | IncludeType.InParent)
.Select(g => (IRole) g)
.ToList();
}
@ -58,15 +59,15 @@ namespace ASC.Core.Security.Authorizing
return roles;
}
public bool IsSubjectInRole(ISubject account, IRole role)
public bool IsSubjectInRole(Tenant tenant, ISubject account, IRole role)
{
return CoreContext.UserManager.IsUserInGroup(account.ID, role.ID);
return CoreContext.UserManager.IsUserInGroup(tenant, account.ID, role.ID);
}
private static List<IRole> GetParentRoles(Guid roleID)
private static List<IRole> GetParentRoles(int tenantId, Guid roleID)
{
var roles = new List<IRole>();
var gi = CoreContext.UserManager.GetGroupInfo(roleID);
var gi = CoreContext.UserManager.GetGroupInfo(tenantId, roleID);
if (gi != null)
{
var parent = gi.Parent;

View File

@ -26,12 +26,13 @@
using System.Collections.Generic;
using ASC.Common.Security.Authorizing;
using ASC.Core.Tenants;
namespace ASC.Common.Security
{
public interface IRoleProvider
{
List<IRole> GetRoles(ISubject account);
bool IsSubjectInRole(ISubject account, IRole role);
List<IRole> GetRoles(Tenant tenant, ISubject account);
bool IsSubjectInRole(Tenant tenant, ISubject account, IRole role);
}
}

View File

@ -38,16 +38,16 @@ namespace ASC.Common.Tests.Security.Authorizing
[Test]
public void CollectInheritSubjects_Test()
{
AzManager azMan = new AzManager(Domain.RoleProvider, Domain.PermissionProvider);
var azMan = new AzManager(Domain.RoleProvider, Domain.PermissionProvider);
var subjects = new List<ISubject>(azMan.GetSubjects(Domain.roleNET, null, null));
var subjects = new List<ISubject>(azMan.GetSubjects(null, Domain.roleNET, null, null));
Assert.IsNotNull(subjects);
CollectionAssert.Contains(subjects, Domain.roleNET);
CollectionAssert.Contains(subjects, Domain.roleAVS);
CollectionAssert.Contains(subjects, Constants.Everyone);
Assert.AreEqual(3, subjects.Count);
subjects = new List<ISubject>(azMan.GetSubjects(Domain.accountValery, null, null));
subjects = new List<ISubject>(azMan.GetSubjects(null, Domain.accountValery, null, null));
Assert.IsNotNull(subjects);
CollectionAssert.Contains(subjects, Domain.accountValery);
CollectionAssert.Contains(subjects, Domain.roleNET);
@ -56,7 +56,7 @@ namespace ASC.Common.Tests.Security.Authorizing
CollectionAssert.Contains(subjects, Constants.User);
Assert.AreEqual(5, subjects.Count);
subjects = new List<ISubject>(azMan.GetSubjects(Domain.accountLev, null, null));
subjects = new List<ISubject>(azMan.GetSubjects(null, Domain.accountLev, null, null));
Assert.IsNotNull(subjects);
CollectionAssert.Contains(subjects, Domain.accountLev);
CollectionAssert.Contains(subjects, Domain.roleAdministration);
@ -66,14 +66,14 @@ namespace ASC.Common.Tests.Security.Authorizing
CollectionAssert.Contains(subjects, Constants.User);
Assert.AreEqual(6, subjects.Count);
subjects = new List<ISubject>(azMan.GetSubjects(Domain.accountAlient, null, null));
subjects = new List<ISubject>(azMan.GetSubjects(null, Domain.accountAlient, null, null));
Assert.IsNotNull(subjects);
CollectionAssert.Contains(subjects, Domain.accountAlient);
CollectionAssert.Contains(subjects, Constants.Everyone);
CollectionAssert.Contains(subjects, Constants.User);
Assert.AreEqual(3, subjects.Count);
subjects = new List<ISubject>(azMan.GetSubjects(Domain.accountMessangerService, null, null));
subjects = new List<ISubject>(azMan.GetSubjects(null, Domain.accountMessangerService, null, null));
Assert.IsNotNull(subjects);
CollectionAssert.Contains(subjects, Domain.accountMessangerService);
CollectionAssert.Contains(subjects, Constants.Everyone);
@ -85,52 +85,52 @@ namespace ASC.Common.Tests.Security.Authorizing
public void GetAzManagerAcl()
{
AzManager azMan = new AzManager(Domain.RoleProvider, Domain.PermissionProvider);
var azMan = new AzManager(Domain.RoleProvider, Domain.PermissionProvider);
AzManager.AzManagerAcl acl = null;
acl = azMan.GetAzManagerAcl(Constants.Admin, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Constants.Admin, Domain.actionAddUser, null, null);
Assert.IsTrue(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Constants.Everyone, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Constants.Everyone, Domain.actionAddUser, null, null);
Assert.IsFalse(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Constants.Owner, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Constants.Owner, Domain.actionAddUser, null, null);
Assert.IsTrue(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Constants.Self, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Constants.Self, Domain.actionAddUser, null, null);
Assert.IsTrue(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Constants.User, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Constants.User, Domain.actionAddUser, null, null);
Assert.IsFalse(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.roleAVS, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Domain.roleAVS, Domain.actionAddUser, null, null);
Assert.IsTrue(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.roleHR, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Domain.roleHR, Domain.actionAddUser, null, null);
Assert.IsTrue(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.roleNET, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Domain.roleNET, Domain.actionAddUser, null, null);
Assert.IsTrue(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.roleAdministration, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Domain.roleAdministration, Domain.actionAddUser, null, null);
Assert.IsFalse(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.accountAlient, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Domain.accountAlient, Domain.actionAddUser, null, null);
Assert.IsFalse(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.accountAnton, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Domain.accountAnton, Domain.actionAddUser, null, null);
Assert.IsTrue(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.accountKat, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Domain.accountKat, Domain.actionAddUser, null, null);
Assert.IsTrue(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.accountLev, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Domain.accountLev, Domain.actionAddUser, null, null);
Assert.IsFalse(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.accountNik, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Domain.accountNik, Domain.actionAddUser, null, null);
Assert.IsTrue(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.accountValery, Domain.actionAddUser, null, null);
acl = azMan.GetAzManagerAcl(null, Domain.accountValery, Domain.actionAddUser, null, null);
Assert.IsFalse(acl.IsAllow);
}
@ -151,32 +151,32 @@ namespace ASC.Common.Tests.Security.Authorizing
Domain.PermissionProvider.SetObjectAcesInheritance(c2Id, false);
Domain.PermissionProvider.AddAce(Constants.Owner, Domain.actionAddUser, c1Id, AceType.Allow);
acl = azMan.GetAzManagerAcl(Domain.accountNik, Domain.actionAddUser, c1Id, sop);
acl = azMan.GetAzManagerAcl(null, Domain.accountNik, Domain.actionAddUser, c1Id, sop);
Assert.IsTrue(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.accountNik, Domain.actionAddUser, c2Id, sop);
acl = azMan.GetAzManagerAcl(null, Domain.accountNik, Domain.actionAddUser, c2Id, sop);
Assert.IsFalse(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.accountAnton, Domain.actionAddUser, c1Id, sop);
acl = azMan.GetAzManagerAcl(null, Domain.accountAnton, Domain.actionAddUser, c1Id, sop);
Assert.IsFalse(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.accountAnton, Domain.actionAddUser, c2Id, sop);
acl = azMan.GetAzManagerAcl(null, Domain.accountAnton, Domain.actionAddUser, c2Id, sop);
Assert.IsFalse(acl.IsAllow);
Domain.PermissionProvider.SetObjectAcesInheritance(c2Id, true);
acl = azMan.GetAzManagerAcl(Domain.accountNik, Domain.actionAddUser, c2Id, sop);
acl = azMan.GetAzManagerAcl(null, Domain.accountNik, Domain.actionAddUser, c2Id, sop);
Assert.IsTrue(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.accountAnton, Domain.actionAddUser, c1Id, sop);
acl = azMan.GetAzManagerAcl(null, Domain.accountAnton, Domain.actionAddUser, c1Id, sop);
Assert.IsFalse(acl.IsAllow);
Domain.PermissionProvider.SetObjectAcesInheritance(c1Id, true);
acl = azMan.GetAzManagerAcl(Domain.accountNik, Domain.actionAddUser, c2Id, sop);
acl = azMan.GetAzManagerAcl(null, Domain.accountNik, Domain.actionAddUser, c2Id, sop);
Assert.IsTrue(acl.IsAllow);
acl = azMan.GetAzManagerAcl(Domain.accountLev, Domain.actionAddUser, c2Id, sop);
acl = azMan.GetAzManagerAcl(null, Domain.accountLev, Domain.actionAddUser, c2Id, sop);
Assert.IsFalse(acl.IsAllow);
}
}

View File

@ -30,7 +30,8 @@ using System.Collections.Generic;
using ASC.Common.Security;
using ASC.Common.Security.Authentication;
using ASC.Common.Security.Authorizing;
using ASC.Core.Tenants;
namespace ASC.Common.Tests.Security.Authorizing
{
class UserAccount : Account, IUserAccount
@ -159,7 +160,7 @@ namespace ASC.Common.Tests.Security.Authorizing
#region IRoleProvider Members
public List<IRole> GetRoles(ISubject account)
public List<IRole> GetRoles(Tenant tenant, ISubject account)
{
List<IRole> roles = null;
if (!AccountRoles.TryGetValue(account, out roles)) roles = new List<IRole>();
@ -173,9 +174,9 @@ namespace ASC.Common.Tests.Security.Authorizing
return accounts;
}
public bool IsSubjectInRole(ISubject account, IRole role)
public bool IsSubjectInRole(Tenant tenant, ISubject account, IRole role)
{
List<IRole> roles = GetRoles(account);
var roles = GetRoles(tenant, account);
return roles.Contains(role);
}

View File

@ -26,9 +26,7 @@
#if DEBUG
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ASC.Core.Notify;
using ASC.Notify.Model;
using NUnit.Framework;
@ -83,17 +81,17 @@ namespace ASC.Core.Common.Tests
IRecipient[] res;
//GetRecipients
res = subProvider.GetRecipients(nAction, objectId);
res = subProvider.GetRecipients(tenant.TenantId, nAction, objectId);
var cnt = res.Count();
//Subscribe
subProvider.Subscribe(nAction, objectId, testRec);
res = subProvider.GetRecipients(nAction, objectId);
res = subProvider.GetRecipients(tenant.TenantId, nAction, objectId);
Assert.AreEqual(cnt + 1, res.Count());
//UnSubscribe
subProvider.UnSubscribe(nAction, testRec);
res = subProvider.GetRecipients(nAction, objectId);
subProvider.UnSubscribe(tenant, nAction, testRec);
res = subProvider.GetRecipients(tenant.TenantId, nAction, objectId);
Assert.AreEqual(cnt, res.Count());
String[] objs;
@ -102,34 +100,34 @@ namespace ASC.Core.Common.Tests
//Получаем подписки юзера
//for (int i = 0; i < 6; i++) subProvider.Subscribe(nAction, new Random().Next().ToString(), testRec2);
objs = subProvider.GetSubscriptions(nAction, testRec2);
objs = subProvider.GetSubscriptions(tenant, nAction, testRec2);
Assert.AreNotEqual(0, objs.Count());
CollectionAssert.AllItemsAreUnique(objs);
//Получаем список групп к которым он принадлежит
var parents = recProvider.GetGroups(testRec2);
var parents = recProvider.GetGroups(tenant, testRec2);
Assert.AreNotEqual(0, parents.Count());
otdel = parents.First();
everyone = parents.Last();
var objsGroup = subProvider.GetSubscriptions(nAction, otdel);
var objsGroup = subProvider.GetSubscriptions(tenant, nAction, otdel);
CollectionAssert.AllItemsAreUnique(objsGroup);
//Подписываем весь отдел на объект
rndObj = String.Concat("TestObject#", new Random().Next().ToString());
subProvider.Subscribe(nAction, rndObj, otdel);
//Проверяем подписался ли юзер вместе со всем отделом двумя способами.
Assert.AreEqual(objsGroup.Count() + 1, subProvider.GetSubscriptions(nAction, otdel).Count());
Assert.AreEqual(objs.Count() + 1, subProvider.GetSubscriptions(nAction, testRec2).Count());
Assert.AreEqual(true, subProvider.IsSubscribed(nAction, testRec2, rndObj));
Assert.AreEqual(objsGroup.Count() + 1, subProvider.GetSubscriptions(tenant, nAction, otdel).Count());
Assert.AreEqual(objs.Count() + 1, subProvider.GetSubscriptions(tenant, nAction, testRec2).Count());
Assert.AreEqual(true, subProvider.IsSubscribed(tenant, nAction, testRec2, rndObj));
//Подписываем Everybody
rndObj2 = String.Concat("TestObject#", new Random().Next().ToString());
objs = subProvider.GetSubscriptions(nAction, testRec2);
objs = subProvider.GetSubscriptions(tenant, nAction, testRec2);
subProvider.Subscribe(nAction, rndObj2, everyone);
//Проверяем подписался ли user двумя способами.
Assert.AreEqual(objs.Count() + 1, subProvider.GetSubscriptions(nAction, testRec2).Count());
Assert.AreEqual(true, subProvider.IsSubscribed(nAction, testRec2, rndObj2));
Assert.AreEqual(objs.Count() + 1, subProvider.GetSubscriptions(tenant, nAction, testRec2).Count());
Assert.AreEqual(true, subProvider.IsSubscribed(tenant, nAction, testRec2, rndObj2));
}
finally

View File

@ -39,98 +39,95 @@ namespace ASC.Core.Common.Tests
[Test]
public void SearchUsers()
{
CoreContext.TenantManager.SetCurrentTenant(0);
var users = CoreContext.UserManager.Search(null, EmployeeStatus.Active);
var tenant = CoreContext.TenantManager.SetCurrentTenant(0);
var users = CoreContext.UserManager.Search(tenant, null, EmployeeStatus.Active);
Assert.AreEqual(0, users.Length);
users = CoreContext.UserManager.Search("", EmployeeStatus.Active);
users = CoreContext.UserManager.Search(tenant, "", EmployeeStatus.Active);
Assert.AreEqual(0, users.Length);
users = CoreContext.UserManager.Search(" ", EmployeeStatus.Active);
users = CoreContext.UserManager.Search(tenant, " ", EmployeeStatus.Active);
Assert.AreEqual(0, users.Length);
users = CoreContext.UserManager.Search("АбРаМсКй", EmployeeStatus.Active);
users = CoreContext.UserManager.Search(tenant, "АбРаМсКй", EmployeeStatus.Active);
Assert.AreEqual(0, users.Length);
users = CoreContext.UserManager.Search("АбРаМсКий", EmployeeStatus.Active);
users = CoreContext.UserManager.Search(tenant, "АбРаМсКий", EmployeeStatus.Active);
Assert.AreEqual(0, users.Length);//Абрамский уволился
users = CoreContext.UserManager.Search("АбРаМсКий", EmployeeStatus.All);
users = CoreContext.UserManager.Search(tenant, "АбРаМсКий", EmployeeStatus.All);
Assert.AreNotEqual(0, users.Length);
users = CoreContext.UserManager.Search("иванов николай", EmployeeStatus.Active);
users = CoreContext.UserManager.Search(tenant, "иванов николай", EmployeeStatus.Active);
Assert.AreNotEqual(0, users.Length);
users = CoreContext.UserManager.Search("ведущий програм", EmployeeStatus.Active);
users = CoreContext.UserManager.Search(tenant, "ведущий програм", EmployeeStatus.Active);
Assert.AreNotEqual(0, users.Length);
users = CoreContext.UserManager.Search("баннов лев", EmployeeStatus.Active, new Guid("613fc896-3ddd-4de1-a567-edbbc6cf1fc8"));
users = CoreContext.UserManager.Search(tenant, "баннов лев", EmployeeStatus.Active, new Guid("613fc896-3ddd-4de1-a567-edbbc6cf1fc8"));
Assert.AreNotEqual(0, users.Length);
users = CoreContext.UserManager.Search("иванов николай", EmployeeStatus.Active, new Guid("613fc896-3ddd-4de1-a567-edbbc6cf1fc8"));
users = CoreContext.UserManager.Search(tenant, "иванов николай", EmployeeStatus.Active, new Guid("613fc896-3ddd-4de1-a567-edbbc6cf1fc8"));
Assert.AreEqual(0, users);
}
[Test]
public void DepartmentManagers()
{
CoreContext.TenantManager.SetCurrentTenant(1024);
var tenant = CoreContext.TenantManager.SetCurrentTenant(1024);
var deps = CoreContext.UserManager.GetDepartments();
var users = CoreContext.UserManager.GetUsers();
var deps = CoreContext.UserManager.GetDepartments(tenant.TenantId);
var users = CoreContext.UserManager.GetUsers(tenant);
var g1 = deps[0];
var ceo = users[0];
var u1 = users[1];
var u2 = users[2];
//проверка кэша ceo
var ceoTemp = CoreContext.UserManager.GetCompanyCEO();
CoreContext.UserManager.SetCompanyCEO(ceo.ID);
ceoTemp = CoreContext.UserManager.GetCompanyCEO();
var ceoTemp = CoreContext.UserManager.GetCompanyCEO(tenant.TenantId);
CoreContext.UserManager.SetCompanyCEO(tenant.TenantId, ceo.ID);
ceoTemp = CoreContext.UserManager.GetCompanyCEO(tenant.TenantId);
Assert.AreEqual(ceo, ceoTemp);
Thread.Sleep(TimeSpan.FromSeconds(6));
ceoTemp = CoreContext.UserManager.GetCompanyCEO();
ceoTemp = CoreContext.UserManager.GetCompanyCEO(tenant.TenantId);
Assert.AreEqual(ceo, ceoTemp);
//установка манагеров
CoreContext.UserManager.SetDepartmentManager(g1.ID, u1.ID);
CoreContext.UserManager.SetDepartmentManager(tenant.TenantId, g1.ID, u1.ID);
CoreContext.UserManager.SetDepartmentManager(g1.ID, u2.ID);
CoreContext.UserManager.SetDepartmentManager(tenant.TenantId, g1.ID, u2.ID);
}
[Test]
public void UserGroupsPerformanceTest()
{
CoreContext.TenantManager.SetCurrentTenant(0);
var tenant = CoreContext.TenantManager.SetCurrentTenant(0);
foreach (var u in CoreContext.UserManager.GetUsers())
foreach (var u in CoreContext.UserManager.GetUsers(tenant))
{
var groups = CoreContext.UserManager.GetGroups(Guid.Empty);
var groups = CoreContext.UserManager.GetGroups(tenant.TenantId, Guid.Empty);
Assert.IsNotNull(groups);
foreach (var g in CoreContext.UserManager.GetUserGroups(u.ID))
foreach (var g in CoreContext.UserManager.GetUserGroups(tenant, u.ID))
{
var manager = CoreContext.UserManager.GetUsers(CoreContext.UserManager.GetDepartmentManager(g.ID)).UserName;
var manager = CoreContext.UserManager.GetUsers(CoreContext.UserManager.GetDepartmentManager(tenant.TenantId, g.ID), tenant.TenantId).UserName;
}
}
var stopwatch = Stopwatch.StartNew();
foreach (var u in CoreContext.UserManager.GetUsers())
foreach (var u in CoreContext.UserManager.GetUsers(tenant))
{
var groups = CoreContext.UserManager.GetGroups(Guid.Empty);
var groups = CoreContext.UserManager.GetGroups(tenant.TenantId, Guid.Empty);
Assert.IsNotNull(groups);
foreach (var g in CoreContext.UserManager.GetUserGroups(u.ID))
foreach (var g in CoreContext.UserManager.GetUserGroups(tenant, u.ID))
{
var manager = CoreContext.UserManager.GetUsers(CoreContext.UserManager.GetDepartmentManager(g.ID)).UserName;
var manager = CoreContext.UserManager.GetUsers(CoreContext.UserManager.GetDepartmentManager(tenant.TenantId, g.ID), tenant.TenantId).UserName;
}
}
stopwatch.Stop();
stopwatch.Restart();
var users = CoreContext.UserManager.GetUsersByGroup(Constants.GroupUser.ID);
var visitors = CoreContext.UserManager.GetUsersByGroup(Constants.GroupVisitor.ID);
var all = CoreContext.UserManager.GetUsers();
var users = CoreContext.UserManager.GetUsersByGroup(tenant, Constants.GroupUser.ID);
var visitors = CoreContext.UserManager.GetUsersByGroup(tenant, Constants.GroupVisitor.ID);
var all = CoreContext.UserManager.GetUsers(tenant);
Assert.IsNotNull(users);
Assert.IsNotNull(visitors);
Assert.IsNotNull(all);

View File

@ -25,16 +25,17 @@
using System.Collections.Generic;
using ASC.Core.Tenants;
using Microsoft.AspNetCore.Http;
namespace ASC.Core.Users
{
public static class UserExtensions
{
public static bool IsOwner(this UserInfo ui)
public static bool IsOwner(this UserInfo ui, Tenant tenant)
{
if (ui == null) return false;
var tenant = CoreContext.TenantManager.GetCurrentTenant();
return tenant != null && tenant.OwnerId.Equals(ui.ID);
}
@ -43,19 +44,19 @@ namespace ASC.Core.Users
return ui != null && ui.ID == SecurityContext.CurrentAccount.ID;
}
public static bool IsAdmin(this UserInfo ui)
public static bool IsAdmin(this UserInfo ui, Tenant tenant)
{
return ui != null && CoreContext.UserManager.IsUserInGroup(ui.ID, Constants.GroupAdmin.ID);
return ui != null && CoreContext.UserManager.IsUserInGroup(tenant, ui.ID, Constants.GroupAdmin.ID);
}
public static bool IsVisitor(this UserInfo ui, Tenant tenant)
{
return ui != null && CoreContext.UserManager.IsUserInGroup(tenant, ui.ID, Constants.GroupVisitor.ID);
}
public static bool IsVisitor(this UserInfo ui)
public static bool IsOutsider(this UserInfo ui, Tenant tenant)
{
return ui != null && CoreContext.UserManager.IsUserInGroup(ui.ID, Constants.GroupVisitor.ID);
}
public static bool IsOutsider(this UserInfo ui)
{
return IsVisitor(ui) && ui.ID == Constants.OutsideUser.ID;
return IsVisitor(ui, tenant) && ui.ID == Constants.OutsideUser.ID;
}
public static bool IsLDAP(this UserInfo ui)

View File

@ -40,6 +40,7 @@ using ASC.Web.Studio.Core.Notify;
//using CrmDaoFactory = ASC.CRM.Core.Dao.DaoFactory;
using Microsoft.AspNetCore.Http;
using ASC.Common.Logging;
using ASC.Core.Tenants;
namespace ASC.Data.Reassigns
{
@ -102,7 +103,7 @@ namespace ASC.Data.Reassigns
Percentage = 0;
Status = ProgressStatus.Started;
CoreContext.TenantManager.SetCurrentTenant(_tenantId);
var tenant = CoreContext.TenantManager.SetCurrentTenant(_tenantId);
SecurityContext.AuthenticateMe(_currentUserId);
logger.InfoFormat("reassignment of data from {0} to {1}", _fromUserId, _toUserId);
@ -139,7 +140,7 @@ namespace ASC.Data.Reassigns
if (_deleteProfile)
{
DeleteUserProfile();
DeleteUserProfile(tenant);
}
}
catch (Exception ex)
@ -166,7 +167,7 @@ namespace ASC.Data.Reassigns
var fromUser = CoreContext.UserManager.GetUsers(_fromUserId);
var toUser = CoreContext.UserManager.GetUsers(_toUserId);
StudioNotifyService.SendMsgReassignsCompleted(_currentUserId, fromUser, toUser);
StudioNotifyService.SendMsgReassignsCompleted(_tenantId, _currentUserId, fromUser, toUser);
var fromUserName = fromUser.DisplayUserName(false);
var toUserName = toUser.DisplayUserName(false);
@ -182,16 +183,16 @@ namespace ASC.Data.Reassigns
var fromUser = CoreContext.UserManager.GetUsers(_fromUserId);
var toUser = CoreContext.UserManager.GetUsers(_toUserId);
StudioNotifyService.SendMsgReassignsFailed(_currentUserId, fromUser, toUser, errorMessage);
StudioNotifyService.SendMsgReassignsFailed(_tenantId, _currentUserId, fromUser, toUser, errorMessage);
}
private void DeleteUserProfile()
private void DeleteUserProfile(Tenant tenant)
{
var user = CoreContext.UserManager.GetUsers(_fromUserId);
var userName = user.DisplayUserName(false);
UserPhotoManager.RemovePhoto(user.ID);
CoreContext.UserManager.DeleteUser(user.ID);
UserPhotoManager.RemovePhoto(tenant, user.ID);
CoreContext.UserManager.DeleteUser(tenant, user.ID);
QueueWorkerRemove.Start(_tenantId, user, _currentUserId, false);
if (_httpHeaders != null)

View File

@ -34,6 +34,7 @@ using System.Web;
using ASC.Common.Logging;
using ASC.Common.Threading.Progress;
using ASC.Core;
using ASC.Core.Tenants;
using ASC.Core.Users;
using ASC.Data.Storage;
//using ASC.Mail.Core.Engine;
@ -104,11 +105,11 @@ namespace ASC.Data.Reassigns
Percentage = 0;
Status = ProgressStatus.Started;
CoreContext.TenantManager.SetCurrentTenant(_tenantId);
var tenant = CoreContext.TenantManager.SetCurrentTenant(_tenantId);
SecurityContext.AuthenticateMe(_currentUserId);
long docsSpace, crmSpace, mailSpace, talkSpace;
GetUsageSpace(out docsSpace, out mailSpace, out talkSpace);
GetUsageSpace(tenant, out docsSpace, out mailSpace, out talkSpace);
logger.InfoFormat("deleting user data for {0} ", _userId);
@ -168,11 +169,11 @@ namespace ASC.Data.Reassigns
return MemberwiseClone();
}
private void GetUsageSpace(out long docsSpace, out long mailSpace, out long talkSpace)
private void GetUsageSpace(Tenant tenant, out long docsSpace, out long mailSpace, out long talkSpace)
{
docsSpace = mailSpace = talkSpace = 0;
var webItems = WebItemManager.Instance.GetItems(Web.Core.WebZones.WebZoneType.All, ItemAvailableState.All);
var webItems = WebItemManager.Instance.GetItems(tenant, Web.Core.WebZones.WebZoneType.All, ItemAvailableState.All);
foreach (var item in webItems)
{
@ -225,7 +226,7 @@ namespace ASC.Data.Reassigns
private void SendSuccessNotify(long docsSpace, long crmSpace, long mailSpace, long talkSpace)
{
if (_notify)
StudioNotifyService.SendMsgRemoveUserDataCompleted(_currentUserId, _userId, _userName,
StudioNotifyService.SendMsgRemoveUserDataCompleted(_tenantId, _currentUserId, _userId, _userName,
docsSpace, crmSpace, mailSpace, talkSpace);
if (_httpHeaders != null)
@ -238,8 +239,7 @@ namespace ASC.Data.Reassigns
{
if (!_notify) return;
StudioNotifyService.SendMsgRemoveUserDataFailed(_currentUserId, _userId, _userName,
errorMessage);
StudioNotifyService.SendMsgRemoveUserDataFailed(_tenantId, _currentUserId, _userId, _userName, errorMessage);
}
}
}

View File

@ -38,9 +38,10 @@ namespace ASC.Web.Studio.Core
public static class BlockchainLoginProvider
{
public static void UpdateData(string account)
{
var user = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID);
if (!SecurityContext.IsAuthenticated || user.IsVisitor()) throw new SecurityException();
{
var tenant = CoreContext.TenantManager.GetCurrentTenant();
var user = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID, tenant.TenantId);
if (!SecurityContext.IsAuthenticated || user.IsVisitor(tenant)) throw new SecurityException();
var loginProfile = new LoginProfile
{

View File

@ -27,6 +27,7 @@
using System;
using System.Text;
using System.Web;
using ASC.Common;
using ASC.Core.Common;
using Uri = System.Uri;
@ -69,7 +70,7 @@ namespace ASC.VoipService.Twilio
private string GetEcho(string method, bool user = true)
{
return new TwilioResponseHelper(this, BaseCommonLinkUtility.GetFullAbsolutePath("")).GetEcho(method, user);
return new TwilioResponseHelper(this, BaseCommonLinkUtility.GetFullAbsolutePath(HttpContext.Current,"")).GetEcho(method, user);
}
}
}

View File

@ -19,41 +19,40 @@ namespace ASC.Employee.Core.Controllers
public class GroupController : ControllerBase
{
public Common.Logging.LogManager LogManager { get; }
private ApiContext apiContext;
public ApiContext ApiContext { get { return apiContext ?? (apiContext = HttpContext); } }
public ApiContext ApiContext { get; }
public MessageService MessageService { get; }
public GroupController(Common.Logging.LogManager logManager, MessageService messageService)
public GroupController(Common.Logging.LogManager logManager, MessageService messageService, ApiContext apiContext)
{
LogManager = logManager;
MessageService = messageService;
ApiContext = apiContext;
}
[Read]
public IEnumerable<GroupWrapperSummary> GetAll()
{
return CoreContext.UserManager.GetDepartments().Select(x => new GroupWrapperSummary(x));
return CoreContext.UserManager.GetDepartments(ApiContext.Tenant.TenantId).Select(x => new GroupWrapperSummary(x, ApiContext));
}
[Read("{groupid}")]
public GroupWrapperFull GetById(Guid groupid)
{
return new GroupWrapperFull(GetGroupInfo(groupid), true);
return new GroupWrapperFull(GetGroupInfo(groupid), true, ApiContext);
}
[Read("user/{userid}")]
public IEnumerable<GroupWrapperSummary> GetByUserId(Guid userid)
{
return CoreContext.UserManager.GetUserGroups(userid).Select(x => new GroupWrapperSummary(x));
return CoreContext.UserManager.GetUserGroups(ApiContext.Tenant, userid).Select(x => new GroupWrapperSummary(x, ApiContext));
}
[Create]
public GroupWrapperFull AddGroup(Guid groupManager, string groupName, IEnumerable<Guid> members)
{
SecurityContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
var group = CoreContext.UserManager.SaveGroupInfo(new GroupInfo { Name = groupName });
var group = CoreContext.UserManager.SaveGroupInfo(ApiContext.Tenant, new GroupInfo { Name = groupName });
TransferUserToDepartment(groupManager, @group, true);
if (members != null)
@ -66,23 +65,23 @@ namespace ASC.Employee.Core.Controllers
MessageService.Send(MessageAction.GroupCreated, MessageTarget.Create(group.ID), group.Name);
return new GroupWrapperFull(group, true);
return new GroupWrapperFull(group, true, ApiContext);
}
[Update("{groupid}")]
public GroupWrapperFull UpdateGroup(Guid groupid, Guid groupManager, string groupName, IEnumerable<Guid> members)
{
SecurityContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
var group = CoreContext.UserManager.GetGroups().SingleOrDefault(x => x.ID == groupid).NotFoundIfNull("group not found");
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
var group = CoreContext.UserManager.GetGroups(ApiContext.Tenant.TenantId).SingleOrDefault(x => x.ID == groupid).NotFoundIfNull("group not found");
if (group.ID == Constants.LostGroupInfo.ID)
{
throw new ItemNotFoundException("group not found");
}
group.Name = groupName ?? group.Name;
CoreContext.UserManager.SaveGroupInfo(group);
CoreContext.UserManager.SaveGroupInfo(ApiContext.Tenant, group);
RemoveMembersFrom(groupid, CoreContext.UserManager.GetUsersByGroup(groupid, EmployeeStatus.All).Select(u => u.ID).Where(id => !members.Contains(id)));
RemoveMembersFrom(groupid, CoreContext.UserManager.GetUsersByGroup(ApiContext.Tenant, groupid, EmployeeStatus.All).Select(u => u.ID).Where(id => !members.Contains(id)));
TransferUserToDepartment(groupManager, @group, true);
if (members != null)
@ -101,20 +100,20 @@ namespace ASC.Employee.Core.Controllers
[Delete("{groupid}")]
public GroupWrapperFull DeleteGroup(Guid groupid)
{
SecurityContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
var @group = GetGroupInfo(groupid);
var groupWrapperFull = new GroupWrapperFull(group, false);
var groupWrapperFull = new GroupWrapperFull(group, false, ApiContext);
CoreContext.UserManager.DeleteGroup(groupid);
CoreContext.UserManager.DeleteGroup(ApiContext.Tenant, groupid);
MessageService.Send(MessageAction.GroupDeleted, MessageTarget.Create(group.ID), group.Name);
return groupWrapperFull;
}
private static GroupInfo GetGroupInfo(Guid groupid)
private GroupInfo GetGroupInfo(Guid groupid)
{
var group = CoreContext.UserManager.GetGroups().SingleOrDefault(x => x.ID == groupid).NotFoundIfNull("group not found");
var group = CoreContext.UserManager.GetGroups(ApiContext.Tenant.TenantId).SingleOrDefault(x => x.ID == groupid).NotFoundIfNull("group not found");
if (group.ID == Constants.LostGroupInfo.ID)
throw new ItemNotFoundException("group not found");
return @group;
@ -123,12 +122,12 @@ namespace ASC.Employee.Core.Controllers
[Update("{groupid}/members/{newgroupid}")]
public GroupWrapperFull TransferMembersTo(Guid groupid, Guid newgroupid)
{
SecurityContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
var oldgroup = GetGroupInfo(groupid);
var newgroup = GetGroupInfo(newgroupid);
var users = CoreContext.UserManager.GetUsersByGroup(oldgroup.ID);
var users = CoreContext.UserManager.GetUsersByGroup(ApiContext.Tenant, oldgroup.ID);
foreach (var userInfo in users)
{
TransferUserToDepartment(userInfo.ID, newgroup, false);
@ -139,7 +138,7 @@ namespace ASC.Employee.Core.Controllers
[Create("{groupid}/members")]
public GroupWrapperFull SetMembersTo(Guid groupid, IEnumerable<Guid> members)
{
RemoveMembersFrom(groupid, CoreContext.UserManager.GetUsersByGroup(groupid).Select(x => x.ID));
RemoveMembersFrom(groupid, CoreContext.UserManager.GetUsersByGroup(ApiContext.Tenant, groupid).Select(x => x.ID));
AddMembersTo(groupid, members);
return GetById(groupid);
}
@ -147,7 +146,7 @@ namespace ASC.Employee.Core.Controllers
[Update("{groupid}/members")]
public GroupWrapperFull AddMembersTo(Guid groupid, IEnumerable<Guid> members)
{
SecurityContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
var group = GetGroupInfo(groupid);
foreach (var userId in members)
@ -161,9 +160,9 @@ namespace ASC.Employee.Core.Controllers
public GroupWrapperFull SetManager(Guid groupid, Guid userid)
{
var group = GetGroupInfo(groupid);
if (CoreContext.UserManager.UserExists(userid))
if (CoreContext.UserManager.UserExists(userid, ApiContext.Tenant.TenantId))
{
CoreContext.UserManager.SetDepartmentManager(group.ID, userid);
CoreContext.UserManager.SetDepartmentManager(ApiContext.Tenant.TenantId, group.ID, userid);
}
else
{
@ -175,7 +174,7 @@ namespace ASC.Employee.Core.Controllers
[Delete("{groupid}/members")]
public GroupWrapperFull RemoveMembersFrom(Guid groupid, IEnumerable<Guid> members)
{
SecurityContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
var group = GetGroupInfo(groupid);
foreach (var userId in members)
@ -185,24 +184,24 @@ namespace ASC.Employee.Core.Controllers
return GetById(group.ID);
}
private static void RemoveUserFromDepartment(Guid userId, GroupInfo @group)
private void RemoveUserFromDepartment(Guid userId, GroupInfo @group)
{
if (!CoreContext.UserManager.UserExists(userId)) return;
if (!CoreContext.UserManager.UserExists(userId, ApiContext.Tenant.TenantId)) return;
var user = CoreContext.UserManager.GetUsers(userId);
CoreContext.UserManager.RemoveUserFromGroup(user.ID, @group.ID);
CoreContext.UserManager.SaveUserInfo(user);
var user = CoreContext.UserManager.GetUsers(userId, ApiContext.Tenant.TenantId);
CoreContext.UserManager.RemoveUserFromGroup(ApiContext.Tenant, user.ID, @group.ID);
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
}
private static void TransferUserToDepartment(Guid userId, GroupInfo group, bool setAsManager)
private void TransferUserToDepartment(Guid userId, GroupInfo group, bool setAsManager)
{
if (!CoreContext.UserManager.UserExists(userId) && userId != Guid.Empty) return;
if (!CoreContext.UserManager.UserExists(userId, ApiContext.Tenant.TenantId) && userId != Guid.Empty) return;
if (setAsManager)
{
CoreContext.UserManager.SetDepartmentManager(@group.ID, userId);
CoreContext.UserManager.SetDepartmentManager(ApiContext.Tenant.TenantId, @group.ID, userId);
}
CoreContext.UserManager.AddUserIntoGroup(userId, @group.ID);
CoreContext.UserManager.AddUserIntoGroup(ApiContext.Tenant, userId, @group.ID);
}
}
}

View File

@ -86,42 +86,42 @@ namespace ASC.Employee.Core.Controllers
public IEnumerable<EmployeeWraper> GetByStatus(EmployeeStatus status)
{
if (CoreContext.Configuration.Personal) throw new Exception("Method not available");
var query = CoreContext.UserManager.GetUsers(status).AsEnumerable();
var query = CoreContext.UserManager.GetUsers(ApiContext.Tenant, status).AsEnumerable();
if ("group".Equals(ApiContext.FilterBy, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(ApiContext.FilterValue))
{
var groupId = new Guid(ApiContext.FilterValue);
//Filter by group
query = query.Where(x => CoreContext.UserManager.IsUserInGroup(x.ID, groupId));
query = query.Where(x => CoreContext.UserManager.IsUserInGroup(ApiContext.Tenant, x.ID, groupId));
ApiContext.SetDataFiltered();
}
return query.Select(x => new EmployeeWraperFull(x));
return query.Select(x => new EmployeeWraperFull(x, ApiContext));
}
[Read("@self")]
public EmployeeWraper Self()
{
return new EmployeeWraperFull(CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID));
return new EmployeeWraperFull(CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID), ApiContext);
}
[Read("email")]
public EmployeeWraperFull GetByEmail([FromQuery]string email)
{
if (CoreContext.Configuration.Personal && !CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsOwner())
if (CoreContext.Configuration.Personal && !CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsOwner(ApiContext.Tenant))
throw new MethodAccessException("Method not available");
var user = CoreContext.UserManager.GetUserByEmail(email);
var user = CoreContext.UserManager.GetUserByEmail(ApiContext.Tenant.TenantId, email);
if (user.ID == Constants.LostUser.ID)
{
throw new ItemNotFoundException("User not found");
}
return new EmployeeWraperFull(user);
return new EmployeeWraperFull(user, ApiContext);
}
[Read("{username}", order: int.MaxValue)]
public EmployeeWraperFull GetById(string username)
{
if (CoreContext.Configuration.Personal) throw new MethodAccessException("Method not available");
var user = CoreContext.UserManager.GetUserByUserName(username);
var user = CoreContext.UserManager.GetUserByUserName(ApiContext.Tenant.TenantId, username);
if (user.ID == Constants.LostUser.ID)
{
if (Guid.TryParse(username, out var userId))
@ -139,7 +139,7 @@ namespace ASC.Employee.Core.Controllers
throw new ItemNotFoundException("User not found");
}
return new EmployeeWraperFull(user);
return new EmployeeWraperFull(user, ApiContext);
}
[Read("@search/{query}")]
@ -154,7 +154,7 @@ namespace ASC.Employee.Core.Controllers
groupId = new Guid(ApiContext.FilterValue);
}
return CoreContext.UserManager.Search(query, EmployeeStatus.Active, groupId).Select(x => new EmployeeWraperFull(x));
return CoreContext.UserManager.Search(ApiContext.Tenant, query, EmployeeStatus.Active, groupId).Select(x => new EmployeeWraperFull(x, ApiContext));
}
catch (Exception error)
{
@ -175,20 +175,20 @@ namespace ASC.Employee.Core.Controllers
if (CoreContext.Configuration.Personal) throw new MethodAccessException("Method not available");
try
{
var list = CoreContext.UserManager.GetUsers(status).AsEnumerable();
var list = CoreContext.UserManager.GetUsers(ApiContext.Tenant, status).AsEnumerable();
if ("group".Equals(ApiContext.FilterBy, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(ApiContext.FilterValue))
{
var groupId = new Guid(ApiContext.FilterValue);
//Filter by group
list = list.Where(x => CoreContext.UserManager.IsUserInGroup(x.ID, groupId));
list = list.Where(x => CoreContext.UserManager.IsUserInGroup(ApiContext.Tenant, x.ID, groupId));
ApiContext.SetDataFiltered();
}
list = list.Where(x => x.FirstName != null && x.FirstName.IndexOf(query, StringComparison.OrdinalIgnoreCase) > -1 || (x.LastName != null && x.LastName.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1) ||
(x.UserName != null && x.UserName.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1) || (x.Email != null && x.Email.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1) || (x.Contacts != null && x.Contacts.Any(y => y.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1)));
return list.Select(x => new EmployeeWraperFull(x));
return list.Select(x => new EmployeeWraperFull(x, ApiContext));
}
catch (Exception error)
{
@ -263,14 +263,14 @@ namespace ASC.Employee.Core.Controllers
{
var users = GetByFilter(employeeStatus, groupId, activationStatus, employeeType, isAdministrator);
return users.Select(u => new EmployeeWraper(u));
return users.Select(u => new EmployeeWraper(u, ApiContext));
}
private IEnumerable<UserInfo> GetByFilter(EmployeeStatus? employeeStatus, Guid? groupId, EmployeeActivationStatus? activationStatus, EmployeeType? employeeType, bool? isAdministrator)
{
if (CoreContext.Configuration.Personal) throw new MethodAccessException("Method not available");
var isAdmin = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsAdmin() ||
WebItemSecurity.IsProductAdministrator(WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID);
var isAdmin = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsAdmin(ApiContext.Tenant) ||
WebItemSecurity.IsProductAdministrator(ApiContext.Tenant, WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID);
var includeGroups = new List<Guid>();
if (groupId.HasValue)
@ -302,7 +302,7 @@ namespace ASC.Employee.Core.Controllers
includeGroups.AddRange(products.Select(r=> r.ID));
}
var users = CoreContext.UserManager.GetUsers(isAdmin, employeeStatus, includeGroups, excludeGroups, activationStatus, ApiContext.FilterValue, ApiContext.SortBy, !ApiContext.SortDescending, ApiContext.Count - 1, ApiContext.StartIndex, out int total);
var users = CoreContext.UserManager.GetUsers(ApiContext.Tenant.TenantId, isAdmin, employeeStatus, includeGroups, excludeGroups, activationStatus, ApiContext.FilterValue, ApiContext.SortBy, !ApiContext.SortDescending, ApiContext.Count - 1, ApiContext.StartIndex, out int total);
ApiContext.SetTotalCount(total);
@ -312,7 +312,7 @@ namespace ASC.Employee.Core.Controllers
[Create]
public EmployeeWraperFull AddMember(MemberModel memberModel)
{
SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_AddRemoveUser);
if (string.IsNullOrEmpty(memberModel.Password))
memberModel.Password = UserManagerWrapper.GeneratePassword();
@ -339,7 +339,7 @@ namespace ASC.Employee.Core.Controllers
UpdateContacts(memberModel.Contacts, user);
user = UserManagerWrapper.AddUser(user, memberModel.Password, false, true, memberModel.IsVisitor);
user = UserManagerWrapper.AddUser(ApiContext.Tenant, user, memberModel.Password, false, true, memberModel.IsVisitor);
var messageAction = memberModel.IsVisitor ? MessageAction.GuestCreated : MessageAction.UserCreated;
MessageService.Send(messageAction, MessageTarget.Create(user.ID), user.DisplayUserName(false));
@ -351,13 +351,13 @@ namespace ASC.Employee.Core.Controllers
UpdatePhotoUrl(memberModel.Files, user);
}
return new EmployeeWraperFull(user);
return new EmployeeWraperFull(user, ApiContext);
}
[Create("active")]
public EmployeeWraperFull AddMemberAsActivated(MemberModel memberModel)
{
SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_AddRemoveUser);
var user = new UserInfo();
@ -382,7 +382,7 @@ namespace ASC.Employee.Core.Controllers
UpdateContacts(memberModel.Contacts, user);
user = UserManagerWrapper.AddUser(user, memberModel.Password, false, false, memberModel.IsVisitor);
user = UserManagerWrapper.AddUser(ApiContext.Tenant, user, memberModel.Password, false, false, memberModel.IsVisitor);
user.ActivationStatus = EmployeeActivationStatus.Activated;
@ -393,7 +393,7 @@ namespace ASC.Employee.Core.Controllers
UpdatePhotoUrl(memberModel.Files, user);
}
return new EmployeeWraperFull(user);
return new EmployeeWraperFull(user, ApiContext);
}
[Update("{userid}")]
@ -404,7 +404,7 @@ namespace ASC.Employee.Core.Controllers
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(user.ID), Constants.Action_EditUser);
var self = SecurityContext.CurrentAccount.ID.Equals(user.ID);
var resetDate = new DateTime(1900, 01, 01);
@ -413,7 +413,7 @@ namespace ASC.Employee.Core.Controllers
var isLdap = user.IsLDAP();
var isSso = user.IsSSO();
var isAdmin = WebItemSecurity.IsProductAdministrator(WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID);
var isAdmin = WebItemSecurity.IsProductAdministrator(ApiContext.Tenant, WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID);
if (!isLdap && !isSso)
{
@ -455,7 +455,7 @@ namespace ASC.Employee.Core.Controllers
UpdateContacts(memberModel.Contacts, user);
UpdateDepartments(memberModel.Department, user);
if (memberModel.Files != UserPhotoManager.GetPhotoAbsoluteWebPath(user.ID))
if (memberModel.Files != UserPhotoManager.GetPhotoAbsoluteWebPath(ApiContext.Tenant, user.ID))
{
UpdatePhotoUrl(memberModel.Files, user);
}
@ -467,24 +467,24 @@ namespace ASC.Employee.Core.Controllers
if (self && !isAdmin)
{
StudioNotifyService.SendMsgToAdminAboutProfileUpdated();
StudioNotifyService.SendMsgToAdminAboutProfileUpdated(ApiContext.Tenant.TenantId);
}
// change user type
var canBeGuestFlag = !user.IsOwner() && !user.IsAdmin() && !user.GetListAdminModules().Any() && !user.IsMe();
var canBeGuestFlag = !user.IsOwner(ApiContext.Tenant) && !user.IsAdmin(ApiContext.Tenant) && !user.GetListAdminModules(ApiContext.Tenant).Any() && !user.IsMe();
if (memberModel.IsVisitor && !user.IsVisitor() && canBeGuestFlag)
if (memberModel.IsVisitor && !user.IsVisitor(ApiContext.Tenant) && canBeGuestFlag)
{
CoreContext.UserManager.AddUserIntoGroup(user.ID, Constants.GroupVisitor.ID);
CoreContext.UserManager.AddUserIntoGroup(ApiContext.Tenant, user.ID, Constants.GroupVisitor.ID);
WebItemSecurity.ClearCache();
}
if (!self && !memberModel.IsVisitor && user.IsVisitor())
if (!self && !memberModel.IsVisitor && user.IsVisitor(ApiContext.Tenant))
{
var usersQuota = TenantExtra.GetTenantQuota().ActiveUsers;
if (TenantStatisticsProvider.GetUsersCount() < usersQuota)
if (TenantStatisticsProvider.GetUsersCount(ApiContext.Tenant) < usersQuota)
{
CoreContext.UserManager.RemoveUserFromGroup(user.ID, Constants.GroupVisitor.ID);
CoreContext.UserManager.RemoveUserFromGroup(ApiContext.Tenant, user.ID, Constants.GroupVisitor.ID);
WebItemSecurity.ClearCache();
}
else
@ -493,7 +493,7 @@ namespace ASC.Employee.Core.Controllers
}
}
CoreContext.UserManager.SaveUserInfo(user, memberModel.IsVisitor);
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user, memberModel.IsVisitor);
MessageService.Send(MessageAction.UserUpdated, MessageTarget.Create(user.ID), user.DisplayUserName(false));
if (memberModel.Disable.HasValue && memberModel.Disable.Value)
@ -502,13 +502,13 @@ namespace ASC.Employee.Core.Controllers
MessageService.Send(MessageAction.CookieSettingsUpdated);
}
return new EmployeeWraperFull(user);
return new EmployeeWraperFull(user, ApiContext);
}
[Delete("{userid}")]
public EmployeeWraperFull DeleteMember(string userid)
{
SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_AddRemoveUser);
var user = GetUserInfo(userid);
@ -522,13 +522,13 @@ namespace ASC.Employee.Core.Controllers
var userName = user.DisplayUserName(false);
UserPhotoManager.RemovePhoto(user.ID);
CoreContext.UserManager.DeleteUser(user.ID);
UserPhotoManager.RemovePhoto(ApiContext.Tenant, user.ID);
CoreContext.UserManager.DeleteUser(ApiContext.Tenant, user.ID);
QueueWorkerRemove.Start(TenantProvider.CurrentTenantID, user, SecurityContext.CurrentAccount.ID, false);
MessageService.Send(MessageAction.UserDeleted, MessageTarget.Create(user.ID), userName);
return new EmployeeWraperFull(user);
return new EmployeeWraperFull(user, ApiContext);
}
[Update("{userid}/contacts")]
@ -540,8 +540,8 @@ namespace ASC.Employee.Core.Controllers
throw new SecurityException();
UpdateContacts(memberModel.Contacts, user);
CoreContext.UserManager.SaveUserInfo(user);
return new EmployeeWraperFull(user);
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
return new EmployeeWraperFull(user, ApiContext);
}
[Create("{userid}/contacts")]
@ -554,8 +554,8 @@ namespace ASC.Employee.Core.Controllers
user.Contacts.Clear();
UpdateContacts(memberModel.Contacts, user);
CoreContext.UserManager.SaveUserInfo(user);
return new EmployeeWraperFull(user);
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
return new EmployeeWraperFull(user, ApiContext);
}
[Delete("{userid}/contacts")]
@ -567,8 +567,8 @@ namespace ASC.Employee.Core.Controllers
throw new SecurityException();
DeleteContacts(memberModel.Contacts, user);
CoreContext.UserManager.SaveUserInfo(user);
return new EmployeeWraperFull(user);
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
return new EmployeeWraperFull(user, ApiContext);
}
[Read("{userid}/photo")]
@ -579,7 +579,7 @@ namespace ASC.Employee.Core.Controllers
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
return new ThumbnailsDataWrapper(user.ID);
return new ThumbnailsDataWrapper(ApiContext.Tenant, user.ID);
}
[Create("{userid}/photo")]
@ -600,7 +600,7 @@ namespace ASC.Employee.Core.Controllers
userId = SecurityContext.CurrentAccount.ID;
}
SecurityContext.DemandPermissions(new UserSecurityProvider(userId), Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(userId), Constants.Action_EditUser);
var userPhoto = model.Files[0];
@ -625,17 +625,17 @@ namespace ASC.Employee.Core.Controllers
if (data.Length > SetupInfo.MaxImageUploadSize)
throw new ImageSizeLimitException();
var mainPhoto = UserPhotoManager.SaveOrUpdatePhoto(userId, data);
var mainPhoto = UserPhotoManager.SaveOrUpdatePhoto(ApiContext.Tenant, userId, data);
result.Data =
new
{
main = mainPhoto,
retina = UserPhotoManager.GetRetinaPhotoURL(userId),
max = UserPhotoManager.GetMaxPhotoURL(userId),
big = UserPhotoManager.GetBigPhotoURL(userId),
medium = UserPhotoManager.GetMediumPhotoURL(userId),
small = UserPhotoManager.GetSmallPhotoURL(userId),
retina = UserPhotoManager.GetRetinaPhotoURL(ApiContext.Tenant.TenantId, userId),
max = UserPhotoManager.GetMaxPhotoURL(ApiContext.Tenant.TenantId, userId),
big = UserPhotoManager.GetBigPhotoURL(ApiContext.Tenant.TenantId, userId),
medium = UserPhotoManager.GetMediumPhotoURL(ApiContext.Tenant.TenantId, userId),
small = UserPhotoManager.GetSmallPhotoURL(ApiContext.Tenant.TenantId, userId),
};
}
else
@ -684,15 +684,15 @@ namespace ASC.Employee.Core.Controllers
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
if (model.Files != UserPhotoManager.GetPhotoAbsoluteWebPath(user.ID))
if (model.Files != UserPhotoManager.GetPhotoAbsoluteWebPath(ApiContext.Tenant, user.ID))
{
UpdatePhotoUrl(model.Files, user);
}
CoreContext.UserManager.SaveUserInfo(user);
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
MessageService.Send(MessageAction.UserAddedAvatar, MessageTarget.Create(user.ID), user.DisplayUserName(false));
return new ThumbnailsDataWrapper(user.ID);
return new ThumbnailsDataWrapper(ApiContext.Tenant, user.ID);
}
[Delete("{userid}/photo")]
@ -703,14 +703,14 @@ namespace ASC.Employee.Core.Controllers
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(user.ID), Constants.Action_EditUser);
UserPhotoManager.RemovePhoto(user.ID);
UserPhotoManager.RemovePhoto(ApiContext.Tenant, user.ID);
CoreContext.UserManager.SaveUserInfo(user);
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
MessageService.Send(MessageAction.UserDeletedAvatar, MessageTarget.Create(user.ID), user.DisplayUserName(false));
return new ThumbnailsDataWrapper(user.ID);
return new ThumbnailsDataWrapper(ApiContext.Tenant, user.ID);
}
@ -722,7 +722,7 @@ namespace ASC.Employee.Core.Controllers
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(user.ID), Constants.Action_EditUser);
if (!string.IsNullOrEmpty(thumbnailsModel.TmpFile))
{
@ -732,18 +732,18 @@ namespace ASC.Employee.Core.Controllers
var settings = new UserPhotoThumbnailSettings(thumbnailsModel.X, thumbnailsModel.Y, thumbnailsModel.Width, thumbnailsModel.Height);
settings.SaveForUser(user.ID);
UserPhotoManager.SaveOrUpdatePhoto(user.ID, data);
UserPhotoManager.SaveOrUpdatePhoto(ApiContext.Tenant, user.ID, data);
UserPhotoManager.RemoveTempPhoto(fileName);
}
else
{
UserPhotoThumbnailManager.SaveThumbnails(thumbnailsModel.X, thumbnailsModel.Y, thumbnailsModel.Width, thumbnailsModel.Height, user.ID);
UserPhotoThumbnailManager.SaveThumbnails(ApiContext.Tenant.TenantId, thumbnailsModel.X, thumbnailsModel.Y, thumbnailsModel.Width, thumbnailsModel.Height, user.ID);
}
CoreContext.UserManager.SaveUserInfo(user);
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
MessageService.Send(MessageAction.UserUpdatedAvatarThumbnails, MessageTarget.Create(user.ID), user.DisplayUserName(false));
return new ThumbnailsDataWrapper(user.ID);
return new ThumbnailsDataWrapper(ApiContext.Tenant, user.ID);
}
@ -751,7 +751,7 @@ namespace ASC.Employee.Core.Controllers
[Create("password", false)]
public string SendUserPassword(string email)
{
var userInfo = UserManagerWrapper.SendUserPassword(email, MessageService, HttpContext);
var userInfo = UserManagerWrapper.SendUserPassword(ApiContext.Tenant.TenantId, email, MessageService, HttpContext);
return string.Format(Resource.MessageYourPasswordSuccessfullySendedToEmail, userInfo.Email);
}
@ -759,11 +759,11 @@ namespace ASC.Employee.Core.Controllers
[Update("{userid}/password")]
public EmployeeWraperFull ChangeUserPassword(Guid userid, MemberModel memberModel)
{
SecurityContext.DemandPermissions(new UserSecurityProvider(userid), Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(userid), Constants.Action_EditUser);
if (!CoreContext.UserManager.UserExists(userid)) return null;
if (!CoreContext.UserManager.UserExists(userid, ApiContext.Tenant.TenantId)) return null;
var user = CoreContext.UserManager.GetUsers(userid);
var user = CoreContext.UserManager.GetUsers(userid, ApiContext.Tenant.TenantId);
if (CoreContext.UserManager.IsSystemUser(user.ID))
throw new SecurityException();
@ -775,7 +775,7 @@ namespace ASC.Employee.Core.Controllers
{
user.Email = address.Address.ToLowerInvariant();
user.ActivationStatus = EmployeeActivationStatus.Activated;
CoreContext.UserManager.SaveUserInfo(user);
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
}
}
@ -788,20 +788,20 @@ namespace ASC.Employee.Core.Controllers
MessageService.Send(MessageAction.CookieSettingsUpdated);
}
return new EmployeeWraperFull(GetUserInfo(userid.ToString()));
return new EmployeeWraperFull(GetUserInfo(userid.ToString()), ApiContext);
}
private static UserInfo GetUserInfo(string userNameOrId)
private UserInfo GetUserInfo(string userNameOrId)
{
UserInfo user;
try
{
var userId = new Guid(userNameOrId);
user = CoreContext.UserManager.GetUsers(userId);
user = CoreContext.UserManager.GetUsers(userId, ApiContext.Tenant.TenantId);
}
catch (FormatException)
{
user = CoreContext.UserManager.GetUserByUserName(userNameOrId);
user = CoreContext.UserManager.GetUserByUserName(ApiContext.Tenant.TenantId, userNameOrId);
}
if (user == null || user.ID == Constants.LostUser.ID)
throw new ItemNotFoundException("user not found");
@ -814,13 +814,13 @@ namespace ASC.Employee.Core.Controllers
var retuls = new List<EmployeeWraperFull>();
foreach (var id in model.UserIds.Where(userId => !CoreContext.UserManager.IsSystemUser(userId)))
{
SecurityContext.DemandPermissions(new UserSecurityProvider(id), Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(id), Constants.Action_EditUser);
var u = CoreContext.UserManager.GetUsers(id);
if (u.ID == Constants.LostUser.ID || u.IsLDAP()) continue;
u.ActivationStatus = activationstatus;
CoreContext.UserManager.SaveUserInfo(u);
retuls.Add(new EmployeeWraperFull(u));
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, u);
retuls.Add(new EmployeeWraperFull(u, ApiContext));
}
return retuls;
@ -837,23 +837,23 @@ namespace ASC.Employee.Core.Controllers
foreach (var user in users)
{
if (user.IsOwner() || user.IsAdmin() || user.IsMe() || user.GetListAdminModules().Any())
if (user.IsOwner(ApiContext.Tenant) || user.IsAdmin(ApiContext.Tenant) || user.IsMe() || user.GetListAdminModules(ApiContext.Tenant).Any())
continue;
switch (type)
{
case EmployeeType.User:
if (user.IsVisitor())
if (user.IsVisitor(ApiContext.Tenant))
{
if (TenantStatisticsProvider.GetUsersCount() < TenantExtra.GetTenantQuota().ActiveUsers)
if (TenantStatisticsProvider.GetUsersCount(ApiContext.Tenant) < TenantExtra.GetTenantQuota().ActiveUsers)
{
CoreContext.UserManager.RemoveUserFromGroup(user.ID, Constants.GroupVisitor.ID);
CoreContext.UserManager.RemoveUserFromGroup(ApiContext.Tenant, user.ID, Constants.GroupVisitor.ID);
WebItemSecurity.ClearCache();
}
}
break;
case EmployeeType.Visitor:
CoreContext.UserManager.AddUserIntoGroup(user.ID, Constants.GroupVisitor.ID);
CoreContext.UserManager.AddUserIntoGroup(ApiContext.Tenant, user.ID, Constants.GroupVisitor.ID);
WebItemSecurity.ClearCache();
break;
}
@ -861,13 +861,13 @@ namespace ASC.Employee.Core.Controllers
MessageService.Send(MessageAction.UsersUpdatedType, MessageTarget.Create(users.Select(x => x.ID)), users.Select(x => x.DisplayUserName(false)));
return users.Select(user => new EmployeeWraperFull(user));
return users.Select(user => new EmployeeWraperFull(user, ApiContext));
}
[Update("status/{status}")]
public IEnumerable<EmployeeWraperFull> UpdateUserStatus(EmployeeStatus status, UpdateMembersModel model)
{
SecurityContext.DemandPermissions(Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditUser);
var users = model.UserIds.Select(userId => CoreContext.UserManager.GetUsers(userId))
.Where(u => !CoreContext.UserManager.IsSystemUser(u.ID) && !u.IsLDAP())
@ -875,7 +875,7 @@ namespace ASC.Employee.Core.Controllers
foreach (var user in users)
{
if (user.IsOwner() || user.IsMe())
if (user.IsOwner(ApiContext.Tenant) || user.IsMe())
continue;
switch (status)
@ -883,16 +883,16 @@ namespace ASC.Employee.Core.Controllers
case EmployeeStatus.Active:
if (user.Status == EmployeeStatus.Terminated)
{
if (TenantStatisticsProvider.GetUsersCount() < TenantExtra.GetTenantQuota().ActiveUsers || user.IsVisitor())
if (TenantStatisticsProvider.GetUsersCount(ApiContext.Tenant) < TenantExtra.GetTenantQuota().ActiveUsers || user.IsVisitor(ApiContext.Tenant))
{
user.Status = EmployeeStatus.Active;
CoreContext.UserManager.SaveUserInfo(user);
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
}
}
break;
case EmployeeStatus.Terminated:
user.Status = EmployeeStatus.Terminated;
CoreContext.UserManager.SaveUserInfo(user);
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
HttpContext.ResetUserCookie(user.ID);
MessageService.Send(MessageAction.CookieSettingsUpdated);
@ -902,7 +902,7 @@ namespace ASC.Employee.Core.Controllers
MessageService.Send(MessageAction.UsersUpdatedStatus, MessageTarget.Create(users.Select(x => x.ID)), users.Select(x => x.DisplayUserName(false)));
return users.Select(user => new EmployeeWraperFull(user));
return users.Select(user => new EmployeeWraperFull(user, ApiContext));
}
@ -920,7 +920,7 @@ namespace ASC.Employee.Core.Controllers
if (user.ActivationStatus == EmployeeActivationStatus.Pending)
{
if (user.IsVisitor())
if (user.IsVisitor(ApiContext.Tenant))
{
StudioNotifyService.GuestInfoActivation(user);
}
@ -937,13 +937,13 @@ namespace ASC.Employee.Core.Controllers
MessageService.Send(MessageAction.UsersSentActivationInstructions, MessageTarget.Create(users.Select(x => x.ID)), users.Select(x => x.DisplayUserName(false)));
return users.Select(user => new EmployeeWraperFull(user));
return users.Select(user => new EmployeeWraperFull(user, ApiContext));
}
[Update("delete")]
public IEnumerable<EmployeeWraperFull> RemoveUsers(UpdateMembersModel model)
{
SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_AddRemoveUser);
CheckReassignProccess(model.UserIds);
@ -957,14 +957,14 @@ namespace ASC.Employee.Core.Controllers
{
if (user.Status != EmployeeStatus.Terminated) continue;
UserPhotoManager.RemovePhoto(user.ID);
CoreContext.UserManager.DeleteUser(user.ID);
UserPhotoManager.RemovePhoto(ApiContext.Tenant, user.ID);
CoreContext.UserManager.DeleteUser(ApiContext.Tenant,user.ID);
QueueWorkerRemove.Start(TenantProvider.CurrentTenantID, user, SecurityContext.CurrentAccount.ID, false);
}
MessageService.Send(MessageAction.UsersDeleted, MessageTarget.Create(users.Select(x => x.ID)), userNames);
return users.Select(user => new EmployeeWraperFull(user));
return users.Select(user => new EmployeeWraperFull(user, ApiContext));
}
@ -1037,7 +1037,7 @@ namespace ASC.Employee.Core.Controllers
[Read(@"reassign/progress")]
public ReassignProgressItem GetReassignProgress(Guid userId)
{
SecurityContext.DemandPermissions(Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditUser);
return QueueWorkerReassign.GetProgressItemStatus(TenantProvider.CurrentTenantID, userId);
}
@ -1045,7 +1045,7 @@ namespace ASC.Employee.Core.Controllers
[Update(@"reassign/terminate")]
public void TerminateReassign(Guid userId)
{
SecurityContext.DemandPermissions(Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditUser);
QueueWorkerReassign.Terminate(TenantProvider.CurrentTenantID, userId);
}
@ -1053,14 +1053,14 @@ namespace ASC.Employee.Core.Controllers
[Create(@"reassign/start")]
public ReassignProgressItem StartReassign(Guid fromUserId, Guid toUserId, bool deleteProfile)
{
SecurityContext.DemandPermissions(Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditUser);
var fromUser = CoreContext.UserManager.GetUsers(fromUserId);
if (fromUser == null || fromUser.ID == Constants.LostUser.ID)
throw new ArgumentException("User with id = " + fromUserId + " not found");
if (fromUser.IsOwner() || fromUser.IsMe() || fromUser.Status != EmployeeStatus.Terminated)
if (fromUser.IsOwner(ApiContext.Tenant) || fromUser.IsMe() || fromUser.Status != EmployeeStatus.Terminated)
throw new ArgumentException("Can not delete user with id = " + fromUserId);
var toUser = CoreContext.UserManager.GetUsers(toUserId);
@ -1068,7 +1068,7 @@ namespace ASC.Employee.Core.Controllers
if (toUser == null || toUser.ID == Constants.LostUser.ID)
throw new ArgumentException("User with id = " + toUserId + " not found");
if (toUser.IsVisitor() || toUser.Status == EmployeeStatus.Terminated)
if (toUser.IsVisitor(ApiContext.Tenant) || toUser.Status == EmployeeStatus.Terminated)
throw new ArgumentException("Can not reassign data to user with id = " + toUserId);
return QueueWorkerReassign.Start(TenantProvider.CurrentTenantID, fromUserId, toUserId, SecurityContext.CurrentAccount.ID, deleteProfile);
@ -1096,7 +1096,7 @@ namespace ASC.Employee.Core.Controllers
[Read(@"remove/progress")]
public RemoveProgressItem GetRemoveProgress(Guid userId)
{
SecurityContext.DemandPermissions(Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditUser);
return QueueWorkerRemove.GetProgressItemStatus(TenantProvider.CurrentTenantID, userId);
}
@ -1104,7 +1104,7 @@ namespace ASC.Employee.Core.Controllers
[Update(@"remove/terminate")]
public void TerminateRemove(Guid userId)
{
SecurityContext.DemandPermissions(Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditUser);
QueueWorkerRemove.Terminate(TenantProvider.CurrentTenantID, userId);
}
@ -1112,14 +1112,14 @@ namespace ASC.Employee.Core.Controllers
[Create(@"remove/start")]
public RemoveProgressItem StartRemove(Guid userId)
{
SecurityContext.DemandPermissions(Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditUser);
var user = CoreContext.UserManager.GetUsers(userId);
if (user == null || user.ID == Constants.LostUser.ID)
throw new ArgumentException("User with id = " + userId + " not found");
if (user.IsOwner() || user.IsMe() || user.Status != EmployeeStatus.Terminated)
if (user.IsOwner(ApiContext.Tenant) || user.IsMe() || user.Status != EmployeeStatus.Terminated)
throw new ArgumentException("Can not delete user with id = " + userId);
return QueueWorkerRemove.Start(TenantProvider.CurrentTenantID, user, SecurityContext.CurrentAccount.ID, true);
@ -1127,40 +1127,40 @@ namespace ASC.Employee.Core.Controllers
#endregion
private static void UpdateDepartments(IEnumerable<Guid> department, UserInfo user)
private void UpdateDepartments(IEnumerable<Guid> department, UserInfo user)
{
if (!SecurityContext.CheckPermissions(Constants.Action_EditGroups)) return;
if (!SecurityContext.CheckPermissions(ApiContext.Tenant, Constants.Action_EditGroups)) return;
if (department == null) return;
var groups = CoreContext.UserManager.GetUserGroups(user.ID);
var groups = CoreContext.UserManager.GetUserGroups(ApiContext.Tenant, user.ID);
var managerGroups = new List<Guid>();
foreach (var groupInfo in groups)
{
CoreContext.UserManager.RemoveUserFromGroup(user.ID, groupInfo.ID);
var managerId = CoreContext.UserManager.GetDepartmentManager(groupInfo.ID);
CoreContext.UserManager.RemoveUserFromGroup(ApiContext.Tenant, user.ID, groupInfo.ID);
var managerId = CoreContext.UserManager.GetDepartmentManager(ApiContext.Tenant.TenantId, groupInfo.ID);
if (managerId == user.ID)
{
managerGroups.Add(groupInfo.ID);
CoreContext.UserManager.SetDepartmentManager(groupInfo.ID, Guid.Empty);
CoreContext.UserManager.SetDepartmentManager(ApiContext.Tenant.TenantId, groupInfo.ID, Guid.Empty);
}
}
foreach (var guid in department)
{
var userDepartment = CoreContext.UserManager.GetGroupInfo(guid);
var userDepartment = CoreContext.UserManager.GetGroupInfo(ApiContext.Tenant.TenantId, guid);
if (userDepartment != Constants.LostGroupInfo)
{
CoreContext.UserManager.AddUserIntoGroup(user.ID, guid);
CoreContext.UserManager.AddUserIntoGroup(ApiContext.Tenant, user.ID, guid);
if (managerGroups.Contains(guid))
{
CoreContext.UserManager.SetDepartmentManager(guid, user.ID);
CoreContext.UserManager.SetDepartmentManager(ApiContext.Tenant.TenantId, guid, user.ID);
}
}
}
}
private static void UpdateContacts(IEnumerable<Contact> contacts, UserInfo user)
private void UpdateContacts(IEnumerable<Contact> contacts, UserInfo user)
{
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(user.ID), Constants.Action_EditUser);
user.Contacts.Clear();
if (contacts == null) return;
@ -1171,9 +1171,9 @@ namespace ASC.Employee.Core.Controllers
}
}
private static void DeleteContacts(IEnumerable<Contact> contacts, UserInfo user)
private void DeleteContacts(IEnumerable<Contact> contacts, UserInfo user)
{
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(user.ID), Constants.Action_EditUser);
if (contacts == null) return;
foreach (var contact in contacts)
@ -1194,7 +1194,7 @@ namespace ASC.Employee.Core.Controllers
return;
}
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(user.ID), Constants.Action_EditUser);
if (!files.StartsWith("http://") && !files.StartsWith("https://"))
{
@ -1205,7 +1205,7 @@ namespace ASC.Employee.Core.Controllers
using var inputStream = response.GetResponseStream();
using var br = new BinaryReader(inputStream);
var imageByteArray = br.ReadBytes((int)response.ContentLength);
UserPhotoManager.SaveOrUpdatePhoto(user.ID, imageByteArray);
UserPhotoManager.SaveOrUpdatePhoto(ApiContext.Tenant, user.ID, imageByteArray);
}
private static void CheckImgFormat(byte[] data)

View File

@ -1,9 +0,0 @@
namespace ASC.People
{
internal class JsonStringConverter
{
public JsonStringConverter()
{
}
}
}

View File

@ -41,11 +41,6 @@ namespace ASC.Web.Api.Models
{
}
public EmployeeWraper(UserInfo userInfo)
: this(userInfo, null)
{
}
public EmployeeWraper(UserInfo userInfo, ApiContext httpContext)
{
Id = userInfo.ID;
@ -59,7 +54,13 @@ namespace ASC.Web.Api.Models
if (httpContext.Check("avatarSmall"))
{
AvatarSmall = UserPhotoManager.GetSmallPhotoURL(userInfo.ID, out var isdef) + (isdef ? "" : $"?_={userInfoLM}");
AvatarSmall = UserPhotoManager.GetSmallPhotoURL(httpContext.Tenant.TenantId, userInfo.ID, out var isdef) + (isdef ? "" : $"?_={userInfoLM}");
}
if (Id != Guid.Empty)
{
var profileUrl = CommonLinkUtility.GetUserProfile(Id, userInfo.Tenant, false);
ProfileUrl = CommonLinkUtility.GetFullAbsolutePath(httpContext.HttpContext, profileUrl);
}
}
@ -76,31 +77,23 @@ namespace ASC.Web.Api.Models
public string AvatarSmall { get; set; }
[DataMember(Order = 30)]
public string ProfileUrl
{
get
{
if (Id == Guid.Empty) return string.Empty;
var profileUrl = CommonLinkUtility.GetUserProfile(Id.ToString(), false);
return CommonLinkUtility.GetFullAbsolutePath(profileUrl);
}
}
public string ProfileUrl { get; set; }
public static EmployeeWraper Get(Guid userId)
public static EmployeeWraper Get(Guid userId, ApiContext context)
{
try
{
return Get(CoreContext.UserManager.GetUsers(userId));
return Get(CoreContext.UserManager.GetUsers(userId), context);
}
catch (Exception)
{
return Get(Constants.LostUser);
return Get(Constants.LostUser, context);
}
}
public static EmployeeWraper Get(UserInfo userInfo)
public static EmployeeWraper Get(UserInfo userInfo, ApiContext context)
{
return new EmployeeWraper(userInfo);
return new EmployeeWraper(userInfo, context);
}
public static EmployeeWraper GetSample()

View File

@ -124,16 +124,10 @@ namespace ASC.Web.Api.Models
{
}
public EmployeeWraperFull(UserInfo userInfo)
: this(userInfo, null)
{
}
public EmployeeWraperFull(UserInfo userInfo, ApiContext context)
: base(userInfo, context)
{
UserName = userInfo.UserName;
IsVisitor = userInfo.IsVisitor();
FirstName = userInfo.FirstName;
LastName = userInfo.LastName;
Birthday = (ApiDateTime)userInfo.BirthDate;
@ -174,9 +168,11 @@ namespace ASC.Web.Api.Models
if (context.Check("groups") || context.Check("department"))
{
var groups = CoreContext.UserManager.GetUserGroups(userInfo.ID).Select(x => new GroupWrapperSummary(x)).ToList();
var groups = CoreContext.UserManager.GetUserGroups(context.Tenant, userInfo.ID)
.Select(x => new GroupWrapperSummary(x, context))
.ToList();
if (groups.Any())
if (groups.Count > 0)
{
Groups = groups;
Department = string.Join(", ", Groups.Select(d => d.Name.HtmlEncode()));
@ -191,31 +187,30 @@ namespace ASC.Web.Api.Models
if (context.Check("avatarMax"))
{
AvatarMax = UserPhotoManager.GetMaxPhotoURL(userInfo.ID, out var isdef) + (isdef ? "": $"?_={userInfoLM}");
AvatarMax = UserPhotoManager.GetMaxPhotoURL(context.Tenant.TenantId, userInfo.ID, out var isdef) + (isdef ? "": $"?_={userInfoLM}");
}
if (context.Check("avatarMedium"))
{
AvatarMedium = UserPhotoManager.GetMediumPhotoURL(userInfo.ID, out var isdef) + (isdef ? "" : $"?_={userInfoLM}");
AvatarMedium = UserPhotoManager.GetMediumPhotoURL(context.Tenant.TenantId, userInfo.ID, out var isdef) + (isdef ? "" : $"?_={userInfoLM}");
}
if (context.Check("avatar"))
{
Avatar = UserPhotoManager.GetBigPhotoURL(userInfo.ID, out var isdef) + (isdef ? "" : $"?_={userInfoLM}");
Avatar = UserPhotoManager.GetBigPhotoURL(context.Tenant.TenantId, userInfo.ID, out var isdef) + (isdef ? "" : $"?_={userInfoLM}");
}
IsAdmin = userInfo.IsAdmin();
if (context.Check("listAdminModules"))
{
var listAdminModules = userInfo.GetListAdminModules();
var listAdminModules = userInfo.GetListAdminModules(context.Tenant);
if (listAdminModules.Any())
ListAdminModules = listAdminModules;
}
IsOwner = userInfo.IsOwner();
IsVisitor = userInfo.IsVisitor(context.Tenant);
IsAdmin = userInfo.IsAdmin(context.Tenant);
IsOwner = userInfo.IsOwner(context.Tenant);
IsLDAP = userInfo.IsLDAP();
IsSSO = userInfo.IsSSO();
}
@ -237,22 +232,22 @@ namespace ASC.Web.Api.Models
}
}
public static EmployeeWraperFull GetFull(Guid userId)
public static EmployeeWraperFull GetFull(Guid userId, ApiContext context)
{
try
{
return GetFull(CoreContext.UserManager.GetUsers(userId));
return GetFull(CoreContext.UserManager.GetUsers(userId), context);
}
catch (Exception)
{
return GetFull(ASC.Core.Users.Constants.LostUser);
return GetFull(ASC.Core.Users.Constants.LostUser, context);
}
}
public static EmployeeWraperFull GetFull(UserInfo userInfo)
public static EmployeeWraperFull GetFull(UserInfo userInfo, ApiContext context)
{
return new EmployeeWraperFull(userInfo);
return new EmployeeWraperFull(userInfo, context);
}
public new static EmployeeWraperFull GetSample()

View File

@ -28,6 +28,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using ASC.Api.Core;
using ASC.Core;
using ASC.Core.Users;
@ -36,17 +37,17 @@ namespace ASC.Web.Api.Models
[DataContract(Name = "group", Namespace = "")]
public class GroupWrapperFull
{
public GroupWrapperFull(GroupInfo group, bool includeMembers)
public GroupWrapperFull(GroupInfo group, bool includeMembers, ApiContext context)
{
Id = group.ID;
Category = group.CategoryID;
Parent = group.Parent != null ? group.Parent.ID : Guid.Empty;
Name = group.Name;
Manager = EmployeeWraper.Get(CoreContext.UserManager.GetUsers(CoreContext.UserManager.GetDepartmentManager(group.ID)));
Manager = EmployeeWraper.Get(CoreContext.UserManager.GetUsers(CoreContext.UserManager.GetDepartmentManager(context.Tenant.TenantId, group.ID)), context);
if (includeMembers)
{
Members = new List<EmployeeWraper>(CoreContext.UserManager.GetUsersByGroup(group.ID).Select(EmployeeWraper.Get));
Members = new List<EmployeeWraper>(CoreContext.UserManager.GetUsersByGroup(context.Tenant, group.ID).Select(r=> EmployeeWraper.Get(r, context)));
}
}

View File

@ -26,6 +26,7 @@
using System;
using System.Runtime.Serialization;
using ASC.Api.Core;
using ASC.Core;
using ASC.Core.Users;
@ -34,11 +35,11 @@ namespace ASC.Web.Api.Models
[DataContract(Name = "group", Namespace = "")]
public class GroupWrapperSummary
{
public GroupWrapperSummary(GroupInfo group)
public GroupWrapperSummary(GroupInfo group, ApiContext context)
{
Id = group.ID;
Name = group.Name;
Manager = CoreContext.UserManager.GetUsers(CoreContext.UserManager.GetDepartmentManager(group.ID)).UserName;
Manager = CoreContext.UserManager.GetUsers(CoreContext.UserManager.GetDepartmentManager(context.Tenant.TenantId, group.ID)).UserName;
}
protected GroupWrapperSummary()

View File

@ -26,6 +26,7 @@
using System;
using System.Runtime.Serialization;
using ASC.Core.Tenants;
using ASC.Web.Core.Users;
namespace ASC.Web.Api.Models
@ -33,14 +34,14 @@ namespace ASC.Web.Api.Models
[DataContract]
public class ThumbnailsDataWrapper
{
public ThumbnailsDataWrapper(Guid userId)
public ThumbnailsDataWrapper(Tenant tenant, Guid userId)
{
Original = UserPhotoManager.GetPhotoAbsoluteWebPath(userId);
Retina = UserPhotoManager.GetRetinaPhotoURL(userId);
Max = UserPhotoManager.GetMaxPhotoURL(userId);
Big = UserPhotoManager.GetBigPhotoURL(userId);
Medium = UserPhotoManager.GetMediumPhotoURL(userId);
Small = UserPhotoManager.GetSmallPhotoURL(userId);
Original = UserPhotoManager.GetPhotoAbsoluteWebPath(tenant, userId);
Retina = UserPhotoManager.GetRetinaPhotoURL(tenant.TenantId, userId);
Max = UserPhotoManager.GetMaxPhotoURL(tenant.TenantId, userId);
Big = UserPhotoManager.GetBigPhotoURL(tenant.TenantId, userId);
Medium = UserPhotoManager.GetMediumPhotoURL(tenant.TenantId, userId);
Small = UserPhotoManager.GetSmallPhotoURL(tenant.TenantId, userId);
}
private ThumbnailsDataWrapper()

View File

@ -18,13 +18,13 @@ namespace ASC.Web.Api.Controllers
[Create(false)]
public AuthenticationTokenData AuthenticateMe([FromBody]AuthModel auth)
{
var user = GetUser(auth.UserName, auth.Password);
var tenant = CoreContext.TenantManager.GetCurrentTenant();
var user = GetUser(tenant.TenantId, auth.UserName, auth.Password);
try
{
var token = SecurityContext.AuthenticateMe(user.ID);
var tenant = CoreContext.TenantManager.GetCurrentTenant().TenantId;
var expires = TenantCookieSettings.GetExpiresTime(tenant);
var expires = TenantCookieSettings.GetExpiresTime(tenant.TenantId);
return new AuthenticationTokenData
{
@ -38,14 +38,14 @@ namespace ASC.Web.Api.Controllers
}
}
private static UserInfo GetUser(string userName, string password)
private static UserInfo GetUser(int tenantId, string userName, string password)
{
var user = CoreContext.UserManager.GetUsers(
CoreContext.TenantManager.GetCurrentTenant().TenantId,
tenantId,
userName,
Hasher.Base64Hash(password, HashAlg.SHA256));
if (user == null || !CoreContext.UserManager.UserExists(user.ID))
if (user == null || !CoreContext.UserManager.UserExists(user.ID, tenantId))
{
throw new Exception("user not found");
}

View File

@ -1,4 +1,5 @@
using System.Collections.Generic;
using ASC.Core;
using ASC.Web.Api.Routing;
using ASC.Web.Core;
using ASC.Web.Core.WebZones;
@ -15,7 +16,7 @@ namespace ASC.Web.Api.Controllers
{
var result = new List<string>();
foreach (var a in WebItemManager.Instance.GetItems(WebZoneType.StartProductList))
foreach (var a in WebItemManager.Instance.GetItems(CoreContext.TenantManager.GetCurrentTenant(), WebZoneType.StartProductList))
{
result.Add(a.ApiURL);
}

View File

@ -1,5 +1,5 @@
import React from 'react'
import styled from 'styled-components'
import styled, { css } from 'styled-components'
import PropTypes from 'prop-types'
import { Icons } from '../icons'
import Link from '../link'
@ -8,6 +8,14 @@ const whiteColor = '#FFFFFF';
const avatarBackground = '#ECEEF1';
const namedAvatarBackground = '#2DA7DB';
const noneUserSelect = css`
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
`;
const StyledAvatar = styled.div`
position: relative;
width: ${props =>
@ -51,6 +59,8 @@ const ImageStyled = styled.img`
max-width: 100%;
height: auto;
border-radius: 50%;
${noneUserSelect}
`;
const AvatarWrapper = styled.div`
@ -84,11 +94,7 @@ const NamedAvatar = styled.div`
};
color: ${whiteColor};
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
${noneUserSelect}
`;
const EditContainer = styled.div`

View File

@ -62,6 +62,12 @@ const StyledCheckbox = styled.div`
const StyledAvatar = styled.div`
flex: 0 0 32px;
display: flex;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
`;
const StyledOptionButton = styled.div`

View File

@ -5,7 +5,6 @@ import SearchInput from '../search-input';
import ComboBox from '../combobox'
import IconButton from '../icon-button';
const StyledFilterInput = styled.div`
min-width: 380px;
`;
@ -27,35 +26,27 @@ const StyledComboBox = styled(ComboBox)`
class FilterInput extends React.Component {
constructor(props) {
super(props);
function getDefaultFilterData(){
let filterData = props.getFilterData();
let defaultFilterItems = [];
props.defaultFilterData.filterValue.forEach(defaultfilterValue => {
let filterValue = filterData.find(x => (x.key === defaultfilterValue.value && x.group === defaultfilterValue.key));
if(filterValue != undefined){
defaultfilterValue.label = filterValue.label;
defaultfilterValue.groupLabel = filterData.find(x => (x.key === defaultfilterValue.key)).label;
defaultFilterItems.push(defaultfilterValue);
}
});
return defaultFilterItems;
}
this.state = {
sortDirection: props.defaultFilterData ? props.defaultFilterData.sortDirection == "asc" ? true : false : false,
sortId: props.defaultFilterData ?
this.props.getSortData().findIndex(x => x.id === props.defaultFilterData.sortId) != -1 ? props.defaultFilterData.sortId : "" :
this.props.getSortData().length > 0 ? this.props.getSortData()[0].id : "",
sortDirection: props.selectedFilterData ? props.selectedFilterData.sortDirection == "asc" ? true : false : false,
sortId: props.selectedFilterData ?
this.props.getSortData().findIndex(x => x.key === props.selectedFilterData.sortId) != -1 ? props.selectedFilterData.sortId : "" :
this.props.getSortData().length > 0 ? this.props.getSortData()[0].key : "",
filterValue: props.defaultFilterData ?
getDefaultFilterData() :
[],
searchText: props.defaultFilterData ? props.defaultFilterData.inputValue : this.props.value
filterValue: props.selectedFilterData ? props.selectedFilterData.filterValue : [],
searchText: props.selectedFilterData ? props.selectedFilterData.inputValue : this.props.value
};
this.timerId = null;
this.isNew = true;
this.isNeedUpdate = false;
this.updatedProps = {
sortDirection: false,
sortId: false,
filterValue: false,
searchText: false
};
this.getSortData = this.getSortData.bind(this);
this.onClickSortItem = this.onClickSortItem.bind(this);
this.onSortDirectionClick = this.onSortDirectionClick.bind(this);
this.onSearch = this.onSearch.bind(this);
@ -66,33 +57,25 @@ class FilterInput extends React.Component {
}
getDefaultSelectedIndex(){
const sortData = this.getSortData();
const sortData = this.props.getSortData();
if(sortData.length > 0){
let defaultIndex = sortData.findIndex(x => x.id === this.state.sortId);
let defaultIndex = sortData.findIndex(x => x.key === this.state.sortId);
return defaultIndex != -1 ? defaultIndex : 0;
}
return 0;
}
getSortData() {
let _this = this;
let d = this.props.getSortData();
d.map(function (item) {
item.key = item.id;
return item;
});
return d;
}
onClickSortItem(item) {
this.setState({ sortId: item.id });
this.onFilter(this.state.filterValue, item.id, this.state.sortDirection ? "asc" : "desc");
this.setState({ sortId: item.key });
this.onFilter(this.state.filterValue, item.key, this.state.sortDirection ? "asc" : "desc");
}
onSortDirectionClick(e) {
this.onFilter(this.state.filterValue, this.state.sortId, !this.state.sortDirection ? "asc" : "desc")
this.isNeedUpdate = true;
this.onFilter(this.state.filterValue, this.state.sortId, !this.state.sortDirection ? "asc" : "desc");
this.setState({ sortDirection: !this.state.sortDirection });
}
onSearch(result) {
this.setState({ filterValue: result.filterValue });
this.onFilter(result.filterValue, this.state.sortId, this.state.sortDirection ? "asc" : "desc")
this.onFilter(result.filterValue, this.state.sortId, this.state.sortDirection ? "asc" : "desc");
}
onFilter(filterValue, sortId, sortDirection) {
@ -101,7 +84,7 @@ class FilterInput extends React.Component {
filterValue: filterValue,
sortId: sortId,
sortDirection: sortDirection
}
};
this.props.onFilter(result);
}
@ -116,11 +99,73 @@ class FilterInput extends React.Component {
}
onSearchChanged(e) {
this.setState({ searchText: e.target.value })
this.isNeedUpdate = true;
this.setState({ searchText: e.target.value });
if (this.props.autoRefresh)
this.setFilterTimer();
}
componentDidUpdate(){
if(this.isNeedUpdate){
this.setState(
{
sortDirection: this.updatedProps.sortDirection ? this.props.selectedFilterData.sortDirection == "asc" ? true : false : this.state.sortDirection,
sortId: this.updatedProps.sortId ? this.props.getSortData().findIndex(x => x.key === this.props.selectedFilterData.sortId) != -1 ? this.props.selectedFilterData.sortId : "" : this.state.sortId,
filterValue: this.updatedProps.filterValue ? this.props.selectedFilterData.filterValue ? this.props.selectedFilterData.filterValue : [] : this.state.filterValue,
searchText: this.updatedProps.searchText ? this.props.selectedFilterData.inputValue ? this.props.selectedFilterData.inputValue : this.props.value : this.state.searchText
}
);
this.updatedProps={
sortDirection: false,
sortId: false,
filterValue: false,
searchText: false
}
}
}
shouldComponentUpdate(nextProps, nextState){
if(!this.isNeedUpdate){
for (let propsKey in this.props) {
if(typeof this.props[propsKey] != "function" && typeof this.props[propsKey] != "object" && this.props[propsKey] != nextProps[propsKey]){
this.isNeedUpdate = true;
break;
}
}
if(nextProps.selectedFilterData && this.props.selectedFilterData){
if(this.props.selectedFilterData.filterValue.length != nextProps.selectedFilterData.filterValue.length){
this.updatedProps.filterValue = true;
this.isNeedUpdate = true;
}else{
let newFilterItems = nextProps.selectedFilterData.filterValue;
let oldFilterItems = this.props.selectedFilterData.filterValue;
for(let i = 0; i < newFilterItems.length; i++){
if(oldFilterItems.find(x => (x.key === newFilterItems[i].key && x.group === newFilterItems[i].group)) == undefined){
this.updatedProps.filterValue = true;
this.isNeedUpdate = true;
break;
}
}
}
}
if(nextProps.selectedFilterData.inputValue != this.props.selectedFilterData.inputValue){
this.updatedProps.searchText = true;
this.isNeedUpdate = true;
}
if(nextProps.selectedFilterData.sortDirection != this.props.selectedFilterData.sortDirection){
this.updatedProps.sortDirection = true;
this.isNeedUpdate = true;
}
if(nextProps.selectedFilterData.sortId != this.props.selectedFilterData.sortId){
this.updatedProps.sortId = true;
this.isNeedUpdate = true;
}
if(!this.isNeedUpdate) return false;
else return true;
}
this.isNeedUpdate = false;
return true;
}
render() {
//console.log("FilterInput render");
@ -138,16 +183,16 @@ class FilterInput extends React.Component {
onSearchClick={this.onSearch}
onChangeFilter={this.onSearch}
value={this.state.searchText}
defaultFilterData={this.state.filterValue}
selectedFilterData={this.state.filterValue}
onChange={this.onSearchChanged}
/>
</StyledSearchInput>
<StyledComboBox
options={this.getSortData()}
options={this.props.getSortData()}
isDisabled={this.props.isDisabled}
onSelect={this.onClickSortItem}
selectedOption={this.getDefaultSelectedIndex()}
selectedOption={this.state.sortId}
>
<StyledIconButton {...this.state}>
<IconButton
@ -171,12 +216,14 @@ class FilterInput extends React.Component {
FilterInput.protoTypes = {
autoRefresh: PropTypes.bool,
refreshTimeout: PropTypes.number
refreshTimeout: PropTypes.number,
selectedFilterData: PropTypes.object,
};
FilterInput.defaultProps = {
autoRefresh: true,
refreshTimeout: 1000
refreshTimeout: 1000,
selectedFilterData: {}
};
export default FilterInput;

View File

@ -24,42 +24,50 @@ class IconButton extends React.Component{
onMouseEnter(e){
this.setState({
currentIconName: this.props.iconHoverName ? this.props.iconHoverName : this.props.iconName,
currentIconColor: this.props.hoverColor ? this.props.hoverColor : this.props.color
});
this.props.onMouseEnter && this.props.onMouseEnter(e);
if(!this.props.isDisabled){
this.setState({
currentIconName: this.props.iconHoverName ? this.props.iconHoverName : this.props.iconName,
currentIconColor: this.props.hoverColor ? this.props.hoverColor : this.props.color
});
this.props.onMouseEnter && this.props.onMouseEnter(e);
}
}
onMouseLeave(e){
this.setState({
currentIconName: this.props.iconName,
currentIconColor: this.props.color
});
this.props.onMouseDown && this.props.onMouseDown(e);
if(!this.props.isDisabled){
this.setState({
currentIconName: this.props.iconName,
currentIconColor: this.props.color
});
this.props.onMouseDown && this.props.onMouseDown(e);
}
}
onMouseDown(e){
this.setState({
currentIconName: this.props.iconClickName ? this.props.iconClickName : this.props.iconName,
currentIconColor: this.props.clickColor ? this.props.clickColor : this.props.color
});
this.props.onMouseDown && this.props.onMouseDown(e);
if(!this.props.isDisabled){
this.setState({
currentIconName: this.props.iconClickName ? this.props.iconClickName : this.props.iconName,
currentIconColor: this.props.clickColor ? this.props.clickColor : this.props.color
});
this.props.onMouseDown && this.props.onMouseDown(e);
}
}
onMouseUp(e){
switch (e.nativeEvent.which) {
case 1: //Left click
this.setState({
currentIconName: this.props.iconHoverName ? this.props.iconHoverName : this.props.iconName,
currentIconColor: this.props.iconHoverName ? this.props.iconHoverName : this.props.color
});
this.props.onClick && this.props.onClick(e);
this.props.onMouseUp && this.props.onMouseUp(e);
break;
case 3://Right click
this.props.onMouseUp && this.props.onMouseUp(e);
break;
default:
break;
if(!this.props.isDisabled){
switch (e.nativeEvent.which) {
case 1: //Left click
this.setState({
currentIconName: this.props.iconHoverName ? this.props.iconHoverName : this.props.iconName,
currentIconColor: this.props.iconHoverName ? this.props.iconHoverName : this.props.color
});
this.props.onClick && this.props.onClick(e);
this.props.onMouseUp && this.props.onMouseUp(e);
break;
case 3://Right click
this.props.onMouseUp && this.props.onMouseUp(e);
break;
default:
break;
}
}
}
render(){

Some files were not shown because too many files have changed in this diff Show More