# Conflicts:
#	web/ASC.Web.Components/src/index.js
This commit is contained in:
Nikita Gopienko 2019-08-09 13:17:48 +03:00
commit 708adfab82
185 changed files with 2412 additions and 1504 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,29 +36,28 @@ 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;
//TODO
uint ItemsPerPage = 1000;
if (HttpContext.Request.QueryString != null)
{
Query = HttpContext.Request.Query;
}
Count = 0;
//Try parse values
string count = GetRequestValue("count");
ulong countParsed;
if (!string.IsNullOrEmpty(count) && ulong.TryParse(count,out countParsed))
var count = GetRequestValue("count");
if (!string.IsNullOrEmpty(count) && ulong.TryParse(count, out var countParsed))
{
//Count specified and valid
SpecifiedCount = (long)Math.Max(0, Math.Min(ItemsPerPage, countParsed));
Count = (long)countParsed;
}
else
{
SpecifiedCount = Math.Max(0,ItemsPerPage);
}
Count = SpecifiedCount + 1;//NOTE: +1 added to see if it's last page
var startIndex = GetRequestValue("startIndex");
if (startIndex != null && long.TryParse(startIndex, out var startIndexParsed))
@ -90,14 +91,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

@ -96,7 +96,7 @@ namespace ASC.Collections
public T Get(Func<T> @default)
{
string key = string.Format("func {0} {2}.{1}({3})", @default.Method.ReturnType, @default.Method.Name,
var key = string.Format("func {0} {2}.{1}({3})", @default.Method.ReturnType, @default.Method.Name,
@default.Method.DeclaringType.FullName,
string.Join(",",
@default.Method.GetGenericArguments().Select(x => x.FullName).ToArray
@ -111,8 +111,8 @@ namespace ASC.Collections
public virtual T Get(string rootkey, string key, Func<T> defaults)
{
string fullKey = BuildKey(key, rootkey);
object objectCache = GetObjectFromCache(fullKey);
var fullKey = BuildKey(key, rootkey);
var objectCache = GetObjectFromCache(fullKey);
if (FitsCondition(objectCache))
{
OnHit(fullKey);
@ -121,14 +121,14 @@ namespace ASC.Collections
if (defaults != null)
{
OnMiss(fullKey);
T newValue = defaults();
var newValue = defaults();
if (condition == null || condition(newValue))
{
Add(rootkey, key, newValue);
}
return newValue;
}
return default(T);
return default;
}
protected virtual T ReturnCached(object objectCache)

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.Count > 0)
{
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.GetDisplayUrl())
{
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.GetDisplayUrl())
{
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(context);
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

@ -91,7 +91,7 @@ namespace ASC.Core.Caching
}
}
public IDictionary<Guid, UserInfo> GetUsers(int tenant, 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 IDictionary<Guid, UserInfo> GetUsers(int tenant, bool isAdmin, EmployeeStatus? employeeStatus, List<List<Guid>> includeGroups, List<Guid> excludeGroups, EmployeeActivationStatus? activationStatus, string text, string sortBy, bool sortOrderAsc, long limit, long offset, out int total)
{
return service.GetUsers(tenant, isAdmin, employeeStatus, includeGroups, excludeGroups, activationStatus, text, sortBy, sortOrderAsc, limit, offset, out total);
}

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

@ -24,18 +24,18 @@
*/
using ASC.Common;
using ASC.Common.Notify.Engine;
using ASC.Common.Threading;
using ASC.Core.Billing;
using ASC.Core.Tenants;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading;
using System.Web;
using ASC.Common.Notify.Engine;
using ASC.Core.Billing;
using ASC.Core.Tenants;
using Microsoft.AspNetCore.Http;
namespace ASC.Core
{
@ -138,21 +138,21 @@ namespace ASC.Core
tenantService.RemoveTenant(tenantId, auto);
}
public Tenant GetCurrentTenant()
public Tenant GetCurrentTenant(HttpContext context)
{
return GetCurrentTenant(true);
return GetCurrentTenant(true, context);
}
public Tenant GetCurrentTenant(bool throwIfNotFound)
public Tenant GetCurrentTenant(bool throwIfNotFound, HttpContext context)
{
Tenant tenant = null;
if (HttpContext.Current != null)
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)
@ -164,6 +164,16 @@ namespace ASC.Core
throw new Exception("Could not resolve current tenant :-(.");
}
return tenant;
}
public Tenant GetCurrentTenant()
{
return GetCurrentTenant(true);
}
public Tenant GetCurrentTenant(bool throwIfNotFound)
{
return GetCurrentTenant(throwIfNotFound, ASC.Common.HttpContext.Current);
}
public void SetCurrentTenant(Tenant tenant)
@ -171,23 +181,27 @@ namespace ASC.Core
if (tenant != null)
{
CallContext.SetData(CURRENT_TENANT, tenant);
if (HttpContext.Current != null)
if (ASC.Common.HttpContext.Current != null)
{
HttpContext.Current.Items[CURRENT_TENANT] = tenant;
ASC.Common.HttpContext.Current.Items[CURRENT_TENANT] = tenant;
}
Thread.CurrentThread.CurrentCulture = tenant.GetCulture();
Thread.CurrentThread.CurrentUICulture = tenant.GetCulture();
}
}
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<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

@ -36,7 +36,7 @@ namespace ASC.Core
IDictionary<Guid, UserInfo> GetUsers(int tenant, bool isAdmin,
EmployeeStatus? employeeStatus,
List<Guid> includeGroups,
List<List<Guid>> includeGroups,
List<Guid> excludeGroups,
EmployeeActivationStatus? activationStatus,
string text,

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

@ -52,7 +52,7 @@ namespace ASC.Core.Data
public IDictionary<Guid, UserInfo> GetUsers(int tenant, bool isAdmin,
EmployeeStatus? employeeStatus,
List<Guid> includeGroups,
List<List<Guid>> includeGroups,
List<Guid> excludeGroups,
EmployeeActivationStatus? activationStatus,
string text,
@ -90,7 +90,7 @@ namespace ASC.Core.Data
private SqlQuery GetUserQueryForFilter(SqlQuery q,bool isAdmin,
EmployeeStatus? employeeStatus,
List<Guid> includeGroups,
List<List<Guid>> includeGroups,
List<Guid> excludeGroups,
EmployeeActivationStatus? activationStatus,
string text)
@ -99,14 +99,24 @@ namespace ASC.Core.Data
if (includeGroups != null && includeGroups.Any())
{
foreach (var g in includeGroups)
var groupQuery = new SqlQuery("core_usergroup cug")
.Select("cug.userid")
.Where(Exp.EqColumns("cug.tenant", "u.tenant"))
.Where(Exp.EqColumns("u.id", "cug.userid"));
foreach (var groups in includeGroups)
{
var groupQuery = new SqlQuery("core_usergroup cug")
.Where(Exp.EqColumns("cug.tenant", "cu.tenant"))
.Where(Exp.EqColumns("cu.id", "cug.userid"))
.Where(Exp.Eq("cug.groupid", g));
q.Where(Exp.Exists(groupQuery));
var subQuery = Exp.Empty;
foreach(var g in groups)
{
subQuery |= Exp.Eq("cug.groupid", g);
}
groupQuery.Where(subQuery);
}
q.Where(Exp.Exists(groupQuery));
}
if (excludeGroups != null && excludeGroups.Any())
@ -114,8 +124,9 @@ namespace ASC.Core.Data
foreach (var g in excludeGroups)
{
var groupQuery = new SqlQuery("core_usergroup cug")
.Where(Exp.EqColumns("cug.tenant", "cu.tenant"))
.Where(Exp.EqColumns("cu.id", "cug.userid"))
.Select("cug.userid")
.Where(Exp.EqColumns("cug.tenant", "u.tenant"))
.Where(Exp.EqColumns("u.id", "cug.userid"))
.Where(Exp.Eq("cug.groupid", g));
q.Where(!Exp.Exists(groupQuery));
}

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

@ -72,7 +72,7 @@ namespace ASC.Data.Storage
public static string GetPath(string relativePath)
{
if (relativePath.StartsWith("~"))
if (!string.IsNullOrEmpty(relativePath) && relativePath.IndexOf('~') == 0)
{
throw new ArgumentException(string.Format("bad path format {0} remove '~'", relativePath), "relativePath");
}
@ -112,7 +112,7 @@ namespace ASC.Data.Storage
appender = Appenders.First();
}
if (appender.Append.StartsWith("~"))
if (appender.Append.IndexOf('~') == 0)
{
var query = string.Empty;
//Rel path

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

@ -8,6 +8,7 @@ import PrivateRoute from "./helpers/privateRoute";
const Profile = lazy(() => import("./components/pages/Profile"));
const ProfileAction = lazy(() => import("./components/pages/ProfileAction"));
const GroupAction = lazy(() => import("./components/pages/GroupAction"));
const App = ({ settings }) => {
const { homepage } = settings;
@ -31,6 +32,14 @@ const App = ({ settings }) => {
path={`${homepage}/create/:type`}
component={ProfileAction}
/>
<PrivateRoute
path={`${homepage}/group/edit/:groupId`}
component={GroupAction}
/>
<PrivateRoute
path={`${homepage}/group/create`}
component={GroupAction}
/>
<PrivateRoute
component={() => (
<ErrorContainer>

View File

@ -5,13 +5,17 @@ import { withRouter } from 'react-router';
import {
MainButton,
DropDownItem,
toastr
} from "asc-web-components";
import { isAdmin } from '../../../store/auth/selectors';
class ArticleMainButtonContent extends React.Component {
onDropDownItemClick = (link) => {
console.log("onDropDownItemClick", this, link);
link && this.props.history.push(link);
this.props.history.push(link);
};
onNotImplementedClick = (text) => {
toastr.success(text);
};
render() {
@ -37,23 +41,23 @@ class ArticleMainButtonContent extends React.Component {
<DropDownItem
icon="CatalogDepartmentsIcon"
label="New department"
onClick={this.onDropDownItemClick}
onClick={this.onDropDownItemClick.bind(this, `${settings.homepage}/group/create`)}
/>
<DropDownItem isSeparator />
<DropDownItem
icon="InvitationLinkIcon"
label="Invitation link"
onClick={this.onDropDownItemClick}
onClick={this.onNotImplementedClick.bind(this, "Invitation link action")}
/>
<DropDownItem
icon="PlaneIcon"
label="Invite again"
onClick={this.onDropDownItemClick}
onClick={this.onNotImplementedClick.bind(this, "Invite again action")}
/>
<DropDownItem
icon="ImportIcon"
label="Import people"
onClick={this.onDropDownItemClick}
onClick={this.onNotImplementedClick.bind(this, "Import people action")}
/>
</MainButton>
:

View File

@ -0,0 +1,107 @@
import React, { useCallback } from "react";
import { withRouter } from "react-router";
import { Field, reduxForm, SubmissionError } from "redux-form";
import {
Button,
TextInput,
Text,
InputBlock,
Icons,
SelectedItem
} from "asc-web-components";
import submit from "./submit";
import validate from "./validate";
const generateItems = numItems =>
Array(numItems)
.fill(true)
.map(_ => Math.random()
.toString(36)
.substr(2)
);
const GroupForm = props => {
const { error, handleSubmit, submitting, initialValues, history } = props;
const selectedList = generateItems(100);
console.log(selectedList);
const onCancel = useCallback(() => {
history.goBack();
}, [history]);
return (
<form onSubmit={handleSubmit(submit)}>
<div>
<label htmlFor="group-name">
<Text.Body as="span" isBold={true}>Department name:</Text.Body>
</label>
<div style={{width: "320px"}}>
<TextInput id="group-name" name="group-name" scale={true} />
</div>
</div>
<div style={{ marginTop: "16px" }}>
<label htmlFor="head-selector">
<Text.Body as="span" isBold={true}>Head of department:</Text.Body>
</label>
<InputBlock
id="head-selector"
value="Add employee"
iconName="ExpanderDownIcon"
iconSize={8}
isIconFill={true}
iconColor="#A3A9AE"
scale={false}
isReadOnly={true}
>
<Icons.CatalogEmployeeIcon size="medium" />
</InputBlock>
</div>
<div style={{ marginTop: "16px" }}>
<label htmlFor="employee-selector">
<Text.Body as="span" isBold={true}>Members:</Text.Body>
</label>
<InputBlock
id="employee-selector"
value="Add employee"
iconName="ExpanderDownIcon"
iconSize={8}
isIconFill={true}
iconColor="#A3A9AE"
scale={false}
isReadOnly={true}
>
<Icons.CatalogGuestIcon size="medium" />
</InputBlock>
</div>
<div style={{ marginTop: "16px", display: "flex", flexWrap: "wrap", flexDirection: "row" }}>
{selectedList.map(item =>
<SelectedItem
text={`Fake User-${item}`}
onClick={(e) => console.log("onClose", e.target)}
isInline={true}
style={{ marginRight: "8px", marginBottom: "8px" }}
/>
)}
</div>
<div>{error && <strong>{error}</strong>}</div>
<div style={{ marginTop: "60px" }}>
<Button label="Save" primary type="submit" isDisabled={submitting} size="big" />
<Button
label="Cancel"
style={{ marginLeft: "8px" }}
size="big"
isDisabled={submitting}
onClick={onCancel}
/>
</div>
</form>
);
};
export default reduxForm({
validate,
form: "groupForm",
enableReinitialize: true
})(withRouter(GroupForm));

View File

@ -0,0 +1,20 @@
import { SubmissionError } from 'redux-form'
function submit (values) {
function successCallback (res) {
if (res.data && res.data.error) {
window.alert(res.data.error.message);
} else {
console.log(res);
window.alert('Success');
}
}
function errorCallback (error) {
throw new SubmissionError({
_error: error
})
}
}
export default submit

View File

@ -0,0 +1,19 @@
function validate (values) {
const errors = {};
if (!values.firstName) {
errors.firstName = 'required field';
}
if (!values.lastName) {
errors.lastName = 'required field';
}
if (!values.email) {
errors.email = 'required field';
}
return errors
};
export default validate;

View File

@ -0,0 +1,22 @@
import React from 'react';
import PropTypes from "prop-types";
import GroupForm from './Form/groupForm'
const SectionBodyContent = (props) => {
const {group} = props;
return (
<GroupForm initialValues={group} />
);
};
SectionBodyContent.propTypes = {
group: PropTypes.object
};
SectionBodyContent.defaultProps = {
group: null
}
export default SectionBodyContent;

View File

@ -0,0 +1,45 @@
import React from 'react';
import { connect } from 'react-redux';
import { withRouter } from "react-router";
import PropTypes from "prop-types";
import { IconButton, Text } from 'asc-web-components';
const wrapperStyle = {
display: "flex",
alignItems: "center"
};
const textStyle = {
marginLeft: "16px"
};
const SectionHeaderContent = (props) => {
const {group, history, settings} = props;
const headerText = "New department";
return (
<div style={wrapperStyle}>
<IconButton iconName={'ArrowPathIcon'} size="16" onClick={() => history.push(settings.homepage)}/>
<Text.ContentHeader style={textStyle}>{headerText}</Text.ContentHeader>
</div>
);
};
SectionHeaderContent.propTypes = {
group: PropTypes.object,
history: PropTypes.object.isRequired
};
SectionHeaderContent.defaultProps = {
group: null
};
function mapStateToProps(state) {
return {
settings: state.settings
};
};
export default connect(mapStateToProps)(withRouter(SectionHeaderContent));

View File

@ -0,0 +1,2 @@
export { default as SectionHeaderContent } from './Header';
export { default as SectionBodyContent } from './Body';

View File

@ -0,0 +1,30 @@
import React from "react";
import { connect } from "react-redux";
import { PageLayout } from "asc-web-components";
import { ArticleHeaderContent, ArticleMainButtonContent, ArticleBodyContent } from '../../Article';
import { SectionHeaderContent, SectionBodyContent } from './Section';
class GroupAction extends React.Component {
render() {
console.log("GroupAction render")
return (
<PageLayout
articleHeaderContent={<ArticleHeaderContent />}
articleMainButtonContent={<ArticleMainButtonContent />}
articleBodyContent={<ArticleBodyContent />}
sectionHeaderContent={<SectionHeaderContent />}
sectionBodyContent={<SectionBodyContent />}
/>
);
}
}
function mapStateToProps(state) {
return {
settings: state.settings
};
}
export default connect(mapStateToProps)(GroupAction);

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