DI: TenantManager

This commit is contained in:
pavelbannov 2019-09-18 15:14:15 +03:00
parent c171e2c903
commit 2f5fe4301e
20 changed files with 189 additions and 192 deletions

View File

@ -81,17 +81,17 @@ namespace ASC.Core.Common.Billing
}
}
public static string CreateCoupon()
public static string CreateCoupon(TenantManager tenantManager)
{
return CreatePromotionAsync().Result;
return CreatePromotionAsync(tenantManager).Result;
}
private static async Task<string> CreatePromotionAsync()
private static async Task<string> CreatePromotionAsync(TenantManager tenantManager)
{
try
{
using var httpClient = PrepaireClient();
using var content = new StringContent(await Promotion.GeneratePromotion(Percent, Schedule), Encoding.Default, "application/json");
using var content = new StringContent(await Promotion.GeneratePromotion(tenantManager, Percent, Schedule), Encoding.Default, "application/json");
using var response = await httpClient.PostAsync(string.Format("{0}/promotions/", ApiVersion), content);
if (!response.IsSuccessStatusCode)
throw new Exception(response.ReasonPhrase);
@ -195,11 +195,11 @@ namespace ASC.Core.Common.Billing
public int PublishToAffiliatesNetwork { get; set; }
public int AutoApply { get; set; }
public static async Task<string> GeneratePromotion(int percent, int schedule)
public static async Task<string> GeneratePromotion(TenantManager tenantManager, int percent, int schedule)
{
try
{
var tenant = CoreContext.TenantManager.GetCurrentTenant();
var tenant = tenantManager.GetCurrentTenant();
var startDate = DateTime.UtcNow.Date;
var endDate = startDate.AddDays(schedule);
var code = tenant.TenantAlias;

View File

@ -39,11 +39,13 @@ namespace ASC.Core.Notify.Jabber
public UserManager UserManager { get; }
public AuthContext AuthContext { get; }
public TenantManager TenantManager { get; }
public JabberServiceClient(UserManager userManager, AuthContext authContext)
public JabberServiceClient(UserManager userManager, AuthContext authContext, TenantManager tenantManager)
{
UserManager = userManager;
AuthContext = authContext;
TenantManager = tenantManager;
}
private static bool IsServiceProbablyNotAvailable()
@ -207,9 +209,9 @@ namespace ASC.Core.Notify.Jabber
}
}
private static int GetCurrentTenantId()
private int GetCurrentTenantId()
{
return CoreContext.TenantManager.GetCurrentTenant().TenantId;
return TenantManager.GetCurrentTenant().TenantId;
}
private string GetCurrentUserName()

View File

@ -52,7 +52,8 @@ namespace ASC.Core.Notify
try
{
using var scope = ServiceProvider.CreateScope();
var userManager = scope.ServiceProvider.GetService<UserManager>();
var userManager = scope.ServiceProvider.GetService<UserManager>();
var tenantManager = scope.ServiceProvider.GetService<TenantManager>();
var result = SendResult.OK;
var username = userManager.GetUsers(new Guid(message.Recipient.ID)).UserName;
if (string.IsNullOrEmpty(username))
@ -71,7 +72,7 @@ namespace ASC.Core.Notify
CreationDate = DateTime.UtcNow.Ticks,
};
var tenant = CoreContext.TenantManager.GetCurrentTenant(false);
var tenant = tenantManager.GetCurrentTenant(false);
m.Tenant = tenant == null ? Tenant.DEFAULT_TENANT : tenant.TenantId;
sender.Send(m);

View File

@ -32,19 +32,29 @@ using ASC.Core.Common.Notify.Push;
using ASC.Core.Configuration;
using ASC.Notify.Messages;
using ASC.Notify.Sinks;
using Microsoft.Extensions.DependencyInjection;
namespace ASC.Core.Common.Notify
{
class PushSenderSink : Sink
{
private readonly ILog _log = LogManager.GetLogger("ASC");
private bool configured = true;
public PushSenderSink(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
}
public IServiceProvider ServiceProvider { get; }
public override SendResponse ProcessMessage(INoticeMessage message)
{
try
{
{
using var scope = ServiceProvider.CreateScope();
var tenantManager = scope.ServiceProvider.GetService<TenantManager>();
var notification = new PushNotification
{
Module = GetTagValue<PushModule>(message, PushConstants.PushModuleTagName),
@ -61,10 +71,10 @@ namespace ASC.Core.Common.Notify
{
using var pushClient = new PushServiceClient();
pushClient.EnqueueNotification(
CoreContext.TenantManager.GetCurrentTenant().TenantId,
message.Recipient.ID,
notification,
new List<string>());
tenantManager.GetCurrentTenant().TenantId,
message.Recipient.ID,
notification,
new List<string>());
}
catch (InvalidOperationException)
{

View File

@ -51,27 +51,12 @@ namespace ASC.Data.Reassigns
protected static readonly ProgressQueue Queue = new ProgressQueue(1, TimeSpan.FromMinutes(5), true);
public IHttpContextAccessor HttpContextAccessor { get; }
public MessageService MessageService { get; }
public StudioNotifyService StudioNotifyService { get; }
public UserManager UserManager { get; }
public SecurityContext SecurityContext { get; }
public WebItemSecurity WebItemSecurity { get; }
public AuthContext AuthContext { get; }
public IServiceProvider ServiceProvider { get; }
public QueueWorker(
IHttpContextAccessor httpContextAccessor,
MessageService messageService,
StudioNotifyService studioNotifyService,
UserManager userManager,
SecurityContext securityContext,
WebItemSecurity webItemSecurity)
public QueueWorker(IHttpContextAccessor httpContextAccessor, IServiceProvider serviceProvider)
{
HttpContextAccessor = httpContextAccessor;
MessageService = messageService;
StudioNotifyService = studioNotifyService;
UserManager = userManager;
SecurityContext = securityContext;
WebItemSecurity = webItemSecurity;
ServiceProvider = serviceProvider;
}
public string GetProgressItemId(int tenantId, Guid userId)
@ -121,50 +106,33 @@ namespace ASC.Data.Reassigns
public class QueueWorkerReassign : QueueWorker<ReassignProgressItem>
{
public UserPhotoManager UserPhotoManager { get; }
public QueueWorkerRemove QueueWorkerRemove { get; }
public QueueWorkerReassign(
IHttpContextAccessor httpContextAccessor,
MessageService messageService,
StudioNotifyService studioNotifyService,
UserManager userManager,
UserPhotoManager userPhotoManager,
QueueWorkerRemove queueWorkerRemove,
SecurityContext securityContext,
WebItemSecurity webItemSecurity) :
base(httpContextAccessor, messageService, studioNotifyService, userManager, securityContext, webItemSecurity)
IServiceProvider serviceProvider,
QueueWorkerRemove queueWorkerRemove) :
base(httpContextAccessor, serviceProvider)
{
UserPhotoManager = userPhotoManager;
QueueWorkerRemove = queueWorkerRemove;
}
public ReassignProgressItem Start(int tenantId, Guid fromUserId, Guid toUserId, Guid currentUserId, bool deleteProfile)
{
return Start(tenantId, fromUserId, () => new ReassignProgressItem(HttpContextAccessor.HttpContext, MessageService, this, QueueWorkerRemove, StudioNotifyService, UserManager, UserPhotoManager, SecurityContext, tenantId, fromUserId, toUserId, currentUserId, deleteProfile)) as ReassignProgressItem;
return Start(tenantId, fromUserId, () => new ReassignProgressItem(ServiceProvider, HttpContextAccessor.HttpContext, this, QueueWorkerRemove, tenantId, fromUserId, toUserId, currentUserId, deleteProfile)) as ReassignProgressItem;
}
}
public class QueueWorkerRemove : QueueWorker<RemoveProgressItem>
{
public QueueWorkerRemove(IHttpContextAccessor httpContextAccessor,
MessageService messageService,
StudioNotifyService studioNotifyService,
UserManager userManager,
SecurityContext securityContext,
WebItemSecurity webItemSecurity,
WebItemManagerSecurity webItemManagerSecurity,
StorageFactory storageFactory) :
base(httpContextAccessor, messageService, studioNotifyService, userManager, securityContext, webItemSecurity)
public QueueWorkerRemove(
IHttpContextAccessor httpContextAccessor,
IServiceProvider serviceProvider) :
base(httpContextAccessor, serviceProvider)
{
WebItemManagerSecurity = webItemManagerSecurity;
StorageFactory = storageFactory;
}
public WebItemManagerSecurity WebItemManagerSecurity { get; }
public StorageFactory StorageFactory { get; }
public RemoveProgressItem Start(int tenantId, UserInfo user, Guid currentUserId, bool notify)
{
return Start(tenantId, user.ID, () => new RemoveProgressItem(HttpContextAccessor.HttpContext, MessageService, this, StudioNotifyService, SecurityContext, WebItemManagerSecurity, StorageFactory, tenantId, user, currentUserId, notify)) as RemoveProgressItem;
return Start(tenantId, user.ID, () => new RemoveProgressItem(ServiceProvider, HttpContextAccessor.HttpContext, this, tenantId, user, currentUserId, notify)) as RemoveProgressItem;
}
}
}

View File

@ -32,8 +32,10 @@ using ASC.Common.Threading.Progress;
using ASC.Core;
using ASC.Core.Tenants;
using ASC.Core.Users;
using ASC.Data.Storage;
using ASC.MessagingSystem;
//using ASC.Web.CRM.Core;
using ASC.Web.Core;
//using ASC.Web.CRM.Core;
using ASC.Web.Core.Users;
//using ASC.Web.Files.Services.WCFService;
//using ASC.Web.Projects.Core.Engine;
@ -41,6 +43,7 @@ using ASC.Web.Studio.Core.Notify;
//using Autofac;
//using CrmDaoFactory = ASC.CRM.Core.Dao.DaoFactory;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
namespace ASC.Data.Reassigns
{
@ -63,32 +66,19 @@ namespace ASC.Data.Reassigns
public bool IsCompleted { get; set; }
public Guid FromUser { get; }
public Guid ToUser { get; }
public MessageService MessageService { get; }
public IServiceProvider ServiceProvider { get; }
public QueueWorkerRemove QueueWorkerRemove { get; }
public StudioNotifyService StudioNotifyService { get; }
public UserManager UserManager { get; }
public UserPhotoManager UserPhotoManager { get; }
public SecurityContext SecurityContext { get; }
public ReassignProgressItem(
IServiceProvider serviceProvider,
HttpContext context,
MessageService messageService,
QueueWorkerReassign queueWorkerReassign,
QueueWorkerRemove queueWorkerRemove,
StudioNotifyService studioNotifyService,
UserManager userManager,
UserPhotoManager userPhotoManager,
SecurityContext securityContext,
int tenantId, Guid fromUserId, Guid toUserId, Guid currentUserId, bool deleteProfile)
{
{
ServiceProvider = serviceProvider;
_context = context;
MessageService = messageService;
QueueWorkerRemove = queueWorkerRemove;
StudioNotifyService = studioNotifyService;
UserManager = userManager;
UserPhotoManager = userPhotoManager;
SecurityContext = securityContext;
_httpHeaders = QueueWorker.GetHttpHeaders(context.Request);
_tenantId = tenantId;
@ -109,15 +99,24 @@ namespace ASC.Data.Reassigns
public void RunJob()
{
var logger = LogManager.GetLogger("ASC.Web");
var logger = LogManager.GetLogger("ASC.Web");
using var scope = ServiceProvider.CreateScope();
var tenantManager = scope.ServiceProvider.GetService<TenantManager>();
var tenant = tenantManager.SetCurrentTenant(_tenantId);
var messageService = scope.ServiceProvider.GetService<MessageService>();
var studioNotifyService = scope.ServiceProvider.GetService<StudioNotifyService>();
var securityContext = scope.ServiceProvider.GetService<SecurityContext>();
var userManager = scope.ServiceProvider.GetService<UserManager>();
var userPhotoManager = scope.ServiceProvider.GetService<UserPhotoManager>();
try
{
Percentage = 0;
Status = ProgressStatus.Started;
var tenant = CoreContext.TenantManager.SetCurrentTenant(_tenantId);
SecurityContext.AuthenticateMe(_tenantId, _currentUserId);
securityContext.AuthenticateMe(_tenantId, _currentUserId);
logger.InfoFormat("reassignment of data from {0} to {1}", FromUser, ToUser);
@ -146,14 +145,14 @@ namespace ASC.Data.Reassigns
//}
}
SendSuccessNotify();
SendSuccessNotify(userManager, studioNotifyService, messageService);
Percentage = 100;
Status = ProgressStatus.Done;
if (_deleteProfile)
{
DeleteUserProfile(tenant);
DeleteUserProfile(userManager, userPhotoManager, messageService);
}
}
catch (Exception ex)
@ -161,7 +160,7 @@ namespace ASC.Data.Reassigns
logger.Error(ex);
Status = ProgressStatus.Failed;
Error = ex.Message;
SendErrorNotify(ex.Message);
SendErrorNotify(userManager, studioNotifyService, ex.Message);
}
finally
{
@ -175,43 +174,43 @@ namespace ASC.Data.Reassigns
return MemberwiseClone();
}
private void SendSuccessNotify()
private void SendSuccessNotify(UserManager userManager, StudioNotifyService studioNotifyService, MessageService messageService)
{
var fromUser = UserManager.GetUsers(FromUser);
var toUser = UserManager.GetUsers(ToUser);
var fromUser = userManager.GetUsers(FromUser);
var toUser = userManager.GetUsers(ToUser);
StudioNotifyService.SendMsgReassignsCompleted(_currentUserId, fromUser, toUser);
studioNotifyService.SendMsgReassignsCompleted(_currentUserId, fromUser, toUser);
var fromUserName = fromUser.DisplayUserName(false, UserManager);
var toUserName = toUser.DisplayUserName(false, UserManager);
var fromUserName = fromUser.DisplayUserName(false, userManager);
var toUserName = toUser.DisplayUserName(false, userManager);
if (_httpHeaders != null)
MessageService.Send(_httpHeaders, MessageAction.UserDataReassigns, MessageTarget.Create(FromUser), new[] { fromUserName, toUserName });
messageService.Send(_httpHeaders, MessageAction.UserDataReassigns, MessageTarget.Create(FromUser), new[] { fromUserName, toUserName });
else
MessageService.Send(MessageAction.UserDataReassigns, MessageTarget.Create(FromUser), fromUserName, toUserName);
messageService.Send(MessageAction.UserDataReassigns, MessageTarget.Create(FromUser), fromUserName, toUserName);
}
private void SendErrorNotify(string errorMessage)
private void SendErrorNotify(UserManager userManager, StudioNotifyService studioNotifyService, string errorMessage)
{
var fromUser = UserManager.GetUsers(FromUser);
var toUser = UserManager.GetUsers(ToUser);
var fromUser = userManager.GetUsers(FromUser);
var toUser = userManager.GetUsers(ToUser);
StudioNotifyService.SendMsgReassignsFailed(_currentUserId, fromUser, toUser, errorMessage);
studioNotifyService.SendMsgReassignsFailed(_currentUserId, fromUser, toUser, errorMessage);
}
private void DeleteUserProfile(Tenant tenant)
private void DeleteUserProfile(UserManager userManager, UserPhotoManager userPhotoManager, MessageService messageService)
{
var user = UserManager.GetUsers(FromUser);
var userName = user.DisplayUserName(false, UserManager);
var user = userManager.GetUsers(FromUser);
var userName = user.DisplayUserName(false, userManager);
UserPhotoManager.RemovePhoto(user.ID);
UserManager.DeleteUser(user.ID);
userPhotoManager.RemovePhoto(user.ID);
userManager.DeleteUser(user.ID);
QueueWorkerRemove.Start(_tenantId, user, _currentUserId, false);
if (_httpHeaders != null)
MessageService.Send(_httpHeaders, MessageAction.UserDeleted, MessageTarget.Create(FromUser), new[] { userName });
messageService.Send(_httpHeaders, MessageAction.UserDeleted, MessageTarget.Create(FromUser), new[] { userName });
else
MessageService.Send(MessageAction.UserDeleted, MessageTarget.Create(FromUser), userName);
messageService.Send(MessageAction.UserDeleted, MessageTarget.Create(FromUser), userName);
}
}
}

View File

@ -43,12 +43,12 @@ using ASC.Web.Core;
using ASC.Web.Studio.Core.Notify;
//using CrmDaoFactory = ASC.CRM.Core.Dao.DaoFactory;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
namespace ASC.Data.Reassigns
{
public class RemoveProgressItem : IProgressItem
{
private readonly HttpContext _context;
private readonly Dictionary<string, string> _httpHeaders;
private readonly int _tenantId;
@ -65,35 +65,17 @@ namespace ASC.Data.Reassigns
public double Percentage { get; set; }
public bool IsCompleted { get; set; }
public Guid FromUser { get; }
public IServiceProvider ServiceProvider { get; }
public UserInfo User { get; }
public MessageService MessageService { get; }
public StudioNotifyService StudioNotifyService { get; }
public UserManager UserManager { get; }
public SecurityContext SecurityContext { get; }
public WebItemSecurity WebItemSecurity { get; }
public AuthContext AuthContext { get; }
public WebItemManagerSecurity WebItemManagerSecurity { get; }
public StorageFactory StorageFactory { get; }
public RemoveProgressItem(
IServiceProvider serviceProvider,
HttpContext context,
MessageService messageService,
QueueWorkerRemove queueWorkerRemove,
StudioNotifyService studioNotifyService,
SecurityContext securityContext,
WebItemManagerSecurity webItemManagerSecurity,
StorageFactory storageFactory,
int tenantId, UserInfo user, Guid currentUserId, bool notify)
{
_context = context;
MessageService = messageService;
StudioNotifyService = studioNotifyService;
SecurityContext = securityContext;
WebItemManagerSecurity = webItemManagerSecurity;
StorageFactory = storageFactory;
_httpHeaders = QueueWorker.GetHttpHeaders(context.Request);
{
_httpHeaders = QueueWorker.GetHttpHeaders(context.Request);
ServiceProvider = serviceProvider;
_tenantId = tenantId;
User = user;
FromUser = user.ID;
@ -113,18 +95,27 @@ namespace ASC.Data.Reassigns
public void RunJob()
{
var logger = LogManager.GetLogger("ASC.Web");
var logger = LogManager.GetLogger("ASC.Web");
using var scope = ServiceProvider.CreateScope();
var tenantManager = scope.ServiceProvider.GetService<TenantManager>();
var tenant = tenantManager.SetCurrentTenant(_tenantId);
var messageService = scope.ServiceProvider.GetService<MessageService>();
var studioNotifyService = scope.ServiceProvider.GetService<StudioNotifyService>();
var securityContext = scope.ServiceProvider.GetService<SecurityContext>();
var webItemManagerSecurity = scope.ServiceProvider.GetService<WebItemManagerSecurity>();
var storageFactory = scope.ServiceProvider.GetService<StorageFactory>();
try
{
Percentage = 0;
Status = ProgressStatus.Started;
Status = ProgressStatus.Started;
var tenant = CoreContext.TenantManager.SetCurrentTenant(_tenantId);
SecurityContext.AuthenticateMe(_tenantId, _currentUserId);
securityContext.AuthenticateMe(_tenantId, _currentUserId);
long crmSpace;
GetUsageSpace(out var docsSpace, out var mailSpace, out var talkSpace);
GetUsageSpace(webItemManagerSecurity, out var docsSpace, out var mailSpace, out var talkSpace);
logger.InfoFormat("deleting user data for {0} ", FromUser);
@ -158,9 +149,9 @@ namespace ASC.Data.Reassigns
logger.Info("deleting of data from talk");
Percentage = 99;
DeleteTalkStorage();
DeleteTalkStorage(storageFactory);
SendSuccessNotify(docsSpace, crmSpace, mailSpace, talkSpace);
SendSuccessNotify(studioNotifyService, messageService, docsSpace, crmSpace, mailSpace, talkSpace);
Percentage = 100;
Status = ProgressStatus.Done;
@ -170,7 +161,7 @@ namespace ASC.Data.Reassigns
logger.Error(ex);
Status = ProgressStatus.Failed;
Error = ex.Message;
SendErrorNotify(ex.Message);
SendErrorNotify(studioNotifyService, ex.Message);
}
finally
{
@ -184,11 +175,11 @@ namespace ASC.Data.Reassigns
return MemberwiseClone();
}
private void GetUsageSpace(out long docsSpace, out long mailSpace, out long talkSpace)
private void GetUsageSpace(WebItemManagerSecurity webItemManagerSecurity, out long docsSpace, out long mailSpace, out long talkSpace)
{
docsSpace = mailSpace = talkSpace = 0;
var webItems = WebItemManagerSecurity.GetItems(Web.Core.WebZones.WebZoneType.All, ItemAvailableState.All);
var webItems = webItemManagerSecurity.GetItems(Web.Core.WebZones.WebZoneType.All, ItemAvailableState.All);
foreach (var item in webItems)
{
@ -217,7 +208,7 @@ namespace ASC.Data.Reassigns
}
}
private void DeleteTalkStorage()
private void DeleteTalkStorage(StorageFactory storageFactory)
{
using var md5 = MD5.Create();
var data = md5.ComputeHash(Encoding.Default.GetBytes(FromUser.ToString()));
@ -231,7 +222,7 @@ namespace ASC.Data.Reassigns
var md5Hash = sBuilder.ToString();
var storage = StorageFactory.GetStorage(_tenantId.ToString(CultureInfo.InvariantCulture), "talk");
var storage = storageFactory.GetStorage(_tenantId.ToString(CultureInfo.InvariantCulture), "talk");
if (storage != null && storage.IsDirectory(md5Hash))
{
@ -239,23 +230,23 @@ namespace ASC.Data.Reassigns
}
}
private void SendSuccessNotify(long docsSpace, long crmSpace, long mailSpace, long talkSpace)
private void SendSuccessNotify(StudioNotifyService studioNotifyService, MessageService messageService, long docsSpace, long crmSpace, long mailSpace, long talkSpace)
{
if (_notify)
StudioNotifyService.SendMsgRemoveUserDataCompleted(_currentUserId, User, _userName,
studioNotifyService.SendMsgRemoveUserDataCompleted(_currentUserId, User, _userName,
docsSpace, crmSpace, mailSpace, talkSpace);
if (_httpHeaders != null)
MessageService.Send(_httpHeaders, MessageAction.UserDataRemoving, MessageTarget.Create(FromUser), new[] { _userName });
messageService.Send(_httpHeaders, MessageAction.UserDataRemoving, MessageTarget.Create(FromUser), new[] { _userName });
else
MessageService.Send(MessageAction.UserDataRemoving, MessageTarget.Create(FromUser), _userName);
messageService.Send(MessageAction.UserDataRemoving, MessageTarget.Create(FromUser), _userName);
}
private void SendErrorNotify(string errorMessage)
private void SendErrorNotify(StudioNotifyService studioNotifyService, string errorMessage)
{
if (!_notify) return;
StudioNotifyService.SendMsgRemoveUserDataFailed(_currentUserId, User, _userName, errorMessage);
studioNotifyService.SendMsgRemoveUserDataFailed(_currentUserId, User, _userName, errorMessage);
}
}
}

View File

@ -87,6 +87,7 @@ namespace ASC.Api.Settings
private static DistributedTaskQueue SMTPTasks { get; } = new DistributedTaskQueue("smtpOperations");
public Tenant Tenant { get { return ApiContext.Tenant; } }
public ApiContext ApiContext { get; }
public IServiceProvider ServiceProvider { get; }
public LogManager LogManager { get; }
public MessageService MessageService { get; }
public StudioNotifyService StudioNotifyService { get; }
@ -126,7 +127,9 @@ namespace ASC.Api.Settings
public EmailValidationKeyProvider EmailValidationKeyProvider { get; }
public TenantUtil TenantUtil { get; }
public SettingsController(LogManager logManager,
public SettingsController(
IServiceProvider serviceProvider,
LogManager logManager,
MessageService messageService,
StudioNotifyService studioNotifyService,
ApiContext apiContext,
@ -165,6 +168,7 @@ namespace ASC.Api.Settings
EmailValidationKeyProvider emailValidationKeyProvider,
TenantUtil tenantUtil)
{
ServiceProvider = serviceProvider;
LogManager = logManager;
MessageService = messageService;
StudioNotifyService = studioNotifyService;
@ -246,7 +250,7 @@ namespace ASC.Api.Settings
throw new InvalidOperationException(Resource.LdapSettingsTooManyOperations);
}
var op = new QuotaSync(Tenant.TenantId, StorageFactory, StorageFactoryConfig);
var op = new QuotaSync(Tenant.TenantId, ServiceProvider);
quotaTasks.QueueTask(op.RunJob, op.GetDistributedTask());
}

View File

@ -26,6 +26,7 @@
using System;
using ASC.Common.Caching;
using ASC.Core;
using ASC.Core.Common.Notify.Push;
namespace ASC.Web.Core.Mobile
@ -36,13 +37,16 @@ namespace ASC.Web.Core.Mobile
private readonly TimeSpan cacheExpiration;
private readonly IMobileAppInstallRegistrator registrator;
public CachedMobileAppInstallRegistrator(IMobileAppInstallRegistrator registrator)
: this(registrator, TimeSpan.FromMinutes(30))
public TenantManager TenantManager { get; }
public CachedMobileAppInstallRegistrator(IMobileAppInstallRegistrator registrator, TenantManager tenantManager)
: this(registrator, TimeSpan.FromMinutes(30), tenantManager)
{
}
public CachedMobileAppInstallRegistrator(IMobileAppInstallRegistrator registrator, TimeSpan cacheExpiration)
public CachedMobileAppInstallRegistrator(IMobileAppInstallRegistrator registrator, TimeSpan cacheExpiration, TenantManager tenantManager)
{
TenantManager = tenantManager;
this.registrator = registrator ?? throw new ArgumentNullException("registrator");
this.cacheExpiration = cacheExpiration;
}
@ -72,11 +76,11 @@ namespace ASC.Web.Core.Mobile
return isRegistered;
}
private static string GetCacheKey(string userEmail, MobileAppType? appType)
private string GetCacheKey(string userEmail, MobileAppType? appType)
{
var cacheKey = appType.HasValue ? userEmail + "/" + appType.ToString() : userEmail;
return string.Format("{0}:mobile:{1}", ASC.Core.CoreContext.TenantManager.GetCurrentTenant().TenantId, cacheKey);
return string.Format("{0}:mobile:{1}", TenantManager.GetCurrentTenant().TenantId, cacheKey);
}
}
}

View File

@ -123,6 +123,7 @@ namespace ASC.Web.Studio.Core.Notify
{
try
{
//fix
using var scope = ServiceProvider.CreateScope();
var webItemSecurity = scope.ServiceProvider.GetService<WebItemSecurity>();
// culture

View File

@ -301,7 +301,7 @@ namespace ASC.Web.Studio.Core.Notify
client.SendNoticeAsync(Actions.UserHasJoin, null);
}
public void SendJoinMsg(int tenantId, string email, EmployeeType emplType)
public void SendJoinMsg(string email, EmployeeType emplType)
{
var inviteUrl = CommonLinkUtility.GetConfirmationUrl(EmailValidationKeyProvider, email, ConfirmType.EmpInvite, (int)emplType, AuthContext.CurrentAccount.ID)
+ string.Format("&emplType={0}", emplType);
@ -314,7 +314,7 @@ namespace ASC.Web.Studio.Core.Notify
new[] { EMailSenderName },
new TagValue(Tags.InviteLink, inviteUrl),
TagValues.GreenButton(greenButtonText, inviteUrl),
TagValues.SendFrom(tenantId, UserManager, AuthContext));
TagValues.SendFrom(TenantManager, UserManager, AuthContext));
}
public void UserInfoAddedAfterInvite(int tenantId, UserInfo newUserInfo)
@ -438,7 +438,7 @@ namespace ASC.Web.Studio.Core.Notify
TagValues.GreenButton(greenButtonText, confirmationUrl),
new TagValue(Tags.UserName, newUserInfo.FirstName.HtmlEncode()),
new TagValue(CommonTags.Footer, footer),
TagValues.SendFrom(tenantId, UserManager, AuthContext),
TagValues.SendFrom(TenantManager, UserManager, AuthContext),
new TagValue(CommonTags.Analytics, analytics));
}
@ -474,7 +474,7 @@ namespace ASC.Web.Studio.Core.Notify
TagValues.GreenButton(greenButtonText, confirmationUrl),
new TagValue(Tags.UserName, newUserInfo.FirstName.HtmlEncode()),
new TagValue(CommonTags.Footer, footer),
TagValues.SendFrom(tenantId, UserManager, AuthContext),
TagValues.SendFrom(TenantManager, UserManager, AuthContext),
new TagValue(CommonTags.Analytics, analytics));
}
@ -550,7 +550,7 @@ namespace ASC.Web.Studio.Core.Notify
new TagValue(Tags.Message, message));
}
public void SendAdminWelcome(UserInfo newUserInfo, int tenantId)
public void SendAdminWelcome(UserInfo newUserInfo)
{
if (!UserManager.UserExists(newUserInfo)) return;
@ -591,7 +591,7 @@ namespace ASC.Web.Studio.Core.Notify
}
tagValues.Add(new TagValue(Tags.UserName, newUserInfo.FirstName.HtmlEncode()));
tagValues.Add(TagValues.SendFrom(tenantId, UserManager, AuthContext));
tagValues.Add(TagValues.SendFrom(TenantManager, UserManager, AuthContext));
client.SendNoticeToAsync(
notifyAction,
@ -795,7 +795,7 @@ namespace ASC.Web.Studio.Core.Notify
new TagValue(CommonTags.Culture, Thread.CurrentThread.CurrentUICulture.Name));
}
public void SendUserWelcomePersonal(int tenantId, UserInfo newUserInfo)
public void SendUserWelcomePersonal(UserInfo newUserInfo)
{
client.SendNoticeToAsync(
CoreContext.Configuration.CustomMode ? Actions.PersonalCustomModeAfterRegistration1 : Actions.PersonalAfterRegistration1,
@ -803,7 +803,7 @@ namespace ASC.Web.Studio.Core.Notify
new[] { EMailSenderName },
new TagValue(CommonTags.Footer, CoreContext.Configuration.CustomMode ? "personalCustomMode" : "personal"),
new TagValue(CommonTags.MasterTemplate, "HtmlMasterPersonal"),
TagValues.SendFrom(tenantId, UserManager, AuthContext));
TagValues.SendFrom(TenantManager, UserManager, AuthContext));
}
#endregion

View File

@ -15,16 +15,18 @@ namespace ASC.Web.Core.Notify
public StudioNotifyHelper StudioNotifyHelper { get; }
public AuthContext AuthContext { get; }
public TenantManager TenantManager { get; }
static StudioNotifyServiceHelper()
{
cache = new KafkaCache<NotifyItem>();
}
public StudioNotifyServiceHelper(StudioNotifyHelper studioNotifyHelper, AuthContext authContext)
public StudioNotifyServiceHelper(StudioNotifyHelper studioNotifyHelper, AuthContext authContext, TenantManager tenantManager)
{
StudioNotifyHelper = studioNotifyHelper;
AuthContext = authContext;
TenantManager = tenantManager;
}
public void SendNoticeToAsync(INotifyAction action, IRecipient[] recipients, string[] senderNames, params ITagValue[] args)
@ -69,7 +71,7 @@ namespace ASC.Web.Core.Notify
{
var item = new NotifyItem
{
TenantId = CoreContext.TenantManager.GetCurrentTenant().TenantId,
TenantId = TenantManager.GetCurrentTenant().TenantId,
UserId = AuthContext.CurrentAccount.ID.ToString(),
Action = (NotifyAction)action,
CheckSubsciption = checkSubsciption

View File

@ -299,7 +299,7 @@ namespace ASC.Web.Studio.Core.Notify
coupon = SetupInfo.IsSecretEmail(userManager.GetUsers(tenant.OwnerId).Email)
? tenant.TenantAlias
: CouponManager.CreateCoupon();
: CouponManager.CreateCoupon(tenantManager);
log.InfoFormat("end CreateCoupon to {0} coupon = {1}", tenant.TenantAlias, coupon);
}

View File

@ -157,7 +157,7 @@ namespace ASC.Web.Studio.Core.Notify
return new TagActionValue("TableItem" + number, action);
}
public static ITagValue SendFrom(int tenantId, UserManager userManager, AuthContext authContext)
public static ITagValue SendFrom(TenantManager tenantManager, UserManager userManager, AuthContext authContext)
{
return new TagValue(CommonTags.SendFrom,
authContext.IsAuthenticated && authContext.CurrentAccount is IUserAccount
@ -165,7 +165,7 @@ namespace ASC.Web.Studio.Core.Notify
userManager.GetUsers(authContext.CurrentAccount.ID), false)
.Replace(">", "&#62")
.Replace("<", "&#60")
: CoreContext.TenantManager.GetCurrentTenant().Name);
: tenantManager.GetCurrentTenant().Name);
}
}
}

View File

@ -24,12 +24,14 @@
*/
using System;
using System.Linq;
using System.Threading;
using ASC.Common.Threading;
using ASC.Core;
using ASC.Data.Storage;
using Microsoft.Extensions.DependencyInjection;
namespace ASC.Web.Studio.Core.Quota
{
public class QuotaSync
@ -37,29 +39,32 @@ namespace ASC.Web.Studio.Core.Quota
public const string TenantIdKey = "tenantID";
protected DistributedTask TaskInfo { get; private set; }
private int TenantId { get; set; }
public StorageFactory StorageFactory { get; }
public StorageFactoryConfig StorageFactoryConfig { get; }
public IServiceProvider ServiceProvider { get; }
public QuotaSync(int tenantId, StorageFactory storageFactory, StorageFactoryConfig storageFactoryConfig)
public QuotaSync(int tenantId, IServiceProvider serviceProvider)
{
TenantId = tenantId;
StorageFactory = storageFactory;
StorageFactoryConfig = storageFactoryConfig;
TaskInfo = new DistributedTask();
TaskInfo = new DistributedTask();
ServiceProvider = serviceProvider;
}
public void RunJob(DistributedTask _, CancellationToken cancellationToken)
{
CoreContext.TenantManager.SetCurrentTenant(TenantId);
{
var scope = ServiceProvider.CreateScope();
var tenantManager = scope.ServiceProvider.GetService<TenantManager>();
tenantManager.SetCurrentTenant(TenantId);
var storageFactoryConfig = scope.ServiceProvider.GetService<StorageFactoryConfig>();
var storageFactory = scope.ServiceProvider.GetService<StorageFactory>();
var storageModules = StorageFactoryConfig.GetModuleList(string.Empty).ToList();
var storageModules = storageFactoryConfig.GetModuleList(string.Empty).ToList();
foreach (var module in storageModules)
{
var storage = StorageFactory.GetStorage(TenantId.ToString(), module);
var storage = storageFactory.GetStorage(TenantId.ToString(), module);
storage.ResetQuota("");
var domains = StorageFactoryConfig.GetDomainList(string.Empty, module).ToList();
var domains = storageFactoryConfig.GetDomainList(string.Empty, module).ToList();
foreach (var domain in domains)
{
storage.ResetQuota(domain);

View File

@ -34,7 +34,7 @@ using ASC.Core.Tenants;
namespace ASC.Web.Core.Sms
{
public static class SmsKeyStorage
public class SmsKeyStorage
{
public static readonly int KeyLength;
public static readonly TimeSpan StoreInterval;
@ -44,6 +44,8 @@ namespace ASC.Web.Core.Sms
private static readonly ICache KeyCache = AscCache.Memory;
private static readonly ICache CheckCache = AscCache.Memory;
public TenantManager TenantManager { get; }
static SmsKeyStorage()
{
if (!int.TryParse(ConfigurationManager.AppSettings["sms:keylength"], out KeyLength))
@ -66,15 +68,20 @@ namespace ASC.Web.Core.Sms
KeyCacheNotify.Subscribe(r => KeyCache.Remove(r.Key), CacheNotifyAction.Remove);
}
private static string BuildCacheKey(string phone)
public SmsKeyStorage(TenantManager tenantManager)
{
var tenant = CoreContext.TenantManager.GetCurrentTenant(false);
TenantManager = tenantManager;
}
private string BuildCacheKey(string phone)
{
var tenant = TenantManager.GetCurrentTenant(false);
var tenantCache = tenant == null ? Tenant.DEFAULT_TENANT : tenant.TenantId;
return "smskey" + phone + tenantCache;
}
public static bool GenerateKey(string phone, out string key)
public bool GenerateKey(string phone, out string key)
{
if (string.IsNullOrEmpty(phone))
{
@ -99,7 +106,7 @@ namespace ASC.Web.Core.Sms
}
}
public static bool ExistsKey(string phone)
public bool ExistsKey(string phone)
{
if (string.IsNullOrEmpty(phone))
{
@ -115,7 +122,7 @@ namespace ASC.Web.Core.Sms
}
public static Result ValidateKey(string phone, string key)
public Result ValidateKey(string phone, string key)
{
key = (key ?? string.Empty).Trim();
if (string.IsNullOrEmpty(phone) || string.IsNullOrEmpty(key))

View File

@ -42,19 +42,22 @@ namespace ASC.Web.Studio.Core.SMS
public SecurityContext SecurityContext { get; }
public TenantManager TenantManager { get; }
public StudioSmsNotificationSettings StudioSmsNotificationSettings { get; }
public SmsKeyStorage SmsKeyStorage { get; }
public SmsManager(
UserManager userManager,
TenantExtra tenantExtra,
SecurityContext securityContext,
TenantManager tenantManager,
StudioSmsNotificationSettings studioSmsNotificationSettings)
StudioSmsNotificationSettings studioSmsNotificationSettings,
SmsKeyStorage smsKeyStorage)
{
UserManager = userManager;
TenantExtra = tenantExtra;
SecurityContext = securityContext;
TenantManager = tenantManager;
StudioSmsNotificationSettings = studioSmsNotificationSettings;
SmsKeyStorage = smsKeyStorage;
}
public string SaveMobilePhone(UserInfo user, string mobilePhone)
@ -103,7 +106,7 @@ namespace ASC.Web.Studio.Core.SMS
if (SmsKeyStorage.ExistsKey(mobilePhone) && !again) return;
if (!SmsKeyStorage.GenerateKey(mobilePhone, out var key)) throw new Exception(Resource.SmsTooMuchError);
if (SmsSender.SendSMS(mobilePhone, string.Format(Resource.SmsAuthenticationMessageToUser, key)))
if (SmsSender.SendSMS(TenantManager, mobilePhone, string.Format(Resource.SmsAuthenticationMessageToUser, key)))
{
TenantManager.SetTenantQuotaRow(new TenantQuotaRow { Tenant = TenantManager.GetCurrentTenant().TenantId, Path = "/sms", Counter = 1 }, true);
}

View File

@ -39,7 +39,7 @@ namespace ASC.Web.Core.Sms
private static readonly ILog Log = LogManager.GetLogger("ASC");
public static bool SendSMS(string number, string message)
public static bool SendSMS(TenantManager tenantManager, string number, string message)
{
if (string.IsNullOrEmpty(number))
{
@ -56,7 +56,7 @@ namespace ASC.Web.Core.Sms
if ("log".Equals(ConfigurationManager.AppSettings["core:notify:postman"], StringComparison.InvariantCultureIgnoreCase))
{
var tenant = CoreContext.TenantManager.GetCurrentTenant(false);
var tenant = tenantManager.GetCurrentTenant(false);
var tenantId = tenant == null ? Tenant.DEFAULT_TENANT : tenant.TenantId;
Log.InfoFormat("Tenant {0} send sms to phoneNumber {1} Message: {2}", tenantId, number, message);

View File

@ -146,7 +146,7 @@ namespace ASC.Web.Core.Users
if (CoreContext.Configuration.Personal)
{
StudioNotifyService.SendUserWelcomePersonal(Tenant.TenantId, newUserInfo);
StudioNotifyService.SendUserWelcomePersonal(newUserInfo);
return newUserInfo;
}

View File

@ -68,7 +68,7 @@ namespace ASC.Web.Studio.UserControls.Statistics
public IEnumerable<TenantQuotaRow> GetQuotaRows(int tenant)
{
return CoreContext.TenantManager.FindTenantQuotaRows(new TenantQuotaRowQuery(tenant))
return TenantManager.FindTenantQuotaRows(new TenantQuotaRowQuery(tenant))
.Where(r => !string.IsNullOrEmpty(r.Tag) && new Guid(r.Tag) != Guid.Empty);
}
}