From c74d9541afd3fbc9bf531c65bd411314b4f69d88 Mon Sep 17 00:00:00 2001 From: Sukhorukov Anton Date: Fri, 19 Jan 2024 12:38:41 +0300 Subject: [PATCH 01/33] fix Bug 65354 --- .../Tasks/BackupPortalTask.cs | 12 ++- .../Tasks/PortalTaskBase.cs | 78 ++----------------- 2 files changed, 11 insertions(+), 79 deletions(-) diff --git a/common/ASC.Data.Backup.Core/Tasks/BackupPortalTask.cs b/common/ASC.Data.Backup.Core/Tasks/BackupPortalTask.cs index 30f4f79b496..16d7f077a43 100644 --- a/common/ASC.Data.Backup.Core/Tasks/BackupPortalTask.cs +++ b/common/ASC.Data.Backup.Core/Tasks/BackupPortalTask.cs @@ -453,7 +453,7 @@ private void SaveToFile(string path, string t, IReadOnlyCollection colum { _logger.DebugSaveTable(t); List portion; - while ((portion = data.Take(BatchLimit).ToList()).Count > 0) + while ((portion = data.Take(BatchLimit).ToList()).Any()) { using (var sw = new StreamWriter(path, true)) using (var writer = new JsonTextWriter(sw)) @@ -470,26 +470,24 @@ private void SaveToFile(string path, string t, IReadOnlyCollection colum for (var i = 0; i < obj.Length; i++) { - var value = obj[i]; - if (value is byte[] byteArray && byteArray.Length != 0) + var byteArray = obj[i] as byte[]; + if (byteArray != null && byteArray.Length != 0) { sw.Write("0x"); foreach (var b in byteArray) - { sw.Write("{0:x2}", b); - } } else { var s = obj[i] as string; if (s != null) { - sw.Write("'" + s.Replace("\r", "\\r").Replace("\n", "\\n") + "'"); + sw.Write("'" + s.Replace("\\", "\\\\").Replace("\r", "\\r").Replace("'", "\\'").Replace("\n", "\\n") + "'"); } else { var ser = new JsonSerializer(); - ser.Serialize(writer, value); + ser.Serialize(writer, obj[i]); } } if (i != obj.Length - 1) diff --git a/common/ASC.Data.Backup.Core/Tasks/PortalTaskBase.cs b/common/ASC.Data.Backup.Core/Tasks/PortalTaskBase.cs index 9c4de1b08fc..cb842dcb52c 100644 --- a/common/ASC.Data.Backup.Core/Tasks/PortalTaskBase.cs +++ b/common/ASC.Data.Backup.Core/Tasks/PortalTaskBase.cs @@ -291,7 +291,6 @@ protected void RunMysqlFile(string file, bool db = false) { while ((commandText = await reader.ReadLineAsync()) != null) { - var sb = new StringBuilder(commandText); while (!commandText.EndsWith(delimiter)) { var newline = await reader.ReadLineAsync(); @@ -299,12 +298,11 @@ protected void RunMysqlFile(string file, bool db = false) { break; } - sb.Append(newline); + commandText += newline; } - commandText = sb.ToString(); + try { - commandText = commandText.Replace("\\r", "\r").Replace("\\n", "\n"); command = connection.CreateCommand(); command.CommandText = commandText; await command.ExecuteNonQueryAsync(); @@ -313,74 +311,10 @@ protected void RunMysqlFile(string file, bool db = false) { try { - if (commandText.StartsWith("REPLACE INTO")) - { - var innerValues = commandText.Split(',').ToList(); - for (var i = 0; i < innerValues.Count(); i++) - { - var flag1 = false; - var flag2 = false; - if (innerValues[i].StartsWith("(")) - { - flag1 = true; - innerValues[i] = innerValues[i].TrimStart('('); - } - else if (innerValues[i].EndsWith(")") && !innerValues[i].StartsWith("'") - || innerValues[i].EndsWith("')") && innerValues[i] != "')") - { - flag2 = true; - innerValues[i] = innerValues[i].TrimEnd(')'); - } - if (i == innerValues.Count() - 1) - { - innerValues[i] = innerValues[i].Remove(innerValues[i].Length - 2, 2); - } - if (innerValues[i].StartsWith("\'") && ((!innerValues[i].EndsWith("\'") || innerValues[i] == "'") - || i != innerValues.Count() - 1 && (!innerValues[i + 1].StartsWith("\'") && innerValues[i + 1].EndsWith("\'") && !innerValues[i + 1].StartsWith("(\'") || innerValues[i + 1] == "'"))) - { - innerValues[i] += "," + innerValues[i + 1]; - innerValues.RemoveAt(i + 1); - } - if (innerValues[i].StartsWith("\'") && innerValues[i].EndsWith("\'")) - { - if (innerValues[i] != "''") - { - var sw = new StringWriter(); - await sw.WriteAsync("0x"); - foreach (var b in Encoding.UTF8.GetBytes(innerValues[i].Trim('\''))) - { - sw.Write("{0:x2}", b); - } - - innerValues[i] = string.Format("CONVERT({0} USING utf8)", sw); - } - } - if (flag1) - { - innerValues[i] = "(" + innerValues[i]; - } - else if (flag2) - { - innerValues[i] = innerValues[i] + ")"; - } - if (i == innerValues.Count() - 1) - { - innerValues[i] = innerValues[i] + ");"; - } - } - - commandText = string.Join(",", innerValues); - command = connection.CreateCommand(); - command.CommandText = commandText; - await command.ExecuteNonQueryAsync(); - } - else - { - await Task.Delay(1000);//avoiding deadlock - command = connection.CreateCommand(); - command.CommandText = commandText; - await command.ExecuteNonQueryAsync(); - } + Thread.Sleep(2000);//avoiding deadlock + command = connection.CreateCommand(); + command.CommandText = commandText; + await command.ExecuteNonQueryAsync(); } catch (Exception ex) { From f6f7c2a4db9839ece9b03ef3931b683d4de94cda Mon Sep 17 00:00:00 2001 From: Andrey Savihin Date: Tue, 23 Jan 2024 16:53:10 +0300 Subject: [PATCH 02/33] ASC.Web.Core: Notify: fixed ArgumentNullException: Value cannot be null. (Parameter 'source') --- web/ASC.Web.Core/Notify/StudioNotifyServiceSender.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/ASC.Web.Core/Notify/StudioNotifyServiceSender.cs b/web/ASC.Web.Core/Notify/StudioNotifyServiceSender.cs index 021c2a4d9d5..48a15cb979d 100644 --- a/web/ASC.Web.Core/Notify/StudioNotifyServiceSender.cs +++ b/web/ASC.Web.Core/Notify/StudioNotifyServiceSender.cs @@ -165,7 +165,7 @@ await client.SendNoticeToAsync( item.Recipients?.Select(r => r.IsGroup ? new RecipientsGroup(r.Id, r.Name) : (IRecipient)new DirectRecipient(r.Id, r.Name, r.Addresses?.ToArray(), r.CheckActivation)).ToArray(), item.SenderNames != null && item.SenderNames.Count > 0 ? item.SenderNames.ToArray() : null, item.CheckSubsciption, - item.Tags.Select(r => new TagValue(r.Key, r.Value)).ToArray()); + item.Tags?.Select(r => new TagValue(r.Key, r.Value)).ToArray()); } } From cd682e97085ea949ac19cc3c451501f10c83ea2f Mon Sep 17 00:00:00 2001 From: Andrey Savihin Date: Tue, 23 Jan 2024 19:42:33 +0300 Subject: [PATCH 03/33] ASC.Core.Common: Notify: additional logging --- common/ASC.Core.Common/Log/NotifyEngineLogger.cs | 4 ++-- common/ASC.Core.Common/Notify/Engine/NotifyEngine.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/ASC.Core.Common/Log/NotifyEngineLogger.cs b/common/ASC.Core.Common/Log/NotifyEngineLogger.cs index ef887db9f28..345e5ccf110 100644 --- a/common/ASC.Core.Common/Log/NotifyEngineLogger.cs +++ b/common/ASC.Core.Common/Log/NotifyEngineLogger.cs @@ -44,8 +44,8 @@ public static partial class NotifyEngineLogger [LoggerMessage(Level = LogLevel.Error, Message = "NotifySender")] public static partial void ErrorNotifySender(this ILogger logger, Exception exception); - [LoggerMessage(Level = LogLevel.Error, Message = "Prepare")] - public static partial void ErrorPrepare(this ILogger logger, Exception exception); + [LoggerMessage(Level = LogLevel.Error, Message = "Prepare {action} {recipient}")] + public static partial void ErrorPrepare(this ILogger logger, Exception exception, INotifyAction action, IRecipient recipient); [LoggerMessage(Level = LogLevel.Error, Message = "UpdateScheduleDate")] public static partial void ErrorUpdateScheduleDate(this ILogger logger, Exception exception); diff --git a/common/ASC.Core.Common/Notify/Engine/NotifyEngine.cs b/common/ASC.Core.Common/Notify/Engine/NotifyEngine.cs index 2f5d8caf021..e627d461cdb 100644 --- a/common/ASC.Core.Common/Notify/Engine/NotifyEngine.cs +++ b/common/ASC.Core.Common/Notify/Engine/NotifyEngine.cs @@ -213,7 +213,7 @@ private async Task> SendDirectNotifyAsync(NotifyRequest reque catch (Exception ex) { responses.Add(new SendResponse(request.NotifyAction, null, request.Recipient, SendResult.Impossible)); - _logger.ErrorPrepare(ex); + _logger.ErrorPrepare(ex, request.NotifyAction, request.Recipient); } if (request._senderNames is { Length: > 0 }) From 815b739360c35954dd5217cf05fca9967f2c928e Mon Sep 17 00:00:00 2001 From: Alexey Bannov Date: Tue, 23 Jan 2024 20:48:15 +0300 Subject: [PATCH 04/33] rabbitmq: fixed --- common/ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/common/ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs b/common/ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs index 17340529145..765a090034d 100644 --- a/common/ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs +++ b/common/ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs @@ -275,13 +275,7 @@ private async Task Consumer_Received(object sender, BasicDeliverEventArgs eventA } await ProcessEvent(eventName, @event); - - _consumerChannel.BasicAck(eventArgs.DeliveryTag, multiple: false); - } - catch (AlreadyClosedException ex) - { - _logger.ErrorProcessingMessage(message, ex); - } + } catch (IntegrationEventRejectExeption ex) { _logger.ErrorProcessingMessage(message, ex); @@ -300,11 +294,15 @@ private async Task Consumer_Received(object sender, BasicDeliverEventArgs eventA _logger.DebugNackEvent(eventName); } + + return; } catch (Exception ex) { _logger.ErrorProcessingMessage(message, ex); } + + _consumerChannel.BasicAck(eventArgs.DeliveryTag, multiple: false); } private IModel CreateConsumerChannel() From f59c921bf50d465dbe8ade8e4d6da548de910e9b Mon Sep 17 00:00:00 2001 From: Alexey Bannov Date: Tue, 23 Jan 2024 20:48:46 +0300 Subject: [PATCH 05/33] rabbitmq: dll version update --- common/ASC.Common/ASC.Common.csproj | 2 +- common/ASC.EventBus.RabbitMQ/ASC.EventBus.RabbitMQ.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/ASC.Common/ASC.Common.csproj b/common/ASC.Common/ASC.Common.csproj index a66be2b42a7..ec8c69a169f 100644 --- a/common/ASC.Common/ASC.Common.csproj +++ b/common/ASC.Common/ASC.Common.csproj @@ -59,7 +59,7 @@ - + diff --git a/common/ASC.EventBus.RabbitMQ/ASC.EventBus.RabbitMQ.csproj b/common/ASC.EventBus.RabbitMQ/ASC.EventBus.RabbitMQ.csproj index ab95c01d531..6a220819aae 100644 --- a/common/ASC.EventBus.RabbitMQ/ASC.EventBus.RabbitMQ.csproj +++ b/common/ASC.EventBus.RabbitMQ/ASC.EventBus.RabbitMQ.csproj @@ -9,7 +9,7 @@ - + From e9b520665e51494b627341ebd9d89046c86376da Mon Sep 17 00:00:00 2001 From: Andrey Savihin Date: Wed, 24 Jan 2024 11:32:57 +0300 Subject: [PATCH 06/33] ASC.Api.Core: InvitationLinkHelper: optimization --- common/ASC.Api.Core/Security/InvitationLinkHelper.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/common/ASC.Api.Core/Security/InvitationLinkHelper.cs b/common/ASC.Api.Core/Security/InvitationLinkHelper.cs index 35894ff072d..8747572584c 100644 --- a/common/ASC.Api.Core/Security/InvitationLinkHelper.cs +++ b/common/ASC.Api.Core/Security/InvitationLinkHelper.cs @@ -130,7 +130,7 @@ private async Task ValidateIndividualLinkAsync(string email, s return ValidationResult.Invalid; } - var visitMessage = await GetLinkVisitMessageAsync(email, key); + var visitMessage = await GetLinkVisitMessageAsync(user.TenantId, email, key); if (visitMessage == null) { @@ -151,14 +151,14 @@ private async Task ValidateIndividualLinkAsync(string email, s return linkId == default ? (ValidationResult.Invalid, default) : (ValidationResult.Ok, linkId); } - private async Task GetLinkVisitMessageAsync(string email, string key) + private async Task GetLinkVisitMessageAsync(int tenantId, string email, string key) { await using var context = await _dbContextFactory.CreateDbContextAsync(); var target = _messageTarget.Create(email); var description = JsonSerializer.Serialize(new[] { key }); - var message = await Queries.AuditEventsAsync(context, target.ToString(), description); + var message = await Queries.AuditEventsAsync(context, tenantId, target.ToString(), description); return message; } @@ -188,8 +188,8 @@ public class LinkValidationResult static file class Queries { - public static readonly Func> AuditEventsAsync = + public static readonly Func> AuditEventsAsync = EF.CompileAsyncQuery( - (MessagesContext ctx, string target, string description) => - ctx.AuditEvents.FirstOrDefault(a => a.Target == target && a.DescriptionRaw == description)); + (MessagesContext ctx, int tenantId, string target, string description) => + ctx.AuditEvents.FirstOrDefault(a => a.TenantId == tenantId && a.Target == target && a.DescriptionRaw == description)); } \ No newline at end of file From 54a3a4d4e2894003ecbbbe7d65913e616a67d30b Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Mon, 22 Jan 2024 14:09:36 +0300 Subject: [PATCH 07/33] Arabic and Serbian empty file templates --- products/ASC.Files/Server/DocStore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/products/ASC.Files/Server/DocStore b/products/ASC.Files/Server/DocStore index 8933c733a86..634769cd302 160000 --- a/products/ASC.Files/Server/DocStore +++ b/products/ASC.Files/Server/DocStore @@ -1 +1 @@ -Subproject commit 8933c733a8651c221f62b359fa92e4305f7bd5bc +Subproject commit 634769cd30217aa546e28ae853b00f76dcd94285 From db5415aa83d8c25cf7176bcef5fe9cd6fb25a800 Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Wed, 24 Jan 2024 13:24:35 +0300 Subject: [PATCH 08/33] Thumbnails: fixed generate --- products/ASC.Files/Service/Startup.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/products/ASC.Files/Service/Startup.cs b/products/ASC.Files/Service/Startup.cs index d2e5bfe22c1..69579634b25 100644 --- a/products/ASC.Files/Service/Startup.cs +++ b/products/ASC.Files/Service/Startup.cs @@ -24,7 +24,10 @@ // content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 // International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode +using ASC.Web.Core.WhiteLabel; + namespace ASC.Files.Service; + public class Startup : BaseWorkerStartup { private readonly IConfiguration _configuration; @@ -97,7 +100,8 @@ public override void ConfigureServices(IServiceCollection services) DIHelper.TryAdd(); DIHelper.TryAdd(); DIHelper.TryAdd>(); - + DIHelper.TryAdd(); + services.AddScoped(); services.AddScoped(); @@ -109,13 +113,11 @@ public override void ConfigureServices(IServiceCollection services) services.AddScoped, UsersInRoomStatistic>(); services.AddScoped(); - - + services.AddBaseDbContextPool(); services.AddSingleton(Channel.CreateUnbounded>()); services.AddSingleton(svc => svc.GetRequiredService>>().Reader); services.AddSingleton(svc => svc.GetRequiredService>>().Writer); - } - } +} \ No newline at end of file From 73fd5e8860a445ee37f30e6c76375900d09bff67 Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Wed, 24 Jan 2024 13:50:04 +0300 Subject: [PATCH 09/33] fix bug 65943 --- web/ASC.Web.Api/Api/Settings/SettingsController.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/web/ASC.Web.Api/Api/Settings/SettingsController.cs b/web/ASC.Web.Api/Api/Settings/SettingsController.cs index efc96b2122c..06a31322afe 100644 --- a/web/ASC.Web.Api/Api/Settings/SettingsController.cs +++ b/web/ASC.Web.Api/Api/Settings/SettingsController.cs @@ -935,8 +935,10 @@ public TenantControlPanelSettings GetTenantControlPanelSettings() /// Authorization services /// list [HttpGet("authservice")] - public IEnumerable GetAuthServices() - { + public async Task> GetAuthServices() + { + await _permissionContext.DemandPermissionsAsync(SecurityConstants.EditPortalSettings); + return _consumerFactory.GetAll() .Where(consumer => consumer.ManagedKeys.Any()) .OrderBy(services => services.Order) From 8914d6f1120b2af0c515bc2fd75edae6c52c9531 Mon Sep 17 00:00:00 2001 From: Sukhorukov Anton Date: Wed, 24 Jan 2024 14:24:32 +0300 Subject: [PATCH 10/33] fix backup/restore --- .../Tasks/BackupPortalTask.cs | 2 +- .../Tasks/PortalTaskBase.cs | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/common/ASC.Data.Backup.Core/Tasks/BackupPortalTask.cs b/common/ASC.Data.Backup.Core/Tasks/BackupPortalTask.cs index 16d7f077a43..c8679bcaa14 100644 --- a/common/ASC.Data.Backup.Core/Tasks/BackupPortalTask.cs +++ b/common/ASC.Data.Backup.Core/Tasks/BackupPortalTask.cs @@ -453,7 +453,7 @@ private void SaveToFile(string path, string t, IReadOnlyCollection colum { _logger.DebugSaveTable(t); List portion; - while ((portion = data.Take(BatchLimit).ToList()).Any()) + while ((portion = data.Take(BatchLimit).ToList()).Count > 0) { using (var sw = new StreamWriter(path, true)) using (var writer = new JsonTextWriter(sw)) diff --git a/common/ASC.Data.Backup.Core/Tasks/PortalTaskBase.cs b/common/ASC.Data.Backup.Core/Tasks/PortalTaskBase.cs index cb842dcb52c..33ab0942a3d 100644 --- a/common/ASC.Data.Backup.Core/Tasks/PortalTaskBase.cs +++ b/common/ASC.Data.Backup.Core/Tasks/PortalTaskBase.cs @@ -23,7 +23,6 @@ // All the Product's GUI elements, including illustrations and icon sets, as well as technical writing // content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 // International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - namespace ASC.Data.Backup.Tasks; public class ProgressChangedEventArgs : EventArgs @@ -291,14 +290,22 @@ protected void RunMysqlFile(string file, bool db = false) { while ((commandText = await reader.ReadLineAsync()) != null) { - while (!commandText.EndsWith(delimiter)) + var sb = new StringBuilder(commandText); + if (!commandText.EndsWith(delimiter)) { - var newline = await reader.ReadLineAsync(); - if (newline == null) + var newline = ""; + while (!newline.EndsWith(delimiter)) { - break; + newline = await reader.ReadLineAsync(); + if (string.IsNullOrEmpty(newline)) + { + break; + } + + sb.Append(newline); } - commandText += newline; + + commandText = sb.ToString(); } try From 16977d2dd3ff0e479e27a53889d9f40859f50cbf Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Wed, 24 Jan 2024 14:45:07 +0300 Subject: [PATCH 11/33] fix Bug 66027 --- .../ASC.Data.Backup.Core/BackupAjaxHandler.cs | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs b/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs index 9e907931f52..39adf21cb9b 100644 --- a/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs +++ b/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs @@ -165,7 +165,8 @@ public async Task CheckAccessToFolderAsync(T folderId) public async Task CreateScheduleAsync(BackupStorageType storageType, Dictionary storageParams, int backupsStored, CronParams cronParams) { await DemandPermissionsBackupAsync(); - + await DemandPermissionsAutoBackupAsync(); + if (!SetupInfo.IsVisibleSettings("AutoBackup")) { throw new InvalidOperationException(Resource.ErrorNotAllowedOption); @@ -238,7 +239,7 @@ public async Task GetScheduleAsync() schedule.StorageParams = consumer.AdditionalKeys.ToDictionary(r => r, r => consumer[r]); schedule.StorageParams.Add("module", "S3"); - var Schedule = new CreateScheduleRequest + var scheduleRequest = new CreateScheduleRequest { TenantId = await _tenantManager.GetCurrentTenantIdAsync(), Cron = schedule.CronParams.ToString(), @@ -247,7 +248,7 @@ public async Task GetScheduleAsync() StorageParams = schedule.StorageParams }; - await _backupService.CreateScheduleAsync(Schedule); + await _backupService.CreateScheduleAsync(scheduleRequest); } else if (response.StorageType != BackupStorageType.ThirdPartyConsumer) @@ -314,37 +315,31 @@ public async Task StartRestoreAsync(string backupId, BackupStorageType storageTy public async Task GetRestoreProgressAsync() { var tenant = await _tenantManager.GetCurrentTenantAsync(); - var result = _backupService.GetRestoreProgress(tenant.Id); - - return result; + + return _backupService.GetRestoreProgress(tenant.Id); } - public async Task DemandPermissionsRestoreAsync() + private async Task DemandPermissionsRestoreAsync() { await _permissionContext.DemandPermissionsAsync(SecurityConstants.EditPortalSettings); var quota = await _tenantManager.GetTenantQuotaAsync(await _tenantManager.GetCurrentTenantIdAsync()); - if (!SetupInfo.IsVisibleSettings("Restore") || - (!_coreBaseSettings.Standalone && !quota.AutoBackupRestore)) + if (!SetupInfo.IsVisibleSettings("Restore") || (!_coreBaseSettings.Standalone && !quota.AutoBackupRestore)) { throw new BillingException(Resource.ErrorNotAllowedOption, "Restore"); } - - if (!_coreBaseSettings.Standalone - && (!SetupInfo.IsVisibleSettings("Restore") - || !quota.AutoBackupRestore)) + if (!_coreBaseSettings.Standalone && (!SetupInfo.IsVisibleSettings("Restore") || !quota.AutoBackupRestore)) { throw new BillingException(Resource.ErrorNotAllowedOption, "Restore"); } } - public async Task DemandPermissionsAutoBackupAsync() + private async Task DemandPermissionsAutoBackupAsync() { await _permissionContext.DemandPermissionsAsync(SecurityConstants.EditPortalSettings); - if (!SetupInfo.IsVisibleSettings("AutoBackup") || - (!_coreBaseSettings.Standalone && !(await _tenantManager.GetTenantQuotaAsync(await _tenantManager.GetCurrentTenantIdAsync())).AutoBackupRestore)) + if (!SetupInfo.IsVisibleSettings("AutoBackup") || !(await _tenantManager.GetTenantQuotaAsync(await _tenantManager.GetCurrentTenantIdAsync())).AutoBackupRestore) { throw new BillingException(Resource.ErrorNotAllowedOption, "AutoBackup"); } From 80b3a9fe427e65178ff1fe5b3783eaea6b304c71 Mon Sep 17 00:00:00 2001 From: Andrey Savihin Date: Thu, 25 Jan 2024 00:00:58 +0300 Subject: [PATCH 12/33] ASC.Common: TimeZoneConverter: added GetIanaTimeZoneId method --- .../Utils/TimeZoneConverter/TimeZoneConverter.cs | 12 ++++++++++++ web/ASC.Web.Api/Api/Settings/SettingsController.cs | 8 ++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/common/ASC.Common/Utils/TimeZoneConverter/TimeZoneConverter.cs b/common/ASC.Common/Utils/TimeZoneConverter/TimeZoneConverter.cs index c8c549b57b6..7a258451c6e 100644 --- a/common/ASC.Common/Utils/TimeZoneConverter/TimeZoneConverter.cs +++ b/common/ASC.Common/Utils/TimeZoneConverter/TimeZoneConverter.cs @@ -66,6 +66,18 @@ public string GetTimeZoneDisplayName(TimeZoneInfo tz) return displayName; } + public string GetIanaTimeZoneId(TimeZoneInfo timeZone) + { + if (timeZone.HasIanaId) + { + return timeZone.Id; + } + + return TimeZoneInfo.TryConvertWindowsIdToIanaId(timeZone.Id, out var ianaTimeZoneId) + ? ianaTimeZoneId + : WindowsTzId2OlsonTzId(timeZone.Id); + } + public string OlsonTzId2WindowsTzId(string olsonTimeZoneId, bool defaultIfNoMatch = true) { var mapZone = GetMapZoneByWindowsTzId(olsonTimeZoneId); diff --git a/web/ASC.Web.Api/Api/Settings/SettingsController.cs b/web/ASC.Web.Api/Api/Settings/SettingsController.cs index 06a31322afe..1a576831c3c 100644 --- a/web/ASC.Web.Api/Api/Settings/SettingsController.cs +++ b/web/ASC.Web.Api/Api/Settings/SettingsController.cs @@ -183,9 +183,9 @@ public async Task GetSettingsAsync(bool? withpassword) { settings.TrustedDomains = tenant.TrustedDomains; settings.TrustedDomainsType = tenant.TrustedDomainsType; - var timeZone = tenant.TimeZone; - settings.Timezone = _timeZoneConverter.WindowsTzId2OlsonTzId(timeZone); - settings.UtcOffset = _timeZoneConverter.GetTimeZone(timeZone).GetUtcOffset(DateTime.UtcNow); + var timeZone = _timeZoneConverter.GetTimeZone(tenant.TimeZone); + settings.Timezone = _timeZoneConverter.GetIanaTimeZoneId(timeZone); + settings.UtcOffset = timeZone.GetUtcOffset(DateTime.UtcNow); settings.UtcHoursOffset = settings.UtcOffset.TotalHours; settings.OwnerId = tenant.OwnerId; settings.NameSchemaId = _customNamingPeople.Current.Id; @@ -407,7 +407,7 @@ public async Task> GetTimeZonesAsyncAsync() { listOfTimezones.Add(new TimezonesRequestsDto { - Id = _timeZoneConverter.WindowsTzId2OlsonTzId(tz.Id), + Id = _timeZoneConverter.GetIanaTimeZoneId(tz), DisplayName = _timeZoneConverter.GetTimeZoneDisplayName(tz) }); } From fa6042e99fdfdb1a5b4432860b71982d6d4c9d49 Mon Sep 17 00:00:00 2001 From: Alexey Safronov Date: Thu, 25 Jan 2024 02:21:37 +0400 Subject: [PATCH 13/33] Fix incorrect SsoUrl (AuthN request issue) --- web/ASC.Web.Api/Api/CapabilitiesController.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/web/ASC.Web.Api/Api/CapabilitiesController.cs b/web/ASC.Web.Api/Api/CapabilitiesController.cs index d7fdf3e08ca..f4edbaa4487 100644 --- a/web/ASC.Web.Api/Api/CapabilitiesController.cs +++ b/web/ASC.Web.Api/Api/CapabilitiesController.cs @@ -40,6 +40,7 @@ public class CapabilitiesController : ControllerBase private readonly ProviderManager _providerManager; private readonly SettingsManager _settingsManager; private readonly ILogger _log; + private readonly CommonLinkUtility _commonLinkUtility; public CapabilitiesController( @@ -47,13 +48,15 @@ public CapabilitiesController( TenantManager tenantManager, ProviderManager providerManager, SettingsManager settingsManager, - ILogger logger) + ILogger logger, + CommonLinkUtility commonLinkUtility) { _coreBaseSettings = coreBaseSettings; _tenantManager = tenantManager; _providerManager = providerManager; _settingsManager = settingsManager; _log = logger; + _commonLinkUtility = commonLinkUtility; } /// @@ -128,7 +131,7 @@ public async Task GetPortalCapabilitiesAsync() if (settings.EnableSso.GetValueOrDefault()) { - result.SsoUrl = settings.IdpSettings.SsoUrl; + result.SsoUrl = _commonLinkUtility.GetFullAbsolutePath("/sso/login"); //TODO: get it from config result.SsoLabel = settings.SpLoginLabel; } } From c5fb47a34024d5f6c4e0657bdfa2bd42346673c6 Mon Sep 17 00:00:00 2001 From: Alexey Bannov Date: Thu, 25 Jan 2024 13:38:09 +0300 Subject: [PATCH 14/33] rabbitmq: log shutdown event --- .../ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs | 26 ++++++++++++++----- .../Log/EventBusRabbitMQLogger.cs | 10 +++++-- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/common/ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs b/common/ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs index 765a090034d..e449f6acbe6 100644 --- a/common/ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs +++ b/common/ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs @@ -26,6 +26,8 @@ using System.Collections.Generic; +using ASC.EventBus.RabbitMQ.Log; + namespace ASC.EventBus.RabbitMQ; public class EventBusRabbitMQ : IEventBus, IDisposable @@ -217,7 +219,7 @@ private void StartBasicConsume() var consumer = new AsyncEventingBasicConsumer(_consumerChannel); consumer.Received += Consumer_Received; - + consumer.Shutdown += Consumer_Shutdown; _consumerTag = _consumerChannel.BasicConsume( queue: _queueName, autoAck: false, @@ -229,6 +231,13 @@ private void StartBasicConsume() } } + private async Task Consumer_Shutdown(object sender, ShutdownEventArgs @event) + { + _logger.WarningModelIsShutdown(@event.Cause?.ToString(), @event.Exception); + + await Task.CompletedTask; + } + private async Task Consumer_Received(object sender, BasicDeliverEventArgs eventArgs) { var eventName = eventArgs.RoutingKey; @@ -275,7 +284,7 @@ private async Task Consumer_Received(object sender, BasicDeliverEventArgs eventA } await ProcessEvent(eventName, @event); - } + } catch (IntegrationEventRejectExeption ex) { _logger.ErrorProcessingMessage(message, ex); @@ -341,14 +350,15 @@ private IModel CreateConsumerChannel() arguments: arguments); channel.CallbackException += RecreateChannel; - + return channel; } - private async void RecreateChannel(object sender, CallbackExceptionEventArgs e) { - _logger.WarningRecreatingConsumerChannel(e.Exception); + _logger.WarningCallbackException(e.Exception); + + _logger.WarningRecreatingChannel(); _consumerChannel.Dispose(); @@ -356,7 +366,8 @@ private async void RecreateChannel(object sender, CallbackExceptionEventArgs e) { try { - await Task.Run(() => { + await Task.Run(() => + { _consumerChannel = CreateConsumerChannel(); _consumerTag = String.Empty; @@ -369,8 +380,9 @@ await Task.Run(() => { } } _logger.InfoCreatedConsumerChannel(); - } + } + private IntegrationEvent GetEvent(string eventName, byte[] serializedMessage) { var eventType = _subsManager.GetEventTypeByName(eventName); diff --git a/common/ASC.EventBus.RabbitMQ/Log/EventBusRabbitMQLogger.cs b/common/ASC.EventBus.RabbitMQ/Log/EventBusRabbitMQLogger.cs index 6a4fd1288c6..e8cde8b2b85 100644 --- a/common/ASC.EventBus.RabbitMQ/Log/EventBusRabbitMQLogger.cs +++ b/common/ASC.EventBus.RabbitMQ/Log/EventBusRabbitMQLogger.cs @@ -69,8 +69,11 @@ internal static partial class EventBusRabbitMQLogger [LoggerMessage(Level = LogLevel.Error, Message = "Failed to recreate channel, trying again")] public static partial void ErrorCreatingConsumerChannel(this ILogger logger, Exception exception); - [LoggerMessage(Level = LogLevel.Warning, Message = "Recreating RabbitMQ consumer channel")] - public static partial void WarningRecreatingConsumerChannel(this ILogger logger, Exception exception); + [LoggerMessage(Level = LogLevel.Warning, Message = "RabbitMQ: Consumer channel callback exception")] + public static partial void WarningCallbackException(this ILogger logger, Exception exception); + + [LoggerMessage(Level = LogLevel.Warning, Message = "RabbitMQ: Recreating consumer channel ")] + public static partial void WarningRecreatingChannel(this ILogger logger); [LoggerMessage(Level = LogLevel.Trace, Message = "Processing RabbitMQ event: {eventName}")] public static partial void TraceProcessingEvent(this ILogger logger, string eventName); @@ -89,4 +92,7 @@ internal static partial class EventBusRabbitMQLogger [LoggerMessage(Level = LogLevel.Debug, Message = "RabbitMQ: nack event: {eventName}")] public static partial void DebugNackEvent(this ILogger logger, string eventName); + + [LoggerMessage(Level = LogLevel.Warning, Message = "RabbitMQ: model is shutdown: {cause}")] + public static partial void WarningModelIsShutdown(this ILogger logger, string cause); } From 7486ea832a8dcbdfa7cc3ec0f3f36f0d08166d2a Mon Sep 17 00:00:00 2001 From: Alexey Bannov Date: Thu, 25 Jan 2024 13:44:30 +0300 Subject: [PATCH 15/33] rabbitmq: fixed log --- common/ASC.EventBus.RabbitMQ/Log/EventBusRabbitMQLogger.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/ASC.EventBus.RabbitMQ/Log/EventBusRabbitMQLogger.cs b/common/ASC.EventBus.RabbitMQ/Log/EventBusRabbitMQLogger.cs index e8cde8b2b85..692eca611a5 100644 --- a/common/ASC.EventBus.RabbitMQ/Log/EventBusRabbitMQLogger.cs +++ b/common/ASC.EventBus.RabbitMQ/Log/EventBusRabbitMQLogger.cs @@ -94,5 +94,5 @@ internal static partial class EventBusRabbitMQLogger public static partial void DebugNackEvent(this ILogger logger, string eventName); [LoggerMessage(Level = LogLevel.Warning, Message = "RabbitMQ: model is shutdown: {cause}")] - public static partial void WarningModelIsShutdown(this ILogger logger, string cause); + public static partial void WarningModelIsShutdown(this ILogger logger, string cause, Exception exception); } From 46f8698496c59d63be0665d7e579b243affb9501 Mon Sep 17 00:00:00 2001 From: Sukhorukov Anton Date: Thu, 25 Jan 2024 16:29:35 +0300 Subject: [PATCH 16/33] fix bug 66001 --- .../Tasks/BackupPortalTask.cs | 20 ------------------- .../Tasks/RestorePortalTask.cs | 15 -------------- 2 files changed, 35 deletions(-) diff --git a/common/ASC.Data.Backup.Core/Tasks/BackupPortalTask.cs b/common/ASC.Data.Backup.Core/Tasks/BackupPortalTask.cs index c8679bcaa14..75918139139 100644 --- a/common/ASC.Data.Backup.Core/Tasks/BackupPortalTask.cs +++ b/common/ASC.Data.Backup.Core/Tasks/BackupPortalTask.cs @@ -123,26 +123,6 @@ private async Task DoDump(IDataWriteOperator writer) { var databases = new Dictionary, List>(); - try - { - await using var connection = DbFactory.OpenConnection(); - var command = connection.CreateCommand(); - command.CommandText = "select id, connection_string from mail_server_server"; - ExecuteList(command).ForEach(r => - { - var connectionString = GetConnectionString((int)r[0], JsonConvert.DeserializeObject>(Convert.ToString(r[1]))["DbConnection"].ToString()); - - var command = connection.CreateCommand(); - command.CommandText = "show tables"; - var tables = ExecuteList(command).Select(r => Convert.ToString(r[0])).ToList(); - databases.Add(new Tuple(connectionString.Name, connectionString.ConnectionString), tables); - }); - } - catch (Exception e) - { - _logger.ErrorWithException(e); - } - await using (var connection = DbFactory.OpenConnection()) { var command = connection.CreateCommand(); diff --git a/common/ASC.Data.Backup.Core/Tasks/RestorePortalTask.cs b/common/ASC.Data.Backup.Core/Tasks/RestorePortalTask.cs index 2b0b38d8d7b..e694afc04f8 100644 --- a/common/ASC.Data.Backup.Core/Tasks/RestorePortalTask.cs +++ b/common/ASC.Data.Backup.Core/Tasks/RestorePortalTask.cs @@ -213,21 +213,6 @@ private async Task RestoreFromDump(IDataReadOperator dataReader) Task.WaitAll(tasks.ToArray()); } - try - { - await using var connection = DbFactory.OpenConnection(); - var command = connection.CreateCommand(); - command.CommandText = "select id, connection_string from mail_server_server"; - ExecuteList(command).ForEach(r => - { - var connectionString = GetConnectionString((int)r[0], JsonConvert.DeserializeObject>(Convert.ToString(r[1]))["DbConnection"].ToString()); - databases.Add(new Tuple(connectionString.Name, connectionString.ConnectionString), databasesFromDirs[connectionString.Name]); - }); - } - catch (Exception e) - { - _logger.ErrorWithException(e); - } foreach (var database in databases) { From 5b1146292d117fcbc294a6b4583783ceb61d3b5e Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Thu, 25 Jan 2024 16:50:20 +0300 Subject: [PATCH 17/33] Search: fix memory --- .../ASC.ElasticSearch/Engine/BaseIndexer.cs | 39 +++++++++++-------- .../Core/Core/Dao/TeamlabDao/FileDao.cs | 19 ++++----- .../Core/Core/Search/FactoryIndexerFile.cs | 4 +- .../Core/Core/Search/FactoryIndexerFolder.cs | 2 +- 4 files changed, 33 insertions(+), 31 deletions(-) diff --git a/common/services/ASC.ElasticSearch/Engine/BaseIndexer.cs b/common/services/ASC.ElasticSearch/Engine/BaseIndexer.cs index c0b14906029..3d2fe47d326 100644 --- a/common/services/ASC.ElasticSearch/Engine/BaseIndexer.cs +++ b/common/services/ASC.ElasticSearch/Engine/BaseIndexer.cs @@ -94,14 +94,18 @@ public BaseIndexer( _serviceProvider = serviceProvider; } - public async Task>> IndexAllAsync( + public async IAsyncEnumerable> IndexAllAsync( Func getCount, Func> getIds, Func> getData) - { - await using var webstudioDbContext = await _dbContextFactory.CreateDbContextAsync(); + { var now = DateTime.UtcNow; - var lastIndexed = await Queries.LastIndexedAsync(webstudioDbContext, Wrapper.IndexName); + DateTime lastIndexed; + + await using (var webStudioDbContext = await _dbContextFactory.CreateDbContextAsync()) + { + lastIndexed = await Queries.LastIndexedAsync(webStudioDbContext, Wrapper.IndexName); + } if (lastIndexed.Equals(DateTime.MinValue)) { @@ -111,26 +115,27 @@ public async Task>> IndexAllAsync( var (count, max, min) = getCount(lastIndexed); _logger.DebugIndex(IndexName, count, max, min); - var ids = new List() { min }; + var ids = new List { min }; ids.AddRange(getIds(lastIndexed)); ids.Add(max); + + for (var i = 0; i < ids.Count - 1; i++) + { + yield return getData(ids[i], ids[i + 1], lastIndexed); + } - await webstudioDbContext.AddOrUpdateAsync(q => q.WebstudioIndex, new DbWebstudioIndex() + await using (var webStudioDbContext = await _dbContextFactory.CreateDbContextAsync()) { - IndexName = Wrapper.IndexName, - LastModified = now - }); + await webStudioDbContext.AddOrUpdateAsync(q => q.WebstudioIndex, new DbWebstudioIndex + { + IndexName = Wrapper.IndexName, + LastModified = now + }); - await webstudioDbContext.SaveChangesAsync(); + await webStudioDbContext.SaveChangesAsync(); + } _logger.DebugIndexCompleted(Wrapper.IndexName); - - var list = new List>(); - for (var i = 0; i < ids.Count - 1; i++) - { - list.Add(getData(ids[i], ids[i + 1], lastIndexed)); - } - return list; } public async Task ReIndrexAsync() diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs index a3ead1a7bf6..c34f93e8f63 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs @@ -1575,22 +1575,17 @@ select f } protected internal async Task InitDocumentAsync(DbFile dbFile) - { + { + dbFile.Document = new Document + { + Data = Convert.ToBase64String(Encoding.UTF8.GetBytes("")) + }; + if (!await _factoryIndexer.CanIndexByContentAsync(dbFile)) { - dbFile.Document = new Document - { - Data = Convert.ToBase64String(Encoding.UTF8.GetBytes("")) - }; - return dbFile; } - - return await InternalInitDocumentAsync(dbFile); - } - - private async Task InternalInitDocumentAsync(DbFile dbFile) - { + var file = _serviceProvider.GetService>(); file.Id = dbFile.Id; file.Title = dbFile.Title; diff --git a/products/ASC.Files/Core/Core/Search/FactoryIndexerFile.cs b/products/ASC.Files/Core/Core/Search/FactoryIndexerFile.cs index d32a2ebe275..c1f1f42778f 100644 --- a/products/ASC.Files/Core/Core/Search/FactoryIndexerFile.cs +++ b/products/ASC.Files/Core/Core/Search/FactoryIndexerFile.cs @@ -95,7 +95,7 @@ public override async Task IndexAllAsync() var j = 0; var tasks = new List(); - foreach (var data in await _indexer.IndexAllAsync(GetCount, GetIds, GetData)) + await foreach (var data in _indexer.IndexAllAsync(GetCount, GetIds, GetData)) { if (_settings.Threads == 1) { @@ -125,6 +125,8 @@ public override async Task IndexAllAsync() throw; } + return; + List GetIds(DateTime lastIndexed) { var start = 0; diff --git a/products/ASC.Files/Core/Core/Search/FactoryIndexerFolder.cs b/products/ASC.Files/Core/Core/Search/FactoryIndexerFolder.cs index 9ebb8b02187..5733dd1cc3a 100644 --- a/products/ASC.Files/Core/Core/Search/FactoryIndexerFolder.cs +++ b/products/ASC.Files/Core/Core/Search/FactoryIndexerFolder.cs @@ -98,7 +98,7 @@ List getIds(DateTime lastIndexed) var j = 0; var tasks = new List(); - foreach (var data in await _indexer.IndexAllAsync(getCount, getIds, getData)) + await foreach (var data in _indexer.IndexAllAsync(getCount, getIds, getData)) { if (_settings.Threads == 1) { From d75f82e034821057e17547a38876907aef191cb7 Mon Sep 17 00:00:00 2001 From: Alexey Bannov Date: Thu, 25 Jan 2024 18:03:21 +0300 Subject: [PATCH 18/33] using options for rate limiter --- common/ASC.Api.Core/Core/BaseStartup.cs | 71 +++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 5 deletions(-) diff --git a/common/ASC.Api.Core/Core/BaseStartup.cs b/common/ASC.Api.Core/Core/BaseStartup.cs index 226fc946205..288586a1143 100644 --- a/common/ASC.Api.Core/Core/BaseStartup.cs +++ b/common/ASC.Api.Core/Core/BaseStartup.cs @@ -104,14 +104,50 @@ public virtual void ConfigureServices(IServiceCollection services) services.AddRateLimiter(options => { + bool EnableNoLimiter(IPAddress address) + { + var knownNetworks = _configuration.GetSection("core:hosting:rateLimiterOptions:knownNetworks").Get>(); + var knownIPAddresses = _configuration.GetSection("core:hosting:rateLimiterOptions:knownIPAddresses").Get>(); + + if (knownIPAddresses is { Count: > 0 }) + { + foreach (var knownIPAddress in knownIPAddresses) + { + if (IPAddress.Parse(knownIPAddress).Equals(address)) return true; + } + } + + if (knownNetworks is { Count: > 0 }) + { + foreach (var knownNetwork in knownNetworks) + { + var prefix = IPAddress.Parse(knownNetwork.Split("/")[0]); + var prefixLength = Convert.ToInt32(knownNetwork.Split("/")[1]); + var ipNetwork = new IPNetwork(prefix, prefixLength); + + if (ipNetwork.Contains(address)) return true; + } + } + + return false; + } + + options.GlobalLimiter = PartitionedRateLimiter.CreateChained( PartitionedRateLimiter.Create(httpContext => { var userId = httpContext?.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Sid)?.Value; + var remoteIpAddress = httpContext?.Connection.RemoteIpAddress; + + if (EnableNoLimiter(remoteIpAddress)) + { + return RateLimitPartition.GetNoLimiter("no_limiter"); + } + if (userId == null) { - userId = httpContext?.Connection.RemoteIpAddress.ToInvariantString(); + userId = remoteIpAddress.ToInvariantString(); } var permitLimit = 1500; @@ -131,9 +167,16 @@ public virtual void ConfigureServices(IServiceCollection services) string partitionKey; int permitLimit; + var remoteIpAddress = httpContext?.Connection.RemoteIpAddress; + + if (EnableNoLimiter(remoteIpAddress)) + { + return RateLimitPartition.GetNoLimiter("no_limiter"); + } + if (userId == null) { - userId = httpContext?.Connection.RemoteIpAddress.ToInvariantString(); + userId = remoteIpAddress.ToInvariantString(); } if (String.Compare(httpContext?.Request.Method, "GET", StringComparison.OrdinalIgnoreCase) == 0) @@ -154,14 +197,21 @@ public virtual void ConfigureServices(IServiceCollection services) QueueLimit = 0, ConnectionMultiplexerFactory = () => connectionMultiplexer }); - }), + }), PartitionedRateLimiter.Create(httpContext => { var userId = httpContext?.User?.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Sid)?.Value; + var remoteIpAddress = httpContext?.Connection.RemoteIpAddress; + + if (EnableNoLimiter(remoteIpAddress)) + { + return RateLimitPartition.GetNoLimiter("no_limiter"); + } + if (userId == null) { - userId = httpContext?.Connection.RemoteIpAddress.ToInvariantString(); + userId = remoteIpAddress.ToInvariantString(); } var partitionKey = $"fw_post_put_{userId}"; @@ -187,6 +237,12 @@ public virtual void ConfigureServices(IServiceCollection services) var userId = httpContext?.User?.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Sid)?.Value; var permitLimit = 5; var partitionKey = $"sensitive_api_{userId}"; + var remoteIpAddress = httpContext?.Connection.RemoteIpAddress; + + if (EnableNoLimiter(remoteIpAddress)) + { + return RateLimitPartition.GetNoLimiter("no_limiter"); + } return RedisRateLimitPartition.GetSlidingWindowRateLimiter(partitionKey, _ => new RedisSlidingWindowRateLimiterOptions { @@ -411,7 +467,12 @@ public virtual void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseAuthentication(); // TODO: if some client requests very slow, this line will need to remove - // app.UseRateLimiter(); + bool.TryParse(_configuration["core:hosting:rateLimiterOptions:enable"], out var enableRateLimiter); + + if (enableRateLimiter) + { + app.UseRateLimiter(); + } app.UseAuthorization(); From ca4c2ec1331cfce7759f991649ddc44534915e9e Mon Sep 17 00:00:00 2001 From: Alexey Bannov Date: Thu, 25 Jan 2024 18:03:51 +0300 Subject: [PATCH 19/33] ratelimiting: update dll --- common/ASC.Api.Core/ASC.Api.Core.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/ASC.Api.Core/ASC.Api.Core.csproj b/common/ASC.Api.Core/ASC.Api.Core.csproj index 5d0aa3f48e6..8f2a4f65186 100644 --- a/common/ASC.Api.Core/ASC.Api.Core.csproj +++ b/common/ASC.Api.Core/ASC.Api.Core.csproj @@ -26,8 +26,8 @@ - - + + From adb6fef7773e8002d228fd4fc1d01c91332ad39e Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Thu, 25 Jan 2024 19:58:32 +0300 Subject: [PATCH 20/33] DbQuota: new quota --- .../EF/Model/Tenant/DbQuota.cs | 11 +- ...942_MigrationContext_Upgrade12.Designer.cs | 7198 +++++++++++++++++ ...240125164942_MigrationContext_Upgrade12.cs | 28 + .../MigrationContextModelSnapshot.cs | 8 + 4 files changed, 7244 insertions(+), 1 deletion(-) create mode 100644 migrations/mysql/SaaS/MigrationContext/20240125164942_MigrationContext_Upgrade12.Designer.cs create mode 100644 migrations/mysql/SaaS/MigrationContext/20240125164942_MigrationContext_Upgrade12.cs diff --git a/common/ASC.Core.Common/EF/Model/Tenant/DbQuota.cs b/common/ASC.Core.Common/EF/Model/Tenant/DbQuota.cs index 86e2140b79c..f27c609f2a1 100644 --- a/common/ASC.Core.Common/EF/Model/Tenant/DbQuota.cs +++ b/common/ASC.Core.Common/EF/Model/Tenant/DbQuota.cs @@ -127,9 +127,18 @@ public static ModelBuilderWrapper AddDbQuota(this ModelBuilderWrapper modelBuild Price = 0, ProductId = null, Visible = false + }, + new DbQuota + { + TenantId = -8, + Name = "zoom", + Description = null, + Features = "free,total_size:107374182400,manager:100,room:100", + Price = 0, + ProductId = null, + Visible = false } ); - return modelBuilder; } diff --git a/migrations/mysql/SaaS/MigrationContext/20240125164942_MigrationContext_Upgrade12.Designer.cs b/migrations/mysql/SaaS/MigrationContext/20240125164942_MigrationContext_Upgrade12.Designer.cs new file mode 100644 index 00000000000..c840dbcf560 --- /dev/null +++ b/migrations/mysql/SaaS/MigrationContext/20240125164942_MigrationContext_Upgrade12.Designer.cs @@ -0,0 +1,7198 @@ +// +using System; +using ASC.Migrations.Core; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace ASC.Migrations.MySql.SaaS.Migrations +{ + [DbContext(typeof(MigrationContext))] + [Migration("20240125164942_MigrationContext_Upgrade12")] + partial class MigrationContext_Upgrade12 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("ASC.Core.Common.EF.Acl", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("Subject") + .HasColumnType("varchar(38)") + .HasColumnName("subject") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Action") + .HasColumnType("varchar(38)") + .HasColumnName("action") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Object") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(255)") + .HasColumnName("object") + .HasDefaultValueSql("''") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("AceType") + .HasColumnType("int") + .HasColumnName("acetype"); + + b.HasKey("TenantId", "Subject", "Action", "Object") + .HasName("PRIMARY"); + + b.ToTable("core_acl", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + TenantId = -1, + Subject = "5d5b7260-f7f7-49f1-a1c9-95fbb6a12604", + Action = "ef5e6790-f346-4b6e-b662-722bc28cb0db", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "5d5b7260-f7f7-49f1-a1c9-95fbb6a12604", + Action = "f11e8f3f-46e6-4e55-90e3-09c22ec565bd", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "088d5940-a80f-4403-9741-d610718ce95c", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "08d66144-e1c9-4065-9aa1-aa4bba0a7bc8", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "08d75c97-cf3f-494b-90d1-751c941fe2dd", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "0d1f72a8-63da-47ea-ae42-0900e4ac72a9", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "13e30b51-5b4d-40a5-8575-cb561899eeb1", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "19f658ae-722b-4cd8-8236-3ad150801d96", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "2c6552b3-b2e0-4a00-b8fd-13c161e337b1", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "388c29d3-c662-4a61-bf47-fc2f7094224a", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "40bf31f4-3132-4e76-8d5c-9828a89501a3", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "49ae8915-2b30-4348-ab74-b152279364fb", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "63e9f35f-6bb5-4fb1-afaa-e4c2f4dec9bd", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "9018c001-24c2-44bf-a1db-d1121a570e74", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "948ad738-434b-4a88-8e38-7569d332910a", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "9d75a568-52aa-49d8-ad43-473756cd8903", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "a362fe79-684e-4d43-a599-65bc1f4e167f", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "c426c349-9ad4-47cd-9b8f-99fc30675951", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "d11ebcb9-0e6e-45e6-a6d0-99c41d687598", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "d1f3b53d-d9e2-4259-80e7-d24380978395", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "d49f4e30-da10-4b39-bc6d-b41ef6e039d3", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Action = "d852b66f-6719-45e1-8657-18f0bb791690", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "e0759a42-47f0-4763-a26a-d5aa665bec35", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "e37239bd-c5b5-4f1e-a9f8-3ceeac209615", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "fbc37705-a04c-40ad-a68c-ce2f0423f397", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "fcac42b8-9386-48eb-a938-d19b3c576912", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "13e30b51-5b4d-40a5-8575-cb561899eeb1", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "49ae8915-2b30-4348-ab74-b152279364fb", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "63e9f35f-6bb5-4fb1-afaa-e4c2f4dec9bd", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "9018c001-24c2-44bf-a1db-d1121a570e74", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "d1f3b53d-d9e2-4259-80e7-d24380978395", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "e0759a42-47f0-4763-a26a-d5aa665bec35", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "e37239bd-c5b5-4f1e-a9f8-3ceeac209615", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "f11e88d7-f185-4372-927c-d88008d2c483", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "ba74ca02-873f-43dc-8470-8620c156bc67", + Action = "f11e8f3f-46e6-4e55-90e3-09c22ec565bd", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "00e7dfc5-ac49-4fd3-a1d6-98d84e877ac4", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "14be970f-7af5-4590-8e81-ea32b5f7866d", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "18ecc94d-6afa-4994-8406-aee9dff12ce2", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "298530eb-435e-4dc6-a776-9abcd95c70e9", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "430eaf70-1886-483c-a746-1a18e3e6bb63", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "557d6503-633b-4490-a14c-6473147ce2b3", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "724cbb75-d1c9-451e-bae0-4de0db96b1f7", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "7cb5c0d1-d254-433f-abe3-ff23373ec631", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "91b29dcd-9430-4403-b17a-27d09189be88", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "a18480a4-6d18-4c71-84fa-789888791f45", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "b630d29b-1844-4bda-bbbe-cf5542df3559", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "c62a9e8d-b24c-4513-90aa-7ff0f8ba38eb", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "d7cdb020-288b-41e5-a857-597347618533", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "662f3db7-9bc8-42cf-84da-2765f563e9b0", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "712d9ec3-5d2b-4b13-824f-71f00191dcca", + Action = "e0759a42-47f0-4763-a26a-d5aa665bec35", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "bba32183-a14d-48ed-9d39-c6b4d8925fbf", + Action = "0d68b142-e20a-446e-a832-0d6b0b65a164", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "6f05c382-8bca-4469-9424-c807a98c40d7", + Object = "", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|1e04460243b54d7982f3fd6208a11960", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|6743007c6f954d208c88a8601ce5e76d", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|e67be73df9ae4ce18fec1880cb518cb4", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|ea942538e68e49079394035336ee0ba8", + AceType = 1 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|32d24cb57ece46069c9419216ba42086", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|bf88953e3c434850a3fbb1e43ad53a3e", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|2a9230378b2d487b9a225ac0918acf3f", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|f4d98afdd336433287783c6945c81ea0", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|28b10049dd204f54b986873bc14ccfc7", + AceType = 1 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|3cfd481b46f24a4ab55cb8c0c9def02c", + AceType = 1 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|6a598c7491ae437da5f4ad339bd11bb2", + AceType = 1 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|742cf945cbbc4a5782d61600a12cf8ca", + AceType = 1 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|853b6eb973ee438d9b098ffeedf36234", + AceType = 1 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|46cfa73af32046cf8d5bcd82e1d67f26", + AceType = 0 + }, + new + { + TenantId = -1, + Subject = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Action = "77777777-32ae-425f-99b5-83176061d1ae", + Object = "ASC.Web.Core.WebItemSecurity+WebItemSecurityObject|37620ae5c40b45ce855a39dd7d76a1fa", + AceType = 0 + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(38)") + .HasColumnName("id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CategoryId") + .HasColumnType("varchar(38)") + .HasColumnName("categoryid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastModified") + .HasColumnType("timestamp") + .HasColumnName("last_modified"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(128)") + .HasColumnName("name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ParentId") + .HasColumnType("varchar(38)") + .HasColumnName("parentid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Removed") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("removed") + .HasDefaultValueSql("'0'"); + + b.Property("Sid") + .HasColumnType("varchar(512)") + .HasColumnName("sid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.HasKey("Id"); + + b.HasIndex("LastModified") + .HasDatabaseName("last_modified"); + + b.HasIndex("TenantId", "ParentId") + .HasDatabaseName("parentid"); + + b.ToTable("core_group", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbQuota", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("Description") + .HasColumnType("varchar(128)") + .HasColumnName("description") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Features") + .HasColumnType("text") + .HasColumnName("features"); + + b.Property("Name") + .HasColumnType("varchar(128)") + .HasColumnName("name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Price") + .ValueGeneratedOnAdd() + .HasColumnType("decimal(10,2)") + .HasColumnName("price") + .HasDefaultValueSql("'0.00'"); + + b.Property("ProductId") + .HasColumnType("varchar(128)") + .HasColumnName("product_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Visible") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("visible") + .HasDefaultValueSql("'0'"); + + b.HasKey("TenantId") + .HasName("PRIMARY"); + + b.ToTable("tenants_quota", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + TenantId = -1, + Features = "trial,audit,ldap,sso,whitelabel,thirdparty,restore,oauth,total_size:107374182400,file_size:100,manager:1", + Name = "trial", + Price = 0m, + Visible = false + }, + new + { + TenantId = -2, + Features = "audit,ldap,sso,whitelabel,thirdparty,restore,oauth,contentsearch,total_size:107374182400,file_size:1024,manager:1", + Name = "admin", + Price = 15m, + ProductId = "1002", + Visible = true + }, + new + { + TenantId = -3, + Features = "free,oauth,total_size:2147483648,manager:3,room:12", + Name = "startup", + Price = 0m, + Visible = false + }, + new + { + TenantId = -4, + Features = "total_size:1073741824", + Name = "disk", + Price = 0m, + ProductId = "1004", + Visible = false + }, + new + { + TenantId = -5, + Features = "manager:1", + Name = "admin1", + Price = 0m, + ProductId = "1005", + Visible = false + }, + new + { + TenantId = -6, + Features = "audit,ldap,sso,whitelabel,thirdparty,restore,oauth,contentsearch,file_size:1024", + Name = "subscription", + Price = 0m, + ProductId = "1001", + Visible = false + }, + new + { + TenantId = -7, + Features = "non-profit,audit,ldap,sso,thirdparty,restore,oauth,contentsearch,total_size:2147483648,file_size:1024,manager:20", + Name = "nonprofit", + Price = 0m, + Visible = false + }, + new + { + TenantId = -8, + Features = "free,total_size:107374182400,manager:100,room:100", + Name = "zoom", + Price = 0m, + Visible = false + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbQuotaRow", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("UserId") + .HasColumnType("char(36)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Path") + .HasColumnType("varchar(255)") + .HasColumnName("path") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Counter") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("counter") + .HasDefaultValueSql("'0'"); + + b.Property("LastModified") + .HasColumnType("timestamp") + .HasColumnName("last_modified"); + + b.Property("Tag") + .HasColumnType("varchar(1024)") + .HasColumnName("tag") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId", "UserId", "Path") + .HasName("PRIMARY"); + + b.HasIndex("LastModified") + .HasDatabaseName("last_modified"); + + b.ToTable("tenants_quotarow", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbSubscriptionMethod", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("Source") + .HasColumnType("varchar(38)") + .HasColumnName("source") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Action") + .HasColumnType("varchar(128)") + .HasColumnName("action") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Recipient") + .HasColumnType("varchar(38)") + .HasColumnName("recipient") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Sender") + .IsRequired() + .HasColumnType("varchar(1024)") + .HasColumnName("sender") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId", "Source", "Action", "Recipient") + .HasName("PRIMARY"); + + b.ToTable("core_subscriptionmethod", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + TenantId = -1, + Source = "asc.web.studio", + Action = "send_whats_new", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender" + }, + new + { + TenantId = -1, + Source = "6504977c-75af-4691-9099-084d3ddeea04", + Action = "new feed", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6a598c74-91ae-437d-a5f4-ad339bd11bb2", + Action = "new post", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "853b6eb9-73ee-438d-9b09-8ffeedf36234", + Action = "new topic in forum", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "9d51954f-db9b-4aed-94e3-ed70b914e101", + Action = "new photo uploaded", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "28b10049-dd20-4f54-b986-873bc14ccfc7", + Action = "new bookmark created", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "742cf945-cbbc-4a57-82d6-1600a12cf8ca", + Action = "new wiki page", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "37620ae5-c40b-45ce-855a-39dd7d76a1fa", + Action = "BirthdayReminder", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6fe286a4-479e-4c25-a8d9-0156e332b0c0", + Action = "sharedocument", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6fe286a4-479e-4c25-a8d9-0156e332b0c0", + Action = "sharefolder", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6fe286a4-479e-4c25-a8d9-0156e332b0c0", + Action = "updatedocument", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "invitetoproject", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "milestonedeadline", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "newcommentformessage", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "newcommentformilestone", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "newcommentfortask", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "projectcreaterequest", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "projecteditrequest", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "removefromproject", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "responsibleforproject", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "responsiblefortask", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "6045b68c-2c2e-42db-9e53-c272e814c4ad", + Action = "taskclosed", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "40650da3-f7c1-424c-8c89-b9c115472e08", + Action = "calendar_sharing", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "40650da3-f7c1-424c-8c89-b9c115472e08", + Action = "event_alert", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "asc.web.studio", + Action = "admin_notify", + Recipient = "cd84e66b-b803-40fc-99f9-b2969a54a1de", + Sender = "email.sender" + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "SetAccess", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "ResponsibleForTask", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "AddRelationshipEvent", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "ExportCompleted", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "CreateNewContact", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "ResponsibleForOpportunity", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Sender = "email.sender|messanger.sender" + }, + new + { + TenantId = -1, + Source = "asc.web.studio", + Action = "periodic_notify", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Sender = "email.sender" + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbTariff", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Comment") + .HasColumnType("varchar(255)") + .HasColumnName("comment") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateOn") + .HasColumnType("timestamp") + .HasColumnName("create_on"); + + b.Property("CustomerId") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("customer_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Stamp") + .HasColumnType("datetime") + .HasColumnName("stamp"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.HasKey("Id"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant"); + + b.ToTable("tenants_tariff", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbTariffRow", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("TariffId") + .HasColumnType("int") + .HasColumnName("tariff_id"); + + b.Property("Quota") + .HasColumnType("int") + .HasColumnName("quota"); + + b.Property("Quantity") + .HasColumnType("int") + .HasColumnName("quantity"); + + b.HasKey("TenantId", "TariffId", "Quota") + .HasName("PRIMARY"); + + b.ToTable("tenants_tariffrow", (string)null); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.FireBaseUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Application") + .HasColumnType("varchar(20)") + .HasColumnName("application") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("FirebaseDeviceToken") + .HasColumnType("varchar(255)") + .HasColumnName("firebase_device_token") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("IsSubscribed") + .HasColumnType("tinyint(1)") + .HasColumnName("is_subscribed"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(36)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id") + .HasName("PRIMARY"); + + b.HasIndex("TenantId", "UserId") + .HasDatabaseName("user_id"); + + b.ToTable("firebase_users", (string)null); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.AccountLinks", b => + { + b.Property("Id") + .HasColumnType("varchar(200)") + .HasColumnName("id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UId") + .HasColumnType("varchar(200)") + .HasColumnName("uid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Linked") + .HasColumnType("datetime") + .HasColumnName("linked"); + + b.Property("Profile") + .IsRequired() + .HasColumnType("text") + .HasColumnName("profile") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Provider") + .HasColumnType("char(60)") + .HasColumnName("provider") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id", "UId") + .HasName("PRIMARY"); + + b.HasIndex("UId") + .HasDatabaseName("uid"); + + b.ToTable("account_links", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbCoreSettings", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("Id") + .HasColumnType("varchar(128)") + .HasColumnName("id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastModified") + .HasColumnType("timestamp") + .HasColumnName("last_modified"); + + b.Property("Value") + .IsRequired() + .HasColumnType("mediumblob") + .HasColumnName("value"); + + b.HasKey("TenantId", "Id") + .HasName("PRIMARY"); + + b.ToTable("core_settings", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + TenantId = -1, + Id = "CompanyWhiteLabelSettings", + LastModified = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + Value = new byte[] { 245, 71, 4, 138, 72, 101, 23, 21, 135, 217, 206, 188, 138, 73, 108, 96, 29, 150, 3, 31, 44, 28, 62, 145, 96, 53, 57, 66, 238, 118, 93, 172, 211, 22, 244, 181, 244, 40, 146, 67, 111, 196, 162, 27, 154, 109, 248, 255, 181, 17, 253, 127, 42, 65, 19, 90, 26, 206, 203, 145, 159, 159, 243, 105, 24, 71, 188, 165, 53, 85, 57, 37, 186, 251, 57, 96, 18, 162, 218, 80, 0, 101, 250, 100, 66, 97, 24, 51, 240, 215, 216, 169, 105, 100, 15, 253, 29, 83, 182, 236, 203, 53, 68, 251, 2, 150, 149, 148, 58, 136, 84, 37, 151, 82, 92, 227, 30, 52, 111, 40, 154, 155, 7, 126, 149, 100, 169, 87, 10, 129, 228, 138, 177, 101, 77, 67, 177, 216, 189, 201, 1, 213, 136, 216, 107, 198, 253, 221, 106, 255, 198, 17, 68, 14, 110, 90, 174, 182, 68, 222, 188, 77, 157, 19, 26, 68, 86, 97, 15, 81, 24, 171, 214, 114, 191, 175, 56, 56, 48, 52, 125, 82, 253, 113, 71, 41, 201, 5, 8, 118, 162, 191, 99, 196, 48, 198, 223, 79, 204, 174, 31, 97, 236, 20, 213, 218, 85, 34, 16, 74, 196, 209, 235, 14, 71, 209, 32, 131, 195, 84, 11, 66, 74, 19, 115, 255, 99, 69, 235, 210, 204, 15, 13, 4, 143, 127, 152, 125, 212, 91 } + }, + new + { + TenantId = -1, + Id = "FullTextSearchSettings", + LastModified = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + Value = new byte[] { 8, 120, 207, 5, 153, 181, 23, 202, 162, 211, 218, 237, 157, 6, 76, 62, 220, 238, 175, 67, 31, 53, 166, 246, 66, 220, 173, 160, 72, 23, 227, 81, 50, 39, 187, 177, 222, 110, 43, 171, 235, 158, 16, 119, 178, 207, 49, 140, 72, 152, 20, 84, 94, 135, 117, 1, 246, 51, 251, 190, 148, 2, 44, 252, 221, 2, 91, 83, 149, 151, 58, 245, 16, 148, 52, 8, 187, 86, 150, 46, 227, 93, 163, 95, 47, 131, 116, 207, 95, 209, 38, 149, 53, 148, 73, 215, 206, 251, 194, 199, 189, 17, 42, 229, 135, 82, 23, 154, 162, 165, 158, 94, 23, 128, 30, 88, 12, 204, 96, 250, 236, 142, 189, 211, 214, 18, 196, 136, 102, 102, 217, 109, 108, 240, 96, 96, 94, 100, 201, 10, 31, 170, 128, 192 } + }, + new + { + TenantId = -1, + Id = "SmtpSettings", + LastModified = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + Value = new byte[] { 240, 82, 224, 144, 161, 163, 117, 13, 173, 205, 78, 153, 97, 218, 4, 170, 81, 239, 1, 151, 226, 192, 98, 60, 241, 44, 88, 56, 191, 164, 10, 155, 72, 186, 239, 203, 227, 113, 88, 119, 49, 215, 227, 220, 158, 124, 96, 9, 116, 47, 158, 65, 93, 86, 219, 15, 10, 224, 142, 50, 248, 144, 75, 44, 68, 28, 198, 87, 198, 69, 67, 234, 238, 38, 32, 68, 162, 139, 67, 53, 220, 176, 240, 196, 233, 64, 29, 137, 31, 160, 99, 105, 249, 132, 202, 45, 71, 92, 134, 194, 55, 145, 121, 97, 197, 130, 119, 105, 131, 21, 133, 35, 10, 102, 172, 119, 135, 230, 251, 86, 253, 62, 55, 56, 146, 103, 164, 106 } + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbIPLookup", b => + { + b.Property("AddrType") + .HasColumnType("enum('ipv4','ipv6')") + .HasColumnName("addr_type"); + + b.Property("IPStart") + .HasColumnType("varbinary(16)") + .HasColumnName("ip_start"); + + b.Property("City") + .IsRequired() + .HasColumnType("varchar(80)") + .HasColumnName("city"); + + b.Property("Continent") + .IsRequired() + .HasColumnType("char(2)") + .HasColumnName("continent"); + + b.Property("Country") + .IsRequired() + .HasColumnType("char(2)") + .HasColumnName("country"); + + b.Property("District") + .IsRequired() + .HasColumnType("varchar(80)") + .HasColumnName("district"); + + b.Property("GeonameId") + .HasColumnType("int(10)") + .HasColumnName("geoname_id"); + + b.Property("IPEnd") + .IsRequired() + .HasColumnType("varbinary(16)") + .HasColumnName("ip_end"); + + b.Property("Latitude") + .HasColumnType("float") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("float") + .HasColumnName("longitude"); + + b.Property("StateProv") + .IsRequired() + .HasColumnType("varchar(80)") + .HasColumnName("stateprov"); + + b.Property("StateProvCode") + .HasColumnType("varchar(15)") + .HasColumnName("stateprov_code"); + + b.Property("TimezoneName") + .IsRequired() + .HasColumnType("varchar(64)") + .HasColumnName("timezone_name"); + + b.Property("TimezoneOffset") + .HasColumnType("float") + .HasColumnName("timezone_offset"); + + b.Property("WeatherCode") + .IsRequired() + .HasColumnType("varchar(10)") + .HasColumnName("weather_code"); + + b.Property("ZipCode") + .HasColumnType("varchar(20)") + .HasColumnName("zipcode"); + + b.HasKey("AddrType", "IPStart"); + + b.ToTable("dbip_lookup", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8mb4"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbTenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Alias") + .IsRequired() + .HasColumnType("varchar(100)") + .HasColumnName("alias") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Calls") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("calls") + .HasDefaultValueSql("'1'"); + + b.Property("CreationDateTime") + .HasColumnType("datetime") + .HasColumnName("creationdatetime"); + + b.Property("Industry") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("industry") + .HasDefaultValueSql("'0'"); + + b.Property("Language") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("char(10)") + .HasColumnName("language") + .HasDefaultValueSql("'en-US'") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastModified") + .HasColumnType("timestamp") + .HasColumnName("last_modified"); + + b.Property("MappedDomain") + .HasColumnType("varchar(100)") + .HasColumnName("mappeddomain") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("OwnerId") + .HasColumnType("varchar(38)") + .HasColumnName("owner_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("PaymentId") + .HasColumnType("varchar(38)") + .HasColumnName("payment_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Spam") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("spam") + .HasDefaultValueSql("'1'"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("status") + .HasDefaultValueSql("'0'"); + + b.Property("StatusChanged") + .HasColumnType("datetime") + .HasColumnName("statuschanged"); + + b.Property("TimeZone") + .HasColumnType("varchar(50)") + .HasColumnName("timezone") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TrustedDomainsEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("trusteddomainsenabled") + .HasDefaultValueSql("'1'"); + + b.Property("TrustedDomainsRaw") + .HasColumnType("varchar(1024)") + .HasColumnName("trusteddomains") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Version") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("version") + .HasDefaultValueSql("'2'"); + + b.Property("Version_Changed") + .HasColumnType("datetime") + .HasColumnName("version_changed"); + + b.HasKey("Id"); + + b.HasIndex("Alias") + .IsUnique() + .HasDatabaseName("alias"); + + b.HasIndex("LastModified") + .HasDatabaseName("last_modified"); + + b.HasIndex("MappedDomain") + .HasDatabaseName("mappeddomain"); + + b.HasIndex("Version") + .HasDatabaseName("version"); + + b.ToTable("tenants_tenants", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + Id = 1, + Alias = "localhost", + Calls = false, + CreationDateTime = new DateTime(2021, 3, 9, 17, 46, 59, 97, DateTimeKind.Utc).AddTicks(4317), + Industry = 0, + LastModified = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + Name = "Web Office", + OwnerId = "66faa6e4-f133-11ea-b126-00ffeec8b4ef", + Spam = false, + Status = 0, + TrustedDomainsEnabled = 0, + Version = 0 + }, + new + { + Id = -1, + Alias = "settings", + Calls = false, + CreationDateTime = new DateTime(2021, 3, 9, 17, 46, 59, 97, DateTimeKind.Utc).AddTicks(4317), + Industry = 0, + LastModified = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + Name = "Web Office", + OwnerId = "00000000-0000-0000-0000-000000000000", + Spam = false, + Status = 1, + TrustedDomainsEnabled = 0, + Version = 0 + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbTenantForbiden", b => + { + b.Property("Address") + .HasColumnType("varchar(50)") + .HasColumnName("address") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Address") + .HasName("PRIMARY"); + + b.ToTable("tenants_forbiden", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + Address = "controlpanel" + }, + new + { + Address = "localhost" + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbTenantPartner", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("AffiliateId") + .HasColumnType("varchar(50)") + .HasColumnName("affiliate_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Campaign") + .HasColumnType("varchar(50)") + .HasColumnName("campaign") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("PartnerId") + .HasColumnType("varchar(36)") + .HasColumnName("partner_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId") + .HasName("PRIMARY"); + + b.ToTable("tenants_partners", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbTenantVersion", b => + { + b.Property("Id") + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("DefaultVersion") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("default_version") + .HasDefaultValueSql("'0'"); + + b.Property("Url") + .IsRequired() + .HasColumnType("varchar(64)") + .HasColumnName("url") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Version") + .IsRequired() + .HasColumnType("varchar(64)") + .HasColumnName("version") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Visible") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("visible") + .HasDefaultValueSql("'0'"); + + b.HasKey("Id"); + + b.ToTable("tenants_version", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbWebstudioIndex", b => + { + b.Property("IndexName") + .HasColumnType("varchar(50)") + .HasColumnName("index_name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastModified") + .HasColumnType("timestamp") + .HasColumnName("last_modified"); + + b.HasKey("IndexName") + .HasName("PRIMARY"); + + b.ToTable("webstudio_index", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbWebstudioSettings", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("TenantID"); + + b.Property("Id") + .HasColumnType("varchar(64)") + .HasColumnName("ID") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UserId") + .HasColumnType("varchar(64)") + .HasColumnName("UserID") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Data") + .IsRequired() + .HasColumnType("mediumtext") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId", "Id", "UserId") + .HasName("PRIMARY"); + + b.HasIndex("Id") + .HasDatabaseName("ID"); + + b.ToTable("webstudio_settings", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + TenantId = 1, + Id = "9a925891-1f92-4ed7-b277-d6f649739f06", + UserId = "00000000-0000-0000-0000-000000000000", + Data = "{\"Completed\":false}" + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbWebstudioUserVisit", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenantid"); + + b.Property("VisitDate") + .HasColumnType("datetime") + .HasColumnName("visitdate"); + + b.Property("ProductId") + .HasColumnType("varchar(38)") + .HasColumnName("productid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UserId") + .HasColumnType("varchar(38)") + .HasColumnName("userid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("FirstVisitTime") + .ValueGeneratedOnAdd() + .HasColumnType("datetime") + .HasColumnName("firstvisittime") + .HasDefaultValueSql("NULL"); + + b.Property("LastVisitTime") + .ValueGeneratedOnAdd() + .HasColumnType("datetime") + .HasColumnName("lastvisittime") + .HasDefaultValueSql("NULL"); + + b.Property("VisitCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("visitcount") + .HasDefaultValueSql("'0'"); + + b.HasKey("TenantId", "VisitDate", "ProductId", "UserId") + .HasName("PRIMARY"); + + b.HasIndex("VisitDate") + .HasDatabaseName("visitdate"); + + b.ToTable("webstudio_uservisit", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.FilesConverts", b => + { + b.Property("Input") + .HasColumnType("varchar(50)") + .HasColumnName("input") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Output") + .HasColumnType("varchar(50)") + .HasColumnName("output") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Input", "Output") + .HasName("PRIMARY"); + + b.ToTable("files_converts", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + Input = ".csv", + Output = ".ods" + }, + new + { + Input = ".csv", + Output = ".pdf" + }, + new + { + Input = ".csv", + Output = ".ots" + }, + new + { + Input = ".csv", + Output = ".xlsx" + }, + new + { + Input = ".csv", + Output = ".xlsm" + }, + new + { + Input = ".csv", + Output = ".xltm" + }, + new + { + Input = ".csv", + Output = ".xltx" + }, + new + { + Input = ".doc", + Output = ".docx" + }, + new + { + Input = ".doc", + Output = ".docm" + }, + new + { + Input = ".doc", + Output = ".dotm" + }, + new + { + Input = ".doc", + Output = ".dotx" + }, + new + { + Input = ".doc", + Output = ".epub" + }, + new + { + Input = ".doc", + Output = ".fb2" + }, + new + { + Input = ".doc", + Output = ".html" + }, + new + { + Input = ".doc", + Output = ".ott" + }, + new + { + Input = ".doc", + Output = ".odt" + }, + new + { + Input = ".doc", + Output = ".pdf" + }, + new + { + Input = ".doc", + Output = ".rtf" + }, + new + { + Input = ".doc", + Output = ".txt" + }, + new + { + Input = ".docm", + Output = ".docx" + }, + new + { + Input = ".docm", + Output = ".dotm" + }, + new + { + Input = ".docm", + Output = ".html" + }, + new + { + Input = ".docm", + Output = ".dotx" + }, + new + { + Input = ".docm", + Output = ".epub" + }, + new + { + Input = ".docm", + Output = ".fb2" + }, + new + { + Input = ".docm", + Output = ".ott" + }, + new + { + Input = ".docm", + Output = ".odt" + }, + new + { + Input = ".docm", + Output = ".pdf" + }, + new + { + Input = ".docm", + Output = ".rtf" + }, + new + { + Input = ".docm", + Output = ".txt" + }, + new + { + Input = ".doct", + Output = ".docx" + }, + new + { + Input = ".docx", + Output = ".odt" + }, + new + { + Input = ".docx", + Output = ".pdf" + }, + new + { + Input = ".docx", + Output = ".rtf" + }, + new + { + Input = ".docx", + Output = ".txt" + }, + new + { + Input = ".docx", + Output = ".html" + }, + new + { + Input = ".docx", + Output = ".dotm" + }, + new + { + Input = ".docx", + Output = ".dotx" + }, + new + { + Input = ".docx", + Output = ".epub" + }, + new + { + Input = ".docx", + Output = ".fb2" + }, + new + { + Input = ".docx", + Output = ".ott" + }, + new + { + Input = ".docx", + Output = ".docm" + }, + new + { + Input = ".docx", + Output = ".docxf" + }, + new + { + Input = ".docxf", + Output = ".docm" + }, + new + { + Input = ".docxf", + Output = ".docx" + }, + new + { + Input = ".docxf", + Output = ".dotm" + }, + new + { + Input = ".docxf", + Output = ".odt" + }, + new + { + Input = ".docxf", + Output = ".oform" + }, + new + { + Input = ".docxf", + Output = ".pdf" + }, + new + { + Input = ".docxf", + Output = ".rtf" + }, + new + { + Input = ".docxf", + Output = ".txt" + }, + new + { + Input = ".docxf", + Output = ".dotx" + }, + new + { + Input = ".docxf", + Output = ".epub" + }, + new + { + Input = ".docxf", + Output = ".fb2" + }, + new + { + Input = ".docxf", + Output = ".html" + }, + new + { + Input = ".docxf", + Output = ".ott" + }, + new + { + Input = ".dot", + Output = ".docx" + }, + new + { + Input = ".dot", + Output = ".odt" + }, + new + { + Input = ".dot", + Output = ".pdf" + }, + new + { + Input = ".dot", + Output = ".rtf" + }, + new + { + Input = ".dot", + Output = ".txt" + }, + new + { + Input = ".dot", + Output = ".docm" + }, + new + { + Input = ".dot", + Output = ".dotm" + }, + new + { + Input = ".dot", + Output = ".dotx" + }, + new + { + Input = ".dot", + Output = ".epub" + }, + new + { + Input = ".dot", + Output = ".fb2" + }, + new + { + Input = ".dot", + Output = ".html" + }, + new + { + Input = ".dot", + Output = ".ott" + }, + new + { + Input = ".dotm", + Output = ".docx" + }, + new + { + Input = ".dotm", + Output = ".odt" + }, + new + { + Input = ".dotm", + Output = ".pdf" + }, + new + { + Input = ".dotm", + Output = ".rtf" + }, + new + { + Input = ".dotm", + Output = ".txt" + }, + new + { + Input = ".dotm", + Output = ".docm" + }, + new + { + Input = ".dotm", + Output = ".dotx" + }, + new + { + Input = ".dotm", + Output = ".epub" + }, + new + { + Input = ".dotm", + Output = ".fb2" + }, + new + { + Input = ".dotm", + Output = ".html" + }, + new + { + Input = ".dotm", + Output = ".ott" + }, + new + { + Input = ".dotx", + Output = ".docx" + }, + new + { + Input = ".dotx", + Output = ".odt" + }, + new + { + Input = ".dotx", + Output = ".pdf" + }, + new + { + Input = ".dotx", + Output = ".rtf" + }, + new + { + Input = ".dotx", + Output = ".txt" + }, + new + { + Input = ".dotx", + Output = ".docm" + }, + new + { + Input = ".dotx", + Output = ".dotm" + }, + new + { + Input = ".dotx", + Output = ".epub" + }, + new + { + Input = ".dotx", + Output = ".fb2" + }, + new + { + Input = ".dotx", + Output = ".html" + }, + new + { + Input = ".dotx", + Output = ".ott" + }, + new + { + Input = ".dps", + Output = ".odp" + }, + new + { + Input = ".dps", + Output = ".otp" + }, + new + { + Input = ".dps", + Output = ".pdf" + }, + new + { + Input = ".dps", + Output = ".potm" + }, + new + { + Input = ".dps", + Output = ".potx" + }, + new + { + Input = ".dps", + Output = ".ppsm" + }, + new + { + Input = ".dps", + Output = ".ppsx" + }, + new + { + Input = ".dps", + Output = ".pptm" + }, + new + { + Input = ".dps", + Output = ".pptx" + }, + new + { + Input = ".dpt", + Output = ".odp" + }, + new + { + Input = ".dpt", + Output = ".otp" + }, + new + { + Input = ".dpt", + Output = ".pdf" + }, + new + { + Input = ".dpt", + Output = ".potm" + }, + new + { + Input = ".dpt", + Output = ".potx" + }, + new + { + Input = ".dpt", + Output = ".ppsm" + }, + new + { + Input = ".dpt", + Output = ".ppsx" + }, + new + { + Input = ".dpt", + Output = ".pptm" + }, + new + { + Input = ".dpt", + Output = ".pptx" + }, + new + { + Input = ".epub", + Output = ".docx" + }, + new + { + Input = ".epub", + Output = ".odt" + }, + new + { + Input = ".epub", + Output = ".pdf" + }, + new + { + Input = ".epub", + Output = ".rtf" + }, + new + { + Input = ".epub", + Output = ".txt" + }, + new + { + Input = ".epub", + Output = ".docm" + }, + new + { + Input = ".epub", + Output = ".dotm" + }, + new + { + Input = ".epub", + Output = ".dotx" + }, + new + { + Input = ".epub", + Output = ".fb2" + }, + new + { + Input = ".epub", + Output = ".html" + }, + new + { + Input = ".epub", + Output = ".ott" + }, + new + { + Input = ".et", + Output = ".csv" + }, + new + { + Input = ".et", + Output = ".ods" + }, + new + { + Input = ".et", + Output = ".ots" + }, + new + { + Input = ".et", + Output = ".pdf" + }, + new + { + Input = ".et", + Output = ".xlsm" + }, + new + { + Input = ".et", + Output = ".xlsx" + }, + new + { + Input = ".et", + Output = ".xltm" + }, + new + { + Input = ".et", + Output = ".xltx" + }, + new + { + Input = ".ett", + Output = ".csv" + }, + new + { + Input = ".ett", + Output = ".ods" + }, + new + { + Input = ".ett", + Output = ".ots" + }, + new + { + Input = ".ett", + Output = ".pdf" + }, + new + { + Input = ".ett", + Output = ".xlsm" + }, + new + { + Input = ".ett", + Output = ".xlsx" + }, + new + { + Input = ".ett", + Output = ".xltm" + }, + new + { + Input = ".ett", + Output = ".xltx" + }, + new + { + Input = ".fb2", + Output = ".docx" + }, + new + { + Input = ".fb2", + Output = ".odt" + }, + new + { + Input = ".fb2", + Output = ".pdf" + }, + new + { + Input = ".fb2", + Output = ".rtf" + }, + new + { + Input = ".fb2", + Output = ".txt" + }, + new + { + Input = ".fb2", + Output = ".docm" + }, + new + { + Input = ".fb2", + Output = ".dotm" + }, + new + { + Input = ".fb2", + Output = ".dotx" + }, + new + { + Input = ".fb2", + Output = ".epub" + }, + new + { + Input = ".fb2", + Output = ".html" + }, + new + { + Input = ".fb2", + Output = ".ott" + }, + new + { + Input = ".fodp", + Output = ".odp" + }, + new + { + Input = ".fodp", + Output = ".pdf" + }, + new + { + Input = ".fodp", + Output = ".pptx" + }, + new + { + Input = ".fodp", + Output = ".otp" + }, + new + { + Input = ".fodp", + Output = ".potm" + }, + new + { + Input = ".fodp", + Output = ".potx" + }, + new + { + Input = ".fodp", + Output = ".ppsm" + }, + new + { + Input = ".fodp", + Output = ".ppsx" + }, + new + { + Input = ".fodp", + Output = ".pptm" + }, + new + { + Input = ".fods", + Output = ".csv" + }, + new + { + Input = ".fods", + Output = ".ods" + }, + new + { + Input = ".fods", + Output = ".pdf" + }, + new + { + Input = ".fods", + Output = ".xlsx" + }, + new + { + Input = ".fods", + Output = ".xlsm" + }, + new + { + Input = ".fods", + Output = ".xltm" + }, + new + { + Input = ".fods", + Output = ".xltx" + }, + new + { + Input = ".fods", + Output = ".ots" + }, + new + { + Input = ".fodt", + Output = ".docx" + }, + new + { + Input = ".fodt", + Output = ".odt" + }, + new + { + Input = ".fodt", + Output = ".docm" + }, + new + { + Input = ".fodt", + Output = ".pdf" + }, + new + { + Input = ".fodt", + Output = ".rtf" + }, + new + { + Input = ".fodt", + Output = ".txt" + }, + new + { + Input = ".fodt", + Output = ".dotm" + }, + new + { + Input = ".fodt", + Output = ".dotx" + }, + new + { + Input = ".fodt", + Output = ".epub" + }, + new + { + Input = ".fodt", + Output = ".fb2" + }, + new + { + Input = ".fodt", + Output = ".html" + }, + new + { + Input = ".fodt", + Output = ".ott" + }, + new + { + Input = ".htm", + Output = ".docm" + }, + new + { + Input = ".htm", + Output = ".docx" + }, + new + { + Input = ".htm", + Output = ".dotm" + }, + new + { + Input = ".htm", + Output = ".dotx" + }, + new + { + Input = ".htm", + Output = ".epub" + }, + new + { + Input = ".htm", + Output = ".fb2" + }, + new + { + Input = ".htm", + Output = ".html" + }, + new + { + Input = ".htm", + Output = ".odt" + }, + new + { + Input = ".htm", + Output = ".ott" + }, + new + { + Input = ".htm", + Output = ".pdf" + }, + new + { + Input = ".htm", + Output = ".rtf" + }, + new + { + Input = ".htm", + Output = ".txt" + }, + new + { + Input = ".html", + Output = ".docx" + }, + new + { + Input = ".html", + Output = ".odt" + }, + new + { + Input = ".html", + Output = ".pdf" + }, + new + { + Input = ".html", + Output = ".rtf" + }, + new + { + Input = ".html", + Output = ".txt" + }, + new + { + Input = ".html", + Output = ".docm" + }, + new + { + Input = ".html", + Output = ".dotm" + }, + new + { + Input = ".html", + Output = ".dotx" + }, + new + { + Input = ".html", + Output = ".epub" + }, + new + { + Input = ".html", + Output = ".fb2" + }, + new + { + Input = ".html", + Output = ".ott" + }, + new + { + Input = ".mht", + Output = ".docx" + }, + new + { + Input = ".mht", + Output = ".odt" + }, + new + { + Input = ".mht", + Output = ".pdf" + }, + new + { + Input = ".mht", + Output = ".rtf" + }, + new + { + Input = ".mht", + Output = ".txt" + }, + new + { + Input = ".mht", + Output = ".docm" + }, + new + { + Input = ".mht", + Output = ".dotm" + }, + new + { + Input = ".mht", + Output = ".dotx" + }, + new + { + Input = ".mht", + Output = ".epub" + }, + new + { + Input = ".mht", + Output = ".fb2" + }, + new + { + Input = ".mht", + Output = ".html" + }, + new + { + Input = ".mht", + Output = ".ott" + }, + new + { + Input = ".mhtml", + Output = ".docm" + }, + new + { + Input = ".mhtml", + Output = ".docx" + }, + new + { + Input = ".mhtml", + Output = ".dotm" + }, + new + { + Input = ".mhtml", + Output = ".dotx" + }, + new + { + Input = ".mhtml", + Output = ".epub" + }, + new + { + Input = ".mhtml", + Output = ".fb2" + }, + new + { + Input = ".mhtml", + Output = ".html" + }, + new + { + Input = ".mhtml", + Output = ".odt" + }, + new + { + Input = ".mhtml", + Output = ".ott" + }, + new + { + Input = ".mhtml", + Output = ".pdf" + }, + new + { + Input = ".mhtml", + Output = ".rtf" + }, + new + { + Input = ".mhtml", + Output = ".txt" + }, + new + { + Input = ".odp", + Output = ".pdf" + }, + new + { + Input = ".odp", + Output = ".pptx" + }, + new + { + Input = ".odp", + Output = ".otp" + }, + new + { + Input = ".odp", + Output = ".potm" + }, + new + { + Input = ".odp", + Output = ".potx" + }, + new + { + Input = ".odp", + Output = ".ppsm" + }, + new + { + Input = ".odp", + Output = ".ppsx" + }, + new + { + Input = ".odp", + Output = ".pptm" + }, + new + { + Input = ".otp", + Output = ".odp" + }, + new + { + Input = ".otp", + Output = ".pdf" + }, + new + { + Input = ".otp", + Output = ".potm" + }, + new + { + Input = ".otp", + Output = ".potx" + }, + new + { + Input = ".otp", + Output = ".pptm" + }, + new + { + Input = ".otp", + Output = ".ppsm" + }, + new + { + Input = ".otp", + Output = ".ppsx" + }, + new + { + Input = ".otp", + Output = ".pptx" + }, + new + { + Input = ".ods", + Output = ".csv" + }, + new + { + Input = ".ods", + Output = ".pdf" + }, + new + { + Input = ".ods", + Output = ".xlsx" + }, + new + { + Input = ".ods", + Output = ".ots" + }, + new + { + Input = ".ods", + Output = ".xlsm" + }, + new + { + Input = ".ods", + Output = ".xltm" + }, + new + { + Input = ".ods", + Output = ".xltx" + }, + new + { + Input = ".ots", + Output = ".csv" + }, + new + { + Input = ".ots", + Output = ".ods" + }, + new + { + Input = ".ots", + Output = ".pdf" + }, + new + { + Input = ".ots", + Output = ".xlsm" + }, + new + { + Input = ".ots", + Output = ".xltm" + }, + new + { + Input = ".ots", + Output = ".xltx" + }, + new + { + Input = ".ots", + Output = ".xlsx" + }, + new + { + Input = ".odt", + Output = ".docx" + }, + new + { + Input = ".odt", + Output = ".pdf" + }, + new + { + Input = ".odt", + Output = ".rtf" + }, + new + { + Input = ".odt", + Output = ".txt" + }, + new + { + Input = ".odt", + Output = ".docm" + }, + new + { + Input = ".odt", + Output = ".dotm" + }, + new + { + Input = ".odt", + Output = ".dotx" + }, + new + { + Input = ".odt", + Output = ".epub" + }, + new + { + Input = ".odt", + Output = ".fb2" + }, + new + { + Input = ".odt", + Output = ".html" + }, + new + { + Input = ".odt", + Output = ".ott" + }, + new + { + Input = ".ott", + Output = ".docx" + }, + new + { + Input = ".ott", + Output = ".odt" + }, + new + { + Input = ".ott", + Output = ".pdf" + }, + new + { + Input = ".ott", + Output = ".rtf" + }, + new + { + Input = ".ott", + Output = ".txt" + }, + new + { + Input = ".ott", + Output = ".docm" + }, + new + { + Input = ".ott", + Output = ".dotm" + }, + new + { + Input = ".ott", + Output = ".dotx" + }, + new + { + Input = ".ott", + Output = ".epub" + }, + new + { + Input = ".ott", + Output = ".fb2" + }, + new + { + Input = ".ott", + Output = ".html" + }, + new + { + Input = ".oxps", + Output = ".docm" + }, + new + { + Input = ".oxps", + Output = ".docx" + }, + new + { + Input = ".oxps", + Output = ".dotm" + }, + new + { + Input = ".oxps", + Output = ".dotx" + }, + new + { + Input = ".oxps", + Output = ".epub" + }, + new + { + Input = ".oxps", + Output = ".fb2" + }, + new + { + Input = ".oxps", + Output = ".html" + }, + new + { + Input = ".oxps", + Output = ".odt" + }, + new + { + Input = ".oxps", + Output = ".ott" + }, + new + { + Input = ".oxps", + Output = ".pdf" + }, + new + { + Input = ".oxps", + Output = ".rtf" + }, + new + { + Input = ".oxps", + Output = ".txt" + }, + new + { + Input = ".pdf", + Output = ".docm" + }, + new + { + Input = ".pdf", + Output = ".docx" + }, + new + { + Input = ".pdf", + Output = ".dotm" + }, + new + { + Input = ".pdf", + Output = ".dotx" + }, + new + { + Input = ".pdf", + Output = ".epub" + }, + new + { + Input = ".pdf", + Output = ".fb2" + }, + new + { + Input = ".pdf", + Output = ".html" + }, + new + { + Input = ".pdf", + Output = ".odt" + }, + new + { + Input = ".pdf", + Output = ".ott" + }, + new + { + Input = ".pdf", + Output = ".rtf" + }, + new + { + Input = ".pdf", + Output = ".txt" + }, + new + { + Input = ".pot", + Output = ".odp" + }, + new + { + Input = ".pot", + Output = ".pdf" + }, + new + { + Input = ".pot", + Output = ".pptx" + }, + new + { + Input = ".pot", + Output = ".otp" + }, + new + { + Input = ".pot", + Output = ".potm" + }, + new + { + Input = ".pot", + Output = ".potx" + }, + new + { + Input = ".pot", + Output = ".pptm" + }, + new + { + Input = ".pot", + Output = ".ppsm" + }, + new + { + Input = ".pot", + Output = ".ppsx" + }, + new + { + Input = ".potm", + Output = ".odp" + }, + new + { + Input = ".potm", + Output = ".pdf" + }, + new + { + Input = ".potm", + Output = ".pptx" + }, + new + { + Input = ".potm", + Output = ".otp" + }, + new + { + Input = ".potm", + Output = ".potx" + }, + new + { + Input = ".potm", + Output = ".pptm" + }, + new + { + Input = ".potm", + Output = ".ppsm" + }, + new + { + Input = ".potm", + Output = ".ppsx" + }, + new + { + Input = ".potx", + Output = ".odp" + }, + new + { + Input = ".potx", + Output = ".pdf" + }, + new + { + Input = ".potx", + Output = ".pptx" + }, + new + { + Input = ".potx", + Output = ".otp" + }, + new + { + Input = ".potx", + Output = ".potm" + }, + new + { + Input = ".potx", + Output = ".pptm" + }, + new + { + Input = ".potx", + Output = ".ppsm" + }, + new + { + Input = ".potx", + Output = ".ppsx" + }, + new + { + Input = ".pps", + Output = ".odp" + }, + new + { + Input = ".pps", + Output = ".pdf" + }, + new + { + Input = ".pps", + Output = ".pptx" + }, + new + { + Input = ".pps", + Output = ".otp" + }, + new + { + Input = ".pps", + Output = ".potm" + }, + new + { + Input = ".pps", + Output = ".potx" + }, + new + { + Input = ".pps", + Output = ".pptm" + }, + new + { + Input = ".pps", + Output = ".ppsm" + }, + new + { + Input = ".pps", + Output = ".ppsx" + }, + new + { + Input = ".ppsm", + Output = ".odp" + }, + new + { + Input = ".ppsm", + Output = ".pdf" + }, + new + { + Input = ".ppsm", + Output = ".pptx" + }, + new + { + Input = ".ppsm", + Output = ".otp" + }, + new + { + Input = ".ppsm", + Output = ".potm" + }, + new + { + Input = ".ppsm", + Output = ".potx" + }, + new + { + Input = ".ppsm", + Output = ".pptm" + }, + new + { + Input = ".ppsm", + Output = ".ppsx" + }, + new + { + Input = ".ppsx", + Output = ".odp" + }, + new + { + Input = ".ppsx", + Output = ".pdf" + }, + new + { + Input = ".ppsx", + Output = ".pptx" + }, + new + { + Input = ".ppsx", + Output = ".otp" + }, + new + { + Input = ".ppsx", + Output = ".potm" + }, + new + { + Input = ".ppsx", + Output = ".potx" + }, + new + { + Input = ".ppsx", + Output = ".ppsm" + }, + new + { + Input = ".ppsx", + Output = ".pptm" + }, + new + { + Input = ".ppt", + Output = ".odp" + }, + new + { + Input = ".ppt", + Output = ".pdf" + }, + new + { + Input = ".ppt", + Output = ".pptx" + }, + new + { + Input = ".ppt", + Output = ".otp" + }, + new + { + Input = ".ppt", + Output = ".potm" + }, + new + { + Input = ".ppt", + Output = ".potx" + }, + new + { + Input = ".ppt", + Output = ".pptm" + }, + new + { + Input = ".ppt", + Output = ".ppsm" + }, + new + { + Input = ".ppt", + Output = ".ppsx" + }, + new + { + Input = ".pptm", + Output = ".odp" + }, + new + { + Input = ".pptm", + Output = ".pdf" + }, + new + { + Input = ".pptm", + Output = ".pptx" + }, + new + { + Input = ".pptm", + Output = ".otp" + }, + new + { + Input = ".pptm", + Output = ".potm" + }, + new + { + Input = ".pptm", + Output = ".potx" + }, + new + { + Input = ".pptm", + Output = ".ppsm" + }, + new + { + Input = ".pptm", + Output = ".ppsx" + }, + new + { + Input = ".pptt", + Output = ".pptx" + }, + new + { + Input = ".pptx", + Output = ".odp" + }, + new + { + Input = ".pptx", + Output = ".pdf" + }, + new + { + Input = ".pptx", + Output = ".otp" + }, + new + { + Input = ".pptx", + Output = ".potm" + }, + new + { + Input = ".pptx", + Output = ".potx" + }, + new + { + Input = ".pptx", + Output = ".pptm" + }, + new + { + Input = ".pptx", + Output = ".ppsm" + }, + new + { + Input = ".pptx", + Output = ".ppsx" + }, + new + { + Input = ".rtf", + Output = ".odt" + }, + new + { + Input = ".rtf", + Output = ".pdf" + }, + new + { + Input = ".rtf", + Output = ".docx" + }, + new + { + Input = ".rtf", + Output = ".txt" + }, + new + { + Input = ".rtf", + Output = ".docm" + }, + new + { + Input = ".rtf", + Output = ".dotm" + }, + new + { + Input = ".rtf", + Output = ".dotx" + }, + new + { + Input = ".rtf", + Output = ".epub" + }, + new + { + Input = ".rtf", + Output = ".fb2" + }, + new + { + Input = ".rtf", + Output = ".html" + }, + new + { + Input = ".rtf", + Output = ".ott" + }, + new + { + Input = ".stw", + Output = ".docm" + }, + new + { + Input = ".stw", + Output = ".docx" + }, + new + { + Input = ".stw", + Output = ".dotm" + }, + new + { + Input = ".stw", + Output = ".dotx" + }, + new + { + Input = ".stw", + Output = ".epub" + }, + new + { + Input = ".stw", + Output = ".fb2" + }, + new + { + Input = ".stw", + Output = ".html" + }, + new + { + Input = ".stw", + Output = ".odt" + }, + new + { + Input = ".stw", + Output = ".ott" + }, + new + { + Input = ".stw", + Output = ".pdf" + }, + new + { + Input = ".stw", + Output = ".rtf" + }, + new + { + Input = ".stw", + Output = ".txt" + }, + new + { + Input = ".sxc", + Output = ".csv" + }, + new + { + Input = ".sxc", + Output = ".ods" + }, + new + { + Input = ".sxc", + Output = ".ots" + }, + new + { + Input = ".sxc", + Output = ".pdf" + }, + new + { + Input = ".sxc", + Output = ".xlsm" + }, + new + { + Input = ".sxc", + Output = ".xlsx" + }, + new + { + Input = ".sxc", + Output = ".xltm" + }, + new + { + Input = ".sxc", + Output = ".xltx" + }, + new + { + Input = ".sxi", + Output = ".odp" + }, + new + { + Input = ".sxi", + Output = ".otp" + }, + new + { + Input = ".sxi", + Output = ".pdf" + }, + new + { + Input = ".sxi", + Output = ".potm" + }, + new + { + Input = ".sxi", + Output = ".potx" + }, + new + { + Input = ".sxi", + Output = ".ppsm" + }, + new + { + Input = ".sxi", + Output = ".ppsx" + }, + new + { + Input = ".sxi", + Output = ".pptm" + }, + new + { + Input = ".sxi", + Output = ".pptx" + }, + new + { + Input = ".sxw", + Output = ".docm" + }, + new + { + Input = ".sxw", + Output = ".docx" + }, + new + { + Input = ".sxw", + Output = ".dotm" + }, + new + { + Input = ".sxw", + Output = ".dotx" + }, + new + { + Input = ".sxw", + Output = ".epub" + }, + new + { + Input = ".sxw", + Output = ".fb2" + }, + new + { + Input = ".sxw", + Output = ".html" + }, + new + { + Input = ".sxw", + Output = ".odt" + }, + new + { + Input = ".sxw", + Output = ".ott" + }, + new + { + Input = ".sxw", + Output = ".pdf" + }, + new + { + Input = ".sxw", + Output = ".rtf" + }, + new + { + Input = ".sxw", + Output = ".txt" + }, + new + { + Input = ".txt", + Output = ".pdf" + }, + new + { + Input = ".txt", + Output = ".docx" + }, + new + { + Input = ".txt", + Output = ".odt" + }, + new + { + Input = ".txt", + Output = ".rtf" + }, + new + { + Input = ".txt", + Output = ".docm" + }, + new + { + Input = ".txt", + Output = ".dotm" + }, + new + { + Input = ".txt", + Output = ".dotx" + }, + new + { + Input = ".txt", + Output = ".epub" + }, + new + { + Input = ".txt", + Output = ".fb2" + }, + new + { + Input = ".txt", + Output = ".html" + }, + new + { + Input = ".txt", + Output = ".ott" + }, + new + { + Input = ".wps", + Output = ".docm" + }, + new + { + Input = ".wps", + Output = ".docx" + }, + new + { + Input = ".wps", + Output = ".dotm" + }, + new + { + Input = ".wps", + Output = ".dotx" + }, + new + { + Input = ".wps", + Output = ".epub" + }, + new + { + Input = ".wps", + Output = ".fb2" + }, + new + { + Input = ".wps", + Output = ".html" + }, + new + { + Input = ".wps", + Output = ".odt" + }, + new + { + Input = ".wps", + Output = ".ott" + }, + new + { + Input = ".wps", + Output = ".pdf" + }, + new + { + Input = ".wps", + Output = ".rtf" + }, + new + { + Input = ".wps", + Output = ".txt" + }, + new + { + Input = ".wpt", + Output = ".docm" + }, + new + { + Input = ".wpt", + Output = ".docx" + }, + new + { + Input = ".wpt", + Output = ".dotm" + }, + new + { + Input = ".wpt", + Output = ".dotx" + }, + new + { + Input = ".wpt", + Output = ".epub" + }, + new + { + Input = ".wpt", + Output = ".fb2" + }, + new + { + Input = ".wpt", + Output = ".html" + }, + new + { + Input = ".wpt", + Output = ".odt" + }, + new + { + Input = ".wpt", + Output = ".ott" + }, + new + { + Input = ".wpt", + Output = ".pdf" + }, + new + { + Input = ".wpt", + Output = ".rtf" + }, + new + { + Input = ".wpt", + Output = ".txt" + }, + new + { + Input = ".xls", + Output = ".csv" + }, + new + { + Input = ".xls", + Output = ".ods" + }, + new + { + Input = ".xls", + Output = ".pdf" + }, + new + { + Input = ".xls", + Output = ".xlsx" + }, + new + { + Input = ".xls", + Output = ".ots" + }, + new + { + Input = ".xls", + Output = ".xlsm" + }, + new + { + Input = ".xls", + Output = ".xltm" + }, + new + { + Input = ".xls", + Output = ".xltx" + }, + new + { + Input = ".xlsb", + Output = ".csv" + }, + new + { + Input = ".xlsb", + Output = ".ods" + }, + new + { + Input = ".xlsb", + Output = ".ots" + }, + new + { + Input = ".xlsb", + Output = ".pdf" + }, + new + { + Input = ".xlsb", + Output = ".xlsm" + }, + new + { + Input = ".xlsb", + Output = ".xlsx" + }, + new + { + Input = ".xlsb", + Output = ".xltm" + }, + new + { + Input = ".xlsb", + Output = ".xltx" + }, + new + { + Input = ".xlsm", + Output = ".csv" + }, + new + { + Input = ".xlsm", + Output = ".xltm" + }, + new + { + Input = ".xlsm", + Output = ".xltx" + }, + new + { + Input = ".xlsm", + Output = ".ots" + }, + new + { + Input = ".xlsm", + Output = ".pdf" + }, + new + { + Input = ".xlsm", + Output = ".ods" + }, + new + { + Input = ".xlsm", + Output = ".xlsx" + }, + new + { + Input = ".xlsx", + Output = ".csv" + }, + new + { + Input = ".xlsx", + Output = ".ods" + }, + new + { + Input = ".xlsx", + Output = ".ots" + }, + new + { + Input = ".xlsx", + Output = ".pdf" + }, + new + { + Input = ".xlsx", + Output = ".xlsm" + }, + new + { + Input = ".xlsx", + Output = ".xltm" + }, + new + { + Input = ".xlsx", + Output = ".xltx" + }, + new + { + Input = ".xlst", + Output = ".xlsx" + }, + new + { + Input = ".xlt", + Output = ".csv" + }, + new + { + Input = ".xlt", + Output = ".ods" + }, + new + { + Input = ".xlt", + Output = ".pdf" + }, + new + { + Input = ".xlt", + Output = ".xlsx" + }, + new + { + Input = ".xlt", + Output = ".ots" + }, + new + { + Input = ".xlt", + Output = ".xlsm" + }, + new + { + Input = ".xlt", + Output = ".xltm" + }, + new + { + Input = ".xlt", + Output = ".xltx" + }, + new + { + Input = ".xltm", + Output = ".csv" + }, + new + { + Input = ".xltm", + Output = ".ods" + }, + new + { + Input = ".xltm", + Output = ".pdf" + }, + new + { + Input = ".xltm", + Output = ".ots" + }, + new + { + Input = ".xltm", + Output = ".xlsm" + }, + new + { + Input = ".xltm", + Output = ".xltx" + }, + new + { + Input = ".xltm", + Output = ".xlsx" + }, + new + { + Input = ".xltx", + Output = ".pdf" + }, + new + { + Input = ".xltx", + Output = ".csv" + }, + new + { + Input = ".xltx", + Output = ".ods" + }, + new + { + Input = ".xltx", + Output = ".ots" + }, + new + { + Input = ".xltx", + Output = ".xlsm" + }, + new + { + Input = ".xltx", + Output = ".xltm" + }, + new + { + Input = ".xltx", + Output = ".xlsx" + }, + new + { + Input = ".xml", + Output = ".docm" + }, + new + { + Input = ".xml", + Output = ".docx" + }, + new + { + Input = ".xml", + Output = ".dotm" + }, + new + { + Input = ".xml", + Output = ".dotx" + }, + new + { + Input = ".xml", + Output = ".epub" + }, + new + { + Input = ".xml", + Output = ".fb2" + }, + new + { + Input = ".xml", + Output = ".html" + }, + new + { + Input = ".xml", + Output = ".odt" + }, + new + { + Input = ".xml", + Output = ".ott" + }, + new + { + Input = ".xml", + Output = ".pdf" + }, + new + { + Input = ".xml", + Output = ".rtf" + }, + new + { + Input = ".xml", + Output = ".txt" + }, + new + { + Input = ".xps", + Output = ".docm" + }, + new + { + Input = ".xps", + Output = ".docx" + }, + new + { + Input = ".xps", + Output = ".dotm" + }, + new + { + Input = ".xps", + Output = ".dotx" + }, + new + { + Input = ".xps", + Output = ".epub" + }, + new + { + Input = ".xps", + Output = ".fb2" + }, + new + { + Input = ".xps", + Output = ".html" + }, + new + { + Input = ".xps", + Output = ".odt" + }, + new + { + Input = ".xps", + Output = ".ott" + }, + new + { + Input = ".xps", + Output = ".pdf" + }, + new + { + Input = ".xps", + Output = ".rtf" + }, + new + { + Input = ".xps", + Output = ".txt" + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.MobileAppInstall", b => + { + b.Property("UserEmail") + .HasColumnType("varchar(255)") + .HasColumnName("user_email") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("AppType") + .HasColumnType("int") + .HasColumnName("app_type"); + + b.Property("LastSign") + .ValueGeneratedOnAdd() + .HasColumnType("datetime") + .HasColumnName("last_sign") + .HasDefaultValueSql("NULL"); + + b.Property("RegisteredOn") + .HasColumnType("datetime") + .HasColumnName("registered_on"); + + b.HasKey("UserEmail", "AppType") + .HasName("PRIMARY"); + + b.ToTable("mobile_app_install", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.NotifyInfo", b => + { + b.Property("NotifyId") + .HasColumnType("int") + .HasColumnName("notify_id"); + + b.Property("Attempts") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("attempts") + .HasDefaultValueSql("'0'"); + + b.Property("ModifyDate") + .HasColumnType("datetime") + .HasColumnName("modify_date"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("priority") + .HasDefaultValueSql("'0'"); + + b.Property("State") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("state") + .HasDefaultValueSql("'0'"); + + b.HasKey("NotifyId") + .HasName("PRIMARY"); + + b.HasIndex("State") + .HasDatabaseName("state"); + + b.ToTable("notify_info", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.NotifyQueue", b => + { + b.Property("NotifyId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("notify_id"); + + b.Property("Attachments") + .HasColumnType("text") + .HasColumnName("attachments") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("AutoSubmitted") + .HasColumnType("varchar(64)") + .HasColumnName("auto_submitted") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Content") + .HasColumnType("text") + .HasColumnName("content") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ContentType") + .HasColumnType("varchar(64)") + .HasColumnName("content_type") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreationDate") + .HasColumnType("datetime") + .HasColumnName("creation_date"); + + b.Property("Reciever") + .HasColumnType("varchar(255)") + .HasColumnName("reciever") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ReplyTo") + .HasColumnType("varchar(1024)") + .HasColumnName("reply_to") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Sender") + .HasColumnType("varchar(255)") + .HasColumnName("sender") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("SenderType") + .HasColumnType("varchar(64)") + .HasColumnName("sender_type") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Subject") + .HasColumnType("varchar(1024)") + .HasColumnName("subject") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.HasKey("NotifyId") + .HasName("PRIMARY"); + + b.HasIndex("CreationDate") + .HasDatabaseName("creation_date"); + + b.HasIndex("TenantId"); + + b.ToTable("notify_queue", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.Regions", b => + { + b.Property("Region") + .HasColumnType("varchar(255)"); + + b.Property("ConnectionString") + .HasColumnType("longtext"); + + b.Property("Provider") + .HasColumnType("longtext"); + + b.HasKey("Region"); + + b.ToTable("Regions"); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.ShortLink", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint unsigned") + .HasColumnName("id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link") + .UseCollation("utf8_bin"); + + b.Property("Short") + .HasColumnType("char(15)") + .HasColumnName("short") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .ValueGeneratedOnAdd() + .HasColumnType("int(10)") + .HasDefaultValue(-1) + .HasColumnName("tenant_id"); + + b.HasKey("Id") + .HasName("PRIMARY"); + + b.HasIndex("Short") + .IsUnique(); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant_id"); + + b.ToTable("short_links", (string)null); + + b + .HasAnnotation("MySql:CharSet", "utf8") + .HasAnnotation("Relational:Collation", "utf8_general_ci"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.TelegramUser", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("PortalUserId") + .HasColumnType("varchar(38)") + .HasColumnName("portal_user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TelegramUserId") + .HasColumnType("int") + .HasColumnName("telegram_user_id"); + + b.HasKey("TenantId", "PortalUserId") + .HasName("PRIMARY"); + + b.HasIndex("TelegramUserId") + .HasDatabaseName("tgId"); + + b.ToTable("telegram_users", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.TenantIpRestrictions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("ForAdmin") + .HasColumnType("TINYINT(1)") + .HasColumnName("for_admin"); + + b.Property("Ip") + .IsRequired() + .HasColumnType("varchar(50)") + .HasColumnName("ip") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.HasKey("Id"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant"); + + b.ToTable("tenants_iprestrictions", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Subscription", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("Source") + .HasColumnType("varchar(38)") + .HasColumnName("source") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Action") + .HasColumnType("varchar(128)") + .HasColumnName("action") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Recipient") + .HasColumnType("varchar(38)") + .HasColumnName("recipient") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Object") + .HasColumnType("varchar(128)") + .HasColumnName("object") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Unsubscribed") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("unsubscribed") + .HasDefaultValueSql("'0'"); + + b.HasKey("TenantId", "Source", "Action", "Recipient", "Object") + .HasName("PRIMARY"); + + b.ToTable("core_subscription", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + TenantId = -1, + Source = "asc.web.studio", + Action = "send_whats_new", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "asc.web.studio", + Action = "rooms_activity", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "6504977c-75af-4691-9099-084d3ddeea04", + Action = "new feed", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "6a598c74-91ae-437d-a5f4-ad339bd11bb2", + Action = "new post", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "853b6eb9-73ee-438d-9b09-8ffeedf36234", + Action = "new topic in forum", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "9d51954f-db9b-4aed-94e3-ed70b914e101", + Action = "new photo uploaded", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "28b10049-dd20-4f54-b986-873bc14ccfc7", + Action = "new bookmark created", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "742cf945-cbbc-4a57-82d6-1600a12cf8ca", + Action = "new wiki page", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "37620ae5-c40b-45ce-855a-39dd7d76a1fa", + Action = "BirthdayReminder", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "6fe286a4-479e-4c25-a8d9-0156e332b0c0", + Action = "sharedocument", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "6fe286a4-479e-4c25-a8d9-0156e332b0c0", + Action = "sharefolder", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "40650da3-f7c1-424c-8c89-b9c115472e08", + Action = "calendar_sharing", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "40650da3-f7c1-424c-8c89-b9c115472e08", + Action = "event_alert", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "asc.web.studio", + Action = "admin_notify", + Recipient = "cd84e66b-b803-40fc-99f9-b2969a54a1de", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "SetAccess", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "ResponsibleForTask", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "AddRelationshipEvent", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "ExportCompleted", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "CreateNewContact", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "13ff36fb-0272-4887-b416-74f52b0d0b02", + Action = "ResponsibleForOpportunity", + Recipient = "abef62db-11a8-4673-9d32-ef1d8af19dc0", + Object = "", + Unsubscribed = false + }, + new + { + TenantId = -1, + Source = "asc.web.studio", + Action = "periodic_notify", + Recipient = "c5cc67d1-c3e8-43c0-a3ad-3928ae3e5b5e", + Object = "", + Unsubscribed = false + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(38)") + .HasColumnName("id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ActivationStatus") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("activation_status") + .HasDefaultValueSql("'0'"); + + b.Property("BirthDate") + .HasColumnType("datetime") + .HasColumnName("bithdate"); + + b.Property("Contacts") + .HasColumnType("varchar(1024)") + .HasColumnName("contacts") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateDate") + .HasColumnType("timestamp") + .HasColumnName("create_on"); + + b.Property("CultureName") + .HasColumnType("varchar(20)") + .HasColumnName("culture") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Email") + .HasColumnType("varchar(255)") + .HasColumnName("email") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("varchar(64)") + .HasColumnName("firstname") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastModified") + .HasColumnType("datetime") + .HasColumnName("last_modified"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("varchar(64)") + .HasColumnName("lastname") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Location") + .HasColumnType("varchar(255)") + .HasColumnName("location") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("MobilePhone") + .HasColumnType("varchar(255)") + .HasColumnName("phone") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("MobilePhoneActivation") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("phone_activation") + .HasDefaultValueSql("'0'"); + + b.Property("Notes") + .HasColumnType("varchar(512)") + .HasColumnName("notes") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Removed") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("removed") + .HasDefaultValueSql("'0'"); + + b.Property("Sex") + .HasColumnType("tinyint(1)") + .HasColumnName("sex"); + + b.Property("Sid") + .HasColumnType("varchar(512)") + .HasColumnName("sid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("SsoNameId") + .HasColumnType("varchar(512)") + .HasColumnName("sso_name_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("SsoSessionId") + .HasColumnType("varchar(512)") + .HasColumnName("sso_session_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Status") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("status") + .HasDefaultValueSql("'1'"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("TerminatedDate") + .HasColumnType("datetime") + .HasColumnName("terminateddate"); + + b.Property("Title") + .HasColumnType("varchar(64)") + .HasColumnName("title") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("username") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("WorkFromDate") + .HasColumnType("datetime") + .HasColumnName("workfromdate"); + + b.HasKey("Id") + .HasName("PRIMARY"); + + b.HasIndex("Email") + .HasDatabaseName("email"); + + b.HasIndex("LastModified") + .HasDatabaseName("last_modified"); + + b.HasIndex("TenantId", "UserName") + .HasDatabaseName("username"); + + b.HasIndex("TenantId", "ActivationStatus", "Email") + .HasDatabaseName("tenant_activation_status_email"); + + b.HasIndex("TenantId", "ActivationStatus", "FirstName") + .HasDatabaseName("tenant_activation_status_firstname"); + + b.HasIndex("TenantId", "ActivationStatus", "LastName") + .HasDatabaseName("tenant_activation_status_lastname"); + + b.ToTable("core_user", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + Id = "66faa6e4-f133-11ea-b126-00ffeec8b4ef", + ActivationStatus = 0, + CreateDate = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + Email = "", + FirstName = "Administrator", + LastModified = new DateTime(2021, 3, 9, 9, 52, 55, 765, DateTimeKind.Utc).AddTicks(1420), + LastName = "", + MobilePhoneActivation = 0, + Removed = false, + Status = 1, + TenantId = 1, + UserName = "administrator", + WorkFromDate = new DateTime(2021, 3, 9, 9, 52, 55, 764, DateTimeKind.Utc).AddTicks(9157) + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserDav", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("varchar(38)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId", "UserId") + .HasName("PRIMARY"); + + b.ToTable("core_userdav", (string)null); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserGroup", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.Property("Userid") + .HasColumnType("varchar(38)") + .HasColumnName("userid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UserGroupId") + .HasColumnType("varchar(38)") + .HasColumnName("groupid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("RefType") + .HasColumnType("int") + .HasColumnName("ref_type"); + + b.Property("LastModified") + .HasColumnType("timestamp") + .HasColumnName("last_modified"); + + b.Property("Removed") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("removed") + .HasDefaultValueSql("'0'"); + + b.HasKey("TenantId", "Userid", "UserGroupId", "RefType") + .HasName("PRIMARY"); + + b.HasIndex("LastModified") + .HasDatabaseName("last_modified"); + + b.ToTable("core_usergroup", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + TenantId = 1, + Userid = "66faa6e4-f133-11ea-b126-00ffeec8b4ef", + UserGroupId = "cd84e66b-b803-40fc-99f9-b2969a54a1de", + RefType = 0, + LastModified = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + Removed = false + }); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserPhoto", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(38)") + .HasColumnName("userid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Photo") + .IsRequired() + .HasColumnType("mediumblob") + .HasColumnName("photo"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.HasKey("UserId") + .HasName("PRIMARY"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant"); + + b.ToTable("core_userphoto", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserSecurity", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(38)") + .HasColumnName("userid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastModified") + .IsRequired() + .HasColumnType("timestamp"); + + b.Property("PwdHash") + .HasColumnType("varchar(512)") + .HasColumnName("pwdhash") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.HasKey("UserId") + .HasName("PRIMARY"); + + b.HasIndex("PwdHash") + .HasDatabaseName("pwdhash"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant"); + + b.ToTable("core_usersecurity", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + + b.HasData( + new + { + UserId = "66faa6e4-f133-11ea-b126-00ffeec8b4ef", + LastModified = new DateTime(2022, 7, 8, 0, 0, 0, 0, DateTimeKind.Unspecified), + PwdHash = "jGl25bVBBBW96Qi9Te4V37Fnqchz/Eu4qB9vKrRIqRg=", + TenantId = 1 + }); + }); + + modelBuilder.Entity("ASC.Core.Common.Hosting.InstanceRegistration", b => + { + b.Property("InstanceRegistrationId") + .HasColumnType("varchar(255)") + .HasColumnName("instance_registration_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("IsActive") + .HasColumnType("tinyint(4)") + .HasColumnName("is_active"); + + b.Property("LastUpdated") + .HasColumnType("datetime") + .HasColumnName("last_updated"); + + b.Property("WorkerTypeName") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("worker_type_name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("InstanceRegistrationId") + .HasName("PRIMARY"); + + b.HasIndex("WorkerTypeName") + .HasDatabaseName("worker_type_name"); + + b.ToTable("hosting_instance_registration", (string)null); + }); + + modelBuilder.Entity("ASC.Data.Backup.EF.Model.BackupRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(38)") + .HasColumnName("id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreatedOn") + .HasColumnType("datetime") + .HasColumnName("created_on"); + + b.Property("ExpiresOn") + .ValueGeneratedOnAdd() + .HasColumnType("datetime") + .HasColumnName("expires_on") + .HasDefaultValueSql("'0001-01-01 00:00:00'"); + + b.Property("Hash") + .IsRequired() + .HasColumnType("varchar(64)") + .HasColumnName("hash") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("IsScheduled") + .HasColumnType("tinyint(1)") + .HasColumnName("is_scheduled"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Removed") + .HasColumnType("tinyint(1)") + .HasColumnName("removed"); + + b.Property("StorageBasePath") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(255)") + .HasColumnName("storage_base_path") + .HasDefaultValueSql("NULL") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StorageParams") + .ValueGeneratedOnAdd() + .HasColumnType("text") + .HasColumnName("storage_params") + .HasDefaultValueSql("NULL") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StoragePath") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("storage_path") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StorageType") + .HasColumnType("int(10)") + .HasColumnName("storage_type"); + + b.Property("TenantId") + .HasColumnType("int(10)") + .HasColumnName("tenant_id"); + + b.HasKey("Id") + .HasName("PRIMARY"); + + b.HasIndex("ExpiresOn") + .HasDatabaseName("expires_on"); + + b.HasIndex("IsScheduled") + .HasDatabaseName("is_scheduled"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant_id"); + + b.ToTable("backup_backup", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Data.Backup.EF.Model.BackupSchedule", b => + { + b.Property("TenantId") + .HasColumnType("int(10)") + .HasColumnName("tenant_id"); + + b.Property("BackupsStored") + .HasColumnType("int(10)") + .HasColumnName("backups_stored"); + + b.Property("Cron") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("cron") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastBackupTime") + .HasColumnType("datetime") + .HasColumnName("last_backup_time"); + + b.Property("StorageBasePath") + .ValueGeneratedOnAdd() + .HasColumnType("varchar(255)") + .HasColumnName("storage_base_path") + .HasDefaultValueSql("NULL") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StorageParams") + .ValueGeneratedOnAdd() + .HasColumnType("text") + .HasColumnName("storage_params") + .HasDefaultValueSql("NULL") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("StorageType") + .HasColumnType("int(10)") + .HasColumnName("storage_type"); + + b.HasKey("TenantId") + .HasName("PRIMARY"); + + b.ToTable("backup_schedule", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.EventBus.Extensions.Logger.IntegrationEventLogEntry", b => + { + b.Property("EventId") + .ValueGeneratedOnAdd() + .HasColumnType("char(38)") + .HasColumnName("event_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Content") + .IsRequired() + .HasColumnType("text") + .HasColumnName("content") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateBy") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("create_by") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateOn") + .HasColumnType("datetime") + .HasColumnName("create_on"); + + b.Property("EventTypeName") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("event_type_name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("State") + .HasColumnType("int(11)") + .HasColumnName("state"); + + b.Property("TenantId") + .HasColumnType("int(11)") + .HasColumnName("tenant_id"); + + b.Property("TimesSent") + .HasColumnType("int(11)") + .HasColumnName("times_sent"); + + b.Property("TransactionId") + .HasColumnType("longtext"); + + b.HasKey("EventId") + .HasName("PRIMARY"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant_id"); + + b.ToTable("event_bus_integration_event_log", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Feed.Model.FeedAggregate", b => + { + b.Property("Id") + .HasColumnType("varchar(88)") + .HasColumnName("id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("AggregateDate") + .HasColumnType("datetime") + .HasColumnName("aggregated_date"); + + b.Property("Author") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("author") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ContextId") + .HasColumnType("text") + .HasColumnName("context_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreatedDate") + .HasColumnType("datetime") + .HasColumnName("created_date"); + + b.Property("GroupId") + .HasColumnType("varchar(70)") + .HasColumnName("group_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Json") + .IsRequired() + .HasColumnType("mediumtext") + .HasColumnName("json") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Keywords") + .HasColumnType("text") + .HasColumnName("keywords") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ModifiedBy") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("modified_by") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ModifiedDate") + .HasColumnType("datetime") + .HasColumnName("modified_date"); + + b.Property("Module") + .IsRequired() + .HasColumnType("varchar(50)") + .HasColumnName("module") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Product") + .IsRequired() + .HasColumnType("varchar(50)") + .HasColumnName("product") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "AggregateDate") + .HasDatabaseName("aggregated_date"); + + b.HasIndex("TenantId", "ModifiedDate") + .HasDatabaseName("modified_date"); + + b.HasIndex("TenantId", "Product") + .HasDatabaseName("product"); + + b.ToTable("feed_aggregate", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Feed.Model.FeedLast", b => + { + b.Property("LastKey") + .HasColumnType("varchar(128)") + .HasColumnName("last_key") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LastDate") + .HasColumnType("datetime") + .HasColumnName("last_date"); + + b.HasKey("LastKey") + .HasName("PRIMARY"); + + b.ToTable("feed_last", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Feed.Model.FeedReaded", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("varchar(38)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Module") + .HasColumnType("varchar(50)") + .HasColumnName("module") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TimeStamp") + .HasColumnType("datetime") + .HasColumnName("timestamp"); + + b.HasKey("TenantId", "UserId", "Module") + .HasName("PRIMARY"); + + b.ToTable("feed_readed", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Feed.Model.FeedUsers", b => + { + b.Property("FeedId") + .HasColumnType("varchar(88)") + .HasColumnName("feed_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UserId") + .HasColumnType("char(38)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("FeedId", "UserId") + .HasName("PRIMARY"); + + b.HasIndex("UserId") + .HasDatabaseName("user_id"); + + b.ToTable("feed_users", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFile", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("Id") + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Version") + .HasColumnType("int") + .HasColumnName("version"); + + b.Property("Category") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("category") + .HasDefaultValueSql("'0'"); + + b.Property("Changes") + .HasColumnType("mediumtext") + .HasColumnName("changes") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Comment") + .HasColumnType("varchar(255)") + .HasColumnName("comment") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ContentLength") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("content_length") + .HasDefaultValueSql("'0'"); + + b.Property("ConvertedType") + .HasColumnType("varchar(10)") + .HasColumnName("converted_type") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateBy") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("create_by") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateOn") + .HasColumnType("datetime") + .HasColumnName("create_on"); + + b.Property("CurrentVersion") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("current_version") + .HasDefaultValueSql("'0'"); + + b.Property("Encrypted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("encrypted") + .HasDefaultValueSql("'0'"); + + b.Property("FileStatus") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("file_status") + .HasDefaultValueSql("'0'"); + + b.Property("Forcesave") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("forcesave") + .HasDefaultValueSql("'0'"); + + b.Property("ModifiedBy") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("modified_by") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ModifiedOn") + .HasColumnType("datetime") + .HasColumnName("modified_on"); + + b.Property("ParentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("folder_id") + .HasDefaultValueSql("'0'"); + + b.Property("ThumbnailStatus") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("thumb") + .HasDefaultValueSql("'0'"); + + b.Property("Title") + .IsRequired() + .HasColumnType("varchar(400)") + .HasColumnName("title") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("VersionGroup") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("version_group") + .HasDefaultValueSql("'1'"); + + b.HasKey("TenantId", "Id", "Version") + .HasName("PRIMARY"); + + b.HasIndex("Id") + .HasDatabaseName("id"); + + b.HasIndex("ModifiedOn") + .HasDatabaseName("modified_on"); + + b.HasIndex("ParentId") + .HasDatabaseName("folder_id"); + + b.HasIndex("TenantId", "ParentId", "ContentLength") + .HasDatabaseName("tenant_id_folder_id_content_length"); + + b.HasIndex("TenantId", "ParentId", "ModifiedOn") + .HasDatabaseName("tenant_id_folder_id_modified_on"); + + b.HasIndex("TenantId", "ParentId", "Title") + .HasDatabaseName("tenant_id_folder_id_title"); + + b.ToTable("files_file", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesBunchObjects", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("RightNode") + .HasColumnType("varchar(255)") + .HasColumnName("right_node") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LeftNode") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("left_node") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId", "RightNode") + .HasName("PRIMARY"); + + b.HasIndex("LeftNode") + .HasDatabaseName("left_node"); + + b.ToTable("files_bunch_objects", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesLink", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("SourceId") + .HasColumnType("varchar(32)") + .HasColumnName("source_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LinkedId") + .HasColumnType("varchar(32)") + .HasColumnName("linked_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("LinkedFor") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("linked_for") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId", "SourceId", "LinkedId") + .HasName("PRIMARY"); + + b.HasIndex("TenantId", "SourceId", "LinkedId", "LinkedFor") + .HasDatabaseName("linked_for"); + + b.ToTable("files_link", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesProperties", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("EntryId") + .HasColumnType("varchar(32)") + .HasColumnName("entry_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Data") + .HasColumnType("mediumtext") + .HasColumnName("data") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("TenantId", "EntryId") + .HasName("PRIMARY"); + + b.ToTable("files_properties", (string)null); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesSecurity", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("EntryId") + .HasColumnType("varchar(50)") + .HasColumnName("entry_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("EntryType") + .HasColumnType("int") + .HasColumnName("entry_type"); + + b.Property("Subject") + .HasColumnType("char(38)") + .HasColumnName("subject") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Options") + .HasColumnType("text") + .HasColumnName("options") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Owner") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("owner") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Share") + .HasColumnType("int") + .HasColumnName("security"); + + b.Property("SubjectType") + .HasColumnType("int") + .HasColumnName("subject_type"); + + b.Property("TimeStamp") + .HasColumnType("timestamp") + .HasColumnName("timestamp"); + + b.HasKey("TenantId", "EntryId", "EntryType", "Subject") + .HasName("PRIMARY"); + + b.HasIndex("Owner") + .HasDatabaseName("owner"); + + b.HasIndex("TenantId", "EntryType", "EntryId", "Owner") + .HasDatabaseName("tenant_id"); + + b.ToTable("files_security", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(255)") + .HasColumnName("name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Owner") + .IsRequired() + .HasColumnType("varchar(38)") + .HasColumnName("owner") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("Type") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("flag") + .HasDefaultValueSql("'0'"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Owner", "Name", "Type") + .HasDatabaseName("name"); + + b.ToTable("files_tag", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesTagLink", b => + { + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("TagId") + .HasColumnType("int") + .HasColumnName("tag_id"); + + b.Property("EntryId") + .HasColumnType("varchar(32)") + .HasColumnName("entry_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("EntryType") + .HasColumnType("int") + .HasColumnName("entry_type"); + + b.Property("Count") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("tag_count") + .HasDefaultValueSql("'0'"); + + b.Property("CreateBy") + .HasColumnType("char(38)") + .HasColumnName("create_by") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateOn") + .HasColumnType("datetime") + .HasColumnName("create_on"); + + b.HasKey("TenantId", "TagId", "EntryId", "EntryType") + .HasName("PRIMARY"); + + b.HasIndex("CreateOn") + .HasDatabaseName("create_on"); + + b.HasIndex("TenantId", "EntryId", "EntryType") + .HasDatabaseName("entry_id"); + + b.ToTable("files_tag_link", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesThirdpartyAccount", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("CreateOn") + .HasColumnType("datetime") + .HasColumnName("create_on"); + + b.Property("FolderId") + .HasColumnType("text") + .HasColumnName("folder_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("FolderType") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("folder_type") + .HasDefaultValueSql("'0'"); + + b.Property("HasLogo") + .HasColumnType("tinyint(1)") + .HasColumnName("has_logo"); + + b.Property("Password") + .IsRequired() + .HasColumnType("varchar(512)") + .HasColumnName("password") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Private") + .HasColumnType("tinyint(1)") + .HasColumnName("private"); + + b.Property("Provider") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("varchar(50)") + .HasColumnName("provider") + .HasDefaultValueSql("'0'") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("RoomType") + .HasColumnType("int") + .HasColumnName("room_type"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("Title") + .IsRequired() + .HasColumnType("varchar(400)") + .HasColumnName("customer_title") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Token") + .HasColumnType("text") + .HasColumnName("token") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Url") + .HasColumnType("text") + .HasColumnName("url") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(38)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("varchar(100)") + .HasColumnName("user_name") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant_id"); + + b.ToTable("files_thirdparty_account", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesThirdpartyApp", b => + { + b.Property("UserId") + .HasColumnType("varchar(38)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("App") + .HasColumnType("varchar(50)") + .HasColumnName("app") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ModifiedOn") + .HasColumnType("timestamp") + .HasColumnName("modified_on"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("Token") + .HasColumnType("text") + .HasColumnName("token") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("UserId", "App") + .HasName("PRIMARY"); + + b.HasIndex("TenantId"); + + b.ToTable("files_thirdparty_app", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesThirdpartyIdMapping", b => + { + b.Property("HashId") + .HasColumnType("char(32)") + .HasColumnName("hash_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Id") + .IsRequired() + .HasColumnType("text") + .HasColumnName("id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.HasKey("HashId") + .HasName("PRIMARY"); + + b.HasIndex("TenantId", "HashId") + .HasDatabaseName("index_1"); + + b.ToTable("files_thirdparty_id_mapping", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFolder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Color") + .HasColumnType("char(6)") + .HasColumnName("color") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateBy") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("create_by") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("CreateOn") + .HasColumnType("datetime") + .HasColumnName("create_on"); + + b.Property("FilesCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("filesCount") + .HasDefaultValueSql("'0'"); + + b.Property("FolderType") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("folder_type") + .HasDefaultValueSql("'0'"); + + b.Property("FoldersCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("foldersCount") + .HasDefaultValueSql("'0'"); + + b.Property("HasLogo") + .HasColumnType("tinyint(1)") + .HasColumnName("has_logo"); + + b.Property("ModifiedBy") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("modified_by") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ModifiedOn") + .HasColumnType("datetime") + .HasColumnName("modified_on"); + + b.Property("ParentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("parent_id") + .HasDefaultValueSql("'0'"); + + b.Property("Private") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("private") + .HasDefaultValueSql("'0'"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("Title") + .IsRequired() + .HasColumnType("varchar(400)") + .HasColumnName("title") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id"); + + b.HasIndex("ModifiedOn") + .HasDatabaseName("modified_on"); + + b.HasIndex("TenantId", "ParentId") + .HasDatabaseName("parent_id"); + + b.HasIndex("TenantId", "ParentId", "ModifiedOn") + .HasDatabaseName("tenant_id_parent_id_modified_on"); + + b.HasIndex("TenantId", "ParentId", "Title") + .HasDatabaseName("tenant_id_parent_id_title"); + + b.ToTable("files_folder", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFolderTree", b => + { + b.Property("ParentId") + .HasColumnType("int") + .HasColumnName("parent_id"); + + b.Property("FolderId") + .HasColumnType("int") + .HasColumnName("folder_id"); + + b.Property("Level") + .HasColumnType("int") + .HasColumnName("level"); + + b.HasKey("ParentId", "FolderId") + .HasName("PRIMARY"); + + b.HasIndex("FolderId") + .HasDatabaseName("folder_id"); + + b.ToTable("files_folder_tree", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.MessagingSystem.EF.Model.DbAuditEvent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Action") + .HasColumnType("int") + .HasColumnName("action"); + + b.Property("Browser") + .HasColumnType("varchar(200)") + .HasColumnName("browser") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Date") + .HasColumnType("datetime") + .HasColumnName("date"); + + b.Property("DescriptionRaw") + .HasColumnType("varchar(20000)") + .HasColumnName("description") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Initiator") + .HasColumnType("varchar(200)") + .HasColumnName("initiator") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Ip") + .HasColumnType("varchar(50)") + .HasColumnName("ip") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Page") + .HasColumnType("varchar(300)") + .HasColumnName("page") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Platform") + .HasColumnType("varchar(200)") + .HasColumnName("platform") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Target") + .HasColumnType("text") + .HasColumnName("target") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("char(38)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Date") + .HasDatabaseName("date"); + + b.ToTable("audit_events", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.MessagingSystem.EF.Model.DbLoginEvent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Action") + .HasColumnType("int") + .HasColumnName("action"); + + b.Property("Active") + .HasColumnType("tinyint(1)") + .HasColumnName("active"); + + b.Property("Browser") + .HasColumnType("varchar(200)") + .HasColumnName("browser") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Date") + .HasColumnType("datetime") + .HasColumnName("date"); + + b.Property("DescriptionRaw") + .HasColumnType("varchar(500)") + .HasColumnName("description") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Ip") + .HasColumnType("varchar(50)") + .HasColumnName("ip") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Login") + .HasColumnType("varchar(200)") + .HasColumnName("login") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Page") + .HasColumnType("varchar(300)") + .HasColumnName("page") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Platform") + .HasColumnType("varchar(200)") + .HasColumnName("platform") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("char(38)") + .HasColumnName("user_id") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id"); + + b.HasIndex("Date") + .HasDatabaseName("date"); + + b.HasIndex("TenantId", "UserId") + .HasDatabaseName("tenant_id"); + + b.ToTable("login_events", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Webhooks.Core.EF.Model.DbWebhook", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Method") + .ValueGeneratedOnAdd() + .HasMaxLength(10) + .HasColumnType("varchar(10)") + .HasColumnName("method") + .HasDefaultValueSql("''"); + + b.Property("Route") + .ValueGeneratedOnAdd() + .HasMaxLength(200) + .HasColumnType("varchar(200)") + .HasColumnName("route") + .HasDefaultValueSql("''"); + + b.HasKey("Id") + .HasName("PRIMARY"); + + b.ToTable("webhooks", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Webhooks.Core.EF.Model.WebhooksConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("Enabled") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("enabled") + .HasDefaultValueSql("'1'"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)") + .HasColumnName("name"); + + b.Property("SSL") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasColumnName("ssl") + .HasDefaultValueSql("'1'"); + + b.Property("SecretKey") + .ValueGeneratedOnAdd() + .HasMaxLength(50) + .HasColumnType("varchar(50)") + .HasColumnName("secret_key") + .HasDefaultValueSql("''"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("Uri") + .ValueGeneratedOnAdd() + .HasColumnType("text") + .HasColumnName("uri") + .HasDefaultValueSql("''") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.HasKey("Id") + .HasName("PRIMARY"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant_id"); + + b.ToTable("webhooks_config", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Webhooks.Core.EF.Model.WebhooksLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasColumnName("id"); + + b.Property("ConfigId") + .HasColumnType("int") + .HasColumnName("config_id"); + + b.Property("CreationTime") + .HasColumnType("datetime") + .HasColumnName("creation_time"); + + b.Property("Delivery") + .HasColumnType("datetime") + .HasColumnName("delivery"); + + b.Property("RequestHeaders") + .HasColumnType("json") + .HasColumnName("request_headers"); + + b.Property("RequestPayload") + .IsRequired() + .HasColumnType("text") + .HasColumnName("request_payload") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("ResponseHeaders") + .HasColumnType("json") + .HasColumnName("response_headers"); + + b.Property("ResponsePayload") + .HasColumnType("text") + .HasColumnName("response_payload") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("Status") + .HasColumnType("int") + .HasColumnName("status"); + + b.Property("TenantId") + .HasColumnType("int") + .HasColumnName("tenant_id"); + + b.Property("Uid") + .IsRequired() + .HasColumnType("varchar(36)") + .HasColumnName("uid") + .UseCollation("utf8_general_ci") + .HasAnnotation("MySql:CharSet", "utf8"); + + b.Property("WebhookId") + .HasColumnType("int") + .HasColumnName("webhook_id"); + + b.HasKey("Id") + .HasName("PRIMARY"); + + b.HasIndex("ConfigId"); + + b.HasIndex("TenantId") + .HasDatabaseName("tenant_id"); + + b.ToTable("webhooks_logs", (string)null); + + b.HasAnnotation("MySql:CharSet", "utf8"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Acl", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbGroup", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbQuotaRow", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbSubscriptionMethod", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbTariff", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.DbTariffRow", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.FireBaseUser", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbCoreSettings", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbTenantPartner", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithOne("Partner") + .HasForeignKey("ASC.Core.Common.EF.Model.DbTenantPartner", "TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbWebstudioSettings", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbWebstudioUserVisit", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.NotifyQueue", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.ShortLink", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.TelegramUser", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.TenantIpRestrictions", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Subscription", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.User", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserDav", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserGroup", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserPhoto", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.UserSecurity", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Data.Backup.EF.Model.BackupRecord", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Data.Backup.EF.Model.BackupSchedule", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithOne() + .HasForeignKey("ASC.Data.Backup.EF.Model.BackupSchedule", "TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.EventBus.Extensions.Logger.IntegrationEventLogEntry", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Feed.Model.FeedAggregate", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Feed.Model.FeedReaded", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Feed.Model.FeedUsers", b => + { + b.HasOne("ASC.Feed.Model.FeedAggregate", "Feed") + .WithMany() + .HasForeignKey("FeedId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feed"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFile", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesBunchObjects", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesLink", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesProperties", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesSecurity", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesTag", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesTagLink", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesThirdpartyAccount", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesThirdpartyApp", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFilesThirdpartyIdMapping", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFolder", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Files.Core.EF.DbFolderTree", b => + { + b.HasOne("ASC.Files.Core.EF.DbFolder", "Folder") + .WithMany() + .HasForeignKey("FolderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Folder"); + }); + + modelBuilder.Entity("ASC.MessagingSystem.EF.Model.DbAuditEvent", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.MessagingSystem.EF.Model.DbLoginEvent", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Webhooks.Core.EF.Model.WebhooksConfig", b => + { + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Webhooks.Core.EF.Model.WebhooksLog", b => + { + b.HasOne("ASC.Webhooks.Core.EF.Model.WebhooksConfig", "Config") + .WithMany() + .HasForeignKey("ConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ASC.Core.Common.EF.Model.DbTenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Config"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("ASC.Core.Common.EF.Model.DbTenant", b => + { + b.Navigation("Partner"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/migrations/mysql/SaaS/MigrationContext/20240125164942_MigrationContext_Upgrade12.cs b/migrations/mysql/SaaS/MigrationContext/20240125164942_MigrationContext_Upgrade12.cs new file mode 100644 index 00000000000..52d63b98035 --- /dev/null +++ b/migrations/mysql/SaaS/MigrationContext/20240125164942_MigrationContext_Upgrade12.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ASC.Migrations.MySql.SaaS.Migrations +{ + /// + public partial class MigrationContext_Upgrade12 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.InsertData( + table: "tenants_quota", + columns: new[] { "tenant", "description", "features", "name", "product_id" }, + values: new object[] { -8, null, "free,total_size:107374182400,manager:100,room:100", "zoom", null }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DeleteData( + table: "tenants_quota", + keyColumn: "tenant", + keyValue: -8); + } + } +} diff --git a/migrations/mysql/SaaS/MigrationContext/MigrationContextModelSnapshot.cs b/migrations/mysql/SaaS/MigrationContext/MigrationContextModelSnapshot.cs index 4f22d294f00..9312d4c4907 100644 --- a/migrations/mysql/SaaS/MigrationContext/MigrationContextModelSnapshot.cs +++ b/migrations/mysql/SaaS/MigrationContext/MigrationContextModelSnapshot.cs @@ -763,6 +763,14 @@ protected override void BuildModel(ModelBuilder modelBuilder) Name = "nonprofit", Price = 0m, Visible = false + }, + new + { + TenantId = -8, + Features = "free,total_size:107374182400,manager:100,room:100", + Name = "zoom", + Price = 0m, + Visible = false }); }); From db5845a8d76f704032a66bed2daba6c2c3cf702e Mon Sep 17 00:00:00 2001 From: Sukhorukov Anton Date: Fri, 26 Jan 2024 12:28:23 +0300 Subject: [PATCH 21/33] filehandler: add range in stream --- .../ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs index e50d1f428aa..20e88c39f43 100644 --- a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs +++ b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs @@ -780,15 +780,13 @@ private async Task StreamFileAsync(HttpContext context, T id) return; } - context.Response.Headers.Add("Content-Disposition", ContentDispositionUtil.GetHeaderValue(file.Title)); - context.Response.ContentType = MimeMapping.GetMimeMapping(file.Title); + long offset = 0; + var length = ProcessRangeHeader(context, file.ContentLength, ref offset); await using var stream = await fileDao.GetFileStreamAsync(file); - context.Response.Headers.Add("Content-Length", - stream.CanSeek - ? stream.Length.ToString(CultureInfo.InvariantCulture) - : file.ContentLength.ToString(CultureInfo.InvariantCulture)); - await stream.CopyToAsync(context.Response.Body); + stream.Seek(offset, SeekOrigin.Begin); + + await SendStreamByChunksAsync(context, length, file.Title, stream, true); } catch (Exception ex) { From e1b49e21cb5d1a6b5b909959124c8e2d9f160b43 Mon Sep 17 00:00:00 2001 From: Sukhorukov Anton Date: Fri, 26 Jan 2024 12:35:32 +0300 Subject: [PATCH 22/33] fix --- .../ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs index 20e88c39f43..1a293a4b65a 100644 --- a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs +++ b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs @@ -289,7 +289,7 @@ private async ValueTask BulkDownloadFile(HttpContext context) readStream.Seek(offset, SeekOrigin.Begin); } - await SendStreamByChunksAsync(context, length, filename, readStream, false); + await SendStreamByChunksAsync(context, length, filename, readStream); } await context.Response.Body.FlushAsync(); @@ -490,7 +490,7 @@ private async Task DownloadFile(HttpContext context, T id, bool forView) } } - flushed = await SendStreamByChunksAsync(context, length, title, fileStream, flushed); + flushed = await SendStreamByChunksAsync(context, length, title, fileStream); } else { @@ -513,7 +513,7 @@ private async Task DownloadFile(HttpContext context, T id, bool forView) fileStream.Seek(offset, SeekOrigin.Begin); } - flushed = await SendStreamByChunksAsync(context, length, title, fileStream, flushed); + flushed = await SendStreamByChunksAsync(context, length, title, fileStream); } } catch (ThreadAbortException tae) @@ -609,7 +609,7 @@ private long ProcessRangeHeader(HttpContext context, long fullLength, ref long o return length; } - private async Task SendStreamByChunksAsync(HttpContext context, long toRead, string title, Stream fileStream, bool flushed) + private async Task SendStreamByChunksAsync(HttpContext context, long toRead, string title, Stream fileStream) { context.Response.Headers.Add("Connection", "Keep-Alive"); context.Response.ContentLength = toRead; @@ -618,6 +618,7 @@ private async Task SendStreamByChunksAsync(HttpContext context, long toRea var bufferSize = Convert.ToInt32(Math.Min(32 * 1024, toRead)); // 32KB var buffer = new byte[bufferSize]; + var flushed = false; while (toRead > 0) { var length = await fileStream.ReadAsync(buffer, 0, bufferSize); @@ -786,7 +787,7 @@ private async Task StreamFileAsync(HttpContext context, T id) await using var stream = await fileDao.GetFileStreamAsync(file); stream.Seek(offset, SeekOrigin.Begin); - await SendStreamByChunksAsync(context, length, file.Title, stream, true); + await SendStreamByChunksAsync(context, length, file.Title, stream); } catch (Exception ex) { From d457d6f9cbb5d559d548cf81fb0b9e0b9090592f Mon Sep 17 00:00:00 2001 From: Alexey Bannov Date: Mon, 29 Jan 2024 18:44:33 +0300 Subject: [PATCH 23/33] apisystem: if param tenantRegion is null, when will throw exception --- web/ASC.Web.Core/Helpers/ApiSystemHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/ASC.Web.Core/Helpers/ApiSystemHelper.cs b/web/ASC.Web.Core/Helpers/ApiSystemHelper.cs index 3e5997acb29..6f523f1798e 100644 --- a/web/ASC.Web.Core/Helpers/ApiSystemHelper.cs +++ b/web/ASC.Web.Core/Helpers/ApiSystemHelper.cs @@ -111,7 +111,7 @@ public async Task AddTenantToCacheAsync(string tenantDomain, string tenantRegion { if (String.IsNullOrEmpty(tenantRegion)) { - tenantRegion = "default"; + throw new ArgumentNullException("tenantRegion"); } using var awsDynamoDbClient = GetDynamoDBClient(); From c911f4fb8bd7311b0d387055bae694071299964b Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Tue, 30 Jan 2024 10:47:15 +0300 Subject: [PATCH 24/33] revert db5845a8d76f704032a66bed2daba6c2c3cf702e --- .../Core/HttpHandlers/FileHandler.ashx.cs | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs index 1a293a4b65a..e50d1f428aa 100644 --- a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs +++ b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs @@ -289,7 +289,7 @@ private async ValueTask BulkDownloadFile(HttpContext context) readStream.Seek(offset, SeekOrigin.Begin); } - await SendStreamByChunksAsync(context, length, filename, readStream); + await SendStreamByChunksAsync(context, length, filename, readStream, false); } await context.Response.Body.FlushAsync(); @@ -490,7 +490,7 @@ private async Task DownloadFile(HttpContext context, T id, bool forView) } } - flushed = await SendStreamByChunksAsync(context, length, title, fileStream); + flushed = await SendStreamByChunksAsync(context, length, title, fileStream, flushed); } else { @@ -513,7 +513,7 @@ private async Task DownloadFile(HttpContext context, T id, bool forView) fileStream.Seek(offset, SeekOrigin.Begin); } - flushed = await SendStreamByChunksAsync(context, length, title, fileStream); + flushed = await SendStreamByChunksAsync(context, length, title, fileStream, flushed); } } catch (ThreadAbortException tae) @@ -609,7 +609,7 @@ private long ProcessRangeHeader(HttpContext context, long fullLength, ref long o return length; } - private async Task SendStreamByChunksAsync(HttpContext context, long toRead, string title, Stream fileStream) + private async Task SendStreamByChunksAsync(HttpContext context, long toRead, string title, Stream fileStream, bool flushed) { context.Response.Headers.Add("Connection", "Keep-Alive"); context.Response.ContentLength = toRead; @@ -618,7 +618,6 @@ private async Task SendStreamByChunksAsync(HttpContext context, long toRea var bufferSize = Convert.ToInt32(Math.Min(32 * 1024, toRead)); // 32KB var buffer = new byte[bufferSize]; - var flushed = false; while (toRead > 0) { var length = await fileStream.ReadAsync(buffer, 0, bufferSize); @@ -781,13 +780,15 @@ private async Task StreamFileAsync(HttpContext context, T id) return; } - long offset = 0; - var length = ProcessRangeHeader(context, file.ContentLength, ref offset); + context.Response.Headers.Add("Content-Disposition", ContentDispositionUtil.GetHeaderValue(file.Title)); + context.Response.ContentType = MimeMapping.GetMimeMapping(file.Title); await using var stream = await fileDao.GetFileStreamAsync(file); - stream.Seek(offset, SeekOrigin.Begin); - - await SendStreamByChunksAsync(context, length, file.Title, stream); + context.Response.Headers.Add("Content-Length", + stream.CanSeek + ? stream.Length.ToString(CultureInfo.InvariantCulture) + : file.ContentLength.ToString(CultureInfo.InvariantCulture)); + await stream.CopyToAsync(context.Response.Body); } catch (Exception ex) { From 227b2f9616ce85334e6cdd1eb8d4b9171011f7ca Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Tue, 30 Jan 2024 11:22:55 +0300 Subject: [PATCH 25/33] fixed support range header --- .../Core/HttpHandlers/FileHandler.ashx.cs | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs index e50d1f428aa..facc69b0c09 100644 --- a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs +++ b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs @@ -289,7 +289,7 @@ private async ValueTask BulkDownloadFile(HttpContext context) readStream.Seek(offset, SeekOrigin.Begin); } - await SendStreamByChunksAsync(context, length, filename, readStream, false); + await SendStreamByChunksAsync(context, length, filename, readStream); } await context.Response.Body.FlushAsync(); @@ -490,7 +490,7 @@ private async Task DownloadFile(HttpContext context, T id, bool forView) } } - flushed = await SendStreamByChunksAsync(context, length, title, fileStream, flushed); + flushed = await SendStreamByChunksAsync(context, length, title, fileStream); } else { @@ -513,7 +513,7 @@ private async Task DownloadFile(HttpContext context, T id, bool forView) fileStream.Seek(offset, SeekOrigin.Begin); } - flushed = await SendStreamByChunksAsync(context, length, title, fileStream, flushed); + flushed = await SendStreamByChunksAsync(context, length, title, fileStream); } } catch (ThreadAbortException tae) @@ -609,7 +609,7 @@ private long ProcessRangeHeader(HttpContext context, long fullLength, ref long o return length; } - private async Task SendStreamByChunksAsync(HttpContext context, long toRead, string title, Stream fileStream, bool flushed) + private async Task SendStreamByChunksAsync(HttpContext context, long toRead, string title, Stream fileStream) { context.Response.Headers.Add("Connection", "Keep-Alive"); context.Response.ContentLength = toRead; @@ -618,6 +618,7 @@ private async Task SendStreamByChunksAsync(HttpContext context, long toRea var bufferSize = Convert.ToInt32(Math.Min(32 * 1024, toRead)); // 32KB var buffer = new byte[bufferSize]; + var flushed = false; while (toRead > 0) { var length = await fileStream.ReadAsync(buffer, 0, bufferSize); @@ -779,16 +780,18 @@ private async Task StreamFileAsync(HttpContext context, T id) context.Response.StatusCode = (int)HttpStatusCode.BadRequest; return; } - - context.Response.Headers.Add("Content-Disposition", ContentDispositionUtil.GetHeaderValue(file.Title)); - context.Response.ContentType = MimeMapping.GetMimeMapping(file.Title); - + await using var stream = await fileDao.GetFileStreamAsync(file); - context.Response.Headers.Add("Content-Length", - stream.CanSeek - ? stream.Length.ToString(CultureInfo.InvariantCulture) - : file.ContentLength.ToString(CultureInfo.InvariantCulture)); - await stream.CopyToAsync(context.Response.Body); + + long offset = 0; + var length = stream.Length; + if (stream.CanSeek) + { + length = ProcessRangeHeader(context, stream.Length, ref offset); + stream.Seek(offset, SeekOrigin.Begin); + } + + await SendStreamByChunksAsync(context, length, file.Title, stream); } catch (Exception ex) { From 59bcc4ce867f696d0b3e3c44e4de4129f93f0268 Mon Sep 17 00:00:00 2001 From: Alexey Bannov Date: Thu, 1 Feb 2024 13:51:39 +0300 Subject: [PATCH 26/33] fixed Bug 66053 --- products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs index facc69b0c09..6029a15956e 100644 --- a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs +++ b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs @@ -463,7 +463,7 @@ private async Task DownloadFile(HttpContext context, T id, bool forView) { var url = (await fileDao.GetPreSignedUriAsync(file, TimeSpan.FromHours(1))).ToString(); - context.Response.Redirect(_externalShare.GetUrlWithShare(url), false); + context.Response.Redirect(url, false); return; } @@ -498,7 +498,7 @@ private async Task DownloadFile(HttpContext context, T id, bool forView) { var url = (await fileDao.GetPreSignedUriAsync(file, TimeSpan.FromHours(1))).ToString(); - context.Response.Redirect(_externalShare.GetUrlWithShare(url), true); + context.Response.Redirect(url, true); return; } From c1d7608e349bb369d396bba87c61b53175df6644 Mon Sep 17 00:00:00 2001 From: Alexey Bannov Date: Thu, 1 Feb 2024 14:23:05 +0300 Subject: [PATCH 27/33] fixed Bug 65781 --- common/ASC.Data.Storage/S3/S3Storage.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/ASC.Data.Storage/S3/S3Storage.cs b/common/ASC.Data.Storage/S3/S3Storage.cs index dbcb65dae47..8b5cdcfdca9 100644 --- a/common/ASC.Data.Storage/S3/S3Storage.cs +++ b/common/ASC.Data.Storage/S3/S3Storage.cs @@ -222,7 +222,10 @@ public override Task GetCdnPreSignedUriAsync(string domain, string path, Ti DateTime.UtcNow.Add(expire)); } - return Task.FromResult(new Uri(signedUrl)); + + var signedUri = new Uri(signedUrl, new UriCreationOptions { DangerousDisablePathAndQueryCanonicalization = true }); + + return Task.FromResult(signedUri); } public override Task GetReadStreamAsync(string domain, string path) From 8ee3fdb0abf3c31e858f9a5e218d708c7be2dfdf Mon Sep 17 00:00:00 2001 From: Maksim Chegulov Date: Thu, 1 Feb 2024 16:59:08 +0300 Subject: [PATCH 28/33] optimized query --- common/ASC.Api.Core/Security/InvitationLinkHelper.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/ASC.Api.Core/Security/InvitationLinkHelper.cs b/common/ASC.Api.Core/Security/InvitationLinkHelper.cs index 8747572584c..04b577a18d6 100644 --- a/common/ASC.Api.Core/Security/InvitationLinkHelper.cs +++ b/common/ASC.Api.Core/Security/InvitationLinkHelper.cs @@ -191,5 +191,6 @@ static file class Queries public static readonly Func> AuditEventsAsync = EF.CompileAsyncQuery( (MessagesContext ctx, int tenantId, string target, string description) => - ctx.AuditEvents.FirstOrDefault(a => a.TenantId == tenantId && a.Target == target && a.DescriptionRaw == description)); + ctx.AuditEvents.FirstOrDefault(a => + a.TenantId == tenantId && a.Action == (int)MessageAction.RoomInviteLinkUsed && a.Target == target && a.DescriptionRaw == description)); } \ No newline at end of file From 14a7f75bd6c26730d80ce698a9474327fee419ff Mon Sep 17 00:00:00 2001 From: Alexey Bannov Date: Thu, 1 Feb 2024 17:35:44 +0300 Subject: [PATCH 29/33] support cors * --- common/ASC.Api.Core/Core/BaseStartup.cs | 12 ++++++++---- common/services/ASC.ApiSystem/Startup.cs | 13 +++++++++---- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/common/ASC.Api.Core/Core/BaseStartup.cs b/common/ASC.Api.Core/Core/BaseStartup.cs index 288586a1143..d2820462fc2 100644 --- a/common/ASC.Api.Core/Core/BaseStartup.cs +++ b/common/ASC.Api.Core/Core/BaseStartup.cs @@ -310,10 +310,14 @@ bool EnableNoLimiter(IPAddress address) policy => { policy.WithOrigins(_corsOrigin) - .SetIsOriginAllowedToAllowWildcardSubdomains() - .AllowAnyHeader() - .AllowAnyMethod() - .AllowCredentials(); + .SetIsOriginAllowedToAllowWildcardSubdomains() + .AllowAnyHeader() + .AllowAnyMethod(); + + if (_corsOrigin != "*") + { + policy.AllowCredentials(); + } }); }); } diff --git a/common/services/ASC.ApiSystem/Startup.cs b/common/services/ASC.ApiSystem/Startup.cs index a206ee3d677..366a13c071b 100644 --- a/common/services/ASC.ApiSystem/Startup.cs +++ b/common/services/ASC.ApiSystem/Startup.cs @@ -104,11 +104,16 @@ public void ConfigureServices(IServiceCollection services) policy => { policy.WithOrigins(_corsOrigin) - .SetIsOriginAllowedToAllowWildcardSubdomains() - .AllowAnyHeader() - .AllowAnyMethod() - .AllowCredentials(); + .SetIsOriginAllowedToAllowWildcardSubdomains() + .AllowAnyHeader() + .AllowAnyMethod(); + + if (_corsOrigin != "*") + { + policy.AllowCredentials(); + } }); + }); } From 03e33b6792f7b409082581cb233b8e6ddc5f9e68 Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Thu, 1 Feb 2024 22:36:11 +0300 Subject: [PATCH 30/33] Elastic: fixed threads --- .../ASC.ElasticSearch/Engine/BaseIndexer.cs | 10 +- .../Engine/FactoryIndexer.cs | 87 +---------------- .../Log/FactoryIndexerLogger.cs | 3 - .../Core/Core/Search/FactoryIndexerFile.cs | 7 +- .../Core/Core/Search/FactoryIndexerFolder.cs | 93 ++++++++++--------- 5 files changed, 63 insertions(+), 137 deletions(-) diff --git a/common/services/ASC.ElasticSearch/Engine/BaseIndexer.cs b/common/services/ASC.ElasticSearch/Engine/BaseIndexer.cs index 3d2fe47d326..220e84c2e0d 100644 --- a/common/services/ASC.ElasticSearch/Engine/BaseIndexer.cs +++ b/common/services/ASC.ElasticSearch/Engine/BaseIndexer.cs @@ -99,7 +99,6 @@ public async IAsyncEnumerable> IndexAllAsync( Func> getIds, Func> getData) { - var now = DateTime.UtcNow; DateTime lastIndexed; await using (var webStudioDbContext = await _dbContextFactory.CreateDbContextAsync()) @@ -123,13 +122,16 @@ public async IAsyncEnumerable> IndexAllAsync( { yield return getData(ids[i], ids[i + 1], lastIndexed); } + } + public async Task OnComplete(DateTime lastModified) + { await using (var webStudioDbContext = await _dbContextFactory.CreateDbContextAsync()) { await webStudioDbContext.AddOrUpdateAsync(q => q.WebstudioIndex, new DbWebstudioIndex { IndexName = Wrapper.IndexName, - LastModified = now + LastModified = lastModified }); await webStudioDbContext.SaveChangesAsync(); @@ -137,8 +139,8 @@ public async IAsyncEnumerable> IndexAllAsync( _logger.DebugIndexCompleted(Wrapper.IndexName); } - - public async Task ReIndrexAsync() + + public async Task ReIndexAsync() { await ClearAsync(); } diff --git a/common/services/ASC.ElasticSearch/Engine/FactoryIndexer.cs b/common/services/ASC.ElasticSearch/Engine/FactoryIndexer.cs index 7521b795ff8..21fe4874f6c 100644 --- a/common/services/ASC.ElasticSearch/Engine/FactoryIndexer.cs +++ b/common/services/ASC.ElasticSearch/Engine/FactoryIndexer.cs @@ -226,7 +226,7 @@ public async Task Index(List data, bool immediately = true, int retry = 0) } else if (e.Response.HttpStatusCode == 429) { - Thread.Sleep(60000); + await Task.Delay(60000); if (retry < 10) { await Index(data.Where(r => r != null).ToList(), immediately, retry + 1); @@ -251,87 +251,6 @@ public async Task Index(List data, bool immediately = true, int retry = 0) { Logger.ErrorInner(inner); - if (inner.Response.HttpStatusCode is 413 or 403) - { - Logger.Error(inner.Response.HttpStatusCode.ToString()); - foreach (var r in data.Where(r => r != null)) - { - await Index(r, immediately); - } - } - else if (inner.Response.HttpStatusCode == 429) - { - Thread.Sleep(60000); - if (retry < 10) - { - await Index(data.Where(r => r != null).ToList(), immediately, retry + 1); - return; - } - - throw; - } - } - else - { - throw; - } - } - } - - protected async Task IndexAsync(List data, bool immediately = true, int retry = 0) - { - var t = _serviceProvider.GetService(); - if (!await SupportAsync(t) || data.Count == 0) - { - return; - } - - try - { - await _indexer.IndexAsync(data, immediately).ConfigureAwait(false); - } - catch (ElasticsearchClientException e) - { - Logger.ErrorIndexAsync(e); - - if (e.Response != null) - { - Logger.Error(e.Response.HttpStatusCode.ToString()); - - if (e.Response.HttpStatusCode is 413 or 403 or 408) - { - foreach (var r in data.Where(r => r != null)) - { - await Index(r, immediately); - } - } - else if (e.Response.HttpStatusCode == 429) - { - await Task.Delay(60000); - if (retry < 10) - { - await IndexAsync(data.Where(r => r != null).ToList(), immediately, retry + 1); - return; - } - - throw; - } - } - } - catch (AggregateException e) //ElasticsearchClientException - { - if (e.InnerExceptions.Count == 0) - { - throw; - } - - var inner = e.InnerExceptions.OfType().FirstOrDefault(); - - - if (inner != null) - { - Logger.ErrorIndexAsync(inner); - if (inner.Response.HttpStatusCode is 413 or 403) { Logger.Error(inner.Response.HttpStatusCode.ToString()); @@ -345,7 +264,7 @@ protected async Task IndexAsync(List data, bool immediately = true, int retry await Task.Delay(60000); if (retry < 10) { - await IndexAsync(data.Where(r => r != null).ToList(), immediately, retry + 1); + await Index(data.Where(r => r != null).ToList(), immediately, retry + 1); return; } @@ -533,7 +452,7 @@ public virtual Task IndexAllAsync() public async Task ReIndexAsync() { - await _indexer.ReIndrexAsync(); + await _indexer.ReIndexAsync(); } public bool Support(T t) diff --git a/common/services/ASC.ElasticSearch/Log/FactoryIndexerLogger.cs b/common/services/ASC.ElasticSearch/Log/FactoryIndexerLogger.cs index 983a2b00b3e..96a7c2cd418 100644 --- a/common/services/ASC.ElasticSearch/Log/FactoryIndexerLogger.cs +++ b/common/services/ASC.ElasticSearch/Log/FactoryIndexerLogger.cs @@ -42,9 +42,6 @@ internal static partial class FactoryIndexerLogger [LoggerMessage(Level = LogLevel.Error, Message = "inner")] public static partial void ErrorInner(this ILogger logger, Exception exception); - [LoggerMessage(Level = LogLevel.Error, Message = "IndexAsync")] - public static partial void ErrorIndexAsync(this ILogger logger, Exception exception); - [LoggerMessage(Level = LogLevel.Error, Message = "Update")] public static partial void ErrorUpdate(this ILogger logger, Exception exception); diff --git a/products/ASC.Files/Core/Core/Search/FactoryIndexerFile.cs b/products/ASC.Files/Core/Core/Search/FactoryIndexerFile.cs index c1f1f42778f..fbb08084763 100644 --- a/products/ASC.Files/Core/Core/Search/FactoryIndexerFile.cs +++ b/products/ASC.Files/Core/Core/Search/FactoryIndexerFile.cs @@ -94,7 +94,8 @@ public override async Task IndexAllAsync() { var j = 0; var tasks = new List(); - + var now = DateTime.UtcNow; + await foreach (var data in _indexer.IndexAllAsync(GetCount, GetIds, GetData)) { if (_settings.Threads == 1) @@ -103,7 +104,7 @@ public override async Task IndexAllAsync() } else { - tasks.Add(IndexAsync(data)); + tasks.Add(Index(data)); j++; if (j >= _settings.Threads) { @@ -118,6 +119,8 @@ public override async Task IndexAllAsync() { Task.WaitAll(tasks.ToArray()); } + + await _indexer.OnComplete(now); } catch (Exception e) { diff --git a/products/ASC.Files/Core/Core/Search/FactoryIndexerFolder.cs b/products/ASC.Files/Core/Core/Search/FactoryIndexerFolder.cs index 5733dd1cc3a..3baa60855b1 100644 --- a/products/ASC.Files/Core/Core/Search/FactoryIndexerFolder.cs +++ b/products/ASC.Files/Core/Core/Search/FactoryIndexerFolder.cs @@ -50,26 +50,47 @@ public FactoryIndexerFolder( public override async Task IndexAllAsync() { - (int, int, int) getCount(DateTime lastIndexed) + try { - using var filesDbContext = _dbContextFactory.CreateDbContext(); - - var minid = Queries.FolderMinId(filesDbContext, lastIndexed); - - var maxid = Queries.FolderMaxId(filesDbContext, lastIndexed); - - var count = Queries.FoldersCount(filesDbContext, lastIndexed); + var j = 0; + var tasks = new List(); + var now = DateTime.UtcNow; + + await foreach (var data in _indexer.IndexAllAsync(GetCount, GetIds, GetData)) + { + if (_settings.Threads == 1) + { + await Index(data); + } + else + { + tasks.Add(Index(data)); + j++; + if (j >= _settings.Threads) + { + Task.WaitAll(tasks.ToArray()); + tasks = new List(); + j = 0; + } + } + } - return new(count, maxid, minid); + if (tasks.Count > 0) + { + Task.WaitAll(tasks.ToArray()); + } + + await _indexer.OnComplete(now); } - - List getData(long start, long stop, DateTime lastIndexed) + catch (Exception e) { - using var filesDbContext = _dbContextFactory.CreateDbContext(); - return Queries.FolderData(filesDbContext, lastIndexed, start, stop).ToList(); + Logger.ErrorFactoryIndexerFolder(e); + throw; } - List getIds(DateTime lastIndexed) + return; + + List GetIds(DateTime lastIndexed) { var start = 0; var result = new List(); @@ -93,39 +114,23 @@ List getIds(DateTime lastIndexed) return result; } - try + List GetData(long start, long stop, DateTime lastIndexed) { - var j = 0; - var tasks = new List(); - - await foreach (var data in _indexer.IndexAllAsync(getCount, getIds, getData)) - { - if (_settings.Threads == 1) - { - await Index(data); - } - else - { - tasks.Add(IndexAsync(data)); - j++; - if (j >= _settings.Threads) - { - Task.WaitAll(tasks.ToArray()); - tasks = new List(); - j = 0; - } - } - } - - if (tasks.Count > 0) - { - Task.WaitAll(tasks.ToArray()); - } + using var filesDbContext = _dbContextFactory.CreateDbContext(); + return Queries.FolderData(filesDbContext, lastIndexed, start, stop).ToList(); } - catch (Exception e) + + (int, int, int) GetCount(DateTime lastIndexed) { - Logger.ErrorFactoryIndexerFolder(e); - throw; + using var filesDbContext = _dbContextFactory.CreateDbContext(); + + var minId = Queries.FolderMinId(filesDbContext, lastIndexed); + + var maxId = Queries.FolderMaxId(filesDbContext, lastIndexed); + + var count = Queries.FoldersCount(filesDbContext, lastIndexed); + + return new(count, maxId, minId); } } } From 5abae06f16e85a0f9f994d27d35a705289384c10 Mon Sep 17 00:00:00 2001 From: Andrey Savihin Date: Fri, 2 Feb 2024 10:50:14 +0300 Subject: [PATCH 31/33] ASC.Web.Core: Notify: new welcome mail --- web/ASC.Web.Core/Notify/Actions.cs | 2 ++ .../Notify/StudioNotifyService.cs | 27 +++++++++++++++++++ web/ASC.Web.Core/Notify/StudioNotifySource.cs | 4 ++- ...WebstudioNotifyPatternResource.Designer.cs | 27 +++++++++++++++++++ .../WebstudioNotifyPatternResource.resx | 19 +++++++++++++ .../PublicResources/webstudio_patterns.xml | 6 +++++ 6 files changed, 84 insertions(+), 1 deletion(-) diff --git a/web/ASC.Web.Core/Notify/Actions.cs b/web/ASC.Web.Core/Notify/Actions.cs index ba6a33e2556..6834140e491 100644 --- a/web/ASC.Web.Core/Notify/Actions.cs +++ b/web/ASC.Web.Core/Notify/Actions.cs @@ -154,4 +154,6 @@ public static class Actions public static readonly INotifyAction SaasOwnerPaymentWarningGracePeriodExpired = new NotifyAction("saas_owner_payment_warning_grace_period_expired"); public static readonly INotifyAction SaasAdminVideoGuides = new NotifyAction("saas_video_guides_v1"); + + public static readonly INotifyAction ZoomWelcome = new NotifyAction("zoom_welcome"); } diff --git a/web/ASC.Web.Core/Notify/StudioNotifyService.cs b/web/ASC.Web.Core/Notify/StudioNotifyService.cs index e596b6393bd..d7c914980fe 100644 --- a/web/ASC.Web.Core/Notify/StudioNotifyService.cs +++ b/web/ASC.Web.Core/Notify/StudioNotifyService.cs @@ -976,6 +976,33 @@ private string GetControlPanelUrl(string serverRootPath) #endregion + + #region Zoom + + public async Task SendZoomWelcomeAsync(UserInfo u) + { + try + { + var culture = GetCulture(u); + var txtTrulyYours = WebstudioNotifyPatternResource.ResourceManager.GetString("TrulyYoursText", culture); + + await _client.SendNoticeToAsync( + Actions.ZoomWelcome, + await _studioNotifyHelper.RecipientFromEmailAsync(u.Email, false), + new[] { EMailSenderName }, + new TagValue(CommonTags.Culture, culture.Name), + new TagValue(Tags.UserName, u.FirstName.HtmlEncode()), + new TagValue(CommonTags.TopGif, _studioNotifyHelper.GetNotificationImageUrl("welcome.gif")), + TagValues.TrulyYours(_studioNotifyHelper, txtTrulyYours)); + } + catch (Exception error) + { + _log.ErrorSendCongratulations(error); + } + } + + #endregion + private CultureInfo GetCulture(UserInfo user) { CultureInfo culture = null; diff --git a/web/ASC.Web.Core/Notify/StudioNotifySource.cs b/web/ASC.Web.Core/Notify/StudioNotifySource.cs index 12ce254f4ce..206669cac29 100644 --- a/web/ASC.Web.Core/Notify/StudioNotifySource.cs +++ b/web/ASC.Web.Core/Notify/StudioNotifySource.cs @@ -150,7 +150,9 @@ protected override IActionProvider CreateActionProvider() Actions.SaasOwnerPaymentWarningGracePeriodBeforeActivation, Actions.SaasOwnerPaymentWarningGracePeriodActivation, Actions.SaasOwnerPaymentWarningGracePeriodLastDay, - Actions.SaasOwnerPaymentWarningGracePeriodExpired + Actions.SaasOwnerPaymentWarningGracePeriodExpired, + + Actions.ZoomWelcome ); } diff --git a/web/ASC.Web.Core/PublicResources/WebstudioNotifyPatternResource.Designer.cs b/web/ASC.Web.Core/PublicResources/WebstudioNotifyPatternResource.Designer.cs index 574a9b8e12a..6210fecff3f 100644 --- a/web/ASC.Web.Core/PublicResources/WebstudioNotifyPatternResource.Designer.cs +++ b/web/ASC.Web.Core/PublicResources/WebstudioNotifyPatternResource.Designer.cs @@ -2142,6 +2142,24 @@ public static string pattern_user_ldap_activation { } } + /// + /// Looks up a localized string similar to h1. to <span style="color:#FF6F3D;">ONLYOFFICE</span> DocSpace! + /// + /// + ///Hello, $UserName! + /// + ///You have just created ONLYOFFICE DocSpace, a document hub where you can boost collaboration with your team, customers, partners, and more. Its address is "${__VirtualRootPath}":"${__VirtualRootPath}". + /// + ///Your current tariff plan is STARTUP. It is absolutely free and includes: + /// + ///<table cellspacing="0" cellpadding="0" background="#ffffff" style="background-color: #ffffff; border: 0 none; border-collapse: collapse; borde [rest of string was truncated]";. + /// + public static string pattern_zoom_welcome { + get { + return ResourceManager.GetString("pattern_zoom_welcome", resourceCulture); + } + } + /// /// Looks up a localized string similar to ${LetterLogoText}. Please activate your email address. /// @@ -2934,6 +2952,15 @@ public static string subject_user_ldap_activation { } } + /// + /// Looks up a localized string similar to Welcome to ONLYOFFICE DocSpace!. + /// + public static string subject_zoom_welcome { + get { + return ResourceManager.GetString("subject_zoom_welcome", resourceCulture); + } + } + /// /// Looks up a localized string similar to Truly Yours, ONLYOFFICE Team. /// diff --git a/web/ASC.Web.Core/PublicResources/WebstudioNotifyPatternResource.resx b/web/ASC.Web.Core/PublicResources/WebstudioNotifyPatternResource.resx index 980d8e85117..7705b7598fd 100644 --- a/web/ASC.Web.Core/PublicResources/WebstudioNotifyPatternResource.resx +++ b/web/ASC.Web.Core/PublicResources/WebstudioNotifyPatternResource.resx @@ -2426,4 +2426,23 @@ $TrulyYours Master ONLYOFFICE DocSpace with video guides + + h1. to <span style="color:#FF6F3D;">ONLYOFFICE</span> DocSpace! + + +Hello, $UserName! + +You have just created ONLYOFFICE DocSpace, a document hub where you can boost collaboration with your team, customers, partners, and more. Its address is "${__VirtualRootPath}":"${__VirtualRootPath}". + +Your current tariff plan is STARTUP. It is absolutely free and includes: + +<table cellspacing="0" cellpadding="0" background="#ffffff" style="background-color: #ffffff; border: 0 none; border-collapse: collapse; border-spacing: 0; -moz-border-radius: 6px; -webkit-border-radius: 6px; border-radius: 6px; color: #333333; empty-cells: show; height: 0px; margin: auto; max-width: 342px; padding: 0; vertical-align: top; width: 100%; text-align: left;"><tbody><tr border="0" cellspacing="0" cellpadding="0"><td style="color: #FF6F3D; font-family: 'Open Sans', Helvetica, Arial, Tahoma; font-size: 18px; line-height: 29px; margin: 0; padding-bottom: 16px; padding-right: 16px; width: 5%;vertical-align: top;"> &nbsp;&nbsp;&nbsp;&nbsp;&bull;</td><td style="font-family: 'Open Sans', Helvetica, Arial, Tahoma, sans-serif; font-size: 18px; line-height: 29px; margin: 0; padding-bottom: 16px; vertical-align: top;">100 admins/power users</td></tr><tr border="0" cellspacing="0" cellpadding="0"><td style="color: #FF6F3D; font-family: 'Open Sans', Helvetica, Arial, Tahoma; font-size: 18px; line-height: 29px; margin: 0; padding-bottom: 16px; padding-right: 16px; width: 5%;vertical-align: top;"> &nbsp;&nbsp;&nbsp;&nbsp;&bull;</td><td style="font-family: 'Open Sans', Helvetica, Arial, Tahoma, sans-serif; font-size: 18px; line-height: 29px; margin: 0; padding-bottom: 16px; vertical-align: top;">Up to 100 rooms</td></tr><tr border="0" cellspacing="0" cellpadding="0"><td style="color: #FF6F3D; font-family: 'Open Sans', Helvetica, Arial, Tahoma; font-size: 18px; line-height: 29px; margin: 0; padding-bottom: 32px; padding-right: 16px; width: 5%;vertical-align: top;">&nbsp;&nbsp;&nbsp;&nbsp;&bull;</td><td style="font-family: 'Open Sans', Helvetica, Arial, Tahoma, sans-serif; font-size: 18px; line-height: 29px; margin: 0; padding-bottom: 32px; vertical-align: top;">100 GB disk space</td></tr></tbody></table> + +*Enjoy a new way of document collaboration!* + +$TrulyYours + + + Welcome to ONLYOFFICE DocSpace! + \ No newline at end of file diff --git a/web/ASC.Web.Core/PublicResources/webstudio_patterns.xml b/web/ASC.Web.Core/PublicResources/webstudio_patterns.xml index 8446131fda3..083ab99d4da 100644 --- a/web/ASC.Web.Core/PublicResources/webstudio_patterns.xml +++ b/web/ASC.Web.Core/PublicResources/webstudio_patterns.xml @@ -704,4 +704,10 @@ $activity.Key + + + + + + \ No newline at end of file From dab8106dfff155bddd97c9305f260fb6b046c727 Mon Sep 17 00:00:00 2001 From: Andrey Savihin Date: Fri, 2 Feb 2024 11:56:22 +0300 Subject: [PATCH 32/33] ASC.Files: DocumentService: Configuration: porting bug fix 66304 --- .../Core/Services/DocumentService/Configuration.cs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/products/ASC.Files/Core/Services/DocumentService/Configuration.cs b/products/ASC.Files/Core/Services/DocumentService/Configuration.cs index c17838d4ac6..68358b05b52 100644 --- a/products/ASC.Files/Core/Services/DocumentService/Configuration.cs +++ b/products/ASC.Files/Core/Services/DocumentService/Configuration.cs @@ -1012,8 +1012,6 @@ public class LogoConfig { private readonly CommonLinkUtility _commonLinkUtility; - private readonly FileUtility _fileUtility; - private readonly TenantLogoHelper _tenantLogoHelper; private Configuration _configuration; @@ -1022,10 +1020,7 @@ public string Image { get { - var fillingForm = _fileUtility.CanWebRestrictedEditing(_configuration.Document.Title); - return _configuration.EditorType == EditorType.Embedded - || fillingForm ? _commonLinkUtility.GetFullAbsolutePath(_tenantLogoHelper.GetLogo(WhiteLabelLogoType.DocsEditorEmbed).Result) : _commonLinkUtility.GetFullAbsolutePath(_tenantLogoHelper.GetLogo(WhiteLabelLogoType.DocsEditor).Result); } @@ -1055,12 +1050,10 @@ public string Url public LogoConfig( CommonLinkUtility commonLinkUtility, - TenantLogoHelper tenantLogoHelper, - FileUtility fileUtility) + TenantLogoHelper tenantLogoHelper) { _commonLinkUtility = commonLinkUtility; _tenantLogoHelper = tenantLogoHelper; - _fileUtility = fileUtility; } internal void SetConfiguration(Configuration configuration) From 6c4cfab3a57c11747a606016fece62c1ca36d003 Mon Sep 17 00:00:00 2001 From: Andrey Savihin Date: Fri, 2 Feb 2024 12:13:22 +0300 Subject: [PATCH 33/33] ASC.Files: FilesCommonResource: oform replacement --- .../ASC.Files/Core/Resources/FilesCommonResource.Designer.cs | 4 ++-- .../ASC.Files/Core/Resources/FilesCommonResource.ar-SA.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.az.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.bg.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.cs.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.de.resx | 4 ++-- .../ASC.Files/Core/Resources/FilesCommonResource.el-GR.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.es.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.fi.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.fr.resx | 4 ++-- .../ASC.Files/Core/Resources/FilesCommonResource.hy-AM.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.it.resx | 4 ++-- .../ASC.Files/Core/Resources/FilesCommonResource.ja-JP.resx | 4 ++-- .../ASC.Files/Core/Resources/FilesCommonResource.ko-KR.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.lv.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.nl.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.pl.resx | 4 ++-- .../ASC.Files/Core/Resources/FilesCommonResource.pt-BR.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.pt.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.ro.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.ru.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.sk.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.sl.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.tr.resx | 4 ++-- .../ASC.Files/Core/Resources/FilesCommonResource.uk-UA.resx | 4 ++-- products/ASC.Files/Core/Resources/FilesCommonResource.vi.resx | 4 ++-- .../ASC.Files/Core/Resources/FilesCommonResource.zh-CN.resx | 4 ++-- 28 files changed, 56 insertions(+), 56 deletions(-) diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.Designer.cs b/products/ASC.Files/Core/Resources/FilesCommonResource.Designer.cs index ab3a154d73b..5cf66b5d1bc 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.Designer.cs +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.Designer.cs @@ -979,7 +979,7 @@ public static string MessageFileCreated { } /// - /// Looks up a localized string similar to The fillable OFORM document is ready. It is saved in the {0}. + /// Looks up a localized string similar to The fillable PDF document is ready. It is saved in the {0}. /// public static string MessageFileCreatedForm { get { @@ -988,7 +988,7 @@ public static string MessageFileCreatedForm { } /// - /// Looks up a localized string similar to The OFORM copy is created in the {0} folder. Please fill out the form and download the result as a PDF or DOCX file.. + /// Looks up a localized string similar to The PDF copy is created in the {0} folder. Please fill out the form and download the result as a PDF or DOCX file.. /// public static string MessageFillFormDraftCreated { get { diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.ar-SA.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.ar-SA.resx index c9f3ee433cd..0c3beb4e236 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.ar-SA.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.ar-SA.resx @@ -412,10 +412,10 @@ تم انشاء الملف في المجلد "{0}" - المستند القابل للملئ OFORM جاهز. الملف محفوظ في {0} + المستند القابل للملئ PDF جاهز. الملف محفوظ في {0} - تم انشاء نسخة من OFORM في المجلد {0}. يرجى ملئ النموذج وتنزيل النتائج كملف بصيغة PDF أو DOCX. + تم انشاء نسخة من PDF في المجلد {0}. يرجى ملئ النموذج وتنزيل النتائج كملف بصيغة PDF أو DOCX. الملف لم يعد مسودة للقيام بتعبئة النموذج. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.az.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.az.resx index 3078f81aa98..2714f9e275c 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.az.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.az.resx @@ -296,10 +296,10 @@ "{0}" qovluğunda fayl yaradıldı - Doldurula bilən OFORM sənədi hazırdır. {0} qovluğunda yadda saxlanıldı + Doldurula bilən PDF sənədi hazırdır. {0} qovluğunda yadda saxlanıldı - OFORM-un kopyası {0} qovluğunda yaradıldı. Formanı doldurun və nəticəni PDF və ya DOCX formatında yükləyin. + PDF-un kopyası {0} qovluğunda yaradıldı. Formanı doldurun və nəticəni PDF və ya DOCX formatında yükləyin. Fayl artıq formanı doldurmaq üçün qaralama deyil. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.bg.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.bg.resx index ca2f33ca68b..fcdd905adc5 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.bg.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.bg.resx @@ -408,10 +408,10 @@ Създаден за попълване на формуляра - OFORM документ за попълване е готов. Той е запазен в {0} + PDF документ за попълване е готов. Той е запазен в {0} - Копието на OFORM се създава в папката {0}. Моля, попълнете формуляра и изтеглете резултата като PDF или DOCX файл. + Копието на PDF се създава в папката {0}. Моля, попълнете формуляра и изтеглете резултата като PDF или DOCX файл. Файлът вече не е чернова за попълване на формуляра. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.cs.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.cs.resx index 7ce46997534..819b34651b9 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.cs.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.cs.resx @@ -405,10 +405,10 @@ Je garantována 100% kompatibilita s MS Office formáty. Vyhledávání v obsahu dokumentů - Vyplnitelný dokument OFORM je připraven. Je uložen v {0} + Vyplnitelný dokument PDF je připraven. Je uložen v {0} - Kopie OFORM se vytvoří ve složce {0}. Vyplňte formulář a stáhněte si výsledek ve formátu PDF nebo DOCX. + Kopie PDF se vytvoří ve složce {0}. Vyplňte formulář a stáhněte si výsledek ve formátu PDF nebo DOCX. Soubor již není návrhem pro vyplnění formuláře. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.de.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.de.resx index f94d35b7334..65c4e781a05 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.de.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.de.resx @@ -299,10 +299,10 @@ Die Datei wurde im Ordner"{0}"erstellt - Die ausfüllbare OFORM-Datei ist fertig und im Ordner {0} zugänglich + Die ausfüllbare PDF-Datei ist fertig und im Ordner {0} zugänglich - Die Kopie der OFORM-Datei ist im Ordner {0} erstellt. Füllen Sie bitte das Formular aus und laden Sie es danach als eine PDF- oder DOCX-Datei herunter. + Die Kopie der PDF-Datei ist im Ordner {0} erstellt. Füllen Sie bitte das Formular aus und laden Sie es danach als eine PDF- oder DOCX-Datei herunter. Die Datei ist kein Entwurf zum Ausfüllen von Formularen mehr. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.el-GR.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.el-GR.resx index f3d5e4f4214..171188b5118 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.el-GR.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.el-GR.resx @@ -402,10 +402,10 @@ Σφάλμα έναρξης επεξεργασίας αρχείου - Το έγγραφο OFORM με δυνατότητα συμπλήρωσης είναι έτοιμο. Έχει αποθηκευτεί στο {0} + Το έγγραφο PDF με δυνατότητα συμπλήρωσης είναι έτοιμο. Έχει αποθηκευτεί στο {0} - Το αντίγραφο OFORM δημιουργείται στον φάκελο {0}. Συμπληρώστε τη φόρμα και κατεβάστε το αποτέλεσμα ως αρχείο PDF ή DOCX. + Το αντίγραφο PDF δημιουργείται στον φάκελο {0}. Συμπληρώστε τη φόρμα και κατεβάστε το αποτέλεσμα ως αρχείο PDF ή DOCX. Το αρχείο δεν αποτελεί πλέον προσχέδιο για τη συμπλήρωση της φόρμας. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.es.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.es.resx index cbc0c126b53..f0c014c92cb 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.es.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.es.resx @@ -299,10 +299,10 @@ Archivo creado en la carpeta "{0}" - El documento OFORM rellenable está listo. Se guarda en la carpeta {0} + El documento PDF rellenable está listo. Se guarda en la carpeta {0} - La copia OFORM se ha creado en la carpeta {0}. Rellene el formulario y descargue el resultado como archivo PDF o DOCX. + La copia PDF se ha creado en la carpeta {0}. Rellene el formulario y descargue el resultado como archivo PDF o DOCX. El archivo ya no es un borrador para rellenar el formulario. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.fi.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.fi.resx index df657a34fc9..714df0f0976 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.fi.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.fi.resx @@ -401,10 +401,10 @@ Tiedosto luotu kansiossa "{0}" - Täytettävä OFORM-asiakirja on valmis. Se on tallennettu {0}:aan + Täytettävä PDF-asiakirja on valmis. Se on tallennettu {0}:aan - OFORM-kopio on luotu {0} kansioon. Ole hyvä ja täytä lomake ja lataa tulos PDF:nä tai DOCX-tiedostona. + PDF-kopio on luotu {0} kansioon. Ole hyvä ja täytä lomake ja lataa tulos PDF:nä tai DOCX-tiedostona. Tiedosto ei ole enää luonnos lomakkeen täyttämiseksi. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.fr.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.fr.resx index beac2c08e93..d02a471aec9 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.fr.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.fr.resx @@ -299,10 +299,10 @@ Fichier créé dans le dossier "{0}" - Le document OFORM remplissable est prêt. Il est enregistré dans le dossier {0} + Le document PDF remplissable est prêt. Il est enregistré dans le dossier {0} - La copie du fichier OFORM est créée dans le dossier {0}. Veuillez remplir le formulaire et télécharger le résultat sous forme de fichier PDF ou DOCX. + La copie du fichier PDF est créée dans le dossier {0}. Veuillez remplir le formulaire et télécharger le résultat sous forme de fichier PDF ou DOCX. Le dossier n'est plus un brouillon pour remplir le formulaire. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.hy-AM.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.hy-AM.resx index f4bda207906..12f42fde757 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.hy-AM.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.hy-AM.resx @@ -412,10 +412,10 @@ Թղթապանակում ստեղծված ֆայլ"{0}" - Լրացվող OFORM փաստաթուղթը պատրաստ է: Այն պահվում է {0}-ում + Լրացվող PDF փաստաթուղթը պատրաստ է: Այն պահվում է {0}-ում - OFORM-ի պատճենը ստեղծվում է {0} պանակում: Խնդրում ենք լրացնել ձևը և ներբեռնել արդյունքը որպես PDF կամ DOCX ֆայլ. + PDF-ի պատճենը ստեղծվում է {0} պանակում: Խնդրում ենք լրացնել ձևը և ներբեռնել արդյունքը որպես PDF կամ DOCX ֆայլ. Ֆայլն այլևս ձևանմուշ չէ ձևը լրացնելու համար. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.it.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.it.resx index 59b324d1317..295a37daa32 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.it.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.it.resx @@ -299,10 +299,10 @@ File creato nella cartella "{0}" - Il documento compilabile OFORM è pronto. È salvato in {0} + Il documento compilabile PDF è pronto. È salvato in {0} - La copia di OFORM è creata nella cartella {0}. Compila il modulo e scarica il risultato come file PDF o DOCX. + La copia di PDF è creata nella cartella {0}. Compila il modulo e scarica il risultato come file PDF o DOCX. Il file non è più una bozza da compilare il modulo. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.ja-JP.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.ja-JP.resx index 743821c7eda..8b5f05eee3b 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.ja-JP.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.ja-JP.resx @@ -408,10 +408,10 @@ docx、xlsx、pptxとの100%の互換性が保証されています。 ルームを固定することはできません - 記入可能なOFORM文書が出来上がりました。{0}に保存されます + 記入可能なPDF文書が出来上がりました。{0}に保存されます - OFORMのコピーは{0}フォルダーに作成されました。フォームに必要事項を記入し、結果ファイルをPDFまたはDOCXファイルとしてダウンロードしてください。 + PDFのコピーは{0}フォルダーに作成されました。フォームに必要事項を記入し、結果ファイルをPDFまたはDOCXファイルとしてダウンロードしてください。 このファイルは、もはや記入用の下書きではありません。 diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.ko-KR.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.ko-KR.resx index c76ecfaadc4..1b7e40dcb5e 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.ko-KR.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.ko-KR.resx @@ -309,10 +309,10 @@ docx, xlsx, pptx와 최고의 호환성이 보장됩니다. 전송 작업 중 오류가 발생했습니다 - OFORM 사본이 {0} 폴더에 생성되었습니다. 양식을 작성하고 결과를 PDF 또는 DOCX 파일로 다운로드하세요. + PDF 사본이 {0} 폴더에 생성되었습니다. 양식을 작성하고 결과를 PDF 또는 DOCX 파일로 다운로드하세요. - 텍스트를 입력할 수 있는 OFORM 문서가 준비되었습니다. {0}에 저장되었습니다 + 텍스트를 입력할 수 있는 PDF 문서가 준비되었습니다. {0}에 저장되었습니다 저장하려고 시도할 때 파일이 손상되었습니다 diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.lv.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.lv.resx index f2316eba28a..ce14d247412 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.lv.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.lv.resx @@ -405,10 +405,10 @@ Visaugstākā saderība ar docx, xlsx, pptx. Meklēt dokumentu saturā - Aizpildāmais OFORM dokuments ir gatavs. Tas ir saglabāts {0} + Aizpildāmais PDF dokuments ir gatavs. Tas ir saglabāts {0} - OFORM kopija tiek izveidota mapē {0}. Aizpildiet veidlapu un lejupielādējiet rezultātu kā PDF vai DOCX failu. + PDF kopija tiek izveidota mapē {0}. Aizpildiet veidlapu un lejupielādējiet rezultātu kā PDF vai DOCX failu. Fails vairs nav melnraksts, kas jāaizpilda veidlapā. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.nl.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.nl.resx index 2c0654cf090..247283e1ab3 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.nl.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.nl.resx @@ -408,10 +408,10 @@ Het beste geschikt voor docx, xlsx, pptx. Gemaakt om het formulier in te vullen - Het invulbare OFORM document is klaar. Het is opgeslagen in de {0} + Het invulbare PDF document is klaar. Het is opgeslagen in de {0} - De OFORM kopie wordt gemaakt in de map {0}. Vul het formulier in en download het resultaat als PDF- of DOCX-bestand. + De PDF kopie wordt gemaakt in de map {0}. Vul het formulier in en download het resultaat als PDF- of DOCX-bestand. Het bestand is niet langer een concept om het formulier in te vullen. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.pl.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.pl.resx index d1e86a1759d..fa4ca26ae30 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.pl.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.pl.resx @@ -401,10 +401,10 @@ Szukaj w treści dokumentów - Dokument OFORM jest gotowy do wypełnienia. Został zapisany w katalogu {0} + Dokument PDF jest gotowy do wypełnienia. Został zapisany w katalogu {0} - Kopia OFORM jest tworzona w katalogu {0}. Wypełnij formularz i pobierz wynik w formacie PDF lub DOCX. + Kopia PDF jest tworzona w katalogu {0}. Wypełnij formularz i pobierz wynik w formacie PDF lub DOCX. Plik nie jest już wersją roboczą umożliwiającą wypełnienie formularza. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.pt-BR.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.pt-BR.resx index c29cfc35dea..71a6e5a3bae 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.pt-BR.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.pt-BR.resx @@ -296,10 +296,10 @@ Arquivo criado na pasta "{0}" - O documento OFORM preenchível está pronto. Ele é salvo no {0} + O documento PDF preenchível está pronto. Ele é salvo no {0} - A cópia do OFORM é criada na pasta {0}. Preencha o formulário e baixe o resultado em arquivo PDF ou DOCX. + A cópia do PDF é criada na pasta {0}. Preencha o formulário e baixe o resultado em arquivo PDF ou DOCX. O arquivo não é mais um rascunho para preencher o formulário. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.pt.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.pt.resx index 10023000b1b..7999b1b922c 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.pt.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.pt.resx @@ -402,10 +402,10 @@ Alta compatibilidade com docx, xlsx, pptx. Ficheiro criado na pasta "{0}" - O documento preenchível OFORM está pronto. Está guardado no ficheiro {0} + O documento preenchível PDF está pronto. Está guardado no ficheiro {0} - A cópia OFORM foi criada na pasta {0}. Preencha o formulário e descarregue o resultado como ficheiro PDF ou DOCX. + A cópia PDF foi criada na pasta {0}. Preencha o formulário e descarregue o resultado como ficheiro PDF ou DOCX. O ficheiro já não é um rascunho para preencher o formulário. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.resx index 3eead0ad8f8..73098ea6898 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.resx @@ -397,10 +397,10 @@ File created in folder "{0}" - The fillable OFORM document is ready. It is saved in the {0} + The fillable PDF document is ready. It is saved in the {0} - The OFORM copy is created in the {0} folder. Please fill out the form and download the result as a PDF or DOCX file. + The PDF copy is created in the {0} folder. Please fill out the form and download the result as a PDF or DOCX file. The file is no longer a draft to fill in the form. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.ro.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.ro.resx index cc2bd2af044..fc7728f6302 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.ro.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.ro.resx @@ -390,10 +390,10 @@ Compatibilitate garantată 100% cu formatele MS Office. Fișierul a fost creat în dosarul "{0}" - Documentul OFORM spre completare este gata. A fost salvat în {0} + Documentul PDF spre completare este gata. A fost salvat în {0} - Copia fișierului OFORM a fost creată în folderul {0}. Completați formularul și încărcați rezultatul în formatul PDF sau DOCX. + Copia fișierului PDF a fost creată în folderul {0}. Completați formularul și încărcați rezultatul în formatul PDF sau DOCX. Nu mai este un fișier schiță pentru completarea formularului. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.ru.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.ru.resx index 42c0c888603..947c7a0bba5 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.ru.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.ru.resx @@ -299,10 +299,10 @@ Файл создан в папке "{0}" - Заполняемый документ OFORM готов. Он сохранен в папке {0} + Заполняемый документ PDF готов. Он сохранен в папке {0} - Копия файла OFORM создана в папке {0}. Заполните форму и скачайте результат как файл в формате PDF или DOCX. + Копия файла PDF создана в папке {0}. Заполните форму и скачайте результат как файл в формате PDF или DOCX. Файл больше не является черновиком для заполнения формы. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.sk.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.sk.resx index 13be8d48b39..bcbb436daec 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.sk.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.sk.resx @@ -393,10 +393,10 @@ Môžete si prezerať a sťahovať zdieľané dokumenty. Nahrávajte súbory do zdieľaných priečinkov. Zaručená najvyššia kompatibilita s formátmi docx, xlsx, pptx. - Kópia dokumentu OFORM je vytvorená v priečinku {0}. Vyplňte formulár a stiahnite si výsledok ako súbor PDF alebo DOCX. + Kópia dokumentu PDF je vytvorená v priečinku {0}. Vyplňte formulár a stiahnite si výsledok ako súbor PDF alebo DOCX. - Vyplniteľný dokument OFORM je pripravený. Je uložený v priečinku {0} + Vyplniteľný dokument PDF je pripravený. Je uložený v priečinku {0} bor už nie je návrhom na vyplnenie formulára. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.sl.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.sl.resx index 9744cddd122..72a34986452 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.sl.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.sl.resx @@ -401,10 +401,10 @@ Datoteka ustvarjena v mapi "{0}" - Dokument OFORM za izpolnjevanje je pripravljen. Shranjen je v {0} + Dokument PDF za izpolnjevanje je pripravljen. Shranjen je v {0} - Kopija OFORM je ustvarjena v mapi {0}. Izpolnite obrazec in prenesite rezultat kot datoteko PDF ali DOCX. + Kopija PDF je ustvarjena v mapi {0}. Izpolnite obrazec in prenesite rezultat kot datoteko PDF ali DOCX. Datoteka ni več osnutek za izpolnjevanje obrazca. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.tr.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.tr.resx index 3e2a97915fa..fe852b63e70 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.tr.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.tr.resx @@ -296,10 +296,10 @@ "{0}" klasöründe dosya oluşturuldu - Doldurulabilir OFORM belgesi hazır. {0} klasörüne kaydedilir + Doldurulabilir PDF belgesi hazır. {0} klasörüne kaydedilir - OFORM kopyası, {0} klasöründe oluşturulur. Lütfen formu doldurun ve sonucu PDF veya DOCX dosyası olarak indirin. + PDF kopyası, {0} klasöründe oluşturulur. Lütfen formu doldurun ve sonucu PDF veya DOCX dosyası olarak indirin. Dosya artık formu doldurmak için bir taslak değildir. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.uk-UA.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.uk-UA.resx index d2120f731ef..2d2957051f4 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.uk-UA.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.uk-UA.resx @@ -401,10 +401,10 @@ Пошук у вмісті документів - Документ OFORM для заповнення готовий. Його збережено до {0} + Документ PDF для заповнення готовий. Його збережено до {0} - Копія OFORM створюється в папці {0}. Заповніть форму й завантажте результат у форматі PDF або DOCX. + Копія PDF створюється в папці {0}. Заповніть форму й завантажте результат у форматі PDF або DOCX. Файл більше не є чернеткою для заповнення форми. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.vi.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.vi.resx index 2e59233bf3f..fd5e0c38768 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.vi.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.vi.resx @@ -405,10 +405,10 @@ Khả năng tương thích cao nhất với docx, xlsx, pptx. Tìm trong nội dung tài liệu - Tài liệu OFORM có thể điền thông tin đã sẵn sàng. Nó được lưu trong {0} + Tài liệu PDF có thể điền thông tin đã sẵn sàng. Nó được lưu trong {0} - Bản sao OFORM được tạo trong thư mục {0}. Vui lòng điền vào biểu mẫu và tải xuống kết quả dưới dạng tập tin PDF hoặc DOCX. + Bản sao PDF được tạo trong thư mục {0}. Vui lòng điền vào biểu mẫu và tải xuống kết quả dưới dạng tập tin PDF hoặc DOCX. Tập tin không còn là bản nháp để điền vào biểu mẫu. diff --git a/products/ASC.Files/Core/Resources/FilesCommonResource.zh-CN.resx b/products/ASC.Files/Core/Resources/FilesCommonResource.zh-CN.resx index 9da523496d5..6d4987c50df 100644 --- a/products/ASC.Files/Core/Resources/FilesCommonResource.zh-CN.resx +++ b/products/ASC.Files/Core/Resources/FilesCommonResource.zh-CN.resx @@ -296,10 +296,10 @@ 文件已在文件夹“{0}”中创建 - 可填写的OFORM文件已准备就绪。该文件已保存在 {0} + 可填写的PDF文件已准备就绪。该文件已保存在 {0} - OFORM副本是在 {0} 文件夹中创建的。请填写表单并下载为PDF或DOCX。 + PDF副本是在 {0} 文件夹中创建的。请填写表单并下载为PDF或DOCX。 该文件不再是填写表单的草稿。