Merge branch 'master' of github.com:ONLYOFFICE/CommunityServer-AspNetCore
This commit is contained in:
commit
019c5d0a22
@ -27,6 +27,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using ASC.Core;
|
||||
using ASC.Core.Tenants;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
|
||||
namespace ASC.Api.Core
|
||||
@ -34,12 +36,20 @@ namespace ASC.Api.Core
|
||||
public class ApiContext : ICloneable
|
||||
{
|
||||
public HttpContext HttpContext { get; set; }
|
||||
private IQueryCollection Query { get; set; }
|
||||
private Tenant tenant;
|
||||
public Tenant Tenant { get { return tenant ?? (tenant = CoreContext.TenantManager.GetCurrentTenant()); } }
|
||||
|
||||
public ApiContext(HttpContext httpContext)
|
||||
{
|
||||
if (httpContext == null) return;
|
||||
HttpContext = httpContext;
|
||||
|
||||
if (HttpContext.Request.QueryString != null)
|
||||
{
|
||||
Query = HttpContext.Request.Query;
|
||||
}
|
||||
|
||||
//TODO
|
||||
uint ItemsPerPage = 1000;
|
||||
Count = 0;
|
||||
@ -90,14 +100,14 @@ namespace ASC.Api.Core
|
||||
|
||||
private string[] GetRequestArray(string key)
|
||||
{
|
||||
if (HttpContext.Request.QueryString != null)
|
||||
if (Query != null)
|
||||
{
|
||||
var values = HttpContext.Request.Query[key + "[]"];
|
||||
if (values.Any())
|
||||
var values = Query[key + "[]"];
|
||||
if (values.Count > 0)
|
||||
return values;
|
||||
|
||||
values = HttpContext.Request.Query[key];
|
||||
if (values.Any())
|
||||
values = Query[key];
|
||||
if (values.Count > 0)
|
||||
{
|
||||
if (values.Count == 1) //If it's only one element
|
||||
{
|
||||
|
@ -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>
|
@ -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.Any())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(requestUri.Query))
|
||||
{
|
||||
var urlRewriterQuery = HttpUtility.ParseQueryString(requestUri.Query);
|
||||
var rewriterUri = ParseRewriterUrl(urlRewriterQuery[UrlRewriterHeader]);
|
||||
var rewriterUri = ParseRewriterUrl(request.Query[UrlRewriterHeader]);
|
||||
if (rewriterUri != null)
|
||||
{
|
||||
var result = new UriBuilder(requestUri)
|
||||
var result = new UriBuilder(request.Url())
|
||||
{
|
||||
Scheme = rewriterUri.Scheme,
|
||||
Host = rewriterUri.Host,
|
||||
@ -80,7 +75,7 @@ namespace System.Web
|
||||
var rewriterUri = ParseRewriterUrl(headers[UrlRewriterHeader]);
|
||||
if (rewriterUri != null)
|
||||
{
|
||||
var result = new UriBuilder(requestUri)
|
||||
var result = new UriBuilder(request.Url())
|
||||
{
|
||||
Scheme = rewriterUri.Scheme,
|
||||
Host = rewriterUri.Host,
|
||||
@ -90,7 +85,7 @@ namespace System.Web
|
||||
}
|
||||
}
|
||||
|
||||
return requestUri;
|
||||
return request.Url();
|
||||
}
|
||||
|
||||
public static Uri PushRewritenUri(this HttpContext context)
|
||||
|
@ -31,7 +31,7 @@ using ASC.Common.Logging;
|
||||
using ASC.Common.Web;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Http.Extensions;
|
||||
using HttpContext = ASC.Common.HttpContext;
|
||||
using HttpContext = Microsoft.AspNetCore.Http.HttpContext;
|
||||
|
||||
namespace ASC.Core.Common
|
||||
{
|
||||
@ -77,58 +77,58 @@ namespace ASC.Core.Common
|
||||
get { return ToAbsolute("~"); }
|
||||
}
|
||||
|
||||
public static string ServerRootPath
|
||||
{
|
||||
get
|
||||
{
|
||||
var result = new UriBuilder(_serverRoot.Uri);
|
||||
|
||||
// first, take from current request
|
||||
if (HttpContext.Current != null && ASC.Common.HttpContext.Current.Request != null)
|
||||
{
|
||||
var u = ASC.Common.HttpContext.Current.Request.GetUrlRewriter();
|
||||
result = new UriBuilder(u.Scheme, u.Host, u.Port);
|
||||
|
||||
if (CoreContext.Configuration.Standalone && !result.Uri.IsLoopback)
|
||||
{
|
||||
// save for stanalone
|
||||
_serverRoot.Host = result.Host;
|
||||
}
|
||||
}
|
||||
|
||||
if (result.Uri.IsLoopback)
|
||||
{
|
||||
// take values from db if localhost or no http context thread
|
||||
var tenant = CoreContext.TenantManager.GetCurrentTenant();
|
||||
result.Host = tenant.TenantDomain;
|
||||
|
||||
public static string ServerRootPath(HttpContext context)
|
||||
{
|
||||
UriBuilder result;
|
||||
// first, take from current request
|
||||
if (context != null && context.Request != null)
|
||||
{
|
||||
var u = context.Request.GetUrlRewriter();
|
||||
result = new UriBuilder(u.Scheme, u.Host, u.Port);
|
||||
|
||||
if (CoreContext.Configuration.Standalone && !result.Uri.IsLoopback)
|
||||
{
|
||||
// save for stanalone
|
||||
_serverRoot.Host = result.Host;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
result = new UriBuilder(_serverRoot.Uri);
|
||||
}
|
||||
|
||||
if (result.Uri.IsLoopback)
|
||||
{
|
||||
// take values from db if localhost or no http context thread
|
||||
var tenant = CoreContext.TenantManager.GetCurrentTenant();
|
||||
result.Host = tenant.TenantDomain;
|
||||
|
||||
#if DEBUG
|
||||
// for Visual Studio debug
|
||||
if (tenant.TenantAlias == LOCALHOST)
|
||||
{
|
||||
result.Host = LOCALHOST;
|
||||
}
|
||||
// for Visual Studio debug
|
||||
if (tenant.TenantAlias == LOCALHOST)
|
||||
{
|
||||
result.Host = LOCALHOST;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!string.IsNullOrEmpty(tenant.MappedDomain))
|
||||
{
|
||||
var mapped = tenant.MappedDomain.ToLowerInvariant();
|
||||
if (!mapped.Contains(Uri.SchemeDelimiter))
|
||||
{
|
||||
mapped = Uri.UriSchemeHttp + Uri.SchemeDelimiter + mapped;
|
||||
}
|
||||
result = new UriBuilder(mapped);
|
||||
}
|
||||
}
|
||||
|
||||
return result.Uri.ToString().TrimEnd('/');
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(tenant.MappedDomain))
|
||||
{
|
||||
var mapped = tenant.MappedDomain.ToLowerInvariant();
|
||||
if (!mapped.Contains(Uri.SchemeDelimiter))
|
||||
{
|
||||
mapped = Uri.UriSchemeHttp + Uri.SchemeDelimiter + mapped;
|
||||
}
|
||||
result = new UriBuilder(mapped);
|
||||
}
|
||||
}
|
||||
|
||||
return result.Uri.ToString().TrimEnd('/');
|
||||
}
|
||||
|
||||
public static string GetFullAbsolutePath(string virtualPath)
|
||||
public static string GetFullAbsolutePath(HttpContext context, string virtualPath)
|
||||
{
|
||||
if (String.IsNullOrEmpty(virtualPath))
|
||||
return ServerRootPath;
|
||||
if (string.IsNullOrEmpty(virtualPath))
|
||||
return ServerRootPath(context);
|
||||
|
||||
if (virtualPath.StartsWith("http://", StringComparison.InvariantCultureIgnoreCase) ||
|
||||
virtualPath.StartsWith("mailto:", StringComparison.InvariantCultureIgnoreCase) ||
|
||||
@ -138,9 +138,9 @@ namespace ASC.Core.Common
|
||||
|
||||
if (string.IsNullOrEmpty(virtualPath) || virtualPath.StartsWith("/"))
|
||||
{
|
||||
return ServerRootPath + virtualPath;
|
||||
return ServerRootPath(context) + virtualPath;
|
||||
}
|
||||
return ServerRootPath + VirtualRoot.TrimEnd('/') + "/" + virtualPath.TrimStart('~', '/');
|
||||
return ServerRootPath(context) + VirtualRoot.TrimEnd('/') + "/" + virtualPath.TrimStart('~', '/');
|
||||
}
|
||||
|
||||
public static string ToAbsolute(string virtualPath)
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -145,14 +145,15 @@ namespace ASC.Core
|
||||
|
||||
public Tenant GetCurrentTenant(bool throwIfNotFound)
|
||||
{
|
||||
Tenant tenant = null;
|
||||
if (HttpContext.Current != null)
|
||||
Tenant tenant = null;
|
||||
var context = HttpContext.Current;
|
||||
if (context != null)
|
||||
{
|
||||
tenant = HttpContext.Current.Items[CURRENT_TENANT] as Tenant;
|
||||
if (tenant == null && HttpContext.Current.Request != null)
|
||||
tenant = context.Items[CURRENT_TENANT] as Tenant;
|
||||
if (tenant == null && context.Request != null)
|
||||
{
|
||||
tenant = GetTenant(HttpContext.Current.Request.GetUrlRewriter().Host);
|
||||
HttpContext.Current.Items[CURRENT_TENANT] = tenant;
|
||||
tenant = GetTenant(context.Request.GetUrlRewriter().Host);
|
||||
context.Items[CURRENT_TENANT] = tenant;
|
||||
}
|
||||
}
|
||||
if (tenant == null)
|
||||
@ -180,14 +181,18 @@ namespace ASC.Core
|
||||
}
|
||||
}
|
||||
|
||||
public void SetCurrentTenant(int tenantId)
|
||||
{
|
||||
SetCurrentTenant(GetTenant(tenantId));
|
||||
public Tenant SetCurrentTenant(int tenantId)
|
||||
{
|
||||
var result = GetTenant(tenantId);
|
||||
SetCurrentTenant(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public void SetCurrentTenant(string domain)
|
||||
{
|
||||
SetCurrentTenant(GetTenant(domain));
|
||||
public Tenant SetCurrentTenant(string domain)
|
||||
{
|
||||
var result = GetTenant(domain);
|
||||
SetCurrentTenant(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public void CheckTenantAddress(string address)
|
||||
|
@ -62,81 +62,84 @@ namespace ASC.Core
|
||||
|
||||
#region Users
|
||||
|
||||
public UserInfo[] GetUsers()
|
||||
public UserInfo[] GetUsers(Tenant tenant)
|
||||
{
|
||||
return GetUsers(EmployeeStatus.Default);
|
||||
return GetUsers(tenant, EmployeeStatus.Default);
|
||||
}
|
||||
|
||||
public UserInfo[] GetUsers(EmployeeStatus status)
|
||||
public UserInfo[] GetUsers(Tenant tenant, EmployeeStatus status)
|
||||
{
|
||||
return GetUsers(status, EmployeeType.All);
|
||||
return GetUsers(tenant, status, EmployeeType.All);
|
||||
}
|
||||
|
||||
public UserInfo[] GetUsers(EmployeeStatus status, EmployeeType type)
|
||||
public UserInfo[] GetUsers(Tenant tenant, EmployeeStatus status, EmployeeType type)
|
||||
{
|
||||
var users = GetUsersInternal().Where(u => (u.Status & status) == u.Status);
|
||||
var users = GetUsersInternal(tenant.TenantId).Where(u => (u.Status & status) == u.Status);
|
||||
switch (type)
|
||||
{
|
||||
case EmployeeType.User:
|
||||
users = users.Where(u => !u.IsVisitor());
|
||||
users = users.Where(u => !u.IsVisitor(tenant));
|
||||
break;
|
||||
case EmployeeType.Visitor:
|
||||
users = users.Where(u => u.IsVisitor());
|
||||
users = users.Where(u => u.IsVisitor(tenant));
|
||||
break;
|
||||
}
|
||||
return users.ToArray();
|
||||
}
|
||||
|
||||
public IEnumerable<UserInfo> GetUsers(bool isAdmin, EmployeeStatus? employeeStatus, List<Guid> includeGroups, List<Guid> excludeGroups, EmployeeActivationStatus? activationStatus, string text, string sortBy, bool sortOrderAsc, long limit, long offset, out int total)
|
||||
public IEnumerable<UserInfo> GetUsers(int tenantId, bool isAdmin, EmployeeStatus? employeeStatus, List<Guid> includeGroups, List<Guid> excludeGroups, EmployeeActivationStatus? activationStatus, string text, string sortBy, bool sortOrderAsc, long limit, long offset, out int total)
|
||||
{
|
||||
var tenantId = CoreContext.TenantManager.GetCurrentTenant().TenantId;
|
||||
return userService.GetUsers(tenantId, isAdmin, employeeStatus, includeGroups, excludeGroups, activationStatus, text, sortBy, sortOrderAsc, limit, offset, out total).Values;
|
||||
}
|
||||
|
||||
public DateTime GetMaxUsersLastModified()
|
||||
public DateTime GetMaxUsersLastModified(int tenantId)
|
||||
{
|
||||
return userService.GetUsers(CoreContext.TenantManager.GetCurrentTenant().TenantId, default(DateTime))
|
||||
return userService.GetUsers(tenantId, default)
|
||||
.Values
|
||||
.Select(g => g.LastModified)
|
||||
.DefaultIfEmpty()
|
||||
.Max();
|
||||
}
|
||||
|
||||
public string[] GetUserNames(EmployeeStatus status)
|
||||
public string[] GetUserNames(Tenant tenant, EmployeeStatus status)
|
||||
{
|
||||
return GetUsers(status)
|
||||
return GetUsers(tenant, status)
|
||||
.Select(u => u.UserName)
|
||||
.Where(s => !string.IsNullOrEmpty(s))
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
public UserInfo GetUserByUserName(string username)
|
||||
public UserInfo GetUserByUserName(int tenantId, string username)
|
||||
{
|
||||
return GetUsersInternal()
|
||||
return GetUsersInternal(tenantId)
|
||||
.FirstOrDefault(u => string.Compare(u.UserName, username, StringComparison.CurrentCultureIgnoreCase) == 0) ?? Constants.LostUser;
|
||||
}
|
||||
|
||||
public UserInfo GetUserBySid(string sid)
|
||||
public UserInfo GetUserBySid(int tenantId, string sid)
|
||||
{
|
||||
return GetUsersInternal()
|
||||
return GetUsersInternal(tenantId)
|
||||
.FirstOrDefault(u => u.Sid != null && string.Compare(u.Sid, sid, StringComparison.CurrentCultureIgnoreCase) == 0) ?? Constants.LostUser;
|
||||
}
|
||||
|
||||
public UserInfo GetSsoUserByNameId(string nameId)
|
||||
public UserInfo GetSsoUserByNameId(int tenantId, string nameId)
|
||||
{
|
||||
return GetUsersInternal()
|
||||
return GetUsersInternal(tenantId)
|
||||
.FirstOrDefault(u => !string.IsNullOrEmpty(u.SsoNameId) && string.Compare(u.SsoNameId, nameId, StringComparison.CurrentCultureIgnoreCase) == 0) ?? Constants.LostUser;
|
||||
}
|
||||
public bool IsUserNameExists(string username)
|
||||
public bool IsUserNameExists(Tenant tenant, string username)
|
||||
{
|
||||
return GetUserNames(EmployeeStatus.All)
|
||||
return GetUserNames(tenant, EmployeeStatus.All)
|
||||
.Contains(username, StringComparer.CurrentCultureIgnoreCase);
|
||||
}
|
||||
|
||||
public UserInfo GetUsers(Guid id)
|
||||
{
|
||||
return GetUsers(id, CoreContext.TenantManager.GetCurrentTenant().TenantId);
|
||||
}
|
||||
public UserInfo GetUsers(Guid id, int tenantId)
|
||||
{
|
||||
if (IsSystemUser(id)) return systemUsers[id];
|
||||
var u = userService.GetUser(CoreContext.TenantManager.GetCurrentTenant().TenantId, id);
|
||||
var u = userService.GetUser(tenantId, id);
|
||||
return u != null && !u.Removed ? u : Constants.LostUser;
|
||||
}
|
||||
|
||||
@ -146,9 +149,9 @@ namespace ASC.Core
|
||||
return u != null && !u.Removed ? u : Constants.LostUser;
|
||||
}
|
||||
|
||||
public bool UserExists(Guid id)
|
||||
public bool UserExists(Guid id, int tenantId)
|
||||
{
|
||||
return !GetUsers(id).Equals(Constants.LostUser);
|
||||
return !GetUsers(id, tenantId).Equals(Constants.LostUser);
|
||||
}
|
||||
|
||||
public bool IsSystemUser(Guid id)
|
||||
@ -156,20 +159,20 @@ namespace ASC.Core
|
||||
return systemUsers.ContainsKey(id);
|
||||
}
|
||||
|
||||
public UserInfo GetUserByEmail(string email)
|
||||
public UserInfo GetUserByEmail(int tenantId, string email)
|
||||
{
|
||||
if (string.IsNullOrEmpty(email)) return Constants.LostUser;
|
||||
|
||||
return GetUsersInternal()
|
||||
return GetUsersInternal(tenantId)
|
||||
.FirstOrDefault(u => string.Compare(u.Email, email, StringComparison.CurrentCultureIgnoreCase) == 0) ?? Constants.LostUser;
|
||||
}
|
||||
|
||||
public UserInfo[] Search(string text, EmployeeStatus status)
|
||||
public UserInfo[] Search(Tenant tenant, string text, EmployeeStatus status)
|
||||
{
|
||||
return Search(text, status, Guid.Empty);
|
||||
return Search(tenant, text, status, Guid.Empty);
|
||||
}
|
||||
|
||||
public UserInfo[] Search(string text, EmployeeStatus status, Guid groupId)
|
||||
public UserInfo[] Search(Tenant tenant, string text, EmployeeStatus status, Guid groupId)
|
||||
{
|
||||
if (text == null || text.Trim() == string.Empty) return new UserInfo[0];
|
||||
|
||||
@ -177,8 +180,8 @@ namespace ASC.Core
|
||||
if (words.Length == 0) return new UserInfo[0];
|
||||
|
||||
var users = groupId == Guid.Empty ?
|
||||
GetUsers(status) :
|
||||
GetUsersByGroup(groupId).Where(u => (u.Status & status) == status);
|
||||
GetUsers(tenant, status) :
|
||||
GetUsersByGroup(tenant, groupId).Where(u => (u.Status & status) == status);
|
||||
|
||||
var findUsers = new List<UserInfo>();
|
||||
foreach (var user in users)
|
||||
@ -199,83 +202,83 @@ namespace ASC.Core
|
||||
return findUsers.ToArray();
|
||||
}
|
||||
|
||||
public UserInfo SaveUserInfo(UserInfo u, bool isVisitor = false)
|
||||
public UserInfo SaveUserInfo(Tenant tenant, UserInfo u, bool isVisitor = false)
|
||||
{
|
||||
if (IsSystemUser(u.ID)) return systemUsers[u.ID];
|
||||
if (u.ID == Guid.Empty) SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
|
||||
else SecurityContext.DemandPermissions(new UserSecurityProvider(u.ID), Constants.Action_EditUser);
|
||||
if (u.ID == Guid.Empty) SecurityContext.DemandPermissions(tenant, Constants.Action_AddRemoveUser);
|
||||
else SecurityContext.DemandPermissions(tenant, new UserSecurityProvider(u.ID), Constants.Action_EditUser);
|
||||
|
||||
if (Constants.MaxEveryoneCount <= GetUsersByGroup(Constants.GroupEveryone.ID).Length)
|
||||
if (Constants.MaxEveryoneCount <= GetUsersByGroup(tenant, Constants.GroupEveryone.ID).Length)
|
||||
{
|
||||
throw new TenantQuotaException("Maximum number of users exceeded");
|
||||
}
|
||||
|
||||
if (u.Status == EmployeeStatus.Active)
|
||||
{
|
||||
var q = CoreContext.TenantManager.GetTenantQuota(CoreContext.TenantManager.GetCurrentTenant().TenantId);
|
||||
if (q.ActiveUsers < GetUsersByGroup(Constants.GroupUser.ID).Length)
|
||||
var q = CoreContext.TenantManager.GetTenantQuota(tenant.TenantId);
|
||||
if (q.ActiveUsers < GetUsersByGroup(tenant, Constants.GroupUser.ID).Length)
|
||||
{
|
||||
throw new TenantQuotaException(string.Format("Exceeds the maximum active users ({0})", q.ActiveUsers));
|
||||
}
|
||||
}
|
||||
|
||||
var newUser = userService.SaveUser(CoreContext.TenantManager.GetCurrentTenant().TenantId, u);
|
||||
var newUser = userService.SaveUser(tenant.TenantId, u);
|
||||
|
||||
return newUser;
|
||||
}
|
||||
|
||||
public void DeleteUser(Guid id)
|
||||
public void DeleteUser(Tenant tenant, Guid id)
|
||||
{
|
||||
if (IsSystemUser(id)) return;
|
||||
SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
|
||||
if (id == CoreContext.TenantManager.GetCurrentTenant().OwnerId)
|
||||
SecurityContext.DemandPermissions(tenant, Constants.Action_AddRemoveUser);
|
||||
if (id == tenant.OwnerId)
|
||||
{
|
||||
throw new InvalidOperationException("Can not remove tenant owner.");
|
||||
}
|
||||
|
||||
userService.RemoveUser(CoreContext.TenantManager.GetCurrentTenant().TenantId, id);
|
||||
userService.RemoveUser(tenant.TenantId, id);
|
||||
}
|
||||
|
||||
public void SaveUserPhoto(Guid id, byte[] photo)
|
||||
public void SaveUserPhoto(Tenant tenant, Guid id, byte[] photo)
|
||||
{
|
||||
if (IsSystemUser(id)) return;
|
||||
SecurityContext.DemandPermissions(new UserSecurityProvider(id), Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(tenant, new UserSecurityProvider(id), Constants.Action_EditUser);
|
||||
|
||||
userService.SetUserPhoto(CoreContext.TenantManager.GetCurrentTenant().TenantId, id, photo);
|
||||
userService.SetUserPhoto(tenant.TenantId, id, photo);
|
||||
}
|
||||
|
||||
public byte[] GetUserPhoto(Guid id)
|
||||
public byte[] GetUserPhoto(int tenantId, Guid id)
|
||||
{
|
||||
if (IsSystemUser(id)) return null;
|
||||
return userService.GetUserPhoto(CoreContext.TenantManager.GetCurrentTenant().TenantId, id);
|
||||
return userService.GetUserPhoto(tenantId, id);
|
||||
}
|
||||
|
||||
public IEnumerable<Guid> GetUserGroupsId(Guid id)
|
||||
public IEnumerable<Guid> GetUserGroupsId(int tenantId, Guid id)
|
||||
{
|
||||
return GetUsers(id).GetUserGroupsId();
|
||||
return GetUsers(id, tenantId).GetUserGroupsId(tenantId);
|
||||
}
|
||||
|
||||
public GroupInfo[] GetUserGroups(Guid id)
|
||||
public GroupInfo[] GetUserGroups(Tenant tenant, Guid id)
|
||||
{
|
||||
return GetUsers(id).GetGroups(IncludeType.Distinct, Guid.Empty);
|
||||
return GetUsers(id, tenant.TenantId).GetGroups(tenant, IncludeType.Distinct, Guid.Empty);
|
||||
}
|
||||
|
||||
public GroupInfo[] GetUserGroups(Guid id, Guid categoryID)
|
||||
public GroupInfo[] GetUserGroups(Tenant tenant, Guid id, Guid categoryID)
|
||||
{
|
||||
return GetUsers(id).GetGroups(IncludeType.Distinct, categoryID);
|
||||
return GetUsers(id, tenant.TenantId).GetGroups(tenant, IncludeType.Distinct, categoryID);
|
||||
}
|
||||
|
||||
public GroupInfo[] GetUserGroups(Guid userID, IncludeType includeType)
|
||||
public GroupInfo[] GetUserGroups(Tenant tenant, Guid userID, IncludeType includeType)
|
||||
{
|
||||
return GetUsers(userID).GetGroups(includeType, null);
|
||||
return GetUsers(userID, tenant.TenantId).GetGroups(tenant, includeType, null);
|
||||
}
|
||||
|
||||
internal GroupInfo[] GetUserGroups(Guid userID, IncludeType includeType, Guid? categoryId)
|
||||
internal GroupInfo[] GetUserGroups(Tenant tenant, Guid userID, IncludeType includeType, Guid? categoryId)
|
||||
{
|
||||
var result = new List<GroupInfo>();
|
||||
var distinctUserGroups = new List<GroupInfo>();
|
||||
|
||||
var refs = GetRefsInternal();
|
||||
var refs = GetRefsInternal(tenant.TenantId);
|
||||
IEnumerable<UserGroupRef> userRefs = null;
|
||||
var store = refs as UserGroupRefStore;
|
||||
if (store != null)
|
||||
@ -285,9 +288,9 @@ namespace ASC.Core
|
||||
|
||||
var userRefsContainsNotRemoved = userRefs != null ? userRefs.Where(r => !r.Removed && r.RefType == UserGroupRefType.Contains).ToList() : null;
|
||||
|
||||
foreach (var g in GetGroupsInternal().Where(g => !categoryId.HasValue || g.CategoryID == categoryId))
|
||||
foreach (var g in GetGroupsInternal(tenant.TenantId).Where(g => !categoryId.HasValue || g.CategoryID == categoryId))
|
||||
{
|
||||
if (((g.CategoryID == Constants.SysGroupCategoryId || userRefs == null) && IsUserInGroupInternal(userID, g.ID, refs)) ||
|
||||
if (((g.CategoryID == Constants.SysGroupCategoryId || userRefs == null) && IsUserInGroupInternal(tenant, userID, g.ID, refs)) ||
|
||||
(userRefsContainsNotRemoved != null && userRefsContainsNotRemoved.Any(r => r.GroupId == g.ID)))
|
||||
{
|
||||
distinctUserGroups.Add(g);
|
||||
@ -304,11 +307,11 @@ namespace ASC.Core
|
||||
return result.ToArray();
|
||||
}
|
||||
|
||||
internal IEnumerable<Guid> GetUserGroupsGuids(Guid userID)
|
||||
internal IEnumerable<Guid> GetUserGroupsGuids(int tenantId, Guid userID)
|
||||
{
|
||||
var result = new List<Guid>();
|
||||
|
||||
var refs = GetRefsInternal();
|
||||
var refs = GetRefsInternal(tenantId);
|
||||
|
||||
var store = refs as UserGroupRefStore;
|
||||
if (store != null)
|
||||
@ -328,38 +331,36 @@ namespace ASC.Core
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool IsUserInGroup(Guid userId, Guid groupId)
|
||||
public bool IsUserInGroup(Tenant tenant, Guid userId, Guid groupId)
|
||||
{
|
||||
return IsUserInGroupInternal(userId, groupId, GetRefsInternal());
|
||||
return IsUserInGroupInternal(tenant, userId, groupId, GetRefsInternal(tenant.TenantId));
|
||||
}
|
||||
|
||||
public UserInfo[] GetUsersByGroup(Guid groupId, EmployeeStatus employeeStatus = EmployeeStatus.Default)
|
||||
public UserInfo[] GetUsersByGroup(Tenant tenant, Guid groupId, EmployeeStatus employeeStatus = EmployeeStatus.Default)
|
||||
{
|
||||
var refs = GetRefsInternal();
|
||||
return GetUsers(employeeStatus).Where(u => IsUserInGroupInternal(u.ID, groupId, refs)).ToArray();
|
||||
var refs = GetRefsInternal(tenant.TenantId);
|
||||
return GetUsers(tenant, employeeStatus).Where(u => IsUserInGroupInternal(tenant, u.ID, groupId, refs)).ToArray();
|
||||
}
|
||||
|
||||
public void AddUserIntoGroup(Guid userId, Guid groupId)
|
||||
public void AddUserIntoGroup(Tenant tenant, Guid userId, Guid groupId)
|
||||
{
|
||||
if (Constants.LostUser.ID == userId || Constants.LostGroupInfo.ID == groupId)
|
||||
{
|
||||
return;
|
||||
}
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditGroups);
|
||||
SecurityContext.DemandPermissions(tenant, Constants.Action_EditGroups);
|
||||
|
||||
userService.SaveUserGroupRef(
|
||||
CoreContext.TenantManager.GetCurrentTenant().TenantId,
|
||||
new UserGroupRef(userId, groupId, UserGroupRefType.Contains));
|
||||
userService.SaveUserGroupRef(tenant.TenantId, new UserGroupRef(userId, groupId, UserGroupRefType.Contains));
|
||||
|
||||
GetUsers(userId).ResetGroupCache();
|
||||
}
|
||||
|
||||
public void RemoveUserFromGroup(Guid userId, Guid groupId)
|
||||
public void RemoveUserFromGroup(Tenant tenant, Guid userId, Guid groupId)
|
||||
{
|
||||
if (Constants.LostUser.ID == userId || Constants.LostGroupInfo.ID == groupId) return;
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditGroups);
|
||||
SecurityContext.DemandPermissions(tenant, Constants.Action_EditGroups);
|
||||
|
||||
userService.RemoveUserGroupRef(CoreContext.TenantManager.GetCurrentTenant().TenantId, userId, groupId, UserGroupRefType.Contains);
|
||||
userService.RemoveUserGroupRef(tenant.TenantId, userId, groupId, UserGroupRefType.Contains);
|
||||
|
||||
GetUsers(userId).ResetGroupCache();
|
||||
}
|
||||
@ -369,46 +370,46 @@ namespace ASC.Core
|
||||
|
||||
#region Company
|
||||
|
||||
public GroupInfo[] GetDepartments()
|
||||
public GroupInfo[] GetDepartments(int tenantId)
|
||||
{
|
||||
return CoreContext.UserManager.GetGroups();
|
||||
return GetGroups(tenantId);
|
||||
}
|
||||
|
||||
public Guid GetDepartmentManager(Guid deparmentID)
|
||||
public Guid GetDepartmentManager(int tenantId, Guid deparmentID)
|
||||
{
|
||||
return GetRefsInternal()
|
||||
return GetRefsInternal(tenantId)
|
||||
.Values
|
||||
.Where(r => r.RefType == UserGroupRefType.Manager && r.GroupId == deparmentID && !r.Removed)
|
||||
.Select(r => r.UserId)
|
||||
.SingleOrDefault();
|
||||
}
|
||||
|
||||
public void SetDepartmentManager(Guid deparmentID, Guid userID)
|
||||
public void SetDepartmentManager(int tenantId, Guid deparmentID, Guid userID)
|
||||
{
|
||||
var managerId = GetDepartmentManager(deparmentID);
|
||||
var managerId = GetDepartmentManager(tenantId, deparmentID);
|
||||
if (managerId != Guid.Empty)
|
||||
{
|
||||
userService.RemoveUserGroupRef(
|
||||
CoreContext.TenantManager.GetCurrentTenant().TenantId,
|
||||
tenantId,
|
||||
managerId, deparmentID, UserGroupRefType.Manager);
|
||||
}
|
||||
if (userID != Guid.Empty)
|
||||
{
|
||||
userService.SaveUserGroupRef(
|
||||
CoreContext.TenantManager.GetCurrentTenant().TenantId,
|
||||
tenantId,
|
||||
new UserGroupRef(userID, deparmentID, UserGroupRefType.Manager));
|
||||
}
|
||||
}
|
||||
|
||||
public UserInfo GetCompanyCEO()
|
||||
public UserInfo GetCompanyCEO(int tenantId)
|
||||
{
|
||||
var id = GetDepartmentManager(Guid.Empty);
|
||||
var id = GetDepartmentManager(tenantId, Guid.Empty);
|
||||
return id != Guid.Empty ? GetUsers(id) : null;
|
||||
}
|
||||
|
||||
public void SetCompanyCEO(Guid userId)
|
||||
public void SetCompanyCEO(int tenantId, Guid userId)
|
||||
{
|
||||
SetDepartmentManager(Guid.Empty, userId);
|
||||
SetDepartmentManager(tenantId, Guid.Empty, userId);
|
||||
}
|
||||
|
||||
#endregion Company
|
||||
@ -416,56 +417,56 @@ namespace ASC.Core
|
||||
|
||||
#region Groups
|
||||
|
||||
public GroupInfo[] GetGroups()
|
||||
public GroupInfo[] GetGroups(int tenantId)
|
||||
{
|
||||
return GetGroups(Guid.Empty);
|
||||
return GetGroups(tenantId, Guid.Empty);
|
||||
}
|
||||
|
||||
public GroupInfo[] GetGroups(Guid categoryID)
|
||||
public GroupInfo[] GetGroups(int tenantId, Guid categoryID)
|
||||
{
|
||||
return GetGroupsInternal()
|
||||
return GetGroupsInternal(tenantId)
|
||||
.Where(g => g.CategoryID == categoryID)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
public GroupInfo GetGroupInfo(Guid groupID)
|
||||
public GroupInfo GetGroupInfo(int tenantId, Guid groupID)
|
||||
{
|
||||
return GetGroupsInternal()
|
||||
return GetGroupsInternal(tenantId)
|
||||
.SingleOrDefault(g => g.ID == groupID) ?? Constants.LostGroupInfo;
|
||||
}
|
||||
|
||||
public GroupInfo GetGroupInfoBySid(string sid)
|
||||
public GroupInfo GetGroupInfoBySid(int tenantId, string sid)
|
||||
{
|
||||
return GetGroupsInternal()
|
||||
return GetGroupsInternal(tenantId)
|
||||
.SingleOrDefault(g => g.Sid == sid) ?? Constants.LostGroupInfo;
|
||||
}
|
||||
|
||||
public DateTime GetMaxGroupsLastModified()
|
||||
public DateTime GetMaxGroupsLastModified(int tenantId)
|
||||
{
|
||||
return userService.GetGroups(CoreContext.TenantManager.GetCurrentTenant().TenantId, default(DateTime))
|
||||
return userService.GetGroups(tenantId, default)
|
||||
.Values
|
||||
.Select(g => g.LastModified)
|
||||
.DefaultIfEmpty()
|
||||
.Max();
|
||||
}
|
||||
|
||||
public GroupInfo SaveGroupInfo(GroupInfo g)
|
||||
public GroupInfo SaveGroupInfo(Tenant tenant, GroupInfo g)
|
||||
{
|
||||
if (Constants.LostGroupInfo.Equals(g)) return Constants.LostGroupInfo;
|
||||
if (Constants.BuildinGroups.Any(b => b.ID == g.ID)) return Constants.BuildinGroups.Single(b => b.ID == g.ID);
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditGroups);
|
||||
SecurityContext.DemandPermissions(tenant, Constants.Action_EditGroups);
|
||||
|
||||
var newGroup = userService.SaveGroup(CoreContext.TenantManager.GetCurrentTenant().TenantId, ToGroup(g));
|
||||
var newGroup = userService.SaveGroup(tenant.TenantId, ToGroup(g));
|
||||
return new GroupInfo(newGroup.CategoryId) { ID = newGroup.Id, Name = newGroup.Name, Sid = newGroup.Sid };
|
||||
}
|
||||
|
||||
public void DeleteGroup(Guid id)
|
||||
public void DeleteGroup(Tenant tenant, Guid id)
|
||||
{
|
||||
if (Constants.LostGroupInfo.Equals(id)) return;
|
||||
if (Constants.BuildinGroups.Any(b => b.ID == id)) return;
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditGroups);
|
||||
SecurityContext.DemandPermissions(tenant, Constants.Action_EditGroups);
|
||||
|
||||
userService.RemoveGroup(CoreContext.TenantManager.GetCurrentTenant().TenantId, id);
|
||||
userService.RemoveGroup(tenant.TenantId, id);
|
||||
}
|
||||
|
||||
#endregion Groups
|
||||
@ -487,31 +488,29 @@ namespace ASC.Core
|
||||
}
|
||||
|
||||
|
||||
private IEnumerable<UserInfo> GetUsersInternal()
|
||||
private IEnumerable<UserInfo> GetUsersInternal(int tenantId)
|
||||
{
|
||||
return userService.GetUsers(CoreContext.TenantManager.GetCurrentTenant().TenantId, default(DateTime))
|
||||
return userService.GetUsers(tenantId, default)
|
||||
.Values
|
||||
.Where(u => !u.Removed);
|
||||
}
|
||||
|
||||
private IEnumerable<GroupInfo> GetGroupsInternal()
|
||||
private IEnumerable<GroupInfo> GetGroupsInternal(int tenantId)
|
||||
{
|
||||
return userService.GetGroups(CoreContext.TenantManager.GetCurrentTenant().TenantId, default(DateTime))
|
||||
return userService.GetGroups(tenantId, default)
|
||||
.Values
|
||||
.Where(g => !g.Removed)
|
||||
.Select(g => new GroupInfo(g.CategoryId) { ID = g.Id, Name = g.Name, Sid = g.Sid })
|
||||
.Concat(Constants.BuildinGroups);
|
||||
}
|
||||
|
||||
private IDictionary<string, UserGroupRef> GetRefsInternal()
|
||||
private IDictionary<string, UserGroupRef> GetRefsInternal(int tenantId)
|
||||
{
|
||||
return userService.GetUserGroupRefs(CoreContext.TenantManager.GetCurrentTenant().TenantId, default(DateTime));
|
||||
return userService.GetUserGroupRefs(tenantId, default);
|
||||
}
|
||||
|
||||
private bool IsUserInGroupInternal(Guid userId, Guid groupId, IDictionary<string, UserGroupRef> refs)
|
||||
private bool IsUserInGroupInternal(Tenant tenant, Guid userId, Guid groupId, IDictionary<string, UserGroupRef> refs)
|
||||
{
|
||||
var tenant = CoreContext.TenantManager.GetCurrentTenant();
|
||||
|
||||
if (groupId == Constants.GroupEveryone.ID)
|
||||
{
|
||||
return true;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,41 +19,40 @@ namespace ASC.Employee.Core.Controllers
|
||||
public class GroupController : ControllerBase
|
||||
{
|
||||
public Common.Logging.LogManager LogManager { get; }
|
||||
|
||||
private ApiContext apiContext;
|
||||
public ApiContext ApiContext { get { return apiContext ?? (apiContext = HttpContext); } }
|
||||
public ApiContext ApiContext { get; }
|
||||
public MessageService MessageService { get; }
|
||||
|
||||
public GroupController(Common.Logging.LogManager logManager, MessageService messageService)
|
||||
public GroupController(Common.Logging.LogManager logManager, MessageService messageService, ApiContext apiContext)
|
||||
{
|
||||
LogManager = logManager;
|
||||
MessageService = messageService;
|
||||
ApiContext = apiContext;
|
||||
}
|
||||
|
||||
[Read]
|
||||
public IEnumerable<GroupWrapperSummary> GetAll()
|
||||
{
|
||||
return CoreContext.UserManager.GetDepartments().Select(x => new GroupWrapperSummary(x));
|
||||
return CoreContext.UserManager.GetDepartments(ApiContext.Tenant.TenantId).Select(x => new GroupWrapperSummary(x, ApiContext));
|
||||
}
|
||||
|
||||
[Read("{groupid}")]
|
||||
public GroupWrapperFull GetById(Guid groupid)
|
||||
{
|
||||
return new GroupWrapperFull(GetGroupInfo(groupid), true);
|
||||
return new GroupWrapperFull(GetGroupInfo(groupid), true, ApiContext);
|
||||
}
|
||||
|
||||
[Read("user/{userid}")]
|
||||
public IEnumerable<GroupWrapperSummary> GetByUserId(Guid userid)
|
||||
{
|
||||
return CoreContext.UserManager.GetUserGroups(userid).Select(x => new GroupWrapperSummary(x));
|
||||
return CoreContext.UserManager.GetUserGroups(ApiContext.Tenant, userid).Select(x => new GroupWrapperSummary(x, ApiContext));
|
||||
}
|
||||
|
||||
[Create]
|
||||
public GroupWrapperFull AddGroup(Guid groupManager, string groupName, IEnumerable<Guid> members)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
||||
|
||||
var group = CoreContext.UserManager.SaveGroupInfo(new GroupInfo { Name = groupName });
|
||||
var group = CoreContext.UserManager.SaveGroupInfo(ApiContext.Tenant, new GroupInfo { Name = groupName });
|
||||
|
||||
TransferUserToDepartment(groupManager, @group, true);
|
||||
if (members != null)
|
||||
@ -66,23 +65,23 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
MessageService.Send(MessageAction.GroupCreated, MessageTarget.Create(group.ID), group.Name);
|
||||
|
||||
return new GroupWrapperFull(group, true);
|
||||
return new GroupWrapperFull(group, true, ApiContext);
|
||||
}
|
||||
|
||||
[Update("{groupid}")]
|
||||
public GroupWrapperFull UpdateGroup(Guid groupid, Guid groupManager, string groupName, IEnumerable<Guid> members)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
||||
var group = CoreContext.UserManager.GetGroups().SingleOrDefault(x => x.ID == groupid).NotFoundIfNull("group not found");
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
||||
var group = CoreContext.UserManager.GetGroups(ApiContext.Tenant.TenantId).SingleOrDefault(x => x.ID == groupid).NotFoundIfNull("group not found");
|
||||
if (group.ID == Constants.LostGroupInfo.ID)
|
||||
{
|
||||
throw new ItemNotFoundException("group not found");
|
||||
}
|
||||
|
||||
group.Name = groupName ?? group.Name;
|
||||
CoreContext.UserManager.SaveGroupInfo(group);
|
||||
CoreContext.UserManager.SaveGroupInfo(ApiContext.Tenant, group);
|
||||
|
||||
RemoveMembersFrom(groupid, CoreContext.UserManager.GetUsersByGroup(groupid, EmployeeStatus.All).Select(u => u.ID).Where(id => !members.Contains(id)));
|
||||
RemoveMembersFrom(groupid, CoreContext.UserManager.GetUsersByGroup(ApiContext.Tenant, groupid, EmployeeStatus.All).Select(u => u.ID).Where(id => !members.Contains(id)));
|
||||
|
||||
TransferUserToDepartment(groupManager, @group, true);
|
||||
if (members != null)
|
||||
@ -101,20 +100,20 @@ namespace ASC.Employee.Core.Controllers
|
||||
[Delete("{groupid}")]
|
||||
public GroupWrapperFull DeleteGroup(Guid groupid)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
||||
var @group = GetGroupInfo(groupid);
|
||||
var groupWrapperFull = new GroupWrapperFull(group, false);
|
||||
var groupWrapperFull = new GroupWrapperFull(group, false, ApiContext);
|
||||
|
||||
CoreContext.UserManager.DeleteGroup(groupid);
|
||||
CoreContext.UserManager.DeleteGroup(ApiContext.Tenant, groupid);
|
||||
|
||||
MessageService.Send(MessageAction.GroupDeleted, MessageTarget.Create(group.ID), group.Name);
|
||||
|
||||
return groupWrapperFull;
|
||||
}
|
||||
|
||||
private static GroupInfo GetGroupInfo(Guid groupid)
|
||||
private GroupInfo GetGroupInfo(Guid groupid)
|
||||
{
|
||||
var group = CoreContext.UserManager.GetGroups().SingleOrDefault(x => x.ID == groupid).NotFoundIfNull("group not found");
|
||||
var group = CoreContext.UserManager.GetGroups(ApiContext.Tenant.TenantId).SingleOrDefault(x => x.ID == groupid).NotFoundIfNull("group not found");
|
||||
if (group.ID == Constants.LostGroupInfo.ID)
|
||||
throw new ItemNotFoundException("group not found");
|
||||
return @group;
|
||||
@ -123,12 +122,12 @@ namespace ASC.Employee.Core.Controllers
|
||||
[Update("{groupid}/members/{newgroupid}")]
|
||||
public GroupWrapperFull TransferMembersTo(Guid groupid, Guid newgroupid)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
||||
var oldgroup = GetGroupInfo(groupid);
|
||||
|
||||
var newgroup = GetGroupInfo(newgroupid);
|
||||
|
||||
var users = CoreContext.UserManager.GetUsersByGroup(oldgroup.ID);
|
||||
var users = CoreContext.UserManager.GetUsersByGroup(ApiContext.Tenant, oldgroup.ID);
|
||||
foreach (var userInfo in users)
|
||||
{
|
||||
TransferUserToDepartment(userInfo.ID, newgroup, false);
|
||||
@ -139,7 +138,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
[Create("{groupid}/members")]
|
||||
public GroupWrapperFull SetMembersTo(Guid groupid, IEnumerable<Guid> members)
|
||||
{
|
||||
RemoveMembersFrom(groupid, CoreContext.UserManager.GetUsersByGroup(groupid).Select(x => x.ID));
|
||||
RemoveMembersFrom(groupid, CoreContext.UserManager.GetUsersByGroup(ApiContext.Tenant, groupid).Select(x => x.ID));
|
||||
AddMembersTo(groupid, members);
|
||||
return GetById(groupid);
|
||||
}
|
||||
@ -147,7 +146,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
[Update("{groupid}/members")]
|
||||
public GroupWrapperFull AddMembersTo(Guid groupid, IEnumerable<Guid> members)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
||||
var group = GetGroupInfo(groupid);
|
||||
|
||||
foreach (var userId in members)
|
||||
@ -161,9 +160,9 @@ namespace ASC.Employee.Core.Controllers
|
||||
public GroupWrapperFull SetManager(Guid groupid, Guid userid)
|
||||
{
|
||||
var group = GetGroupInfo(groupid);
|
||||
if (CoreContext.UserManager.UserExists(userid))
|
||||
if (CoreContext.UserManager.UserExists(userid, ApiContext.Tenant.TenantId))
|
||||
{
|
||||
CoreContext.UserManager.SetDepartmentManager(group.ID, userid);
|
||||
CoreContext.UserManager.SetDepartmentManager(ApiContext.Tenant.TenantId, group.ID, userid);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -175,7 +174,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
[Delete("{groupid}/members")]
|
||||
public GroupWrapperFull RemoveMembersFrom(Guid groupid, IEnumerable<Guid> members)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditGroups, Constants.Action_AddRemoveUser);
|
||||
var group = GetGroupInfo(groupid);
|
||||
|
||||
foreach (var userId in members)
|
||||
@ -185,24 +184,24 @@ namespace ASC.Employee.Core.Controllers
|
||||
return GetById(group.ID);
|
||||
}
|
||||
|
||||
private static void RemoveUserFromDepartment(Guid userId, GroupInfo @group)
|
||||
private void RemoveUserFromDepartment(Guid userId, GroupInfo @group)
|
||||
{
|
||||
if (!CoreContext.UserManager.UserExists(userId)) return;
|
||||
if (!CoreContext.UserManager.UserExists(userId, ApiContext.Tenant.TenantId)) return;
|
||||
|
||||
var user = CoreContext.UserManager.GetUsers(userId);
|
||||
CoreContext.UserManager.RemoveUserFromGroup(user.ID, @group.ID);
|
||||
CoreContext.UserManager.SaveUserInfo(user);
|
||||
var user = CoreContext.UserManager.GetUsers(userId, ApiContext.Tenant.TenantId);
|
||||
CoreContext.UserManager.RemoveUserFromGroup(ApiContext.Tenant, user.ID, @group.ID);
|
||||
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
|
||||
}
|
||||
|
||||
private static void TransferUserToDepartment(Guid userId, GroupInfo group, bool setAsManager)
|
||||
private void TransferUserToDepartment(Guid userId, GroupInfo group, bool setAsManager)
|
||||
{
|
||||
if (!CoreContext.UserManager.UserExists(userId) && userId != Guid.Empty) return;
|
||||
if (!CoreContext.UserManager.UserExists(userId, ApiContext.Tenant.TenantId) && userId != Guid.Empty) return;
|
||||
|
||||
if (setAsManager)
|
||||
{
|
||||
CoreContext.UserManager.SetDepartmentManager(@group.ID, userId);
|
||||
CoreContext.UserManager.SetDepartmentManager(ApiContext.Tenant.TenantId, @group.ID, userId);
|
||||
}
|
||||
CoreContext.UserManager.AddUserIntoGroup(userId, @group.ID);
|
||||
CoreContext.UserManager.AddUserIntoGroup(ApiContext.Tenant, userId, @group.ID);
|
||||
}
|
||||
}
|
||||
}
|
@ -86,42 +86,42 @@ namespace ASC.Employee.Core.Controllers
|
||||
public IEnumerable<EmployeeWraper> GetByStatus(EmployeeStatus status)
|
||||
{
|
||||
if (CoreContext.Configuration.Personal) throw new Exception("Method not available");
|
||||
var query = CoreContext.UserManager.GetUsers(status).AsEnumerable();
|
||||
var query = CoreContext.UserManager.GetUsers(ApiContext.Tenant, status).AsEnumerable();
|
||||
if ("group".Equals(ApiContext.FilterBy, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(ApiContext.FilterValue))
|
||||
{
|
||||
var groupId = new Guid(ApiContext.FilterValue);
|
||||
//Filter by group
|
||||
query = query.Where(x => CoreContext.UserManager.IsUserInGroup(x.ID, groupId));
|
||||
query = query.Where(x => CoreContext.UserManager.IsUserInGroup(ApiContext.Tenant, x.ID, groupId));
|
||||
ApiContext.SetDataFiltered();
|
||||
}
|
||||
return query.Select(x => new EmployeeWraperFull(x));
|
||||
return query.Select(x => new EmployeeWraperFull(x, ApiContext));
|
||||
}
|
||||
|
||||
[Read("@self")]
|
||||
public EmployeeWraper Self()
|
||||
{
|
||||
return new EmployeeWraperFull(CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID));
|
||||
return new EmployeeWraperFull(CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID), ApiContext);
|
||||
}
|
||||
|
||||
[Read("email")]
|
||||
public EmployeeWraperFull GetByEmail([FromQuery]string email)
|
||||
{
|
||||
if (CoreContext.Configuration.Personal && !CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsOwner())
|
||||
if (CoreContext.Configuration.Personal && !CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsOwner(ApiContext.Tenant))
|
||||
throw new MethodAccessException("Method not available");
|
||||
var user = CoreContext.UserManager.GetUserByEmail(email);
|
||||
var user = CoreContext.UserManager.GetUserByEmail(ApiContext.Tenant.TenantId, email);
|
||||
if (user.ID == Constants.LostUser.ID)
|
||||
{
|
||||
throw new ItemNotFoundException("User not found");
|
||||
}
|
||||
|
||||
return new EmployeeWraperFull(user);
|
||||
return new EmployeeWraperFull(user, ApiContext);
|
||||
}
|
||||
|
||||
[Read("{username}", order: int.MaxValue)]
|
||||
public EmployeeWraperFull GetById(string username)
|
||||
{
|
||||
if (CoreContext.Configuration.Personal) throw new MethodAccessException("Method not available");
|
||||
var user = CoreContext.UserManager.GetUserByUserName(username);
|
||||
var user = CoreContext.UserManager.GetUserByUserName(ApiContext.Tenant.TenantId, username);
|
||||
if (user.ID == Constants.LostUser.ID)
|
||||
{
|
||||
if (Guid.TryParse(username, out var userId))
|
||||
@ -139,7 +139,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
throw new ItemNotFoundException("User not found");
|
||||
}
|
||||
|
||||
return new EmployeeWraperFull(user);
|
||||
return new EmployeeWraperFull(user, ApiContext);
|
||||
}
|
||||
|
||||
[Read("@search/{query}")]
|
||||
@ -154,7 +154,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
groupId = new Guid(ApiContext.FilterValue);
|
||||
}
|
||||
|
||||
return CoreContext.UserManager.Search(query, EmployeeStatus.Active, groupId).Select(x => new EmployeeWraperFull(x));
|
||||
return CoreContext.UserManager.Search(ApiContext.Tenant, query, EmployeeStatus.Active, groupId).Select(x => new EmployeeWraperFull(x, ApiContext));
|
||||
}
|
||||
catch (Exception error)
|
||||
{
|
||||
@ -175,20 +175,20 @@ namespace ASC.Employee.Core.Controllers
|
||||
if (CoreContext.Configuration.Personal) throw new MethodAccessException("Method not available");
|
||||
try
|
||||
{
|
||||
var list = CoreContext.UserManager.GetUsers(status).AsEnumerable();
|
||||
var list = CoreContext.UserManager.GetUsers(ApiContext.Tenant, status).AsEnumerable();
|
||||
|
||||
if ("group".Equals(ApiContext.FilterBy, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(ApiContext.FilterValue))
|
||||
{
|
||||
var groupId = new Guid(ApiContext.FilterValue);
|
||||
//Filter by group
|
||||
list = list.Where(x => CoreContext.UserManager.IsUserInGroup(x.ID, groupId));
|
||||
list = list.Where(x => CoreContext.UserManager.IsUserInGroup(ApiContext.Tenant, x.ID, groupId));
|
||||
ApiContext.SetDataFiltered();
|
||||
}
|
||||
|
||||
list = list.Where(x => x.FirstName != null && x.FirstName.IndexOf(query, StringComparison.OrdinalIgnoreCase) > -1 || (x.LastName != null && x.LastName.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1) ||
|
||||
(x.UserName != null && x.UserName.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1) || (x.Email != null && x.Email.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1) || (x.Contacts != null && x.Contacts.Any(y => y.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1)));
|
||||
|
||||
return list.Select(x => new EmployeeWraperFull(x));
|
||||
return list.Select(x => new EmployeeWraperFull(x, ApiContext));
|
||||
}
|
||||
catch (Exception error)
|
||||
{
|
||||
@ -263,14 +263,14 @@ namespace ASC.Employee.Core.Controllers
|
||||
{
|
||||
var users = GetByFilter(employeeStatus, groupId, activationStatus, employeeType, isAdministrator);
|
||||
|
||||
return users.Select(u => new EmployeeWraper(u));
|
||||
return users.Select(u => new EmployeeWraper(u, ApiContext));
|
||||
}
|
||||
|
||||
private IEnumerable<UserInfo> GetByFilter(EmployeeStatus? employeeStatus, Guid? groupId, EmployeeActivationStatus? activationStatus, EmployeeType? employeeType, bool? isAdministrator)
|
||||
{
|
||||
if (CoreContext.Configuration.Personal) throw new MethodAccessException("Method not available");
|
||||
var isAdmin = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsAdmin() ||
|
||||
WebItemSecurity.IsProductAdministrator(WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID);
|
||||
var isAdmin = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsAdmin(ApiContext.Tenant) ||
|
||||
WebItemSecurity.IsProductAdministrator(ApiContext.Tenant, WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID);
|
||||
|
||||
var includeGroups = new List<Guid>();
|
||||
if (groupId.HasValue)
|
||||
@ -302,7 +302,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
includeGroups.AddRange(products.Select(r=> r.ID));
|
||||
}
|
||||
|
||||
var users = CoreContext.UserManager.GetUsers(isAdmin, employeeStatus, includeGroups, excludeGroups, activationStatus, ApiContext.FilterValue, ApiContext.SortBy, !ApiContext.SortDescending, ApiContext.Count - 1, ApiContext.StartIndex, out int total);
|
||||
var users = CoreContext.UserManager.GetUsers(ApiContext.Tenant.TenantId, isAdmin, employeeStatus, includeGroups, excludeGroups, activationStatus, ApiContext.FilterValue, ApiContext.SortBy, !ApiContext.SortDescending, ApiContext.Count - 1, ApiContext.StartIndex, out int total);
|
||||
|
||||
ApiContext.SetTotalCount(total);
|
||||
|
||||
@ -312,7 +312,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
[Create]
|
||||
public EmployeeWraperFull AddMember(MemberModel memberModel)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_AddRemoveUser);
|
||||
|
||||
if (string.IsNullOrEmpty(memberModel.Password))
|
||||
memberModel.Password = UserManagerWrapper.GeneratePassword();
|
||||
@ -339,7 +339,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
UpdateContacts(memberModel.Contacts, user);
|
||||
|
||||
user = UserManagerWrapper.AddUser(user, memberModel.Password, false, true, memberModel.IsVisitor);
|
||||
user = UserManagerWrapper.AddUser(ApiContext.Tenant, user, memberModel.Password, false, true, memberModel.IsVisitor);
|
||||
|
||||
var messageAction = memberModel.IsVisitor ? MessageAction.GuestCreated : MessageAction.UserCreated;
|
||||
MessageService.Send(messageAction, MessageTarget.Create(user.ID), user.DisplayUserName(false));
|
||||
@ -351,13 +351,13 @@ namespace ASC.Employee.Core.Controllers
|
||||
UpdatePhotoUrl(memberModel.Files, user);
|
||||
}
|
||||
|
||||
return new EmployeeWraperFull(user);
|
||||
return new EmployeeWraperFull(user, ApiContext);
|
||||
}
|
||||
|
||||
[Create("active")]
|
||||
public EmployeeWraperFull AddMemberAsActivated(MemberModel memberModel)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_AddRemoveUser);
|
||||
|
||||
var user = new UserInfo();
|
||||
|
||||
@ -382,7 +382,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
UpdateContacts(memberModel.Contacts, user);
|
||||
|
||||
user = UserManagerWrapper.AddUser(user, memberModel.Password, false, false, memberModel.IsVisitor);
|
||||
user = UserManagerWrapper.AddUser(ApiContext.Tenant, user, memberModel.Password, false, false, memberModel.IsVisitor);
|
||||
|
||||
user.ActivationStatus = EmployeeActivationStatus.Activated;
|
||||
|
||||
@ -393,7 +393,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
UpdatePhotoUrl(memberModel.Files, user);
|
||||
}
|
||||
|
||||
return new EmployeeWraperFull(user);
|
||||
return new EmployeeWraperFull(user, ApiContext);
|
||||
}
|
||||
|
||||
[Update("{userid}")]
|
||||
@ -404,7 +404,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
if (CoreContext.UserManager.IsSystemUser(user.ID))
|
||||
throw new SecurityException();
|
||||
|
||||
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(user.ID), Constants.Action_EditUser);
|
||||
|
||||
var self = SecurityContext.CurrentAccount.ID.Equals(user.ID);
|
||||
var resetDate = new DateTime(1900, 01, 01);
|
||||
@ -413,7 +413,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
var isLdap = user.IsLDAP();
|
||||
var isSso = user.IsSSO();
|
||||
var isAdmin = WebItemSecurity.IsProductAdministrator(WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID);
|
||||
var isAdmin = WebItemSecurity.IsProductAdministrator(ApiContext.Tenant, WebItemManager.PeopleProductID, SecurityContext.CurrentAccount.ID);
|
||||
|
||||
if (!isLdap && !isSso)
|
||||
{
|
||||
@ -455,7 +455,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
UpdateContacts(memberModel.Contacts, user);
|
||||
UpdateDepartments(memberModel.Department, user);
|
||||
|
||||
if (memberModel.Files != UserPhotoManager.GetPhotoAbsoluteWebPath(user.ID))
|
||||
if (memberModel.Files != UserPhotoManager.GetPhotoAbsoluteWebPath(ApiContext.Tenant, user.ID))
|
||||
{
|
||||
UpdatePhotoUrl(memberModel.Files, user);
|
||||
}
|
||||
@ -467,24 +467,24 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
if (self && !isAdmin)
|
||||
{
|
||||
StudioNotifyService.SendMsgToAdminAboutProfileUpdated();
|
||||
StudioNotifyService.SendMsgToAdminAboutProfileUpdated(ApiContext.Tenant.TenantId);
|
||||
}
|
||||
|
||||
// change user type
|
||||
var canBeGuestFlag = !user.IsOwner() && !user.IsAdmin() && !user.GetListAdminModules().Any() && !user.IsMe();
|
||||
var canBeGuestFlag = !user.IsOwner(ApiContext.Tenant) && !user.IsAdmin(ApiContext.Tenant) && !user.GetListAdminModules(ApiContext.Tenant).Any() && !user.IsMe();
|
||||
|
||||
if (memberModel.IsVisitor && !user.IsVisitor() && canBeGuestFlag)
|
||||
if (memberModel.IsVisitor && !user.IsVisitor(ApiContext.Tenant) && canBeGuestFlag)
|
||||
{
|
||||
CoreContext.UserManager.AddUserIntoGroup(user.ID, Constants.GroupVisitor.ID);
|
||||
CoreContext.UserManager.AddUserIntoGroup(ApiContext.Tenant, user.ID, Constants.GroupVisitor.ID);
|
||||
WebItemSecurity.ClearCache();
|
||||
}
|
||||
|
||||
if (!self && !memberModel.IsVisitor && user.IsVisitor())
|
||||
if (!self && !memberModel.IsVisitor && user.IsVisitor(ApiContext.Tenant))
|
||||
{
|
||||
var usersQuota = TenantExtra.GetTenantQuota().ActiveUsers;
|
||||
if (TenantStatisticsProvider.GetUsersCount() < usersQuota)
|
||||
if (TenantStatisticsProvider.GetUsersCount(ApiContext.Tenant) < usersQuota)
|
||||
{
|
||||
CoreContext.UserManager.RemoveUserFromGroup(user.ID, Constants.GroupVisitor.ID);
|
||||
CoreContext.UserManager.RemoveUserFromGroup(ApiContext.Tenant, user.ID, Constants.GroupVisitor.ID);
|
||||
WebItemSecurity.ClearCache();
|
||||
}
|
||||
else
|
||||
@ -493,7 +493,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
CoreContext.UserManager.SaveUserInfo(user, memberModel.IsVisitor);
|
||||
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user, memberModel.IsVisitor);
|
||||
MessageService.Send(MessageAction.UserUpdated, MessageTarget.Create(user.ID), user.DisplayUserName(false));
|
||||
|
||||
if (memberModel.Disable.HasValue && memberModel.Disable.Value)
|
||||
@ -502,13 +502,13 @@ namespace ASC.Employee.Core.Controllers
|
||||
MessageService.Send(MessageAction.CookieSettingsUpdated);
|
||||
}
|
||||
|
||||
return new EmployeeWraperFull(user);
|
||||
return new EmployeeWraperFull(user, ApiContext);
|
||||
}
|
||||
|
||||
[Delete("{userid}")]
|
||||
public EmployeeWraperFull DeleteMember(string userid)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_AddRemoveUser);
|
||||
|
||||
var user = GetUserInfo(userid);
|
||||
|
||||
@ -522,13 +522,13 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
var userName = user.DisplayUserName(false);
|
||||
|
||||
UserPhotoManager.RemovePhoto(user.ID);
|
||||
CoreContext.UserManager.DeleteUser(user.ID);
|
||||
UserPhotoManager.RemovePhoto(ApiContext.Tenant, user.ID);
|
||||
CoreContext.UserManager.DeleteUser(ApiContext.Tenant, user.ID);
|
||||
QueueWorkerRemove.Start(TenantProvider.CurrentTenantID, user, SecurityContext.CurrentAccount.ID, false);
|
||||
|
||||
MessageService.Send(MessageAction.UserDeleted, MessageTarget.Create(user.ID), userName);
|
||||
|
||||
return new EmployeeWraperFull(user);
|
||||
return new EmployeeWraperFull(user, ApiContext);
|
||||
}
|
||||
|
||||
[Update("{userid}/contacts")]
|
||||
@ -540,8 +540,8 @@ namespace ASC.Employee.Core.Controllers
|
||||
throw new SecurityException();
|
||||
|
||||
UpdateContacts(memberModel.Contacts, user);
|
||||
CoreContext.UserManager.SaveUserInfo(user);
|
||||
return new EmployeeWraperFull(user);
|
||||
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
|
||||
return new EmployeeWraperFull(user, ApiContext);
|
||||
}
|
||||
|
||||
[Create("{userid}/contacts")]
|
||||
@ -554,8 +554,8 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
user.Contacts.Clear();
|
||||
UpdateContacts(memberModel.Contacts, user);
|
||||
CoreContext.UserManager.SaveUserInfo(user);
|
||||
return new EmployeeWraperFull(user);
|
||||
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
|
||||
return new EmployeeWraperFull(user, ApiContext);
|
||||
}
|
||||
|
||||
[Delete("{userid}/contacts")]
|
||||
@ -567,8 +567,8 @@ namespace ASC.Employee.Core.Controllers
|
||||
throw new SecurityException();
|
||||
|
||||
DeleteContacts(memberModel.Contacts, user);
|
||||
CoreContext.UserManager.SaveUserInfo(user);
|
||||
return new EmployeeWraperFull(user);
|
||||
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
|
||||
return new EmployeeWraperFull(user, ApiContext);
|
||||
}
|
||||
|
||||
[Read("{userid}/photo")]
|
||||
@ -579,7 +579,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
if (CoreContext.UserManager.IsSystemUser(user.ID))
|
||||
throw new SecurityException();
|
||||
|
||||
return new ThumbnailsDataWrapper(user.ID);
|
||||
return new ThumbnailsDataWrapper(ApiContext.Tenant, user.ID);
|
||||
}
|
||||
|
||||
[Create("{userid}/photo")]
|
||||
@ -600,7 +600,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
userId = SecurityContext.CurrentAccount.ID;
|
||||
}
|
||||
|
||||
SecurityContext.DemandPermissions(new UserSecurityProvider(userId), Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(userId), Constants.Action_EditUser);
|
||||
|
||||
var userPhoto = model.Files[0];
|
||||
|
||||
@ -625,17 +625,17 @@ namespace ASC.Employee.Core.Controllers
|
||||
if (data.Length > SetupInfo.MaxImageUploadSize)
|
||||
throw new ImageSizeLimitException();
|
||||
|
||||
var mainPhoto = UserPhotoManager.SaveOrUpdatePhoto(userId, data);
|
||||
var mainPhoto = UserPhotoManager.SaveOrUpdatePhoto(ApiContext.Tenant, userId, data);
|
||||
|
||||
result.Data =
|
||||
new
|
||||
{
|
||||
main = mainPhoto,
|
||||
retina = UserPhotoManager.GetRetinaPhotoURL(userId),
|
||||
max = UserPhotoManager.GetMaxPhotoURL(userId),
|
||||
big = UserPhotoManager.GetBigPhotoURL(userId),
|
||||
medium = UserPhotoManager.GetMediumPhotoURL(userId),
|
||||
small = UserPhotoManager.GetSmallPhotoURL(userId),
|
||||
retina = UserPhotoManager.GetRetinaPhotoURL(ApiContext.Tenant.TenantId, userId),
|
||||
max = UserPhotoManager.GetMaxPhotoURL(ApiContext.Tenant.TenantId, userId),
|
||||
big = UserPhotoManager.GetBigPhotoURL(ApiContext.Tenant.TenantId, userId),
|
||||
medium = UserPhotoManager.GetMediumPhotoURL(ApiContext.Tenant.TenantId, userId),
|
||||
small = UserPhotoManager.GetSmallPhotoURL(ApiContext.Tenant.TenantId, userId),
|
||||
};
|
||||
}
|
||||
else
|
||||
@ -684,15 +684,15 @@ namespace ASC.Employee.Core.Controllers
|
||||
if (CoreContext.UserManager.IsSystemUser(user.ID))
|
||||
throw new SecurityException();
|
||||
|
||||
if (model.Files != UserPhotoManager.GetPhotoAbsoluteWebPath(user.ID))
|
||||
if (model.Files != UserPhotoManager.GetPhotoAbsoluteWebPath(ApiContext.Tenant, user.ID))
|
||||
{
|
||||
UpdatePhotoUrl(model.Files, user);
|
||||
}
|
||||
|
||||
CoreContext.UserManager.SaveUserInfo(user);
|
||||
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
|
||||
MessageService.Send(MessageAction.UserAddedAvatar, MessageTarget.Create(user.ID), user.DisplayUserName(false));
|
||||
|
||||
return new ThumbnailsDataWrapper(user.ID);
|
||||
return new ThumbnailsDataWrapper(ApiContext.Tenant, user.ID);
|
||||
}
|
||||
|
||||
[Delete("{userid}/photo")]
|
||||
@ -703,14 +703,14 @@ namespace ASC.Employee.Core.Controllers
|
||||
if (CoreContext.UserManager.IsSystemUser(user.ID))
|
||||
throw new SecurityException();
|
||||
|
||||
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(user.ID), Constants.Action_EditUser);
|
||||
|
||||
UserPhotoManager.RemovePhoto(user.ID);
|
||||
UserPhotoManager.RemovePhoto(ApiContext.Tenant, user.ID);
|
||||
|
||||
CoreContext.UserManager.SaveUserInfo(user);
|
||||
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
|
||||
MessageService.Send(MessageAction.UserDeletedAvatar, MessageTarget.Create(user.ID), user.DisplayUserName(false));
|
||||
|
||||
return new ThumbnailsDataWrapper(user.ID);
|
||||
return new ThumbnailsDataWrapper(ApiContext.Tenant, user.ID);
|
||||
}
|
||||
|
||||
|
||||
@ -722,7 +722,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
if (CoreContext.UserManager.IsSystemUser(user.ID))
|
||||
throw new SecurityException();
|
||||
|
||||
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(user.ID), Constants.Action_EditUser);
|
||||
|
||||
if (!string.IsNullOrEmpty(thumbnailsModel.TmpFile))
|
||||
{
|
||||
@ -732,18 +732,18 @@ namespace ASC.Employee.Core.Controllers
|
||||
var settings = new UserPhotoThumbnailSettings(thumbnailsModel.X, thumbnailsModel.Y, thumbnailsModel.Width, thumbnailsModel.Height);
|
||||
settings.SaveForUser(user.ID);
|
||||
|
||||
UserPhotoManager.SaveOrUpdatePhoto(user.ID, data);
|
||||
UserPhotoManager.SaveOrUpdatePhoto(ApiContext.Tenant, user.ID, data);
|
||||
UserPhotoManager.RemoveTempPhoto(fileName);
|
||||
}
|
||||
else
|
||||
{
|
||||
UserPhotoThumbnailManager.SaveThumbnails(thumbnailsModel.X, thumbnailsModel.Y, thumbnailsModel.Width, thumbnailsModel.Height, user.ID);
|
||||
UserPhotoThumbnailManager.SaveThumbnails(ApiContext.Tenant.TenantId, thumbnailsModel.X, thumbnailsModel.Y, thumbnailsModel.Width, thumbnailsModel.Height, user.ID);
|
||||
}
|
||||
|
||||
CoreContext.UserManager.SaveUserInfo(user);
|
||||
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
|
||||
MessageService.Send(MessageAction.UserUpdatedAvatarThumbnails, MessageTarget.Create(user.ID), user.DisplayUserName(false));
|
||||
|
||||
return new ThumbnailsDataWrapper(user.ID);
|
||||
return new ThumbnailsDataWrapper(ApiContext.Tenant, user.ID);
|
||||
}
|
||||
|
||||
|
||||
@ -751,7 +751,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
[Create("password", false)]
|
||||
public string SendUserPassword(string email)
|
||||
{
|
||||
var userInfo = UserManagerWrapper.SendUserPassword(email, MessageService, HttpContext);
|
||||
var userInfo = UserManagerWrapper.SendUserPassword(ApiContext.Tenant.TenantId, email, MessageService, HttpContext);
|
||||
|
||||
return string.Format(Resource.MessageYourPasswordSuccessfullySendedToEmail, userInfo.Email);
|
||||
}
|
||||
@ -759,11 +759,11 @@ namespace ASC.Employee.Core.Controllers
|
||||
[Update("{userid}/password")]
|
||||
public EmployeeWraperFull ChangeUserPassword(Guid userid, MemberModel memberModel)
|
||||
{
|
||||
SecurityContext.DemandPermissions(new UserSecurityProvider(userid), Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(userid), Constants.Action_EditUser);
|
||||
|
||||
if (!CoreContext.UserManager.UserExists(userid)) return null;
|
||||
if (!CoreContext.UserManager.UserExists(userid, ApiContext.Tenant.TenantId)) return null;
|
||||
|
||||
var user = CoreContext.UserManager.GetUsers(userid);
|
||||
var user = CoreContext.UserManager.GetUsers(userid, ApiContext.Tenant.TenantId);
|
||||
|
||||
if (CoreContext.UserManager.IsSystemUser(user.ID))
|
||||
throw new SecurityException();
|
||||
@ -775,7 +775,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
{
|
||||
user.Email = address.Address.ToLowerInvariant();
|
||||
user.ActivationStatus = EmployeeActivationStatus.Activated;
|
||||
CoreContext.UserManager.SaveUserInfo(user);
|
||||
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
|
||||
}
|
||||
}
|
||||
|
||||
@ -788,20 +788,20 @@ namespace ASC.Employee.Core.Controllers
|
||||
MessageService.Send(MessageAction.CookieSettingsUpdated);
|
||||
}
|
||||
|
||||
return new EmployeeWraperFull(GetUserInfo(userid.ToString()));
|
||||
return new EmployeeWraperFull(GetUserInfo(userid.ToString()), ApiContext);
|
||||
}
|
||||
|
||||
private static UserInfo GetUserInfo(string userNameOrId)
|
||||
private UserInfo GetUserInfo(string userNameOrId)
|
||||
{
|
||||
UserInfo user;
|
||||
try
|
||||
{
|
||||
var userId = new Guid(userNameOrId);
|
||||
user = CoreContext.UserManager.GetUsers(userId);
|
||||
user = CoreContext.UserManager.GetUsers(userId, ApiContext.Tenant.TenantId);
|
||||
}
|
||||
catch (FormatException)
|
||||
{
|
||||
user = CoreContext.UserManager.GetUserByUserName(userNameOrId);
|
||||
user = CoreContext.UserManager.GetUserByUserName(ApiContext.Tenant.TenantId, userNameOrId);
|
||||
}
|
||||
if (user == null || user.ID == Constants.LostUser.ID)
|
||||
throw new ItemNotFoundException("user not found");
|
||||
@ -814,13 +814,13 @@ namespace ASC.Employee.Core.Controllers
|
||||
var retuls = new List<EmployeeWraperFull>();
|
||||
foreach (var id in model.UserIds.Where(userId => !CoreContext.UserManager.IsSystemUser(userId)))
|
||||
{
|
||||
SecurityContext.DemandPermissions(new UserSecurityProvider(id), Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(id), Constants.Action_EditUser);
|
||||
var u = CoreContext.UserManager.GetUsers(id);
|
||||
if (u.ID == Constants.LostUser.ID || u.IsLDAP()) continue;
|
||||
|
||||
u.ActivationStatus = activationstatus;
|
||||
CoreContext.UserManager.SaveUserInfo(u);
|
||||
retuls.Add(new EmployeeWraperFull(u));
|
||||
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, u);
|
||||
retuls.Add(new EmployeeWraperFull(u, ApiContext));
|
||||
}
|
||||
|
||||
return retuls;
|
||||
@ -837,23 +837,23 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
foreach (var user in users)
|
||||
{
|
||||
if (user.IsOwner() || user.IsAdmin() || user.IsMe() || user.GetListAdminModules().Any())
|
||||
if (user.IsOwner(ApiContext.Tenant) || user.IsAdmin(ApiContext.Tenant) || user.IsMe() || user.GetListAdminModules(ApiContext.Tenant).Any())
|
||||
continue;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case EmployeeType.User:
|
||||
if (user.IsVisitor())
|
||||
if (user.IsVisitor(ApiContext.Tenant))
|
||||
{
|
||||
if (TenantStatisticsProvider.GetUsersCount() < TenantExtra.GetTenantQuota().ActiveUsers)
|
||||
if (TenantStatisticsProvider.GetUsersCount(ApiContext.Tenant) < TenantExtra.GetTenantQuota().ActiveUsers)
|
||||
{
|
||||
CoreContext.UserManager.RemoveUserFromGroup(user.ID, Constants.GroupVisitor.ID);
|
||||
CoreContext.UserManager.RemoveUserFromGroup(ApiContext.Tenant, user.ID, Constants.GroupVisitor.ID);
|
||||
WebItemSecurity.ClearCache();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EmployeeType.Visitor:
|
||||
CoreContext.UserManager.AddUserIntoGroup(user.ID, Constants.GroupVisitor.ID);
|
||||
CoreContext.UserManager.AddUserIntoGroup(ApiContext.Tenant, user.ID, Constants.GroupVisitor.ID);
|
||||
WebItemSecurity.ClearCache();
|
||||
break;
|
||||
}
|
||||
@ -861,13 +861,13 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
MessageService.Send(MessageAction.UsersUpdatedType, MessageTarget.Create(users.Select(x => x.ID)), users.Select(x => x.DisplayUserName(false)));
|
||||
|
||||
return users.Select(user => new EmployeeWraperFull(user));
|
||||
return users.Select(user => new EmployeeWraperFull(user, ApiContext));
|
||||
}
|
||||
|
||||
[Update("status/{status}")]
|
||||
public IEnumerable<EmployeeWraperFull> UpdateUserStatus(EmployeeStatus status, UpdateMembersModel model)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditUser);
|
||||
|
||||
var users = model.UserIds.Select(userId => CoreContext.UserManager.GetUsers(userId))
|
||||
.Where(u => !CoreContext.UserManager.IsSystemUser(u.ID) && !u.IsLDAP())
|
||||
@ -875,7 +875,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
foreach (var user in users)
|
||||
{
|
||||
if (user.IsOwner() || user.IsMe())
|
||||
if (user.IsOwner(ApiContext.Tenant) || user.IsMe())
|
||||
continue;
|
||||
|
||||
switch (status)
|
||||
@ -883,16 +883,16 @@ namespace ASC.Employee.Core.Controllers
|
||||
case EmployeeStatus.Active:
|
||||
if (user.Status == EmployeeStatus.Terminated)
|
||||
{
|
||||
if (TenantStatisticsProvider.GetUsersCount() < TenantExtra.GetTenantQuota().ActiveUsers || user.IsVisitor())
|
||||
if (TenantStatisticsProvider.GetUsersCount(ApiContext.Tenant) < TenantExtra.GetTenantQuota().ActiveUsers || user.IsVisitor(ApiContext.Tenant))
|
||||
{
|
||||
user.Status = EmployeeStatus.Active;
|
||||
CoreContext.UserManager.SaveUserInfo(user);
|
||||
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EmployeeStatus.Terminated:
|
||||
user.Status = EmployeeStatus.Terminated;
|
||||
CoreContext.UserManager.SaveUserInfo(user);
|
||||
CoreContext.UserManager.SaveUserInfo(ApiContext.Tenant, user);
|
||||
|
||||
HttpContext.ResetUserCookie(user.ID);
|
||||
MessageService.Send(MessageAction.CookieSettingsUpdated);
|
||||
@ -902,7 +902,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
MessageService.Send(MessageAction.UsersUpdatedStatus, MessageTarget.Create(users.Select(x => x.ID)), users.Select(x => x.DisplayUserName(false)));
|
||||
|
||||
return users.Select(user => new EmployeeWraperFull(user));
|
||||
return users.Select(user => new EmployeeWraperFull(user, ApiContext));
|
||||
}
|
||||
|
||||
|
||||
@ -920,7 +920,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
if (user.ActivationStatus == EmployeeActivationStatus.Pending)
|
||||
{
|
||||
if (user.IsVisitor())
|
||||
if (user.IsVisitor(ApiContext.Tenant))
|
||||
{
|
||||
StudioNotifyService.GuestInfoActivation(user);
|
||||
}
|
||||
@ -937,13 +937,13 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
MessageService.Send(MessageAction.UsersSentActivationInstructions, MessageTarget.Create(users.Select(x => x.ID)), users.Select(x => x.DisplayUserName(false)));
|
||||
|
||||
return users.Select(user => new EmployeeWraperFull(user));
|
||||
return users.Select(user => new EmployeeWraperFull(user, ApiContext));
|
||||
}
|
||||
|
||||
[Update("delete")]
|
||||
public IEnumerable<EmployeeWraperFull> RemoveUsers(UpdateMembersModel model)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_AddRemoveUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_AddRemoveUser);
|
||||
|
||||
CheckReassignProccess(model.UserIds);
|
||||
|
||||
@ -957,14 +957,14 @@ namespace ASC.Employee.Core.Controllers
|
||||
{
|
||||
if (user.Status != EmployeeStatus.Terminated) continue;
|
||||
|
||||
UserPhotoManager.RemovePhoto(user.ID);
|
||||
CoreContext.UserManager.DeleteUser(user.ID);
|
||||
UserPhotoManager.RemovePhoto(ApiContext.Tenant, user.ID);
|
||||
CoreContext.UserManager.DeleteUser(ApiContext.Tenant,user.ID);
|
||||
QueueWorkerRemove.Start(TenantProvider.CurrentTenantID, user, SecurityContext.CurrentAccount.ID, false);
|
||||
}
|
||||
|
||||
MessageService.Send(MessageAction.UsersDeleted, MessageTarget.Create(users.Select(x => x.ID)), userNames);
|
||||
|
||||
return users.Select(user => new EmployeeWraperFull(user));
|
||||
return users.Select(user => new EmployeeWraperFull(user, ApiContext));
|
||||
}
|
||||
|
||||
|
||||
@ -1037,7 +1037,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
[Read(@"reassign/progress")]
|
||||
public ReassignProgressItem GetReassignProgress(Guid userId)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditUser);
|
||||
|
||||
return QueueWorkerReassign.GetProgressItemStatus(TenantProvider.CurrentTenantID, userId);
|
||||
}
|
||||
@ -1045,7 +1045,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
[Update(@"reassign/terminate")]
|
||||
public void TerminateReassign(Guid userId)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditUser);
|
||||
|
||||
QueueWorkerReassign.Terminate(TenantProvider.CurrentTenantID, userId);
|
||||
}
|
||||
@ -1053,14 +1053,14 @@ namespace ASC.Employee.Core.Controllers
|
||||
[Create(@"reassign/start")]
|
||||
public ReassignProgressItem StartReassign(Guid fromUserId, Guid toUserId, bool deleteProfile)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditUser);
|
||||
|
||||
var fromUser = CoreContext.UserManager.GetUsers(fromUserId);
|
||||
|
||||
if (fromUser == null || fromUser.ID == Constants.LostUser.ID)
|
||||
throw new ArgumentException("User with id = " + fromUserId + " not found");
|
||||
|
||||
if (fromUser.IsOwner() || fromUser.IsMe() || fromUser.Status != EmployeeStatus.Terminated)
|
||||
if (fromUser.IsOwner(ApiContext.Tenant) || fromUser.IsMe() || fromUser.Status != EmployeeStatus.Terminated)
|
||||
throw new ArgumentException("Can not delete user with id = " + fromUserId);
|
||||
|
||||
var toUser = CoreContext.UserManager.GetUsers(toUserId);
|
||||
@ -1068,7 +1068,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
if (toUser == null || toUser.ID == Constants.LostUser.ID)
|
||||
throw new ArgumentException("User with id = " + toUserId + " not found");
|
||||
|
||||
if (toUser.IsVisitor() || toUser.Status == EmployeeStatus.Terminated)
|
||||
if (toUser.IsVisitor(ApiContext.Tenant) || toUser.Status == EmployeeStatus.Terminated)
|
||||
throw new ArgumentException("Can not reassign data to user with id = " + toUserId);
|
||||
|
||||
return QueueWorkerReassign.Start(TenantProvider.CurrentTenantID, fromUserId, toUserId, SecurityContext.CurrentAccount.ID, deleteProfile);
|
||||
@ -1096,7 +1096,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
[Read(@"remove/progress")]
|
||||
public RemoveProgressItem GetRemoveProgress(Guid userId)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditUser);
|
||||
|
||||
return QueueWorkerRemove.GetProgressItemStatus(TenantProvider.CurrentTenantID, userId);
|
||||
}
|
||||
@ -1104,7 +1104,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
[Update(@"remove/terminate")]
|
||||
public void TerminateRemove(Guid userId)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditUser);
|
||||
|
||||
QueueWorkerRemove.Terminate(TenantProvider.CurrentTenantID, userId);
|
||||
}
|
||||
@ -1112,14 +1112,14 @@ namespace ASC.Employee.Core.Controllers
|
||||
[Create(@"remove/start")]
|
||||
public RemoveProgressItem StartRemove(Guid userId)
|
||||
{
|
||||
SecurityContext.DemandPermissions(Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, Constants.Action_EditUser);
|
||||
|
||||
var user = CoreContext.UserManager.GetUsers(userId);
|
||||
|
||||
if (user == null || user.ID == Constants.LostUser.ID)
|
||||
throw new ArgumentException("User with id = " + userId + " not found");
|
||||
|
||||
if (user.IsOwner() || user.IsMe() || user.Status != EmployeeStatus.Terminated)
|
||||
if (user.IsOwner(ApiContext.Tenant) || user.IsMe() || user.Status != EmployeeStatus.Terminated)
|
||||
throw new ArgumentException("Can not delete user with id = " + userId);
|
||||
|
||||
return QueueWorkerRemove.Start(TenantProvider.CurrentTenantID, user, SecurityContext.CurrentAccount.ID, true);
|
||||
@ -1127,40 +1127,40 @@ namespace ASC.Employee.Core.Controllers
|
||||
|
||||
#endregion
|
||||
|
||||
private static void UpdateDepartments(IEnumerable<Guid> department, UserInfo user)
|
||||
private void UpdateDepartments(IEnumerable<Guid> department, UserInfo user)
|
||||
{
|
||||
if (!SecurityContext.CheckPermissions(Constants.Action_EditGroups)) return;
|
||||
if (!SecurityContext.CheckPermissions(ApiContext.Tenant, Constants.Action_EditGroups)) return;
|
||||
if (department == null) return;
|
||||
|
||||
var groups = CoreContext.UserManager.GetUserGroups(user.ID);
|
||||
var groups = CoreContext.UserManager.GetUserGroups(ApiContext.Tenant, user.ID);
|
||||
var managerGroups = new List<Guid>();
|
||||
foreach (var groupInfo in groups)
|
||||
{
|
||||
CoreContext.UserManager.RemoveUserFromGroup(user.ID, groupInfo.ID);
|
||||
var managerId = CoreContext.UserManager.GetDepartmentManager(groupInfo.ID);
|
||||
CoreContext.UserManager.RemoveUserFromGroup(ApiContext.Tenant, user.ID, groupInfo.ID);
|
||||
var managerId = CoreContext.UserManager.GetDepartmentManager(ApiContext.Tenant.TenantId, groupInfo.ID);
|
||||
if (managerId == user.ID)
|
||||
{
|
||||
managerGroups.Add(groupInfo.ID);
|
||||
CoreContext.UserManager.SetDepartmentManager(groupInfo.ID, Guid.Empty);
|
||||
CoreContext.UserManager.SetDepartmentManager(ApiContext.Tenant.TenantId, groupInfo.ID, Guid.Empty);
|
||||
}
|
||||
}
|
||||
foreach (var guid in department)
|
||||
{
|
||||
var userDepartment = CoreContext.UserManager.GetGroupInfo(guid);
|
||||
var userDepartment = CoreContext.UserManager.GetGroupInfo(ApiContext.Tenant.TenantId, guid);
|
||||
if (userDepartment != Constants.LostGroupInfo)
|
||||
{
|
||||
CoreContext.UserManager.AddUserIntoGroup(user.ID, guid);
|
||||
CoreContext.UserManager.AddUserIntoGroup(ApiContext.Tenant, user.ID, guid);
|
||||
if (managerGroups.Contains(guid))
|
||||
{
|
||||
CoreContext.UserManager.SetDepartmentManager(guid, user.ID);
|
||||
CoreContext.UserManager.SetDepartmentManager(ApiContext.Tenant.TenantId, guid, user.ID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void UpdateContacts(IEnumerable<Contact> contacts, UserInfo user)
|
||||
private void UpdateContacts(IEnumerable<Contact> contacts, UserInfo user)
|
||||
{
|
||||
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(user.ID), Constants.Action_EditUser);
|
||||
user.Contacts.Clear();
|
||||
if (contacts == null) return;
|
||||
|
||||
@ -1171,9 +1171,9 @@ namespace ASC.Employee.Core.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
private static void DeleteContacts(IEnumerable<Contact> contacts, UserInfo user)
|
||||
private void DeleteContacts(IEnumerable<Contact> contacts, UserInfo user)
|
||||
{
|
||||
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(user.ID), Constants.Action_EditUser);
|
||||
if (contacts == null) return;
|
||||
|
||||
foreach (var contact in contacts)
|
||||
@ -1194,7 +1194,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
return;
|
||||
}
|
||||
|
||||
SecurityContext.DemandPermissions(new UserSecurityProvider(user.ID), Constants.Action_EditUser);
|
||||
SecurityContext.DemandPermissions(ApiContext.Tenant, new UserSecurityProvider(user.ID), Constants.Action_EditUser);
|
||||
|
||||
if (!files.StartsWith("http://") && !files.StartsWith("https://"))
|
||||
{
|
||||
@ -1205,7 +1205,7 @@ namespace ASC.Employee.Core.Controllers
|
||||
using var inputStream = response.GetResponseStream();
|
||||
using var br = new BinaryReader(inputStream);
|
||||
var imageByteArray = br.ReadBytes((int)response.ContentLength);
|
||||
UserPhotoManager.SaveOrUpdatePhoto(user.ID, imageByteArray);
|
||||
UserPhotoManager.SaveOrUpdatePhoto(ApiContext.Tenant, user.ID, imageByteArray);
|
||||
}
|
||||
|
||||
private static void CheckImgFormat(byte[] data)
|
||||
|
@ -1,9 +0,0 @@
|
||||
namespace ASC.People
|
||||
{
|
||||
internal class JsonStringConverter
|
||||
{
|
||||
public JsonStringConverter()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
@ -41,11 +41,6 @@ namespace ASC.Web.Api.Models
|
||||
{
|
||||
}
|
||||
|
||||
public EmployeeWraper(UserInfo userInfo)
|
||||
: this(userInfo, null)
|
||||
{
|
||||
}
|
||||
|
||||
public EmployeeWraper(UserInfo userInfo, ApiContext httpContext)
|
||||
{
|
||||
Id = userInfo.ID;
|
||||
@ -59,7 +54,13 @@ namespace ASC.Web.Api.Models
|
||||
|
||||
if (httpContext.Check("avatarSmall"))
|
||||
{
|
||||
AvatarSmall = UserPhotoManager.GetSmallPhotoURL(userInfo.ID, out var isdef) + (isdef ? "" : $"?_={userInfoLM}");
|
||||
AvatarSmall = UserPhotoManager.GetSmallPhotoURL(httpContext.Tenant.TenantId, userInfo.ID, out var isdef) + (isdef ? "" : $"?_={userInfoLM}");
|
||||
}
|
||||
|
||||
if (Id != Guid.Empty)
|
||||
{
|
||||
var profileUrl = CommonLinkUtility.GetUserProfile(Id, userInfo.Tenant, false);
|
||||
ProfileUrl = CommonLinkUtility.GetFullAbsolutePath(httpContext.HttpContext, profileUrl);
|
||||
}
|
||||
}
|
||||
|
||||
@ -76,31 +77,23 @@ namespace ASC.Web.Api.Models
|
||||
public string AvatarSmall { get; set; }
|
||||
|
||||
[DataMember(Order = 30)]
|
||||
public string ProfileUrl
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Id == Guid.Empty) return string.Empty;
|
||||
var profileUrl = CommonLinkUtility.GetUserProfile(Id.ToString(), false);
|
||||
return CommonLinkUtility.GetFullAbsolutePath(profileUrl);
|
||||
}
|
||||
}
|
||||
public string ProfileUrl { get; set; }
|
||||
|
||||
public static EmployeeWraper Get(Guid userId)
|
||||
public static EmployeeWraper Get(Guid userId, ApiContext context)
|
||||
{
|
||||
try
|
||||
{
|
||||
return Get(CoreContext.UserManager.GetUsers(userId));
|
||||
return Get(CoreContext.UserManager.GetUsers(userId), context);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return Get(Constants.LostUser);
|
||||
return Get(Constants.LostUser, context);
|
||||
}
|
||||
}
|
||||
|
||||
public static EmployeeWraper Get(UserInfo userInfo)
|
||||
public static EmployeeWraper Get(UserInfo userInfo, ApiContext context)
|
||||
{
|
||||
return new EmployeeWraper(userInfo);
|
||||
return new EmployeeWraper(userInfo, context);
|
||||
}
|
||||
|
||||
public static EmployeeWraper GetSample()
|
||||
|
@ -124,16 +124,10 @@ namespace ASC.Web.Api.Models
|
||||
{
|
||||
}
|
||||
|
||||
public EmployeeWraperFull(UserInfo userInfo)
|
||||
: this(userInfo, null)
|
||||
{
|
||||
}
|
||||
|
||||
public EmployeeWraperFull(UserInfo userInfo, ApiContext context)
|
||||
: base(userInfo, context)
|
||||
{
|
||||
UserName = userInfo.UserName;
|
||||
IsVisitor = userInfo.IsVisitor();
|
||||
FirstName = userInfo.FirstName;
|
||||
LastName = userInfo.LastName;
|
||||
Birthday = (ApiDateTime)userInfo.BirthDate;
|
||||
@ -174,9 +168,11 @@ namespace ASC.Web.Api.Models
|
||||
|
||||
if (context.Check("groups") || context.Check("department"))
|
||||
{
|
||||
var groups = CoreContext.UserManager.GetUserGroups(userInfo.ID).Select(x => new GroupWrapperSummary(x)).ToList();
|
||||
var groups = CoreContext.UserManager.GetUserGroups(context.Tenant, userInfo.ID)
|
||||
.Select(x => new GroupWrapperSummary(x, context))
|
||||
.ToList();
|
||||
|
||||
if (groups.Any())
|
||||
if (groups.Count > 0)
|
||||
{
|
||||
Groups = groups;
|
||||
Department = string.Join(", ", Groups.Select(d => d.Name.HtmlEncode()));
|
||||
@ -191,31 +187,30 @@ namespace ASC.Web.Api.Models
|
||||
|
||||
if (context.Check("avatarMax"))
|
||||
{
|
||||
AvatarMax = UserPhotoManager.GetMaxPhotoURL(userInfo.ID, out var isdef) + (isdef ? "": $"?_={userInfoLM}");
|
||||
AvatarMax = UserPhotoManager.GetMaxPhotoURL(context.Tenant.TenantId, userInfo.ID, out var isdef) + (isdef ? "": $"?_={userInfoLM}");
|
||||
}
|
||||
|
||||
if (context.Check("avatarMedium"))
|
||||
{
|
||||
AvatarMedium = UserPhotoManager.GetMediumPhotoURL(userInfo.ID, out var isdef) + (isdef ? "" : $"?_={userInfoLM}");
|
||||
AvatarMedium = UserPhotoManager.GetMediumPhotoURL(context.Tenant.TenantId, userInfo.ID, out var isdef) + (isdef ? "" : $"?_={userInfoLM}");
|
||||
}
|
||||
|
||||
if (context.Check("avatar"))
|
||||
{
|
||||
Avatar = UserPhotoManager.GetBigPhotoURL(userInfo.ID, out var isdef) + (isdef ? "" : $"?_={userInfoLM}");
|
||||
Avatar = UserPhotoManager.GetBigPhotoURL(context.Tenant.TenantId, userInfo.ID, out var isdef) + (isdef ? "" : $"?_={userInfoLM}");
|
||||
}
|
||||
|
||||
IsAdmin = userInfo.IsAdmin();
|
||||
|
||||
if (context.Check("listAdminModules"))
|
||||
{
|
||||
var listAdminModules = userInfo.GetListAdminModules();
|
||||
var listAdminModules = userInfo.GetListAdminModules(context.Tenant);
|
||||
|
||||
if (listAdminModules.Any())
|
||||
ListAdminModules = listAdminModules;
|
||||
}
|
||||
|
||||
IsOwner = userInfo.IsOwner();
|
||||
|
||||
IsVisitor = userInfo.IsVisitor(context.Tenant);
|
||||
IsAdmin = userInfo.IsAdmin(context.Tenant);
|
||||
IsOwner = userInfo.IsOwner(context.Tenant);
|
||||
IsLDAP = userInfo.IsLDAP();
|
||||
IsSSO = userInfo.IsSSO();
|
||||
}
|
||||
@ -237,22 +232,22 @@ namespace ASC.Web.Api.Models
|
||||
}
|
||||
}
|
||||
|
||||
public static EmployeeWraperFull GetFull(Guid userId)
|
||||
public static EmployeeWraperFull GetFull(Guid userId, ApiContext context)
|
||||
{
|
||||
try
|
||||
{
|
||||
return GetFull(CoreContext.UserManager.GetUsers(userId));
|
||||
return GetFull(CoreContext.UserManager.GetUsers(userId), context);
|
||||
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return GetFull(ASC.Core.Users.Constants.LostUser);
|
||||
return GetFull(ASC.Core.Users.Constants.LostUser, context);
|
||||
}
|
||||
}
|
||||
|
||||
public static EmployeeWraperFull GetFull(UserInfo userInfo)
|
||||
public static EmployeeWraperFull GetFull(UserInfo userInfo, ApiContext context)
|
||||
{
|
||||
return new EmployeeWraperFull(userInfo);
|
||||
return new EmployeeWraperFull(userInfo, context);
|
||||
}
|
||||
|
||||
public new static EmployeeWraperFull GetSample()
|
||||
|
@ -28,6 +28,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
using ASC.Api.Core;
|
||||
using ASC.Core;
|
||||
using ASC.Core.Users;
|
||||
|
||||
@ -36,17 +37,17 @@ namespace ASC.Web.Api.Models
|
||||
[DataContract(Name = "group", Namespace = "")]
|
||||
public class GroupWrapperFull
|
||||
{
|
||||
public GroupWrapperFull(GroupInfo group, bool includeMembers)
|
||||
public GroupWrapperFull(GroupInfo group, bool includeMembers, ApiContext context)
|
||||
{
|
||||
Id = group.ID;
|
||||
Category = group.CategoryID;
|
||||
Parent = group.Parent != null ? group.Parent.ID : Guid.Empty;
|
||||
Name = group.Name;
|
||||
Manager = EmployeeWraper.Get(CoreContext.UserManager.GetUsers(CoreContext.UserManager.GetDepartmentManager(group.ID)));
|
||||
Manager = EmployeeWraper.Get(CoreContext.UserManager.GetUsers(CoreContext.UserManager.GetDepartmentManager(context.Tenant.TenantId, group.ID)), context);
|
||||
|
||||
if (includeMembers)
|
||||
{
|
||||
Members = new List<EmployeeWraper>(CoreContext.UserManager.GetUsersByGroup(group.ID).Select(EmployeeWraper.Get));
|
||||
Members = new List<EmployeeWraper>(CoreContext.UserManager.GetUsersByGroup(context.Tenant, group.ID).Select(r=> EmployeeWraper.Get(r, context)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
using System;
|
||||
using System.Runtime.Serialization;
|
||||
using ASC.Api.Core;
|
||||
using ASC.Core;
|
||||
using ASC.Core.Users;
|
||||
|
||||
@ -34,11 +35,11 @@ namespace ASC.Web.Api.Models
|
||||
[DataContract(Name = "group", Namespace = "")]
|
||||
public class GroupWrapperSummary
|
||||
{
|
||||
public GroupWrapperSummary(GroupInfo group)
|
||||
public GroupWrapperSummary(GroupInfo group, ApiContext context)
|
||||
{
|
||||
Id = group.ID;
|
||||
Name = group.Name;
|
||||
Manager = CoreContext.UserManager.GetUsers(CoreContext.UserManager.GetDepartmentManager(group.ID)).UserName;
|
||||
Manager = CoreContext.UserManager.GetUsers(CoreContext.UserManager.GetDepartmentManager(context.Tenant.TenantId, group.ID)).UserName;
|
||||
}
|
||||
|
||||
protected GroupWrapperSummary()
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
using System;
|
||||
using System.Runtime.Serialization;
|
||||
using ASC.Core.Tenants;
|
||||
using ASC.Web.Core.Users;
|
||||
|
||||
namespace ASC.Web.Api.Models
|
||||
@ -33,14 +34,14 @@ namespace ASC.Web.Api.Models
|
||||
[DataContract]
|
||||
public class ThumbnailsDataWrapper
|
||||
{
|
||||
public ThumbnailsDataWrapper(Guid userId)
|
||||
public ThumbnailsDataWrapper(Tenant tenant, Guid userId)
|
||||
{
|
||||
Original = UserPhotoManager.GetPhotoAbsoluteWebPath(userId);
|
||||
Retina = UserPhotoManager.GetRetinaPhotoURL(userId);
|
||||
Max = UserPhotoManager.GetMaxPhotoURL(userId);
|
||||
Big = UserPhotoManager.GetBigPhotoURL(userId);
|
||||
Medium = UserPhotoManager.GetMediumPhotoURL(userId);
|
||||
Small = UserPhotoManager.GetSmallPhotoURL(userId);
|
||||
Original = UserPhotoManager.GetPhotoAbsoluteWebPath(tenant, userId);
|
||||
Retina = UserPhotoManager.GetRetinaPhotoURL(tenant.TenantId, userId);
|
||||
Max = UserPhotoManager.GetMaxPhotoURL(tenant.TenantId, userId);
|
||||
Big = UserPhotoManager.GetBigPhotoURL(tenant.TenantId, userId);
|
||||
Medium = UserPhotoManager.GetMediumPhotoURL(tenant.TenantId, userId);
|
||||
Small = UserPhotoManager.GetSmallPhotoURL(tenant.TenantId, userId);
|
||||
}
|
||||
|
||||
private ThumbnailsDataWrapper()
|
||||
|
@ -18,13 +18,13 @@ namespace ASC.Web.Api.Controllers
|
||||
[Create(false)]
|
||||
public AuthenticationTokenData AuthenticateMe([FromBody]AuthModel auth)
|
||||
{
|
||||
var user = GetUser(auth.UserName, auth.Password);
|
||||
var tenant = CoreContext.TenantManager.GetCurrentTenant();
|
||||
var user = GetUser(tenant.TenantId, auth.UserName, auth.Password);
|
||||
|
||||
try
|
||||
{
|
||||
var token = SecurityContext.AuthenticateMe(user.ID);
|
||||
var tenant = CoreContext.TenantManager.GetCurrentTenant().TenantId;
|
||||
var expires = TenantCookieSettings.GetExpiresTime(tenant);
|
||||
var expires = TenantCookieSettings.GetExpiresTime(tenant.TenantId);
|
||||
|
||||
return new AuthenticationTokenData
|
||||
{
|
||||
@ -38,14 +38,14 @@ namespace ASC.Web.Api.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
private static UserInfo GetUser(string userName, string password)
|
||||
private static UserInfo GetUser(int tenantId, string userName, string password)
|
||||
{
|
||||
var user = CoreContext.UserManager.GetUsers(
|
||||
CoreContext.TenantManager.GetCurrentTenant().TenantId,
|
||||
tenantId,
|
||||
userName,
|
||||
Hasher.Base64Hash(password, HashAlg.SHA256));
|
||||
|
||||
if (user == null || !CoreContext.UserManager.UserExists(user.ID))
|
||||
if (user == null || !CoreContext.UserManager.UserExists(user.ID, tenantId))
|
||||
{
|
||||
throw new Exception("user not found");
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using ASC.Core;
|
||||
using ASC.Web.Api.Routing;
|
||||
using ASC.Web.Core;
|
||||
using ASC.Web.Core.WebZones;
|
||||
@ -15,7 +16,7 @@ namespace ASC.Web.Api.Controllers
|
||||
{
|
||||
var result = new List<string>();
|
||||
|
||||
foreach (var a in WebItemManager.Instance.GetItems(WebZoneType.StartProductList))
|
||||
foreach (var a in WebItemManager.Instance.GetItems(CoreContext.TenantManager.GetCurrentTenant(), WebZoneType.StartProductList))
|
||||
{
|
||||
result.Add(a.ApiURL);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
import React from 'react'
|
||||
import styled from 'styled-components'
|
||||
import styled, { css } from 'styled-components'
|
||||
import PropTypes from 'prop-types'
|
||||
import { Icons } from '../icons'
|
||||
import Link from '../link'
|
||||
@ -8,6 +8,14 @@ const whiteColor = '#FFFFFF';
|
||||
const avatarBackground = '#ECEEF1';
|
||||
const namedAvatarBackground = '#2DA7DB';
|
||||
|
||||
const noneUserSelect = css`
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
`;
|
||||
|
||||
const StyledAvatar = styled.div`
|
||||
position: relative;
|
||||
width: ${props =>
|
||||
@ -51,6 +59,8 @@ const ImageStyled = styled.img`
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
border-radius: 50%;
|
||||
|
||||
${noneUserSelect}
|
||||
`;
|
||||
|
||||
const AvatarWrapper = styled.div`
|
||||
@ -84,11 +94,7 @@ const NamedAvatar = styled.div`
|
||||
};
|
||||
color: ${whiteColor};
|
||||
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
${noneUserSelect}
|
||||
`;
|
||||
|
||||
const EditContainer = styled.div`
|
||||
|
@ -62,6 +62,12 @@ const StyledCheckbox = styled.div`
|
||||
const StyledAvatar = styled.div`
|
||||
flex: 0 0 32px;
|
||||
display: flex;
|
||||
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
`;
|
||||
|
||||
const StyledOptionButton = styled.div`
|
||||
|
@ -5,7 +5,6 @@ import SearchInput from '../search-input';
|
||||
import ComboBox from '../combobox'
|
||||
import IconButton from '../icon-button';
|
||||
|
||||
|
||||
const StyledFilterInput = styled.div`
|
||||
min-width: 380px;
|
||||
`;
|
||||
@ -27,35 +26,27 @@ const StyledComboBox = styled(ComboBox)`
|
||||
class FilterInput extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
|
||||
function getDefaultFilterData(){
|
||||
let filterData = props.getFilterData();
|
||||
let defaultFilterItems = [];
|
||||
props.defaultFilterData.filterValue.forEach(defaultfilterValue => {
|
||||
let filterValue = filterData.find(x => (x.key === defaultfilterValue.value && x.group === defaultfilterValue.key));
|
||||
if(filterValue != undefined){
|
||||
defaultfilterValue.label = filterValue.label;
|
||||
defaultfilterValue.groupLabel = filterData.find(x => (x.key === defaultfilterValue.key)).label;
|
||||
defaultFilterItems.push(defaultfilterValue);
|
||||
}
|
||||
});
|
||||
return defaultFilterItems;
|
||||
}
|
||||
this.state = {
|
||||
sortDirection: props.defaultFilterData ? props.defaultFilterData.sortDirection == "asc" ? true : false : false,
|
||||
sortId: props.defaultFilterData ?
|
||||
this.props.getSortData().findIndex(x => x.id === props.defaultFilterData.sortId) != -1 ? props.defaultFilterData.sortId : "" :
|
||||
this.props.getSortData().length > 0 ? this.props.getSortData()[0].id : "",
|
||||
sortDirection: props.selectedFilterData ? props.selectedFilterData.sortDirection == "asc" ? true : false : false,
|
||||
sortId: props.selectedFilterData ?
|
||||
this.props.getSortData().findIndex(x => x.key === props.selectedFilterData.sortId) != -1 ? props.selectedFilterData.sortId : "" :
|
||||
this.props.getSortData().length > 0 ? this.props.getSortData()[0].key : "",
|
||||
|
||||
filterValue: props.defaultFilterData ?
|
||||
getDefaultFilterData() :
|
||||
[],
|
||||
searchText: props.defaultFilterData ? props.defaultFilterData.inputValue : this.props.value
|
||||
filterValue: props.selectedFilterData ? props.selectedFilterData.filterValue : [],
|
||||
searchText: props.selectedFilterData ? props.selectedFilterData.inputValue : this.props.value
|
||||
};
|
||||
|
||||
this.timerId = null;
|
||||
this.isNew = true;
|
||||
this.isNeedUpdate = false;
|
||||
|
||||
this.updatedProps = {
|
||||
sortDirection: false,
|
||||
sortId: false,
|
||||
filterValue: false,
|
||||
searchText: false
|
||||
};
|
||||
|
||||
this.getSortData = this.getSortData.bind(this);
|
||||
this.onClickSortItem = this.onClickSortItem.bind(this);
|
||||
this.onSortDirectionClick = this.onSortDirectionClick.bind(this);
|
||||
this.onSearch = this.onSearch.bind(this);
|
||||
@ -66,33 +57,25 @@ class FilterInput extends React.Component {
|
||||
|
||||
}
|
||||
getDefaultSelectedIndex(){
|
||||
const sortData = this.getSortData();
|
||||
const sortData = this.props.getSortData();
|
||||
if(sortData.length > 0){
|
||||
let defaultIndex = sortData.findIndex(x => x.id === this.state.sortId);
|
||||
let defaultIndex = sortData.findIndex(x => x.key === this.state.sortId);
|
||||
return defaultIndex != -1 ? defaultIndex : 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
getSortData() {
|
||||
let _this = this;
|
||||
let d = this.props.getSortData();
|
||||
d.map(function (item) {
|
||||
item.key = item.id;
|
||||
return item;
|
||||
});
|
||||
return d;
|
||||
}
|
||||
onClickSortItem(item) {
|
||||
this.setState({ sortId: item.id });
|
||||
this.onFilter(this.state.filterValue, item.id, this.state.sortDirection ? "asc" : "desc");
|
||||
this.setState({ sortId: item.key });
|
||||
this.onFilter(this.state.filterValue, item.key, this.state.sortDirection ? "asc" : "desc");
|
||||
}
|
||||
onSortDirectionClick(e) {
|
||||
this.onFilter(this.state.filterValue, this.state.sortId, !this.state.sortDirection ? "asc" : "desc")
|
||||
this.isNeedUpdate = true;
|
||||
this.onFilter(this.state.filterValue, this.state.sortId, !this.state.sortDirection ? "asc" : "desc");
|
||||
this.setState({ sortDirection: !this.state.sortDirection });
|
||||
}
|
||||
onSearch(result) {
|
||||
this.setState({ filterValue: result.filterValue });
|
||||
this.onFilter(result.filterValue, this.state.sortId, this.state.sortDirection ? "asc" : "desc")
|
||||
this.onFilter(result.filterValue, this.state.sortId, this.state.sortDirection ? "asc" : "desc");
|
||||
}
|
||||
|
||||
onFilter(filterValue, sortId, sortDirection) {
|
||||
@ -101,7 +84,7 @@ class FilterInput extends React.Component {
|
||||
filterValue: filterValue,
|
||||
sortId: sortId,
|
||||
sortDirection: sortDirection
|
||||
}
|
||||
};
|
||||
this.props.onFilter(result);
|
||||
}
|
||||
|
||||
@ -116,11 +99,73 @@ class FilterInput extends React.Component {
|
||||
}
|
||||
|
||||
onSearchChanged(e) {
|
||||
this.setState({ searchText: e.target.value })
|
||||
this.isNeedUpdate = true;
|
||||
this.setState({ searchText: e.target.value });
|
||||
|
||||
if (this.props.autoRefresh)
|
||||
this.setFilterTimer();
|
||||
}
|
||||
componentDidUpdate(){
|
||||
if(this.isNeedUpdate){
|
||||
this.setState(
|
||||
{
|
||||
sortDirection: this.updatedProps.sortDirection ? this.props.selectedFilterData.sortDirection == "asc" ? true : false : this.state.sortDirection,
|
||||
sortId: this.updatedProps.sortId ? this.props.getSortData().findIndex(x => x.key === this.props.selectedFilterData.sortId) != -1 ? this.props.selectedFilterData.sortId : "" : this.state.sortId,
|
||||
filterValue: this.updatedProps.filterValue ? this.props.selectedFilterData.filterValue ? this.props.selectedFilterData.filterValue : [] : this.state.filterValue,
|
||||
searchText: this.updatedProps.searchText ? this.props.selectedFilterData.inputValue ? this.props.selectedFilterData.inputValue : this.props.value : this.state.searchText
|
||||
}
|
||||
);
|
||||
this.updatedProps={
|
||||
sortDirection: false,
|
||||
sortId: false,
|
||||
filterValue: false,
|
||||
searchText: false
|
||||
}
|
||||
}
|
||||
}
|
||||
shouldComponentUpdate(nextProps, nextState){
|
||||
if(!this.isNeedUpdate){
|
||||
for (let propsKey in this.props) {
|
||||
if(typeof this.props[propsKey] != "function" && typeof this.props[propsKey] != "object" && this.props[propsKey] != nextProps[propsKey]){
|
||||
this.isNeedUpdate = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(nextProps.selectedFilterData && this.props.selectedFilterData){
|
||||
if(this.props.selectedFilterData.filterValue.length != nextProps.selectedFilterData.filterValue.length){
|
||||
this.updatedProps.filterValue = true;
|
||||
this.isNeedUpdate = true;
|
||||
}else{
|
||||
let newFilterItems = nextProps.selectedFilterData.filterValue;
|
||||
let oldFilterItems = this.props.selectedFilterData.filterValue;
|
||||
|
||||
for(let i = 0; i < newFilterItems.length; i++){
|
||||
if(oldFilterItems.find(x => (x.key === newFilterItems[i].key && x.group === newFilterItems[i].group)) == undefined){
|
||||
this.updatedProps.filterValue = true;
|
||||
this.isNeedUpdate = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(nextProps.selectedFilterData.inputValue != this.props.selectedFilterData.inputValue){
|
||||
this.updatedProps.searchText = true;
|
||||
this.isNeedUpdate = true;
|
||||
}
|
||||
if(nextProps.selectedFilterData.sortDirection != this.props.selectedFilterData.sortDirection){
|
||||
this.updatedProps.sortDirection = true;
|
||||
this.isNeedUpdate = true;
|
||||
}
|
||||
if(nextProps.selectedFilterData.sortId != this.props.selectedFilterData.sortId){
|
||||
this.updatedProps.sortId = true;
|
||||
this.isNeedUpdate = true;
|
||||
}
|
||||
if(!this.isNeedUpdate) return false;
|
||||
else return true;
|
||||
}
|
||||
this.isNeedUpdate = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
render() {
|
||||
//console.log("FilterInput render");
|
||||
@ -138,16 +183,16 @@ class FilterInput extends React.Component {
|
||||
onSearchClick={this.onSearch}
|
||||
onChangeFilter={this.onSearch}
|
||||
value={this.state.searchText}
|
||||
defaultFilterData={this.state.filterValue}
|
||||
selectedFilterData={this.state.filterValue}
|
||||
onChange={this.onSearchChanged}
|
||||
/>
|
||||
</StyledSearchInput>
|
||||
|
||||
<StyledComboBox
|
||||
options={this.getSortData()}
|
||||
options={this.props.getSortData()}
|
||||
isDisabled={this.props.isDisabled}
|
||||
onSelect={this.onClickSortItem}
|
||||
selectedOption={this.getDefaultSelectedIndex()}
|
||||
selectedOption={this.state.sortId}
|
||||
>
|
||||
<StyledIconButton {...this.state}>
|
||||
<IconButton
|
||||
@ -171,12 +216,14 @@ class FilterInput extends React.Component {
|
||||
|
||||
FilterInput.protoTypes = {
|
||||
autoRefresh: PropTypes.bool,
|
||||
refreshTimeout: PropTypes.number
|
||||
refreshTimeout: PropTypes.number,
|
||||
selectedFilterData: PropTypes.object,
|
||||
};
|
||||
|
||||
FilterInput.defaultProps = {
|
||||
autoRefresh: true,
|
||||
refreshTimeout: 1000
|
||||
refreshTimeout: 1000,
|
||||
selectedFilterData: {}
|
||||
};
|
||||
|
||||
export default FilterInput;
|
@ -24,42 +24,50 @@ class IconButton extends React.Component{
|
||||
|
||||
|
||||
onMouseEnter(e){
|
||||
this.setState({
|
||||
currentIconName: this.props.iconHoverName ? this.props.iconHoverName : this.props.iconName,
|
||||
currentIconColor: this.props.hoverColor ? this.props.hoverColor : this.props.color
|
||||
});
|
||||
this.props.onMouseEnter && this.props.onMouseEnter(e);
|
||||
if(!this.props.isDisabled){
|
||||
this.setState({
|
||||
currentIconName: this.props.iconHoverName ? this.props.iconHoverName : this.props.iconName,
|
||||
currentIconColor: this.props.hoverColor ? this.props.hoverColor : this.props.color
|
||||
});
|
||||
this.props.onMouseEnter && this.props.onMouseEnter(e);
|
||||
}
|
||||
}
|
||||
onMouseLeave(e){
|
||||
this.setState({
|
||||
currentIconName: this.props.iconName,
|
||||
currentIconColor: this.props.color
|
||||
});
|
||||
this.props.onMouseDown && this.props.onMouseDown(e);
|
||||
if(!this.props.isDisabled){
|
||||
this.setState({
|
||||
currentIconName: this.props.iconName,
|
||||
currentIconColor: this.props.color
|
||||
});
|
||||
this.props.onMouseDown && this.props.onMouseDown(e);
|
||||
}
|
||||
}
|
||||
onMouseDown(e){
|
||||
this.setState({
|
||||
currentIconName: this.props.iconClickName ? this.props.iconClickName : this.props.iconName,
|
||||
currentIconColor: this.props.clickColor ? this.props.clickColor : this.props.color
|
||||
});
|
||||
this.props.onMouseDown && this.props.onMouseDown(e);
|
||||
if(!this.props.isDisabled){
|
||||
this.setState({
|
||||
currentIconName: this.props.iconClickName ? this.props.iconClickName : this.props.iconName,
|
||||
currentIconColor: this.props.clickColor ? this.props.clickColor : this.props.color
|
||||
});
|
||||
this.props.onMouseDown && this.props.onMouseDown(e);
|
||||
}
|
||||
}
|
||||
onMouseUp(e){
|
||||
switch (e.nativeEvent.which) {
|
||||
case 1: //Left click
|
||||
this.setState({
|
||||
currentIconName: this.props.iconHoverName ? this.props.iconHoverName : this.props.iconName,
|
||||
currentIconColor: this.props.iconHoverName ? this.props.iconHoverName : this.props.color
|
||||
});
|
||||
this.props.onClick && this.props.onClick(e);
|
||||
this.props.onMouseUp && this.props.onMouseUp(e);
|
||||
break;
|
||||
case 3://Right click
|
||||
this.props.onMouseUp && this.props.onMouseUp(e);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
if(!this.props.isDisabled){
|
||||
switch (e.nativeEvent.which) {
|
||||
case 1: //Left click
|
||||
this.setState({
|
||||
currentIconName: this.props.iconHoverName ? this.props.iconHoverName : this.props.iconName,
|
||||
currentIconColor: this.props.iconHoverName ? this.props.iconHoverName : this.props.color
|
||||
});
|
||||
this.props.onClick && this.props.onClick(e);
|
||||
this.props.onMouseUp && this.props.onMouseUp(e);
|
||||
break;
|
||||
case 3://Right click
|
||||
this.props.onMouseUp && this.props.onMouseUp(e);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
render(){
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user