Notify: fix culture

This commit is contained in:
pavelbannov 2023-09-21 14:38:55 +03:00
parent 12f4e8d180
commit 9cf550e1f0
10 changed files with 97 additions and 78 deletions

View File

@ -52,12 +52,12 @@ public class LdapNotifySource : INotifySource
await _ldapNotifyHelper.AutoSyncAsync(_tenant);
}
public IActionProvider GetActionProvider()
public Task<IActionProvider> GetActionProvider(NotifyRequest r)
{
throw new NotImplementedException();
}
public IPatternProvider GetPatternProvider()
public Task<IPatternProvider> GetPatternProvider(NotifyRequest r)
{
throw new NotImplementedException();
}

View File

@ -318,6 +318,39 @@ public class UserManager
return u != null && !u.Removed ? u : Constants.LostUser;
}
public async Task<UserInfo> SearchUserAsync(string id)
{
var result = Constants.LostUser;
if (32 <= id.Length)
{
var guid = default(Guid);
try
{
guid = new Guid(id);
}
catch (FormatException) { }
catch (OverflowException) { }
if (guid != default)
{
result = await GetUsersAsync(guid);
}
}
if (Constants.LostUser.Equals(result))
{
result = await GetUserByEmailAsync(id);
}
if (Constants.LostUser.Equals(result))
{
result = await GetUserByUserNameAsync(id);
}
return result;
}
public async Task<UserInfo[]> SearchAsync(string text, EmployeeStatus status)
{
return await SearchAsync(text, status, Guid.Empty);
@ -560,7 +593,7 @@ public class UserManager
var davUsersEmails = await GetDavUserEmailsAsync();
var requestUrlBook = _cardDavAddressbook.GetRadicaleUrl(myUri, delUser.Email.ToLower(), true, true);
if(rootAuthorization != null)
if (rootAuthorization != null)
{
var addBookCollection = await _cardDavAddressbook.GetCollection(requestUrlBook, userAuthorization, myUri.ToString());
if (addBookCollection.Completed && addBookCollection.StatusCode != 404)

View File

@ -36,8 +36,6 @@ public sealed class Context : INotifyRegistry
private readonly Dictionary<string, ISenderChannel> _channels = new Dictionary<string, ISenderChannel>(2);
public event Action<Context, INotifyClient> NotifyClientRegistration;
public void RegisterSender(DispatchEngine dispatchEngine, string senderName, ISink senderSink)
{
lock (_channels)

View File

@ -207,8 +207,8 @@ public class NotifyEngine
try
{
await PrepareRequestFillSendersAsync(request, serviceScope);
PrepareRequestFillPatterns(request, serviceScope);
PrepareRequestFillTags(request, serviceScope);
await PrepareRequestFillPatterns(request, serviceScope);
await PrepareRequestFillTags(request, serviceScope);
}
catch (Exception ex)
{
@ -310,7 +310,7 @@ public class NotifyEngine
noticeMessage.Pattern = pattern;
noticeMessage.ContentType = pattern.ContentType;
noticeMessage.AddArgument(request.Arguments.ToArray());
var patternProvider = request.GetPatternProvider(serviceScope);
var patternProvider = await request.GetPatternProvider(serviceScope);
var formatter = patternProvider.GetFormatter(pattern);
try
@ -375,7 +375,7 @@ public class NotifyEngine
}
}
private void PrepareRequestFillPatterns(NotifyRequest request, IServiceScope serviceScope)
private async Task PrepareRequestFillPatterns(NotifyRequest request, IServiceScope serviceScope)
{
if (request._patterns == null)
{
@ -385,7 +385,7 @@ public class NotifyEngine
return;
}
var apProvider = request.GetPatternProvider(serviceScope);
var apProvider = await request.GetPatternProvider(serviceScope);
for (var i = 0; i < request._senderNames.Length; i++)
{
var senderName = request._senderNames[i];
@ -404,9 +404,9 @@ public class NotifyEngine
}
}
private void PrepareRequestFillTags(NotifyRequest request, IServiceScope serviceScope)
private async Task PrepareRequestFillTags(NotifyRequest request, IServiceScope serviceScope)
{
var patternProvider = request.GetPatternProvider(serviceScope);
var patternProvider = await request.GetPatternProvider(serviceScope);
foreach (var pattern in request._patterns)
{
IPatternFormatter formatter;

View File

@ -125,14 +125,9 @@ public class NotifyRequest
return new NoticeMessage(recipient, NotifyAction, ObjectID);
}
public IActionProvider GetActionProvider(IServiceScope scope)
public async Task<IPatternProvider> GetPatternProvider(IServiceScope scope)
{
return ((INotifySource)scope.ServiceProvider.GetService(_notifySource.GetType())).GetActionProvider();
}
public IPatternProvider GetPatternProvider(IServiceScope scope)
{
return ((INotifySource)scope.ServiceProvider.GetService(_notifySource.GetType())).GetPatternProvider();
return await ((INotifySource)scope.ServiceProvider.GetService(_notifySource.GetType())).GetPatternProvider(this);
}
public IRecipientProvider GetRecipientsProvider(IServiceScope scope)

View File

@ -29,8 +29,8 @@ namespace ASC.Notify.Model;
public interface INotifySource
{
string Id { get; }
IActionProvider GetActionProvider();
IPatternProvider GetPatternProvider();
Task<IActionProvider> GetActionProvider(NotifyRequest r);
Task<IPatternProvider> GetPatternProvider(NotifyRequest r);
IRecipientProvider GetRecipientsProvider();
ISubscriptionProvider GetSubscriptionProvider();
}

View File

@ -33,14 +33,13 @@ public abstract class NotifySource : INotifySource
protected ISubscriptionProvider _subscriprionProvider;
protected IRecipientProvider _recipientsProvider;
protected IActionProvider ActionProvider => GetActionProvider();
protected IPatternProvider PatternProvider => GetPatternProvider();
public string Id { get; private set; }
private readonly UserManager _userManager;
private readonly SubscriptionManager _subscriptionManager;
private readonly TenantManager _tenantManager;
protected NotifySource(string id, UserManager userManager, IRecipientProvider recipientsProvider, SubscriptionManager subscriptionManager)
protected NotifySource(string id, UserManager userManager, IRecipientProvider recipientsProvider, SubscriptionManager subscriptionManager, TenantManager tenantManager)
{
ArgumentNullOrEmptyException.ThrowIfNullOrEmpty(id);
@ -48,18 +47,22 @@ public abstract class NotifySource : INotifySource
_userManager = userManager;
_recipientsProvider = recipientsProvider;
_subscriptionManager = subscriptionManager;
_tenantManager = tenantManager;
}
protected NotifySource(Guid id, UserManager userManager, IRecipientProvider recipientsProvider, SubscriptionManager subscriptionManager)
: this(id.ToString(), userManager, recipientsProvider, subscriptionManager)
protected NotifySource(Guid id, UserManager userManager, IRecipientProvider recipientsProvider, SubscriptionManager subscriptionManager, TenantManager tenantManager)
: this(id.ToString(), userManager, recipientsProvider, subscriptionManager, tenantManager)
{
}
public IActionProvider GetActionProvider()
public async Task<IActionProvider> GetActionProvider(NotifyRequest r)
{
var culture = await GetCulture(r);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
lock (_actions)
{
var culture = CultureInfo.CurrentCulture;
if (!_actions.ContainsKey(culture))
{
_actions[culture] = CreateActionProvider();
@ -69,15 +72,14 @@ public abstract class NotifySource : INotifySource
}
}
public IPatternProvider GetPatternProvider()
public async Task<IPatternProvider> GetPatternProvider(NotifyRequest r)
{
var culture = await GetCulture(r);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
lock (_patterns)
{
var culture = CultureInfo.CurrentCulture;
if (CultureInfo.CurrentUICulture != culture)
{
CultureInfo.CurrentUICulture = culture;
}
if (!_patterns.ContainsKey(culture))
{
_patterns[culture] = CreatePatternsProvider();
@ -115,4 +117,31 @@ public abstract class NotifySource : INotifySource
return new RecipientProviderImpl(_userManager)
?? throw new NotifyException("Provider IRecipientsProvider not instanced.");
}
private async Task<CultureInfo> GetCulture(NotifyRequest r)
{
var tagCulture = r.Arguments.FirstOrDefault(a => a.Tag == "Culture");
if (tagCulture != null)
{
return CultureInfo.GetCultureInfo((string)tagCulture.Value);
}
CultureInfo culture = null;
var tenant = await _tenantManager.GetCurrentTenantAsync(false);
if (tenant != null)
{
culture = tenant.GetCulture();
}
var user = await _userManager.SearchUserAsync(r.Recipient.ID);
if (!Users.Constants.LostUser.Equals(user) && !string.IsNullOrEmpty(user.CultureName))
{
culture = user.GetCulture();
}
return culture;
}
}

View File

@ -32,8 +32,8 @@ namespace ASC.Files.Core.Services.NotifyService;
[Scope]
public class NotifySource : NotifySourceBase
{
public NotifySource(UserManager userManager, IRecipientProvider recipientsProvider, SubscriptionManager subscriptionManager)
: base(new Guid("6FE286A4-479E-4c25-A8D9-0156E332B0C0"), userManager, recipientsProvider, subscriptionManager)
public NotifySource(UserManager userManager, IRecipientProvider recipientsProvider, SubscriptionManager subscriptionManager, TenantManager tenantManager)
: base(new Guid("6FE286A4-479E-4c25-A8D9-0156E332B0C0"), userManager, recipientsProvider, subscriptionManager, tenantManager)
{
}

View File

@ -182,38 +182,10 @@ public class ProductSecurityInterceptor
{
var tenant = _tenantManager.GetCurrentTenant();
if (32 <= r.Recipient.ID.Length)
{
var guid = default(Guid);
try
{
guid = new Guid(r.Recipient.ID);
}
catch (FormatException) { }
catch (OverflowException) { }
if (guid != default)
{
u = await _userManager.GetUsersAsync(guid);
}
}
if (Constants.LostUser.Equals(u))
{
u = await _userManager.GetUserByEmailAsync(r.Recipient.ID);
}
if (Constants.LostUser.Equals(u))
{
u = await _userManager.GetUserByUserNameAsync(r.Recipient.ID);
}
u = await _userManager.SearchUserAsync(r.Recipient.ID);
if (!Constants.LostUser.Equals(u))
{
var culture = !string.IsNullOrEmpty(u.CultureName) ? u.GetCulture() : tenant.GetCulture();
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
// security
var tag = r.Arguments.Find(a => a.Tag == CommonTags.ModuleID);
var productId = tag != null ? (Guid)tag.Value : Guid.Empty;
@ -232,14 +204,6 @@ public class ProductSecurityInterceptor
}
}
}
var tagCulture = r.Arguments.FirstOrDefault(a => a.Tag == CommonTags.Culture);
if (tagCulture != null)
{
var culture = CultureInfo.GetCultureInfo((string)tagCulture.Value);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
}
catch (Exception error)
{

View File

@ -29,8 +29,8 @@ namespace ASC.Web.Studio.Core.Notify;
[Scope]
public class StudioNotifySource : NotifySource
{
public StudioNotifySource(UserManager userManager, IRecipientProvider recipientsProvider, SubscriptionManager subscriptionManager)
: base("asc.web.studio", userManager, recipientsProvider, subscriptionManager)
public StudioNotifySource(UserManager userManager, IRecipientProvider recipientsProvider, SubscriptionManager subscriptionManager, TenantManager tenantManager)
: base("asc.web.studio", userManager, recipientsProvider, subscriptionManager, tenantManager)
{
}