Merge branch 'master' of https://github.com/ONLYOFFICE/CommunityServer-AspNetCore
# Conflicts: # web/ASC.Web.Components/src/index.js
This commit is contained in:
commit
708adfab82
@ -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
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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>
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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()
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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 )");
|
||||
}
|
||||
|
@ -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();
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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();
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
@ -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)
|
@ -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);
|
||||
}
|
||||
}
|
@ -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));
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
:
|
||||
|
@ -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));
|
@ -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
|
@ -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;
|
@ -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;
|
@ -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));
|
@ -0,0 +1,2 @@
|
||||
export { default as SectionHeaderContent } from './Header';
|
||||
export { default as SectionBodyContent } from './Body';
|
@ -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
Loading…
Reference in New Issue
Block a user