From ad790e8a87b3c634afc04c4fff83f1656fb1e920 Mon Sep 17 00:00:00 2001 From: JenkinsRobo Date: Fri, 26 May 2023 10:30:15 +0000 Subject: [PATCH] Update to v12.5.2 --- .nuget/packages/SharpZipLib.1.4.2.nupkg | Bin 0 -> 797159 bytes 3rd-Party.txt | 10 +- CHANGELOG.md | 898 +- build/ManageServices.bat | 46 +- build/config/TeamLabSvc.exe.config | 25 +- build/install/deb/Files/Tools/letsencrypt.sh | 15 +- ...ce => onlyofficeFilesTrashCleaner.service} | 6 +- .../deb/debian/onlyofficeMailImap.service | 2 +- .../deb/debian/onlyofficeRadicale.service | 6 +- .../deb/debian/onlyofficeSocketIO.service | 6 +- .../deb/debian/onlyofficeSsoAuth.service | 6 +- .../deb/debian/onlyofficeThumb.service | 6 +- .../deb/debian/onlyofficeUrlShortener.service | 6 +- .../deb/debian/onlyofficeWebDav.service | 6 +- build/install/deb/debian/postinst | 109 +- build/install/deb/debian/rules | 6 +- build/install/deb/debian/templates | 5 + build/install/rpm/Files/Tools/letsencrypt.sh | 15 +- ...ce => onlyofficeFilesTrashCleaner.service} | 6 +- .../Files/systemd/onlyofficeMailImap.service | 2 +- .../Files/systemd/onlyofficeRadicale.service | 6 +- .../Files/systemd/onlyofficeSocketIO.service | 6 +- .../Files/systemd/onlyofficeSsoAuth.service | 6 +- .../rpm/Files/systemd/onlyofficeThumb.service | 6 +- .../systemd/onlyofficeUrlShortener.service | 6 +- .../Files/systemd/onlyofficeWebDav.service | 6 +- build/install/rpm/common.spec | 60 +- .../rpm/onlyoffice-communityserver.spec | 4 +- build/msbuild/ASC.Web.Core.BuildTask.dll | Bin 27648 -> 27648 bytes build/msbuild/deploy.proj | 33 + build/sql/onlyoffice.data.sql | 201 +- build/sql/onlyoffice.sql | 17 +- build/sql/onlyoffice.upgrade86.sql | 9 +- build/sql/onlyoffice.upgradev125.sql | 247 + .../Login/LoginAcceptedTests.cs | 34 +- .../Query/ParseTests.cs | 34 +- .../Utils/LdapHelperTests.cs | 34 +- .../ASC.ActiveDirectory.csproj | 5 + .../Data/LdapCertificateConfirmRequest.cs | 44 +- .../Base/Data/LdapLogin.cs | 34 +- .../Base/Data/LdapObject.cs | 35 +- .../Base/Data/LdapObjectExtension.cs | 42 +- .../Base/Expressions/Criteria.cs | 36 +- .../Base/Expressions/CriteriaType.cs | 34 +- .../Base/Expressions/Expression.cs | 38 +- .../Base/Expressions/Op.cs | 34 +- .../ASC.ActiveDirectory/Base/LdapConstants.cs | 34 +- common/ASC.ActiveDirectory/Base/LdapHelper.cs | 34 +- .../Base/LdapNotifyConstants.cs | 34 +- .../Base/LdapNotifyHelper.cs | 34 +- .../Base/LdapNotifySource.cs | 34 +- .../Base/LdapUserImporter.cs | 16 +- .../Base/Settings/LdapSettings.cs | 73 +- .../Base/Settings/LdapSettingsChecker.cs | 34 +- .../Base/Settings/LdapSettingsStatus.cs | 34 +- .../BuiltIn/SystemLdapHelper.cs | 34 +- .../BuiltIn/SystemLdapSearcher.cs | 34 +- .../BuiltIn/SystemLdapSettingsChecker.cs | 34 +- .../ComplexOperations/Data/LdapChange.cs | 34 +- .../Data/LdapChangeCollection.cs | 34 +- .../ComplexOperations/Data/LdapChangeEnums.cs | 34 +- .../ComplexOperations/Data/LdapItemChange.cs | 34 +- .../ComplexOperations/LdapLocalization.cs | 34 +- .../ComplexOperations/LdapOperation.cs | 34 +- .../ComplexOperations/LdapOperationStatus.cs | 43 +- .../ComplexOperations/LdapOperationType.cs | 34 +- .../LdapSaveSyncOperation.cs | 36 +- common/ASC.ActiveDirectory/LdapUserManager.cs | 43 +- common/ASC.ActiveDirectory/LdapUtils.cs | 78 +- .../Novell/Data/NovellLdapObject.cs | 35 +- ...ellLdapTlsCertificateRequestedException.cs | 34 +- .../Extensions/NovellLdapEntryExtension.cs | 34 +- .../Novell/NovellLdapHelper.cs | 34 +- .../Novell/NovellLdapSearcher.cs | 34 +- .../Novell/NovellLdapSettingsChecker.cs | 34 +- .../Novell/NovellLdapUserImporter.cs | 34 +- common/ASC.Common/ASC.Common.csproj | 17 +- common/ASC.Common/Caching/AscCache.cs | 24 +- .../ASC.Common/Caching/CacheNotifyAction.cs | 34 +- common/ASC.Common/Caching/ICache.cs | 34 +- common/ASC.Common/Caching/ICacheNotify.cs | 34 +- common/ASC.Common/Caching/RedisCache.cs | 2 +- .../Collections/CachedDictionaryBase.cs | 2 +- .../Collections/HttpRequestDictionary.cs | 2 +- .../Data/AdoProxy/DbCommandProxy.cs | 2 +- .../Data/AdoProxy/DbConnectionProxy.cs | 2 +- .../Data/AdoProxy/DbTransactionProxy.cs | 2 +- common/ASC.Common/Data/AdoProxy/EventArgs.cs | 2 +- .../ASC.Common/Data/AdoProxy/ExecuteHelper.cs | 2 +- .../ASC.Common/Data/AdoProxy/ProxyContext.cs | 2 +- common/ASC.Common/Data/DataExtensions.cs | 86 +- common/ASC.Common/Data/DbManager.cs | 225 +- common/ASC.Common/Data/DbNestedTransaction.cs | 2 +- common/ASC.Common/Data/DbRegistry.cs | 2 +- common/ASC.Common/Data/DbTransaction.cs | 2 +- common/ASC.Common/Data/IDbManager.cs | 3 +- .../ASC.Common/Data/MultiRegionalDbManager.cs | 13 +- .../Data/Sql/Dialects/MySQLDialect.cs | 2 +- .../Data/Sql/Dialects/SQLiteDialect.cs | 2 +- .../Data/Sql/Dialects/SqlDialect.cs | 2 +- .../ASC.Common/Data/Sql/Expressions/AsExp.cs | 2 +- .../Data/Sql/Expressions/BetweenExp.cs | 2 +- .../Data/Sql/Expressions/EqColumnsExp.cs | 2 +- .../ASC.Common/Data/Sql/Expressions/EqExp.cs | 2 +- .../Data/Sql/Expressions/ExistsExp.cs | 2 +- common/ASC.Common/Data/Sql/Expressions/Exp.cs | 2 +- .../ASC.Common/Data/Sql/Expressions/IfExp.cs | 34 +- .../ASC.Common/Data/Sql/Expressions/InExp.cs | 2 +- .../Data/Sql/Expressions/JunctionExp.cs | 2 +- .../ASC.Common/Data/Sql/Expressions/LGtExp.cs | 2 +- .../Data/Sql/Expressions/LikeExp.cs | 2 +- .../Data/Sql/Expressions/SelectAgregate.cs | 2 +- .../ASC.Common/Data/Sql/Expressions/SqlExp.cs | 2 +- .../ASC.Common/Data/Sql/Expressions/SumExp.cs | 34 +- common/ASC.Common/Data/Sql/ISqlDialect.cs | 2 +- common/ASC.Common/Data/Sql/ISqlInstruction.cs | 2 +- common/ASC.Common/Data/Sql/SqlCreate.cs | 2 +- common/ASC.Common/Data/Sql/SqlDebugView.cs | 2 +- common/ASC.Common/Data/Sql/SqlDelete.cs | 10 +- common/ASC.Common/Data/Sql/SqlIdentifier.cs | 2 +- common/ASC.Common/Data/Sql/SqlInsert.cs | 2 +- .../Data/Sql/SqlInstructionDebuggerDisplay.cs | 2 +- common/ASC.Common/Data/Sql/SqlQuery.cs | 2 +- common/ASC.Common/Data/Sql/SqlUpdate.cs | 2 +- common/ASC.Common/Data/StreamExtension.cs | 2 +- common/ASC.Common/Data/TempPath.cs | 2 +- common/ASC.Common/Data/TempStream.cs | 2 +- .../AutofacConfigLoader.cs | 2 +- .../AutofacConfigurationSection.cs | 34 +- .../DependencyInjection/ComponentElement.cs | 34 +- .../ConfigurationElementCollection.cs | 34 +- .../ContainerElementCollection.cs | 34 +- .../DictionaryElementCollection.cs | 34 +- .../ListElementCollection.cs | 34 +- .../DependencyInjection/ListItemElement.cs | 34 +- .../NamedConfigurationElementCollection.cs | 34 +- .../DependencyInjection/ParameterElement.cs | 34 +- .../ParameterElementCollection.cs | 34 +- .../DependencyInjection/TypeManipulation.cs | 34 +- .../Geolocation/GeolocationHelper.cs | 6 +- .../Geolocation/IPGeolocationInfo.cs | 3 +- common/ASC.Common/Logging/Log.cs | 4 +- .../Logging/SelfCleaningAppender.cs | 34 +- .../Logging/SpecialFolderPathConverter.cs | 2 +- common/ASC.Common/Module/BaseWcfClient.cs | 2 +- .../ASC.Common/Module/IServiceController.cs | 2 +- common/ASC.Common/Notify/AWSEmail.cs | 2 +- .../Notify/Channels/ISenderChannel.cs | 2 +- .../Notify/Channels/SenderChannel.cs | 2 +- common/ASC.Common/Notify/Context.cs | 2 +- .../ASC.Common/Notify/Cron/CronExpression.cs | 2 +- common/ASC.Common/Notify/Cron/ISet.cs | 2 +- common/ASC.Common/Notify/Cron/ISortedSet.cs | 2 +- common/ASC.Common/Notify/Cron/TreeSet.cs | 2 +- .../Notify/Engine/DispatchEngine.cs | 2 +- .../ASC.Common/Notify/Engine/INotifyEngine.cs | 2 +- .../Notify/Engine/InterceptorStorage.cs | 2 +- .../ASC.Common/Notify/Engine/NotifyEngine.cs | 2 +- .../ASC.Common/Notify/Engine/NotifyRequest.cs | 2 +- .../Notify/Engine/SendInterceptorSkeleton.cs | 2 +- .../Engine/SingleRecipientInterceptor.cs | 2 +- common/ASC.Common/Notify/INotifyClient.cs | 11 +- common/ASC.Common/Notify/INotifyRegistry.cs | 2 +- common/ASC.Common/Notify/INotifyService.cs | 2 +- common/ASC.Common/Notify/ISendInterceptor.cs | 2 +- .../ASC.Common/Notify/InitiatorInterceptor.cs | 2 +- .../ASC.Common/Notify/InterceptorLifetime.cs | 2 +- common/ASC.Common/Notify/InterceptorPlace.cs | 2 +- .../Notify/Messages/INoticeMessage.cs | 2 +- .../Notify/Messages/NoticeMessage.cs | 2 +- .../Notify/Messages/NotifyMessage.cs | 2 +- .../Notify/Messages/SendResponse.cs | 2 +- .../ASC.Common/Notify/Messages/SendResult.cs | 2 +- .../Notify/Model/ConstActionProvider.cs | 2 +- .../Notify/Model/IActionProvider.cs | 2 +- .../ASC.Common/Notify/Model/INotifyAction.cs | 2 +- .../ASC.Common/Notify/Model/INotifySource.cs | 2 +- .../Notify/Model/ISubscriptionProvider.cs | 2 +- .../ASC.Common/Notify/Model/NotifyAction.cs | 2 +- .../Notify/Model/NotifyClientImpl.cs | 29 +- .../Notify/Model/TopSubscriptionProvider.cs | 2 +- common/ASC.Common/Notify/NotifyException.cs | 2 +- common/ASC.Common/Notify/NotifyResult.cs | 2 +- common/ASC.Common/Notify/Patterns/IPattern.cs | 2 +- .../Notify/Patterns/IPatternFormatter.cs | 2 +- .../Notify/Patterns/IPatternProvider.cs | 2 +- .../Notify/Patterns/IPatternStyler.cs | 2 +- .../ASC.Common/Notify/Patterns/ITagValue.cs | 2 +- .../Patterns/NVelocityPatternFormatter.cs | 2 +- common/ASC.Common/Notify/Patterns/Pattern.cs | 2 +- .../Notify/Patterns/PatternFormatter.cs | 2 +- .../Patterns/ReplacePatternFormatter.cs | 2 +- common/ASC.Common/Notify/Patterns/TagValue.cs | 2 +- .../Notify/Patterns/XmlPatternProvider2.cs | 2 +- .../Notify/Recipients/DirectRecipient.cs | 2 +- .../Notify/Recipients/IDirectRecipient.cs | 2 +- .../Notify/Recipients/IRecipient.cs | 2 +- .../Notify/Recipients/IRecipientsGroup.cs | 2 +- .../Notify/Recipients/IRecipientsProvider.cs | 2 +- .../Notify/Recipients/RecipientsGroup.cs | 2 +- .../ASC.Common/Notify/Sinks/DispatchSink.cs | 2 +- common/ASC.Common/Notify/Sinks/ISink.cs | 2 +- common/ASC.Common/Notify/Sinks/Sink.cs | 2 +- common/ASC.Common/Radicale/CalDavCalendar.cs | 19 +- .../ASC.Common/Radicale/CardDavAddressbook.cs | 19 +- common/ASC.Common/Radicale/CardDavItem.cs | 19 +- common/ASC.Common/Radicale/Core/DbRadicale.cs | 20 +- .../Radicale/Core/RadicaleClient.cs | 19 +- .../Radicale/Core/RadicaleException.cs | 19 +- common/ASC.Common/Radicale/DavRequest.cs | 19 +- common/ASC.Common/Radicale/DavResponse.cs | 19 +- common/ASC.Common/Radicale/IRadicaleEntity.cs | 19 +- common/ASC.Common/Radicale/RadicaleEntity.cs | 19 +- common/ASC.Common/Security/AscRandom.cs | 2 +- .../Security/Authentication/Account.cs | 2 +- .../Security/Authentication/IAccount.cs | 2 +- .../Security/Authentication/ISystemAccount.cs | 2 +- .../Security/Authentication/IUserAccount.cs | 2 +- .../Security/Authentication/SystemAccount.cs | 2 +- .../Authorizing/AuthorizingException.cs | 2 +- .../Security/Authorizing/AzManager.cs | 2 +- .../Security/Authorizing/AzObjectIdHelper.cs | 2 +- .../AzObjectSecurityProviderHelper.cs | 2 +- .../Security/Authorizing/Constants.cs | 2 +- .../Security/Authorizing/Domain/Ace.cs | 2 +- .../Security/Authorizing/Domain/AceType.cs | 2 +- .../Security/Authorizing/Domain/Action.cs | 2 +- .../Security/Authorizing/Domain/Role.cs | 2 +- .../Authorizing/Interfaces/IAction.cs | 2 +- .../Security/Authorizing/Interfaces/IRole.cs | 2 +- .../Authorizing/Interfaces/ISubject.cs | 2 +- .../Security/Cryptography/HashAlg.cs | 2 +- .../Security/Cryptography/Hasher.cs | 2 +- .../Security/Cryptography/InstanceCrypto.cs | 2 +- .../Cryptography/MachinePseudoKeys.cs | 2 +- .../Security/Cryptography/PasswordHasher.cs | 2 +- .../Security/IPermissionProvider.cs | 2 +- .../Security/IPermissionResolver.cs | 2 +- common/ASC.Common/Security/IRoleProvider.cs | 2 +- common/ASC.Common/Security/ISecurityObject.cs | 2 +- .../ASC.Common/Security/ISecurityObjectId.cs | 2 +- .../Security/ISecurityObjectProvider.cs | 2 +- .../Security/SecurityCallContext.cs | 2 +- .../ASC.Common/Security/SecurityObjectId.cs | 2 +- .../ASC.Common/Threading/DistributedTask.cs | 5 +- .../Threading/DistributedTaskQueue.cs | 41 +- .../Threading/DistributedTaskStatus.cs | 34 +- .../LimitedConcurrencyLevelTaskScheduler.cs | 34 +- .../Threading/Progress/IProgressItem.cs | 2 +- .../Threading/Progress/ProgressBase.cs | 2 +- .../Threading/Progress/ProgressQueue.cs | 2 +- .../ASC.Common/Threading/Workers/WorkItem.cs | 2 +- .../Threading/Workers/WorkerQueue.cs | 2 +- .../Utils/ConfigurationManagerExtension.cs | 2 +- common/ASC.Common/Utils/DnsLookup.cs | 34 +- common/ASC.Common/Utils/HtmlUtil.cs | 2 +- .../ASC.Common/Utils/HttpRequestExtensions.cs | 2 +- common/ASC.Common/Utils/IpAddressParser.cs | 64 + common/ASC.Common/Utils/MailAddressUtils.cs | 2 +- common/ASC.Common/Utils/MimeHeaderUtils.cs | 2 +- common/ASC.Common/Utils/RandomString.cs | 2 +- common/ASC.Common/Utils/Signature.cs | 2 +- common/ASC.Common/Utils/StringUtils.cs | 34 +- .../TimeZoneConverter/TimeZoneConverter.cs | 2 +- common/ASC.Common/Utils/VelocityFormatter.cs | 2 +- common/ASC.Common/Utils/Wildcard.cs | 2 +- .../Web/AbstractHttpAsyncHandler.cs | 2 +- .../ASC.Common/Web/DisposableHttpContext.cs | 40 +- .../Web/DisposableHttpContextHttpModule.cs | 2 +- common/ASC.Common/Web/HttpClientFactory.cs | 56 + common/ASC.Common/Web/MimeMapping.cs | 2 +- .../ASC.Common/Web/ResiliencePolicyManager.cs | 83 + common/ASC.Common/Web/RouteCallInfo.cs | 2 +- common/ASC.Core.Common/ASC.Core.Common.csproj | 6 + common/ASC.Core.Common/Audit/BaseEvent.cs | 34 +- .../ASC.Core.Common/BaseCommonLinkUtility.cs | 34 +- .../ASC.Core.Common/Billing/BillingClient.cs | 34 +- .../ASC.Core.Common/Billing/ITariffService.cs | 6 +- .../Billing/License/License.cs | 2 +- .../Billing/License/LicenseException.cs | 34 +- .../Billing/License/LicenseReader.cs | 2 +- .../ASC.Core.Common/Billing/PaymentActive.cs | 2 +- common/ASC.Core.Common/Billing/PaymentInfo.cs | 2 +- common/ASC.Core.Common/Billing/Tariff.cs | 9 +- .../ASC.Core.Common/Billing/TariffService.cs | 19 +- common/ASC.Core.Common/Billing/TariffState.cs | 2 +- .../ASC.Core.Common/Caching/AzRecordStore.cs | 2 +- .../Caching/CachedAzService.cs | 2 +- .../Caching/CachedQuotaService.cs | 56 +- .../Caching/CachedSubscriptionService.cs | 2 +- .../Caching/CachedTenantService.cs | 2 +- .../Caching/CachedUserService.cs | 2 +- .../ASC.Core.Common/Caching/ICachedService.cs | 2 +- .../ASC.Core.Common/Caching/TrustInterval.cs | 2 +- .../Caching/UserGroupRefStore.cs | 2 +- .../Configuration/AmazonS3Settings.cs | 2 +- .../Configuration/AmiPublicDnsSyncService.cs | 2 +- .../ConnectionStringNameTypeConverter.cs | 2 +- .../Configuration/Constants.cs | 2 +- .../ASC.Core.Common/Configuration/Consumer.cs | 129 +- .../ConsumerConfigurationSection.cs | 85 +- .../Configuration/SmtpSettings.cs | 9 +- common/ASC.Core.Common/Context/CoreContext.cs | 2 +- .../Context/Impl/AuthManager.cs | 2 +- .../Context/Impl/AuthorizationManager.cs | 2 +- .../Context/Impl/CoreConfiguration.cs | 2 +- .../Context/Impl/PaymentManager.cs | 16 +- .../Context/Impl/SubscriptionManager.cs | 2 +- .../Context/Impl/TenantManager.cs | 15 +- .../Context/Impl/UserManager.cs | 5 +- .../Context/SecurityContext.cs | 2 +- common/ASC.Core.Common/Context/WorkContext.cs | 2 +- .../Contracts/BackupServiceClient.cs | 2 +- .../Contracts/BackupServiceModel.cs | 11 +- .../HealthCheck/Enums/HealthStatus.cs | 34 +- .../HealthCheck/HealthCheckResponse.cs | 34 +- .../HealthCheck/HealthCheckResult.cs | 34 +- .../Contracts/HealthCheck/HealthCheckSvc.cs | 33 +- .../HealthCheck/IHealthCheckService.cs | 34 +- .../Contracts/IBackupService.cs | 2 +- common/ASC.Core.Common/Core/AzRecord.cs | 2 +- .../ASC.Core.Common/Core/DBResourceManager.cs | 2 +- .../Core/EmployeeActivationStatus.cs | 2 +- common/ASC.Core.Common/Core/EmployeeStatus.cs | 2 +- common/ASC.Core.Common/Core/EmployeeType.cs | 2 +- common/ASC.Core.Common/Core/Group.cs | 2 +- common/ASC.Core.Common/Core/GroupInfo.cs | 2 +- common/ASC.Core.Common/Core/IAzService.cs | 2 +- common/ASC.Core.Common/Core/IQuotaService.cs | 11 +- .../Core/ISubscriptionService.cs | 2 +- common/ASC.Core.Common/Core/ITenantService.cs | 2 +- common/ASC.Core.Common/Core/IUserService.cs | 2 +- common/ASC.Core.Common/Core/IncludeType.cs | 2 +- common/ASC.Core.Common/Core/Partner.cs | 2 +- .../Core/PartnerDisplayType.cs | 2 +- .../Core/PartnerPaymentMethod.cs | 2 +- common/ASC.Core.Common/Core/PartnerStatus.cs | 2 +- common/ASC.Core.Common/Core/PartnerType.cs | 2 +- .../Core/SubscriptionMethod.cs | 2 +- .../Core/SubscriptionRecord.cs | 2 +- common/ASC.Core.Common/Core/UserGroupRef.cs | 2 +- .../Core/UserGroupRefDictionary.cs | 2 +- .../ASC.Core.Common/Core/UserGroupRefType.cs | 2 +- common/ASC.Core.Common/Core/UserInfo.cs | 40 +- common/ASC.Core.Common/Data/DbAzService.cs | 2 +- common/ASC.Core.Common/Data/DbBaseService.cs | 4 +- .../Data/DbLoginEventsManager.cs | 36 +- common/ASC.Core.Common/Data/DbQuotaService.cs | 120 +- .../ASC.Core.Common/Data/DbSettingsManager.cs | 40 +- .../Data/DbSubscriptionService.cs | 2 +- .../ASC.Core.Common/Data/DbTenantService.cs | 8 +- common/ASC.Core.Common/Data/DbUserService.cs | 11 +- .../Encryption/EncryprtionStatus.cs | 34 +- .../Encryption/EncryptionSettings.cs | 34 +- common/ASC.Core.Common/Encryption/ICrypt.cs | 34 +- common/ASC.Core.Common/HostedSolution.cs | 16 +- common/ASC.Core.Common/Logging/LogManager.cs | 64 +- .../Messaging/MessageAction.cs | 5 +- .../MultiRegionHostedSolution.cs | 8 +- .../Notify/DirectSubscriptionProvider.cs | 2 +- .../ASC.Core.Common/Notify/EmailSenderSink.cs | 2 +- .../ASC.Core.Common/Notify/FirebaseApiKey.cs | 19 +- .../Notify/Jabber/IJabberService.cs | 2 +- .../Notify/Jabber/IReverseJabberService.cs | 2 +- .../Notify/Jabber/JabberServiceClient.cs | 2 +- .../Notify/Jabber/JabberServiceClientWcf.cs | 2 +- .../Notify/Jabber/MessageStruct.cs | 2 +- .../Notify/JabberSenderSink.cs | 2 +- .../ASC.Core.Common/Notify/MentionProvider.cs | 19 +- .../Notify/NotifyServiceClient.cs | 2 +- common/ASC.Core.Common/Notify/NotifySource.cs | 2 +- .../Notify/Push/Dao/FireBaseUser.cs | 19 +- .../Notify/Push/Dao/FirebaseDao.cs | 21 +- .../Notify/Push/Dao/NotifyData.cs | 19 +- .../Notify/Push/Dao/NotifyFileData.cs | 19 +- .../Notify/Push/Dao/NotifyFolderData.cs | 19 +- common/ASC.Core.Common/Notify/Push/Enums.cs | 2 +- .../Notify/Push/FirebaseHelper.cs | 19 +- .../Notify/Push/IPushService.cs | 2 +- .../Notify/Push/PushConstants.cs | 2 +- .../Notify/Push/PushNotification.cs | 2 +- .../Notify/Push/PushServiceClient.cs | 2 +- .../ASC.Core.Common/Notify/PushSenderSink.cs | 2 +- .../Notify/RecipientProviderImpl.cs | 2 +- .../Notify/Senders/AWSSender.cs | 2 +- .../Notify/Senders/INotifySender.cs | 2 +- .../Notify/Senders/JabberSender.cs | 2 +- .../Notify/Senders/NoticeSendResult.cs | 2 +- .../Notify/Senders/NotifyServiceSender.cs | 2 +- .../Notify/Senders/PushSender.cs | 34 +- .../Notify/Senders/SmtpSender.cs | 24 +- .../Notify/Senders/TelegramSender.cs | 34 +- .../Notify/Signalr/ISignalrService.cs | 2 +- .../Notify/Signalr/MailNotificationState.cs | 33 +- .../Notify/Signalr/SignalrServiceClient.cs | 2 +- .../Notify/Telegram/Dao/CachedTelegramDao.cs | 34 +- .../Notify/Telegram/Dao/TelegramDao.cs | 36 +- .../Notify/Telegram/Dao/TelegramUser.cs | 34 +- .../Notify/Telegram/ITelegramLoginProvider.cs | 33 +- .../Notify/Telegram/ITelegramService.cs | 34 +- .../Notify/Telegram/TelegramHelper.cs | 34 +- .../Notify/Telegram/TelegramSenderSink.cs | 34 +- .../Notify/Telegram/TelegramServiceClient.cs | 34 +- .../Security/Authentication/CookieStorage.cs | 2 +- .../Security/Authentication/UserAccount.cs | 2 +- .../Authorizing/PermissionProvider.cs | 2 +- .../Authorizing/PermissionResolver.cs | 2 +- .../Security/Authorizing/RoleProvider.cs | 2 +- common/ASC.Core.Common/Security/Crypto.cs | 2 +- .../Security/EmailValidationKeyProvider.cs | 2 +- .../Security/UserSecurityProvider.cs | 2 +- common/ASC.Core.Common/Settings/ISettings.cs | 2 +- .../Settings/SettingsManager.cs | 2 +- common/ASC.Core.Common/Tenants/Tenant.cs | 29 +- .../Tenants/TenantAuditSettings.cs | 34 +- .../Tenants/TenantControlPanelSettings.cs | 2 +- .../Tenants/TenantCookieSettings.cs | 2 +- .../Tenants/TenantDomainValidator.cs | 2 +- .../Tenants/TenantExceptions.cs | 2 +- .../ASC.Core.Common/Tenants/TenantIndustry.cs | 2 +- common/ASC.Core.Common/Tenants/TenantQuota.cs | 24 +- .../Tenants/TenantQuotaException.cs | 2 +- .../ASC.Core.Common/Tenants/TenantQuotaRow.cs | 5 +- .../Tenants/TenantQuotaSettings.cs | 46 + .../Tenants/TenantQuotaType.cs | 2 +- .../Tenants/TenantRegistrationInfo.cs | 2 +- .../ASC.Core.Common/Tenants/TenantStatus.cs | 2 +- .../Tenants/TenantTrustedDomainsType.cs | 2 +- .../Tenants/TenantUserQuotaSettings.cs | 53 + common/ASC.Core.Common/Tenants/TenantUtil.cs | 2 +- .../ASC.Core.Common/Tenants/TenantVersion.cs | 2 +- common/ASC.Core.Common/Users/Constants.cs | 2 +- .../Users/DisplayUserNameFormat.cs | 2 +- .../Users/PersonalQuotaSettings.cs | 34 +- .../ASC.Core.Common/Users/UserExtensions.cs | 2 +- common/ASC.Core.Common/Users/UserFormatter.cs | 2 +- .../Users/UserQuotaSettings.cs | 46 + common/ASC.Data.Backup.Console/Program.cs | 2 +- common/ASC.Data.Backup.Restore/MainForm.cs | 2 +- common/ASC.Data.Backup.Restore/Program.cs | 2 +- common/ASC.Data.Backup.Restore/Restarter.cs | 2 +- common/ASC.Data.Backup.RestoreDemo/Service.cs | 2 +- common/ASC.Data.Backup/ASC.Data.Backup.csproj | 13 +- common/ASC.Data.Backup/ActionInvoker.cs | 2 +- common/ASC.Data.Backup/DbBackupProvider.cs | 3 +- .../Exceptions/DbBackupException.cs | 2 +- .../ASC.Data.Backup/Exceptions/ThrowHelper.cs | 2 +- .../Extensions/DataExtensions.cs | 2 +- .../Extensions/EnumerableExtensions.cs | 2 +- .../Extensions/XmlExtensions.cs | 2 +- common/ASC.Data.Backup/FileBackupProvider.cs | 3 +- common/ASC.Data.Backup/IBackupProvider.cs | 4 +- common/ASC.Data.Backup/NotifyHelper.cs | 2 +- .../Service/BackupCleanerService.cs | 2 +- .../Service/BackupCleanerTempFileService.cs | 2 +- .../Service/BackupConfiguration.cs | 12 +- .../Service/BackupSchedulerService.cs | 2 +- .../ASC.Data.Backup/Service/BackupService.cs | 2 +- .../Service/BackupServiceLauncher.cs | 2 +- .../ASC.Data.Backup/Service/BackupWorker.cs | 31 +- .../ASC.Data.Backup/Storage/BackupRecord.cs | 4 +- .../Storage/BackupRepository.cs | 66 +- .../Storage/BackupStorageFactory.cs | 4 +- .../Storage/ConsumerBackupStorage.cs | 59 +- .../Storage/DataStoreBackupStorage.cs | 79 - .../Storage/DocumentsBackupStorage.cs | 54 +- .../Storage/IBackupRepository.cs | 4 +- .../ASC.Data.Backup/Storage/IBackupStorage.cs | 4 +- .../Storage/LocalBackupStorage.cs | 11 +- .../Storage/S3BackupStorage.cs | 146 - common/ASC.Data.Backup/Storage/Schedule.cs | 2 +- .../ASC.Data.Backup/Tasks/BackupFileInfo.cs | 2 +- .../ASC.Data.Backup/Tasks/BackupPortalTask.cs | 92 +- common/ASC.Data.Backup/Tasks/ColumnMapper.cs | 2 +- .../ASC.Data.Backup/Tasks/Data/DataRowInfo.cs | 2 +- .../Tasks/Data/DataRowInfoReader.cs | 2 +- .../Tasks/Data/RelationInfo.cs | 2 +- .../ASC.Data.Backup/Tasks/Data/TableInfo.cs | 2 +- common/ASC.Data.Backup/Tasks/DbFactory.cs | 2 +- .../ASC.Data.Backup/Tasks/DeletePortalTask.cs | 2 +- common/ASC.Data.Backup/Tasks/KeyHelper.cs | 2 +- .../Tasks/Modules/AuditModuleSpecifics.cs | 2 +- .../Tasks/Modules/CalendarModuleSpecifics.cs | 2 +- .../Tasks/Modules/CommunityModuleSpecifics.cs | 2 +- .../Tasks/Modules/CoreModuleSpecifics.cs | 9 +- .../Tasks/Modules/CrmModuleSpecifics.cs | 2 +- .../Tasks/Modules/FilesModuleSpecifics.cs | 4 +- .../ASC.Data.Backup/Tasks/Modules/Helpers.cs | 2 +- .../Tasks/Modules/IModuleSpecifics.cs | 2 +- .../Tasks/Modules/MailModuleSpecifics.cs | 2 +- .../Tasks/Modules/ModuleProvider.cs | 2 +- .../Tasks/Modules/ModuleSpecificsBase.cs | 2 +- .../Tasks/Modules/ProjectsModuleSpecifics.cs | 2 +- .../Tasks/Modules/TenantsModuleSpecifics.cs | 2 +- .../Tasks/Modules/WebStudioModuleSpecifics.cs | 2 +- .../ASC.Data.Backup/Tasks/PortalTaskBase.cs | 9 +- .../Tasks/RestoreDbModuleTask.cs | 3 +- .../Tasks/RestorePortalTask.cs | 8 +- .../Tasks/TransferPortalTask.cs | 5 +- .../Utils/ConfigurationProvider.cs | 2 +- .../Utils/FCKEditorPathUtility.cs | 34 +- common/ASC.Data.Backup/Utils/PathHelper.cs | 2 +- .../ASC.Data.Encryption.csproj | 2 + common/ASC.Data.Encryption/Crypt.cs | 2 +- .../CryptoStreamWrapper.cs | 34 +- .../IntegrityProtectionException.cs | 34 +- common/ASC.Data.Encryption/Metadata.cs | 34 +- common/ASC.Data.Encryption/StreamWrapper.cs | 34 +- .../ASC.Data.Storage.Encryption.csproj | 4 +- .../EncryptionOperation.cs | 34 +- .../EncryptionService.cs | 34 +- .../EncryptionWorker.cs | 34 +- .../ASC.Data.Storage.Encryption/Launcher.cs | 34 +- .../NotifyHelper.cs | 34 +- .../ASC.Data.Storage.Migration.csproj | 2 + common/ASC.Data.Storage.Migration/Launcher.cs | 34 +- common/ASC.Data.Storage.Migration/Service.cs | 34 +- .../ASC.Data.Storage/ASC.Data.Storage.csproj | 18 +- common/ASC.Data.Storage/BaseStorage.cs | 71 +- .../CommonChunkedUploadSession.cs | 39 +- .../CommonChunkedUploadSessionHolder.cs | 52 +- common/ASC.Data.Storage/Configuration/ACL.cs | 2 +- .../AppenderConfigurationCollection.cs | 2 +- .../AppenderConfigurationElement.cs | 2 +- .../DomainConfigurationCollection.cs | 2 +- .../DomainConfigurationElement.cs | 2 +- .../HandlerConfigurationElement.cs | 2 +- .../HandlersConfigurationCollection.cs | 2 +- .../ModuleConfigurationCollection.cs | 2 +- .../ModuleConfigurationElement.cs | 9 +- .../ASC.Data.Storage/Configuration/Schema.cs | 3 +- .../StorageConfigurationSection.cs | 2 +- .../Configuration/StorageSettings.cs | 39 +- common/ASC.Data.Storage/Constants.cs | 3 +- .../CrossModuleTransferUtility.cs | 2 +- common/ASC.Data.Storage/DataList.cs | 2 +- common/ASC.Data.Storage/DataStoreCache.cs | 2 +- .../DiscStorage/DiscDataHandler.cs | 34 +- .../DiscStorage/DiscDataStore.cs | 61 +- .../DiscStorage/MappedPath.cs | 34 +- .../Encryption/EncryptionFactory.cs | 34 +- .../Encryption/EncryptionServiceClient.cs | 34 +- .../ASC.Data.Storage/Encryption/FakeCrypt.cs | 34 +- .../Encryption/IEncryptionService.cs | 34 +- common/ASC.Data.Storage/Extensions.cs | 2 +- .../GoogleCloud/GoogleCloudStorage.cs | 61 +- common/ASC.Data.Storage/IDataStore.cs | 36 +- common/ASC.Data.Storage/IQuotaController.cs | 8 +- common/ASC.Data.Storage/Migration/IService.cs | 34 +- .../Migration/MigrateServiceClient.cs | 34 +- common/ASC.Data.Storage/PathUtils.cs | 2 +- common/ASC.Data.Storage/ProgressStream.cs | 2 +- .../RackspaceCloud/RackspaceCloudStorage.cs | 67 +- common/ASC.Data.Storage/S3/S3Storage.cs | 296 +- common/ASC.Data.Storage/S3/S3UploadGuard.cs | 2 +- common/ASC.Data.Storage/S3/UnencodedUri.cs | 34 +- common/ASC.Data.Storage/SecureHelper.cs | 31 +- .../Selectel/SelectelStorage.cs | 62 +- common/ASC.Data.Storage/StaticUploader.cs | 34 +- common/ASC.Data.Storage/StorageFactory.cs | 2 +- common/ASC.Data.Storage/StorageHandler.cs | 56 +- common/ASC.Data.Storage/StorageUploader.cs | 2 +- common/ASC.Data.Storage/TenantPath.cs | 2 +- .../ASC.Data.Storage/TenantQuotaController.cs | 77 +- common/ASC.Data.Storage/WebPath.cs | 2 +- common/ASC.Data.Storage/Wildcard.cs | 2 +- .../ZipOperators/ChunkZipWriteOperator.cs | 168 + .../ZipOperators}/IDataOperator.cs | 41 +- .../ZipOperators/IGetterWriteOperator.cs | 26 + .../ZipOperators/S3ZipWriteOperator.cs | 176 + .../ZipOperators}/ZipOperator.cs | 205 +- .../ZipOperators/ZipWriteOperatorFactory.cs | 37 + common/ASC.IPSecurity/ASC.IPSecurity.csproj | 2 + common/ASC.IPSecurity/IPAddressRange.cs | 22 +- common/ASC.IPSecurity/IPRestriction.cs | 15 +- .../IPRestrictionsRepository.cs | 16 +- .../ASC.IPSecurity/IPRestrictionsService.cs | 4 +- common/ASC.IPSecurity/IPSecurity.cs | 52 +- common/ASC.IPSecurity/IPSecurityException.cs | 2 +- .../ASC.Notify.Textile.csproj | 2 + common/ASC.Notify.Textile/JabberStyler.cs | 2 +- common/ASC.Notify.Textile/MarkDownStyler.cs | 34 +- common/ASC.Notify.Textile/PushStyler.cs | 2 +- .../NotifyTemplateResource.Designer.cs | 12 +- .../NotifyTemplateResource.az-Latn-AZ.resx | 94 - .../Resources/NotifyTemplateResource.bg.resx | 60 - .../Resources/NotifyTemplateResource.cs.resx | 30 - .../Resources/NotifyTemplateResource.de.resx | 94 - .../Resources/NotifyTemplateResource.es.resx | 94 - .../Resources/NotifyTemplateResource.fi.resx | 30 - .../Resources/NotifyTemplateResource.fr.resx | 94 - .../Resources/NotifyTemplateResource.it.resx | 94 - .../Resources/NotifyTemplateResource.lv.resx | 60 - .../Resources/NotifyTemplateResource.nl.resx | 30 - .../Resources/NotifyTemplateResource.pl.resx | 30 - .../NotifyTemplateResource.pt-BR.resx | 94 - .../Resources/NotifyTemplateResource.resx | 6 +- .../Resources/NotifyTemplateResource.ru.resx | 94 - .../Resources/NotifyTemplateResource.sk.resx | 30 - .../Resources/NotifyTemplateResource.tr.resx | 30 - .../Resources/NotifyTemplateResource.uk.resx | 30 - .../Resources/NotifyTemplateResource.vi.resx | 30 - .../NotifyTemplateResource.zh-CN.resx | 30 - .../NotifyTemplateResource.zh-TW.resx | 94 - common/ASC.Notify.Textile/Resources/style.css | 2 +- common/ASC.Notify.Textile/TextileStyler.cs | 22 +- common/LoginTests.cs | 34 +- .../ASC.Resource.Data.csproj | 5 +- .../ASC.Resource.Data/JsonManager.cs | 37 +- .../ASC.Resource.Data/Model/Author.cs | 2 +- .../ASC.Resource.Data/Model/ResCulture.cs | 2 +- .../ASC.Resource.Data/Model/ResCurrent.cs | 3 +- .../ASC.Resource.Data/Model/ResFile.cs | 2 +- .../ASC.Resource.Data/Model/ResModule.cs | 2 +- .../ASC.Resource.Data/Model/ResProject.cs | 2 +- .../ASC.Resource.Data/Model/ResWord.cs | 2 +- .../Model/StatisticModule.cs | 2 +- .../ASC.Resource.Data/Model/StatisticUser.cs | 2 +- .../ASC.Resource.Data/Model/WordStatusEnum.cs | 2 +- .../ASC.Resource.Data/ResourceData.cs | 80 +- .../RecurrenceRuleTest.cs | 80 +- .../ASC.Api.Core.Tests/ApiDateTimeTests.cs | 34 +- .../ASC.Api.Core.Tests/FormBinderTests.cs | 34 +- .../Tests/ASC.BenchmarkTest/DbManagerTest.cs | 2 +- common/Tests/ASC.BenchmarkTest/Program.cs | 2 +- .../ASC.Common.Tests/ASC.Common.Tests.csproj | 4 +- .../Tests/ASC.Common.Tests/Data/DataTest.cs | 2 +- common/Tests/ASC.Common.Tests/Data/ExpTest.cs | 8 +- .../Data/MultiRegionalDbTest.cs | 2 +- .../Geolocation/GeolocationTest.cs | 2 +- .../ASC.Common.Tests/Logging/ConvertTest.cs | 2 +- .../Logging/SpecialFolderPathConverterTest.cs | 2 +- .../Notify/XmlPatternProvider2Test.cs | 2 +- .../Security/Authorizing/AzManagerTest.cs | 2 +- .../Security/Authorizing/Class1.cs | 2 +- .../Security/Authorizing/Domain.cs | 2 +- .../Security/Authorizing/DomainStub.cs | 2 +- .../Security/Cryptography/Hasher_Test.cs | 2 +- .../ASC.Common.Tests/Utils/DnsLookupTest.cs | 34 +- .../ASC.Common.Tests/Utils/HtmlUtil_Test.cs | 2 +- .../Utils/MimeHeaderUtilsTest.cs | 2 +- .../ASC.Common.Tests/Web/MimeMappingTest.cs | 2 +- .../Web/ResiliencePoliciesTest.cs | 157 + .../ASC.Core.Common.Tests.csproj | 2 +- .../BillingClientTest.cs | 44 +- .../CachedSubscriptionServiceTest.cs | 2 +- .../ClientPaymentManagerTest.cs | 2 +- .../CookieStorageTest.cs | 2 +- .../ASC.Core.Common.Tests/DbAzServiceTest.cs | 2 +- .../Tests/ASC.Core.Common.Tests/DbBaseTest.cs | 2 +- .../DbQuotaServiceTest.cs | 12 +- .../DbSubscriptionServiceTest.cs | 2 +- .../DbTenantServiceTest.cs | 2 +- .../DbUserServiceTest.cs | 2 +- .../EmailValidationKeyPairProvider_Test.cs | 2 +- .../HostedSolutionTest.cs | 2 +- .../ASC.Core.Common.Tests/SignatureTest.cs | 2 +- .../TariffServiceTest.cs | 16 +- .../TopSubscriptionProviderTest.cs | 2 +- .../ASC.Core.Common.Tests/UserManagerTest.cs | 2 +- .../ASC.Data.Storage.Tests.csproj | 2 +- .../ASC.Data.Storage.Tests/DataStorageTest.cs | 2 +- .../Encryption/CommonFileInfo.cs | 34 +- .../Encryption/CommonMethods.cs | 34 +- .../Encryption/CryptTest.cs | 34 +- .../Encryption/SpeedTest.cs | 2 +- .../ASC.Notify.Textile.Test.csproj | 2 +- .../ASC.Notify.Textile.Test/StylerTests.cs | 34 +- licenses/3rd-Party.license | 10 +- .../Amazon.Extensions.S3.Encryption.license | 201 + licenses/nuget packages/Polly.license | 26 + module/ASC.Api/ASC.Api.CRM/CRMApi.Cases.cs | 160 +- .../ASC.Api/ASC.Api.CRM/CRMApi.ContactInfo.cs | 115 +- module/ASC.Api/ASC.Api.CRM/CRMApi.Contacts.cs | 489 +- .../ASC.Api.CRM/CRMApi.CurrencyRates.cs | 87 +- .../ASC.Api.CRM/CRMApi.CustomFields.cs | 85 +- module/ASC.Api/ASC.Api.CRM/CRMApi.Deals.cs | 250 +- module/ASC.Api/ASC.Api.CRM/CRMApi.Invoices.cs | 363 +- module/ASC.Api/ASC.Api.CRM/CRMApi.ListItem.cs | 292 +- .../ASC.Api.CRM/CRMApi.RelationshipEvent.cs | 129 +- module/ASC.Api/ASC.Api.CRM/CRMApi.Reports.cs | 59 +- module/ASC.Api/ASC.Api.CRM/CRMApi.Tag.cs | 136 +- .../ASC.Api.CRM/CRMApi.TaskTemplate.cs | 78 +- module/ASC.Api/ASC.Api.CRM/CRMApi.Tasks.cs | 134 +- module/ASC.Api/ASC.Api.CRM/CRMApi.Utils.cs | 202 +- module/ASC.Api/ASC.Api.CRM/CRMApi.Voip.cs | 287 +- module/ASC.Api/ASC.Api.CRM/CRMApi.cs | 2 +- module/ASC.Api/ASC.Api.CRM/CRMApiBase.cs | 2 +- module/ASC.Api/ASC.Api.CRM/CRMBootstrap.cs | 2 +- module/ASC.Api/ASC.Api.CRM/CRMCalendar.cs | 2 +- .../ASC.Api.CRM/Wrappers/CasesWrapper.cs | 15 +- .../Wrappers/ContactInfoWrapper.cs | 30 +- .../ASC.Api.CRM/Wrappers/ContactWrapper.cs | 50 +- .../Wrappers/CurrencyInfoWrapper.cs | 10 +- .../Wrappers/CurrencyRateWrapper.cs | 6 +- .../Wrappers/CustomFieldWrapper.cs | 11 +- .../ASC.Api.CRM/Wrappers/InvoiceWrapper.cs | 64 +- .../ASC.Api.CRM/Wrappers/ListItemWrapper.cs | 34 +- .../ASC.Api.CRM/Wrappers/ObjectWrapperBase.cs | 3 +- .../Wrappers/OpportunityWrapper.cs | 25 +- .../Wrappers/RelationshipEventWrapper.cs | 16 +- .../ASC.Api.CRM/Wrappers/ReportWrapper.cs | 2 +- .../ASC.Api/ASC.Api.CRM/Wrappers/Subject.cs | 2 +- .../Wrappers/TaskTemplateContainerWrapper.cs | 2 +- .../ASC.Api.CRM/Wrappers/TaskWrapper.cs | 15 +- .../ASC.Api.CRM/Wrappers/VoipCallWrapper.cs | 26 +- .../ASC.Api/ASC.Api.Calendar/AccessRights.cs | 2 +- .../Attachments/AttachmentEngine.cs | 34 +- .../Attachments/SecurityAdapter.cs | 34 +- .../Attachments/SecurityAdapterProvider.cs | 34 +- .../BusinessObjects/Calendar.cs | 2 +- .../BusinessObjects/ColumnCollection.cs | 2 +- .../BusinessObjects/DataProvider.cs | 1319 +-- .../ASC.Api.Calendar/BusinessObjects/Event.cs | 2 +- .../BusinessObjects/EventHistory.cs | 34 +- .../BusinessObjects/EventNotificationData.cs | 2 +- .../ASC.Api.Calendar/BusinessObjects/Todo.cs | 34 +- .../BusinessObjects/UserViewSettings.cs | 2 +- .../ASC.Api/ASC.Api.Calendar/CalendarApi.cs | 667 +- .../ASC.Api.Calendar/CalendarBootstrap.cs | 34 +- .../BirthdayReminderCalendar.cs | 2 +- .../ExternalCalendars/SharedEventsCalendar.cs | 2 +- .../Notification/CalendarNotifySource.cs | 2 +- .../ASC.Api.Calendar/Wrappers/AccessOption.cs | 10 +- .../Wrappers/CalendarWrapper.cs | 47 +- .../Wrappers/EventAlertWrapper.cs | 3 +- .../Wrappers/EventHistoryWrapper.cs | 65 +- .../ASC.Api.Calendar/Wrappers/EventWrapper.cs | 37 +- .../ASC.Api.Calendar/Wrappers/Permissions.cs | 9 +- .../Wrappers/PublicItemCollection.cs | 8 +- .../Wrappers/PublicItemWrapper.cs | 12 +- .../Wrappers/SubscriptionWrapper.cs | 13 +- .../Wrappers/TimeZoneWrapper.cs | 8 +- .../ASC.Api.Calendar/Wrappers/TodoWrapper.cs | 52 +- .../iCalParser/DDayICalParser.cs | 34 +- .../ASC.Api.Calendar/iCalParser/Emitter.cs | 2 +- .../ASC.Api.Calendar/iCalParser/Parser.cs | 2 +- .../iCalParser/ParserError.cs | 2 +- .../ASC.Api.Calendar/iCalParser/Scanner.cs | 2 +- .../ASC.Api.Calendar/iCalParser/Token.cs | 2 +- .../ASC.Api.Calendar/iCalParser/iCalEvent.cs | 2 +- .../ASC.Api.Calendar/iCalParser/iCalendar.cs | 2 +- .../iCalParser/iCalendarCache.cs | 2 +- .../iCalParser/iCalendarEmitter.cs | 2 +- .../ASC.Api.Client/ASC.Api.Client.csproj | 2 + module/ASC.Api/ASC.Api.Client/ApiClient.cs | 2 +- module/ASC.Api/ASC.Api.Client/ApiRequest.cs | 2 +- module/ASC.Api/ASC.Api.Client/ApiResponse.cs | 2 +- .../ASC.Api/ASC.Api.Client/Configuration.cs | 2 +- module/ASC.Api/ASC.Api.Client/Enums.cs | 2 +- module/ASC.Api/ASC.Api.Client/Exceptions.cs | 2 +- module/ASC.Api/ASC.Api.Client/Extensions.cs | 2 +- module/ASC.Api/ASC.Api.Client/Parameters.cs | 2 +- .../ASC.Api/ASC.Api.Client/ResponseParser.cs | 2 +- .../ASC.Api.Community/Blogs/BlogApi.cs | 133 +- .../Blogs/BlogPostCommentWrapper.cs | 16 +- .../Blogs/BlogPostWrapperFull.cs | 17 +- .../Blogs/BlogPostWrapperSummary.cs | 19 +- .../ASC.Api.Community/Blogs/BlogTagWrapper.cs | 6 +- .../Bookmarks/BookmarkApi.cs | 172 +- .../Bookmarks/BookmarkCommentWrapper.cs | 14 +- .../Bookmarks/BookmarkWrapper.cs | 19 +- .../ASC.Api.Community/Bookmarks/TagWrapper.cs | 6 +- .../Bookmarks/UserBookmarkWrapper.cs | 2 +- .../ASC.Api/ASC.Api.Community/CommunityApi.cs | 4 +- .../ASC.Api.Community/CommunityApiCommon.cs | 41 +- .../ASC.Api.Community/Events/EventApi.cs | 131 +- .../Events/EventCommentWrapper.cs | 14 +- .../ASC.Api.Community/Events/EventWrapper.cs | 14 +- .../Events/EventWrapperFull.cs | 9 +- .../ASC.Api.Community/Events/PollWrapper.cs | 13 +- .../ASC.Api.Community/Events/VoteWrapper.cs | 8 +- .../ASC.Api.Community/Forums/ForumApi.cs | 132 +- .../Forums/ForumCategoryWrapper.cs | 16 +- .../Forums/ForumThreadWrapper.cs | 18 +- .../Forums/ForumThreadWrapperFull.cs | 6 +- .../Forums/ForumTopicPostAttachmentWrapper.cs | 14 +- .../Forums/ForumTopicPostWrapper.cs | 19 +- .../Forums/ForumTopicWrapper.cs | 24 +- .../Forums/ForumTopicWrapperFull.cs | 6 +- .../ASC.Api.Community/Forums/ForumWrapper.cs | 5 +- .../ASC.Api.Community/Wiki/CommentWrapper.cs | 16 +- .../ASC.Api.Community/Wiki/FileWrapper.cs | 11 +- .../ASC.Api.Community/Wiki/PageWrapper.cs | 10 +- .../ASC.Api/ASC.Api.Community/Wiki/WikiApi.cs | 139 +- .../ASC.Api.Documents.csproj | 3 + .../ASC.Api/ASC.Api.Documents/DocumentsApi.cs | 1235 ++- .../ASC.Api.Documents/FileEntryWrapper.cs | 22 +- .../ASC.Api.Documents/FileOperationWraper.cs | 13 +- .../ASC.Api.Documents/FileShareParams.cs | 6 +- .../ASC.Api.Documents/FileShareWrapper.cs | 24 +- .../ASC.Api/ASC.Api.Documents/FileWrapper.cs | 15 +- .../ASC.Api.Documents/FolderContentWrapper.cs | 17 +- .../ASC.Api.Documents/FolderWrapper.cs | 7 +- .../ASC.Api.Documents/PrivacyRoomApi.cs | 26 +- module/ASC.Api/ASC.Api.Feed/FeedApi.cs | 26 +- module/ASC.Api/ASC.Api.Feed/FeedWrapper.cs | 2 +- .../ASC.Api/ASC.Api.Mail/MailApi.Accounts.cs | 215 +- module/ASC.Api/ASC.Api.Mail/MailApi.Alerts.cs | 13 +- .../ASC.Api.Mail/MailApi.Attachments.cs | 52 +- .../ASC.Api/ASC.Api.Mail/MailApi.Autoreply.cs | 54 +- .../ASC.Api/ASC.Api.Mail/MailApi.Contacts.cs | 81 +- .../ASC.Api.Mail/MailApi.Conversations.cs | 187 +- .../ASC.Api/ASC.Api.Mail/MailApi.Filters.cs | 84 +- .../ASC.Api/ASC.Api.Mail/MailApi.Folders.cs | 72 +- .../ASC.Api.Mail/MailApi.HelpCenter.cs | 12 +- module/ASC.Api/ASC.Api.Mail/MailApi.Images.cs | 21 +- .../ASC.Api.Mail/MailApi.MailService.cs | 86 +- .../ASC.Api/ASC.Api.Mail/MailApi.Messages.cs | 329 +- .../ASC.Api/ASC.Api.Mail/MailApi.Settings.cs | 113 +- .../ASC.Api/ASC.Api.Mail/MailApi.Signature.cs | 20 +- module/ASC.Api/ASC.Api.Mail/MailApi.Tags.cs | 61 +- module/ASC.Api/ASC.Api.Mail/MailApi.Tests.cs | 82 +- module/ASC.Api/ASC.Api.Mail/MailApi.cs | 30 +- .../MailServerApi.Account.cs | 2 +- .../MailServerApi.MailGroup.cs | 37 +- .../MailServerApi.Mailbox.cs | 96 +- .../MailServerApi.Notification.cs | 55 +- .../MailServerApi.Server.cs | 16 +- .../MailServerApi.WebDomain.cs | 50 +- .../ASC.Api.MailServer/MailServerApi.cs | 2 +- .../ASC.Api.Migration.csproj | 1 + .../ASC.Api/ASC.Api.Migration/MigrationApi.cs | 170 +- .../ASC.Api.Migration/MigrationStatus.cs | 29 +- .../ASC.Api/ASC.Api.Migration/MigratorInfo.cs | 40 + .../ASC.Api.Migration/OngoingMigration.cs | 31 +- .../ASC.Api.Portal/ASC.Api.Portal.csproj | 1 + module/ASC.Api/ASC.Api.Portal/PortalApi.cs | 661 +- .../Calendars/ProjectCalendar.cs | 2 +- .../ASC.Api.Projects/ProjectApi.Comments.cs | 89 +- .../ASC.Api.Projects/ProjectApi.Messages.cs | 427 +- .../ASC.Api.Projects/ProjectApi.Milestones.cs | 342 +- .../ASC.Api.Projects/ProjectApi.Projects.cs | 1273 +-- .../ASC.Api.Projects/ProjectApi.Reports.cs | 244 +- .../ASC.Api.Projects/ProjectApi.Tags.cs | 83 +- .../ASC.Api.Projects/ProjectApi.Tasks.cs | 822 +- .../ASC.Api.Projects/ProjectApi.TimeSpend.cs | 224 +- module/ASC.Api/ASC.Api.Projects/ProjectApi.cs | 140 +- .../ASC.Api.Projects/ProjectApiBase.cs | 2 +- .../ASC.Api.Projects/ProjectBootstrap.cs | 2 +- .../Wrappers/CommentWrapper.cs | 18 +- .../Wrappers/MessageWrapper.cs | 11 +- .../Wrappers/MessageWrapperFull.cs | 44 +- .../Wrappers/MilestoneWrapper.cs | 16 +- .../Wrappers/ObjectWrapperBase.cs | 14 +- .../Wrappers/ObjectWrapperFullBase.cs | 15 +- .../Wrappers/ParticipantFullWrapper.cs | 2 +- .../Wrappers/ParticipantWrapper.cs | 10 +- .../Wrappers/ProjectWrapper.cs | 7 +- .../Wrappers/ProjectWrapperFull.cs | 28 +- .../Wrappers/ReportTemplateWrapper.cs | 7 +- .../Wrappers/SearchItemWrapper.cs | 12 +- .../Wrappers/SearchWrapper.cs | 6 +- .../Wrappers/SimpleMilestoneWrapper.cs | 8 +- .../Wrappers/SimpleProjectWrapper.cs | 10 +- .../Wrappers/SimpleTaskWrapper.cs | 2 +- .../Wrappers/SubtaskWrapper.cs | 7 +- .../Wrappers/SubtaskWrapperFull.cs | 2 +- .../Wrappers/TaskLinkWrapper.cs | 5 +- .../ASC.Api.Projects/Wrappers/TaskWrapper.cs | 35 +- .../Wrappers/TaskWrapperFull.cs | 47 +- .../ASC.Api.Projects/Wrappers/TimeWrapper.cs | 30 +- module/ASC.Api/ASC.Api.Sample/SampleApi.cs | 94 +- .../ASC.Api.Security/ASC.Api.Security.csproj | 2 + .../ASC.Api.Security/AuditEventWrapper.cs | 2 +- .../ASC.Api.Security/AuditReportCreator.cs | 34 +- .../ASC.Api.Security/LoginEventWrapper.cs | 2 +- module/ASC.Api/ASC.Api.Security/ModelTypes.cs | 19 +- .../ASC.Api/ASC.Api.Security/SecurityApi.cs | 410 +- .../ASC.Api.Settings/ASC.Api.Settings.csproj | 2 + .../ASC.Api/ASC.Api.Settings/BuildVersion.cs | 4 +- .../ASC.Api.Settings/LdapSettingsApi.cs | 87 +- .../ASC.Api.Settings/RadicaleSettingsAPI.cs | 27 +- .../ASC.Api.Settings/SecurityWrapper.cs | 9 +- .../ASC.Api/ASC.Api.Settings/SettingsApi.cs | 885 +- .../ASC.Api.Settings/SettingsWrapper.cs | 10 +- .../ASC.Api.Settings/Smtp/SmtpOperation.cs | 14 +- .../Smtp/SmtpOperationStatus.cs | 40 +- .../Smtp/SmtpSettingsWrapper.cs | 46 +- .../ASC.Api.Settings/SmtpSettingsApi.cs | 60 +- .../ASC.Api.Settings/SsoSettingsV2Api.cs | 58 +- .../ASC.Api.Settings/StatisticsWrapper.cs | 43 +- .../ASC.Api.Settings/StorageWrapper.cs | 9 +- .../ASC.Api.Settings/TenantVersionWrapper.cs | 2 +- .../ASC.Api.Settings/TfaSettingsWrapper.cs | 57 + module/ASC.Api/ASC.Api/ASC.Api.Core.csproj | 3 + module/ASC.Api/ASC.Api/ApiServer.cs | 4 +- module/ASC.Api/ASC.Api/ApiSetup.cs | 4 +- module/ASC.Api/ASC.Api/ApiSetupHttpModule.cs | 2 +- .../ASC.Api/Attributes/ApiAttribute.cs | 2 +- .../ASC.Api/Attributes/ApiCallFilter.cs | 2 +- .../ASC.Api/Attributes/CacheAttribute.cs | 2 +- .../Attributes/NoAutoRegistrationAttribute.cs | 2 +- .../ASC.Api/Batch/ApiBatchHttpHandler.cs | 2 +- .../ASC.Api/ASC.Api/Batch/ApiBatchRequest.cs | 2 +- .../ASC.Api/ASC.Api/Batch/ApiBatchResponse.cs | 2 +- .../ASC.Api/Batch/ApiBatchRouteHandler.cs | 2 +- .../ASC.Api/ASC.Api/Batch/ApiWorkerRequest.cs | 2 +- .../ASC.Api/Collections/CompiledSmartList.cs | 2 +- .../ASC.Api/ASC.Api/Collections/Extensions.cs | 2 +- .../ASC.Api/Collections/ItemDictionary.cs | 2 +- .../ASC.Api/Collections/ItemKeyValuePair.cs | 2 +- .../ASC.Api/ASC.Api/Collections/ItemList.cs | 2 +- .../ASC.Api/ASC.Api/Collections/SmartList.cs | 2 +- .../ASC.Api/Collections/SmartListFactory.cs | 2 +- module/ASC.Api/ASC.Api/Constants.cs | 2 +- module/ASC.Api/ASC.Api/Enums/ApiStatus.cs | 2 +- .../ApiArgumentMismatchException.cs | 2 +- .../Exceptions/ApiBadHttpMethodException.cs | 2 +- .../Exceptions/ApiDuplicateRouteException.cs | 2 +- .../ASC.Api/Exceptions/ItemNotFound.cs | 2 +- module/ASC.Api/ASC.Api/Global.asax.cs | 2 +- .../ASC.Api/Impl/ApiAllowAllAuthorization.cs | 2 +- .../ASC.Api/Impl/ApiArgumentBuilder.cs | 2 +- module/ASC.Api/ASC.Api/Impl/ApiContext.cs | 8 +- module/ASC.Api/ASC.Api/Impl/ApiHttpHandler.cs | 2 +- .../ASC.Api/Impl/ApiHttpHandlerBase.cs | 2 +- .../Impl/ApiKeyValueInMemoryStorage.cs | 2 +- module/ASC.Api/ASC.Api/Impl/ApiManager.cs | 2 +- module/ASC.Api/ASC.Api/Impl/ApiMethodCall.cs | 2 +- .../ASC.Api/Impl/ApiRouteConfigurator.cs | 2 +- .../ASC.Api/ASC.Api/Impl/ApiRouteHandler.cs | 2 +- .../Impl/ApiSmartListResponceFilter.cs | 2 +- .../ASC.Api/Impl/ApiStandartResponce.cs | 2 +- module/ASC.Api/ASC.Api/Impl/ApiStoragePath.cs | 2 +- .../Constraints/ApiHttpMethodConstraint.cs | 2 +- .../Impl/Invokers/ApiSimpleMethodInvoker.cs | 2 +- .../Impl/Responders/ContentResponder.cs | 2 +- .../Impl/Responders/DirectResponder.cs | 2 +- .../ApiAccessControlRouteRegistrator.cs | 2 +- .../Impl/Routing/ApiBatchRouteRegitrator.cs | 2 +- .../Impl/Routing/ApiRouteRegistrator.cs | 2 +- .../Impl/Routing/ApiRouteRegistratorBase.cs | 2 +- .../Impl/Serializers/JsonNetSerializer.cs | 2 +- .../Impl/Serializers/JsonStringConverter.cs | 2 +- .../Serializers/SerializerContractResolver.cs | 2 +- .../Impl/Serializers/SerializerResponder.cs | 2 +- .../ASC.Api/Impl/SimpleApiParamInspector.cs | 2 +- .../ASC.Api/Interfaces/ApiHttpAsyncHandler.cs | 2 +- .../ASC.Api/Interfaces/IApiArgumentBuilder.cs | 2 +- .../ASC.Api/Interfaces/IApiAuthorization.cs | 2 +- .../ASC.Api/Interfaces/IApiBootstrapper.cs | 2 +- .../ASC.Api/Interfaces/IApiConfiguration.cs | 2 +- .../ASC.Api/Interfaces/IApiDateTime.cs | 2 +- .../ASC.Api/Interfaces/IApiEntryPoint.cs | 2 +- .../ASC.Api/ASC.Api/Interfaces/IApiManager.cs | 2 +- .../ASC.Api/Interfaces/IApiMethodCall.cs | 2 +- .../ASC.Api/Interfaces/IApiMethodInvoker.cs | 2 +- .../ASC.Api/Interfaces/IApiParamInspector.cs | 2 +- .../ASC.Api/Interfaces/IApiResponceFilter.cs | 2 +- .../ASC.Api/Interfaces/IApiResponder.cs | 2 +- .../Interfaces/IApiRouteConfigurator.cs | 2 +- .../ASC.Api/Interfaces/IApiRouteHandler.cs | 2 +- .../Interfaces/IApiRouteRegistrator.cs | 2 +- .../ASC.Api/Interfaces/IApiSerializer.cs | 2 +- .../Interfaces/IApiStandartResponce.cs | 2 +- .../ASC.Api/Interfaces/IApiStoragePath.cs | 2 +- .../ResponseTypes/IApiContentResponce.cs | 2 +- .../ResponseTypes/IApiDirectResponce.cs | 2 +- .../Interfaces/Storage/IApiKeyValueStorage.cs | 2 +- .../ASC.Api/ASC.Api/Routing/RouteCallInfo.cs | 2 +- module/ASC.Api/ASC.Api/Routing/UrlPath.cs | 2 +- module/ASC.Api/ASC.Api/Utils/Binder.cs | 2 +- module/ASC.Api/ASC.Api/Utils/ConvertUtils.cs | 2 +- .../ASC.Api/ASC.Api/Utils/ErrorHttpHandler.cs | 2 +- module/ASC.Api/ASC.Api/Utils/HttpUtils.cs | 2 +- module/ASC.Api/ASC.Api/Utils/PathUtils.cs | 2 +- .../ASC.Api/Utils/StringIgnoreCaseComparer.cs | 2 +- module/ASC.Api/ASC.Api/Utils/StringUtils.cs | 2 +- module/ASC.Api/ASC.Api/Utils/Update.cs | 2 +- module/ASC.Api/ASC.Api/Utils/Validate.cs | 2 +- module/ASC.Api/ASC.Employee/Contact.cs | 6 +- module/ASC.Api/ASC.Employee/EmployeeApi.cs | 576 +- module/ASC.Api/ASC.Employee/EmployeeWraper.cs | 26 +- .../ASC.Employee/EmployeeWraperFull.cs | 138 +- .../ASC.Api/ASC.Employee/GroupWrapperFull.cs | 18 +- .../ASC.Employee/GroupWrapperSummary.cs | 9 +- module/ASC.Api/ASC.Employee/GroupsApi.cs | 114 +- .../ASC.Employee/ThumbnailsDataWrapper.cs | 41 +- .../ASC.Api/ASC.Specific/ASC.Specific.csproj | 1 + .../ASC.Specific/ASCBasicAuthorization.cs | 2 +- .../ASC.Specific/ASCBearerAuthorization.cs | 34 +- .../ASC.Specific/ASCCookieAuthorization.cs | 2 +- .../ASC.Specific/AntiXssParamInspector.cs | 2 +- module/ASC.Api/ASC.Specific/ApiDateTime.cs | 2 +- .../ASC.Specific/AscApiConfiguration.cs | 2 +- .../AuthenticationEntryPoint.cs | 137 +- .../AuthenticationTokenData.cs | 14 +- .../CapabilitiesApi/CapabilitiesData.cs | 11 +- .../CapabilitiesApi/CapabilitiesEntryPoint.cs | 12 +- .../GlobalFilters/ProductSecurityFilter.cs | 2 +- .../ASC.Api/ASC.Specific/IApiSortableDate.cs | 2 +- .../SerializationFilters/CustomSerializer.cs | 2 +- .../WarmupApi/WarmUpEntryPoint.cs | 24 +- module/ASC.AuditTrail/ASC.AuditTrail.csproj | 2 + module/ASC.AuditTrail/AuditEvent.cs | 34 +- .../ASC.AuditTrail/AuditEventsRepository.cs | 8 +- .../AuditReportResource.Designer.cs | 18 + .../ASC.AuditTrail/AuditReportResource.resx | 6 + module/ASC.AuditTrail/LoginEvent.cs | 34 +- .../ASC.AuditTrail/LoginEventsRepository.cs | 6 +- .../Mappers/AuditActionMapper.cs | 2 +- .../ASC.AuditTrail/Mappers/CrmActionMapper.cs | 2 +- .../Mappers/DocumentsActionMapper.cs | 2 +- .../Mappers/IModuleActionMapper.cs | 19 +- .../Mappers/IProductActionMapper.cs | 19 +- .../Mappers/LoginActionMapper.cs | 2 +- module/ASC.AuditTrail/Mappers/MessageMaps.cs | 2 +- .../Mappers/OthersActionMapper.cs | 6 +- .../Mappers/PeopleActionMapper.cs | 2 +- .../Mappers/ProjectsActionMapper.cs | 2 +- .../Mappers/SettingsActionMapper.cs | 2 +- module/ASC.AuditTrail/Types/ActionType.cs | 19 +- module/ASC.AuditTrail/Types/EntryType.cs | 19 +- module/ASC.AuditTrail/Types/ModuleType.cs | 19 +- module/ASC.AuditTrail/Types/ProductType.cs | 19 +- module/ASC.CdnCheck/400.js | 2 +- module/ASC.CdnCheck/403.js | 2 +- module/ASC.CdnCheck/404.js | 2 +- module/ASC.CdnCheck/500.js | 2 +- module/ASC.CdnCheck/501.js | 2 +- module/ASC.CdnCheck/502.js | 2 +- module/ASC.CdnCheck/503.js | 2 +- module/ASC.CdnCheck/504.js | 2 +- module/ASC.CdnCheck/App_Start/FilterConfig.cs | 2 +- module/ASC.CdnCheck/App_Start/RouteConfig.cs | 2 +- module/ASC.CdnCheck/App_Start/WebApiConfig.cs | 2 +- .../ASC.CdnCheck/Controllers/CdnController.cs | 2 +- module/ASC.CdnCheck/CorsHandler.cs | 2 +- module/ASC.CdnCheck/Global.asax.cs | 2 +- .../ASC.Data.Reassigns.csproj | 2 + module/ASC.Data.Reassigns/ProgressStatus.cs | 34 +- module/ASC.Data.Reassigns/QueueWorker.cs | 34 +- .../ReassignProgressItem.cs | 47 +- .../ASC.Data.Reassigns/RemoveProgressItem.cs | 50 +- .../ASC.ElasticSearch.csproj | 6 + .../Attributes/ColumnAttribute.cs | 2 +- .../Attributes/JoinAttribute.cs | 34 +- .../Config/ElasticSection.cs | 2 +- module/ASC.ElasticSearch/Core/Document.cs | 34 +- .../ASC.ElasticSearch/Core/SearchSettings.cs | 2 +- module/ASC.ElasticSearch/Core/Selector.cs | 2 +- module/ASC.ElasticSearch/Core/State.cs | 2 +- module/ASC.ElasticSearch/Core/Wrapper.cs | 2 +- .../ASC.ElasticSearch/Core/WrapperWithDoc.cs | 2 +- .../ASC.ElasticSearch/Engine/BaseIndexer.cs | 14 +- module/ASC.ElasticSearch/Engine/Client.cs | 2 +- .../Engine/FactoryIndexer.cs | 2 +- module/ASC.ElasticSearch/Engine/IIndexer.cs | 2 +- module/ASC.ElasticSearch/Service/IService.cs | 2 +- module/ASC.ElasticSearch/Service/Launcher.cs | 2 +- module/ASC.ElasticSearch/Service/Service.cs | 2 +- .../Service/ServiceClient.cs | 2 +- module/ASC.ElasticSearch/Service/Settings.cs | 2 +- .../ASC.Feed.Aggregator.csproj | 5 + .../Config/FeedConfigurationSection.cs | 7 +- .../FeedAggregatorLauncher.cs | 2 +- .../FeedAggregatorService.cs | 8 +- .../ASC.Feed.Aggregator/HealthCheckService.cs | 2 +- module/ASC.Feed.Aggregator/Helper.cs | 2 +- .../Modules/CRM/CasesModule.cs | 4 +- .../Modules/CRM/ContactsModule.cs | 4 +- .../Modules/CRM/CrmTasksModule.cs | 4 +- .../Modules/CRM/DealsModule.cs | 4 +- .../Modules/Community/BlogsModule.cs | 6 +- .../Modules/Community/BookmarksModule.cs | 6 +- .../Modules/Community/EventsModule.cs | 6 +- .../Modules/Community/ForumPostsModule.cs | 4 +- .../Modules/Community/ForumTopicsModule.cs | 4 +- .../Modules/Documents/DocumentsDbHelper.cs | 2 +- .../Modules/Documents/FilesModule.cs | 6 +- .../Modules/Documents/FoldersModule.cs | 6 +- .../ASC.Feed.Aggregator/Modules/FeedModule.cs | 4 +- .../Modules/IFeedModule.cs | 2 +- .../Modules/ModulesHelper.cs | 2 +- .../Modules/People/BirthdaysModule.cs | 36 +- .../Modules/People/NewEmployeeModule.cs | 36 +- .../Modules/Projects/DiscussionsModule.cs | 6 +- .../Modules/Projects/MilestonesModule.cs | 4 +- .../Modules/Projects/ParticipantsModule.cs | 4 +- .../Modules/Projects/ProjectsModule.cs | 4 +- .../Modules/Projects/TasksModule.cs | 6 +- module/ASC.Feed/ASC.Feed.csproj | 5 + module/ASC.Feed/Constants.cs | 23 +- .../Data/FeedAggregateDataProvider.cs | 69 +- .../ASC.Feed/Data/FeedReadedDataProvider.cs | 4 +- module/ASC.Feed/Data/FeedRow.cs | 5 +- module/ASC.Feed/Feed.cs | 6 +- module/ASC.Feed/FeedAction.cs | 2 +- module/ASC.Feed/FeedApiFilter.cs | 2 +- module/ASC.Feed/FeedComment.cs | 2 +- module/ASC.Feed/FeedFilter.cs | 2 +- module/ASC.Feed/FeedMin.cs | 2 +- module/ASC.Feed/FeedModule.cs | 2 +- module/ASC.Feed/IFeedProvider.cs | 2 +- module/ASC.Feed/TimeInterval.cs | 2 +- module/ASC.Files.AutoCleanUp/ConfigSection.cs | 40 +- module/ASC.Files.AutoCleanUp/Launcher.cs | 34 +- .../TenantUserSettings.cs | 34 +- module/ASC.Files.AutoCleanUp/Worker.cs | 133 +- .../ASC.Files.Thirdparty.csproj | 2 + module/ASC.Files.Thirdparty/Box/BoxDaoBase.cs | 38 +- .../Box/BoxDaoSelector.cs | 34 +- module/ASC.Files.Thirdparty/Box/BoxFileDao.cs | 27 +- .../ASC.Files.Thirdparty/Box/BoxFolderDao.cs | 9 +- .../Box/BoxProviderInfo.cs | 34 +- .../Box/BoxSecurityDao.cs | 36 +- module/ASC.Files.Thirdparty/Box/BoxStorage.cs | 2 +- module/ASC.Files.Thirdparty/Box/BoxTagDao.cs | 2 +- .../CachedProviderAccountDao.cs | 34 +- module/ASC.Files.Thirdparty/DbDaoSelector.cs | 2 +- .../Dropbox/DropboxDaoBase.cs | 38 +- .../Dropbox/DropboxDaoSelector.cs | 34 +- .../Dropbox/DropboxFileDao.cs | 22 +- .../Dropbox/DropboxFolderDao.cs | 12 +- .../Dropbox/DropboxProviderInfo.cs | 2 +- .../Dropbox/DropboxSecurityDao.cs | 36 +- .../Dropbox/DropboxStorage.cs | 2 +- .../Dropbox/DropboxTagDao.cs | 2 +- .../GoogleDrive/GoogleDriveDaoBase.cs | 6 +- .../GoogleDrive/GoogleDriveDaoSelector.cs | 2 +- .../GoogleDrive/GoogleDriveFileDao.cs | 31 +- .../GoogleDrive/GoogleDriveFolderDao.cs | 12 +- .../GoogleDrive/GoogleDriveProviderInfo.cs | 2 +- .../GoogleDrive/GoogleDriveSecurityDao.cs | 4 +- .../GoogleDrive/GoogleDriveStorage.cs | 26 +- .../GoogleDrive/GoogleDriveTagDao.cs | 2 +- module/ASC.Files.Thirdparty/IDaoSelector.cs | 2 +- .../OneDrive/OneDriveDaoBase.cs | 6 +- .../OneDrive/OneDriveDaoSelector.cs | 34 +- .../OneDrive/OneDriveFileDao.cs | 29 +- .../OneDrive/OneDriveFolderDao.cs | 12 +- .../OneDrive/OneDriveProviderInfo.cs | 34 +- .../OneDrive/OneDriveSecurityDao.cs | 36 +- .../OneDrive/OneDriveStorage.cs | 8 +- .../OneDrive/OneDriveTagDao.cs | 2 +- .../ProviderAccountDao.cs | 4 +- .../ProviderDao/ProviderDaoBase.cs | 245 +- .../ProviderDao/ProviderDaoFactory.cs | 2 +- .../ProviderDao/ProviderFileDao.cs | 25 +- .../ProviderDao/ProviderFolderDao.cs | 23 +- .../ProviderDao/ProviderSecutiryDao.cs | 27 +- .../ProviderDao/ProviderTagDao.cs | 7 +- .../RegexDaoSelectorBase.cs | 2 +- .../SharePoint/SharePointDaoBase.cs | 6 +- .../SharePoint/SharePointDaoSelector.cs | 2 +- .../SharePoint/SharePointErrorEntry.cs | 2 +- .../SharePoint/SharePointFileDao.cs | 17 +- .../SharePoint/SharePointFolderDao.cs | 14 +- .../SharePoint/SharePointProviderInfo.cs | 4 +- .../SharePoint/SharePointSecurityDao.cs | 4 +- .../SharePoint/SharePointTagDao.cs | 4 +- .../Sharpbox/SharpBoxDaoBase.cs | 4 +- .../Sharpbox/SharpBoxDaoSelector.cs | 2 +- .../Sharpbox/SharpBoxFileDao.cs | 22 +- .../Sharpbox/SharpBoxFolderDao.cs | 12 +- .../Sharpbox/SharpBoxProviderInfo.cs | 2 +- .../Sharpbox/SharpBoxSecurityDao.cs | 4 +- .../Sharpbox/SharpBoxTagDao.cs | 2 +- module/ASC.Files.ThumbnailBuilder/Builder.cs | 34 +- .../ConfigSection.cs | 34 +- module/ASC.Files.ThumbnailBuilder/FileData.cs | 34 +- .../FileDataProvider.cs | 38 +- module/ASC.Files.ThumbnailBuilder/Launcher.cs | 34 +- module/ASC.Files.ThumbnailBuilder/Service.cs | 34 +- module/ASC.Files.ThumbnailBuilder/Worker.cs | 34 +- .../Classes/DriveSpaceChecker.cs | 34 +- .../Classes/HealthCheckRunner.cs | 34 +- .../Classes/HealthCheckServiceManager.cs | 34 +- .../Classes/IDriveSpaceChecker.cs | 34 +- .../ASC.HealthCheck/Classes/ILogHelper.cs | 34 +- .../ASC.HealthCheck/Classes/ISmsSender.cs | 34 +- .../ASC.HealthCheck/Classes/LogHelper.cs | 34 +- .../ASC.HealthCheck/Classes/ResultHelper.cs | 34 +- .../ASC.HealthCheck/Classes/ShellExe.cs | 34 +- .../ASC.HealthCheck/Classes/SmsSender.cs | 34 +- .../Controllers/CheckServiceApiController.cs | 34 +- .../Controllers/ClearCacheApiController.cs | 34 +- .../Controllers/DefaultApiController.cs | 34 +- .../Controllers/DownloadLogsApiController.cs | 34 +- .../Controllers/DriveSpaceApiController.cs | 34 +- .../Controllers/NotifiersApiController.cs | 34 +- .../Controllers/PortsCheckApiController.cs | 34 +- .../StartStopServiceApiController.cs | 34 +- ...AddAccessControlAllowOriginHeaderFilter.cs | 34 +- .../HealthCheckAuthorizationFilter.cs | 34 +- .../Infrastructure/HealthCheckLauncher.cs | 34 +- .../ASC.HealthCheck/Infrastructure/Startup.cs | 2 +- .../Infrastructure/WarmingUpper.cs | 34 +- .../Models/IServiceRepository.cs | 34 +- .../ASC.HealthCheck/Models/Port.cs | 34 +- .../ASC.HealthCheck/Models/PortStatus.cs | 34 +- .../ASC.HealthCheck/Models/Service.cs | 34 +- .../ASC.HealthCheck/Models/ServiceEnum.cs | 34 +- .../Models/ServiceRepository.cs | 34 +- .../ASC.HealthCheck/Models/ServiceStatus.cs | 34 +- .../Models/XplatServiceController.cs | 34 +- .../Settings/HealthCheckCfgSectionHandler.cs | 34 +- .../Settings/HealthCheckSettings.cs | 34 +- .../Settings/HealthCheckSettingsAccessor.cs | 34 +- .../CheckServiceApiControllerUnitTest.cs | 34 +- .../ClearCacheApiControllerUnitTest.cs | 34 +- .../DownloadLogsApiControllerUnitTest.cs | 34 +- .../DriveSpaceApiControllerUnitTest.cs | 34 +- .../NotifiersApiControllerUnitTest.cs | 34 +- .../PortsCheckApiControllerUnitTest.cs | 34 +- .../ServiceRepositoryUnitTest.cs | 34 +- .../ASC.Mail.Server/ASC.Mail.Server.csproj | 2 + .../ASC.Mail.Server/Core/Dao/AliasDao.cs | 34 +- .../ASC.Mail.Server/Core/Dao/BaseDao.cs | 34 +- .../ASC.Mail.Server/Core/Dao/DkimDao.cs | 34 +- .../ASC.Mail.Server/Core/Dao/DomainDao.cs | 34 +- .../Core/Dao/Interfaces/IAliasDao.cs | 34 +- .../Core/Dao/Interfaces/IDkimDao.cs | 34 +- .../Core/Dao/Interfaces/IDomainDao.cs | 34 +- .../Core/Dao/Interfaces/IMailboxDao.cs | 34 +- .../ASC.Mail.Server/Core/Dao/MailboxDao.cs | 34 +- .../Core/DbSchema/Interfaces/ITable.cs | 34 +- .../Core/DbSchema/Interfaces/ITableFactory.cs | 34 +- .../Core/DbSchema/MailServerTableFactory.cs | 34 +- .../Core/DbSchema/Tables/AliasTable.cs | 34 +- .../Core/DbSchema/Tables/DkimTable.cs | 34 +- .../Core/DbSchema/Tables/DomainTable.cs | 34 +- .../Core/DbSchema/Tables/MailboxTable.cs | 34 +- .../ASC.Mail.Server/Core/Entities/Alias.cs | 34 +- .../ASC.Mail.Server/Core/Entities/Dkim.cs | 34 +- .../ASC.Mail.Server/Core/Entities/Domain.cs | 34 +- .../ASC.Mail.Server/Core/Entities/Mailbox.cs | 34 +- .../Core/Entities/ServerApi.cs | 34 +- .../ASC.Mail.Server/Core/ServerEngine.cs | 50 +- ...InvalidPostfixConnectionStringException.cs | 34 +- .../Exceptions/PostfixEncryptorException.cs | 34 +- .../Extensions/StringExtensions.cs | 34 +- .../ASC.Mail.Server/Utils/MD5Crypt.cs | 34 +- .../Utils/PasswordGenerator.cs | 34 +- .../Utils/PostfixConnectionStringParser.cs | 34 +- .../Utils/PostfixMaildirUtil.cs | 34 +- .../Utils/PostfixPasswordEncryptor.cs | 34 +- module/ASC.Mail/ASC.Mail/ASC.Mail.csproj | 4 +- .../Authorization/AuthorizationServiceType.cs | 34 +- .../Authorization/BaseOAuth2Authorization.cs | 34 +- .../GoogleOAuth2Authorization.cs | 34 +- .../ASC.Mail/Clients/DsnSmtpClient.cs | 34 +- .../ASC.Mail/ASC.Mail/Clients/LoginResult.cs | 34 +- .../ASC.Mail/ASC.Mail/Clients/MailClient.cs | 73 +- .../ASC.Mail/Clients/MailClientEventArgs.cs | 34 +- .../ASC.Mail/ASC.Mail/Core/Dao/AccountDao.cs | 34 +- module/ASC.Mail/ASC.Mail/Core/Dao/AlertDao.cs | 34 +- .../ASC.Mail/Core/Dao/AttachmentDao.cs | 34 +- module/ASC.Mail/ASC.Mail/Core/Dao/BaseDao.cs | 34 +- module/ASC.Mail/ASC.Mail/Core/Dao/ChainDao.cs | 34 +- .../ASC.Mail/Core/Dao/ContactCardDao.cs | 34 +- .../ASC.Mail/ASC.Mail/Core/Dao/ContactDao.cs | 34 +- .../ASC.Mail/Core/Dao/ContactInfoDao.cs | 34 +- .../ASC.Mail/Core/Dao/CrmContactDao.cs | 34 +- .../ASC.Mail/ASC.Mail/Core/Dao/CrmLinkDao.cs | 34 +- .../Core/Dao/DisplayImagesAddressDao.cs | 34 +- .../ConcreteContentAttachmentExp.cs | 34 +- .../ConcreteMailboxAttachmentsExp.cs | 34 +- .../ConcreteMessageAttachmentsExp.cs | 34 +- .../ConcreteMessagesAttachmentsExp.cs | 34 +- .../Attachment/ConcreteTenantAttachmentExp.cs | 34 +- .../Attachment/ConcreteUserAttachmentExp.cs | 34 +- .../Expressions/Attachment/IAttachmentExp.cs | 34 +- .../Expressions/Attachment/IAttachmentsExp.cs | 34 +- .../Attachment/SimpleAttachmentExp.cs | 34 +- .../Attachment/SimpleAttachmentsExp.cs | 34 +- .../Attachment/TenantAttachmentExp.cs | 34 +- .../Attachment/TenantAttachmentsExp.cs | 34 +- .../Attachment/UserAttachmentExp.cs | 34 +- .../Attachment/UserAttachmentsExp.cs | 34 +- .../Contact/FullFilterContactsExp.cs | 34 +- .../Dao/Expressions/Contact/IContactsExp.cs | 34 +- .../Contact/SimpleFilterContactsExp.cs | 34 +- .../Conversation/ConversationsExpBuilder.cs | 34 +- .../Conversation/IConversationsExp.cs | 34 +- .../Conversation/SimpleConversationsExp.cs | 34 +- .../Mailbox/ConcreteSimpleMailboxExp.cs | 34 +- .../Mailbox/ConcreteSimpleNextMailboxExp.cs | 34 +- .../Mailbox/ConcreteTenantMailboxExp.cs | 34 +- .../Mailbox/ConcreteTenantNextMailboxExp.cs | 34 +- .../Mailbox/ConcreteTenantServerMailboxExp.cs | 34 +- .../Mailbox/ConcreteUserMailboxExp.cs | 34 +- .../Mailbox/ConcreteUserNextMailboxExp.cs | 34 +- .../Mailbox/ConcreteUserServerMailboxExp.cs | 34 +- .../Dao/Expressions/Mailbox/IMailboxExp.cs | 34 +- .../Dao/Expressions/Mailbox/IMailboxesExp.cs | 34 +- .../Mailbox/MailboxesForProcessingExp.cs | 34 +- .../Expressions/Mailbox/SimpleMailboxExp.cs | 34 +- .../Expressions/Mailbox/SimpleMailboxesExp.cs | 34 +- .../Expressions/Mailbox/TenantMailboxExp.cs | 34 +- .../Expressions/Mailbox/TenantMailboxesExp.cs | 34 +- .../Mailbox/TenantServerMailboxesExp.cs | 34 +- .../Dao/Expressions/Mailbox/UserMailboxExp.cs | 34 +- .../Expressions/Mailbox/UserMailboxesExp.cs | 34 +- .../Message/ConcreteNextUserMessageExp.cs | 34 +- .../Message/ConcreteUserMessageExp.cs | 34 +- .../Message/FilterChainMessagesExp.cs | 34 +- .../Expressions/Message/FilterMessagesExp.cs | 34 +- .../Message/FilterNextMessageExp.cs | 34 +- .../Message/FilterSieveMessagesExp.cs | 34 +- .../Dao/Expressions/Message/IMessageExp.cs | 34 +- .../Dao/Expressions/Message/IMessagesExp.cs | 34 +- .../Expressions/Message/MessagesExpBuilder.cs | 34 +- .../Expressions/Message/SimpleMessageExp.cs | 34 +- .../Expressions/Message/SimpleMessagesExp.cs | 34 +- .../Expressions/Message/TenantMessageExp.cs | 34 +- .../Dao/Expressions/Message/UserMessageExp.cs | 34 +- .../Expressions/UserFolder/IUserFoldersExp.cs | 34 +- .../UserFolder/IUserFoldersTreeExp.cs | 34 +- .../UserFolder/SimpleUserFoldersExp.cs | 34 +- .../UserFolder/SimpleUserFoldersTreeExp.cs | 34 +- .../UserFolder/UserFoldersExpBuilder.cs | 34 +- .../UserFolder/UserFoldersTreeExpBuilder.cs | 34 +- .../ASC.Mail/ASC.Mail/Core/Dao/FilterDao.cs | 34 +- .../ASC.Mail/ASC.Mail/Core/Dao/FolderDao.cs | 34 +- .../ASC.Mail/Core/Dao/ImapFlagsDao.cs | 34 +- .../Core/Dao/ImapSpecialMailboxDao.cs | 34 +- .../Core/Dao/Interfaces/IAccountDao.cs | 34 +- .../ASC.Mail/Core/Dao/Interfaces/IAlertDao.cs | 34 +- .../Core/Dao/Interfaces/IAttachmentDao.cs | 34 +- .../ASC.Mail/Core/Dao/Interfaces/IChainDao.cs | 34 +- .../Core/Dao/Interfaces/IContactCardDao.cs | 34 +- .../Core/Dao/Interfaces/IContactDao.cs | 34 +- .../Core/Dao/Interfaces/IContactInfoDao.cs | 34 +- .../Core/Dao/Interfaces/ICrmContactDao.cs | 34 +- .../Core/Dao/Interfaces/ICrmLinkDao.cs | 34 +- .../Core/Dao/Interfaces/IDaoFactory.cs | 34 +- .../Interfaces/IDisplayImagesAddressDao.cs | 34 +- .../Core/Dao/Interfaces/IFilterDao.cs | 34 +- .../Core/Dao/Interfaces/IFolderDao.cs | 34 +- .../Core/Dao/Interfaces/IImapFlagsDao.cs | 34 +- .../Dao/Interfaces/IImapSpecialMailboxDao.cs | 34 +- .../ASC.Mail/Core/Dao/Interfaces/IMailDao.cs | 34 +- .../Core/Dao/Interfaces/IMailInfoDao.cs | 34 +- .../Dao/Interfaces/IMailboxAutoreplyDao.cs | 34 +- .../Interfaces/IMailboxAutoreplyHistoryDao.cs | 34 +- .../Core/Dao/Interfaces/IMailboxDao.cs | 34 +- .../Core/Dao/Interfaces/IMailboxDomainDao.cs | 34 +- .../Dao/Interfaces/IMailboxProviderDao.cs | 34 +- .../Core/Dao/Interfaces/IMailboxServerDao.cs | 34 +- .../Dao/Interfaces/IMailboxSignatureDao.cs | 34 +- .../Core/Dao/Interfaces/IServerAddressDao.cs | 34 +- .../Core/Dao/Interfaces/IServerDao.cs | 34 +- .../Core/Dao/Interfaces/IServerDnsDao.cs | 34 +- .../Core/Dao/Interfaces/IServerDomainDao.cs | 34 +- .../Core/Dao/Interfaces/IServerGroupDao.cs | 34 +- .../Core/Dao/Interfaces/ITagAddressDao.cs | 34 +- .../ASC.Mail/Core/Dao/Interfaces/ITagDao.cs | 34 +- .../Core/Dao/Interfaces/ITagMailDao.cs | 34 +- .../Core/Dao/Interfaces/IUserFolderDao.cs | 34 +- .../Core/Dao/Interfaces/IUserFolderTreeDao.cs | 34 +- .../Dao/Interfaces/IUserFolderXMailDao.cs | 34 +- module/ASC.Mail/ASC.Mail/Core/Dao/MailDao.cs | 34 +- .../ASC.Mail/Core/Dao/MailGarbageDao.cs | 36 +- .../ASC.Mail/ASC.Mail/Core/Dao/MailInfoDao.cs | 34 +- .../ASC.Mail/Core/Dao/MailboxAutoreplyDao.cs | 34 +- .../Core/Dao/MailboxAutoreplyHistoryDao.cs | 34 +- .../ASC.Mail/ASC.Mail/Core/Dao/MailboxDao.cs | 34 +- .../ASC.Mail/Core/Dao/MailboxDomainDao.cs | 34 +- .../ASC.Mail/Core/Dao/MailboxProviderDao.cs | 34 +- .../ASC.Mail/Core/Dao/MailboxServerDao.cs | 34 +- .../ASC.Mail/Core/Dao/MailboxSignatureDao.cs | 34 +- .../ASC.Mail/Core/Dao/ServerAddressDao.cs | 34 +- .../ASC.Mail/ASC.Mail/Core/Dao/ServerDao.cs | 34 +- .../ASC.Mail/Core/Dao/ServerDnsDao.cs | 34 +- .../ASC.Mail/Core/Dao/ServerDomainDao.cs | 34 +- .../ASC.Mail/Core/Dao/ServerGroupDao.cs | 34 +- .../ASC.Mail/Core/Dao/TagAddressDao.cs | 34 +- module/ASC.Mail/ASC.Mail/Core/Dao/TagDao.cs | 34 +- .../ASC.Mail/ASC.Mail/Core/Dao/TagMailDao.cs | 34 +- .../ASC.Mail/Core/Dao/UserFolderDao.cs | 34 +- .../ASC.Mail/Core/Dao/UserFolderTreeDao.cs | 34 +- .../ASC.Mail/Core/Dao/UserFolderXMailDao.cs | 34 +- module/ASC.Mail/ASC.Mail/Core/DaoFactory.cs | 36 +- .../Core/DbSchema/Interfaces/ITable.cs | 34 +- .../Core/DbSchema/Interfaces/ITableFactory.cs | 34 +- .../Core/DbSchema/MailTableFactory.cs | 34 +- .../Core/DbSchema/Tables/AlertsTable.cs | 34 +- .../Core/DbSchema/Tables/AttachmentTable.cs | 34 +- .../Core/DbSchema/Tables/ChainTable.cs | 34 +- .../Tables/ChainXCrmContactEntityTable.cs | 34 +- .../Core/DbSchema/Tables/ContactInfoTable.cs | 34 +- .../Core/DbSchema/Tables/ContactsTable.cs | 34 +- .../DbSchema/Tables/CrmContactInfoTable.cs | 34 +- .../Core/DbSchema/Tables/CrmContactTable.cs | 34 +- .../Core/DbSchema/Tables/CrmEntityTagTable.cs | 34 +- .../Core/DbSchema/Tables/CrmTagTable.cs | 34 +- .../DbSchema/Tables/DisplayImagesTable.cs | 34 +- .../Core/DbSchema/Tables/FilterTable.cs | 34 +- .../DbSchema/Tables/FolderCountersTable.cs | 34 +- .../Core/DbSchema/Tables/GarbageTable.cs | 34 +- .../Core/DbSchema/Tables/ImapFlagsTable.cs | 34 +- .../Tables/ImapSpecialMailboxTable.cs | 34 +- .../Core/DbSchema/Tables/MailTable.cs | 34 +- .../Tables/MailboxAutoreplyHistoryTable.cs | 34 +- .../DbSchema/Tables/MailboxAutoreplyTable.cs | 34 +- .../DbSchema/Tables/MailboxDomainTable.cs | 34 +- .../DbSchema/Tables/MailboxProviderTable.cs | 34 +- .../DbSchema/Tables/MailboxServerTable.cs | 34 +- .../DbSchema/Tables/MailboxSignatureTable.cs | 34 +- .../Core/DbSchema/Tables/MailboxTable.cs | 34 +- .../DbSchema/Tables/ServerAddressTable.cs | 34 +- .../Core/DbSchema/Tables/ServerDnsTable.cs | 34 +- .../Core/DbSchema/Tables/ServerDomainTable.cs | 34 +- .../DbSchema/Tables/ServerMailGroupTable.cs | 34 +- .../Tables/ServerMailGroupXAddressesTable.cs | 34 +- .../Core/DbSchema/Tables/ServerTable.cs | 34 +- .../Core/DbSchema/Tables/ServerTypeTable.cs | 34 +- .../DbSchema/Tables/ServerXTenantTable.cs | 34 +- .../Core/DbSchema/Tables/TagAddressTable.cs | 34 +- .../Core/DbSchema/Tables/TagMailTable.cs | 34 +- .../ASC.Mail/Core/DbSchema/Tables/TagTable.cs | 34 +- .../DbSchema/Tables/TenantXServerTable.cs | 34 +- .../Core/DbSchema/Tables/UserFolderTable.cs | 34 +- .../DbSchema/Tables/UserFolderTreeTable.cs | 34 +- .../DbSchema/Tables/UserFoldertXMailTable.cs | 34 +- .../ASC.Mail/Core/Engine/AccountEngine.cs | 34 +- .../ASC.Mail/Core/Engine/AlertEngine.cs | 34 +- .../ASC.Mail/Core/Engine/AttachmentEngine.cs | 6 +- .../ASC.Mail/Core/Engine/AutoreplyEngine.cs | 34 +- .../Core/Engine/Base/ComposeEngineBase.cs | 34 +- .../ASC.Mail/Core/Engine/CacheEngine.cs | 34 +- .../ASC.Mail/Core/Engine/CalendarEngine.cs | 34 +- .../ASC.Mail/Core/Engine/ChainEngine.cs | 34 +- .../ASC.Mail/Core/Engine/ContactEngine.cs | 34 +- .../ASC.Mail/Core/Engine/CrmLinkEngine.cs | 34 +- .../Core/Engine/DisplayImagesAddressEngine.cs | 34 +- .../ASC.Mail/Core/Engine/DocumentsEngine.cs | 34 +- .../ASC.Mail/Core/Engine/DraftEngine.cs | 34 +- .../ASC.Mail/Core/Engine/EmailInEngine.cs | 34 +- .../ASC.Mail/Core/Engine/FilterEngine.cs | 34 +- .../ASC.Mail/Core/Engine/FolderEngine.cs | 36 +- .../ASC.Mail/Core/Engine/IndexEngine.cs | 34 +- .../Core/Engine/MailBoxSettingEngine.cs | 34 +- .../ASC.Mail/Core/Engine/MailGarbageEngine.cs | 36 +- .../ASC.Mail/Core/Engine/MailboxEngine.cs | 40 +- .../ASC.Mail/Core/Engine/MessageEngine.cs | 14 +- .../ASC.Mail/Core/Engine/OperationEngine.cs | 34 +- .../Engine/Operations/ApplyFilterOperation.cs | 34 +- .../Operations/ApplyFiltersOperation.cs | 34 +- .../Engine/Operations/Base/MailOperation.cs | 34 +- .../Operations/Base/MailOperationException.cs | 34 +- .../Operations/Base/MailOperationStatus.cs | 42 +- .../Operations/Base/MailOperationType.cs | 34 +- .../MailCheckMailserverDomainsDnsOperation.cs | 34 +- .../MailDownloadAllAttachmentsOperation.cs | 2 +- .../MailRecalculateFoldersOperation.cs | 34 +- .../Operations/MailRemoveMailboxOperation.cs | 34 +- .../MailRemoveMailserverDomainOperation.cs | 36 +- .../MailRemoveMailserverMailboxOperation.cs | 34 +- .../MailRemoveUserFolderOperation.cs | 34 +- .../ASC.Mail/Core/Engine/QuotaEngine.cs | 44 +- .../Core/Engine/ServerDomainEngine.cs | 34 +- .../ASC.Mail/Core/Engine/ServerEngine.cs | 2 +- .../Core/Engine/ServerMailboxEngine.cs | 34 +- .../Core/Engine/ServerMailgroupEngine.cs | 34 +- .../ASC.Mail/Core/Engine/SignatureEngine.cs | 34 +- .../ASC.Mail/Core/Engine/SpamEngine.cs | 34 +- .../ASC.Mail/Core/Engine/TagEngine.cs | 34 +- .../ASC.Mail/Core/Engine/TemplateEngine.cs | 34 +- .../ASC.Mail/Core/Engine/TestEngine.cs | 34 +- .../ASC.Mail/Core/Engine/UserActionEngine.cs | 79 +- .../ASC.Mail/Core/Engine/UserFolderEngine.cs | 36 +- .../ASC.Mail/ASC.Mail/Core/EngineFactory.cs | 34 +- .../ASC.Mail/Core/Entities/Account.cs | 34 +- .../ASC.Mail/ASC.Mail/Core/Entities/Alert.cs | 34 +- .../ASC.Mail/Core/Entities/Attachment.cs | 34 +- .../Core/Entities/CashedMailUserAction.cs | 26 +- .../Core/Entities/CashedTenantUserMailBox.cs | 19 +- .../ASC.Mail/ASC.Mail/Core/Entities/Chain.cs | 34 +- .../ASC.Mail/Core/Entities/ChainInfo.cs | 34 +- .../ASC.Mail/Core/Entities/Contact.cs | 34 +- .../ASC.Mail/Core/Entities/ContactCard.cs | 34 +- .../ASC.Mail/Core/Entities/ContactInfo.cs | 34 +- .../ASC.Mail/ASC.Mail/Core/Entities/Filter.cs | 34 +- .../ASC.Mail/ASC.Mail/Core/Entities/Folder.cs | 34 +- .../ASC.Mail/Core/Entities/ImapFlag.cs | 34 +- .../Core/Entities/ImapSpecialMailbox.cs | 34 +- .../ASC.Mail/ASC.Mail/Core/Entities/Mail.cs | 34 +- .../ASC.Mail/Core/Entities/MailGarbage.cs | 34 +- .../ASC.Mail/Core/Entities/MailInfo.cs | 34 +- .../ASC.Mail/Core/Entities/Mailbox.cs | 34 +- .../Core/Entities/MailboxAutoreply.cs | 34 +- .../Core/Entities/MailboxAutoreplyHistory.cs | 34 +- .../ASC.Mail/Core/Entities/MailboxDomain.cs | 34 +- .../ASC.Mail/Core/Entities/MailboxProvider.cs | 34 +- .../ASC.Mail/Core/Entities/MailboxServer.cs | 51 +- .../Core/Entities/MailboxSignature.cs | 34 +- .../ASC.Mail/Core/Entities/MailboxStatus.cs | 34 +- .../ASC.Mail/ASC.Mail/Core/Entities/Server.cs | 34 +- .../ASC.Mail/Core/Entities/ServerAddress.cs | 34 +- .../ASC.Mail/Core/Entities/ServerDns.cs | 34 +- .../ASC.Mail/Core/Entities/ServerDomain.cs | 34 +- .../ASC.Mail/Core/Entities/ServerGroup.cs | 34 +- module/ASC.Mail/ASC.Mail/Core/Entities/Tag.cs | 34 +- .../ASC.Mail/Core/Entities/TagMail.cs | 34 +- .../ASC.Mail/Core/Entities/UserFolder.cs | 34 +- .../Core/Entities/UserFolderTreeItem.cs | 34 +- .../ASC.Mail/Core/Entities/UserFolderXMail.cs | 34 +- .../ASC.Mail/Data/Contracts/AccountInfo.cs | 34 +- .../ASC.Mail/Data/Contracts/Address.cs | 34 +- .../Data/Contracts/Base/MailComposeBase.cs | 34 +- .../ASC.Mail/Data/Contracts/ContactInfo.cs | 37 +- .../ASC.Mail/Data/Contracts/CrmContactData.cs | 38 +- .../Data/Contracts/MailAccountData.cs | 49 +- .../Data/Contracts/MailAddressInfo.cs | 34 +- .../ASC.Mail/Data/Contracts/MailAlertData.cs | 41 +- .../Data/Contracts/MailAttachmentData.cs | 45 +- .../Data/Contracts/MailAutoreplyData.cs | 42 +- .../Data/Contracts/MailBoxAccountSettings.cs | 34 +- .../ASC.Mail/Data/Contracts/MailBoxData.cs | 56 +- .../Data/Contracts/MailClientConfig.cs | 34 +- .../Data/Contracts/MailCommonSettings.cs | 39 +- .../Data/Contracts/MailContactData.cs | 44 +- .../ASC.Mail/Data/Contracts/MailCrmStatus.cs | 36 +- .../ASC.Mail/Data/Contracts/MailDraftData.cs | 34 +- .../ASC.Mail/Data/Contracts/MailFolder.cs | 34 +- .../ASC.Mail/Data/Contracts/MailFolderData.cs | 40 +- .../Data/Contracts/MailGarbageEraserConfig.cs | 34 +- .../Data/Contracts/MailMessageData.cs | 76 +- .../Data/Contracts/MailSearchFilterData.cs | 34 +- .../Contracts/MailSieveFilterActionData.cs | 36 +- .../MailSieveFilterApplyToFolderData.cs | 34 +- .../Contracts/MailSieveFilterConditionData.cs | 37 +- .../Data/Contracts/MailSieveFilterData.cs | 44 +- .../Contracts/MailSieveFilterOptionsData.cs | 43 +- .../Data/Contracts/MailSignatureData.cs | 37 +- .../ASC.Mail/Data/Contracts/MailTagData.cs | 40 +- .../Data/Contracts/MailTemplateData.cs | 34 +- .../Data/Contracts/MailUserFolderData.cs | 42 +- .../ASC.Mail/Data/Contracts/ServerData.cs | 39 +- .../Data/Contracts/ServerDomainAddressData.cs | 37 +- .../Contracts/ServerDomainDKIMRecordData.cs | 37 +- .../Contracts/ServerDomainDNSRecordData.cs | 37 +- .../Data/Contracts/ServerDomainData.cs | 38 +- .../Data/Contracts/ServerDomainDnsData.cs | 39 +- .../Data/Contracts/ServerDomainGroupData.cs | 38 +- .../Contracts/ServerDomainMXRecordData.cs | 37 +- .../ASC.Mail/Data/Contracts/ServerFullData.cs | 41 +- .../Data/Contracts/ServerLimitData.cs | 35 +- .../Data/Contracts/ServerMailboxData.cs | 42 +- .../ServerNotificationAddressData.cs | 41 +- .../ServerNotificationAddressSettings.cs | 34 +- .../ASC.Mail/Data/Contracts/TasksConfig.cs | 34 +- .../ASC.Mail/Data/Imap/ImapFolderUids.cs | 34 +- .../ASC.Mail/Data/Imap/ImapIntervals.cs | 34 +- .../ASC.Mail/Data/Imap/UidInterval.cs | 34 +- .../Data/Search/MailContactsWrapper.cs | 34 +- .../ASC.Mail/Data/Search/MailWrapper.cs | 2 +- .../Data/Storage/AttachmentManager.cs | 2 +- .../ASC.Mail/Data/Storage/AttachmentStream.cs | 34 +- .../Data/Storage/ContactPhotoManager.cs | 34 +- .../ASC.Mail/Data/Storage/MailDataStore.cs | 34 +- .../Data/Storage/MailStoragePathCombiner.cs | 2 +- .../ASC.Mail/Data/Storage/StorageManager.cs | 2 +- module/ASC.Mail/ASC.Mail/Defines.cs | 41 +- .../ASC.Mail/Enums/ContactInfoType.cs | 34 +- module/ASC.Mail/ASC.Mail/Enums/ContactType.cs | 34 +- .../ASC.Mail/ASC.Mail/Enums/EncryptionType.cs | 34 +- .../ASC.Mail/Enums/Filter/ActionType.cs | 34 +- .../Enums/Filter/ApplyToAttachmentsType.cs | 34 +- .../Enums/Filter/ApplyToMessagesType.cs | 34 +- .../ASC.Mail/Enums/Filter/ConditionKeyType.cs | 34 +- .../Enums/Filter/ConditionOperationType.cs | 34 +- .../Enums/Filter/MatchMultiConditionsType.cs | 34 +- module/ASC.Mail/ASC.Mail/Enums/FolderType.cs | 34 +- .../ASC.Mail/ASC.Mail/Enums/MailAlertTypes.cs | 34 +- .../ASC.Mail/ASC.Mail/Enums/SaslMechanism.cs | 40 +- module/ASC.Mail/ASC.Mail/Enums/ServerType.cs | 34 +- .../Enums/UploadToDocumentsErrorType.cs | 34 +- .../ASC.Mail/ASC.Mail/Enums/WellKnownPorts.cs | 34 +- .../AlreadyExistsFolderException.cs | 34 +- .../ASC.Mail/Exceptions/ApiHelperException.cs | 34 +- .../Exceptions/AttachmentsException.cs | 34 +- .../ASC.Mail/Exceptions/DraftException.cs | 34 +- .../Exceptions/EmptyFolderException.cs | 34 +- .../Exceptions/ImapConnectionException.cs | 34 +- .../ImapConnectionTimeoutException.cs | 34 +- .../Exceptions/LimitMessageException.cs | 34 +- .../Exceptions/MailBoxOutException.cs | 34 +- .../Exceptions/MoveFolderException.cs | 34 +- .../Exceptions/NotFoundFilterDataException.cs | 34 +- .../Exceptions/Pop3ConnectionException.cs | 34 +- .../Pop3ConnectionTimeoutException.cs | 34 +- .../Exceptions/SmtpConnectionException.cs | 34 +- .../SmtpConnectionTimeoutException.cs | 34 +- .../Extensions/DataContractsExtensions.cs | 34 +- .../ASC.Mail/Extensions/DateTimeExtensions.cs | 34 +- .../Extensions/EnumerableExtensions.cs | 34 +- .../ASC.Mail/Extensions/MailBoxExtensions.cs | 34 +- .../Extensions/MailDraftExtensions.cs | 2 +- .../Extensions/MailMessageExtensions.cs | 34 +- .../Extensions/MimeMessageExtensions.cs | 34 +- .../ASC.Mail/Extensions/QueueExtensions.cs | 34 +- .../Extensions/RestClientExtensions.cs | 34 +- .../Extensions/ServerDomainDnsExtensions.cs | 34 +- .../ASC.Mail/Extensions/StackExtensions.cs | 34 +- .../ASC.Mail/Extensions/StreamExtensions.cs | 34 +- .../ASC.Mail/Extensions/StringExtensions.cs | 34 +- .../ASC.Mail/Iterators/IMailboxIterator.cs | 34 +- .../ASC.Mail/Iterators/MailboxIterator.cs | 34 +- .../Iterators/MailboxMessagesIterator.cs | 34 +- module/ASC.Mail/ASC.Mail/Utils/ApiHelper.cs | 35 +- module/ASC.Mail/ASC.Mail/Utils/Converter.cs | 6 +- module/ASC.Mail/ASC.Mail/Utils/CryptoUtil.cs | 34 +- .../ASC.Mail/ASC.Mail/Utils/EncodingTools.cs | 34 +- .../ASC.Mail/ASC.Mail/Utils/HtmlSanitizer.cs | 34 +- module/ASC.Mail/ASC.Mail/Utils/MailUtil.cs | 34 +- module/ASC.Mail/ASC.Mail/Utils/MimeTypeMap.cs | 34 +- module/ASC.Mail/ASC.Mail/Utils/Parser.cs | 34 +- ...C.Mail.Aggregator.CollectionService.csproj | 3 + .../AggregatorService.cs | 34 +- .../HealthCheckService.cs | 2 +- .../Program.Options.cs | 2 +- .../Program.cs | 2 +- .../Queue/Data/Extensions.cs | 34 +- .../Queue/Data/MailboxData.cs | 34 +- .../Queue/Data/TaskData.cs | 34 +- .../Queue/Data/TenantData.cs | 34 +- .../Queue/MailQueueItemSettings.cs | 34 +- .../Queue/QueueManager.cs | 34 +- .../Queue/SignalrWorker.cs | 34 +- .../Services/ASC.Mail.DomainParser/Program.cs | 2 +- .../ASC.Mail.EmlDownloader.csproj | 6 +- .../ASC.Mail.EmlDownloader/Program.Options.cs | 2 +- .../ASC.Mail.EmlDownloader/Program.cs | 2 +- .../Program.Options.cs | 34 +- .../ASC.Mail.PasswordFinder/Program.cs | 34 +- .../ASC.Mail.Reloader/Program.Options.cs | 34 +- .../Services/ASC.Mail.Reloader/Program.cs | 34 +- .../ASC.Mail.StorageCleaner.Service.csproj | 7 +- .../HealthCheckService.cs | 2 +- .../ASC.Mail.StorageCleaner/Program.cs | 2 +- .../StorageCleanerService.cs | 2 +- .../ASC.Mail.Watchdog.Service.csproj | 5 +- .../HealthCheckService.cs | 2 +- .../Program.Options.cs | 34 +- .../ASC.Mail.Watchdog.Service/Program.cs | 2 +- .../WatchdogService.cs | 2 +- .../ASC.MessagingSystem.csproj | 2 + .../DbSender/DbMessageSender.cs | 2 +- .../DbSender/MessagesRepository.cs | 21 +- module/ASC.MessagingSystem/EventMessage.cs | 34 +- module/ASC.MessagingSystem/IMessageSender.cs | 2 +- module/ASC.MessagingSystem/MessageFactory.cs | 11 +- .../ASC.MessagingSystem/MessageInitiator.cs | 2 +- module/ASC.MessagingSystem/MessagePolicy.cs | 2 +- module/ASC.MessagingSystem/MessageService.cs | 28 +- module/ASC.MessagingSystem/MessageSettings.cs | 81 +- module/ASC.MessagingSystem/MessageTarget.cs | 34 +- module/ASC.MessagingSystem/MessageUserData.cs | 34 +- module/ASC.Migration/ASC.Migration.csproj | 7 + .../ASC.Migration/Core/AbstractMigration.cs | 26 +- module/ASC.Migration/Core/IMigration.cs | 26 +- module/ASC.Migration/Core/ImportableEntity.cs | 19 +- module/ASC.Migration/Core/MigrationLogger.cs | 19 +- .../Core/Models/Api/ApiMigratorAttribute.cs | 28 +- .../Core/Models/Api/ImportableApiEntity.cs | 19 +- .../Core/Models/Api/MigratingApiCalendar.cs | 19 +- .../Core/Models/Api/MigratingApiContacts.cs | 19 +- .../Core/Models/Api/MigratingApiFiles.cs | 19 +- .../Core/Models/Api/MigratingApiGroup.cs | 19 +- .../Core/Models/Api/MigratingApiMail.cs | 19 +- .../Core/Models/Api/MigratingApiUser.cs | 19 +- .../Core/Models/Api/MigrationApiInfo.cs | 19 +- .../Core/Models/Api/MigrationCore.cs | 33 +- .../Api/MigrationLogApiContentResponce.cs | 19 +- .../Core/Models/Api/MigratorMeta.cs | 19 +- .../Core/Models/IMigrationInfo.cs | 19 +- .../Core/Models/MigratingCalendar.cs | 19 +- .../Core/Models/MigratingContacts.cs | 19 +- .../Core/Models/MigratingFiles.cs | 19 +- .../Core/Models/MigratingGroup.cs | 19 +- .../Core/Models/MigratingMail.cs | 19 +- .../Core/Models/MigratingUser.cs | 19 +- .../Core/Models/MigrationInfo.cs | 19 +- .../Core/Models/MigrationModules.cs | 19 +- .../GoogleWorkspaceMigration.cs | 70 +- .../Models/GWSMigratingCalendar.cs | 19 +- .../Models/GWSMigratingContacts.cs | 19 +- .../Models/GWSMigratingFiles.cs | 19 +- .../Models/GWSMigratingGroups.cs | 19 +- .../Models/GWSMigratingMail.cs | 19 +- .../Models/GWSMigratingUser.cs | 19 +- .../Models/GWSMigrationInfo.cs | 19 +- .../Models/Parse/GWSContact.cs | 19 +- .../Models/Parse/GWSDriveFileInfo.cs | 19 +- .../GoogleWorkspace/Models/Parse/GWSMail.cs | 19 +- .../Models/Parse/GWSProfile.cs | 19 +- .../GoogleWorkspace/Models/Parse/GWSTasks.cs | 19 +- module/ASC.Migration/MigrateProgressItem.cs | 69 + .../Models/NCMigratingCalendar.cs | 19 +- .../Models/NCMigratingContacts.cs | 19 +- .../Models/NCMigratingFiles.cs | 19 +- .../Models/NCMigratingGroups.cs | 19 +- .../Models/NCMigratingMail.cs | 18 +- .../Models/NCMigratingUser.cs | 19 +- .../Models/NCMigrationInfo.cs | 18 +- .../Models/Parse/NCAddressbooks.cs | 19 +- .../Models/Parse/NCCalendars.cs | 19 +- .../Models/Parse/NCContact.cs | 19 +- .../Models/Parse/NCGroup.cs | 19 +- .../Models/Parse/NCStorages.cs | 19 +- .../NextcloudWorkspace/Models/Parse/NCUser.cs | 19 +- .../NextcloudWorkspaceMigration.cs | 92 +- .../OwnCloud/Models/OCMigratingCalendar.cs | 19 +- .../OwnCloud/Models/OCMigratingContacts.cs | 19 +- .../OwnCloud/Models/OCMigratingFiles.cs | 19 +- .../OwnCloud/Models/OCMigratingGroups.cs | 19 +- .../OwnCloud/Models/OCMigratingMail.cs | 19 +- .../OwnCloud/Models/OCMigratingUser.cs | 19 +- .../OwnCloud/Models/OCMigrationinfo.cs | 19 +- .../OwnCloud/Models/Parse/OCAddressbooks.cs | 19 +- .../OwnCloud/Models/Parse/OCCalendars.cs | 19 +- .../OwnCloud/Models/Parse/OCContact.cs | 19 +- .../OwnCloud/Models/Parse/OCGroup.cs | 19 +- .../OwnCloud/Models/Parse/OCStorages.cs | 19 +- .../OwnCloud/Models/Parse/OCUser.cs | 19 +- .../OwnCloud/OwnCloudMigration.cs | 90 +- module/ASC.Migration/ParseProgressItem.cs | 73 + module/ASC.Migration/QueueWorker.cs | 99 + .../Resources/MigrationResource.Designer.cs | 80 +- .../ASC.Notify/ASC.Notify/ASC.Notify.csproj | 5 + .../ASC.Notify/Config/NotifyServiceCfg.cs | 2 +- .../Config/NotifyServiceCfgProcessElement.cs | 2 +- .../NotifyServiceCfgSchedulerElement.cs | 2 +- .../NotifyServiceCfgSchedulersCollection.cs | 2 +- .../Config/NotifyServiceCfgSectionHandler.cs | 2 +- .../Config/NotifyServiceCfgSenderElement.cs | 2 +- .../NotifyServiceCfgSendersCollection.cs | 2 +- module/ASC.Notify/ASC.Notify/DbWorker.cs | 4 +- .../ASC.Notify/FakeMailAgregator.cs | 4 +- .../ASC.Notify/ASC.Notify/JabberAgregator.cs | 2 +- module/ASC.Notify/ASC.Notify/MailAgregator.cs | 2 +- .../ASC.Notify/ASC.Notify/MailSendingState.cs | 2 +- module/ASC.Notify/ASC.Notify/NotifyCleaner.cs | 36 +- module/ASC.Notify/ASC.Notify/NotifySender.cs | 34 +- module/ASC.Notify/ASC.Notify/NotifyService.cs | 2 +- .../ASC.Notify/NotifyServiceLauncher.cs | 2 +- module/ASC.Radicale/ASC.Radicale.csproj | 4 +- module/ASC.Radicale/Launcher.cs | 2 +- .../ASC.Radicale/RadicaleCfgSectionHandler.cs | 34 +- .../ASC.ReversyProxy/ASC.ReversyProxy.csproj | 20 + .../ASC.ReversyProxy/Classes/CacheKeys.cs | 22 + .../ASC.ReversyProxy/Classes/IUpdateConfig.cs | 23 + .../Classes/InMemoryConfigProvider.cs | 100 + .../ASC.ReversyProxy/GlobalUsing.cs | 28 + .../FilterProxyDestinationsMiddleware.cs | 138 + .../ASC.ReversyProxy/Program.cs | 74 + .../Properties/launchSettings.json | 14 + .../Services/UpdateConfigManagerService.cs | 119 + .../ASC.ReversyProxy/Startup.cs | 176 + .../ASC.ReversyProxy/appsettings.json | 17 + .../ASC.ReversyProxy/nlog.config | 28 + .../ASC.ReversyProxy/web.config | 40 + .../ASC.Socket.IO.Svc.csproj | 2 + module/ASC.Socket.IO.Svc/Launcher.cs | 2 +- .../SocketIOCfgSectionHandler.cs | 34 +- module/ASC.Socket.IO/app/apiRequestManager.js | 6 +- module/ASC.Socket.IO/app/hubs/counters.js | 3 + module/ASC.Socket.IO/app/portalManager.js | 7 - module/ASC.Socket.IO/config/index.js | 4 +- module/ASC.SsoAuth.Svc/ASC.SsoAuth.Svc.csproj | 2 +- module/ASC.SsoAuth.Svc/ConfigHandler.cs | 34 +- module/ASC.SsoAuth.Svc/Launcher.cs | 43 +- module/ASC.SsoAuth/app.js | 34 +- module/ASC.SsoAuth/app/fileManager.js | 34 +- module/ASC.SsoAuth/app/middleware/saml.js | 34 +- module/ASC.SsoAuth/app/model/logout.js | 34 +- module/ASC.SsoAuth/app/model/user.js | 34 +- module/ASC.SsoAuth/app/routes.js | 34 +- module/ASC.SsoAuth/app/utils/coder.js | 34 +- module/ASC.SsoAuth/app/utils/converter.js | 34 +- module/ASC.SsoAuth/app/utils/hash.js | 34 +- module/ASC.SsoAuth/app/utils/resolver.js | 34 +- module/ASC.SsoAuth/config/index.js | 40 +- .../ASC.TeamLabSvc/ASC.TeamLabSvc.csproj | 2 + .../TeamLabSvcConfigurationCollection.cs | 2 +- .../TeamLabSvcConfigurationElement.cs | 2 +- .../TeamLabSvcConfigurationSection.cs | 2 +- .../ASC.TeamLabSvc/ASC.TeamLabSvc/Program.cs | 2 +- .../ASC.TeamLabSvc/Tests/TestService1.cs | 2 +- .../ASC.TelegramService.csproj | 7 +- .../Commands/UserCommands.cs | 34 +- module/ASC.TelegramService/Core/Attributes.cs | 34 +- module/ASC.TelegramService/Core/Core.cs | 34 +- .../Core/Parsers/GenericParsers.cs | 34 +- .../Core/TenantTgClient.cs | 34 +- module/ASC.TelegramService/Launcher.cs | 34 +- module/ASC.TelegramService/TelegramHandler.cs | 53 +- module/ASC.TelegramService/TelegramService.cs | 34 +- .../ASC.FederatedLogin.csproj | 3 + .../ASC.FederatedLogin/AccountLinker.cs | 10 +- .../Helpers/DictionaryExtensions.cs | 2 +- .../ASC.FederatedLogin/Helpers/HashHelper.cs | 2 +- .../Helpers/JsCallbackHelper.cs | 2 +- .../Helpers/OAuth20TokenHelper.cs | 2 +- .../Helpers/RequestHelper.cs | 2 +- .../Helpers/XmlExtensions.cs | 2 +- .../ASC.FederatedLogin/Helpers/XrdsHelper.cs | 2 +- .../ASC.Thrdparty/ASC.FederatedLogin/Login.cs | 2 +- .../ASC.FederatedLogin/LoginMode.cs | 2 +- .../LoginProviders/AppleIdLoginProvider.cs | 37 +- .../LoginProviders/BaseLoginProvider.cs | 36 +- .../LoginProviders/BitlyLoginProvider.cs | 36 +- .../LoginProviders/BoxLoginProvider.cs | 36 +- .../LoginProviders/DocuSignLoginProvider.cs | 36 +- .../LoginProviders/DropboxLoginProvider.cs | 36 +- .../LoginProviders/EncryptionLoginProvider.cs | 2 +- .../LoginProviders/FacebookLoginProvider.cs | 5 +- .../LoginProviders/GoogleLoginProvider.cs | 5 +- .../LoginProviders/GosUslugiLoginProvider.cs | 5 +- .../LoginProviders/ILoginProvider.cs | 2 +- .../LoginProviders/IValidateKeysProvider.cs | 34 +- .../LoginProviders/LinkedInLoginProvider.cs | 5 +- .../LoginProviders/MailRuLoginProvider.cs | 5 +- .../LoginProviders/MicrosoftLoginProvider.cs | 38 +- .../LoginProviders/OneDriveLoginProvider.cs | 4 +- .../LoginProviders/ProviderManager.cs | 2 +- .../LoginProviders/TelegramLoginProvider.cs | 36 +- .../LoginProviders/TwitterLoginProvider.cs | 5 +- .../LoginProviders/VKLoginProvider.cs | 5 +- .../LoginProviders/WordpressLoginProvider.cs | 37 +- .../LoginProviders/YandexLoginProvider.cs | 5 +- .../MultiRegionAccountLinker.cs | 2 +- .../ASC.FederatedLogin/OAuth20Token.cs | 2 +- .../Profile/LoginProfile.cs | 2 +- .../Profile/LoginProfileExtensions.cs | 2 +- .../Profile/WellKnownFields.cs | 2 +- .../ASC.FederatedLogin/ProviderConstants.cs | 2 +- .../ASC.Thrdparty/ASC.Thrdparty.csproj | 2 + module/ASC.Thrdparty/ASC.Thrdparty/Message.cs | 6 +- .../ASC.Thrdparty/SocialMediaException.cs | 2 +- .../ASC.Thrdparty/SocialNetworks.cs | 2 +- .../ASC.Thrdparty/Twitter/Exceptions.cs | 2 +- .../ASC.Thrdparty/Twitter/TwitterApiInfo.cs | 2 +- .../Twitter/TwitterDataProvider.cs | 2 +- .../ASC.Thrdparty/Twitter/TwitterMessage.cs | 2 +- .../ASC.Thrdparty/Twitter/TwitterUserInfo.cs | 11 +- .../ASC.Thumbnails.Svc.csproj | 4 +- module/ASC.Thumbnails.Svc/ConfigHandler.cs | 2 +- module/ASC.Thumbnails.Svc/Launcher.cs | 2 +- module/ASC.Thumbnails/app/isLife.js | 33 +- module/ASC.Thumbnails/app/log.js | 34 +- module/ASC.Thumbnails/app/thumb.js | 34 +- module/ASC.Thumbnails/app/webshot/options.js | 5 +- module/ASC.Thumbnails/app/webshot/webshot.js | 34 +- .../app/webshot/webshot.phantom.js | 13 +- module/ASC.Thumbnails/config/index.js | 38 +- module/ASC.Thumbnails/index.js | 34 +- .../ASC.UrlShortener.Svc.csproj | 4 +- module/ASC.UrlShortener.Svc/ConfigHandler.cs | 34 +- module/ASC.UrlShortener.Svc/Launcher.cs | 2 +- module/ASC.UrlShortener/app/app.js | 34 +- module/ASC.UrlShortener/app/log.js | 34 +- module/ASC.UrlShortener/app/sql.js | 34 +- module/ASC.UrlShortener/app/sqlConsts.js | 34 +- module/ASC.UrlShortener/app/urlShortener.js | 34 +- module/ASC.UrlShortener/config/index.js | 38 +- module/ASC.UrlShortener/index.js | 34 +- module/ASC.UrlShortener/middleware/auth.js | 34 +- module/ASC.VoipService/ASC.VoipService.csproj | 2 + module/ASC.VoipService/Dao/AbstractDao.cs | 4 +- module/ASC.VoipService/Dao/CachedVoipDao.cs | 34 +- module/ASC.VoipService/Dao/VoIPCallFilter.cs | 2 +- module/ASC.VoipService/Dao/VoipDao.cs | 2 +- module/ASC.VoipService/IVoipProvider.cs | 2 +- module/ASC.VoipService/Twilio/TwilioPhone.cs | 2 +- .../ASC.VoipService/Twilio/TwilioProvider.cs | 2 +- .../Twilio/TwilioResponseHelper.cs | 2 +- .../Twilio/TwilioVoipSettings.cs | 2 +- module/ASC.VoipService/VoipCall.cs | 2 +- module/ASC.VoipService/VoipModel.cs | 33 +- module/ASC.VoipService/VoipPhone.cs | 11 +- module/ASC.VoipService/VoipSettings.cs | 15 +- module/ASC.WebDav.Svc/ConfigHandler.cs | 34 +- module/ASC.WebDav.Svc/Launcher.cs | 43 +- module/ASC.WebDav/helper/helper.js | 34 +- module/ASC.WebDav/helper/localLockManager.js | 34 +- module/ASC.WebDav/helper/logger.js | 38 +- module/ASC.WebDav/helper/propertyParser.js | 34 +- .../helper/renamingDuplicateElements.js | 34 +- module/ASC.WebDav/helper/writable.js | 34 +- module/ASC.WebDav/manager/customFileSystem.js | 34 +- module/ASC.WebDav/package-lock.json | 1493 ++- module/ASC.WebDav/package.json | 1 + .../resource/customVirtualResource.js | 34 +- module/ASC.WebDav/resource/simpleStruct.js | 34 +- module/ASC.WebDav/server/config.js | 34 +- module/ASC.WebDav/server/requestAPI.js | 28 +- module/ASC.WebDav/server/webDavServer.js | 37 +- .../customHTTPBasicAuthentication.js | 34 +- module/ASC.WebDav/user/customSimpleUser.js | 34 +- module/ASC.WebDav/user/customUserLayout.js | 34 +- module/ASC.WebDav/user/customUserManager.js | 34 +- module/ASC.WebDav/yarn.lock | 835 +- web/core/ASC.Web.Core/ASC.Web.Core.csproj | 8 + web/core/ASC.Web.Core/AddonContext.cs | 2 +- web/core/ASC.Web.Core/BasePage.cs | 34 +- .../ASC.Web.Core/BruteForceLoginManager.cs | 102 + .../ASC.Web.Core/Calendars/BaseCalendar.cs | 2 +- web/core/ASC.Web.Core/Calendars/BaseEvent.cs | 2 +- web/core/ASC.Web.Core/Calendars/BaseTodo.cs | 34 +- .../ASC.Web.Core/Calendars/CalendarColors.cs | 2 +- .../ASC.Web.Core/Calendars/CalendarManager.cs | 2 +- web/core/ASC.Web.Core/Calendars/IEvent.cs | 2 +- .../Calendars/IExternalCalendar.cs | 2 +- web/core/ASC.Web.Core/Calendars/ITodo.cs | 34 +- .../ASC.Web.Core/Calendars/IiCalFormatView.cs | 2 +- .../ASC.Web.Core/Calendars/RecurrenceRule.cs | 2 +- .../ASC.Web.Core/Calendars/SharingOptions.cs | 2 +- .../Client/Bundling/BundleConfig.cs | 2 +- .../Client/Bundling/BundleHelper.cs | 2 +- .../Client/Bundling/ClientScriptReference.cs | 2 +- .../Bundling/ClientScriptRouteHandler.cs | 2 +- .../Client/Bundling/CloudFrontTransform.cs | 4 +- .../Client/Bundling/CopyrigthTransform.cs | 2 +- .../Client/Bundling/CssTransform.cs | 2 +- .../Client/Bundling/DiscTransform.cs | 2 +- .../Bundling/GoogleCloudStorageTransform.cs | 4 +- .../Client/Bundling/IStaticBundle.cs | 35 +- .../Client/Bundling/JsTransform.cs | 2 +- .../Client/Bundling/NullOrderer.cs | 2 +- .../RackspaceCloudStorageTransform.cs | 4 +- .../Client/Bundling/ResourceBundleControl.cs | 2 +- .../Bundling/SelectelStorageTransform.cs | 4 +- .../Client/Bundling/StorageTransform.cs | 34 +- .../ASC.Web.Core/Client/ClientCapabilities.cs | 2 +- .../ASC.Web.Core/Client/ClientSettings.cs | 8 +- .../Client/HttpHandlers/ClientScript.cs | 2 +- .../Client/HttpHandlers/ClientScriptCustom.cs | 2 +- .../HttpHandlers/ClientScriptLocalization.cs | 2 +- web/core/ASC.Web.Core/CommonPhotoManager.cs | 2 +- web/core/ASC.Web.Core/CookiesManager.cs | 124 +- .../ASC.Web.Core/Extensions/EnumExtension.cs | 2 +- .../Extensions/ProductModuleExtension.cs | 2 +- .../Extensions/StringExtension.cs | 2 +- .../Extensions/TimeZoneExtension.cs | 34 +- .../Extensions/UserInfoExtension.cs | 2 +- .../Extensions/WebItemExtension.cs | 2 +- .../Files/ContentDispositionUtil.cs | 2 +- .../ASC.Web.Core/Files/DocumentService.cs | 4 +- .../Files/DocumentServiceLicense.cs | 33 +- web/core/ASC.Web.Core/Files/FileType.cs | 2 +- web/core/ASC.Web.Core/Files/FileUtility.cs | 6 +- .../ASC.Web.Core/Files/FilesLinkUtility.cs | 17 +- .../Files/IThumbnailBuilderService.cs | 34 +- .../Files/ThumbnailBuilderServiceClient.cs | 34 +- .../ASC.Web.Core/Helpers/ApiSystemHelper.cs | 2 +- .../Helpers/AuthorizationHelper.cs | 2 +- .../ASC.Web.Core/Helpers/GrammaticalHelper.cs | 2 +- web/core/ASC.Web.Core/Helpers/ImageHelpers.cs | 2 +- .../Helpers/ResourceEnumConverter.cs | 2 +- web/core/ASC.Web.Core/IAddon.cs | 2 +- web/core/ASC.Web.Core/IModule.cs | 2 +- web/core/ASC.Web.Core/IProduct.cs | 2 +- web/core/ASC.Web.Core/IWebItem.cs | 2 +- web/core/ASC.Web.Core/Jabber/FireBase.cs | 36 +- .../Jabber/JabberServiceClient.cs | 2 +- .../ASC.Web.Core/Mail/MailServiceHelper.cs | 38 +- .../CachedMobileAppInstallRegistrator.cs | 2 +- .../Mobile/IMobileAppInstallRegistrator.cs | 2 +- .../Mobile/MobileAppInstallRegistrator.cs | 4 +- .../ASC.Web.Core/Mobile/MobileDetector.cs | 2 +- web/core/ASC.Web.Core/ModuleContext.cs | 2 +- .../ModuleManagement/Common/ISearchHandler.cs | 2 +- .../Common/IShortcutProvider.cs | 2 +- .../ASC.Web.Core/ModuleManagement/Module.cs | 2 +- web/core/ASC.Web.Core/NavigationWebItem.cs | 2 +- web/core/ASC.Web.Core/Product.cs | 2 +- web/core/ASC.Web.Core/ProductAttribute.cs | 2 +- web/core/ASC.Web.Core/ProductContext.cs | 2 +- .../Security/SecurityAttribute.cs | 2 +- .../Security/SecurityPassthroughAttribute.cs | 2 +- web/core/ASC.Web.Core/Sms/SmsKeyStorage.cs | 2 +- web/core/ASC.Web.Core/Sms/SmsProvider.cs | 14 +- web/core/ASC.Web.Core/Sms/SmsSender.cs | 2 +- .../ASC.Web.Core/SpaceUsageStatManager.cs | 4 +- .../IProductSubscriptionManager.cs | 2 +- .../Subscriptions/ISubscriptionManager.cs | 2 +- .../Subscriptions/SubscriptionGroup.cs | 2 +- .../Subscriptions/SubscriptionObject.cs | 2 +- .../Subscriptions/SubscriptionType.cs | 2 +- .../ASC.Web.Core/Users/DisplayUserSettings.cs | 2 +- .../Users/Import/IUserImporter.cs | 2 +- .../Users/Import/OutlookCSVUserImporter.cs | 2 +- .../Users/Import/TextFileUserImporter.cs | 2 +- .../Users/UserHelpTourSettings.cs | 2 +- .../ASC.Web.Core/Users/UserInfoComparer.cs | 2 +- .../ASC.Web.Core/Users/UserPhotoManager.cs | 49 +- .../Users/UserPhotoThumbnailManager.cs | 34 +- .../Users/UserPhotoThumbnailSettings.cs | 34 +- web/core/ASC.Web.Core/Users/UserSortOrder.cs | 2 +- .../Utility/ColorThemesSettings.cs | 9 +- .../ASC.Web.Core/Utility/CommonLinkUtility.cs | 5 +- .../Utility/IFileUploadHandler.cs | 2 +- .../Utility/ImpersonationSettings.cs | 224 + .../ASC.Web.Core/Utility/LoginSettings.cs | 50 + .../ASC.Web.Core/Utility/ModeThemeSettings.cs | 78 + .../ASC.Web.Core/Utility/PasswordSettings.cs | 105 +- .../Utility/SearchHandlerManager.cs | 2 +- .../Utility/Settings/TenantAccessSettings.cs | 2 +- .../Utility/Settings/WebItemSettings.cs | 2 +- .../Utility/Settings/WizardSettings.cs | 34 +- .../Utility/Skins/ImageOptions.cs | 2 +- .../Utility/Skins/WebImageSupplier.cs | 2 +- .../Utility/Skins/WebSkinSettings.cs | 2 +- .../ASC.Web.Core/Utility/TenantProvider.cs | 2 +- web/core/ASC.Web.Core/Utility/UrlShortener.cs | 2 +- web/core/ASC.Web.Core/Utility/UrlSwitcher.cs | 2 +- web/core/ASC.Web.Core/WarmupPage.cs | 2 +- web/core/ASC.Web.Core/WebItemContext.cs | 2 +- web/core/ASC.Web.Core/WebItemManager.cs | 6 +- web/core/ASC.Web.Core/WebItemSecurity.cs | 2 +- web/core/ASC.Web.Core/WebItemSecurityInfo.cs | 2 +- .../WebZones/IRenderCustomNavigation.cs | 2 +- .../ASC.Web.Core/WebZones/WebZoneAttribute.cs | 2 +- .../AdditionalWhiteLabelSettings.cs | 2 +- .../WhiteLabel/CompanyWhiteLabelSettings.cs | 2 +- .../WhiteLabel/MailWhiteLabelSettings.cs | 2 +- .../WhiteLabel/TenantInfoSettings.cs | 38 +- .../WhiteLabel/TenantLogoManager.cs | 80 +- .../WhiteLabel/TenantWhiteLabelSettings.cs | 138 +- .../WhiteLabel/WhiteLabelLogoTypeEnum.cs | 39 +- .../ASC.Web.Studio/ASC.Web.Studio.csproj | 300 +- web/studio/ASC.Web.Studio/AppInstall.aspx.cs | 34 +- .../App_Start/WebApi.Startup.cs | 2 +- web/studio/ASC.Web.Studio/Auth.aspx.cs | 2 +- .../Controls/Common/CommonResultsView.cs | 2 +- .../Controls/Common/Container.cs | 2 +- .../Controls/Common/EmptyScreenControl.cs | 2 +- .../Controls/Common/FeedControl.cs | 2 +- .../Controls/Common/InlineScript.cs | 2 +- .../Controls/Common/MenuItem.cs | 2 +- .../Controls/Common/NotFoundControl.cs | 2 +- .../Controls/Common/PageNavigator.cs | 2 +- .../Controls/Common/ResultsView.cs | 2 +- .../Controls/Common/SideContainer.cs | 2 +- .../Controls/FileUploader/FileToUpload.cs | 2 +- .../HttpModule/UploadProgressHandler.cs | 10 +- .../Controls/Users/EmployeeUserCard.cs | 2 +- .../Core/AdminHelperSettings.cs | 19 +- .../Core/Backup/BackupAjaxHandler.cs | 18 +- .../Core/Backup/BackupFileUploadHandler.cs | 2 +- .../Core/CollaboratorSettings.cs | 2 +- .../ASC.Web.Studio/Core/CountriesResources.cs | 2 +- .../Core/CustomNavigationSettings.cs | 41 +- .../ASC.Web.Studio/Core/DateTimeExtension.cs | 2 +- web/studio/ASC.Web.Studio/Core/DebugInfo.cs | 2 +- .../Core/EmailActivationSettings.cs | 35 +- .../Core/EmailOperationService.cs | 6 +- .../Core/FCKUploadsDBManager.cs | 8 +- .../ASC.Web.Studio/Core/FileSizeComment.cs | 2 +- .../Core/HelpCenter/BaseHelpCenterStorage.cs | 59 +- .../Core/HelpCenter/HelpCenterHelper.cs | 2 +- .../Core/HelpCenter/HelpCenterStorage.cs | 2 +- .../Core/HelpCenter/UserVideoSettings.cs | 2 +- .../Core/HelpCenter/VideoGuideStorage.cs | 2 +- .../ASC.Web.Studio/Core/Import/ContactInfo.cs | 2 +- .../Core/Import/IUserImporter.cs | 2 +- .../Core/Import/OutlookCSVUserImporter.cs | 2 +- .../Core/Import/TextFileUserImporter.cs | 2 +- web/studio/ASC.Web.Studio/Core/InfoType.cs | 2 +- .../Core/IpRestrictionsSettings.cs | 3 +- .../ASC.Web.Studio/Core/Notify/Actions.cs | 34 +- .../Core/Notify/NotifyConfiguration.cs | 2 +- .../Core/Notify/SpamEmailSettings.cs | 2 +- .../Core/Notify/StudioNotifyHelper.cs | 2 +- .../Core/Notify/StudioNotifyService.cs | 50 +- .../Core/Notify/StudioNotifySource.cs | 2 +- .../Core/Notify/StudioPeriodicNotify.cs | 42 +- .../Core/Notify/StudioSubscriptionManager.cs | 2 +- .../Core/Notify/StudioWhatsNewNotify.cs | 4 +- .../ASC.Web.Studio/Core/Notify/TagValues.cs | 34 +- web/studio/ASC.Web.Studio/Core/Notify/Tags.cs | 34 +- .../Core/OpensourceGiftSettings.cs | 34 +- .../ASC.Web.Studio/Core/PersonalSettings.cs | 2 +- .../Core/PrivacyRoomSettings.cs | 24 +- .../ASC.Web.Studio/Core/PromotionsSettings.cs | 2 +- .../ASC.Web.Studio/Core/Quota/QuotaSync.cs | 34 +- .../ASC.Web.Studio/Core/Quota/QuotaWrapper.cs | 8 +- .../Core/Quota/UserQuotaSync.cs | 82 + .../Core/Search/SearchComparer.cs | 2 +- .../Core/Search/SearchResult.cs | 2 +- .../SearchHandlers/StudioSearchHandler.cs | 4 +- .../ASC.Web.Studio/Core/SecutiryConstants.cs | 2 +- web/studio/ASC.Web.Studio/Core/SetupInfo.cs | 12 +- .../ASC.Web.Studio/Core/Sms/SmsManager.cs | 9 +- .../Core/Sms/StudioSmsNotificationSettings.cs | 30 +- .../Core/Statistic/StatisticManager.cs | 4 +- .../Core/Statistic/UserVisit.cs | 2 +- .../Core/StudioAdminMessageSettings.cs | 2 +- .../Core/StudioDefaultPageSettings.cs | 2 +- .../Core/StudioTrustedDomainSettings.cs | 2 +- .../ASC.Web.Studio/Core/Tfa/ITfaSettings.cs | 33 + .../Core/Tfa/TfaAppAuthSettings.cs | 29 +- .../Core/Tfa/TfaAppUserSettings.cs | 2 +- .../ASC.Web.Studio/Core/Tfa/TfaManager.cs | 9 +- .../Core/Tfa/TfaSettingsBase.cs | 89 + .../ASC.Web.Studio/Core/TipsSettings.cs | 3 +- .../Core/Users/CustomNamingPeople.cs | 25 +- .../ASC.Web.Studio/Core/Users/MyContact.cs | 2 +- .../Users/NamingPeopleResource.Designer.cs | 31 +- .../Core/Users/NamingPeopleResource.resx | 9 + .../ASC.Web.Studio/Core/Users/PeopleNames.xml | 3 + .../Core/Users/ProfileHelper.cs | 6 +- .../Core/Users/SocialContactsManager.cs | 4 +- .../Core/Users/UserInfoExtension.cs | 2 +- .../Core/Users/UserManagerWrapper.cs | 12 +- web/studio/ASC.Web.Studio/Core/WarmUp.cs | 2 +- web/studio/ASC.Web.Studio/DeepLink.aspx.cs | 34 +- web/studio/ASC.Web.Studio/Default.aspx.cs | 18 +- web/studio/ASC.Web.Studio/Feed.aspx.cs | 16 +- web/studio/ASC.Web.Studio/Global.asax.cs | 10 +- .../HttpHandlers/AjaxFileUploadHandler.cs | 2 +- .../FCKEditorFileUploadHandler.cs | 12 +- .../HttpHandlers/LicenseUploader.cs | 2 +- .../ASC.Web.Studio/HttpHandlers/SsoHandler.cs | 34 +- .../HttpHandlers/TemplatingHandler.cs | 2 +- .../HttpHandlers/TenantLogoHandler.cs | 63 +- .../HttpHandlers/UrlProxyHandler.cs | 34 +- .../HttpHandlers/UserPhotoHandler.cs | 2 +- web/studio/ASC.Web.Studio/Management.aspx.cs | 2 +- .../Masters/BaseTemplate.master | 2 + .../Masters/BaseTemplate.master.cs | 23 +- .../Masters/CommonBodyScripts.ascx.cs | 39 +- .../Masters/CommonStyles.ascx.cs | 71 +- .../Masters/FirstScripts.ascx.cs | 38 +- .../Masters/HeadScripts.ascx.cs | 38 +- web/studio/ASC.Web.Studio/Masters/MainPage.cs | 7 +- .../StudioMasterExtensions.cs | 2 +- .../MasterFileUtilityResources.cs | 3 +- .../MasterLocalizationResources.cs | 19 +- .../MasterSettingsResources.cs | 8 +- .../MasterTemplateResources.cs | 2 +- .../MasterResources/MasterUserResources.cs | 6 +- .../ASC.Web.Studio/MigrationPortal.aspx.cs | 34 +- web/studio/ASC.Web.Studio/My.aspx.cs | 2 +- .../ASC.Web.Studio/PaymentRequired.aspx.cs | 45 +- .../ASC.Web.Studio/PortalEncryption.aspx.cs | 34 +- .../ASC.Web.Studio/PreparationPortal.aspx | 2 +- .../ASC.Web.Studio/PreparationPortal.aspx.cs | 2 +- .../Products/CRM/ASC.Web.CRM.csproj | 83 +- .../CRM/App_Themes/dark/dark-common.less | 19 + .../CRM/App_Themes/dark/dark-contacts.less | 19 + .../CRM/App_Themes/dark/dark-crm.less | 19 + .../CRM/App_Themes/dark/dark-params.less | 58 + .../CRM/App_Themes/default/css/base.less | 21 +- .../CRM/App_Themes/default/css/cases.less | 3 +- .../CRM/App_Themes/default/css/common.less | 96 +- .../CRM/App_Themes/default/css/contacts.less | 49 +- .../CRM/App_Themes/default/css/crm.less | 31 + .../CRM/App_Themes/default/css/deals.less | 8 +- .../CRM/App_Themes/default/css/fg.css | 10 +- .../CRM/App_Themes/default/css/invoices.less | 35 +- .../CRM/App_Themes/default/css/params.less | 58 + .../CRM/App_Themes/default/css/reports.less | 44 +- .../CRM/App_Themes/default/css/settings.less | 18 +- .../App_Themes/default/css/socialmedia.less | 8 +- .../CRM/App_Themes/default/css/tasks.less | 11 +- .../App_Themes/default/css/voip.calls.less | 15 +- .../App_Themes/default/css/voip.common.less | 19 +- .../App_Themes/default/css/voip.numbers.less | 19 +- .../App_Themes/default/css/voip.quick.less | 24 +- .../default/images/activity_widget.png | Bin 1271 -> 0 bytes .../default/images/activity_widget.svg | 28 + .../default/images/cases_widget.png | Bin 1690 -> 0 bytes .../default/images/cases_widget.svg | 21 + .../default/images/companies_widget.png | Bin 1490 -> 0 bytes .../default/images/companies_widget.svg | 51 + .../App_Themes/default/images/contacts.png | Bin 7571 -> 0 bytes .../App_Themes/default/images/contacts.svg | 42 + .../App_Themes/default/images/customize.png | Bin 10972 -> 0 bytes .../App_Themes/default/images/customize.svg | 12 + .../App_Themes/default/images/deal_widget.png | Bin 2165 -> 0 bytes .../App_Themes/default/images/deal_widget.svg | 24 + .../images/empty_screen_case_participants.png | Bin 20893 -> 0 bytes .../images/empty_screen_case_participants.svg | 75 + .../default/images/empty_screen_cases.png | Bin 16703 -> 0 bytes .../default/images/empty_screen_cases.svg | 31 + .../default/images/empty_screen_companies.png | Bin 18568 -> 0 bytes .../default/images/empty_screen_companies.svg | 74 + .../empty_screen_company_participants.png | Bin 15284 -> 0 bytes .../empty_screen_company_participants.svg | 194 + .../default/images/empty_screen_deals.png | Bin 17646 -> 0 bytes .../default/images/empty_screen_deals.svg | 29 + .../default/images/empty_screen_invoices.png | Bin 15191 -> 0 bytes .../default/images/empty_screen_invoices.svg | 42 + .../empty_screen_opportunity_participants.png | Bin 21795 -> 0 bytes .../empty_screen_opportunity_participants.svg | 67 + .../default/images/empty_screen_persons.png | Bin 18306 -> 0 bytes .../default/images/empty_screen_persons.svg | 19 + .../default/images/empty_screen_phones.png | Bin 9094 -> 0 bytes .../default/images/empty_screen_phones.svg | 42 + .../images/empty_screen_products_services.png | Bin 14171 -> 0 bytes .../images/empty_screen_products_services.svg | 56 + .../default/images/empty_screen_projects.png | Bin 13216 -> 0 bytes .../default/images/empty_screen_projects.svg | 120 + .../default/images/empty_screen_social.png | Bin 18386 -> 0 bytes .../default/images/empty_screen_social.svg | 11 + .../default/images/empty_screen_tags.png | Bin 14622 -> 0 bytes .../default/images/empty_screen_tags.svg | 22 + .../default/images/empty_screen_tasks.png | Bin 18012 -> 0 bytes .../default/images/empty_screen_tasks.svg | 25 + .../default/images/empty_screen_taxes.png | Bin 10939 -> 0 bytes .../default/images/empty_screen_taxes.svg | 112 + .../default/images/empty_screen_twitter.png | Bin 13773 -> 0 bytes .../default/images/empty_screen_twitter.svg | 6 + .../images/empty_screen_userfields.png | Bin 9721 -> 0 bytes .../images/empty_screen_userfields.svg | 39 + .../images/empty_screen_voip_settings.png | Bin 6789 -> 0 bytes .../images/empty_screen_voip_settings.svg | 27 + .../App_Themes/default/images/export_data.png | Bin 4646 -> 0 bytes .../App_Themes/default/images/export_data.svg | 28 + .../default/images/import-cases.png | Bin 13286 -> 0 bytes .../default/images/import-cases.svg | 29 + .../default/images/import-opportunities.png | Bin 15997 -> 0 bytes .../default/images/import-opportunities.svg | 32 + .../default/images/import-tasks.png | Bin 15152 -> 0 bytes .../default/images/import-tasks.svg | 27 + .../default/images/import_contacts.png | Bin 15764 -> 0 bytes .../default/images/import_contacts.svg | 29 + .../App_Themes/default/images/integration.png | Bin 10862 -> 0 bytes .../App_Themes/default/images/integration.svg | 12 + .../CRM/App_Themes/default/images/invoice.png | Bin 12780 -> 0 bytes .../CRM/App_Themes/default/images/invoice.svg | 44 + .../default/images/loader-dark-24.svg | 38 + .../App_Themes/default/images/mail_icons.png | Bin 793 -> 805 bytes .../App_Themes/default/images/mail_send.png | Bin 12662 -> 0 bytes .../App_Themes/default/images/mail_send.svg | 32 + .../default/images/people_widget.png | Bin 1937 -> 0 bytes .../default/images/people_widget.svg | 19 + .../CRM/App_Themes/default/images/sales.png | Bin 8546 -> 0 bytes .../CRM/App_Themes/default/images/sales.svg | 18 + .../default/images/tasks_widget.png | Bin 1252 -> 0 bytes .../default/images/tasks_widget.svg | 18 + .../default/images/web_to_leads.png | Bin 4545 -> 0 bytes .../default/images/web_to_leads.svg | 38 + .../ASC.Web.Studio/Products/CRM/Calls.aspx.cs | 34 +- .../ASC.Web.Studio/Products/CRM/Cases.aspx.cs | 2 +- .../Products/CRM/Classes/BasePage.cs | 2 +- .../Products/CRM/Classes/BaseUserControl.cs | 2 +- .../Products/CRM/Classes/CRMSettings.cs | 13 +- .../Products/CRM/Classes/CSVReader.cs | 2 +- .../CRM/Classes/CSVReaderExtension.cs | 2 +- .../CRM/Classes/ContactPhotoManager.cs | 5 +- .../Products/CRM/Classes/Global.cs | 2 +- .../CRM/Classes/ImportFromCSVManager.cs | 2 +- .../CRM/Classes/InvoiceFormattedData.cs | 2 +- .../CRM/Classes/LocalizedEnumConverter.cs | 2 +- .../CRM/Classes/OrganisationLogoManager.cs | 2 +- .../Products/CRM/Classes/PathProvider.cs | 2 +- .../CRM/Classes/RegisterClientScriptHelper.cs | 25 +- .../Products/CRM/Classes/SignalRHelper.cs | 34 +- .../SocialMedia/SocialMediaAccountNotFound.cs | 2 +- .../SocialMediaImageDescription.cs | 7 +- .../CRM/Classes/SocialMedia/SocialMediaUI.cs | 2 +- .../Classes/SocialMedia/TwitterApiHelper.cs | 2 +- .../Products/CRM/Classes/StringConverter.cs | 2 +- .../CRM/Classes/SubscriptionManager.cs | 2 +- .../Products/CRM/Classes/TwilioController.cs | 34 +- .../Products/CRM/Classes/UrlConstant.cs | 2 +- .../Products/CRM/Classes/UrlParameters.cs | 2 +- .../Products/CRM/Classes/VoipEngine.cs | 34 +- .../CRMsSpaceUsageStatManager.cs | 4 +- .../CRM/Configuration/ProductEntryPoint.cs | 5 +- .../CRM/Configuration/SearchHandler.cs | 2 +- .../Products/CRM/Configuration/VoipModule.cs | 2 +- .../Controls/Cases/CasesActionView.ascx.cs | 2 +- .../Controls/Cases/CasesDetailsView.ascx.cs | 2 +- .../Controls/Cases/CasesFullCardView.ascx.cs | 2 +- .../CRM/Controls/Cases/ListCasesView.ascx.cs | 2 +- .../Controls/Common/ButtonsSidePanel.ascx.cs | 34 +- .../CRM/Controls/Common/FileUploader.ascx.cs | 2 +- .../CRM/Controls/Common/HistoryView.ascx.cs | 2 +- .../Controls/Common/ImportFromCSVView.ascx.cs | 10 +- .../CRM/Controls/Common/ListBaseView.ascx.cs | 2 +- .../Common/NavigationSidePanel.ascx.cs | 2 +- .../CRM/Controls/Common/PrivatePanel.ascx.cs | 2 +- .../CRM/Controls/Common/ResultsView.cs | 2 +- .../Contacts/ContactActionView.ascx.cs | 2 +- .../Contacts/ContactDetailsView.ascx.cs | 14 +- .../Contacts/ContactFullCardView.ascx.cs | 2 +- .../Controls/Contacts/ListContactView.ascx.cs | 2 +- .../CRM/Controls/Deals/DealActionView.ascx.cs | 2 +- .../Controls/Deals/DealDetailsView.ascx.cs | 2 +- .../Controls/Deals/DealFullCardView.ascx.cs | 2 +- .../CRM/Controls/Deals/ListDealView.ascx.cs | 2 +- .../Invoices/InvoiceActionView.ascx.cs | 2 +- .../Invoices/InvoiceDetailsView.ascx.cs | 2 +- .../Controls/Invoices/ListInvoiceView.ascx.cs | 2 +- .../Reports/ReportsNavigation.ascx.cs | 34 +- .../CRM/Controls/Reports/ReportsView.ascx.cs | 34 +- .../CRM/Controls/Sender/SmtpSender.ascx | 2 +- .../CRM/Controls/Sender/SmtpSender.ascx.cs | 2 +- .../Controls/Settings/CommonSettingsView.ascx | 2 +- .../Settings/CommonSettingsView.ascx.cs | 2 +- .../Settings/CurrencySettingsView.ascx.cs | 34 +- .../Settings/CustomFieldsView.ascx.cs | 2 +- .../Settings/DealMilestoneView.ascx.cs | 2 +- .../InvoiceItemActionView.ascx.cs | 2 +- .../InvoiceSettings/InvoiceItemsView.ascx.cs | 2 +- .../InvoiceSettings/InvoiceTaxesView.ascx.cs | 2 +- .../OrganisationProfile.ascx.cs | 2 +- .../Controls/Settings/ListItemView.ascx.cs | 2 +- .../Settings/SettingsHeaderView.ascx.cs | 34 +- .../Controls/Settings/TagSettingsView.ascx.cs | 2 +- .../Settings/TaskTemplateView.ascx.cs | 4 +- .../Settings/VoipSettings/VoipCalls.ascx.cs | 6 +- .../Settings/VoipSettings/VoipCommon.ascx.cs | 2 +- .../Settings/VoipSettings/VoipNumbers.ascx.cs | 2 +- .../Settings/VoipSettings/VoipQuick.ascx.cs | 2 +- .../Controls/Settings/WebToLeadFormView.ascx | 2 +- .../Settings/WebToLeadFormView.ascx.cs | 2 +- .../CRM/Controls/Tasks/ListTaskView.ascx.cs | 2 +- .../Products/CRM/Core/CRMConstants.cs | 2 +- .../Products/CRM/Core/DIHelper.cs | 36 +- .../Products/CRM/Core/Dao/AbstractDao.cs | 2 +- .../Products/CRM/Core/Dao/CasesDao.cs | 2 +- .../Products/CRM/Core/Dao/CommentDao.cs | 34 +- .../Products/CRM/Core/Dao/ContactDao.cs | 2 +- .../Products/CRM/Core/Dao/ContactInfoDao.cs | 2 +- .../Products/CRM/Core/Dao/CurrencyInfoDao.cs | 2 +- .../Products/CRM/Core/Dao/CurrencyRateDao.cs | 2 +- .../Products/CRM/Core/Dao/CustomFieldDao.cs | 2 +- .../Products/CRM/Core/Dao/DaoFactory.cs | 2 +- .../Products/CRM/Core/Dao/DealDao.cs | 2 +- .../Products/CRM/Core/Dao/DealMilestoneDao.cs | 2 +- .../Products/CRM/Core/Dao/FileDao.cs | 2 +- .../Products/CRM/Core/Dao/InvoiceDao.cs | 2 +- .../Products/CRM/Core/Dao/InvoiceItemDao.cs | 4 +- .../Products/CRM/Core/Dao/InvoiceLineDao.cs | 2 +- .../Products/CRM/Core/Dao/InvoiceTaxDao.cs | 2 +- .../Products/CRM/Core/Dao/ListItemDao.cs | 2 +- .../CRM/Core/Dao/ListItemHistoryDao.cs | 34 +- .../Products/CRM/Core/Dao/ManagerDao.cs | 2 +- .../CRM/Core/Dao/RelationshipEventDao.cs | 2 +- .../Products/CRM/Core/Dao/ReportDao.cs | 2 +- .../Products/CRM/Core/Dao/SearchDao.cs | 12 +- .../Products/CRM/Core/Dao/TagDao.cs | 2 +- .../Products/CRM/Core/Dao/TaskDao.cs | 2 +- .../CRM/Core/Dao/TaskTemplateContainerDao.cs | 2 +- .../Products/CRM/Core/DomainObject.cs | 4 +- .../Products/CRM/Core/Entities/Cases.cs | 2 +- .../Products/CRM/Core/Entities/Comment.cs | 2 +- .../Products/CRM/Core/Entities/Contact.cs | 2 +- .../Products/CRM/Core/Entities/ContactInfo.cs | 2 +- .../CRM/Core/Entities/CurrencyInfo.cs | 2 +- .../CRM/Core/Entities/CurrencyRate.cs | 6 +- .../Products/CRM/Core/Entities/CustomField.cs | 2 +- .../Products/CRM/Core/Entities/Deal.cs | 2 +- .../CRM/Core/Entities/DealMilestone.cs | 2 +- .../Products/CRM/Core/Entities/Filter.cs | 34 +- .../Products/CRM/Core/Entities/Invoice.cs | 2 +- .../Products/CRM/Core/Entities/InvoiceItem.cs | 2 +- .../Products/CRM/Core/Entities/InvoiceLine.cs | 3 +- .../Products/CRM/Core/Entities/InvoiceTax.cs | 2 +- .../Products/CRM/Core/Entities/ListItem.cs | 2 +- .../CRM/Core/Entities/ListItemHistory.cs | 34 +- .../Products/CRM/Core/Entities/OrderBy.cs | 2 +- .../CRM/Core/Entities/RelationshipEvent.cs | 2 +- .../Products/CRM/Core/Entities/Report.cs | 2 +- .../Products/CRM/Core/Entities/Task.cs | 2 +- .../Core/Entities/TaskTemplateContainer.cs | 2 +- .../Products/CRM/Core/Enums/BidTypeEnum.cs | 2 +- .../CRM/Core/Enums/CommunicationTypeEnum.cs | 2 +- .../CRM/Core/Enums/ContactInfoCategoryEnum.cs | 2 +- .../CRM/Core/Enums/ContactInfoTypeEnum.cs | 2 +- .../CRM/Core/Enums/ContactListViewTypeEnum.cs | 2 +- .../CRM/Core/Enums/ContactSelectorTypeEnum.cs | 3 +- .../CRM/Core/Enums/CustomFieldTypeEnum.cs | 2 +- .../CRM/Core/Enums/DealMilestoneStatus.cs | 2 +- .../Products/CRM/Core/Enums/EntityTypeEnum.cs | 2 +- .../Products/CRM/Core/Enums/InvoiceStatus.cs | 2 +- .../CRM/Core/Enums/InvoiceTemplateTypeEnum.cs | 2 +- .../Products/CRM/Core/Enums/ListTypeEnum.cs | 2 +- .../Products/CRM/Core/Enums/ProgressStatus.cs | 34 +- .../CRM/Core/Enums/ReportTimePeriodEnum.cs | 34 +- .../Products/CRM/Core/Enums/ReportTypeEnum.cs | 34 +- .../Products/CRM/Core/Enums/ShareType.cs | 2 +- .../CRM/Core/Enums/SortedByTypeEnum.cs | 2 +- .../Products/CRM/Core/Search/BundleSearch.cs | 34 +- .../Products/CRM/Core/Search/CasesWrapper.cs | 34 +- .../CRM/Core/Search/ContactsWrapper.cs | 2 +- .../Products/CRM/Core/Search/DealsWrapper.cs | 34 +- .../Products/CRM/Core/Search/EmailWrapper.cs | 2 +- .../Products/CRM/Core/Search/EventsWrapper.cs | 2 +- .../Products/CRM/Core/Search/FieldsWrapper.cs | 34 +- .../Products/CRM/Core/Search/InfoWrapper.cs | 2 +- .../CRM/Core/Search/InvoicesWrapper.cs | 34 +- .../Products/CRM/Core/Search/TasksWrapper.cs | 34 +- .../Security/CRMSecurityObjectProvider.cs | 2 +- .../Products/CRM/Core/Security/CRMSecutiry.cs | 2 +- .../CRM/Core/Security/FileSecurityProvider.cs | 2 +- .../ASC.Web.Studio/Products/CRM/Deals.aspx.cs | 2 +- .../Products/CRM/Default.aspx.cs | 2 +- .../ASC.Web.Studio/Products/CRM/Help.aspx.cs | 2 +- .../CRM/HttpHandlers/ContactPhotoHandler.cs | 2 +- .../CRM/HttpHandlers/FileHandler.ashx.cs | 2 +- .../CRM/HttpHandlers/FileUploaderHandler.cs | 16 +- .../CRM/HttpHandlers/ImportFileHandler.cs | 2 +- .../HttpHandlers/OrganisationLogoHandler.cs | 2 +- .../HttpHandlers/WebToLeadFromHandler.ashx.cs | 2 +- .../Products/CRM/Invoices.aspx.cs | 2 +- .../Products/CRM/MailViewer.aspx.cs | 2 +- .../CRM/Masters/BasicTemplate.Master.cs | 30 +- .../ClientScripts/CRMSettingsResources.cs | 36 +- .../ClientLocalizationResources.cs | 2 +- .../ClientScripts/ClientTemplateResources.cs | 2 +- .../ClientScripts/ControlsResources.cs | 2 +- .../Products/CRM/Reports.aspx.cs | 34 +- .../Resources/CRMCommonResource.Designer.cs | 18 + .../CRM/Resources/CRMCommonResource.resx | 6 + .../Products/CRM/Sender.aspx.cs | 2 +- .../Services/NotifyService/NotifyClient.cs | 2 +- .../Services/NotifyService/NotifyConstants.cs | 2 +- .../Services/NotifyService/NotifySource.cs | 2 +- .../ASC.Web.Studio/Products/CRM/Settings.aspx | 2 +- .../Products/CRM/Settings.aspx.cs | 2 +- .../ASC.Web.Studio/Products/CRM/Tasks.aspx.cs | 2 +- .../CRM/Templates/CasesTemplates.html | 2 +- .../CRM/Templates/CommonTemplates.html | 2 +- .../Templates/ContactSelectorTemplates.html | 2 +- .../CRM/Templates/ContactsTemplates.html | 2 +- .../CRM/Templates/DealsSelectorTemplates.html | 2 +- .../CRM/Templates/DealsTemplates.html | 2 +- .../CRM/Templates/InvoicesTemplates.html | 2 +- .../CRM/Templates/SettingsTemplates.html | 21 +- .../Products/CRM/Utils/CurrencyProvider.cs | 57 +- .../Products/CRM/Utils/ExportToCSV.cs | 2 +- .../Products/CRM/Utils/FileHelper.cs | 34 +- .../CRM/Utils/Import/CSV/ImportBase.cs | 2 +- .../CRM/Utils/Import/CSV/ImportCSVSettings.cs | 2 +- .../CRM/Utils/Import/CSV/ImportCases.cs | 2 +- .../CRM/Utils/Import/CSV/ImportContacts.cs | 2 +- .../Utils/Import/CSV/ImportDataOperation.cs | 2 +- .../CRM/Utils/Import/CSV/ImportDeals.cs | 2 +- .../CRM/Utils/Import/CSV/ImportFromCSV.cs | 2 +- .../CRM/Utils/Import/CSV/ImportTasks.cs | 2 +- .../Products/CRM/Utils/MailSender.cs | 2 +- .../Products/CRM/Utils/PdfCreator.cs | 9 +- .../Products/CRM/Utils/PdfQueueWorker.cs | 34 +- .../Products/CRM/Utils/ReportHelper.cs | 2 +- .../Products/CRM/Warmup.aspx.cs | 2 +- .../ASC.Web.Studio/Products/CRM/js/cases.js | 2 +- .../ASC.Web.Studio/Products/CRM/js/common.js | 6 +- .../Products/CRM/js/contacts.js | 28 +- .../ASC.Web.Studio/Products/CRM/js/deals.js | 5 +- .../Products/CRM/js/fileuploader.js | 2 +- .../Products/CRM/js/invoices.js | 19 +- .../Products/CRM/js/navsidepanel.js | 2 +- .../ASC.Web.Studio/Products/CRM/js/reports.js | 2 +- .../ASC.Web.Studio/Products/CRM/js/sender.js | 2 +- .../Products/CRM/js/settings.invoices.js | 2 +- .../Products/CRM/js/settings.js | 2 +- .../Products/CRM/js/socialmedia.js | 2 +- .../ASC.Web.Studio/Products/CRM/js/tasks.js | 4 +- .../Products/CRM/js/voip.calls.js | 2 +- .../Products/CRM/js/voip.common.js | 2 +- .../Products/CRM/js/voip.numbers.js | 2 +- .../Products/CRM/js/voip.quick.js | 2 +- .../ASC.Web.Studio/Products/CRM/web.config | 2 +- .../Community/ASC.Web.Community.csproj | 91 +- .../App_Themes/dark/dark-blogstyle.less | 19 + .../dark/dark-bookmarkingstyle.less | 19 + .../Community/App_Themes/dark/dark-main.less | 19 + .../App_Themes/dark/dark-newsstylesheet.less | 19 + .../App_Themes/dark/dark-params.less | 26 + .../Community/App_Themes/dark/dark-style.less | 19 + .../App_Themes/dark/dark-wikicss.less | 19 + .../App_Themes/default/images/icon-blogs.png | Bin 10772 -> 0 bytes .../App_Themes/default/images/icon-blogs.svg | 59 + .../default/images/icon-bookmarks.png | Bin 8084 -> 0 bytes .../default/images/icon-bookmarks.svg | 35 + .../default/images/icon-employees.png | Bin 14158 -> 0 bytes .../default/images/icon-employees.svg | 59 + .../App_Themes/default/images/icon-events.png | Bin 6753 -> 0 bytes .../App_Themes/default/images/icon-events.svg | 55 + .../default/images/icon-helpcenter.png | Bin 8738 -> 0 bytes .../default/images/icon-helpcenter.svg | 21 + .../Community/App_Themes/default/params.less | 26 + .../Controls/ButtonSidePanel.ascx.cs | 34 +- .../Controls/NavigationSidePanel.ascx.cs | 2 +- .../Products/Community/Default.aspx.cs | 4 +- .../Products/Community/Help.aspx.cs | 2 +- .../Community/HttpHandlers/ThumbHandler.cs | 34 +- .../ClientLocalizationResources.cs | 2 +- .../ClientScripts/ClientTemplateResources.cs | 34 +- .../Community/Master/Community.Master.cs | 2 +- .../Community/Modules/Blogs/AddBlog.aspx.cs | 2 +- .../default/{blogstyle.css => blogstyle.less} | 114 +- .../App_Themes/default/images/BlogIconWG.png | Bin 1496 -> 0 bytes .../App_Themes/default/images/blog_add.png | Bin 786 -> 0 bytes .../App_Themes/default/images/blog_add.svg | 21 + .../App_Themes/default/images/blog_icon.png | Bin 17325 -> 0 bytes .../App_Themes/default/images/blog_icon.svg | 61 + .../App_Themes/default/images/blogiconwg.svg | 25 + .../Blogs/App_Themes/default/images/blogs.png | Bin 1496 -> 0 bytes .../Blogs/App_Themes/default/images/blogs.svg | 28 + .../Modules/Blogs/Common/BlogsModule.cs | 6 +- .../Blogs/Common/BlogsSearchHandler.cs | 4 +- .../Blogs/Common/BlogsShortcutProvider.cs | 2 +- .../Blogs/Common/BlogsSubscriptionManager.cs | 2 +- .../Modules/Blogs/Common/Subscriber.cs | 2 +- .../Modules/Blogs/Core/BlogsEngine.cs | 4 +- .../Modules/Blogs/Core/BlogsSettings.cs | 2 +- .../Community/Modules/Blogs/Core/Constants.cs | 2 +- .../Modules/Blogs/Core/Data/BlogsStorage.cs | 4 +- .../Modules/Blogs/Core/Data/DbDao.cs | 2 +- .../Modules/Blogs/Core/Data/DbPostDao.cs | 2 +- .../Modules/Blogs/Core/Data/IBlogDao.cs | 2 +- .../Community/Modules/Blogs/Core/Data/Map.cs | 2 +- .../Modules/Blogs/Core/Domain/Blog.cs | 2 +- .../Modules/Blogs/Core/Domain/BlogInfo.cs | 2 +- .../Modules/Blogs/Core/Domain/Comment.cs | 2 +- .../Modules/Blogs/Core/Domain/Post.cs | 2 +- .../Modules/Blogs/Core/Domain/Rating.cs | 2 +- .../Modules/Blogs/Core/Domain/ReviewPost.cs | 2 +- .../Modules/Blogs/Core/Domain/Settings.cs | 2 +- .../Modules/Blogs/Core/Domain/Tag.cs | 2 +- .../Core/Helpers/SubscriptionNotitySenders.cs | 2 +- .../Core/Security/CorporateBlogSecObject.cs | 2 +- .../Core/Security/PersonalBlogSecObject.cs | 2 +- .../Blogs/Core/Service/BlogNotifySource.cs | 2 +- .../Community/Modules/Blogs/Default.aspx.cs | 4 +- .../Community/Modules/Blogs/EditBlog.aspx.cs | 2 +- .../Modules/Blogs/PageControllers/BasePage.cs | 13 +- .../Blogs/PageControllers/BaseUserControl.cs | 2 +- .../Community/Modules/Blogs/ViewBlog.aspx.cs | 2 +- .../Modules/Blogs/Views/ViewBlogView.ascx.cs | 2 +- .../Community/Modules/Blogs/js/blogs.js | 2 +- ...markingstyle.css => bookmarkingstyle.less} | 615 +- .../default/images/bookmarking_icon.png | Bin 1104 -> 0 bytes .../default/images/bookmarking_icon.svg | 33 + .../default/images/bookmarking_mini_icon.png | Bin 633 -> 0 bytes .../default/images/bookmarking_mini_icon.svg | 18 + .../default/images/bookmarks_icon.png | Bin 16157 -> 0 bytes .../default/images/bookmarks_icon.svg | 38 + .../App_Themes/default/images/goldstar.png | Bin 539 -> 0 bytes .../App_Themes/default/images/goldstar.svg | 14 + .../Modules/Bookmarking/BookmarkInfo.aspx.cs | 2 +- .../BookmarkingCommunityConstants.cs | 2 +- .../Modules/Bookmarking/BookmarkingModule.cs | 6 +- .../Core/Business/BookmarkingService.cs | 4 +- .../Core/Business/IBookmarkingService.cs | 2 +- .../BookmarkPermissionSecurityObject.cs | 2 +- .../BookmarkingPermissionsCheck.cs | 2 +- .../BookmarkSubscriptionConstants.cs | 3 +- .../Subscriptions/BookmarkingNotifyClient.cs | 2 +- .../Subscriptions/BookmarkingNotifySource.cs | 2 +- .../BookmarkingSubscriptionManager.cs | 2 +- .../Common/BookmarkingBusinessConstants.cs | 4 +- .../Core/Common/BookmarkingBusinessFactory.cs | 2 +- .../Core/Common/BookmarkingSessionObject.cs | 3 +- .../Common/Util/BookmarkingBusinessUtil.cs | 2 +- .../Core/Common/Util/Converters.cs | 2 +- .../Core/Dao/BookmarkingHibernateDao.cs | 380 +- .../Core/Dao/BookmarkingHibernateDaoHelper.cs | 3 +- .../Modules/Bookmarking/Core/Pojo/Bookmark.cs | 2 +- .../Bookmarking/Core/Pojo/BookmarkTag.cs | 2 +- .../Modules/Bookmarking/Core/Pojo/Comment.cs | 2 +- .../Modules/Bookmarking/Core/Pojo/Tag.cs | 2 +- .../Bookmarking/Core/Pojo/UserBookmark.cs | 2 +- .../Bookmarking/Core/Pojo/UserBookmarkTag.cs | 2 +- .../Bookmarking/CreateBookmark.aspx.cs | 2 +- .../Modules/Bookmarking/Default.aspx.cs | 2 +- .../Bookmarking/FavouriteBookmarks.aspx.cs | 2 +- .../Modules/Bookmarking/UserBookmarks.aspx.cs | 2 +- .../BookmarkAddedByUserContorl.ascx.cs | 2 +- .../BookmarkHeaderPageControl.ascx.cs | 2 +- .../BookmarkInfoUserControl.ascx.cs | 2 +- .../BookmarkRaitingUserControl.ascx.cs | 2 +- .../BookmarkingPagingUserControl.ascx.cs | 34 +- ...okmarkingRemoverFromFavouritePopup.ascx.cs | 2 +- .../BookmarkingUserControl.ascx.cs | 4 +- .../UserControls/CommentsUserControl.ascx.cs | 2 +- .../Common/ActionButton/ActionButton.cs | 2 +- .../Common/ActionButton/js/actionbutton.js | 2 +- .../Common/BookmarkUserControlPath.cs | 2 +- .../Common/BookmarkingSettings.cs | 2 +- .../Presentation/BookmarkDisplayMode.cs | 33 +- .../Common/Presentation/BookmarkInfoBase.cs | 2 +- .../BookmarkingRequestConstants.cs | 2 +- .../Presentation/BookmarkingServiceHelper.cs | 2 +- .../Common/Presentation/SortParam.cs | 2 +- .../Common/Presentation/TagMenuItemControl.cs | 2 +- .../Common/Search/BookmarkingSearchHandler.cs | 4 +- .../Common/Util/BookmarkingConverter.cs | 2 +- .../Common/Util/BookmarkingSortUtil.cs | 2 +- .../Common/Util/BookmarkingThumbnailSize.cs | 2 +- .../Common/Util/IThumbnailHelper.cs | 2 +- .../UserControls/Common/Util/SortByEnum.cs | 2 +- .../Common/Util/WebSiteThumbnailHelper.cs | 2 +- .../CreateBookmarkUserControl.ascx.cs | 2 +- .../Bookmarking/UserControls/Default.aspx.cs | 2 +- .../SingleBookmarkUserControl.ascx.cs | 2 +- .../Bookmarking/Util/BookmarkingBasePage.cs | 14 +- .../Util/BookmarkingNavigationItem.cs | 2 +- .../Modules/Bookmarking/js/bookmarking.js | 8 +- .../App_Themes/default/images/forum_icon.png | Bin 1691 -> 0 bytes .../App_Themes/default/images/forum_icon.svg | 22 + .../default/images/forum_mini_icon.png | Bin 713 -> 0 bytes .../default/images/forum_mini_icon.svg | 18 + .../App_Themes/default/images/forums_icon.png | Bin 16602 -> 0 bytes .../App_Themes/default/images/forums_icon.svg | 38 + .../App_Themes/default/images/upload.png | Bin 829 -> 0 bytes .../App_Themes/default/images/upload.svg | 9 + .../default/{style.css => style.less} | 516 +- .../Modules/Forum/Common/ForumManager.cs | 4 +- .../Modules/Forum/Common/ForumModule.cs | 6 +- .../Forum/Common/ForumSearchHandler.cs | 4 +- .../Forum/Common/ForumShortcutProvider.cs | 2 +- .../Forum/Common/ForumSubscriptionManager.cs | 2 +- .../Modules/Forum/Common/Subscriber.cs | 2 +- .../Forum/Core/Dao/ForumDataProvider.cs | 4 +- .../Core/HelpClasses/ForumPresenterFactory.cs | 3 +- .../HelpClasses/ForumPresenterSettings.cs | 2 +- .../Forum/Core/HelpClasses/Interfaces.cs | 2 +- .../Core/HelpClasses/PresenterTemplate.cs | 3 +- .../Forum/Core/HelpClasses/UserKeys.cs | 2 +- .../Modules/Forum/Core/Module/Constants.cs | 2 +- .../Forum/Core/Module/ForumNotifySource.cs | 2 +- .../Core/Presenters/NotifierPresenter.cs | 10 +- .../Presenters/SecurityActionPresenter.cs | 2 +- .../Core/Presenters/SubscriberPresenter.cs | 2 +- .../SubscriptionGetcherPresenter.cs | 2 +- .../Forum/Core/Shared/AnswerVariant.cs | 3 +- .../Modules/Forum/Core/Shared/Attachment.cs | 2 +- .../Modules/Forum/Core/Shared/ForumAction.cs | 2 +- .../Modules/Forum/Core/Shared/NotFoundUser.cs | 2 +- .../Modules/Forum/Core/Shared/Post.cs | 2 +- .../Modules/Forum/Core/Shared/Question.cs | 2 +- .../Core/Shared/SubscriptionConstants.cs | 2 +- .../Modules/Forum/Core/Shared/Tag.cs | 3 +- .../Modules/Forum/Core/Shared/Thread.cs | 2 +- .../Forum/Core/Shared/ThreadCategory.cs | 2 +- .../Modules/Forum/Core/Shared/Topic.cs | 2 +- .../Modules/Forum/Core/Views/INotifierView.cs | 2 +- .../Forum/Core/Views/ISecurityActionView.cs | 2 +- .../Forum/Core/Views/ISubscriberView.cs | 2 +- .../Core/Views/ISubscriptionGetcherView.cs | 2 +- .../Community/Modules/Forum/Default.aspx.cs | 4 +- .../Community/Modules/Forum/EditTopic.aspx.cs | 2 +- .../Community/Modules/Forum/Forum.Master.cs | 12 +- .../Modules/Forum/ManagementCenter.aspx.cs | 2 +- .../Community/Modules/Forum/NewForum.aspx.cs | 2 +- .../Community/Modules/Forum/NewPost.aspx.cs | 2 +- .../Community/Modules/Forum/Posts.aspx.cs | 2 +- .../Community/Modules/Forum/Search.aspx.cs | 4 +- .../Community/Modules/Forum/Topics.aspx.cs | 4 +- .../UserControls/Common/DateTimeService.cs | 2 +- .../Forum/UserControls/Common/ForumManager.cs | 2 +- .../Common/ForumScriptProvider.cs | 2 +- .../Forum/UserControls/Common/LinkProvider.cs | 2 +- .../Forum/UserControls/Common/PageLocation.cs | 2 +- .../Forum/UserControls/Common/Settings.cs | 2 +- .../Forum/UserControls/Common/TagSuggest.cs | 2 +- .../Forum/UserControls/ForumEditor.ascx.cs | 4 +- .../Forum/UserControls/ForumMaker.ascx.cs | 2 +- .../Forum/UserControls/NewPostControl.ascx.cs | 20 +- .../Forum/UserControls/PagingControl.ascx.cs | 34 +- .../Forum/UserControls/PostControl.ascx.cs | 2 +- .../UserControls/PostListControl.ascx.cs | 2 +- .../UserControls/RecentActivityControl.cs | 2 +- .../ThreadCategoryListControl.ascx.cs | 2 +- .../Forum/UserControls/TopicControl.ascx.cs | 2 +- .../UserControls/TopicEditorControl.ascx.cs | 2 +- .../UserControls/TopicListControl.ascx.cs | 2 +- .../Modules/Forum/UserTopics.aspx.cs | 4 +- .../Community/Modules/Forum/js/forum.js | 2 +- .../Community/Modules/Forum/js/forummaker.js | 2 +- .../Modules/Forum/js/searchhelper.js | 4 +- .../App_Themes/default/images/150x_advert.png | Bin 10817 -> 0 bytes .../App_Themes/default/images/150x_advert.svg | 27 + .../App_Themes/default/images/150x_news.png | Bin 15552 -> 0 bytes .../App_Themes/default/images/150x_news.svg | 35 + .../default/images/150x_newslogo.png | Bin 21655 -> 0 bytes .../default/images/150x_newslogo.svg | 68 + .../App_Themes/default/images/150x_order.png | Bin 19013 -> 0 bytes .../App_Themes/default/images/150x_order.svg | 31 + .../App_Themes/default/images/150x_poll.png | Bin 9185 -> 0 bytes .../App_Themes/default/images/150x_poll.svg | 21 + .../App_Themes/default/images/32x_advert.png | Bin 1648 -> 0 bytes .../App_Themes/default/images/32x_advert.svg | 21 + .../App_Themes/default/images/32x_news.png | Bin 1298 -> 0 bytes .../App_Themes/default/images/32x_news.svg | 14 + .../App_Themes/default/images/32x_order.png | Bin 1578 -> 0 bytes .../App_Themes/default/images/32x_order.svg | 27 + .../App_Themes/default/images/32x_poll.png | Bin 880 -> 0 bytes .../App_Themes/default/images/32x_poll.svg | 14 + .../App_Themes/default/images/newslogo.png | Bin 133 -> 0 bytes .../App_Themes/default/images/newslogo.svg | 34 + ...newsstylesheet.css => newsstylesheet.less} | 451 +- .../Modules/News/Code/DAO/DbFeedStorage.cs | 12 +- .../News/Code/DAO/DbFeedStorageTest.cs | 2 +- .../News/Code/DAO/FeedStorageFactory.cs | 4 +- .../Modules/News/Code/DAO/IFeedStorage.cs | 2 +- .../Modules/News/Code/DAO/Mappers.cs | 2 +- .../Community/Modules/News/Code/Feed.cs | 2 +- .../Modules/News/Code/FeedComment.cs | 2 +- .../Community/Modules/News/Code/FeedNews.cs | 2 +- .../Community/Modules/News/Code/FeedPoll.cs | 2 +- .../Modules/News/Code/FeedPollAnswer.cs | 2 +- .../Modules/News/Code/FeedPollType.cs | 2 +- .../Modules/News/Code/FeedPollVariant.cs | 2 +- .../Community/Modules/News/Code/FeedType.cs | 2 +- .../Modules/News/Code/FeedTypeInfo.cs | 10 +- .../Community/Modules/News/Code/FeedUrls.cs | 2 +- .../News/Code/Module/NewsNotifySource.cs | 2 +- .../Modules/News/Code/Module/SearchHandler.cs | 6 +- .../News/Code/Module/ShortcutProvider.cs | 2 +- .../News/Code/Module/SubscriptionManager.cs | 2 +- .../Modules/News/Code/PollVoteHandler.cs | 2 +- .../Modules/News/Code/RequestInfo.cs | 2 +- .../News/Controls/BreadCumbsControl.cs | 2 +- .../Modules/News/Controls/FeedItem.ascx.cs | 2 +- .../Modules/News/Controls/FeedView.ascx.cs | 2 +- .../Community/Modules/News/Default.aspx.cs | 12 +- .../Community/Modules/News/EditNews.aspx.cs | 2 +- .../Community/Modules/News/EditPoll.aspx.cs | 2 +- .../Community/Modules/News/News.Master.cs | 14 +- .../Community/Modules/News/News.aspx.cs | 2 +- .../Community/Modules/News/NewsConst.cs | 5 +- .../Community/Modules/News/NewsModule.cs | 10 +- .../Community/Modules/News/js/news.js | 2 +- ...filetype_style.css => filetype_style.less} | 76 +- .../default/css/{wikicss.css => wikicss.less} | 759 +- .../{wikicssprint.css => wikicssprint.less} | 52 +- .../Wiki/App_Themes/default/images/page.png | Bin 1249 -> 0 bytes .../Wiki/App_Themes/default/images/page.svg | 34 + .../App_Themes/default/images/wikilogo150.png | Bin 19495 -> 0 bytes .../App_Themes/default/images/wikilogo150.svg | 15 + .../App_Themes/default/images/wikilogo16.png | Bin 906 -> 0 bytes .../App_Themes/default/images/wikilogo16.svg | 25 + .../App_Themes/default/images/wikilogo32.png | Bin 2089 -> 0 bytes .../App_Themes/default/images/wikilogo32.svg | 25 + .../Modules/Wiki/Code/ActionHelper.cs | 3 +- .../Community/Modules/Wiki/Code/BaseDao.cs | 4 +- .../Modules/Wiki/Code/BaseUserControl.cs | 15 +- .../Community/Modules/Wiki/Code/Category.cs | 2 +- .../Modules/Wiki/Code/CategoryDao.cs | 2 +- .../Community/Modules/Wiki/Code/Comment.cs | 2 +- .../Community/Modules/Wiki/Code/CommentDao.cs | 2 +- .../Community/Modules/Wiki/Code/Constants.cs | 2 +- .../Community/Modules/Wiki/Code/Diff.cs | 134 +- .../Community/Modules/Wiki/Code/File.cs | 2 +- .../Community/Modules/Wiki/Code/FileDAO.cs | 2 +- .../Modules/Wiki/Code/HtmlWikiUtil.cs | 2 +- .../Wiki/Code/HtmlWikiUtil_Wiki2Html.cs.cs | 2 +- .../Community/Modules/Wiki/Code/IVersioned.cs | 2 +- .../Modules/Wiki/Code/IWikiObjectOwner.cs | 2 +- .../Community/Modules/Wiki/Code/Page.cs | 2 +- .../Community/Modules/Wiki/Code/PageDAO.cs | 2 +- .../Modules/Wiki/Code/PageNameUtil.cs | 2 +- .../Community/Modules/Wiki/Code/WikiEngine.cs | 7 +- .../Modules/Wiki/Code/WikiManager.cs | 2 +- .../Modules/Wiki/Code/WikiNotifySource.cs | 2 +- .../Modules/Wiki/Code/WikiStrExtentions.cs | 3 +- .../Wiki/Code/WikiSubscriptionManager.cs | 6 +- .../Modules/Wiki/Common/Constants.cs | 2 +- .../Modules/Wiki/Common/Extentions.cs | 2 +- .../Modules/Wiki/Common/PageDictionary.cs | 2 +- .../Wiki/Common/WikiActivityPublisher.cs | 2 +- .../Modules/Wiki/Common/WikiBasePage.cs | 2 +- .../Modules/Wiki/Common/WikiModuleSettings.cs | 2 +- .../Wiki/Common/WikiObjectsSecurityObject.cs | 2 +- .../Modules/Wiki/Common/WikiSearchHandler.cs | 4 +- .../Community/Modules/Wiki/Default.aspx | 2 +- .../Community/Modules/Wiki/Default.aspx.cs | 2 +- .../Community/Modules/Wiki/Diff.aspx.cs | 2 +- .../Modules/Wiki/Handlers/WikiFileHandler.cs | 2 +- .../Modules/Wiki/Handlers/WikiPageHandler.cs | 2 +- .../Modules/Wiki/Handlers/WikiSection.cs | 2 +- .../Modules/Wiki/ListCategories.aspx.cs | 4 +- .../Community/Modules/Wiki/ListFiles.aspx | 2 +- .../Community/Modules/Wiki/ListFiles.aspx.cs | 4 +- .../Community/Modules/Wiki/ListPages.aspx.cs | 6 +- .../Modules/Wiki/PageHistoryList.aspx.cs | 2 +- .../Community/Modules/Wiki/Wiki.Master.cs | 12 +- .../Community/Modules/Wiki/WikiModule.cs | 6 +- .../Modules/Wiki/WikiUC/EditFile.ascx.cs | 2 +- .../Modules/Wiki/WikiUC/EditPage.ascx.cs | 13 +- .../Modules/Wiki/WikiUC/ListFiles.ascx.cs | 2 +- .../Modules/Wiki/WikiUC/ListPages.ascx.cs | 2 +- .../Modules/Wiki/WikiUC/MiniToolbar.ascx.cs | 2 +- .../Modules/Wiki/WikiUC/ViewFile.ascx.cs | 2 +- .../Modules/Wiki/WikiUC/ViewPage.ascx.cs | 2 +- .../Community/Modules/Wiki/content/box.png | Bin 384 -> 0 bytes .../Community/Modules/Wiki/content/box.svg | 25 + .../Wiki/content/{main.css => main.less} | 932 +- .../Modules/Wiki/scripts/editpage.js | 2 +- .../Products/Community/Photos.aspx.cs | 2 +- .../Community/Product/CommunityProduct.cs | 2 +- .../Community/Product/CommunitySecurity.cs | 2 +- .../Product/CommunitySpaceUsageStatManager.cs | 2 +- .../Product/CommunitySubscriptionManager.cs | 2 +- .../Products/Community/Search/BlogsWrapper.cs | 2 +- .../Community/Search/BookmarksWrapper.cs | 2 +- .../Products/Community/Search/NewsWrapper.cs | 2 +- .../Products/Community/Search/PostWrapper.cs | 2 +- .../Products/Community/Search/TopicWrapper.cs | 2 +- .../Products/Community/Search/WikiWrapper.cs | 2 +- .../Products/Community/js/common.js | 2 +- .../Community/js/tagsautocompletebox.js | 4 +- .../Products/Community/web.config | 2 +- .../Products/Files/ASC.Web.Files.csproj | 126 +- .../ASC.Web.Studio/Products/Files/App.aspx.cs | 4 +- .../App_Themes/bright-blue/leftmenu.less | 8 +- .../Files/App_Themes/bright-blue/params.less | 37 + .../App_Themes/dark-bright-blue/leftmenu.less | 20 + .../App_Themes/dark-bright-blue/params.less | 40 + .../App_Themes/dark-dark-green/leftmenu.less | 21 + .../App_Themes/dark-dark-green/params.less | 40 + .../App_Themes/dark-deep-blue/leftmenu.less | 20 + .../App_Themes/dark-deep-blue/params.less | 40 + .../App_Themes/dark-default/leftmenu.less | 19 + .../Files/App_Themes/dark-default/params.less | 62 + .../Files/App_Themes/dark-green/leftmenu.less | 8 +- .../Files/App_Themes/dark-green/params.less | 39 + .../App_Themes/dark-pure-orange/leftmenu.less | 22 + .../App_Themes/dark-pure-orange/params.less | 40 + .../App_Themes/dark-wild-pink/leftmenu.less | 21 + .../App_Themes/dark-wild-pink/params.less | 40 + .../Files/App_Themes/deep-blue/leftmenu.less | 8 +- .../Files/App_Themes/deep-blue/params.less | 38 + .../App_Themes/default/{app.css => app.less} | 124 +- .../default/{common.css => common.less} | 51 +- .../Files/App_Themes/default/dark-common.less | 18 + .../{filechoice.css => filechoice.less} | 34 +- .../default/images/corporatefiles_big.png | Bin 1179 -> 0 bytes .../default/images/corporatefiles_big.svg | 21 + .../default/images/empty_screen.png | Bin 11405 -> 0 bytes .../default/images/empty_screen.svg | 36 + .../default/images/empty_screen_corporate.png | Bin 5712 -> 0 bytes .../default/images/empty_screen_corporate.svg | 52 + .../default/images/empty_screen_favorites.png | Bin 23781 -> 0 bytes .../default/images/empty_screen_favorites.svg | 16 + .../default/images/empty_screen_filter.png | Bin 14015 -> 0 bytes .../default/images/empty_screen_filter.svg | 56 + .../default/images/empty_screen_forme.png | Bin 5559 -> 0 bytes .../default/images/empty_screen_forme.svg | 38 + .../default/images/empty_screen_my.png | Bin 11405 -> 0 bytes .../default/images/empty_screen_my.svg | 36 + .../default/images/empty_screen_privacy.png | Bin 13047 -> 0 bytes .../default/images/empty_screen_privacy.svg | 34 + .../default/images/empty_screen_project.png | Bin 7028 -> 0 bytes .../default/images/empty_screen_project.svg | 31 + .../default/images/empty_screen_recent.png | Bin 6703 -> 0 bytes .../default/images/empty_screen_recent.svg | 45 + .../default/images/empty_screen_templates.png | Bin 5578 -> 0 bytes .../default/images/empty_screen_templates.svg | 67 + .../default/images/empty_screen_trash.png | Bin 16230 -> 0 bytes .../default/images/empty_screen_trash.svg | 21 + .../default/images/personal_convert.png | Bin 12466 -> 0 bytes .../default/images/personal_convert.svg | 123 + .../Files/App_Themes/default/leftmenu.less | 8 +- .../Files/App_Themes/default/params.less | 78 + .../default/{saveas.css => saveas.less} | 34 +- .../App_Themes/pure-orange/leftmenu.less | 8 +- .../Files/App_Themes/pure-orange/params.less | 40 + .../Files/App_Themes/wild-pink/leftmenu.less | 8 +- .../Files/App_Themes/wild-pink/params.less | 37 + .../Files/Configuration/FilesSettings.cs | 2 +- .../FilesSpaceUsageStatManager.cs | 29 +- .../Files/Configuration/ProductEntryPoint.cs | 2 +- .../Configuration/SubscriptionManager.cs | 2 +- .../AccessRights/AccessRights.ascx.cs | 2 +- .../Controls/AccessRights/FormFilling.ascx.cs | 34 +- .../Controls/AccessRights/accessrights.js | 2 +- .../{accessrights.css => accessrights.less} | 427 +- .../AccessRights/dark-accessrights.less | 19 + .../AccessRights/dark-formfilling.less | 19 + .../Controls/AccessRights/formfilling.js | 34 +- .../{formfilling.css => formfilling.less} | 38 +- .../Controls/AppBanner/AppBanner.ascx.cs | 2 +- .../{appbanner.css => appbanner.less} | 68 +- .../Controls/AppBanner/appbanner_icons.less | 30 + .../Controls/AppBanner/dark-appbanner.less | 32 + .../AppBanner/images/android_dark-theme.svg | 3 + .../images/android_gray_dark-theme.svg | 3 + .../AppBanner/images/ios_dark-theme.svg | 3 + .../AppBanner/images/ios_gray_dark-theme.svg | 3 + .../AppBanner/images/linux_dark-theme.svg | 9 + .../images/linux_gray_dark-theme.svg | 9 + .../AppBanner/images/mac_dark-theme.svg | 4 + .../AppBanner/images/mac_gray_dark-theme.svg | 4 + .../AppBanner/images/win_dark-theme.svg | 3 + .../AppBanner/images/win_gray_dark-theme.svg | 3 + .../ChunkUploadDialog/ChunkUploadDialog.ascx | 37 +- .../ChunkUploadDialog.ascx.cs | 2 +- ...ploaddialog.css => chunkuploaddialog.less} | 324 +- .../ChunkUploadDialog/chunkuploadmanager.js | 227 +- .../dark-chunkuploaddialog.less | 19 + .../Controls/ContentList/ContentList.ascx.cs | 2 +- .../{contentlist.css => contentlist.less} | 2309 ++--- .../ContentList/dark-contentlist.less | 19 + .../ContentList/images/throbber-dark-16.svg | 38 + .../ConvertFile/ConfirmConvert.ascx.cs | 2 +- .../Controls/ConvertFile/ConvertFile.ascx | 2 +- .../Controls/ConvertFile/ConvertFile.ascx.cs | 2 +- .../Controls/ConvertFile/confirmconvert.js | 2 +- ...confirmconvert.css => confirmconvert.less} | 20 +- .../Files/Controls/ConvertFile/convertfile.js | 9 +- .../{convertfile.css => convertfile.less} | 268 +- .../ConvertFile/dark-convertfile.less | 18 + .../ConvertFile/images/convert_alert.png | Bin 4473 -> 0 bytes .../ConvertFile/images/convert_alert.svg | 38 + .../Controls/CreateMenu/CreateMenu.ascx.cs | 2 +- .../Files/Controls/CreateMenu/createmenu.js | 6 +- .../Files/Controls/Desktop/Desktop.ascx.cs | 4 +- .../Files/Controls/Desktop/desktop.js | 6 +- .../Desktop/{desktop.css => desktop.less} | 34 +- .../Controls/EmptyFolder/EmptyFolder.ascx.cs | 24 +- .../Files/Controls/EmptyFolder/emptyfolder.js | 4 +- .../{emptyfolder.css => emptyfolder.less} | 80 +- .../FileChoisePopup/FileChoisePopup.ascx.cs | 34 +- .../FileChoisePopup/filechoisepopup.js | 5 +- ...lechoisepopup.css => filechoisepopup.less} | 34 +- .../FileSelector/FileSelector.ascx.cs | 2 +- .../Controls/FileSelector/fileselector.js | 18 +- .../{fileselector.css => fileselector.less} | 158 +- .../Controls/MainContent/MainContent.ascx | 20 +- .../Controls/MainContent/MainContent.ascx.cs | 11 +- .../MainContent/MainContent.ascx.designer.cs | 24 +- .../MainContent/MainContentFilter.ascx.cs | 34 +- .../MainContent/dark-maincontent.less | 19 + .../{maincontent.css => maincontent.less} | 494 +- .../Files/Controls/MainMenu/MainButton.ascx | 9 +- .../Controls/MainMenu/MainButton.ascx.cs | 36 +- .../Files/Controls/MainMenu/MainMenu.ascx | 6 +- .../Files/Controls/MainMenu/MainMenu.ascx.cs | 8 +- .../MoreFeatures/MoreFeatures.ascx.cs | 2 +- .../MoreFeatures/css/dark-morefeatures.less | 19 + .../{morefeatures.css => morefeatures.less} | 106 +- .../PrivateRoomOpenFile.ascx.cs | 44 +- .../dark-privateroomopenfile.less | 19 + .../privateroomopenfile.js | 33 +- ...mopenfile.css => privateroomopenfile.less} | 43 +- .../Files/Controls/Sailfish/Sailfish.ascx.cs | 4 +- .../Files/Controls/Sailfish/sailfish.js | 2 +- .../Sailfish/{sailfish.css => sailfish.less} | 43 +- .../Controls/SharingDialog/SharingDialog.ascx | 150 +- .../SharingDialog/SharingDialog.ascx.cs | 50 +- .../SharingDialog/dark-sharingdialog.less | 19 + .../SharingDialog/images/folder_link.svg | 4 + .../Controls/SharingDialog/images/link.svg | 4 +- .../SharingDialog/images/settings.svg | 2 +- .../Controls/SharingDialog/images/user.svg | 4 +- .../Controls/SharingDialog/sharingdialog.js | 896 +- .../{sharingdialog.css => sharingdialog.less} | 525 +- .../Controls/ThirdParty/ThirdParty.ascx.cs | 4 +- .../Controls/ThirdParty/dark-thirdparty.less | 29 + .../ThirdParty/images/svg/icon_box_small.svg | 3 - .../ThirdParty/images/svg/icon_dropbox.svg | 4 - .../images/svg/icon_google-drive_-dark.svg | 8 + .../ThirdParty/images/svg/icon_onedrive.svg | 3 - .../ThirdParty/images/svg/icon_onedrive_1.svg | 4 - .../ThirdParty/images/svg/icon_owncloud.svg | 3 - .../ThirdParty/images/svg/icon_sharepoint.svg | 4 - .../Files/Controls/ThirdParty/thirdparty.js | 2 +- .../{thirdparty.css => thirdparty.less} | 1424 +-- .../Products/Files/Controls/Tree/Tree.ascx | 104 +- .../Products/Files/Controls/Tree/Tree.ascx.cs | 4 +- .../Files/Controls/Tree/TreeBuilder.ascx.cs | 6 +- .../Files/Controls/Tree/dark-tree.less | 19 + .../Controls/Tree/images/loader-dark-12.svg | 38 + .../Files/Controls/Tree/leftmenu.less | 38 + .../Products/Files/Controls/Tree/tree.css | 259 - .../Products/Files/Controls/Tree/tree.js | 19 +- .../Products/Files/Controls/Tree/tree.less | 246 +- .../Files/Controls/Tree/treebuilder.js | 8 +- .../{treebuilder.css => treebuilder.less} | 42 +- .../UnsubscribeDialog.ascx.cs | 34 +- .../UnsubscribeDialog/unsubscribedialog.js | 34 +- .../Files/Core/Compress/CompressToArchive.cs | 33 +- .../Files/Core/Compress/CompressToTarGz.cs | 33 +- .../Files/Core/Compress/CompressToZip.cs | 33 +- .../Products/Files/Core/Compress/ICompress.cs | 34 +- .../Products/Files/Core/DIHelper.cs | 43 +- .../Files/Core/Dao/Interfaces/IDaoFactory.cs | 2 +- .../Files/Core/Dao/Interfaces/IFileDao.cs | 13 +- .../Files/Core/Dao/Interfaces/IFolderDao.cs | 13 +- .../Files/Core/Dao/Interfaces/ILinkDao.cs | 34 +- .../Files/Core/Dao/Interfaces/IProviderDao.cs | 2 +- .../Core/Dao/Interfaces/IProviderInfo.cs | 2 +- .../Files/Core/Dao/Interfaces/ITagDao.cs | 2 +- .../Files/Core/Dao/TeamlabDao/AbstractDao.cs | 31 +- .../Files/Core/Dao/TeamlabDao/DaoFactory.cs | 2 +- .../Files/Core/Dao/TeamlabDao/FileDao.cs | 423 +- .../Files/Core/Dao/TeamlabDao/FolderDao.cs | 256 +- .../Files/Core/Dao/TeamlabDao/LinkDao.cs | 105 +- .../Files/Core/Dao/TeamlabDao/SecurityDao.cs | 107 +- .../Files/Core/Dao/TeamlabDao/TagDao.cs | 210 +- .../Products/Files/Core/Entries/AuthData.cs | 6 +- .../Files/Core/Entries/AutoCleanUpData.cs | 34 +- .../Core/Entries/ChunkedUploadSession.cs | 2 +- .../Files/Core/Entries/EditHistory.cs | 2 +- .../Files/Core/Entries/EncryptionKeyPair.cs | 4 +- .../Files/Core/Entries/EntryProperties.cs | 34 +- .../Products/Files/Core/Entries/File.cs | 2 +- .../Products/Files/Core/Entries/FileEntry.cs | 26 +- .../Files/Core/Entries/FileEntryTypeEnum.cs | 2 +- .../Files/Core/Entries/FileReferenceData.cs | 39 + .../Products/Files/Core/Entries/Folder.cs | 8 +- .../Files/Core/Entries/ForcesaveType.cs | 2 +- .../Products/Files/Core/Entries/OrderBy.cs | 2 +- .../Products/Files/Core/Entries/Tag.cs | 2 +- .../Products/Files/Core/Entries/Thumbnail.cs | 2 +- .../Products/Files/Core/FilesIntegration.cs | 2 +- .../Products/Files/Core/FilterTypeEnum.cs | 2 +- .../Products/Files/Core/ResponseStream.cs | 2 +- .../Files/Core/Search/FilesWrapper.cs | 2 +- .../Files/Core/Search/FoldersWrapper.cs | 2 +- .../Files/Core/Security/FileSecurity.cs | 63 +- .../Products/Files/Core/Security/FileShare.cs | 2 +- .../Files/Core/Security/FileShareOptions.cs | 104 + .../Files/Core/Security/FileShareRecord.cs | 13 +- .../Files/Core/Security/IFileSecurity.cs | 2 +- .../Core/Security/IFileSecurityProvider.cs | 2 +- .../Files/Core/Security/ISecurityDao.cs | 4 +- .../Products/Files/Default.aspx.cs | 113 +- .../Products/Files/DocEditor.aspx.cs | 168 +- .../Products/Files/FileChoice.aspx.cs | 35 +- .../Products/Files/Helpers/Constants.cs | 4 +- .../Products/Files/Helpers/DocuSignHelper.cs | 34 +- .../Products/Files/Helpers/EasyBibHelper.cs | 36 +- .../Files/Helpers/FilesMessageService.cs | 2 +- .../Products/Files/Helpers/Global.cs | 2 +- .../Products/Files/Helpers/PathProvider.cs | 4 +- .../Files/Helpers/ThirdpartyConfiguration.cs | 2 +- .../Products/Files/Helpers/WordpressHelper.cs | 34 +- .../HttpHandlers/ChunkedUploaderHandler.cs | 25 +- .../Files/HttpHandlers/FileHandler.ashx.cs | 73 +- .../Files/HttpHandlers/SearchHandler.cs | 4 +- .../HttpHandlers/ThirdPartyAppHandler.ashx.cs | 2 +- .../HttpHandlers/docusignhandler.ashx.cs | 34 +- .../Files/Masters/BasicTemplate.Master.cs | 2 +- .../ClientScripts/FilesConstantsResources.cs | 16 +- .../FilesLocalizationResources.cs | 2 +- .../Files/Masters/EditorScripts.ascx.cs | 5 +- .../Products/Files/OpenPrivate.aspx.cs | 56 +- .../Resources/FilesCommonResource.Designer.cs | 66 +- .../Files/Resources/FilesCommonResource.resx | 30 +- .../Resources/FilesJSResource.Designer.cs | 37 +- .../Files/Resources/FilesJSResource.resx | 12 + .../Resources/FilesUCResource.Designer.cs | 162 + .../Files/Resources/FilesUCResource.resx | 54 + .../Files/Resources/FilesUCResource.ru.resx | 6 + .../Products/Files/SaveAs.aspx.cs | 30 +- .../Services/DocumentService/Configuration.cs | 163 +- .../DocbuilderReportsUtility.cs | 15 +- .../DocumentServiceConnector.cs | 2 +- .../DocumentService/DocumentServiceHelper.cs | 13 +- .../DocumentService/DocumentServiceParams.cs | 2 +- .../DocumentService/DocumentServiceTracker.cs | 30 +- .../Files/Services/FFmpegService/FFmpeg.cs | 2 +- .../Services/NotifyService/NotifyClient.cs | 2 +- .../Services/NotifyService/NotifyConstants.cs | 2 +- .../Services/NotifyService/NotifySource.cs | 2 +- .../WCFService/FileEntrySerializer.cs | 2 +- .../FileExceptionFilterAttribute.cs | 8 +- .../FileOperations/FileConflictResolveType.cs | 2 +- .../FileOperations/FileDeleteOperation.cs | 47 +- .../FileOperations/FileDownloadOperation.cs | 786 +- .../FileOperations/FileMarkAsReadOperation.cs | 2 +- .../FileOperations/FileMoveCopyOperation.cs | 36 +- .../FileOperations/FileOperation.cs | 52 +- .../FileOperations/FileOperationResult.cs | 2 +- .../FileOperations/FileOperationType.cs | 2 +- .../FileOperations/FileOperationsManager.cs | 57 +- .../FileStorageServiceController.cs | 337 +- .../WCFService/IFileStorageService.cs | 20 +- .../WCFService/Wrappers/AceWrapper.cs | 40 +- .../WCFService/Wrappers/BaseTypeWrapper.cs | 2 +- .../WCFService/Wrappers/DataWrapper.cs | 2 +- .../WCFService/Wrappers/MentionWrapper.cs | 2 +- .../WCFService/Wrappers/ThirdPartyParams.cs | 7 +- .../Products/Files/Share.aspx.cs | 26 +- .../Products/Files/ThirdPartyApp/BoxApp.cs | 4 +- .../Files/ThirdPartyApp/GoogleDriveApp.cs | 4 +- .../Files/ThirdPartyApp/IThirdPartyApp.cs | 2 +- .../Products/Files/ThirdPartyApp/Token.cs | 8 +- .../Files/Utils/ChunkedUploadSessionHolder.cs | 8 +- .../Products/Files/Utils/EntryManager.cs | 19 +- .../Products/Files/Utils/FileConverter.cs | 29 +- .../Products/Files/Utils/FileMarker.cs | 2 +- .../Products/Files/Utils/FileShareLink.cs | 388 +- .../Products/Files/Utils/FileSharing.cs | 96 +- .../Products/Files/Utils/FileTracker.cs | 11 +- .../Products/Files/Utils/FileUploader.cs | 37 +- .../Utils/FilesChunkedUploadSessionHolder.cs | 78 + .../Products/Files/Utils/MailMergeTask.cs | 2 +- .../Products/Files/Utils/SocketManager.cs | 34 +- .../Products/Files/Warmup.aspx.cs | 2 +- .../Products/Files/js/actionmanager.js | 93 +- .../Products/Files/js/anchormanager.js | 11 +- .../ASC.Web.Studio/Products/Files/js/auth.js | 2 +- .../Products/Files/js/common.js | 2 +- .../Products/Files/js/editor.js | 37 +- .../Products/Files/js/eventhandler.js | 26 +- .../Products/Files/js/filechoice.js | 11 +- .../Products/Files/js/filter.js | 8 +- .../Products/Files/js/foldermanager.js | 6 +- .../Products/Files/js/markernew.js | 2 +- .../Products/Files/js/mousemanager.js | 2 +- .../Products/Files/js/saveas.js | 17 +- .../Products/Files/js/servicemanager.js | 44 +- .../Products/Files/js/socketmanager.js | 34 +- .../Products/Files/js/templatemanager.js | 2 +- .../ASC.Web.Studio/Products/Files/js/ui.js | 67 +- .../Products/Files/loader-dark.html | 112 + .../ASC.Web.Studio/Products/Files/web.config | 2 +- .../Products/People/ASC.Web.People.csproj | 26 +- .../App_Themes/dark/dark-birthdays.less | 19 + .../People/App_Themes/dark/dark-carddav.less | 19 + .../App_Themes/dark/dark-people.master.less | 19 + .../People/App_Themes/dark/params.less | 37 + .../css/{birthdays.css => birthdays.less} | 38 +- .../default/css/{carddav.css => carddav.less} | 36 +- .../People/App_Themes/default/css/params.less | 39 + .../App_Themes/default/css/people.master.less | 28 +- .../default/images/birthdayEmpScr.png | Bin 23985 -> 0 bytes .../default/images/birthdayEmpScr.svg | 29 + .../default/images/product_logomiddle.png | Bin 4404 -> 0 bytes .../default/images/product_logomiddle.svg | 39 + .../App_Themes/default/imgs/birthday.png | Bin 775 -> 0 bytes .../App_Themes/default/imgs/birthday.svg | 14 + .../Products/People/Birthdays.aspx.cs | 49 +- .../Products/People/CardDavSettings.aspx.cs | 47 +- .../People/Classes/BirthdaysModule.cs | 34 +- .../People/Classes/BirthdaysNotifyClient.cs | 40 +- .../People/Classes/ImportParameters.cs | 34 +- .../Classes/PeopleSubscriptionManager.cs | 34 +- .../People/Core/Import/ContactInfo.cs | 34 +- .../People/Core/Import/ContactsUploader.cs | 2 +- .../Core/Import/ContactsUploaderResult.cs | 34 +- .../People/Core/Import/EncodingEnum.cs | 34 +- .../People/Core/Import/IUserImporter.cs | 34 +- .../People/Core/Import/ImportUsersTask.cs | 2 +- .../Core/Import/TextFileUserImporter.cs | 34 +- .../People/Core/Import/UserResults.cs | 34 +- .../Products/People/Core/PeopleProduct.cs | 2 +- .../Products/People/Core/SearchHendler.cs | 2 +- .../Products/People/Default.aspx | 1 + .../Products/People/Default.aspx.cs | 16 +- .../Products/People/Default.aspx.designer.cs | 25 +- .../Products/People/Help.aspx.cs | 2 +- .../Products/People/Import.aspx.cs | 34 +- .../ClientLocalizationResources.cs | 2 +- .../ClientScripts/ClientSettingsResources.cs | 36 +- .../ClientScripts/ClientTemplateResources.cs | 2 +- .../Masters/PeopleBaseTemplate.Master.cs | 16 +- .../Products/People/Profile.aspx.cs | 2 +- .../Products/People/ProfileAction.aspx | 3 + .../Products/People/ProfileAction.aspx.cs | 2 +- .../Products/People/Reassigns.aspx.cs | 34 +- .../People/Templates/PeopleTemplates.html | 13 +- .../Common/PeopleImportParserTests.cs | 34 +- .../ImportUsers/ImportUsers.ascx.cs | 46 +- .../ImportUsers/css/dark-import.less | 19 + .../UserControls/ImportUsers/css/import.less | 102 +- .../ImportUsers/images/from_file.png | Bin 894 -> 0 bytes .../ImportUsers/images/from_file.svg | 33 + .../ImportUsers/images/manually.png | Bin 948 -> 0 bytes .../ImportUsers/images/manually.svg | 15 + .../ImportUsers/js/importusers.js | 2 +- .../UserControls/SideButtonsPanel.ascx.cs | 34 +- .../UserControls/SideNavigationPanel.ascx.cs | 2 +- .../Products/People/Warmup.aspx.cs | 2 +- .../Products/People/js/birthdays.js | 34 +- .../Products/People/js/carddav.js | 19 +- .../People/js/departmentmanagement.js | 2 +- .../Products/People/js/filterhandler.js | 2 +- .../Products/People/js/navigatorhandler.js | 2 +- .../Products/People/js/peopleactions.js | 24 +- .../Products/People/js/peoplecontroller.js | 120 +- .../Products/People/js/peoplecore.js | 2 +- .../Products/People/js/peoplemanager.js | 2 +- .../Products/People/js/reassigns.js | 34 +- .../Products/People/js/sidenavigationpanel.js | 2 +- .../ASC.Web.Studio/Products/People/web.config | 2 +- .../Products/Projects/ASC.Web.Projects.csproj | 61 +- .../dark/dark-addmilestonecontainer.less | 19 + .../App_Themes/dark/dark-allprojects.less | 19 + .../Projects/App_Themes/dark/dark-common.less | 19 + .../Projects/App_Themes/dark/dark-full.less | 19 + .../App_Themes/dark/dark-ganttchart.less | 19 + .../Projects/App_Themes/dark/dark-params.less | 59 + .../App_Themes/dark/dark-reportsprint.less | 19 + .../App_Themes/dark/dark-settings.less | 19 + ...ntainer.css => addmilestonecontainer.less} | 691 +- .../App_Themes/default/css/allprojects.less | 41 +- .../App_Themes/default/css/alltasks.less | 576 +- .../App_Themes/default/css/common.less | 342 +- .../App_Themes/default/css/discussions.less | 19 +- .../Projects/App_Themes/default/css/full.less | 30 + .../css/{ganttchart.css => ganttchart.less} | 2178 ++-- .../default/css/{import.css => import.less} | 176 +- .../App_Themes/default/css/milestones.less | 270 +- .../App_Themes/default/css/params.less | 59 + .../{projectaction.css => projectaction.less} | 260 +- .../default/css/projectdocumentspopup.less | 2 +- .../App_Themes/default/css/projectteam.less | 60 +- ...ecttemplates.css => projecttemplates.less} | 522 +- .../default/css/{reports.css => reports.less} | 656 +- .../{reportsprint.css => reportsprint.less} | 193 +- .../App_Themes/default/css/settings.less | 12 +- .../App_Themes/default/css/timetracking.less | 61 +- .../images/dark_gantt_icons_left_panel.png | Bin 0 -> 605 bytes .../dashboard/design-project-hierarchy.png | Bin 8967 -> 0 bytes .../dashboard/design-project-hierarchy.svg | 37 + .../images/dashboard/manage-access-rights.png | Bin 13518 -> 0 bytes .../images/dashboard/manage-access-rights.svg | 14 + .../dashboard/track-time-and-progress.png | Bin 4501 -> 0 bytes .../dashboard/track-time-and-progress.svg | 75 + .../images/dashboard/use-more-tools.png | Bin 5609 -> 0 bytes .../images/dashboard/use-more-tools.svg | 18 + .../default/images/empty_screen_comments.png | Bin 3742 -> 0 bytes .../default/images/empty_screen_comments.svg | 17 + .../images/empty_screen_discussions.png | Bin 13885 -> 0 bytes .../images/empty_screen_discussions.svg | 57 + .../images/empty_screen_milestones.png | Bin 10195 -> 0 bytes .../images/empty_screen_milestones.svg | 26 + .../default/images/empty_screen_persons.png | Bin 18306 -> 0 bytes .../default/images/empty_screen_persons.svg | 19 + .../images/empty_screen_relatedtasks.png | Bin 2633 -> 0 bytes .../images/empty_screen_relatedtasks.svg | 37 + .../default/images/empty_screen_subtasks.png | Bin 7156 -> 0 bytes .../default/images/empty_screen_subtasks.svg | 39 + .../default/images/empty_screen_tasks.png | Bin 18012 -> 0 bytes .../default/images/empty_screen_tasks.svg | 33 + .../images/empty_screen_time_tracking.png | Bin 18082 -> 0 bytes .../images/empty_screen_time_tracking.svg | 19 + .../default/images/icon_empty_gantt.png | Bin 16398 -> 0 bytes .../default/images/icon_empty_gantt.svg | 74 + .../default/images/project-templates_logo.png | Bin 17522 -> 0 bytes .../default/images/project-templates_logo.svg | 118 + .../default/images/projects_logo.png | Bin 13174 -> 0 bytes .../default/images/projects_logo.svg | 120 + .../Products/Projects/Classes/BasePage.cs | 2 +- .../Projects/Classes/BaseUserControl.cs | 2 +- .../Products/Projects/Classes/Global.cs | 2 +- .../Products/Projects/Classes/NotifyHelper.cs | 2 +- .../Products/Projects/Classes/PathProvider.cs | 4 +- .../Projects/Classes/ProjectSecurityInfo.cs | 53 +- .../Classes/ProjectsCommonSettings.cs | 6 +- .../Products/Projects/Classes/ReportHelper.cs | 2 +- .../Products/Projects/Classes/ReportInfo.cs | 2 +- .../Projects/Classes/ReportTransformer.cs | 2 +- .../Projects/Classes/RequestContext.cs | 2 +- .../Products/Projects/Classes/ResultsView.cs | 2 +- .../Products/Projects/Classes/UrlAction.cs | 34 +- .../Products/Projects/Classes/UrlConstant.cs | 2 +- .../Projects/Classes/UrlParameters.cs | 2 +- .../Configuration/ProductEntryPoint.cs | 2 +- .../ProductSubscriptionManager.cs | 2 +- .../ProjectsSpaceUsageStatManager.cs | 9 +- .../Projects/Configuration/SearchHandler.cs | 4 +- .../Products/Projects/Contacts.aspx.cs | 4 +- .../Controls/Common/ButtonSidePanel.ascx.cs | 34 +- .../Controls/Common/CommonList.ascx.cs | 2 +- .../Common/NavigationSidePanel.ascx.cs | 2 +- .../Common/ProjectDocumentsPopup.ascx.cs | 2 +- .../Messages/DiscussionAction.ascx.cs | 2 +- .../Controls/Projects/ProjectAction.ascx.cs | 16 +- .../Controls/Reports/ReportFile.ascx.cs | 2 +- .../Controls/Reports/ReportFilters.ascx.cs | 2 +- .../Reports/ReportTemplateView.ascx.cs | 2 +- .../Controls/Reports/ReportView.ascx.cs | 2 +- .../Controls/Templates/EditTemplate.ascx.cs | 14 +- .../Products/Projects/Core/DIHelper.cs | 4 +- .../Products/Projects/Core/Dao/BaseDao.cs | 2 +- .../Products/Projects/Core/Dao/CommentDao.cs | 2 +- .../Products/Projects/Core/Dao/DaoFactory.cs | 2 +- .../Products/Projects/Core/Dao/MessageDao.cs | 2 +- .../Projects/Core/Dao/MilestoneDao.cs | 2 +- .../Projects/Core/Dao/ParticipantDao.cs | 2 +- .../Products/Projects/Core/Dao/ProjectDao.cs | 6 +- .../Products/Projects/Core/Dao/ReportDao.cs | 2 +- .../Products/Projects/Core/Dao/SearchDao.cs | 2 +- .../Products/Projects/Core/Dao/StatusDao.cs | 2 +- .../Products/Projects/Core/Dao/SubtaskDao.cs | 2 +- .../Products/Projects/Core/Dao/TagDao.cs | 2 +- .../Products/Projects/Core/Dao/TaskDao.cs | 2 +- .../Products/Projects/Core/Dao/TemplateDao.cs | 2 +- .../Projects/Core/Dao/TimeSpendDao.cs | 2 +- .../Core/Engine/CachedProjectEngine.cs | 2 +- .../Projects/Core/Engine/CommentEngine.cs | 2 +- .../Projects/Core/Engine/EngineFactory.cs | 2 +- .../Projects/Core/Engine/FileEngine.cs | 2 +- .../Projects/Core/Engine/MessageEngine.cs | 2 +- .../Projects/Core/Engine/MilestoneEngine.cs | 2 +- .../Projects/Core/Engine/ParticipantEngine.cs | 2 +- .../Projects/Core/Engine/ProjectEngine.cs | 2 +- .../Core/Engine/ProjectEntityEngine.cs | 2 +- .../Projects/Core/Engine/ProjectSecurity.cs | 2 +- .../Projects/Core/Engine/ProjectsReassign.cs | 34 +- .../Projects/Core/Engine/ReportEngine.cs | 2 +- .../Projects/Core/Engine/SearchEngine.cs | 2 +- .../Projects/Core/Engine/SecurityAdapter.cs | 2 +- .../Core/Engine/SecurityAdapterProvider.cs | 2 +- .../Projects/Core/Engine/StatusEngine.cs | 2 +- .../Projects/Core/Engine/SubtaskEngine.cs | 2 +- .../Projects/Core/Engine/TagEngine.cs | 2 +- .../Projects/Core/Engine/TaskEngine.cs | 2 +- .../Projects/Core/Engine/TemplateEngine.cs | 2 +- .../Core/Engine/TimeTrackingEngine.cs | 2 +- .../Core/Model/DataInterfaces/ICommentDao.cs | 2 +- .../Core/Model/DataInterfaces/IDaoFactory.cs | 2 +- .../Core/Model/DataInterfaces/IMessageDao.cs | 2 +- .../Model/DataInterfaces/IMilestoneDao.cs | 2 +- .../Model/DataInterfaces/IParticipantDao.cs | 2 +- .../Core/Model/DataInterfaces/IProjectDao.cs | 2 +- .../Core/Model/DataInterfaces/IReportDao.cs | 2 +- .../Core/Model/DataInterfaces/ISearchDao.cs | 2 +- .../Core/Model/DataInterfaces/IStatusDao.cs | 2 +- .../Core/Model/DataInterfaces/ISubtaskDao.cs | 2 +- .../Core/Model/DataInterfaces/ITagDao.cs | 2 +- .../Core/Model/DataInterfaces/ITaskDao.cs | 2 +- .../Core/Model/DataInterfaces/ITemplateDao.cs | 2 +- .../Model/DataInterfaces/ITimeSpendDao.cs | 2 +- .../Core/Model/Domain/CustomStatus.cs | 14 +- .../Core/Model/Domain/DomainObject.cs | 6 +- .../Core/Model/Domain/Entities/Comment.cs | 2 +- .../Domain/Entities/Enums/AverageTimeEnum.cs | 34 +- .../Domain/Entities/Enums/EntityTypeEnum.cs | 2 +- .../Entities/Enums/LocalizedEnumConverter.cs | 2 +- .../Entities/Enums/MilestoneStatusEnum.cs | 2 +- .../Domain/Entities/Enums/ModuleTypeEnum.cs | 2 +- .../Entities/Enums/PaymentStatusEnum.cs | 2 +- .../Entities/Enums/ProjectStatusEnum.cs | 2 +- .../Entities/Enums/ProjectTeamSecurity.cs | 2 +- .../Domain/Entities/Enums/TaskLinkTypeEnum.cs | 2 +- .../Domain/Entities/Enums/TaskPriorityEnum.cs | 2 +- .../Domain/Entities/Enums/TaskStatusEnum.cs | 2 +- .../Domain/Entities/Feed/CommentUpdates.cs | 2 +- .../Core/Model/Domain/Entities/Message.cs | 2 +- .../Core/Model/Domain/Entities/Milestone.cs | 13 +- .../Core/Model/Domain/Entities/Participant.cs | 15 +- .../Model/Domain/Entities/ParticipantFull.cs | 2 +- .../Core/Model/Domain/Entities/Project.cs | 23 +- .../Core/Model/Domain/Entities/Subtask.cs | 13 +- .../Core/Model/Domain/Entities/Task.cs | 21 +- .../Core/Model/Domain/Entities/TaskLink.cs | 6 +- .../Core/Model/Domain/Entities/Template.cs | 2 +- .../Core/Model/Domain/Entities/TimeSpend.cs | 2 +- .../Model/Domain/FilterOperationResult.cs | 2 +- .../Core/Model/Domain/ProjectEntity.cs | 12 +- .../Core/Model/Domain/Reports/ReportFile.cs | 41 +- .../Core/Model/Domain/Reports/ReportFilter.cs | 2 +- .../Domain/Reports/ReportFilterSerializer.cs | 2 +- .../Model/Domain/Reports/ReportTemplate.cs | 2 +- .../Domain/Reports/ReportTimeInterval.cs | 2 +- .../Core/Model/Domain/Reports/ReportType.cs | 2 +- .../Model/Domain/Reports/ReportViewType.cs | 2 +- .../Projects/Core/Model/Domain/TaskFilter.cs | 2 +- .../Services/NotifyService/NotifyClient.cs | 2 +- .../Services/NotifyService/NotifyConstants.cs | 2 +- .../Services/NotifyService/NotifySource.cs | 2 +- .../Projects/Core/Search/CommentsWrapper.cs | 2 +- .../Core/Search/DiscussionsWrapper.cs | 2 +- .../Projects/Core/Search/MilestonesWrapper.cs | 2 +- .../Projects/Core/Search/ProjectsWrapper.cs | 2 +- .../Projects/Core/Search/SubtasksWrapper.cs | 2 +- .../Projects/Core/Search/TasksWrapper.cs | 2 +- .../Products/Projects/Default.aspx.cs | 2 +- .../Products/Projects/GanttChart.aspx | 4 +- .../Products/Projects/GanttChart.aspx.cs | 12 +- .../Products/Projects/Help.aspx.cs | 2 +- .../Projects/Masters/BasicTemplate.Master.cs | 40 +- .../ClientLocalizationResources.cs | 2 +- .../ClientScripts/ClientTemplateResources.cs | 2 +- .../ClientScripts/ClientUserResources.cs | 2 +- .../Products/Projects/Messages.aspx.cs | 2 +- .../Products/Projects/Milestones.aspx.cs | 2 +- .../Products/Projects/ProjectTeam.aspx.cs | 2 +- .../Projects/ProjectTemplates.aspx.cs | 2 +- .../Products/Projects/Projects.aspx.cs | 2 +- .../ActionPanelsTemplates.html | 2 +- .../Products/Projects/Reports.aspx.cs | 2 +- .../Products/Projects/Settings.aspx.cs | 30 +- .../Products/Projects/TMDocs.aspx.cs | 53 +- .../Products/Projects/Tasks.aspx.cs | 2 +- .../Products/Projects/Test/BaseTest.cs | 34 +- .../Projects/Test/CustomCaseAttribute.cs | 34 +- .../Products/Projects/Test/DataGenerator.cs | 2 +- .../Products/Projects/Test/DiscussionTest.cs | 34 +- .../Products/Projects/Test/MilestonesTest.cs | 34 +- .../Products/Projects/Test/ProjectsTest.cs | 34 +- .../Products/Projects/Test/ReassignTest.cs | 34 +- .../Products/Projects/Test/SearchTest.cs | 10 +- .../Projects/Test/TaskSecurityTest.cs | 34 +- .../Products/Projects/Test/TasksTest.cs | 34 +- .../Projects/Test/TimeTrackingTest.cs | 34 +- .../Products/Projects/TimeTracking.aspx.cs | 2 +- .../Products/Projects/Timer.aspx.cs | 2 +- .../Products/Projects/Warmup.aspx.cs | 2 +- .../Projects/js/addmilestonecontainer.js | 2 +- .../Products/Projects/js/apitimetraking.js | 2 +- .../Products/Projects/js/base.js | 2 +- .../Products/Projects/js/common.js | 10 +- .../Projects/js/common_filter_projects.js | 2 +- .../Products/Projects/js/contacts.js | 2 +- .../Products/Projects/js/discussions.js | 2 +- .../Products/Projects/js/ganttchart.js | 840 +- .../Products/Projects/js/ganttchart_min.js | 19 +- .../Products/Projects/js/ganttchart_ver.js | 34 +- .../Products/Projects/js/ganttchartpage.js | 18 +- .../Products/Projects/js/helper.js | 2 +- .../Products/Projects/js/import.js | 2 +- .../Projects/js/jq_projects_extensions.js | 2 +- .../js/jquery-tagsadvansedselector.js | 34 +- .../Products/Projects/js/milestoneaction.js | 2 +- .../Products/Projects/js/milestones.js | 2 +- .../Products/Projects/js/navsidepanel.js | 2 +- .../Products/Projects/js/projectaction.js | 2 +- .../Projects/js/projectdocumentspopup.js | 2 +- .../Products/Projects/js/projectnavpanel.js | 2 +- .../Products/Projects/js/projects.js | 2 +- .../Products/Projects/js/projectteam.js | 22 +- .../Products/Projects/js/projecttemplates.js | 2 +- .../Products/Projects/js/reports.js | 2 +- .../Products/Projects/js/settings.js | 4 +- .../Products/Projects/js/subtasks.js | 11 +- .../Products/Projects/js/taskaction.js | 2 +- .../Products/Projects/js/taskdescription.js | 2 +- .../Products/Projects/js/tasks.js | 4 +- .../Products/Projects/js/timetracking.js | 2 +- .../Products/Projects/web.config | 2 +- .../Products/Sample/ASC.Web.Sample.csproj | 11 +- .../Products/Sample/Api.aspx.cs | 34 +- .../Sample/App_Themes/dark/dark-style.less | 18 + .../Sample/App_Themes/dark/params.less | 19 + .../Sample/App_Themes/default/css/params.less | 19 + .../Sample/App_Themes/default/css/style.less | 89 +- .../Products/Sample/Classes/PathProvider.cs | 34 +- .../Products/Sample/Classes/SampleClass.cs | 34 +- .../Products/Sample/Classes/SampleDao.cs | 38 +- .../Sample/Classes/SearchResultsView.cs | 34 +- .../Sample/Configuration/ProductEntryPoint.cs | 34 +- .../Configuration/SampleSearchHandler.cs | 36 +- .../Sample/Controls/ButtonsSidePanel.ascx.cs | 34 +- .../Controls/NavigationSidePanel.ascx.cs | 34 +- .../Products/Sample/Database.aspx | 4 +- .../Products/Sample/Database.aspx.cs | 34 +- .../Products/Sample/Default.aspx.cs | 34 +- .../Products/Sample/Elements.aspx.cs | 34 +- .../Products/Sample/Help.aspx.cs | 34 +- .../Sample/Masters/BasicTemplate.Master.cs | 44 +- .../ClientLocalizationResources.cs | 34 +- .../Products/Sample/Styles.aspx.cs | 34 +- .../Products/Sample/UserControls.aspx.cs | 34 +- .../Products/Sample/js/script.js | 2 +- .../ASC.Web.Studio/Products/Sample/web.config | 2 +- .../PublicResources/Resource.Designer.cs | 666 +- .../PublicResources/Resource.az-Latn-AZ.resx | 10 - .../PublicResources/Resource.bg.resx | 9 - .../PublicResources/Resource.cs.resx | 9 - .../PublicResources/Resource.de.resx | 9 - .../PublicResources/Resource.es.resx | 9 - .../PublicResources/Resource.fa.resx | 3 - .../PublicResources/Resource.fi.resx | 9 - .../PublicResources/Resource.fr.resx | 9 - .../PublicResources/Resource.he.resx | 6 - .../PublicResources/Resource.hu.resx | 6 - .../PublicResources/Resource.id.resx | 9 - .../PublicResources/Resource.it.resx | 9 - .../PublicResources/Resource.ja.resx | 9 - .../PublicResources/Resource.ko.resx | 6 - .../PublicResources/Resource.lv.resx | 11 - .../PublicResources/Resource.nl.resx | 9 - .../PublicResources/Resource.pl.resx | 9 - .../PublicResources/Resource.pt-BR.resx | 10 - .../PublicResources/Resource.pt.resx | 7 - .../PublicResources/Resource.resx | 232 +- .../PublicResources/Resource.ru.resx | 9 - .../PublicResources/Resource.sk.resx | 9 - .../PublicResources/Resource.sl.resx | 9 - .../PublicResources/Resource.sv.resx | 3 - .../PublicResources/Resource.tr.resx | 9 - .../PublicResources/Resource.uk.resx | 10 - .../PublicResources/Resource.vi.resx | 9 - .../PublicResources/Resource.zh-CN.resx | 9 - .../PublicResources/Resource.zh-TW.resx | 11 - .../PublicResources/ResourceJS.Designer.cs | 108 + .../PublicResources/ResourceJS.resx | 36 + .../UserControlsCommonResource.Designer.cs | 38 +- .../UserControlsCommonResource.resx | 75 +- .../WhiteLabelResource.Designer.cs | 15 +- .../WhiteLabelResource.az-Latn-AZ.resx | 3 - .../PublicResources/WhiteLabelResource.resx | 7 +- web/studio/ASC.Web.Studio/Search.aspx.cs | 4 +- web/studio/ASC.Web.Studio/ServerError.aspx.cs | 2 +- .../Services/WhatsNew/feed.ashx.cs | 2 +- .../ASC.Web.Studio/StartScriptsStyles.aspx.cs | 2 +- web/studio/ASC.Web.Studio/Startup.cs | 2 +- web/studio/ASC.Web.Studio/Tariffs.aspx.cs | 2 +- .../Templates/CommonTemplates.html | 76 +- .../Templates/ManagementTemplates.html | 2 +- web/studio/ASC.Web.Studio/Terms.aspx.cs | 2 +- .../ASC.Web.Studio/ThirdParty/Box.aspx.cs | 34 +- .../ThirdParty/DocuSign.aspx.cs | 34 +- .../ASC.Web.Studio/ThirdParty/Dropbox.aspx.cs | 34 +- .../ASC.Web.Studio/ThirdParty/Google.aspx.cs | 2 +- .../ThirdParty/ImportContacts/ContactInfo.cs | 2 +- .../ThirdParty/ImportContacts/Google.aspx.cs | 2 +- .../ThirdParty/ImportContacts/Import.aspx.cs | 2 +- .../ImportContacts/ImportLogin.Master.cs | 34 +- .../ASC.Web.Studio/ThirdParty/Login.Master.cs | 34 +- .../ThirdParty/OneDrive.aspx.cs | 2 +- .../ThirdParty/Wordpress.aspx.cs | 34 +- .../ThirdParty/plugin/wordpress/icon.png | Bin 4822 -> 0 bytes .../ThirdParty/plugin/wordpress/icon.svg | 16 + .../Common/ActivateEmailPanel.ascx.cs | 2 +- .../Common/Attachments/Attachments.ascx.cs | 16 +- .../Common/Attachments/css/attachments.less | 22 +- .../Attachments/css/dark-attachments.less | 19 + .../Attachments/images/documents-logo.png | Bin 24348 -> 0 bytes .../Attachments/images/documents-logo.svg | 43 + .../Common/Attachments/js/attachments.js | 2 +- .../Common/Authorize/Authorize.ascx | 2 +- .../Common/Authorize/Authorize.ascx.cs | 53 +- .../Common/Authorize/css/authorize.less | 6 +- .../Common/Authorize/css/dark-authorize.less | 19 + .../Common/Authorize/js/authorize.js | 2 +- .../Common/Authorize/js/desktop.js | 2 +- .../Authorize/js/recaptchacontroller.js | 2 +- .../Common/AuthorizeDocs/AuthorizeDocs.ascx | 2 +- .../AuthorizeDocs/AuthorizeDocs.ascx.cs | 59 +- .../AuthorizeDocsCustomMode.ascx | 2 +- .../AuthorizeDocs/css/authorizedocs.less | 98 +- .../Common/AuthorizeDocs/css/custom-mode.less | 38 +- .../AuthorizeDocs/css/dark-authorizedocs.less | 19 + .../AuthorizeDocs/css/dark-custom-mode.less | 19 + .../Common/AuthorizeDocs/js/authorizedocs.js | 2 +- .../AuthorizeDocs/js/review_builder_script.js | 34 +- .../Common/AuthorizeDocs/js/reviews.js | 34 +- .../ChooseTimePeriod/ChooseTimePeriod.ascx.cs | 2 +- .../css/choosetimeperiod.less | 2 +- .../ChooseTimePeriod/js/choosetimeperiod.js | 2 +- .../Common/Comments/CommentInfo.cs | 16 +- .../UserControls/Common/Comments/Comments.cs | 2 +- .../Comments/css/codehighlighter/vs.less | 34 +- .../Common/Comments/js/comments.js | 16 +- .../Common/Confirm/Confirm.ascx.cs | 2 +- .../UserControls/Common/Confirm/js/confirm.js | 2 +- .../Common/HelpCenter/HelpCenter.ascx | 2 +- .../Common/HelpCenter/HelpCenter.ascx.cs | 13 +- .../HelpCenter/css/dark-help-center.less | 19 + .../Common/HelpCenter/css/help-center.less | 18 +- .../Common/HelpCenter/js/help-center.js | 2 +- .../Common/InviteLink/InviteLink.ascx.cs | 2 +- .../Common/InviteLink/js/invitelink.js | 34 +- .../Common/LoaderPage/LoaderPage.ascx.cs | 12 +- .../LoaderPage/css/dark-loaderpage.less | 19 + .../Common/LoaderPage/css/loaderpage.less | 109 +- .../Common/LoginWithThirdParty.ascx.cs | 4 +- .../Common/MediaViewer/MediaPlayer.ascx.cs | 48 +- .../Common/MediaViewer/dark-mediaplayer.less | 19 + .../Common/MediaViewer/imageviewer.js | 34 +- .../Common/MediaViewer/mediaplayer.js | 6 +- .../{mediaplayer.css => mediaplayer.less} | 60 +- .../MigrationPortal/MigrationPortal.ascx.cs | 34 +- .../MigrationPortal/css/migrationportal.less | 36 +- .../MigrationPortal/js/migrationportal.js | 34 +- .../PersonalFooter/PersonalFooter.ascx.cs | 14 +- .../css/dark-personalfooter.less | 19 + .../PersonalFooter/css/personalfooter.less | 22 +- .../PersonalFooter/js/personalfooter.js | 2 +- .../UserControls/Common/PollForm/PollForm.cs | 2 +- .../Common/PollForm/PollFormMaster.cs | 4 +- .../PollForm/css/{style.css => style.less} | 82 +- .../Common/PollForm/js/pollform.js | 2 +- .../PortalEncryption/PortalEncryption.ascx.cs | 34 +- .../css/portalencryption.less | 37 +- .../PortalEncryption/js/portalencryption.js | 34 +- .../PreparationPortal.ascx.cs | 2 +- ...ationportal.css => preparationportal.less} | 210 +- .../PreparationPortal/js/preparationportal.js | 2 +- .../Common/Search/SearchResults.ascx.cs | 14 +- .../Common/Search/css/dark-searchresults.less | 19 + .../Common/Search/css/searchResults.less | 14 +- .../Common/Search/js/searchresults.js | 2 +- .../SharingSettings/SharingSettings.ascx.cs | 2 +- .../bright-blue/sharingsettingsparams.less | 34 +- .../sharingsettingsparams.less | 23 + .../sharingsettingsparams.less | 23 + .../dark-deep-blue/sharingsettingsparams.less | 23 + .../dark-default/sharingsettingsparams.less | 23 + .../css/dark-green/sharingsettingsparams.less | 34 +- .../sharingsettingsparams.less | 23 + .../dark-wild-pink/sharingsettingsparams.less | 23 + .../css/deep-blue/sharingsettingsparams.less | 34 +- .../css/default/baseparams.less | 34 +- .../css/default/sharingsettings.less | 11 +- .../css/default/sharingsettingsparams.less | 34 +- .../pure-orange/sharingsettingsparams.less | 34 +- .../css/wild-pink/sharingsettingsparams.less | 34 +- .../SharingSettings/js/sharingsettings.js | 2 +- .../Common/SmallChat/SmallChat.ascx.cs | 12 +- .../Common/SmallChat/css/dark-smallchat.less | 19 + .../SmallChat/css/jquery.cssemoticons.css | 34 +- .../css/{smallchat.css => smallchat.less} | 1446 +-- .../Common/SmallChat/js/smallchat.js | 2 +- .../UserControls/Common/Support/Support.ascx | 2 +- .../Common/Support/Support.ascx.cs | 2 +- .../Common/Support/SupportChat.ascx.cs | 2 +- .../UserControls/Common/Support/livechat.js | 34 +- .../Common/TopStudioPanel/TopStudioPanel.ascx | 15 +- .../TopStudioPanel/TopStudioPanel.ascx.cs | 17 +- .../TopStudioPanel/VoipPhoneControl.ascx.cs | 6 +- .../Common/UserForum/UserForum.ascx.cs | 2 +- .../Common/VideoGuides/VideoGuides.ascx | 2 +- .../Common/VideoGuides/VideoGuides.ascx.cs | 2 +- .../Common/VideoGuides/js/videoguides.js | 2 +- .../Common/ViewSwitcher/ViewSwitcher.cs | 16 +- .../ViewSwitcher/ViewSwitcherBaseItem.cs | 2 +- .../ViewSwitcher/ViewSwitcherLinkItem.cs | 2 +- .../ViewSwitcher/ViewSwitcherTabItem.cs | 2 +- .../ViewSwitcher/css/dark-viewswitcher.less | 19 + .../{viewswitcher.css => viewswitcher.less} | 120 +- .../Common/ViewSwitcher/js/viewswitcher.js | 2 +- .../UserControls/Common/ckeditor/config.js | 3 + .../UserControls/Common/ckeditor/contents.css | 5 + .../ckeditor/skins/dark-teamlab/dialog.css | 54 + .../ckeditor/skins/dark-teamlab/dialog_ie.css | 53 + .../skins/dark-teamlab/dialog_ie7.css | 5 + .../skins/dark-teamlab/dialog_ie8.css | 5 + .../skins/dark-teamlab/dialog_iequirks.css | 5 + .../skins/dark-teamlab/dialog_opera.css | 53 + .../ckeditor/skins/dark-teamlab/editor.css | 8 + .../skins/dark-teamlab/editor_gecko.css | 7 + .../ckeditor/skins/dark-teamlab/editor_ie.css | 5 + .../skins/dark-teamlab/editor_ie7.css | 5 + .../skins/dark-teamlab/editor_ie8.css | 5 + .../skins/dark-teamlab/editor_iequirks.css | 5 + .../ckeditor/skins/dark-teamlab/icons.png | Bin 0 -> 10791 bytes .../skins/dark-teamlab/icons_hidpi.png | Bin 0 -> 24616 bytes .../skins/dark-teamlab/images/arrow.png | Bin 0 -> 156 bytes .../dark-teamlab/images/close-ckeditor.png | Bin 0 -> 615 bytes .../skins/dark-teamlab/images/close.png | Bin 0 -> 130 bytes .../skins/dark-teamlab/images/hidpi/close.png | Bin 0 -> 1185 bytes .../dark-teamlab/images/hidpi/lock-open.png | Bin 0 -> 1258 bytes .../skins/dark-teamlab/images/hidpi/lock.png | Bin 0 -> 1242 bytes .../dark-teamlab/images/hidpi/refresh.png | Bin 0 -> 1842 bytes .../skins/dark-teamlab/images/lock-open.png | Bin 0 -> 349 bytes .../skins/dark-teamlab/images/lock.png | Bin 0 -> 475 bytes .../skins/dark-teamlab/images/refresh.png | Bin 0 -> 422 bytes .../ckeditor/skins/dark-teamlab/readme.md | 51 + .../ckeditor/skins/dark-teamlab/skin.js | 0 .../UserControls/DeepLink/DeepLinkData.cs | 25 +- .../UserControls/DeepLink/DeepLinkDataFile.cs | 19 +- .../DeepLink/DeepLinkDataFolder.cs | 19 +- .../UserControls/DeepLink/DeepLinking.ascx | 11 +- .../UserControls/DeepLink/DeepLinking.ascx.cs | 126 +- .../DeepLink/css/dark-deeplinking.less | 19 + .../DeepLink/css/deeplinking.less | 35 +- .../UserControls/DeepLink/js/deeplinking.js | 33 +- .../CRMDashboardEmptyScreen.ascx.cs | 2 +- .../CommunityDashboardEmptyScreen.ascx.cs | 2 +- .../FilesDashboardEmptyScreen.ascx.cs | 34 +- .../ManagerDashboardEmptyScreen.ascx.cs | 2 +- .../EmptyScreens/WelcomeDashboard.ascx.cs | 34 +- .../UserControls/EmptyScreens/js/dashboard.js | 38 +- .../UserControls/Feed/FeedList.ascx.cs | 12 +- .../Feed/NewNavigationPanel.ascx.cs | 2 +- .../UserControls/Feed/css/dark-feed.less | 19 + .../UserControls/Feed/css/feed.less | 12 +- .../UserControls/Feed/images/empty_filter.png | Bin 7872 -> 0 bytes .../UserControls/Feed/images/empty_filter.svg | 32 + .../Feed/images/empty_screen_feed.png | Bin 9452 -> 0 bytes .../Feed/images/empty_screen_feed.svg | 46 + .../UserControls/Feed/js/feed.filter.js | 2 +- .../UserControls/Feed/js/feed.js | 2 +- .../FirstTime/EmailAndPassword.ascx | 8 +- .../FirstTime/EmailAndPassword.ascx.cs | 19 +- .../FirstTime/StepContainer.ascx.cs | 16 +- .../FirstTime/css/dark-emailandpassword.less | 19 + .../FirstTime/css/dark-stepcontainer.less | 19 + .../FirstTime/css/emailandpassword.less | 8 +- .../FirstTime/css/images/warning_16.png | Bin 576 -> 0 bytes .../FirstTime/css/images/warning_16.svg | 15 + .../FirstTime/css/stepcontainer.less | 6 +- .../UserControls/FirstTime/js/manager.js | 2 +- .../UserControls/FirstTime/js/view.js | 2 +- .../Management/AccessRights/AccessRights.ascx | 6 +- .../AccessRights/AccessRights.ascx.cs | 15 +- .../AccessRights/css/accessrights.less | 18 +- .../AccessRights/css/dark-accessrights.less | 19 + .../AccessRights/js/accessrights.js | 4 +- .../AdminHelperSettings.ascx.cs | 46 +- .../css/adminhelpersettings.less | 36 +- .../css/dark-adminhelpersettings.less | 19 + .../js/adminhelpersettings.js | 33 +- .../AdminMessageSettings.ascx.cs | 2 +- .../AdminMessageSettings/css/admmess.less | 2 +- .../AdminMessageSettings/js/admmess.js | 2 +- .../AdminSettings/ConfirmPortalOwner.ascx.cs | 2 +- .../Management/AuditTrail/AuditTrail.ascx.cs | 4 +- .../Management/AuditTrail/css/audittrail.less | 2 +- .../img/audit_trail_empty_screen.jpg | Bin 6028 -> 0 bytes .../img/audit_trail_empty_screen.svg | 49 + .../Management/AuditTrail/js/audittrail.js | 2 +- .../AuthorizationKeys/AuthService.cs | 12 +- .../AuthorizationKeys/AuthorizationKeys.ascx | 2 +- .../AuthorizationKeys.ascx.cs | 16 +- ...izationkeys.css => authorizationkeys.less} | 212 +- .../css/dark-authorizationkeys.less | 19 + .../Management/AuthorizationKeys/img/box.svg | 12 +- .../AuthorizationKeys/js/authorizationkeys.js | 13 +- .../Management/Backup/Backup.ascx.cs | 33 +- .../Management/Backup/css/backup.less | 27 +- .../Management/Backup/js/backup.js | 170 +- .../Management/Backup/js/consumersettings.js | 198 + .../Management/ColorThemes/ColorThemes.ascx | 2 +- .../ColorThemes/ColorThemes.ascx.cs | 13 +- .../css/{colorthemes.css => colorthemes.less} | 74 +- .../img/dark_mode_themes_previews_sprite.png | Bin 0 -> 49343 bytes .../css/img/themes_previews_sprite.png | Bin 44077 -> 100371 bytes .../Management/ColorThemes/js/colorthemes.js | 2 +- .../ConfirmActivation/ConfirmActivation.ascx | 12 +- .../ConfirmActivation.ascx.cs | 23 +- .../css/confirmactivation.less | 24 +- .../css/dark-confirmactivation.less | 19 + .../ConfirmActivation/js/confirmactivation.js | 2 +- .../ConfirmInviteActivation.ascx | 6 +- .../ConfirmInviteActivation.ascx.cs | 23 +- .../css/confirm_invite_activation.less | 28 +- .../css/dark-confirm_invite_activation.less | 19 + .../js/confirm_invite_activation.js | 2 +- .../Management/ConfirmPortalActivity.ascx.cs | 2 +- .../CookieSettings/CookieSettings.ascx.cs | 2 +- .../CookieSettings/js/cookiesettings.js | 34 +- .../CustomNavigation/CustomNavigation.ascx.cs | 34 +- .../CustomNavigation/LogoUploader.cs | 2 +- .../css/customnavigation.less | 34 +- .../CustomNavigation/js/customnavigation.js | 34 +- .../DeactivatePortal/DeactivatePortal.ascx.cs | 2 +- .../DeactivatePortal/js/deactivateportal.js | 2 +- .../DefaultPageSettings.ascx.cs | 2 +- .../DefaultPageSettings/js/defaultpage.js | 2 +- .../DnsSettings/DnsSettings.ascx.cs | 2 +- .../Management/DnsSettings/dnssettings.js | 2 +- .../Management/DocService/DocService.ascx.cs | 4 +- .../css/{docservice.css => docservice.less} | 24 +- .../Management/DocService/js/docservice.js | 2 +- .../FullTextSearch/FullTextSearch.ascx.cs | 4 +- ...fulltextsearch.css => fulltextsearch.less} | 34 +- .../FullTextSearch/js/fulltextsearch.js | 34 +- .../GreetingLogoSettings.ascx | 2 +- .../GreetingLogoSettings.ascx.cs | 12 +- .../GreetingSettings/GreetingSettings.ascx.cs | 2 +- .../GreetingSettings/LogoUploader.cs | 2 +- .../css/greetingsettings.less | 2 +- .../js/greetinglogosettings.js | 2 +- .../GreetingSettings/js/greetingsettings.js | 2 +- .../ImpersonateUser/ImpersonateSettings.ascx | 91 + .../ImpersonateSettings.ascx.cs | 45 + .../ImpersonateSettings.ascx.designer.cs | 17 + .../ImpersonateUserConfirmationPanel.ascx | 24 + .../ImpersonateUserConfirmationPanel.ascx.cs | 43 + ...nateUserConfirmationPanel.ascx.designer.cs | 26 + .../css/impersonatesettings.less | 84 + .../css/impersonateuserconfirmationpanel.less | 26 + .../ImpersonateUser/js/impersonatesettings.js | 453 + .../js/impersonateuserconfirmationpanel.js | 62 + .../InvitePanel/InvitePanel.ascx.cs | 12 +- .../InvitePanel/css/dark-invitepanel.less | 19 + .../css/img/themes_previews_sprite.png | Bin 66962 -> 0 bytes .../InvitePanel/css/invitepanel.less | 40 +- .../Management/InvitePanel/js/invitepanel.js | 2 +- .../Management/IpSecurity/IpSecurity.ascx | 9 +- .../Management/IpSecurity/IpSecurity.ascx.cs | 2 +- .../Management/IpSecurity/css/ipsecurity.less | 8 +- .../Management/IpSecurity/js/ipsecurity.js | 51 +- .../LdapSettings/LdapSettings.ascx.cs | 17 +- .../css/Default/dark-ldapsettings.less | 19 + .../{ldapsettings.css => ldapsettings.less} | 642 +- .../LdapSettings/js/ldapsettings.js | 10 +- .../LoginHistory/LoginHistory.ascx.cs | 14 +- .../LoginHistory/css/dark-loginhistory.less | 19 + .../LoginHistory/css/loginhistory.less | 6 +- .../img/login_history_empty_screen.jpg | Bin 7657 -> 0 bytes .../img/login_history_empty_screen.svg | 69 + .../LoginHistory/js/loginhistory.js | 2 +- .../LoginSettings/LoginSettings.ascx | 31 + .../LoginSettings/LoginSettings.ascx.cs | 41 + .../LoginSettings.ascx.designer.cs | 17 + .../LoginSettings/css/loginsettings.less | 27 + .../LoginSettings/js/loginsettings.js | 66 + .../MailDomainSettings.ascx.cs | 2 +- .../css/maildomainsettings.less | 2 +- .../js/maildomainsettings.js | 2 +- .../MailService/MailService.ascx.cs | 36 +- .../css/{mailservice.css => mailservice.less} | 34 +- .../Management/MailService/js/mailservice.js | 34 +- .../Management/Monitoring/LogHelper.ascx.cs | 15 +- .../Monitoring/PortsChecker.ascx.cs | 15 +- .../Monitoring/ServiceHealthChecker.ascx.cs | 15 +- .../Monitoring/css/dark-monitoring.less | 19 + .../Monitoring/css/img/loader-dark-16.svg | 38 + .../Management/Monitoring/css/monitoring.less | 10 +- .../Management/Monitoring/js/loghelper.js | 2 +- .../Management/Monitoring/js/portschecker.js | 2 +- .../Monitoring/js/servicehealthchecker.js | 2 +- .../NamingPeopleSettings.ascx.cs | 2 +- .../NamingPeopleSettingsContent.ascx | 9 + .../NamingPeopleSettingsContent.ascx.cs | 8 +- .../css/namingpeople.less | 2 +- .../NamingPeopleSettings/js/namingpeople.js | 2 +- .../js/namingpeoplecontent.js | 4 +- .../PasswordSettings/PasswordSettings.ascx | 9 +- .../PasswordSettings/PasswordSettings.ascx.cs | 52 +- .../css/dark-passwordsettings.less | 19 + .../css/passwordsettings.less | 7 +- .../PasswordSettings/js/passwordsettings.js | 120 +- .../Management/PasswordSettings/js/slider.js | 136 - .../PortalAccessSettings.ascx.cs | 4 +- .../css/portalaccess.less | 2 +- .../PortalAccessSettings/js/portalaccess.js | 2 +- .../PortalRename/PortalRename.ascx.cs | 34 +- .../PortalRename/css/portalrename.less | 34 +- .../PortalRename/js/portalrename.js | 34 +- .../PricingPageSettings.ascx.cs | 2 +- .../js/pricingpagesettings.js | 34 +- .../PrivacyRoom/PrivacyRoom.ascx.cs | 2 +- .../PrivacyRoom/css/privacyroom.less | 2 +- .../Management/PrivacyRoom/js/privacyroom.js | 2 +- .../ProductsAndInstruments.ascx.cs | 2 +- .../css/productsandinstruments.less | 2 +- .../js/productsandinstruments.js | 2 +- .../ProfileOperation/ProfileOperation.ascx.cs | 11 +- .../css/dark-profileoperation.less | 19 + .../css/profileoperation.less | 36 +- .../ProfileOperation/js/profileoperation.js | 33 +- .../Management/PromoCode/PromoCode.ascx.cs | 2 +- .../Management/PromoCode/promocode.js | 2 +- .../Management/Restore/Restore.ascx.cs | 2 +- .../Management/Restore/css/restore.less | 19 +- .../Management/Restore/js/restore.js | 100 +- .../ShareLinkPassword/ShareLinkPassword.ascx | 66 + .../ShareLinkPassword.ascx.cs | 42 + .../ShareLinkPassword.ascx.designer.cs | 17 + .../css/sharelinkpassword.less | 46 + .../ShareLinkPassword/js/sharelinkpassword.js | 112 + .../SingleSignOnSettings.ascx | 2 - .../SingleSignOnSettings.ascx.cs | 4 +- .../SingleSignOnSettings/SsoSettingsV2.cs | 77 +- .../SingleSignOnSettings/SsoUserData.cs | 34 +- ...settings.css => singlesignonsettings.less} | 593 +- .../js/singlesignonsettings.js | 2 +- .../SmsControls/ChangeMobileNumber.ascx.cs | 2 +- .../ConfirmMobileActivation.ascx.cs | 19 +- .../SmsControls/SmsValidationSettings.ascx | 55 +- .../SmsControls/SmsValidationSettings.ascx.cs | 5 +- .../SmsControls/css/confirmmobile.less | 2 +- .../css/smsvalidationsettings.less | 96 + .../Management/SmsControls/js/changemobile.js | 2 +- .../SmsControls/js/confirmmobile.js | 2 +- .../SmsControls/js/smsvalidation.js | 373 +- .../Management/SmtpSettings/SmtpSettings.ascx | 5 + .../SmtpSettings/SmtpSettings.ascx.cs | 4 +- .../{smtpsettings.css => smtpsettings.less} | 200 +- .../SmtpSettings/js/smtpsettings.js | 30 +- .../StorageSettings/StorageSettings.ascx | 21 +- .../StorageSettings/StorageSettings.ascx.cs | 36 +- .../css/dark-storagesettings.less | 19 + .../StorageSettings/css/storagesettings.less | 88 +- .../StorageSettings/js/storagesettings.js | 131 +- .../StudioSettings/StudioSettings.ascx.cs | 2 +- .../TariffSettings/TariffCustom.ascx.cs | 24 +- .../TariffSettings/TariffDesktop.ascx.cs | 4 +- .../TariffSettings/TariffHistory.ascx.cs | 12 +- .../TariffSettings/TariffLimitExceed.ascx.cs | 2 +- .../TariffSettings/TariffNotify.ascx.cs | 34 +- .../TariffSettings/TariffSaas.ascx.cs | 33 +- .../TariffSettings/TariffSettings.cs | 34 +- .../TariffSettings/TariffStandalone.ascx.cs | 16 +- .../TariffSettings/css/dark-tariff.less | 19 + .../TariffSettings/css/dark-tariffcustom.less | 19 + .../css/dark-tariffhistory.less | 19 + .../TariffSettings/css/dark-tariffsaas.less | 19 + .../TariffSettings/css/img/add_users_info.png | Bin 9250 -> 0 bytes .../TariffSettings/css/img/add_users_info.svg | 43 + .../TariffSettings/css/img/icon_storage.png | Bin 5634 -> 0 bytes .../TariffSettings/css/img/icon_storage.svg | 45 + .../Management/TariffSettings/css/tariff.less | 38 +- .../TariffSettings/css/tariffcustom.less | 16 +- .../TariffSettings/css/tariffdesktop.less | 34 +- .../TariffSettings/css/tariffhistory.less | 36 +- .../TariffSettings/css/tarifflimitexceed.less | 6 +- .../TariffSettings/css/tariffnotify.less | 34 +- .../TariffSettings/css/tariffsaas.less | 50 +- .../TariffSettings/css/tariffstandalone.less | 34 +- .../TariffSettings/js/tariffcustom.js | 2 +- .../TariffSettings/js/tariffdesktop.js | 2 +- .../TariffSettings/js/tarifflimitexceed.js | 2 +- .../TariffSettings/js/tariffnotify.js | 34 +- .../TariffSettings/js/tariffsaas.js | 34 +- .../TariffSettings/js/tariffstandalone.js | 34 +- .../Management/TfaControls/ConfirmTfa.ascx.cs | 5 +- .../TfaControls/ResetAppDialog.ascx.cs | 2 +- .../TfaControls/ShowBackupCodesDialog.ascx.cs | 34 +- .../TfaControls/css/confirmtfa.less | 2 +- .../TfaControls/css/showbackup.less | 34 +- .../Management/TfaControls/js/confirmtfa.js | 34 +- .../Management/TfaControls/js/resetapp.js | 2 +- .../Management/TfaControls/js/showbackup.js | 4 +- .../TimeAndLanguage/TimeAndLanguage.ascx.cs | 2 +- .../TimeAndLanguage/css/timeandlanguage.less | 2 +- .../TimeAndLanguage/js/timeandlanguage.js | 2 +- .../TransferPortal/TransferPortal.ascx.cs | 2 +- .../TransferPortal/css/transferportal.less | 2 +- .../TransferPortal/js/transferportal.js | 2 +- .../VersionSettings/VersionSettings.ascx.cs | 2 +- .../VersionSettings/css/versionsettings.less | 2 +- .../Management/VersionSettings/js/script.js | 2 +- .../Management/WhiteLabel/LogoUploader.cs | 2 +- .../Management/WhiteLabel/WhiteLabel.ascx | 36 +- .../Management/WhiteLabel/WhiteLabel.ascx.cs | 34 +- .../Management/WhiteLabel/js/whitelabel.js | 34 +- .../ProductQuotes/ClientTemplateResources.cs | 40 + .../ProductQuotes/ProductQuotes.ascx | 131 + .../ProductQuotes/ProductQuotes.ascx.cs | 38 +- .../Templates/PeopleTemplates.html | 77 + .../css/dark_productquotes_style.less | 19 + .../css/productquotes_style.less | 206 +- .../ProductQuotes/img/corner-dark.png | Bin 0 -> 170 bytes .../ProductQuotes/js/jq_quota_extensions.js | 132 + .../ProductQuotes/js/navigatorhandler.js | 57 + .../ProductQuotes/js/product_quotes.js | 189 +- .../ProductQuotes/js/user_quota_controller.js | 1182 +++ .../Statistics/TenantStatisticsProvider.cs | 2 +- .../VisitorsChart/VisitorsChart.ascx.cs | 2 +- .../css/visitorschart_style.less | 2 +- .../Statistics/VisitorsChart/js/tooltip.js | 2 +- .../VisitorsChart/js/visitorschart.js | 2 +- .../AuthCommunications.ascx.cs | 2 +- .../js/authcommunications.js | 2 +- .../ResendInvitesControl.ascx.cs | 2 +- .../js/resendinvitescontrol.js | 2 +- .../Users/TipsSettings/TipsSettings.ascx.cs | 2 +- .../Users/TipsSettings/css/tipssettings.less | 2 +- .../Users/TipsSettings/js/tipssettings.js | 2 +- .../UserConnections/UserConnections.ascx | 2 +- .../UserConnections/UserConnections.ascx.cs | 47 +- .../UserConnections/css/connections.less | 36 +- .../UserConnections/css/dark-connections.less | 19 + .../UserConnections/js/connections_manager.js | 34 +- .../UserProfile/AccountLinkControl.ascx.cs | 2 +- .../ConfirmationDeleteUser.ascx.cs | 34 +- .../UserProfile/LoadPhotoControl.ascx.cs | 15 +- .../Users/UserProfile/PwdTool.ascx | 3 + .../Users/UserProfile/PwdTool.ascx.cs | 2 +- .../Users/UserProfile/UserEmailChange.ascx.cs | 14 +- .../UserProfile/UserEmailControl.ascx.cs | 2 +- .../Users/UserProfile/UserLanguage.ascx.cs | 2 +- .../Users/UserProfile/UserProfileActions.ascx | 11 + .../UserProfile/UserProfileActions.ascx.cs | 12 +- .../UserProfileActions.ascx.designer.cs | 21 +- .../Users/UserProfile/UserProfileControl.ascx | 83 + .../UserProfile/UserProfileControl.ascx.cs | 45 +- .../UserProfile/UserProfileEditControl.ascx | 32 +- .../UserProfileEditControl.ascx.cs | 27 +- .../UserProfile/css/accountlink_style.less | 2 +- .../UserProfile/css/dark-loadphoto_style.less | 19 + .../css/dark-profileeditcontrol_style.less | 19 + .../css/dark-userprofilecontrol_style.less | 19 + .../Users/UserProfile/css/images/birthday.png | Bin 646 -> 0 bytes .../Users/UserProfile/css/images/birthday.svg | 14 + .../UserProfile/css/images/user-blocked.png | Bin 931 -> 0 bytes .../UserProfile/css/images/user-blocked.svg | 16 + .../UserProfile/css/loadphoto_style.less | 10 +- .../css/profileeditcontrol_style.less | 25 +- .../Users/UserProfile/css/userlanguages.less | 2 +- .../css/userprofilecontrol_style.less | 217 +- .../Users/UserProfile/js/accountlinker.js | 2 +- .../Users/UserProfile/js/deleteuser.js | 34 +- .../Users/UserProfile/js/loadphoto.js | 2 +- .../Users/UserProfile/js/pwdtool.js | 2 +- .../Users/UserProfile/js/userlanguage.js | 2 +- .../UserProfile/js/userprofilecontrol.js | 181 +- .../UserProfile/js/userprofileeditcontrol.js | 39 +- .../UserSubscriptions.ascx.cs | 16 +- .../css/dark-subscriptions.less | 19 + .../css/img/hmenu-selected-dark.png | Bin 0 -> 155 bytes .../UserSubscriptions/css/subscriptions.less | 18 +- .../js/subscription_manager.js | 3 +- .../ASC.Web.Studio/Utility/AjaxResponse.cs | 2 +- .../BBCodeParser/ExpressionReplacement.cs | 2 +- .../BBCodeParser/ParserConfiguration.cs | 2 +- .../BBCodeParser/RegularExpressionTemplate.cs | 2 +- .../Utility/BBCodeParser/Smiles.cs | 2 +- .../Utility/BBCodeParser/TagConfiguration.cs | 2 +- .../Utility/BBCodeParser/TagParamOption.cs | 2 +- .../Utility/CommonControlsConfigurer.cs | 2 +- .../Utility/CustomResourceHelper.cs | 2 +- .../Utility/HeaderStringHelper.cs | 2 +- .../HtmlUtility/CodeFormat/CLikeFormat.cs | 2 +- .../HtmlUtility/CodeFormat/CSharpFormat.cs | 2 +- .../HtmlUtility/CodeFormat/CodeFormat.cs | 2 +- .../HtmlUtility/CodeFormat/CppFormat.cs | 2 +- .../HtmlUtility/CodeFormat/HtmlFormat.cs | 2 +- .../CodeFormat/JavaScriptFormat.cs | 2 +- .../HtmlUtility/CodeFormat/MshFormat.cs | 2 +- .../HtmlUtility/CodeFormat/SourceFormat.cs | 2 +- .../HtmlUtility/CodeFormat/TsqlFormat.cs | 2 +- .../CodeFormat/VisualBasicFormat.cs | 2 +- .../Utility/HtmlUtility/Highlighter.cs | 2 +- .../Utility/HtmlUtility/HtmlUtility.cs | 2 +- .../Utility/HtmlUtility/LangType.cs | 2 +- .../ASC.Web.Studio/Utility/RefererURL.cs | 34 +- .../ASC.Web.Studio/Utility/TenantExtra.cs | 11 +- .../Utility/TenantLogoHelper.cs | 58 - .../Utility/TransferResourceHelper.cs | 2 +- .../Utility/WhiteLabelHelper.cs | 34 +- web/studio/ASC.Web.Studio/VoipClient.aspx.cs | 34 +- web/studio/ASC.Web.Studio/Warmup.aspx.cs | 2 +- web/studio/ASC.Web.Studio/Web.config | 2 +- web/studio/ASC.Web.Studio/Wizard.aspx.cs | 2 +- .../addons/calendar/ASC.Web.Calendar.csproj | 52 +- .../addons/calendar/Addon/CalendarAddon.cs | 2 +- .../App_Themes/bright-blue/calendar.less | 27 +- .../App_Themes/bright-blue/params.less | 41 + .../App_Themes/dark-bright-blue/calendar.less | 20 + .../App_Themes/dark-bright-blue/params.less | 28 + .../App_Themes/dark-dark-green/calendar.less | 21 + .../App_Themes/dark-dark-green/params.less | 29 + .../App_Themes/dark-deep-blue/calendar.less | 20 + .../App_Themes/dark-deep-blue/params.less | 29 + .../App_Themes/dark-default/calendar.less | 19 + .../App_Themes/dark-default/params.less | 109 + .../App_Themes/dark-green/calendar.less | 33 +- .../App_Themes/dark-green/params.less | 47 + .../App_Themes/dark-pure-orange/calendar.less | 21 + .../App_Themes/dark-pure-orange/params.less | 28 + .../App_Themes/dark-wild-pink/calendar.less | 20 + .../App_Themes/dark-wild-pink/params.less | 29 + .../App_Themes/deep-blue/calendar.less | 32 +- .../calendar/App_Themes/deep-blue/params.less | 47 + .../calendar/App_Themes/default/calendar.less | 9 +- .../calendar/App_Themes/default/params.less | 92 + .../App_Themes/pure-orange/calendar.less | 25 +- .../App_Themes/pure-orange/params.less | 38 + .../App_Themes/wild-pink/calendar.less | 33 +- .../calendar/App_Themes/wild-pink/params.less | 47 + .../CalendarSpaceUsageStatManager.cs | 36 +- .../DocumentsPopup/DocumentsPopup.ascx.cs | 34 +- .../DocumentsPopup/css/documentspopup.less | 36 +- .../DocumentsPopup/css/images/warning.png | Bin 3537 -> 0 bytes .../DocumentsPopup/css/images/warning.svg | 16 + .../DocumentsPopup/js/documentspopup.js | 34 +- .../addons/calendar/Default.aspx.cs | 2 +- .../addons/calendar/Handlers/FilesUploader.cs | 52 +- .../CalendarSubscriptionManager.cs | 2 +- .../UserControls/ButtonSidePanel.ascx.cs | 34 +- .../UserControls/CalendarControl.ascx | 7 - .../UserControls/CalendarControl.ascx.cs | 33 +- .../UserControls/CalendarResources.ascx.cs | 2 +- .../UserControls/CalendarSidePanel.ascx.cs | 34 +- .../UserControls/CalendarTemplates.ascx | 18 +- .../calendar/UserControls/SidePanel.ascx.cs | 34 +- .../jquery-ui-1.8.14.custom.css | 1441 ++- .../fullcalendar/css/attachments.less | 60 +- .../fullcalendar/css/dark-attachments.less | 19 + .../fullcalendar/css/fullcalendar.less | 774 +- .../fullcalendar/dark-img/base_sprite.png | Bin 0 -> 2681 bytes .../fullcalendar/dark-img/circle-close.png | Bin 0 -> 429 bytes .../fullcalendar/dark-img/event-alert.png | Bin 0 -> 307 bytes .../fullcalendar/dark-img/event-repeat.png | Bin 0 -> 368 bytes .../dark-img/guest_statements.png | Bin 0 -> 475 bytes .../fullcalendar/dark-img/ical.png | Bin 0 -> 467 bytes .../fullcalendar/dark-img/list-header-add.png | Bin 0 -> 226 bytes .../dark-img/list-item-shared.png | Bin 0 -> 307 bytes .../fullcalendar/dark-img/profile.png | Bin 0 -> 335 bytes .../fullcalendar/dark-img/resizer.png | Bin 0 -> 84 bytes .../fullcalendar/dark-img/settings_16.png | Bin 0 -> 363 bytes .../fullcalendar/dark-img/trash.png | Bin 0 -> 182 bytes .../UserControls/fullcalendar/fullcalendar.js | 19 +- .../fullcalendar/img/calendar_16.png | Bin 135 -> 0 bytes .../fullcalendar/img/edit_pencil.png | Bin 315 -> 0 bytes .../fullcalendar/img/event-alert.png | Bin 213 -> 307 bytes .../fullcalendar/img/header-add-calendar.png | Bin 148 -> 0 bytes .../fullcalendar/img/header-add-event.png | Bin 118 -> 0 bytes .../img/header-add-subscriptions.png | Bin 141 -> 0 bytes .../fullcalendar/img/header-list.png | Bin 174 -> 0 bytes .../fullcalendar/img/list-item-edit.png | Bin 143 -> 0 bytes .../fullcalendar/img/list-item-hidden.png | Bin 239 -> 0 bytes .../fullcalendar/img/list-item-visible.png | Bin 202 -> 0 bytes .../UserControls/js/calendar.attachments.js | 39 +- .../UserControls/js/calendar.popupqueue.js | 34 +- .../UserControls/js/calendar_controller.js | 21 +- .../UserControls/js/calendar_event_page.js | 34 +- .../UserControls/js/recurrence_rule.js | 2 +- .../UserControls/popup/css/dark-popup.less | 19 + .../popup/css/{popup.css => popup.less} | 281 +- .../calendar/UserControls/popup/popup.js | 4 +- .../ASC.Web.Studio/addons/calendar/web.config | 2 +- .../addons/mail/ASC.Web.Mail.csproj | 51 +- .../addons/mail/Addon/MailAddon.cs | 2 +- .../mail/App_Themes/dark/dark-full.less | 42 + .../mail/App_Themes/dark/dark-params.less | 55 + .../default/images/add-mailboxes_32.png | Bin 1207 -> 0 bytes .../default/images/add-mailboxes_32.svg | 18 + .../default/images/blank_sprite.png | Bin 159728 -> 0 bytes .../App_Themes/default/images/block_mail.svg | 34 + .../collect-all-emails-in-one-place.png | Bin 15875 -> 0 bytes .../collect-all-emails-in-one-place.svg | 38 + .../images/dashboard/communicate-easily.png | Bin 11557 -> 0 bytes .../images/dashboard/communicate-easily.svg | 22 + .../dashboard/structure-correspondence.png | Bin 18320 -> 0 bytes .../dashboard/structure-correspondence.svg | 30 + .../images/dashboard/use-mail-server.png | Bin 15650 -> 0 bytes .../images/dashboard/use-mail-server.svg | 17 + .../default/images/incoming_mail.svg | 30 + .../default/images/loader/loader-dark-16.svg | 38 + .../default/images/loader/loader-dark-32.svg | 38 + .../App_Themes/default/images/mail_add.svg | 23 + .../default/images/mail_added_contact.svg | 46 + .../default/images/mail_company.svg | 27 + .../App_Themes/default/images/mail_domain.svg | 20 + .../App_Themes/default/images/mail_filter.svg | 45 + .../App_Themes/default/images/mail_folder.svg | 30 + .../default/images/mail_new_contact.svg | 49 + .../App_Themes/default/images/mail_person.svg | 23 + .../App_Themes/default/images/mail_send.svg | 33 + .../App_Themes/default/images/mail_tags.svg | 27 + .../App_Themes/default/images/mail_trash.svg | 34 + .../default/images/mail_warning.svg | 11 + .../default/images/write_letter.svg | 40 + .../App_Themes/default/less/accountpopup.less | 22 +- .../App_Themes/default/less/accounts.less | 6 +- .../default/less/accountspanel.less | 19 +- .../default/less/administration.less | 46 +- .../App_Themes/default/less/attachments.less | 8 +- .../App_Themes/default/less/calendar.less | 89 +- .../mail/App_Themes/default/less/common.less | 6 +- .../App_Themes/default/less/contacts.less | 18 +- .../default/less/crm_integration.less | 4 +- .../mail/App_Themes/default/less/filters.less | 40 +- .../mail/App_Themes/default/less/folders.less | 35 +- .../mail/App_Themes/default/less/full.less | 42 + .../mail/App_Themes/default/less/icons.less | 4 +- .../mail/App_Themes/default/less/mail.less | 209 +- .../mail/App_Themes/default/less/message.less | 49 +- .../App_Themes/default/less/messages.less | 8 +- .../mail/App_Themes/default/less/mixins.less | 2 +- .../less/{settings.less => params.less} | 154 +- .../mail/App_Themes/default/less/popup.less | 29 +- .../mail/App_Themes/default/less/print.less | 6 +- .../mail/App_Themes/default/less/tags.less | 56 +- .../MailSpaceUsageStatManager.cs | 28 +- .../addons/mail/Configuration/Settings.cs | 34 +- .../AccountsPage/AccountsPage.ascx.cs | 2 +- .../AdministrationPage.ascx.cs | 2 +- .../Controls/BlankModal/BlankModal.ascx.cs | 2 +- .../mail/Controls/BlankModal/js/blankmodal.js | 2 +- .../CommonSettingsPage.ascx.cs | 34 +- .../ContactsPage/ContactsPage.ascx.cs | 2 +- .../DocumentsPopup/DocumentsPopup.ascx.cs | 34 +- .../DocumentsPopup/css/documentspopup.less | 36 +- .../DocumentsPopup/css/images/warning.png | Bin 3537 -> 0 bytes .../DocumentsPopup/css/images/warning.svg | 16 + .../DocumentsPopup/js/documentspopup.js | 38 +- .../mail/Controls/FiltersPage/Filters.ascx.cs | 34 +- .../mail/Controls/MailBox/MailBox.ascx.cs | 29 +- .../mail/Controls/TagBox/TagBox.ascx.cs | 2 +- .../mail/Controls/TagsPage/TagsPage.ascx.cs | 2 +- .../UserFoldersPage/UserFoldersPage.ascx.cs | 34 +- .../ASC.Web.Studio/addons/mail/Default.aspx | 4 +- .../addons/mail/Default.aspx.cs | 13 +- .../mail/HttpHandlers/ContactPhoto.ashx.cs | 2 +- .../addons/mail/HttpHandlers/Download.ashx.cs | 2 +- .../mail/HttpHandlers/EditDocument.ashx.cs | 2 +- .../addons/mail/HttpHandlers/FilesUploader.cs | 2 +- .../mail/HttpHandlers/ViewDocument.ashx.cs | 2 +- .../ClientLocalizationResources.cs | 2 +- .../ClientScripts/ClientSettingsResources.cs | 2 +- .../ClientScripts/ClientTemplateResources.cs | 2 +- .../ASC.Web.Studio/addons/mail/OAuth.aspx.cs | 34 +- .../mail/Resources/MailResource.Designer.cs | 11 +- .../addons/mail/Resources/MailResource.resx | 3 + .../addons/mail/js/accountspanel.js | 2 +- .../addons/mail/js/actionmenu.js | 2 +- .../addons/mail/js/actionpanel.js | 2 +- .../mail/js/administration/administration.js | 2 +- .../addons/mail/js/administration/error.js | 2 +- .../addons/mail/js/administration/forms.js | 2 +- .../js/administration/modal/createdomain.js | 2 +- .../js/administration/modal/createmailbox.js | 2 +- .../administration/modal/createmailgroup.js | 2 +- .../js/administration/modal/editmailbox.js | 2 +- .../js/administration/modal/editmailgroup.js | 2 +- .../addons/mail/js/administration/page.js | 2 +- .../plugin/jquery-domainadvansedselector.js | 2 +- .../plugin/jquery-mailboxadvansedselector.js | 2 +- .../ASC.Web.Studio/addons/mail/js/alerts.js | 2 +- .../mail/js/autocomplete/crmautocomplete.js | 34 +- .../mail/js/autocomplete/emailautocomplete.js | 34 +- .../addons/mail/js/blankpage.js | 2 +- .../addons/mail/js/commonsettings/page.js | 34 +- .../addons/mail/js/contacts/contacts.js | 2 +- .../mail/js/contacts/filter/crmfilter.js | 34 +- .../mail/js/contacts/filter/customfilter.js | 34 +- .../mail/js/contacts/filter/tlfilter.js | 34 +- .../mail/js/contacts/modal/editcontact.js | 34 +- .../addons/mail/js/contacts/page.js | 2 +- .../addons/mail/js/contacts/panel.js | 2 +- .../addons/mail/js/contacts/types.js | 2 +- .../addons/mail/js/containers/set.js | 2 +- .../ASC.Web.Studio/addons/mail/js/dropdown.js | 2 +- .../addons/mail/js/filtercache.js | 2 +- .../addons/mail/js/filters/edit.js | 40 +- .../addons/mail/js/filters/filter.js | 34 +- .../addons/mail/js/filters/manager.js | 36 +- .../addons/mail/js/filters/modal.js | 34 +- .../addons/mail/js/filters/page.js | 34 +- .../addons/mail/js/fromsenderfilter.js | 4 +- .../addons/mail/js/helpcenter/page.js | 2 +- .../addons/mail/js/helpcenter/panel.js | 2 +- .../addons/mail/js/hidepanel.js | 2 +- .../ASC.Web.Studio/addons/mail/js/init.js | 2 +- .../addons/mail/js/mail.accounts.js | 2 +- .../addons/mail/js/mail.accountsmodal.js | 2 +- .../addons/mail/js/mail.accountspage.js | 7 +- .../addons/mail/js/mail.attachmentmanager.js | 2 +- .../addons/mail/js/mail.cache.js | 34 +- .../addons/mail/js/mail.calendar.js | 34 +- .../addons/mail/js/mail.common.js | 2 +- .../addons/mail/js/mail.crmlinkpopup.js | 2 +- .../addons/mail/js/mail.default.js | 2 +- .../addons/mail/js/mail.filter.js | 2 +- .../addons/mail/js/mail.folderfilter.js | 2 +- .../addons/mail/js/mail.folderpanel.js | 2 +- .../addons/mail/js/mail.mailbox.js | 2 +- .../addons/mail/js/mail.messagepage.js | 10 +- .../addons/mail/js/mail.navigation.js | 2 +- .../addons/mail/js/mail.printpage.js | 2 +- .../addons/mail/js/mail.servicemanager.js | 2 +- .../addons/mail/js/mail.settingspanel.js | 2 +- .../ASC.Web.Studio/addons/mail/js/popup.js | 2 +- .../addons/mail/js/tags/colorspopup.js | 2 +- .../addons/mail/js/tags/dropdown.js | 2 +- .../addons/mail/js/tags/modal.js | 2 +- .../addons/mail/js/tags/page.js | 2 +- .../addons/mail/js/tags/panel.js | 2 +- .../addons/mail/js/tags/tags.js | 2 +- .../jquery-mailtemplateadvansedselector.js | 34 +- .../addons/mail/js/trustedaddresses.js | 2 +- .../addons/mail/js/userfolders/dropdown.js | 34 +- .../addons/mail/js/userfolders/manager.js | 39 +- .../addons/mail/js/userfolders/modal.js | 34 +- .../addons/mail/js/userfolders/page.js | 36 +- .../addons/mail/js/userfolders/panel.js | 34 +- .../plugins/jstree.counters.plugin.js | 34 +- .../ASC.Web.Studio/addons/mail/js/wysiwyg.js | 2 +- .../addons/mail/templates/accountTmpl.html | 12 +- .../addons/mail/templates/contactsTmpl.html | 2 +- .../templates/crmIntegrationPopupTmpl.html | 2 +- .../mail/templates/editMessageTmpl.html | 2 +- .../templates/filters/editFilterTmpl.html | 2 +- .../addons/mail/templates/foldersTmpl.html | 2 +- .../mailTemplateAdvansedSelectorTmpl.html | 2 +- .../addons/mail/templates/messageTmpl.html | 2 +- .../addons/mail/templates/messagesTmpl.html | 3 +- .../ASC.Web.Studio/addons/mail/web.config | 2 +- .../addons/talk/ASC.Web.Talk.csproj | 37 +- .../addons/talk/Addon/TalkAddon.cs | 2 +- .../talk/Addon/TalkSpaceUsageStatManager.cs | 52 +- .../App_Themes/default/images/talk128.png | Bin 20823 -> 0 bytes .../App_Themes/default/images/talk128.svg | 44 + .../talk/App_Themes/default/images/talk16.png | Bin 827 -> 0 bytes .../talk/App_Themes/default/images/talk16.svg | 21 + .../talk/App_Themes/default/images/talk32.png | Bin 2429 -> 0 bytes .../talk/App_Themes/default/images/talk32.svg | 22 + .../talk/App_Themes/default/images/talk48.png | Bin 4753 -> 0 bytes .../talk/App_Themes/default/images/talk48.svg | 23 + .../talk/ClientScript/TalkClientScript.cs | 10 +- .../addons/talk/Default.aspx.cs | 4 +- .../talk/HttpHandlers/HttpPollHandler.cs | 2 +- .../talk/HttpHandlers/OpenContactHandler.cs | 2 +- .../talk/HttpHandlers/UploadFileHandler.cs | 7 +- .../talk/HttpHandlers/UserPhotoHandler.cs | 2 +- .../addons/talk/JabberClient.aspx.cs | 19 +- .../addons/talk/JabberWrapper.cs | 34 +- .../addons/talk/TalkConfiguration.cs | 2 +- .../UserControls/ContactsContainer.ascx.cs | 2 +- .../UserControls/MeseditorContainer.ascx.cs | 9 +- .../talk/UserControls/RoomsContainer.ascx.cs | 2 +- .../UserControls/TabsContainerPart.ascx.cs | 34 +- .../UserControls/TalkNavigationItem.ascx.cs | 2 +- .../talk/css/dark/dark-talk.messagearea.less | 17 + .../addons/talk/css/dark/dark-talk.style.less | 19 + .../addons/talk/css/dark/params.less | 47 + .../imagescss/bg-conferencesplash-logo.png | Bin 1841 -> 0 bytes .../imagescss/bg-conferencesplash-logo.svg | 50 + .../css/default/imagescss/bg-rect-dark.png | Bin 0 -> 230 bytes .../css/default/imagescss/chat_background.png | Bin 29595 -> 0 bytes .../css/default/imagescss/chat_background.svg | 123 + .../css/default/imagescss/chatsmiles-dark.png | Bin 0 -> 622 bytes .../css/default/imagescss/search-dark.png | Bin 0 -> 424 bytes .../css/default/imagescss/sendfile-dark.png | Bin 0 -> 536 bytes .../addons/talk/css/default/params.less | 47 + ....messagearea.css => talk.messagearea.less} | 67 +- .../{talk.overview.css => talk.overview.less} | 28 +- ....style.de-de.css => talk.style.de-de.less} | 4 +- ....style.en-gb.css => talk.style.en-gb.less} | 4 +- ....style.en-us.css => talk.style.en-us.less} | 4 +- ....style.es-es.css => talk.style.es-es.less} | 4 +- ....style.fr-fr.css => talk.style.fr-fr.less} | 4 +- ....style.it-it.css => talk.style.it-it.less} | 4 +- .../{talk.style.css => talk.style.less} | 8832 +++++++++-------- ....style.lv-lv.css => talk.style.lv-lv.less} | 10 +- ....style.pt-br.css => talk.style.pt-br.less} | 4 +- ....style.ru-ru.css => talk.style.ru-ru.less} | 4 +- ...t-overflow.css => talk.text-overflow.less} | 90 +- .../addons/talk/js/talk.common.js | 2 +- .../addons/talk/js/talk.connectiomanager.js | 2 +- .../addons/talk/js/talk.contactscontainer.js | 2 +- .../addons/talk/js/talk.contactsmanager.js | 2 +- .../addons/talk/js/talk.customevents.js | 2 +- .../addons/talk/js/talk.default.js | 2 +- .../addons/talk/js/talk.init.js | 34 +- .../addons/talk/js/talk.meseditorcontainer.js | 2 +- .../addons/talk/js/talk.messagesmanager.js | 2 +- .../addons/talk/js/talk.msmanager.js | 2 +- .../addons/talk/js/talk.mucmanager.js | 2 +- .../addons/talk/js/talk.navigationitem.js | 2 +- .../addons/talk/js/talk.roomscontainer.js | 2 +- .../addons/talk/js/talk.roomsmanager.js | 2 +- .../addons/talk/js/talk.tabscontainer.js | 2 +- .../addons/talk/talk.notification.js | 34 +- .../ASC.Web.Studio/addons/talk/web.config | 2 +- web/studio/ASC.Web.Studio/confirm.aspx | 3 +- web/studio/ASC.Web.Studio/confirm.aspx.cs | 15 +- .../ASC.Web.Studio/js/asc/api/api.factory.js | 9 +- .../ASC.Web.Studio/js/asc/api/api.helper.js | 6 +- .../ASC.Web.Studio/js/asc/api/asc.teamlab.js | 264 +- .../js/asc/core/asc.anchorcontroller.js | 4 +- .../js/asc/core/asc.customevents.js | 2 +- .../js/asc/core/asc.feedreader.js | 2 +- .../js/asc/core/asc.files.utility.js | 38 +- .../js/asc/core/asc.listscript.js | 2 +- .../js/asc/core/asc.mail.utility.js | 3 +- .../js/asc/core/asc.mailreader.js | 2 +- .../js/asc/core/asc.pagenavigator.js | 2 +- .../js/asc/core/asc.socketio.js | 34 +- .../js/asc/core/asc.tabsnavigator.js | 2 +- .../js/asc/core/asc.topstudiopanel.js | 41 +- .../js/asc/core/basetemplate.master.init.js | 71 +- .../ASC.Web.Studio/js/asc/core/clipboard.js | 34 +- .../js/asc/core/collaborators.js | 40 +- .../ASC.Web.Studio/js/asc/core/common.js | 30 +- .../js/asc/core/desktop.polyfills.js | 105 + .../js/asc/core/groupselector.js | 2 +- .../ASC.Web.Studio/js/asc/core/headscript.js | 34 +- .../js/asc/core/localstorage.js | 2 +- .../js/asc/core/voip.countries.js | 2 +- .../js/asc/core/voip.navigationitem.js | 34 +- .../ASC.Web.Studio/js/asc/core/voip.phone.js | 2 +- .../js/asc/plugins/countries.js | 2 +- .../js/asc/plugins/jquery-advansedfilter.js | 2 +- .../js/asc/plugins/jquery-advansedselector.js | 2 +- .../plugins/jquery-contactadvansedselector.js | 2 +- .../js/asc/plugins/jquery-customcombobox.js | 2 +- .../plugins/jquery-emailadvansedselector.js | 34 +- .../plugins/jquery-groupadvansedselector.js | 2 +- .../plugins/jquery-projectadvansedselector.js | 2 +- .../plugins/jquery-useradvansedselector.js | 2 +- .../js/asc/plugins/jquery.helper.js | 19 +- .../js/asc/plugins/jquery.tlblock.js | 118 - .../js/asc/plugins/phonecontroller.js | 2 +- .../ASC.Web.Studio/js/asc/plugins/popupbox.js | 2 +- .../js/asc/plugins/progressdialog.js | 34 +- .../js/asc/plugins/userselector.js | 113 +- web/studio/ASC.Web.Studio/skins/base.less | 68 +- .../skins/bright-blue/img/name_action.png | Bin 359 -> 250 bytes .../skins/bright-blue/main.less | 4 +- .../skins/bright-blue/params.less | 18 +- .../skins/dark-bright-blue/dark-params.less | 55 + .../skins/dark-bright-blue/main.less | 38 + .../skins/dark-dark-green/dark-params.less | 54 + .../skins/dark-dark-green/main.less | 38 + .../skins/dark-deep-blue/dark-params.less | 53 + .../skins/dark-deep-blue/main.less | 38 + .../skins/dark-default/dark-params.less | 308 + .../skins/dark-default/main.less | 37 + .../skins/dark-green/img/name_action.png | Bin 319 -> 355 bytes .../ASC.Web.Studio/skins/dark-green/main.less | 2 +- .../skins/dark-green/params.less | 18 +- .../skins/dark-img/advfilter-icons.png | Bin 0 -> 493 bytes .../skins/dark-img/btn-onoff.png | Bin 0 -> 762 bytes .../skins/dark-img/btn_icons.png | Bin 0 -> 568 bytes .../skins/dark-img/btn_row_icons.png | Bin 0 -> 961 bytes .../skins/dark-img/convert_pencil.png | Bin 0 -> 784 bytes .../skins/dark-img/dropdown-menu-icons.png | Bin 0 -> 2833 bytes .../dark-img/dropdown-menu-icons_retina.png | Bin 0 -> 6469 bytes .../skins/dark-img/edit_lock.png | Bin 0 -> 311 bytes .../skins/dark-img/edit_pencil.png | Bin 0 -> 343 bytes .../skins/dark-img/gantt-icons.png | Bin 0 -> 630 bytes .../skins/dark-img/icons_nav_panel.png | Bin 0 -> 5431 bytes .../skins/dark-img/icons_nav_panel_retina.png | Bin 0 -> 12009 bytes .../skins/dark-img/mainmenu_upload.png | Bin 0 -> 126 bytes .../skins/dark-img/name_action.png | Bin 0 -> 250 bytes .../ASC.Web.Studio/skins/dark-img/refresh.png | Bin 0 -> 410 bytes .../ASC.Web.Studio/skins/dark-img/rotate.svg | 4 + .../skins/dark-img/switch_view.png | Bin 0 -> 826 bytes .../skins/dark-img/top-studio-menu.png | Bin 0 -> 2323 bytes .../skins/dark-img/top-studio-menu_retina.png | Bin 0 -> 5042 bytes .../skins/dark-img/unfollow.png | Bin 0 -> 253 bytes .../ASC.Web.Studio/skins/dark-img/up.png | Bin 0 -> 121 bytes .../ASC.Web.Studio/skins/dark-img/up.svg | 4 + .../skins/dark-pure-orange/dark-params.less | 53 + .../skins/dark-pure-orange/main.less | 39 + .../skins/dark-wild-pink/dark-params.less | 52 + .../skins/dark-wild-pink/main.less | 38 + .../skins/dark/dark-codestyle.less | 19 + .../skins/dark/dark-common_style.less | 19 + .../skins/dark/dark-empty-screen-control.less | 19 + .../skins/dark/dark-groupselector.less | 19 + .../skins/dark/dark-helper.less | 19 + .../dark/dark-jquery-advansedfilter-fix.less | 19 + .../dark/dark-jquery-advansedselector.less | 19 + .../dark-jquery-emailadvansedselector.less | 19 + .../skins/dark/dark-page-tabs-navigators.less | 19 + .../skins/dark/dark-phonecontroller.less | 19 + .../skins/dark/dark-toastr.less | 19 + .../skins/dark/dark-userselector.less | 19 + .../skins/deep-blue/img/name_action.png | Bin 319 -> 355 bytes .../ASC.Web.Studio/skins/deep-blue/main.less | 2 +- .../skins/deep-blue/params.less | 17 +- .../skins/default/actionpanel.less | 494 +- .../skins/default/app_install.less | 34 +- .../ASC.Web.Studio/skins/default/buttons.less | 56 +- .../default/{codestyle.css => codestyle.less} | 134 +- .../skins/default/comments-container.less | 34 +- .../ASC.Web.Studio/skins/default/common.less | 186 +- .../skins/default/common_style.de-de.css | 2 +- .../skins/default/common_style.es-es.css | 2 +- .../skins/default/common_style.fr-fr.css | 2 +- .../skins/default/common_style.it-it.css | 2 +- .../skins/default/common_style.less | 642 +- .../skins/default/common_style.ru-ru.css | 2 +- .../default/common_style.wide-screen.less | 22 +- .../skins/default/contentmenu.less | 12 +- .../skins/default/dashboard.less | 33 +- .../skins/default/empty-screen-control.less | 40 +- ...filetype_style.css => filetype_style.less} | 572 +- .../{groupselector.css => groupselector.less} | 96 +- .../ASC.Web.Studio/skins/default/headers.less | 2 +- .../ASC.Web.Studio/skins/default/helper.less | 65 +- .../default/images/common_search_icon.png | Bin 891 -> 0 bytes .../default/images/common_search_icon.svg | 26 + .../skins/default/images/community150.png | Bin 22492 -> 0 bytes .../skins/default/images/community150.svg | 45 + .../skins/default/images/dark-checkboxes.png | Bin 0 -> 666 bytes .../dashboard/communicate-with-clients.png | Bin 13744 -> 0 bytes .../dashboard/communicate-with-clients.svg | 39 + .../dashboard/create-clients-database.png | Bin 9736 -> 0 bytes .../dashboard/create-clients-database.svg | 42 + .../images/dashboard/customize-your-crm.png | Bin 12297 -> 0 bytes .../images/dashboard/customize-your-crm.svg | 61 + .../images/dashboard/discuss-with-team.png | Bin 10613 -> 0 bytes .../images/dashboard/discuss-with-team.svg | 42 + .../dashboard/keep-your-team-posted.png | Bin 16877 -> 0 bytes .../dashboard/keep-your-team-posted.svg | 45 + .../dashboard/make-co-editing-comfy.png | Bin 9514 -> 0 bytes .../dashboard/make-co-editing-comfy.svg | 58 + .../default/images/dashboard/share-files.png | Bin 9438 -> 0 bytes .../default/images/dashboard/share-files.svg | 34 + .../dashboard/share-news-and-knowledge.png | Bin 11064 -> 0 bytes .../dashboard/share-news-and-knowledge.svg | 34 + .../default/images/dashboard/track-sales.png | Bin 9884 -> 0 bytes .../default/images/dashboard/track-sales.svg | 102 + .../use-more-collaboration-tools.png | Bin 4010 -> 0 bytes .../use-more-collaboration-tools.svg | 34 + .../dashboard/work-with-office-docs.png | Bin 6404 -> 0 bytes .../dashboard/work-with-office-docs.svg | 34 + .../default_user_photo_dark_size_200-200.png | Bin 0 -> 2629 bytes .../default_user_photo_dark_size_32-32.png | Bin 0 -> 490 bytes .../default_user_photo_dark_size_360-360.png | Bin 0 -> 4933 bytes .../default_user_photo_dark_size_48-48.png | Bin 0 -> 707 bytes .../default_user_photo_dark_size_82-82.png | Bin 0 -> 1142 bytes .../skins/default/images/documents150.png | Bin 23868 -> 0 bytes .../skins/default/images/documents150.svg | 36 + .../default/images/empty_screen_filter.png | Bin 7586 -> 0 bytes .../default/images/empty_screen_filter.svg | 26 + .../skins/default/images/empty_search.png | Bin 12200 -> 0 bytes .../skins/default/images/empty_search.svg | 21 + .../skins/default/images/event_66.png | Bin 7094 -> 2263 bytes .../skins/default/images/exclamation.png | Bin 3569 -> 0 bytes .../skins/default/images/exclamation.svg | 16 + .../images/jstree/throbber-dark-12.svg | 38 + .../skins/default/images/lastadded_widget.png | Bin 1589 -> 0 bytes .../skins/default/images/lastadded_widget.svg | 16 + .../skins/default/images/loader-dark-12.svg | 38 + .../skins/default/images/loader-dark-16.svg | 38 + .../skins/default/images/loader-dark-24.svg | 38 + .../skins/default/images/loader-dark-32.svg | 38 + .../skins/default/images/loader-dark-48.svg | 38 + .../skins/default/images/loader-dark-64.svg | 38 + .../skins/default/images/logo/about_dark.png | Bin 0 -> 5999 bytes .../images/logo/about_dark_general.png | Bin 0 -> 3355 bytes .../skins/default/images/logo/about_light.png | Bin 0 -> 5426 bytes .../images/logo/about_light_general.png | Bin 0 -> 2982 bytes .../skins/default/images/logo/light.png | Bin 0 -> 5426 bytes .../default/images/logo/light_general.png | Bin 0 -> 2982 bytes .../skins/default/images/mail.png | Bin 1701 -> 0 bytes .../skins/default/images/mail.svg | 25 + .../default/images/notification/demo-100.png | Bin 3552 -> 3084 bytes .../images/notification/mailus-100.png | Bin 3648 -> 2753 bytes .../images/notification/social-blog-40.png | Bin 1235 -> 1156 bytes .../images/notification/social-fb-40.png | Bin 1685 -> 869 bytes .../images/notification/social-inst-40.png | Bin 4043 -> 1157 bytes .../images/notification/social-tw-40.png | Bin 1810 -> 1075 bytes .../images/notification/social-vk-40.png | Bin 1857 -> 1088 bytes .../images/notification/social-youtube-40.png | Bin 1996 -> 1012 bytes .../default/images/notification/tech-100.png | Bin 3994 -> 3573 bytes .../tips-comfort-3rdparty-100.png | Bin 4081 -> 5005 bytes .../tips-comfort-answers-100 .png | Bin 2497 -> 5036 bytes .../tips-comfort-subscriptions-100.png | Bin 4128 -> 4215 bytes .../tips-comfort-training-100.png | Bin 2877 -> 5533 bytes .../tips-customize-3rdparty-100.png | Bin 3647 -> 6495 bytes .../notification/tips-customize-brand-100.png | Bin 2846 -> 5620 bytes .../tips-customize-customize-100.png | Bin 2446 -> 2194 bytes .../tips-customize-modules-100.png | Bin 3681 -> 3449 bytes .../tips-customize-regional-100.png | Bin 3464 -> 5424 bytes .../tips-documents-3rdparty-100.png | Bin 3647 -> 6542 bytes .../notification/tips-documents-apps-100.png | Bin 4220 -> 1392 bytes .../tips-documents-attach-100.png | Bin 2168 -> 1791 bytes .../tips-documents-coediting-100.png | Bin 2698 -> 4280 bytes .../tips-documents-desktop-100.png | Bin 1112 -> 2077 bytes .../tips-documents-docinfo-100.png | Bin 1984 -> 3527 bytes .../tips-documents-formatting-100.png | Bin 1745 -> 1601 bytes .../tips-documents-mailmerge-100.png | Bin 1143 -> 3211 bytes .../tips-documents-review-100.png | Bin 1696 -> 2823 bytes .../notification/tips-documents-share-100.png | Bin 2114 -> 2833 bytes .../notification/tips-welcome-backup-50.png | Bin 2065 -> 2297 bytes .../notification/tips-welcome-brand-50.png | Bin 1681 -> 2440 bytes .../tips-welcome-customize-50.png | Bin 1477 -> 1058 bytes .../notification/tips-welcome-regional-50.png | Bin 1443 -> 2111 bytes .../notification/tips-welcome-security-50.png | Bin 2273 -> 3005 bytes .../tips-welcome-telephony-50.png | Bin 1237 -> 2192 bytes .../tips-welcome-usertrack-50.png | Bin 2164 -> 1925 bytes .../skins/default/images/product_logo.png | Bin 1952 -> 0 bytes .../skins/default/images/product_logo.svg | 31 + .../skins/default/images/quickview.png | Bin 1036 -> 0 bytes .../skins/default/images/quickview.svg | 21 + .../skins/default/images/recent_activity.svg | 24 + .../images/svg/context/icon_arrow_light.svg | 10 + .../default/images/svg/crm/uploadlight.svg | 4 + .../default/images/svg/documents-icons.svg | 4 + .../skins/default/images/svg/exclamation.svg | 3 + .../skins/default/images/svg/people/close.svg | 3 + .../images/svg/settings/recalculate_quota.svg | 68 + .../default/images/svg/share/lifetime.svg | 4 + .../default/images/svg/share/password.svg | 3 + .../skins/default/images/svg/share/trash.svg | 3 + .../images/svg/share/user_avatar_dark.svg | 12 + .../skins/default/images/talk.svg | 22 + .../skins/default/images/to_left.png | Bin 946 -> 0 bytes .../skins/default/images/to_left.svg | 10 + .../skins/default/images/to_right.png | Bin 959 -> 0 bytes .../skins/default/images/to_right.svg | 10 + .../images/ui-icons_cccccc_256x240.png | Bin 0 -> 7086 bytes .../skins/default/imagescss/dark-close.png | Bin 0 -> 165 bytes .../skins/default/imagescss/name_action.png | Bin 319 -> 355 bytes .../skins/default/imagescss/security.png | Bin 1398 -> 0 bytes .../skins/default/imagescss/security.svg | 18 + .../skins/default/imagescss/upload.png | Bin 829 -> 0 bytes .../skins/default/imagescss/upload.svg | 9 + .../default/imagescss/welcometo_logo.png | Bin 9300 -> 0 bytes .../default/imagescss/welcometo_logo.svg | 29 + .../default/jquery-advansedfilter-fix.less | 114 +- .../default/jquery-advansedfilter-theme.less | 46 +- .../skins/default/jquery-advansedfilter.css | 2 +- .../default/jquery-advansedselector.less | 141 +- ....css => jquery-emailadvansedselector.less} | 80 +- .../jstree/themes/default/dark-style.less | 7 + .../default/jstree/themes/default/style.less | 1 + .../skins/default/jstree/themes/mixins.less | 2 +- .../skins/default/layout-desktop.less | 34 +- .../skins/default/layout-media.less | 34 +- .../ASC.Web.Studio/skins/default/layout.less | 34 +- .../ASC.Web.Studio/skins/default/links.less | 4 +- .../ASC.Web.Studio/skins/default/lists.less | 2 +- .../skins/default/main-page-container.less | 34 +- .../skins/default/main-title-icon.less | 34 +- .../ASC.Web.Studio/skins/default/main.less | 2 +- .../skins/default/page-tabs-navigators.less | 58 +- .../ASC.Web.Studio/skins/default/params.less | 273 +- ...onecontroller.css => phonecontroller.less} | 852 +- .../skins/default/sidepanel.less | 27 +- .../skins/default/tl-combobox.less | 16 +- .../ASC.Web.Studio/skins/default/toastr.less | 84 +- .../skins/default/topstudiopanel.less | 63 +- .../skins/default/userselector.less | 465 +- .../skins/default/voip.phone.less | 2 +- .../skins/default/whitelabel.less | 57 +- .../ASC.Web.Studio/skins/default/wizard.less | 34 +- .../ASC.Web.Studio/skins/page_default.less | 2 +- .../skins/pure-orange/img/name_action.png | Bin 319 -> 355 bytes .../skins/pure-orange/main.less | 2 +- .../skins/pure-orange/params.less | 16 +- .../skins/wild-pink/img/name_action.png | Bin 359 -> 250 bytes .../ASC.Web.Studio/skins/wild-pink/main.less | 2 +- .../skins/wild-pink/params.less | 17 +- .../ASC.Web.Studio/web.appsettings.config | 5 +- .../ASC.Web.Studio/web.consumers.config | 202 +- web/studio/ASC.Web.Studio/web.nlog.config | 24 +- web/studio/ASC.Web.Studio/web.storage.config | 2 +- .../ASC.Web.Upload/ASC.Web.Upload.csproj | 4 +- web/studio/ASC.Web.Upload/Global.asax.cs | 2 +- web/studio/ASC.Web.Upload/Web.config | 2 +- web/studio/ASC.Web.Upload/web.autofac.config | 5 + 4616 files changed, 89721 insertions(+), 52247 deletions(-) create mode 100644 .nuget/packages/SharpZipLib.1.4.2.nupkg rename build/install/deb/debian/{onlyofficeAutoCleanUp.service => onlyofficeFilesTrashCleaner.service} (80%) rename build/install/rpm/Files/systemd/{onlyofficeAutoCleanUp.service => onlyofficeFilesTrashCleaner.service} (80%) create mode 100644 build/sql/onlyoffice.upgradev125.sql create mode 100644 common/ASC.Common/Utils/IpAddressParser.cs create mode 100644 common/ASC.Common/Web/HttpClientFactory.cs create mode 100644 common/ASC.Common/Web/ResiliencePolicyManager.cs create mode 100644 common/ASC.Core.Common/Tenants/TenantQuotaSettings.cs create mode 100644 common/ASC.Core.Common/Tenants/TenantUserQuotaSettings.cs create mode 100644 common/ASC.Core.Common/Users/UserQuotaSettings.cs delete mode 100644 common/ASC.Data.Backup/Storage/DataStoreBackupStorage.cs delete mode 100644 common/ASC.Data.Backup/Storage/S3BackupStorage.cs create mode 100644 common/ASC.Data.Storage/ZipOperators/ChunkZipWriteOperator.cs rename common/{ASC.Data.Backup => ASC.Data.Storage/ZipOperators}/IDataOperator.cs (82%) create mode 100644 common/ASC.Data.Storage/ZipOperators/IGetterWriteOperator.cs create mode 100644 common/ASC.Data.Storage/ZipOperators/S3ZipWriteOperator.cs rename common/{ASC.Data.Backup => ASC.Data.Storage/ZipOperators}/ZipOperator.cs (86%) create mode 100644 common/ASC.Data.Storage/ZipOperators/ZipWriteOperatorFactory.cs create mode 100644 common/Tests/ASC.Common.Tests/Web/ResiliencePoliciesTest.cs create mode 100644 licenses/nuget packages/Amazon.Extensions.S3.Encryption.license create mode 100644 licenses/nuget packages/Polly.license create mode 100644 module/ASC.Api/ASC.Api.Migration/MigratorInfo.cs create mode 100644 module/ASC.Api/ASC.Api.Settings/TfaSettingsWrapper.cs create mode 100644 module/ASC.Migration/MigrateProgressItem.cs create mode 100644 module/ASC.Migration/ParseProgressItem.cs create mode 100644 module/ASC.Migration/QueueWorker.cs create mode 100644 module/ASC.ReversyProxy/ASC.ReversyProxy/ASC.ReversyProxy.csproj create mode 100644 module/ASC.ReversyProxy/ASC.ReversyProxy/Classes/CacheKeys.cs create mode 100644 module/ASC.ReversyProxy/ASC.ReversyProxy/Classes/IUpdateConfig.cs create mode 100644 module/ASC.ReversyProxy/ASC.ReversyProxy/Classes/InMemoryConfigProvider.cs create mode 100644 module/ASC.ReversyProxy/ASC.ReversyProxy/GlobalUsing.cs create mode 100644 module/ASC.ReversyProxy/ASC.ReversyProxy/Middlewares/FilterProxyDestinationsMiddleware.cs create mode 100644 module/ASC.ReversyProxy/ASC.ReversyProxy/Program.cs create mode 100644 module/ASC.ReversyProxy/ASC.ReversyProxy/Properties/launchSettings.json create mode 100644 module/ASC.ReversyProxy/ASC.ReversyProxy/Services/UpdateConfigManagerService.cs create mode 100644 module/ASC.ReversyProxy/ASC.ReversyProxy/Startup.cs create mode 100644 module/ASC.ReversyProxy/ASC.ReversyProxy/appsettings.json create mode 100644 module/ASC.ReversyProxy/ASC.ReversyProxy/nlog.config create mode 100644 module/ASC.ReversyProxy/ASC.ReversyProxy/web.config create mode 100644 web/core/ASC.Web.Core/BruteForceLoginManager.cs create mode 100644 web/core/ASC.Web.Core/Utility/ImpersonationSettings.cs create mode 100644 web/core/ASC.Web.Core/Utility/LoginSettings.cs create mode 100644 web/core/ASC.Web.Core/Utility/ModeThemeSettings.cs create mode 100644 web/studio/ASC.Web.Studio/Core/Quota/UserQuotaSync.cs create mode 100644 web/studio/ASC.Web.Studio/Core/Tfa/ITfaSettings.cs create mode 100644 web/studio/ASC.Web.Studio/Core/Tfa/TfaSettingsBase.cs create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-common.less create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-contacts.less create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-crm.less create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-params.less create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/crm.less create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/params.less delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/activity_widget.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/activity_widget.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/cases_widget.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/cases_widget.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/companies_widget.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/companies_widget.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/contacts.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/contacts.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/customize.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/customize.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/deal_widget.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/deal_widget.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_case_participants.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_case_participants.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_cases.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_cases.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_companies.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_companies.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_company_participants.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_company_participants.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_deals.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_deals.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_invoices.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_invoices.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_opportunity_participants.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_opportunity_participants.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_persons.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_persons.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_phones.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_phones.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_products_services.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_products_services.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_projects.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_projects.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_social.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_social.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_tags.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_tags.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_tasks.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_tasks.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_taxes.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_taxes.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_twitter.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_twitter.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_userfields.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_userfields.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_voip_settings.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_voip_settings.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/export_data.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/export_data.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-cases.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-cases.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-opportunities.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-opportunities.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-tasks.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-tasks.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import_contacts.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import_contacts.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/integration.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/integration.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/invoice.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/invoice.svg create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/loader-dark-24.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/mail_send.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/mail_send.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/people_widget.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/people_widget.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/sales.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/sales.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/tasks_widget.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/tasks_widget.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/web_to_leads.png create mode 100644 web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/web_to_leads.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-blogstyle.less create mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-bookmarkingstyle.less create mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-main.less create mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-newsstylesheet.less create mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-params.less create mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-style.less create mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-wikicss.less delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-blogs.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-blogs.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-bookmarks.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-bookmarks.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-employees.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-employees.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-events.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-events.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-helpcenter.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-helpcenter.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/params.less rename web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/{blogstyle.css => blogstyle.less} (82%) delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/BlogIconWG.png delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blog_add.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blog_add.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blog_icon.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blog_icon.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blogiconwg.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blogs.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blogs.svg rename web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/css/{bookmarkingstyle.css => bookmarkingstyle.less} (81%) delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarking_icon.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarking_icon.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarking_mini_icon.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarking_mini_icon.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarks_icon.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarks_icon.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/goldstar.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/goldstar.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forum_icon.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forum_icon.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forum_mini_icon.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forum_mini_icon.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forums_icon.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forums_icon.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/upload.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/upload.svg rename web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/{style.css => style.less} (71%) delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_advert.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_advert.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_news.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_news.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_newslogo.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_newslogo.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_order.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_order.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_poll.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_poll.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_advert.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_advert.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_news.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_news.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_order.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_order.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_poll.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_poll.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/newslogo.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/newslogo.svg rename web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/{newsstylesheet.css => newsstylesheet.less} (75%) rename web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/{filetype_style.css => filetype_style.less} (92%) rename web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/{wikicss.css => wikicss.less} (74%) rename web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/{wikicssprint.css => wikicssprint.less} (91%) delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/page.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/page.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo150.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo150.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo16.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo16.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo32.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo32.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/content/box.png create mode 100644 web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/content/box.svg rename web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/content/{main.css => main.less} (87%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/bright-blue/params.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-bright-blue/leftmenu.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-bright-blue/params.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-dark-green/leftmenu.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-dark-green/params.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-deep-blue/leftmenu.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-deep-blue/params.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-default/leftmenu.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-default/params.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-green/params.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-pure-orange/leftmenu.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-pure-orange/params.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-wild-pink/leftmenu.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/dark-wild-pink/params.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/deep-blue/params.less rename web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/{app.css => app.less} (90%) rename web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/{common.css => common.less} (93%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/dark-common.less rename web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/{filechoice.css => filechoice.less} (94%) delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/corporatefiles_big.png create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/corporatefiles_big.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen.png create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_corporate.png create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_corporate.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_favorites.png create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_favorites.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_filter.png create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_filter.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_forme.png create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_forme.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_my.png create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_my.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_privacy.png create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_privacy.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_project.png create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_project.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_recent.png create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_recent.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_templates.png create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_templates.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_trash.png create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/empty_screen_trash.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/personal_convert.png create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/images/personal_convert.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/params.less rename web/studio/ASC.Web.Studio/Products/Files/App_Themes/default/{saveas.css => saveas.less} (93%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/pure-orange/params.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/App_Themes/wild-pink/params.less rename web/studio/ASC.Web.Studio/Products/Files/Controls/AccessRights/{accessrights.css => accessrights.less} (92%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/AccessRights/dark-accessrights.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/AccessRights/dark-formfilling.less rename web/studio/ASC.Web.Studio/Products/Files/Controls/AccessRights/{formfilling.css => formfilling.less} (95%) rename web/studio/ASC.Web.Studio/Products/Files/Controls/AppBanner/{appbanner.css => appbanner.less} (50%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/AppBanner/appbanner_icons.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/AppBanner/dark-appbanner.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/AppBanner/images/android_dark-theme.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/AppBanner/images/android_gray_dark-theme.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/AppBanner/images/ios_dark-theme.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/AppBanner/images/ios_gray_dark-theme.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/AppBanner/images/linux_dark-theme.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/AppBanner/images/linux_gray_dark-theme.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/AppBanner/images/mac_dark-theme.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/AppBanner/images/mac_gray_dark-theme.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/AppBanner/images/win_dark-theme.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/AppBanner/images/win_gray_dark-theme.svg rename web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/{chunkuploaddialog.css => chunkuploaddialog.less} (70%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/dark-chunkuploaddialog.less rename web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/{contentlist.css => contentlist.less} (92%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/dark-contentlist.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/images/throbber-dark-16.svg rename web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/{confirmconvert.css => confirmconvert.less} (75%) rename web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/{convertfile.css => convertfile.less} (93%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/dark-convertfile.less delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/images/convert_alert.png create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/images/convert_alert.svg rename web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/{desktop.css => desktop.less} (93%) rename web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/{emptyfolder.css => emptyfolder.less} (92%) rename web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/{filechoisepopup.css => filechoisepopup.less} (92%) rename web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/{fileselector.css => fileselector.less} (87%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/dark-maincontent.less rename web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/{maincontent.css => maincontent.less} (92%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/MoreFeatures/css/dark-morefeatures.less rename web/studio/ASC.Web.Studio/Products/Files/Controls/MoreFeatures/css/{morefeatures.css => morefeatures.less} (88%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/PrivateRoomOpenFile/dark-privateroomopenfile.less rename web/studio/ASC.Web.Studio/Products/Files/Controls/PrivateRoomOpenFile/{privateroomopenfile.css => privateroomopenfile.less} (90%) rename web/studio/ASC.Web.Studio/Products/Files/Controls/Sailfish/{sailfish.css => sailfish.less} (85%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/SharingDialog/dark-sharingdialog.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/SharingDialog/images/folder_link.svg rename web/studio/ASC.Web.Studio/Products/Files/Controls/SharingDialog/{sharingdialog.css => sharingdialog.less} (52%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/ThirdParty/dark-thirdparty.less delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/ThirdParty/images/svg/icon_box_small.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/ThirdParty/images/svg/icon_dropbox.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/ThirdParty/images/svg/icon_google-drive_-dark.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/ThirdParty/images/svg/icon_onedrive.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/ThirdParty/images/svg/icon_onedrive_1.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/ThirdParty/images/svg/icon_owncloud.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/ThirdParty/images/svg/icon_sharepoint.svg rename web/studio/ASC.Web.Studio/Products/Files/Controls/ThirdParty/{thirdparty.css => thirdparty.less} (61%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/Tree/dark-tree.less create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/Tree/images/loader-dark-12.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/Tree/leftmenu.less delete mode 100644 web/studio/ASC.Web.Studio/Products/Files/Controls/Tree/tree.css rename web/studio/ASC.Web.Studio/Products/Files/Controls/Tree/{treebuilder.css => treebuilder.less} (91%) create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Core/Entries/FileReferenceData.cs create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Core/Security/FileShareOptions.cs create mode 100644 web/studio/ASC.Web.Studio/Products/Files/Utils/FilesChunkedUploadSessionHolder.cs create mode 100644 web/studio/ASC.Web.Studio/Products/Files/loader-dark.html create mode 100644 web/studio/ASC.Web.Studio/Products/People/App_Themes/dark/dark-birthdays.less create mode 100644 web/studio/ASC.Web.Studio/Products/People/App_Themes/dark/dark-carddav.less create mode 100644 web/studio/ASC.Web.Studio/Products/People/App_Themes/dark/dark-people.master.less create mode 100644 web/studio/ASC.Web.Studio/Products/People/App_Themes/dark/params.less rename web/studio/ASC.Web.Studio/Products/People/App_Themes/default/css/{birthdays.css => birthdays.less} (92%) rename web/studio/ASC.Web.Studio/Products/People/App_Themes/default/css/{carddav.css => carddav.less} (54%) create mode 100644 web/studio/ASC.Web.Studio/Products/People/App_Themes/default/css/params.less delete mode 100644 web/studio/ASC.Web.Studio/Products/People/App_Themes/default/images/birthdayEmpScr.png create mode 100644 web/studio/ASC.Web.Studio/Products/People/App_Themes/default/images/birthdayEmpScr.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/People/App_Themes/default/images/product_logomiddle.png create mode 100644 web/studio/ASC.Web.Studio/Products/People/App_Themes/default/images/product_logomiddle.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/People/App_Themes/default/imgs/birthday.png create mode 100644 web/studio/ASC.Web.Studio/Products/People/App_Themes/default/imgs/birthday.svg create mode 100644 web/studio/ASC.Web.Studio/Products/People/UserControls/ImportUsers/css/dark-import.less delete mode 100644 web/studio/ASC.Web.Studio/Products/People/UserControls/ImportUsers/images/from_file.png create mode 100644 web/studio/ASC.Web.Studio/Products/People/UserControls/ImportUsers/images/from_file.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/People/UserControls/ImportUsers/images/manually.png create mode 100644 web/studio/ASC.Web.Studio/Products/People/UserControls/ImportUsers/images/manually.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/dark/dark-addmilestonecontainer.less create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/dark/dark-allprojects.less create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/dark/dark-common.less create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/dark/dark-full.less create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/dark/dark-ganttchart.less create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/dark/dark-params.less create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/dark/dark-reportsprint.less create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/dark/dark-settings.less rename web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/css/{addmilestonecontainer.css => addmilestonecontainer.less} (86%) create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/css/full.less rename web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/css/{ganttchart.css => ganttchart.less} (83%) rename web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/css/{import.css => import.less} (93%) create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/css/params.less rename web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/css/{projectaction.css => projectaction.less} (86%) rename web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/css/{projecttemplates.css => projecttemplates.less} (91%) rename web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/css/{reports.css => reports.less} (88%) rename web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/css/{reportsprint.css => reportsprint.less} (74%) create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/dark_gantt_icons_left_panel.png delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/dashboard/design-project-hierarchy.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/dashboard/design-project-hierarchy.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/dashboard/manage-access-rights.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/dashboard/manage-access-rights.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/dashboard/track-time-and-progress.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/dashboard/track-time-and-progress.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/dashboard/use-more-tools.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/dashboard/use-more-tools.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_comments.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_comments.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_discussions.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_discussions.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_milestones.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_milestones.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_persons.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_persons.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_relatedtasks.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_relatedtasks.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_subtasks.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_subtasks.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_tasks.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_tasks.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_time_tracking.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/empty_screen_time_tracking.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/icon_empty_gantt.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/icon_empty_gantt.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/project-templates_logo.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/project-templates_logo.svg delete mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/projects_logo.png create mode 100644 web/studio/ASC.Web.Studio/Products/Projects/App_Themes/default/images/projects_logo.svg create mode 100644 web/studio/ASC.Web.Studio/Products/Sample/App_Themes/dark/dark-style.less create mode 100644 web/studio/ASC.Web.Studio/Products/Sample/App_Themes/dark/params.less create mode 100644 web/studio/ASC.Web.Studio/Products/Sample/App_Themes/default/css/params.less delete mode 100644 web/studio/ASC.Web.Studio/ThirdParty/plugin/wordpress/icon.png create mode 100644 web/studio/ASC.Web.Studio/ThirdParty/plugin/wordpress/icon.svg create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/Attachments/css/dark-attachments.less delete mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/Attachments/images/documents-logo.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/Attachments/images/documents-logo.svg create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/Authorize/css/dark-authorize.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/dark-authorizedocs.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/dark-custom-mode.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/css/dark-help-center.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/LoaderPage/css/dark-loaderpage.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/dark-mediaplayer.less rename web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/{mediaplayer.css => mediaplayer.less} (93%) create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/css/dark-personalfooter.less rename web/studio/ASC.Web.Studio/UserControls/Common/PollForm/css/{style.css => style.less} (91%) rename web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/css/{preparationportal.css => preparationportal.less} (99%) create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/Search/css/dark-searchresults.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-bright-blue/sharingsettingsparams.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-dark-green/sharingsettingsparams.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-deep-blue/sharingsettingsparams.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-default/sharingsettingsparams.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-pure-orange/sharingsettingsparams.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-wild-pink/sharingsettingsparams.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/dark-smallchat.less rename web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/{smallchat.css => smallchat.less} (92%) create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ViewSwitcher/css/dark-viewswitcher.less rename web/studio/ASC.Web.Studio/UserControls/Common/ViewSwitcher/css/{viewswitcher.css => viewswitcher.less} (80%) create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/dialog.css create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/dialog_ie.css create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/dialog_ie7.css create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/dialog_ie8.css create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/dialog_iequirks.css create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/dialog_opera.css create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/editor.css create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/editor_gecko.css create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/editor_ie.css create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/editor_ie7.css create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/editor_ie8.css create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/editor_iequirks.css create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/icons.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/icons_hidpi.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/images/arrow.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/images/close-ckeditor.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/images/close.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/images/hidpi/close.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/images/hidpi/lock-open.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/images/hidpi/lock.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/images/hidpi/refresh.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/images/lock-open.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/images/lock.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/images/refresh.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/readme.md create mode 100644 web/studio/ASC.Web.Studio/UserControls/Common/ckeditor/skins/dark-teamlab/skin.js create mode 100644 web/studio/ASC.Web.Studio/UserControls/DeepLink/css/dark-deeplinking.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Feed/css/dark-feed.less delete mode 100644 web/studio/ASC.Web.Studio/UserControls/Feed/images/empty_filter.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Feed/images/empty_filter.svg delete mode 100644 web/studio/ASC.Web.Studio/UserControls/Feed/images/empty_screen_feed.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Feed/images/empty_screen_feed.svg create mode 100644 web/studio/ASC.Web.Studio/UserControls/FirstTime/css/dark-emailandpassword.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/FirstTime/css/dark-stepcontainer.less delete mode 100644 web/studio/ASC.Web.Studio/UserControls/FirstTime/css/images/warning_16.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/FirstTime/css/images/warning_16.svg create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/AccessRights/css/dark-accessrights.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/AdminHelperSettings/css/dark-adminhelpersettings.less delete mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/AuditTrail/img/audit_trail_empty_screen.jpg create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/AuditTrail/img/audit_trail_empty_screen.svg rename web/studio/ASC.Web.Studio/UserControls/Management/AuthorizationKeys/css/{authorizationkeys.css => authorizationkeys.less} (91%) create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/AuthorizationKeys/css/dark-authorizationkeys.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/Backup/js/consumersettings.js rename web/studio/ASC.Web.Studio/UserControls/Management/ColorThemes/css/{colorthemes.css => colorthemes.less} (59%) create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ColorThemes/css/img/dark_mode_themes_previews_sprite.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ConfirmActivation/css/dark-confirmactivation.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ConfirmInviteActivation/css/dark-confirm_invite_activation.less rename web/studio/ASC.Web.Studio/UserControls/Management/DocService/css/{docservice.css => docservice.less} (90%) rename web/studio/ASC.Web.Studio/UserControls/Management/FullTextSearch/css/{fulltextsearch.css => fulltextsearch.less} (94%) create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ImpersonateUser/ImpersonateSettings.ascx create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ImpersonateUser/ImpersonateSettings.ascx.cs create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ImpersonateUser/ImpersonateSettings.ascx.designer.cs create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ImpersonateUser/ImpersonateUserConfirmationPanel.ascx create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ImpersonateUser/ImpersonateUserConfirmationPanel.ascx.cs create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ImpersonateUser/ImpersonateUserConfirmationPanel.ascx.designer.cs create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ImpersonateUser/css/impersonatesettings.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ImpersonateUser/css/impersonateuserconfirmationpanel.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ImpersonateUser/js/impersonatesettings.js create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ImpersonateUser/js/impersonateuserconfirmationpanel.js create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/InvitePanel/css/dark-invitepanel.less delete mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/InvitePanel/css/img/themes_previews_sprite.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/LdapSettings/css/Default/dark-ldapsettings.less rename web/studio/ASC.Web.Studio/UserControls/Management/LdapSettings/css/Default/{ldapsettings.css => ldapsettings.less} (92%) create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/LoginHistory/css/dark-loginhistory.less delete mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/LoginHistory/img/login_history_empty_screen.jpg create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/LoginHistory/img/login_history_empty_screen.svg create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/LoginSettings/LoginSettings.ascx create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/LoginSettings/LoginSettings.ascx.cs create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/LoginSettings/LoginSettings.ascx.designer.cs create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/LoginSettings/css/loginsettings.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/LoginSettings/js/loginsettings.js rename web/studio/ASC.Web.Studio/UserControls/Management/MailService/css/{mailservice.css => mailservice.less} (92%) create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/Monitoring/css/dark-monitoring.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/Monitoring/css/img/loader-dark-16.svg create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/PasswordSettings/css/dark-passwordsettings.less delete mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/PasswordSettings/js/slider.js create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ProfileOperation/css/dark-profileoperation.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ShareLinkPassword/ShareLinkPassword.ascx create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ShareLinkPassword/ShareLinkPassword.ascx.cs create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ShareLinkPassword/ShareLinkPassword.ascx.designer.cs create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ShareLinkPassword/css/sharelinkpassword.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/ShareLinkPassword/js/sharelinkpassword.js rename web/studio/ASC.Web.Studio/UserControls/Management/SingleSignOnSettings/css/{singlesignonsettings.css => singlesignonsettings.less} (91%) create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/css/smsvalidationsettings.less rename web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/css/{smtpsettings.css => smtpsettings.less} (93%) create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/StorageSettings/css/dark-storagesettings.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/TariffSettings/css/dark-tariff.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/TariffSettings/css/dark-tariffcustom.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/TariffSettings/css/dark-tariffhistory.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/TariffSettings/css/dark-tariffsaas.less delete mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/TariffSettings/css/img/add_users_info.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/TariffSettings/css/img/add_users_info.svg delete mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/TariffSettings/css/img/icon_storage.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Management/TariffSettings/css/img/icon_storage.svg create mode 100644 web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/ClientTemplateResources.cs create mode 100644 web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/Templates/PeopleTemplates.html create mode 100644 web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/css/dark_productquotes_style.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/img/corner-dark.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/js/jq_quota_extensions.js create mode 100644 web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/js/navigatorhandler.js create mode 100644 web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/js/user_quota_controller.js create mode 100644 web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/css/dark-connections.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/dark-loadphoto_style.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/dark-profileeditcontrol_style.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/dark-userprofilecontrol_style.less delete mode 100644 web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/images/birthday.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/images/birthday.svg delete mode 100644 web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/images/user-blocked.png create mode 100644 web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/images/user-blocked.svg create mode 100644 web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/css/dark-subscriptions.less create mode 100644 web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/css/img/hmenu-selected-dark.png delete mode 100644 web/studio/ASC.Web.Studio/Utility/TenantLogoHelper.cs create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/bright-blue/params.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/dark-bright-blue/calendar.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/dark-bright-blue/params.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/dark-dark-green/calendar.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/dark-dark-green/params.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/dark-deep-blue/calendar.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/dark-deep-blue/params.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/dark-default/calendar.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/dark-default/params.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/dark-green/params.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/dark-pure-orange/calendar.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/dark-pure-orange/params.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/dark-wild-pink/calendar.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/dark-wild-pink/params.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/deep-blue/params.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/default/params.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/pure-orange/params.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/App_Themes/wild-pink/params.less delete mode 100644 web/studio/ASC.Web.Studio/addons/calendar/Controls/DocumentsPopup/css/images/warning.png create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/Controls/DocumentsPopup/css/images/warning.svg create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/css/dark-attachments.less create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/dark-img/base_sprite.png create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/dark-img/circle-close.png create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/dark-img/event-alert.png create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/dark-img/event-repeat.png create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/dark-img/guest_statements.png create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/dark-img/ical.png create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/dark-img/list-header-add.png create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/dark-img/list-item-shared.png create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/dark-img/profile.png create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/dark-img/resizer.png create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/dark-img/settings_16.png create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/dark-img/trash.png delete mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/img/calendar_16.png delete mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/img/edit_pencil.png delete mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/img/header-add-calendar.png delete mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/img/header-add-event.png delete mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/img/header-add-subscriptions.png delete mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/img/header-list.png delete mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/img/list-item-edit.png delete mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/img/list-item-hidden.png delete mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/fullcalendar/img/list-item-visible.png create mode 100644 web/studio/ASC.Web.Studio/addons/calendar/UserControls/popup/css/dark-popup.less rename web/studio/ASC.Web.Studio/addons/calendar/UserControls/popup/css/{popup.css => popup.less} (73%) create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/dark/dark-full.less create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/dark/dark-params.less delete mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/add-mailboxes_32.png create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/add-mailboxes_32.svg delete mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/blank_sprite.png create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/block_mail.svg delete mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/dashboard/collect-all-emails-in-one-place.png create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/dashboard/collect-all-emails-in-one-place.svg delete mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/dashboard/communicate-easily.png create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/dashboard/communicate-easily.svg delete mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/dashboard/structure-correspondence.png create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/dashboard/structure-correspondence.svg delete mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/dashboard/use-mail-server.png create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/dashboard/use-mail-server.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/incoming_mail.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/loader/loader-dark-16.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/loader/loader-dark-32.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/mail_add.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/mail_added_contact.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/mail_company.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/mail_domain.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/mail_filter.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/mail_folder.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/mail_new_contact.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/mail_person.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/mail_send.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/mail_tags.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/mail_trash.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/mail_warning.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/images/write_letter.svg create mode 100644 web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/less/full.less rename web/studio/ASC.Web.Studio/addons/mail/App_Themes/default/less/{settings.less => params.less} (66%) delete mode 100644 web/studio/ASC.Web.Studio/addons/mail/Controls/DocumentsPopup/css/images/warning.png create mode 100644 web/studio/ASC.Web.Studio/addons/mail/Controls/DocumentsPopup/css/images/warning.svg delete mode 100644 web/studio/ASC.Web.Studio/addons/talk/App_Themes/default/images/talk128.png create mode 100644 web/studio/ASC.Web.Studio/addons/talk/App_Themes/default/images/talk128.svg delete mode 100644 web/studio/ASC.Web.Studio/addons/talk/App_Themes/default/images/talk16.png create mode 100644 web/studio/ASC.Web.Studio/addons/talk/App_Themes/default/images/talk16.svg delete mode 100644 web/studio/ASC.Web.Studio/addons/talk/App_Themes/default/images/talk32.png create mode 100644 web/studio/ASC.Web.Studio/addons/talk/App_Themes/default/images/talk32.svg delete mode 100644 web/studio/ASC.Web.Studio/addons/talk/App_Themes/default/images/talk48.png create mode 100644 web/studio/ASC.Web.Studio/addons/talk/App_Themes/default/images/talk48.svg create mode 100644 web/studio/ASC.Web.Studio/addons/talk/css/dark/dark-talk.messagearea.less create mode 100644 web/studio/ASC.Web.Studio/addons/talk/css/dark/dark-talk.style.less create mode 100644 web/studio/ASC.Web.Studio/addons/talk/css/dark/params.less delete mode 100644 web/studio/ASC.Web.Studio/addons/talk/css/default/imagescss/bg-conferencesplash-logo.png create mode 100644 web/studio/ASC.Web.Studio/addons/talk/css/default/imagescss/bg-conferencesplash-logo.svg create mode 100644 web/studio/ASC.Web.Studio/addons/talk/css/default/imagescss/bg-rect-dark.png delete mode 100644 web/studio/ASC.Web.Studio/addons/talk/css/default/imagescss/chat_background.png create mode 100644 web/studio/ASC.Web.Studio/addons/talk/css/default/imagescss/chat_background.svg create mode 100644 web/studio/ASC.Web.Studio/addons/talk/css/default/imagescss/chatsmiles-dark.png create mode 100644 web/studio/ASC.Web.Studio/addons/talk/css/default/imagescss/search-dark.png create mode 100644 web/studio/ASC.Web.Studio/addons/talk/css/default/imagescss/sendfile-dark.png create mode 100644 web/studio/ASC.Web.Studio/addons/talk/css/default/params.less rename web/studio/ASC.Web.Studio/addons/talk/css/default/{talk.messagearea.css => talk.messagearea.less} (84%) rename web/studio/ASC.Web.Studio/addons/talk/css/default/{talk.overview.css => talk.overview.less} (91%) rename web/studio/ASC.Web.Studio/addons/talk/css/default/{talk.style.de-de.css => talk.style.de-de.less} (90%) rename web/studio/ASC.Web.Studio/addons/talk/css/default/{talk.style.en-gb.css => talk.style.en-gb.less} (89%) rename web/studio/ASC.Web.Studio/addons/talk/css/default/{talk.style.en-us.css => talk.style.en-us.less} (89%) rename web/studio/ASC.Web.Studio/addons/talk/css/default/{talk.style.es-es.css => talk.style.es-es.less} (90%) rename web/studio/ASC.Web.Studio/addons/talk/css/default/{talk.style.fr-fr.css => talk.style.fr-fr.less} (90%) rename web/studio/ASC.Web.Studio/addons/talk/css/default/{talk.style.it-it.css => talk.style.it-it.less} (90%) rename web/studio/ASC.Web.Studio/addons/talk/css/default/{talk.style.css => talk.style.less} (94%) rename web/studio/ASC.Web.Studio/addons/talk/css/default/{talk.style.lv-lv.css => talk.style.lv-lv.less} (91%) rename web/studio/ASC.Web.Studio/addons/talk/css/default/{talk.style.pt-br.css => talk.style.pt-br.less} (90%) rename web/studio/ASC.Web.Studio/addons/talk/css/default/{talk.style.ru-ru.css => talk.style.ru-ru.less} (90%) rename web/studio/ASC.Web.Studio/addons/talk/css/default/{talk.text-overflow.css => talk.text-overflow.less} (93%) create mode 100644 web/studio/ASC.Web.Studio/js/asc/core/desktop.polyfills.js delete mode 100644 web/studio/ASC.Web.Studio/js/asc/plugins/jquery.tlblock.js create mode 100644 web/studio/ASC.Web.Studio/skins/dark-bright-blue/dark-params.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark-bright-blue/main.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark-dark-green/dark-params.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark-dark-green/main.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark-deep-blue/dark-params.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark-deep-blue/main.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark-default/dark-params.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark-default/main.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/advfilter-icons.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/btn-onoff.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/btn_icons.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/btn_row_icons.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/convert_pencil.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/dropdown-menu-icons.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/dropdown-menu-icons_retina.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/edit_lock.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/edit_pencil.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/gantt-icons.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/icons_nav_panel.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/icons_nav_panel_retina.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/mainmenu_upload.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/name_action.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/refresh.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/rotate.svg create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/switch_view.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/top-studio-menu.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/top-studio-menu_retina.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/unfollow.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/up.png create mode 100644 web/studio/ASC.Web.Studio/skins/dark-img/up.svg create mode 100644 web/studio/ASC.Web.Studio/skins/dark-pure-orange/dark-params.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark-pure-orange/main.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark-wild-pink/dark-params.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark-wild-pink/main.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark/dark-codestyle.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark/dark-common_style.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark/dark-empty-screen-control.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark/dark-groupselector.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark/dark-helper.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark/dark-jquery-advansedfilter-fix.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark/dark-jquery-advansedselector.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark/dark-jquery-emailadvansedselector.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark/dark-page-tabs-navigators.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark/dark-phonecontroller.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark/dark-toastr.less create mode 100644 web/studio/ASC.Web.Studio/skins/dark/dark-userselector.less rename web/studio/ASC.Web.Studio/skins/default/{codestyle.css => codestyle.less} (90%) rename web/studio/ASC.Web.Studio/skins/default/{filetype_style.css => filetype_style.less} (98%) rename web/studio/ASC.Web.Studio/skins/default/{groupselector.css => groupselector.less} (90%) delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/common_search_icon.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/common_search_icon.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/community150.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/community150.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dark-checkboxes.png delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/communicate-with-clients.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/communicate-with-clients.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/create-clients-database.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/create-clients-database.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/customize-your-crm.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/customize-your-crm.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/discuss-with-team.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/discuss-with-team.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/keep-your-team-posted.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/keep-your-team-posted.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/make-co-editing-comfy.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/make-co-editing-comfy.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/share-files.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/share-files.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/share-news-and-knowledge.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/share-news-and-knowledge.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/track-sales.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/track-sales.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/use-more-collaboration-tools.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/use-more-collaboration-tools.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/work-with-office-docs.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/dashboard/work-with-office-docs.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/default_user_photo_dark_size_200-200.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/default_user_photo_dark_size_32-32.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/default_user_photo_dark_size_360-360.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/default_user_photo_dark_size_48-48.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/default_user_photo_dark_size_82-82.png delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/documents150.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/documents150.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/empty_screen_filter.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/empty_screen_filter.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/empty_search.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/empty_search.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/exclamation.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/exclamation.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/jstree/throbber-dark-12.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/lastadded_widget.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/lastadded_widget.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/loader-dark-12.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/loader-dark-16.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/loader-dark-24.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/loader-dark-32.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/loader-dark-48.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/loader-dark-64.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/logo/about_dark.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/logo/about_dark_general.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/logo/about_light.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/logo/about_light_general.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/logo/light.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/logo/light_general.png delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/mail.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/mail.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/product_logo.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/product_logo.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/quickview.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/quickview.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/recent_activity.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/svg/context/icon_arrow_light.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/svg/crm/uploadlight.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/svg/exclamation.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/svg/people/close.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/svg/settings/recalculate_quota.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/svg/share/lifetime.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/svg/share/password.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/svg/share/trash.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/svg/share/user_avatar_dark.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/talk.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/to_left.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/to_left.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/images/to_right.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/to_right.svg create mode 100644 web/studio/ASC.Web.Studio/skins/default/images/ui-icons_cccccc_256x240.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/imagescss/dark-close.png delete mode 100644 web/studio/ASC.Web.Studio/skins/default/imagescss/security.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/imagescss/security.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/imagescss/upload.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/imagescss/upload.svg delete mode 100644 web/studio/ASC.Web.Studio/skins/default/imagescss/welcometo_logo.png create mode 100644 web/studio/ASC.Web.Studio/skins/default/imagescss/welcometo_logo.svg rename web/studio/ASC.Web.Studio/skins/default/{jquery-emailadvansedselector.css => jquery-emailadvansedselector.less} (80%) create mode 100644 web/studio/ASC.Web.Studio/skins/default/jstree/themes/default/dark-style.less rename web/studio/ASC.Web.Studio/skins/default/{phonecontroller.css => phonecontroller.less} (97%) diff --git a/.nuget/packages/SharpZipLib.1.4.2.nupkg b/.nuget/packages/SharpZipLib.1.4.2.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..797c71078e0d6d79e54d0df35480b885876eeb37 GIT binary patch literal 797159 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

1gEu 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

L`; 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

{FI5%r{%*`hU&W?Go&h+IyBSrpVo-OS3Y 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

-pkOE2VdZDsd#uOcn+#ex5Z`>^-EIL{;Mj0bXj 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%0D+O864i2{r#^;*| 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

t#fcYicr%Bu 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 K;glFN5 MB file from an external access folder. +* Added translation of comments in source code into English. +* Fixed styles for Dark mode. +* Fixed styles for SSO. +* Refactoring of AutoCleanUp. +* Improvements for building server versions. +* Fixed dependency installation for python version 3.11 or later. +* Fixed moving backup file after backup to s3. +* Quota: fixed SetTenantQuotaRow function. +* Refactoring of DbManager. + +### Documents module + +* Added conversion of dps, dpt, et, ett, htm, mhtml, stw, sxc, sxi, sxw, wps, wpt, and xlsb files to supported formats. + +## Version 12.5.1 + +### General portal changes + +* Fixed issue with editors not opening (Error 500. Internal server error) when external sharing is disabled (Bug #61800). +* Fixed issue with 'Warning! Connection is lost' appearing error upon restoring version from editor while file is being edited (Bug #61772). +* Fixed issue when pressing Enter while creating an external link in the editor would also close the Sharing Setting window (Bug #61939). +* Fixed issue in Mail when the file selection window wouldn't expand when many folders are opened (Bug #61158). +* Fixed issue in Calendar when Invitations and cancellations are not sent for an event created in another calendar using a CalDAV link (Bug #48022). +* Fixed issue in Calendar when the Create button woudl not close after changing the year or month (Bug #59590). +* Fixed issue in CRM when a reset filter is reactivated on subsequent page transitions (Bug #54608). +* Added the ability in CRM to create a company to which another company is linked via the personList field (Bug #61715). +* Replaced the 'important' icon in a contact's history (Bug #61766). +* Fixed issue with updating a database with a missing stamp column (Bug #61838). +* Fixed issue with 'Error 500. Internal server error' when going to user's LDAP profile (Bug #61966). +* Fixed issue with infinite loading of files when creating them in a private room (Bug #61517). +* Fixed issue with incorrect width of text fields on the Settings > Integration > SSO (SaaS) page (Bug #61979). +* Fixed issue with Restore default settings action working incorrectly for LDAP Settings (SaaS) (Bug #49668). +* Fixed issue when synchronization with the LDAP server is enabled, the "+" sign is removed from the Primary Mobile Phone attribute in the user card (SaaS) (Bug #61986). +* Fixed issue with Dropdown menu styles in LDAP Settings > Auto Sync not adapted to dark theme (SaaS) (Bug #61974). +* Fixed issue with RabbitMQ not starting (Bug #1323). +* Fixed numerous issues for API documentation (Bugs #61734, #61735, #61737, #61740, #61742). +* Fixed issue with backup for s3: split large file uploads into pieces. +* User contact data template for telegram has been changed, now it is a http://t.me/{0} link with username substitution. +* Added redirect to the wrongportalname website page with the referer parameter (for correct operation when transferring the region from com to the co domain). +* Blocked display of user statistics until Quota is recalculated. +* Quota: added user recalculation by portal. +* Improvements for building server versions. + +## Version 12.5.0 + +### General portal changes + +* Logins and user actions can now be stored to syslog via nlog. +* Removed the unused 'department' column from the 'core_user' Sql table. +* Optimized backup. +* Removed the unused 'SendNoticeCallback' parameter. +* Updated nlog to v5.0.0. +* Added the ability to log in via SaslMechanismNtlm to SMTP settings. +* Added new icons for placeholder pages. +* Added the ability to set the number of login attempts, blocking time, and check period. +* Added the ability to set allowed IP addresses for users and admins separately in the IP Security setting. Added support for CIDR masking. +* Added API methods for changing email/password without email activation. +* Added the ability to set trusted IP addresses for which two-factor verification will not be performed, as well as to add users or groups for which two-factor verification will be performed. Added support for CIDR masking. +* Added the ability to add self-signed certificate for SSO, WebDAV. +* Optimized Feed operation. +* Changed settings for connecting third-party storages. Added tooltips for fields. Added the 'Server Side Encryption Method' block for Amazon AWS S3. +* Added Dark theme. +* Added logos for dark theme in the White Labeling section. Logos for the About page are now moved to the Control Panel. +* Added the new 'Lead' field to the team template. +* Added Impersonation Settings which allow the portal owner and full access administrators to log in to the portal on behalf of any user. +* Added the ability to set the password maximum length. +* Added the ability to set the memory quota for users. +* Added the ability to recalculate the space used by users. +* Added policies for working with third-party services, such as bar, helpcenter, moneyconverter. Policies unclude Retry policy, Timeout policy, Circuit policy. + +### Documents module + +* Added thumbnails adaptive layout. +* Improved conversion of password protected files. +* Add the ability to upload a structure of empty folders via drag-and-drop. +* Hidden Private Room in dialog windows for files/folders selection. +* Added empty file templates in Armenian, Basque, and Malay. +* Removed Wordpress, EasyBib from the Third-Party services settings. +* Fixed the issue when documents, spreadsheets, presentations created in Google Drive are not correctly recognized when opening on the portal. +* Errors are now displayed on the DeepLink page. +* Added the ability to create multiple external links to files and folders. +* Added the ability to set password protection for external links. +* Added the ability to set time limit for external links. +* Added the ability to insert data from a third-party source to a spreadsheet (compartible with Docs v.7.3). +* Common viewer is used instead of live viewer for anonymous users. +* Added the mobile view for the Sharing settings dialog window in the flat mode. + +### Calendar module + +* Moved scripts from the client to the .cs file. + +### Mail module + +* Changed the request type of the mail/filters/check API method from GET to POST. +* Added the ability to log in via SaslMechanismNtlm. +* Added the Drafts folder synchronization for ImapSync. + +### CRM module + +* Added the Angolan Kwanza (AOA) non-convertible currency. +* Added the Venezuelan Bolivar Soberano (VES) convertible currency. + +### Control Panel + +* Changed API methods for migration, implemented progressQueue. +* Changed settings for connecting third-party storages. Added tooltips for fields. Added the 'Server Side Encryption Method' block for Amazon AWS S3. +* Added logos for dark theme in the Branding section. Logos for the About page are now separate fields in the Advanced tab. +* Added the ability to set the portal memory quota. + +## Version 12.1.0 + +### General portal changes + +* Fixed issue with processing mail messages containing a calendar event in the attachment (Bug #58533). +* Fixed issue with group filtering (Bug #58230). +* Fixed issue with loading of the currency convertor in CRM Opportunities (Bug #58651). +* Fixed issue with synchronizing between portal and mail client when grouping email chains (Bug #57194). +* Fixed issue with synchronizing between portal and mail client when filtering emails (Bug #57201). +* Fixed issue with Mail Services when installing on Ubuntu 22.04 (Bug #58608). +* Fixed issue with Redis and MySQL service dependencies in the systemd service files (Bug #58550). +* Fixed issue with functioning of the god service /etc/god/conf.d/services.god (Bug #58547). +* Fixed issue with installing on Ubuntu via Hetzner hosting (Bug #58609). +* Updated mysql-apt-config package (Bug #58374). +* Fixed issue with opening a document after successful 2FA authorization (Bug #58709). +* Fixed issue with sending notification emails about updates in the calendar event when changing it through the editing window (Bug #58726). +* Fixed issue with deleting a folder with several emails (Bug #58921). +* Fixed issue with unread/read emails when synchronizing between portal and mail client (Bug #57173). +* Fixed issue with installing a DEB package on Ubuntu 20.04 and Debian 10 (Bug #58920). +* Fixed SSL issues with WarmUp of Docker installations under https when restarting the container. +* API methods for changing email/password without mail activation added. +* The autocomplete="new-password" attribute is set in the password setting field when creating a user. +* Fixed displaying of the notification window for unactivated emails. +* Fixed Feed styles for mobile devices. +* API rebranding methods (for the default tenant) are available only to the administrator. +* Updated MySQL version to 8.0.30. +* Added mysql-apt-config update. +* Added automatic getting of the MySQL repository version. +* Corrected OCI for Ubuntu 22.04. +* Fixed restart confirmation for Ubuntu Jammy. +* Fixed and updated Node.js installation for Ubuntu Jammy. +* Fixed and updated MySQL installation for Ubuntu Jammy. +* Added always restart for Node.js/DotNet services. +* Removed restart of mail services by using the god service. +* Updated monoserve.service. + +### Documents module + +* Added push notifications for events related to folders and files. Subscription/unsubscription within mobile applications. + +### Mail module + +* Added functionality for receiving emails from custom folders and their synchronization with the Mail Server for ImapSync. +* Fixed issue with emails moved to the custom folder (Bug #58742). +* Fixed issue with synchronizing between portal and mail client when making changes in the client (Bug #55800). +* Fixed issue with lost email in the web when moving it to the custom folder in the synchronized email client (Bug #56745). +* Fixed issue marking an email as important when sending/receiving it from a custom mailbox (Bug #56932). + +## Version 12.0.1 + +### General portal changes + +* Fixed issue with deep linking. +* Fixed Migration feature. +* Storing indexing status as a list instead of a field for ElasticSearch API. +* Enhanced Backup service. +* Fixed unavailable Feed after data restoring (Bug #58135). +* Fixed invalid ‘Fork me on GitHub’ button link in the Sample (Bug #57588). +* Portal users and guests are no more able to make the API SMTP settings request (Bug #57244). +* Fixed issue with displaying a new company name (after changing White Label settings) in the password change emails and other similar requests (Bug #56435). +* Personal user info is hidden from those who has no access to the People module (Bug #57851). +* A drop-down menu in the calendar added when clicking on a month/year (Bug #54767). +* Displaying an input cursor in the search bar when filtering with a drop-down list of users (Bug #57317). + +### Server installations + +* Removed storage_root parameter when starting Mail services. +* Fixed dotnet dependency installation. +* Fixed msttcore-fonts installation. +* Upgraded elasticsearch to version 7.16.3 in packages. +* Fixed memory allocation for elasticsearch. +* Fixed issue with config files after updating on Windows (Bug #50992). +* Fixed issue with security configs when making GET requests (Bug #57254). +* Fixed issue with mail services when installing on RedHat 8.6 and Centos 8 (Bug #57624). + +### Documents module + +* Changed frequency of displaying a hint page when opening a file in Private Room from the web version. +* Updated layout of the files list due to new Favorites icons. +* Restriction to open DOC files for editing on mobile devices (Bug #57373). +* Added new filtering parameters searchInContent and withSubfolders to API methods. +* Changed type of some API methods from GET to PUT/POST (Bug #57371). +* Users and their emails are not displayed in mentions if there isn’t access to the People module (Bug #58037). + +### Mail module + +* Added ‘On top’ button when zooming in empty folders (Bug #57671). +* Fixed issue with sending an email with a link to a non-editable file in the trial portal version (Bug #54637). +* Fixed DOCXF and OFORM icons when attaching files as a link (Bug #57657). +* Fixed issue with forwarding emails added to the Templates (Bug #57466). +* Fixed issue with filter settings (Bug #57200). +* Fixed issue with selecting emails as read/unread (Bug #57390). +* Fixed issue with the pop-up notification about a disabled account when printing out emails (Bug #57324). +* Fixed issue with re-opening of email signature settings (Bug #57322). +* Fixed issue with using the filter when selecting a date by custom period (Bug #57510). +* Fixed issue with downloading a file when clicking on the .docxf/.oform format link in Chrome (Bug #57651). + +### People module + +* Fixed Active connections check. +* Fixed issue with generating a CardDav book in case user emails contain capital letters (Bug #57831). +* Updated drop-down tooltip when setting a password (Bug #57673). +* Fixed issue with the https link in the invitation email when importing users (Bug #57519). + +### Projects module + +* Fixed issue with displaying the Time Tracking entry after its creation (Bug #57901) +* Fixed issue with closing CKEditor window after editing a task title (Bug #57625). +* Restriction of using XSS script in the milestone title (Bug #57559). +* Restriction of using XSS script in the Gantt Chart status (Bug #57256). +* Fixed issue with the incorrect link to the re-opened task in Telegram notifications (Bug #58107). +* Fixed issue with custom task status when re-opening it (Bug #57140). +* Administrator is automatically added to the project team when administrator assigns a task to themselves (Bug #57052). +* Fixed issue with filtering overdue milestones (Bug #57356). +* Fixed issue with filtering tasks when changing the Responsible: Me filter (Bug #57354). +* Fixed displaying of date format in Gantt Chart to match the format set on the portal (Bug #57370). + +### CRM module + +* Restriction of using XSS script in the Products & Services settings (Bug #57242). +* Fixed issue with the drop-down list in Invoices when page scrolling (Bug #57578). +* Removed ‘Show total amount’ link for deals without a budget (Bug #57386). + +### Calendar module + +* Updated functionality of attaching files from the Documents module. +* Restriction to access events of other users using the historybyid.json method (Bug #58057). +* Fixed issue with unsubscribing from the event (Bug #58118). +* Restriction of using XSS script in To-do list (Bug #57307). +* Fixed issue with the doubled window in the mini-calendar when selecting a month/year (Bug #57480) +* Fixed issue with the CalDav link when the HTTPS certificate is activated (Bug #53265). + +### Control Panel + +* Fixed issue with brand logos after updating in the Docker installation (Bug #57331). +* Fixed issue with data import from Google Workspace in case the archive contains incorrect meta-information files (Bug #57617). + +## Version 12.0.0 + +### General portal changes + +* Added the ability to connect apps for authorization via AppleId and Microsoft. +* Changed keys for authorization via Twilio. +* Changed keys for authorization via bitly. +* Added the portal name in logs. +* Updated to CKEditor v4.16.1, added new styles for TextCut and Magicline. +* Edited bottom paddings in the layout. +* Redesigned Feed and Mail drop-down lists. +* Redesigned textarea for the Chrome browser. +* Added a new page with UserVisits information in ASC.Web.Stat. +* Disabled Community module by default for new portals. +* Updated default image for the authorization page. +* Default logo for the About page cannot be changed by an administrator via the WhiteLabel settings in the SaaS version. +* Fixed Telegram notifications and Zendesk chat. +* Portal name cannot be less than 3 characters. +* DotNetZip library replaced with ICSharpCode.SharpZipLib, AjaxMin library replaced with NUglify. +* Fixed the bug related with IP Security and Talk vulnerabilities. +* Removed the ASC.Mail.Autoreply project and service. +* Removed the log cleaner for NLog. +* Fixed the AjaxPro and BinaryFormatter vulnerabilities. +* Redesigned userselector, added avatars. +* Updated emails about changing email and password. +* Added a tip on security in the general settings for the server version. +* Duplicated password entry field. +* Fixed deprecated methods after updating jquery. +* In the DNS settings, a custom domain can be added via the request to support for the SaaS version. +* Added mentions in comments to tasks, email messages, discussions. +* Added support for deep link: when opening a document in a mobile browser, user can choose if the document should be opened in a browser or in a mobile app. +* Disabled asp.net sessions in the project. + +### Documents module + +* Added a new page when opening documents in the Private Room via a web browser. +* Updated empty files. +* Added new settings to automatically clean up the Trash folder. +* Added support of fb2 files for viewing. +* Added the ability to download xml files with conversion / open for viewing. +* Added the ability to download text files with conversion to epub, fb2, html, dotx, ott. +* Added the ability to download spreadsheets with conversion to xltx, ots. +* Added the ability to download presentations with conversion to potx, otp. +* Added the ability to download oxps files with conversion to pdf / open for viewing. +* Added the ability to download oxps files with conversion to pdf / open for viewing. +* Added the ability to download files with conversion to OOXML with macros (docm, dotm, xlsm, xltm, pptm, potm). +* When interacting with editors, a file type is processed in incoming requests and is added in outgoing requests. +* The default About window is displayed in editors in the SaaS version. The logo and advanced branding are transferred to the editors About window in the server version. +* Added a link to FAQ when connecting Yandex. +* Fixed the file selection area. +* Redesigned the Sharing settings window. +* Added a new feature in the Sharing settings window - Can't print, download and copy file (for Read Only and Comment). +* Added a new feature in the Sharing settings window - Can't change sharing settings (for Full Access). +* Added a new feature in Common settings - Default access rights in sharing settings. +* Added a new section in the Admin settings - Sharing settings. +* Hidden the Private Room section in the FileChoice, SaveAs dialogs. +* When converting files, regional settings are transferred. +* Added missing logs for actions with files and folders, added new api methods for actions. +* Added the ability to add folders to Favorites. +* Added support of WebDAV server. + +### Calendar module + +* Added WYSIWYG CKEditor in the Description field of the event. +* Connected a new config for the Toolbar. +* Redesigned the Description column for the List page. +* Added DOMPurify sanitizer to prevent possible XSS. +* Added the ability to attach local files and links to files from the Documents module to events. + +### Projects module + +* Added the ability to drag-and-drop subtasks. +* Reworked reports: User Activity, Project List, add a time interval. + +### People module + +* Added Telegram in Contact information. +* Moved Birthdays from Community to People. +* Added Birthdays and New employees to Feed. +* Added the connection list in the profile with the ability to log out. +* Added the ability for administrators to log out all connections of the certain user. +* Removed import from Yahoo. +* Added the ability to create CardDAV address books. + +### Mail module + +* Added IMAP synchronization for Mail Server. +* Added the ability to perform Mail Server database backup and restore. +* Added the ability to request a read receipt. +* Moved the Aggregator, StorageCleaner and Watchdog mail services from the .Net Framework platform to .NET 6.0. + +### Control Panel + +* Added the Data Import page that allows to import data from Nextcloud, ownCloud and GoogleWorkspace to ONLYOFFICE Workspace. +* Moved Elasticsearch to a separate container. +* Fixed bugs. + +## Version 11.6.0 + +### Documents module + +* Added the `.docxf` and `.oform` format definition. Own format icons are displayed. +* Added the ability to download `.docx` as `.docxf`. `.docxf` can be downloaded in the same formats as for `.docx` and in the `.oform` format. +* Added the ability to create an empty `.docxf` file and to create it on the base of an existing `.docx` file. +* Added the ability to create an `.oform` file from a `.docxf` file via the context menu. +* Added the ability to create an `.oform` file from a `.docxf` file from the editor specifying a folder. +* The ability to share a file with the Fill in the form permissions is only available for the `.oform` files. It's not possible to share encrypted files and files from third-party accounts for form filling. The Form Filling option is not available when sharing an `.oform` file via an external link. +* Added the Fill in the form icon in the file list to open an `.oform` file in the editor. +* If the `.oform` file is shared with the Form Filling rights, a copy of the file is created in the My documents section when a user opens the shared file. Filling in the form is performed in this copy and does not affect the original file. If the original file is changed by the owner, its copy will not be up-to-date. +* If the `.oform` file is shared with the Full Access rights, filling in the form is performed in the original file. +* Added sample `.docxf` and `.oform` files. +* For the editor dark theme, the usual logo is transferred so that it displays correctly in the embedded mode. + +## Version 11.5.3 + +### General portal settings + +* Added a dialog with the editors statistics on Payments page in Control Panel. +* Added a new slide to the start banner, added the Product Demo item to the Feedback & Support menu for trial SaaS portals. +* Added the Request training item to the Feedback & Support menu for paid portals (SaaS and Server versions). +* Added the Live Chat switcher to the Feedback & Support menu for paid portals (SaaS and Server versions). +* Added the Email support item to the Feedback & Support menu for paid portals (SaaS and Server versions). + +## Version 11.5.2 + +### General portal settings + +* ASC.Web.Studio: the `onlyoffice_logo` folder renamed to `logo`; +* Added a banner for the ONLYOFFICE Projects app in the App Store; +* Removed the button for downloading a paid invoice on the Payments page; +* Defining work from the Desktop on the server via userAgent (starting from version 6.1); +* Added the Zendesk chat display on the Payments page in the SaaS version; +* Updated the Payments page in the SaaS version. Prices are based on a number of users; +* Added the welcome dialog window for the portal owner on the main portal page; +* Removed the limitation on the amount of portal data when creating a backup; +* When storing backups to a third party service, chunk loading is now used; +* The Restore feature is available in the SaaS version if the pricing plan includes this option; +* Filter: a tip on the search is enabled in all modules, excep for People and Sample; +* Fixed calculating the total\current number of full-text search indexes; +* The full-text search feature is available in the SaaS version if the pricing plan includes this option; +* Updated ElasticSearch to the version 7.9; +* Reworked the receipt of data from the payment system for authorized requests in the SaaS version; +* The LDAP feature is available in the SaaS version if the pricing plan includes this option; +* Added the `temp` setting to specify a path for creating temporary files instead of the system `Path.GetTempFileName()` one; +* Changed email notifications for the SaaS version and messages about changing an email; +* Changed the assembly for archiving backup; +* Reworked the mechanism for working with resource files; +* All the available languages are enabled in the Personal cloud; +* The SSO feature is available in the SaaS version if the pricing plan includes this option. The `ssoauth service` moved from the control panel to portals; +* Updated the Yandex icons on the user profile page, authorization page and third party service connection settings; +* Added a checkpoint to the migration page and changed the email notification about the successful completion of the migration; +* Restored the mail migration functionality; +* Added the text about resetting users' passwords on the Restore settings page, added an email notification about the successful completion of the restoring process. + +### Documents module + +* Added Thumbnails view. Thumbnails are not generated for video. Thumbnails are not generated in third-party storages; +* Added the ability to select the archiving type in the settings: zip (by default) or tar.gz; +* Removed the support of the version 5.3 of the editors; +* Updated the Google Drive icons; +* Fixed calculating a quote when downloading several files in an archive; +* Removed transferring the anonymous name to the editor for using the renaming functionality in the versions 6.2, 6.3 of the editors; +* Added the ability to convert the fb2 files; +* Files can be shared with guests for viewing only; +* Removed the button to share a file with a group in the Private Room; +* Transferring the favorite status of a file to the version 6.3 of the editors; +* Signing in JWT the `callbackUrl` of the editor initialization configuration; +* Video and audio files are added to start samples in all languages; +* Archiving and compressing via tar.gz instead of zip when downloading several files; +* Removed the limitation on the size of files when downloading several files in an archive; +* The EasyBib and WordPress plugins are not available in the free version of the editors. + +### CRM module + +* Moved queue settings to the configuration. 2 streams are allocated for data export. + +### Mail module + +* Added the ability to get the connection settings for connecting a mailbox to third-party mail clients and the ability to change passwords for mailboxes created on the Mail Server in the SaaS version. + +### Calendar + +* Fixed bugs. + +## Version 11.0 + +### General portal changes + +* Added the ability to receive portal notifications via Telegram; +* Added the ability to make an addon (Mail, Chat, Calendar) a default portal page; +* Added the additional license check when replacing ONLYOFFICE in the About this program window; +* Added the vsyscall check to the installation scripts when installing Mail Server on Debian with kernel 4.18.0 and later; +* Updated copirights in the source files; +* Added the ability to connect the Mail.ru, VK and Yandex applications for authorization; +* Added new icons and texts in the welcome placeholders of the empty modules; +* Added icons to context menus; +* Added two scrolling areas on the page: navigation and content; +* Reworked the mechanics for displaying messages on the authorization page; +* Updated Elasticsearch to v.7.4. Added the possibility to rebuild the index. +* Updated Mono to v.6.8, updated builds, improved performance; +* Added the file encryption at rest feature for server versions; +* When requesting the password recovery, it's not possible to check if an email address is used on the portal; +* It is prohibited to specify the current password when changing a password; +* Updated minimal password length to 8 characters; +* The password complexity check is now performed in the client-side browser; +* Added password hashing with the PBKDF2 algorithm when transmitting passwords to the server; +* Added the Sign in to domain option on the authorization page for the portals where the LDAP Authentication is enabled; +* Added a request for subscription to newsletters in the free Community version installation wizard; +* Removed the link to the forum; +* Added data cleaning before restoring backup; +* When the license expires, Document Server updates are blocked in the installation; +* Portals with an expired license and Enterprise portals with a free default license are not blocked; +* In the free Community version, a block with a proposal to install Enterprise Edition is added; +* The Payment page redirects to the Control Panel (if it is installed); +* Added the `-it`, `--installation_type` parameter to the installation scripts. The possible values are `GROUPS | WORKSPACE | WORKSPACE_ENTERPRISE`. + +### Documents module + +* Changed the note about the mention in the comment pop-up window depending on the ability to provide access to the document; +* Added the support for the .webp images; +* Using a new MailMerge API for the editors; +* Opening the default portal page when clicking to the logo in the upper left corner of the editors interface; +* Added the ability to connect kDrive via WebDav; +* Added the Favorites section, added the ability to add files to favorites via context menu; +* Added the Recent section; +* Added translations for the EasyBib and WordPress plugins; +* Added the ability to provide the Custom Filter access rights for spreadsheets; +* Replaced an empty tab with a static page containing the logo when creating a new file; +* If the DocuSign service is not connected, the instructions are displayed when clicking the Sign with DocuSign context menu option; +* Added a new Private Room section; +* If an administrator disabled the Allow users to connect third-party storages option, they also cannot connect third-party clouds; +* Added a separate section for quick access to admin settings on the left panel; +* Added links to download desktop and mobile apps; +* Added empty files for creation in Japanese (ja-JP). + +### CRM module + +* Added the Make a VoIP call action in the contact context menu; +* Removed the unnecessary Quantity field when creating a new invoice item; +* Added the ability to enter decimal fractions with two decimal places in the Discount field when creating an invoice. + +### Mail module + +* Added a new scroll mechanism for the screen width greater than 1200 px. + +### Calendar + +* Improved the Calendar API security; +* Reworked the authorization method for the CalDAV calendars; +* Reworked the Radicale plugins for the new version 3.0. diff --git a/build/ManageServices.bat b/build/ManageServices.bat index 0c3874e17..7717539e0 100644 --- a/build/ManageServices.bat +++ b/build/ManageServices.bat @@ -17,39 +17,34 @@ if "%~1" == "--install-all" ( sc create OnlyofficeNotify%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.Notify.NotifyServiceLauncher, ASC.Notify\" --log Notify" sc create OnlyofficeJabber%version% start= delayed-auto binPath= "\"%grandparent%\Jabber\ASC.Xmpp.Server.Launcher.exe\"" sc create OnlyofficeIndex%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.ElasticSearch.Launcher, ASC.ElasticSearch\" --log Index" - sc create OnlyofficeRadicale%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.Radicale.Launcher, ASC.Radicale\" --log Radicale" sc create OnlyOfficeStorageMigrate%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.Data.Storage.Migration.Launcher,ASC.Data.Storage.Migration\" --log StorageMigrate" sc create OnlyOfficeStorageEncryption%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.Data.Storage.Encryption.Launcher,ASC.Data.Storage.Encryption\" --log StorageEncryption" sc create OnlyofficeFeed%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.Feed.Aggregator.FeedAggregatorLauncher, ASC.Feed.Aggregator\" --log Feed" sc create OnlyOfficeAutoCleanUp%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.Files.AutoCleanUp.Launcher, ASC.Files.AutoCleanUp\" --log AutoCleanUp" sc create OnlyofficeBackup%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.Data.Backup.Service.BackupServiceLauncher, ASC.Data.Backup\" --log Backup" - sc create OnlyOfficeSocketIO%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.Socket.IO.Svc.Launcher, ASC.Socket.IO.Svc\" --log SocketIO" sc create OnlyOfficeTelegram%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.TelegramService.Launcher, ASC.TelegramService\" --log Telegram" sc create OnlyofficeThumbnailBuilder%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.Files.ThumbnailBuilder.Launcher, ASC.Files.ThumbnailBuilder\" --log ThumbnailBuilder" - sc create OnlyOfficeThumb%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.Thumbnails.Svc.Launcher,ASC.Thumbnails.Svc\" --log Thumb" - sc create OnlyOfficeSsoAuth%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.SsoAuth.Svc.Launcher,ASC.SsoAuth.Svc\" --log SsoAuth" - sc create OnlyOfficeUrlShortener%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.UrlShortener.Svc.Launcher,ASC.UrlShortener.Svc\" --log UrlShortener" - sc create OnlyOfficeWebDav%version% start= delayed-auto binPath= "\"%basepath%\TeamLabSvc.exe\" --service \"ASC.WebDav.Svc.Launcher,ASC.WebDav.Svc\" --log WebDav" sc create OnlyOfficeMailAggregator%version% start= delayed-auto binPath= "\"%grandparent%\MailAggregator\ASC.Mail.Aggregator.CollectionService.exe\"" sc create OnlyOfficeMailWatchdog%version% start= delayed-auto binPath= "\"%grandparent%\MailWatchdog\ASC.Mail.Watchdog.Service.exe\"" sc create OnlyOfficeMailCleaner%version% start= delayed-auto binPath= "\"%grandparent%\MailCleaner\ASC.Mail.StorageCleaner.exe\"" + call %basepath%\WinSW3.0.0.exe install %grandparent%\run\Radicale.xml + call %basepath%\WinSW3.0.0.exe install %grandparent%\run\SsoAuth.xml + call %basepath%\WinSW3.0.0.exe install %grandparent%\run\SocketIO.xml + call %basepath%\WinSW3.0.0.exe install %grandparent%\run\WebDav.xml + call %basepath%\WinSW3.0.0.exe install %grandparent%\run\UrlShortener.xml + call %basepath%\WinSW3.0.0.exe install %grandparent%\run\Thumb.xml + sc failure OnlyofficeNotify%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 sc failure OnlyofficeJabber%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 sc failure OnlyofficeIndex%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 - sc failure OnlyofficeRadicale%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 sc failure OnlyOfficeStorageMigrate%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 sc failure OnlyOfficeStorageEncryption%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 sc failure OnlyofficeAutoCleanUp%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 sc failure OnlyofficeFeed%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 sc failure OnlyofficeBackup%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 - sc failure OnlyOfficeSocketIO%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 sc failure OnlyOfficeTelegram%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 sc failure OnlyofficeThumbnailBuilder%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 - sc failure OnlyOfficeThumb%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 - sc failure OnlyOfficeSsoAuth%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 - sc failure OnlyOfficeUrlShortener%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 - sc failure OnlyOfficeWebDav%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 sc failure OnlyOfficeMailAggregator%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 sc failure OnlyOfficeMailWatchdog%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 sc failure OnlyOfficeMailCleaner%version% reset= 60 actions= restart/60000/restart/60000/restart/60000 @@ -69,8 +64,6 @@ if "%~1" == "--uninstall-all" ( sc delete OnlyofficeJabber%version% net stop OnlyofficeIndex%version% sc delete OnlyofficeIndex%version% - net stop OnlyofficeRadicale%version% - sc delete OnlyofficeRadicale%version% net stop OnlyOfficeStorageMigrate%version% sc delete OnlyOfficeStorageMigrate%version% net stop OnlyOfficeStorageEncryption%version% @@ -81,18 +74,8 @@ if "%~1" == "--uninstall-all" ( sc delete OnlyofficeFeed%version% net stop OnlyofficeBackup%version% sc delete OnlyofficeBackup%version% - net stop OnlyOfficeSocketIO%version% - sc delete OnlyOfficeSocketIO%version% net stop OnlyOfficeTelegram%version% - sc delete OnlyOfficeTelegram%version% - net stop OnlyOfficeThumb%version% - sc delete OnlyOfficeThumb%version% - net stop OnlyOfficeSsoAuth%version% - sc delete OnlyOfficeSsoAuth%version% - net stop OnlyOfficeUrlShortener%version% - sc delete OnlyOfficeUrlShortener%version% - net stop OnlyOfficeWebDav%version% - sc delete OnlyOfficeWebDav%version% + sc delete OnlyOfficeTelegram%version% net stop OnlyofficeThumbnailBuilder%version% sc delete OnlyofficeThumbnailBuilder%version% net stop OnlyOfficeMailAggregator%version% @@ -102,6 +85,19 @@ if "%~1" == "--uninstall-all" ( net stop OnlyOfficeMailCleaner%version% sc delete OnlyOfficeMailCleaner%version% + call %basepath%\WinSW3.0.0.exe stop %grandparent%\run\Radicale.xml + call %basepath%\WinSW3.0.0.exe uninstall %grandparent%\run\Radicale.xml + call %basepath%\WinSW3.0.0.exe stop %grandparent%\run\SsoAuth.xml + call %basepath%\WinSW3.0.0.exe uninstall %grandparent%\run\SsoAuth.xml + call %basepath%\WinSW3.0.0.exe stop %grandparent%\run\SocketIO.xml + call %basepath%\WinSW3.0.0.exe uninstall %grandparent%\run\SocketIO.xml + call %basepath%\WinSW3.0.0.exe stop %grandparent%\run\WebDav.xml + call %basepath%\WinSW3.0.0.exe uninstall %grandparent%\run\WebDav.xml + call %basepath%\WinSW3.0.0.exe stop %grandparent%\run\UrlShortener.xml + call %basepath%\WinSW3.0.0.exe uninstall %grandparent%\run\UrlShortener.xml + call %basepath%\WinSW3.0.0.exe stop %grandparent%\run\Thumb.xml + call %basepath%\WinSW3.0.0.exe uninstall %grandparent%\run\Thumb.xml + goto Exit ) diff --git a/build/config/TeamLabSvc.exe.config b/build/config/TeamLabSvc.exe.config index 7ea696dd9..75cabe8d4 100644 --- a/build/config/TeamLabSvc.exe.config +++ b/build/config/TeamLabSvc.exe.config @@ -9,12 +9,6 @@

-
-
-
-
-
-
@@ -30,7 +24,7 @@ - + @@ -132,6 +126,7 @@ + @@ -146,6 +141,7 @@ + @@ -156,17 +152,11 @@ - - - - - - @@ -196,15 +186,6 @@ - - - - - - - - - diff --git a/build/install/deb/Files/Tools/letsencrypt.sh b/build/install/deb/Files/Tools/letsencrypt.sh index 7ffe979ef..88d28f0aa 100644 --- a/build/install/deb/Files/Tools/letsencrypt.sh +++ b/build/install/deb/Files/Tools/letsencrypt.sh @@ -4,6 +4,7 @@ set -e LETSENCRYPT_ROOT_DIR="/etc/letsencrypt"; ROOT_DIR="/var/www/onlyoffice/Data/certs"; +CERTIFICATE_NAME="communityserver" _domains=""; @@ -15,18 +16,18 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" mkdir -p ${ROOT_DIR} -certbot certonly --expand --webroot -w ${ROOT_DIR} --noninteractive --agree-tos --email support@$1 $_domains; +certbot certonly --expand --webroot -w ${ROOT_DIR} --cert-name ${CERTIFICATE_NAME} --noninteractive --agree-tos --email support@$1 $_domains; -cp -f ${LETSENCRYPT_ROOT_DIR}/live/$1/fullchain.pem ${ROOT_DIR}/onlyoffice.crt -cp -f ${LETSENCRYPT_ROOT_DIR}/live/$1/privkey.pem ${ROOT_DIR}/onlyoffice.key -cp -f ${LETSENCRYPT_ROOT_DIR}/live/$1/chain.pem ${ROOT_DIR}/stapling.trusted.crt +cp -f ${LETSENCRYPT_ROOT_DIR}/live/${CERTIFICATE_NAME}/fullchain.pem ${ROOT_DIR}/onlyoffice.crt +cp -f ${LETSENCRYPT_ROOT_DIR}/live/${CERTIFICATE_NAME}/privkey.pem ${ROOT_DIR}/onlyoffice.key +cp -f ${LETSENCRYPT_ROOT_DIR}/live/${CERTIFICATE_NAME}/chain.pem ${ROOT_DIR}/stapling.trusted.crt cat > ${LETSENCRYPT_ROOT_DIR}/renewal-hooks/deploy/communityserver.sh <> /etc/{{package_sysname}}/communityserver/openssl.cnf <> $OPENSSL_CONF + else + sed -i "s/^ssl_conf =.*/ssl_conf = ssl_sect/" $OPENSSL_CONF + fi + + if ! grep -q "\[ssl_sect\]" $OPENSSL_CONF; then + echo -e "[ssl_sect]\nsystem_default = system_default_sect\n" >> $OPENSSL_CONF + else + sed -i "s/^system_default =.*/system_default = system_default_sect/" $OPENSSL_CONF + fi + + CIPHERSTRING="DEFAULT@SECLEVEL=1" + if ! grep -q "\[system_default_sect\]" $OPENSSL_CONF; then + echo -e "[system_default_sect] \n\ +MinProtocol = TLSv1.2 \n\ +CipherString = $CIPHERSTRING \n" >> $OPENSSL_CONF + else + if ! grep -q "MinProtocol =" $OPENSSL_CONF; then + sed "/\[system_default_sect\]/a MinProtocol = TLSv1.2" -i $OPENSSL_CONF + else + sed -i "s/^MinProtocol =.*/MinProtocol = TLSv1.2/" $OPENSSL_CONF + fi + + if ! grep -q "CipherString =" $OPENSSL_CONF; then + sed "/\[system_default_sect\]/a CipherString = $CIPHERSTRING" -i $OPENSSL_CONF + else + sed -i "s/^CipherString =.*/CipherString = $CIPHERSTRING/" $OPENSSL_CONF + fi + fi fi # setup xmppserver diff --git a/build/install/deb/debian/rules b/build/install/deb/debian/rules index f69d1dfee..7ac01e1ff 100644 --- a/build/install/deb/debian/rules +++ b/build/install/deb/debian/rules @@ -15,7 +15,7 @@ override_dh_systemd_enable: dh_systemd_enable --name={{package_sysname}}Telegram dh_systemd_enable --name={{package_sysname}}Thumb dh_systemd_enable --name={{package_sysname}}UrlShortener - dh_systemd_enable --name={{package_sysname}}AutoCleanUp + dh_systemd_enable --name={{package_sysname}}FilesTrashCleaner dh_systemd_enable --name={{package_sysname}}WebDav dh_systemd_enable --name={{package_sysname}}Radicale dh_systemd_enable --name={{package_sysname}}Index @@ -39,7 +39,7 @@ override_dh_installinit: dh_installinit --name={{package_sysname}}Telegram dh_installinit --name={{package_sysname}}Thumb dh_installinit --name={{package_sysname}}UrlShortener - dh_installinit --name={{package_sysname}}AutoCleanUp + dh_installinit --name={{package_sysname}}FilesTrashCleaner dh_installinit --name={{package_sysname}}WebDav dh_installinit --name={{package_sysname}}Radicale dh_installinit --name={{package_sysname}}Index @@ -63,7 +63,7 @@ override_dh_systemd_start: dh_systemd_start --name={{package_sysname}}Telegram dh_systemd_start --name={{package_sysname}}Thumb dh_systemd_start --name={{package_sysname}}UrlShortener - dh_systemd_start --name={{package_sysname}}AutoCleanUp + dh_systemd_start --name={{package_sysname}}FilesTrashCleaner dh_systemd_start --name={{package_sysname}}WebDav dh_systemd_start --name={{package_sysname}}Radicale dh_systemd_start --name={{package_sysname}}Index diff --git a/build/install/deb/debian/templates b/build/install/deb/debian/templates index 1ffdcf53f..b7de57aa6 100644 --- a/build/install/deb/debian/templates +++ b/build/install/deb/debian/templates @@ -42,3 +42,8 @@ Template: {{package_sysname}}-communityserver/imapsync-start-date Type: string Default: Description: ImapSync service launch date: + +Template: {{package_sysname}}-communityserver/machinekey +Type: string +Default: +Description: Enter your own machinekey: diff --git a/build/install/rpm/Files/Tools/letsencrypt.sh b/build/install/rpm/Files/Tools/letsencrypt.sh index 8e1ff30fd..3306df9e6 100644 --- a/build/install/rpm/Files/Tools/letsencrypt.sh +++ b/build/install/rpm/Files/Tools/letsencrypt.sh @@ -4,6 +4,7 @@ set -e LETSENCRYPT_ROOT_DIR="/etc/letsencrypt"; ROOT_DIR="/var/www/onlyoffice/Data/certs"; +CERTIFICATE_NAME="communityserver" _domains=""; @@ -15,18 +16,18 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" mkdir -p ${ROOT_DIR} -certbot certonly --expand --webroot -w ${ROOT_DIR} --noninteractive --agree-tos --email support@$1 $_domains; +certbot certonly --expand --webroot -w ${ROOT_DIR} --cert-name ${CERTIFICATE_NAME} --noninteractive --agree-tos --email support@$1 $_domains; -cp -f ${LETSENCRYPT_ROOT_DIR}/live/$1/fullchain.pem ${ROOT_DIR}/onlyoffice.crt -cp -f ${LETSENCRYPT_ROOT_DIR}/live/$1/privkey.pem ${ROOT_DIR}/onlyoffice.key -cp -f ${LETSENCRYPT_ROOT_DIR}/live/$1/chain.pem ${ROOT_DIR}/stapling.trusted.crt +cp -f ${LETSENCRYPT_ROOT_DIR}/live/${CERTIFICATE_NAME}/fullchain.pem ${ROOT_DIR}/onlyoffice.crt +cp -f ${LETSENCRYPT_ROOT_DIR}/live/${CERTIFICATE_NAME}/privkey.pem ${ROOT_DIR}/onlyoffice.key +cp -f ${LETSENCRYPT_ROOT_DIR}/live/${CERTIFICATE_NAME}/chain.pem ${ROOT_DIR}/stapling.trusted.crt cat > ${LETSENCRYPT_ROOT_DIR}/renewal-hooks/deploy/communityserver.sh </" {} \; - sed -i "s/Server=.*/$CONN_STR\",/g" /etc/%{package_sysname}/communityserver/appsettings.production.json - - if [ ! -z "$CORE_MACHINEKEY" ]; then - find "$DIR/${binDirs[$i]}" -type f -name "*.[cC]onfig" -exec sed -i "/core.machinekey/s!value=\".*\"!value=\"${CORE_MACHINEKEY}\"!g" {} \; - sed "s!\"machinekey\":.*!\"machinekey\":\"${CORE_MACHINEKEY}\",!" -i /etc/%{package_sysname}/communityserver/appsettings.production.json - fi - done + binDirs=("$DIR/ApiSystem/" "$DIR/WebStudio" "$SERVICES_DIR/TeamLabSvc") + for i in "${!binDirs[@]}"; do + find "${binDirs[$i]}" -type f -name "*.[cC]onfig" -exec sed -i "s/connectionString=.*/connectionString=\"${CONN_STR}\" providerName=\"MySql.Data.MySqlClient\"\/>/" {} \; + done + sed -i "s!\(\"connectionString\":\).*,!\1 \"${CONN_STR//!/\\!}\",!" /etc/%{package_sysname}/communityserver/appsettings.production.json MYSQL_SERVER_HOST=$(grep -oP "Server=[^\";]*" $DIR/WebStudio/web.connections.config | head -1 | cut -d'=' -f2); MYSQL_SERVER_DB_NAME=$(grep -oP "Database=[^\";]*" $DIR/WebStudio/web.connections.config | head -1 | cut -d'=' -f2); MYSQL_SERVER_USER=$(grep -oP "User ID=[^\";]*" $DIR/WebStudio/web.connections.config | head -1 | cut -d'=' -f2); MYSQL_SERVER_PASS=$(grep -oP "Password=[^\";]*" $DIR/WebStudio/web.connections.config | head -1 | cut -d'=' -f2); - sed "s!\"host\":.*,!\"host\":\"${MYSQL_SERVER_HOST}\",!" -i ${SERVICES_DIR}/ASC.UrlShortener/config/config.json - sed "s!\"user\":.*,!\"user\":\"${MYSQL_SERVER_USER}\",!" -i ${SERVICES_DIR}/ASC.UrlShortener/config/config.json - sed "s!\"password\":.*,!\"password\":\"${MYSQL_SERVER_PASS//!/\\!}\",!" -i ${SERVICES_DIR}/ASC.UrlShortener/config/config.json - sed "s!\"database\":.*!\"database\":\"${MYSQL_SERVER_DB_NAME}\"!" -i ${SERVICES_DIR}/ASC.UrlShortener/config/config.json - - if [ ! -z "$CORE_MACHINEKEY" ]; then - sed "s!\"core\.machinekey\":.*!\"core\.machinekey\":\"${CORE_MACHINEKEY}\",!" -i ${SERVICES_DIR}/ASC.UrlShortener/config/config.json - fi + find "${SERVICES_DIR}/ASC.UrlShortener/config" -type f -name "*.json" -exec sed -i \ + -e "s!\(\"host\":\).*,!\1 \"${MYSQL_SERVER_HOST}\",!" \ + -e "s!\(\"user\":\).*,!\1 \"${MYSQL_SERVER_USER}\",!" \ + -e "s!\(\"password\":\).*,!\1 \"${MYSQL_SERVER_PASS//!/\\!}\",!" \ + -e "s!\(\"database\":\).*!\1 \"${MYSQL_SERVER_DB_NAME}\"!" {} \; if ! mysqladmin ping -h ${MYSQL_SERVER_HOST} -u ${MYSQL_SERVER_USER} --password=${MYSQL_SERVER_PASS} --silent; then echo "ERROR: mysql connection refused"; @@ -431,6 +437,12 @@ if systemctl is-active elasticsearch | grep -q "active"; then fi fi +if ! grep -q "client_max_body_size" /etc/nginx/nginx.conf; then + sed -i '/http {/a\ client_max_body_size 100m;' /etc/nginx/nginx.conf +else + sed -i "s/\(client_max_body_size\).*\?\;/\1 100m;/" /etc/nginx/nginx.conf +fi + if [ ! -f /proc/net/if_inet6 ]; then sed '/listen\s*\[::\]:80/d' -i /etc/nginx/includes/%{package_sysname}-communityserver-common-ssl.conf.template sed '/listen\s*\[::\]:443/d' -i /etc/nginx/includes/%{package_sysname}-communityserver-common-ssl.conf.template diff --git a/build/install/rpm/onlyoffice-communityserver.spec b/build/install/rpm/onlyoffice-communityserver.spec index 4bbb68b6c..9f275d4bd 100644 --- a/build/install/rpm/onlyoffice-communityserver.spec +++ b/build/install/rpm/onlyoffice-communityserver.spec @@ -3,9 +3,9 @@ %global package_header_tag_url http://onlyoffice.com/ %global package_header_tag_vendor Ascensio System SIA %global package_header_tag_packager Ascensio System SIA -%global package_header_tag_requires mono-complete >= 6.8.0, nginx >= 1.9.5, mysql-server >= 5.7.0, wget, mono-webserver-hyperfastcgi, nodejs >= 12.0.0, redis >= 3.0.0, elasticsearch = 7.16.3-1, python3 >= 3.6, ffmpeg, jq +%global package_header_tag_requires mono-complete >= 6.8.0, nginx >= 1.9.5, mysql-server >= 5.7.0, wget, mono-webserver-hyperfastcgi, nodejs >= 12.0.0, redis >= 3.0.0, elasticsearch = 7.16.3-1, python3 >= 3.6, ffmpeg, jq, dotnet-sdk-7.0 %global package_section_description "Community Server is a free open-source collaborative system developed to manage documents, projects, customer relationship and emails, all in one place." -%global package_services god monoserve monoserveApiSystem onlyofficeSocketIO onlyofficeThumb onlyofficeTelegram onlyofficeBackup onlyofficeFeed onlyofficeIndex onlyofficeNotify onlyofficeMailAggregator onlyofficeMailWatchdog onlyofficeMailCleaner onlyofficeMailImap onlyofficeStorageMigrate onlyofficeStorageEncryption onlyofficeUrlShortener onlyofficeWebDav onlyofficeAutoCleanUp onlyofficeRadicale onlyofficeThumbnailBuilder onlyofficeSsoAuth +%global package_services god monoserve monoserveApiSystem onlyofficeSocketIO onlyofficeThumb onlyofficeTelegram onlyofficeBackup onlyofficeFeed onlyofficeIndex onlyofficeNotify onlyofficeMailAggregator onlyofficeMailWatchdog onlyofficeMailCleaner onlyofficeMailImap onlyofficeStorageMigrate onlyofficeStorageEncryption onlyofficeUrlShortener onlyofficeWebDav onlyofficeFilesTrashCleaner onlyofficeRadicale onlyofficeThumbnailBuilder onlyofficeSsoAuth %global package_sysname onlyoffice diff --git a/build/msbuild/ASC.Web.Core.BuildTask.dll b/build/msbuild/ASC.Web.Core.BuildTask.dll index 9ffb8c66adadf6d7f65b88229223089b68e14166..1966e5e8b6c6791c559d61b244562ad832fa6b56 100644 GIT binary patch delta 9179 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 delta 8822 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 RXEeULyv>^VC2K7={u^kDtGoaJ diff --git a/build/msbuild/deploy.proj b/build/msbuild/deploy.proj index 6b213c529..b80e7c7a0 100644 --- a/build/msbuild/deploy.proj +++ b/build/msbuild/deploy.proj @@ -196,7 +196,21 @@ + + + + + + + + + + + + + + @@ -220,6 +234,10 @@ + + + + @@ -367,6 +385,21 @@ ..\config\private\Web.Storage.Config.Substitutions.xml + + ..\config\private\WebDav.Substitutions.xml + + + ..\config\private\SocketIO.Substitutions.xml + + + ..\config\private\SsoAuth.Substitutions.xml + + + ..\config\private\Thumb.Substitutions.xml + + + ..\config\private\UrlShortener.Substitutions.xml + ..\config\private\Mail.Agg.Substitutions.xml diff --git a/build/sql/onlyoffice.data.sql b/build/sql/onlyoffice.data.sql index 3018cc3a1..0c6a92b6e 100644 --- a/build/sql/onlyoffice.data.sql +++ b/build/sql/onlyoffice.data.sql @@ -155,6 +155,7 @@ BEGIN start transaction; insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_AlgerianDinar', 'DZD', 'د.ج', 'DZ', 0, 0); + insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_AngolanKwanza', 'AOA', 'Kz', 'AO', 0, 0); insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_ArgentinianPeso', 'ARS', '$a', 'AR', 1, 0); insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_ArmenianDram', 'AMD', 'dram', 'AM', 0, 0); insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_AustralianDollar', 'AUD', 'A$', 'AU', 1, 1); @@ -186,8 +187,8 @@ BEGIN insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_KazakhstaniTenge', 'KZT', 'тңг', 'KZ', 0, 0); insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_KenyanShilling', 'KES', 'KSh', 'KE', 1, 0); insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_KuwaitiDinar', 'KWD', 'K.D.', 'KW', 1, 0); - insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_LatvianLats', 'LVL', 'Ls', 'LV', 1, 0); - insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_LithuanianLitas', 'LTL', 'Lt', 'LT', 1, 0); + insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_LatvianLats', 'LVL', 'Ls', 'LV', 0, 0); + insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_LithuanianLitas', 'LTL', 'Lt', 'LT', 0, 0); insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_MalagasyAriary', 'MGA', 'Ar', 'MG', 1, 0); insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_MalaysianRinggit', 'MYR', 'RM', 'MY', 1, 0); insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_MauritianRupee', 'MUR', 'Rs', 'MU', 1, 0); @@ -223,7 +224,8 @@ BEGIN insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_UnitedArabEmiratesDirham', 'AED', 'د.إ', 'AE', 1, 0); insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_UnitedStatesDollar', 'USD', '$', 'US', 1, 1); insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_UzbekistaniSom', 'UZS', 'som', 'UZ', 0, 0); - insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_VenezuelanBolivar', 'VEF', 'Bs.', 'VE', 1, 0); + insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_VenezuelanBolivar', 'VEF', 'Bs.', 'VE', 0, 0); + insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_VenezuelanBolivarSoberano', 'VES', 'Bs.S', 'VE', 1, 0); insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_VietnameseDong', 'VND', '₫', 'VN', 1, 0); insert ignore into crm_currency_info (resource_key, abbreviation, symbol, culture_name, is_convertable, is_basic) values ('Currency_WestAfricanFranc', 'XOF', 'franc', 'ML', 1, 0); commit; @@ -273,7 +275,9 @@ BEGIN insert into files_converts (input, output) values ('.docx', '.pdf'); insert into files_converts (input, output) values ('.docx', '.rtf'); insert into files_converts (input, output) values ('.docx', '.txt'); + insert into files_converts (input, output) values ('.docxf', '.docm'); insert into files_converts (input, output) values ('.docxf', '.docx'); + insert into files_converts (input, output) values ('.docxf', '.dotm'); insert into files_converts (input, output) values ('.docxf', '.dotx'); insert into files_converts (input, output) values ('.docxf', '.epub'); insert into files_converts (input, output) values ('.docxf', '.fb2'); @@ -318,6 +322,24 @@ BEGIN insert into files_converts (input, output) values ('.dotx', '.pdf'); insert into files_converts (input, output) values ('.dotx', '.rtf'); insert into files_converts (input, output) values ('.dotx', '.txt'); + insert into files_converts (input, output) values ('.dps', '.odp'); + insert into files_converts (input, output) values ('.dps', '.otp'); + insert into files_converts (input, output) values ('.dps', '.pdf'); + insert into files_converts (input, output) values ('.dps', '.potm'); + insert into files_converts (input, output) values ('.dps', '.potx'); + insert into files_converts (input, output) values ('.dps', '.ppsm'); + insert into files_converts (input, output) values ('.dps', '.ppsx'); + insert into files_converts (input, output) values ('.dps', '.pptm'); + insert into files_converts (input, output) values ('.dps', '.pptx'); + insert into files_converts (input, output) values ('.dpt', '.odp'); + insert into files_converts (input, output) values ('.dpt', '.otp'); + insert into files_converts (input, output) values ('.dpt', '.pdf'); + insert into files_converts (input, output) values ('.dpt', '.potm'); + insert into files_converts (input, output) values ('.dpt', '.potx'); + insert into files_converts (input, output) values ('.dpt', '.ppsm'); + insert into files_converts (input, output) values ('.dpt', '.ppsx'); + insert into files_converts (input, output) values ('.dpt', '.pptm'); + insert into files_converts (input, output) values ('.dpt', '.pptx'); insert into files_converts (input, output) values ('.epub', '.docm'); insert into files_converts (input, output) values ('.epub', '.docx'); insert into files_converts (input, output) values ('.epub', '.dotm'); @@ -329,6 +351,22 @@ BEGIN insert into files_converts (input, output) values ('.epub', '.pdf'); insert into files_converts (input, output) values ('.epub', '.rtf'); insert into files_converts (input, output) values ('.epub', '.txt'); + insert into files_converts (input, output) values ('.et', '.csv'); + insert into files_converts (input, output) values ('.et', '.ods'); + insert into files_converts (input, output) values ('.et', '.ots'); + insert into files_converts (input, output) values ('.et', '.pdf'); + insert into files_converts (input, output) values ('.et', '.xlsm'); + insert into files_converts (input, output) values ('.et', '.xlsx'); + insert into files_converts (input, output) values ('.et', '.xltm'); + insert into files_converts (input, output) values ('.et', '.xltx'); + insert into files_converts (input, output) values ('.ett', '.csv'); + insert into files_converts (input, output) values ('.ett', '.ods'); + insert into files_converts (input, output) values ('.ett', '.ots'); + insert into files_converts (input, output) values ('.ett', '.pdf'); + insert into files_converts (input, output) values ('.ett', '.xlsm'); + insert into files_converts (input, output) values ('.ett', '.xlsx'); + insert into files_converts (input, output) values ('.ett', '.xltm'); + insert into files_converts (input, output) values ('.ett', '.xltx'); insert into files_converts (input, output) values ('.fb2', '.docm'); insert into files_converts (input, output) values ('.fb2', '.docx'); insert into files_converts (input, output) values ('.fb2', '.dotm'); @@ -345,6 +383,8 @@ BEGIN insert into files_converts (input, output) values ('.fodp', '.pdf'); insert into files_converts (input, output) values ('.fodp', '.potm'); insert into files_converts (input, output) values ('.fodp', '.potx'); + insert into files_converts (input, output) values ('.fodp', '.ppsm'); + insert into files_converts (input, output) values ('.fodp', '.ppsx'); insert into files_converts (input, output) values ('.fodp', '.pptm'); insert into files_converts (input, output) values ('.fodp', '.pptx'); insert into files_converts (input, output) values ('.fods', '.csv'); @@ -367,6 +407,18 @@ BEGIN insert into files_converts (input, output) values ('.fodt', '.pdf'); insert into files_converts (input, output) values ('.fodt', '.rtf'); insert into files_converts (input, output) values ('.fodt', '.txt'); + insert into files_converts (input, output) values ('.htm', '.docm'); + insert into files_converts (input, output) values ('.htm', '.docx'); + insert into files_converts (input, output) values ('.htm', '.dotm'); + insert into files_converts (input, output) values ('.htm', '.dotx'); + insert into files_converts (input, output) values ('.htm', '.epub'); + insert into files_converts (input, output) values ('.htm', '.fb2'); + insert into files_converts (input, output) values ('.htm', '.html'); + insert into files_converts (input, output) values ('.htm', '.odt'); + insert into files_converts (input, output) values ('.htm', '.ott'); + insert into files_converts (input, output) values ('.htm', '.pdf'); + insert into files_converts (input, output) values ('.htm', '.rtf'); + insert into files_converts (input, output) values ('.htm', '.txt'); insert into files_converts (input, output) values ('.html', '.docm'); insert into files_converts (input, output) values ('.html', '.docx'); insert into files_converts (input, output) values ('.html', '.dotm'); @@ -384,21 +436,38 @@ BEGIN insert into files_converts (input, output) values ('.mht', '.dotx'); insert into files_converts (input, output) values ('.mht', '.epub'); insert into files_converts (input, output) values ('.mht', '.fb2'); + insert into files_converts (input, output) values ('.mht', '.html'); insert into files_converts (input, output) values ('.mht', '.odt'); insert into files_converts (input, output) values ('.mht', '.ott'); insert into files_converts (input, output) values ('.mht', '.pdf'); insert into files_converts (input, output) values ('.mht', '.rtf'); insert into files_converts (input, output) values ('.mht', '.txt'); + insert into files_converts (input, output) values ('.mhtml', '.docm'); + insert into files_converts (input, output) values ('.mhtml', '.docx'); + insert into files_converts (input, output) values ('.mhtml', '.dotm'); + insert into files_converts (input, output) values ('.mhtml', '.dotx'); + insert into files_converts (input, output) values ('.mhtml', '.epub'); + insert into files_converts (input, output) values ('.mhtml', '.fb2'); + insert into files_converts (input, output) values ('.mhtml', '.html'); + insert into files_converts (input, output) values ('.mhtml', '.odt'); + insert into files_converts (input, output) values ('.mhtml', '.ott'); + insert into files_converts (input, output) values ('.mhtml', '.pdf'); + insert into files_converts (input, output) values ('.mhtml', '.rtf'); + insert into files_converts (input, output) values ('.mhtml', '.txt'); insert into files_converts (input, output) values ('.odp', '.otp'); insert into files_converts (input, output) values ('.odp', '.pdf'); insert into files_converts (input, output) values ('.odp', '.potm'); insert into files_converts (input, output) values ('.odp', '.potx'); + insert into files_converts (input, output) values ('.odp', '.ppsm'); + insert into files_converts (input, output) values ('.odp', '.ppsx'); insert into files_converts (input, output) values ('.odp', '.pptm'); insert into files_converts (input, output) values ('.odp', '.pptx'); insert into files_converts (input, output) values ('.otp', '.odp'); insert into files_converts (input, output) values ('.otp', '.pdf'); insert into files_converts (input, output) values ('.otp', '.potm'); insert into files_converts (input, output) values ('.otp', '.potx'); + insert into files_converts (input, output) values ('.otp', '.ppsm'); + insert into files_converts (input, output) values ('.otp', '.ppsx'); insert into files_converts (input, output) values ('.otp', '.pptm'); insert into files_converts (input, output) values ('.otp', '.pptx'); insert into files_converts (input, output) values ('.ods', '.csv'); @@ -437,24 +506,52 @@ BEGIN insert into files_converts (input, output) values ('.ott', '.pdf'); insert into files_converts (input, output) values ('.ott', '.rtf'); insert into files_converts (input, output) values ('.ott', '.txt'); + insert into files_converts (input, output) values ('.oxps', '.docm'); + insert into files_converts (input, output) values ('.oxps', '.docx'); + insert into files_converts (input, output) values ('.oxps', '.dotm'); + insert into files_converts (input, output) values ('.oxps', '.dotx'); + insert into files_converts (input, output) values ('.oxps', '.epub'); + insert into files_converts (input, output) values ('.oxps', '.fb2'); + insert into files_converts (input, output) values ('.oxps', '.html'); + insert into files_converts (input, output) values ('.oxps', '.odt'); + insert into files_converts (input, output) values ('.oxps', '.ott'); insert into files_converts (input, output) values ('.oxps', '.pdf'); + insert into files_converts (input, output) values ('.oxps', '.rtf'); + insert into files_converts (input, output) values ('.oxps', '.txt'); + insert into files_converts (input, output) values ('.pdf', '.docm'); + insert into files_converts (input, output) values ('.pdf', '.docx'); + insert into files_converts (input, output) values ('.pdf', '.dotm'); + insert into files_converts (input, output) values ('.pdf', '.dotx'); + insert into files_converts (input, output) values ('.pdf', '.epub'); + insert into files_converts (input, output) values ('.pdf', '.fb2'); + insert into files_converts (input, output) values ('.pdf', '.html'); + insert into files_converts (input, output) values ('.pdf', '.odt'); + insert into files_converts (input, output) values ('.pdf', '.ott'); + insert into files_converts (input, output) values ('.pdf', '.rtf'); + insert into files_converts (input, output) values ('.pdf', '.txt'); insert into files_converts (input, output) values ('.pot', '.odp'); insert into files_converts (input, output) values ('.pot', '.otp'); insert into files_converts (input, output) values ('.pot', '.pdf'); - insert into files_converts (input, output) values ('.pot', '.pptm'); - insert into files_converts (input, output) values ('.pot', '.pptx'); insert into files_converts (input, output) values ('.pot', '.potm'); insert into files_converts (input, output) values ('.pot', '.potx'); + insert into files_converts (input, output) values ('.pot', '.ppsm'); + insert into files_converts (input, output) values ('.pot', '.ppsx'); + insert into files_converts (input, output) values ('.pot', '.pptm'); + insert into files_converts (input, output) values ('.pot', '.pptx'); insert into files_converts (input, output) values ('.potm', '.odp'); insert into files_converts (input, output) values ('.potm', '.otp'); insert into files_converts (input, output) values ('.potm', '.pdf'); insert into files_converts (input, output) values ('.potm', '.potx'); + insert into files_converts (input, output) values ('.potm', '.ppsm'); + insert into files_converts (input, output) values ('.potm', '.ppsx'); insert into files_converts (input, output) values ('.potm', '.pptm'); insert into files_converts (input, output) values ('.potm', '.pptx'); insert into files_converts (input, output) values ('.potx', '.odp'); insert into files_converts (input, output) values ('.potx', '.otp'); insert into files_converts (input, output) values ('.potx', '.pdf'); insert into files_converts (input, output) values ('.potx', '.potm'); + insert into files_converts (input, output) values ('.potx', '.ppsm'); + insert into files_converts (input, output) values ('.potx', '.ppsx'); insert into files_converts (input, output) values ('.potx', '.pptm'); insert into files_converts (input, output) values ('.potx', '.pptx'); insert into files_converts (input, output) values ('.pps', '.odp'); @@ -462,6 +559,8 @@ BEGIN insert into files_converts (input, output) values ('.pps', '.pdf'); insert into files_converts (input, output) values ('.pps', '.potm'); insert into files_converts (input, output) values ('.pps', '.potx'); + insert into files_converts (input, output) values ('.pps', '.ppsm'); + insert into files_converts (input, output) values ('.pps', '.ppsx'); insert into files_converts (input, output) values ('.pps', '.pptm'); insert into files_converts (input, output) values ('.pps', '.pptx'); insert into files_converts (input, output) values ('.ppsm', '.odp'); @@ -469,6 +568,7 @@ BEGIN insert into files_converts (input, output) values ('.ppsm', '.pdf'); insert into files_converts (input, output) values ('.ppsm', '.potm'); insert into files_converts (input, output) values ('.ppsm', '.potx'); + insert into files_converts (input, output) values ('.ppsm', '.ppsx'); insert into files_converts (input, output) values ('.ppsm', '.pptm'); insert into files_converts (input, output) values ('.ppsm', '.pptx'); insert into files_converts (input, output) values ('.ppsx', '.odp'); @@ -476,6 +576,7 @@ BEGIN insert into files_converts (input, output) values ('.ppsx', '.pdf'); insert into files_converts (input, output) values ('.ppsx', '.potm'); insert into files_converts (input, output) values ('.ppsx', '.potx'); + insert into files_converts (input, output) values ('.ppsx', '.ppsm'); insert into files_converts (input, output) values ('.ppsx', '.pptm'); insert into files_converts (input, output) values ('.ppsx', '.pptx'); insert into files_converts (input, output) values ('.ppt', '.odp'); @@ -483,6 +584,8 @@ BEGIN insert into files_converts (input, output) values ('.ppt', '.pdf'); insert into files_converts (input, output) values ('.ppt', '.potm'); insert into files_converts (input, output) values ('.ppt', '.potx'); + insert into files_converts (input, output) values ('.ppt', '.ppsm'); + insert into files_converts (input, output) values ('.ppt', '.ppsx'); insert into files_converts (input, output) values ('.ppt', '.pptm'); insert into files_converts (input, output) values ('.ppt', '.pptx'); insert into files_converts (input, output) values ('.pptm', '.odp'); @@ -490,6 +593,8 @@ BEGIN insert into files_converts (input, output) values ('.pptm', '.pdf'); insert into files_converts (input, output) values ('.pptm', '.potm'); insert into files_converts (input, output) values ('.pptm', '.potx'); + insert into files_converts (input, output) values ('.pptm', '.ppsm'); + insert into files_converts (input, output) values ('.pptm', '.ppsx'); insert into files_converts (input, output) values ('.pptm', '.pptx'); insert into files_converts (input, output) values ('.pptt', '.pptx'); insert into files_converts (input, output) values ('.pptx', '.odp'); @@ -497,6 +602,8 @@ BEGIN insert into files_converts (input, output) values ('.pptx', '.pdf'); insert into files_converts (input, output) values ('.pptx', '.potm'); insert into files_converts (input, output) values ('.pptx', '.potx'); + insert into files_converts (input, output) values ('.pptx', '.ppsm'); + insert into files_converts (input, output) values ('.pptx', '.ppsx'); insert into files_converts (input, output) values ('.pptx', '.pptm'); insert into files_converts (input, output) values ('.rtf', '.docm'); insert into files_converts (input, output) values ('.rtf', '.docx'); @@ -509,6 +616,47 @@ BEGIN insert into files_converts (input, output) values ('.rtf', '.ott'); insert into files_converts (input, output) values ('.rtf', '.pdf'); insert into files_converts (input, output) values ('.rtf', '.txt'); + insert into files_converts (input, output) values ('.stw', '.docm'); + insert into files_converts (input, output) values ('.stw', '.docx'); + insert into files_converts (input, output) values ('.stw', '.dotm'); + insert into files_converts (input, output) values ('.stw', '.dotx'); + insert into files_converts (input, output) values ('.stw', '.epub'); + insert into files_converts (input, output) values ('.stw', '.fb2'); + insert into files_converts (input, output) values ('.stw', '.html'); + insert into files_converts (input, output) values ('.stw', '.odt'); + insert into files_converts (input, output) values ('.stw', '.ott'); + insert into files_converts (input, output) values ('.stw', '.pdf'); + insert into files_converts (input, output) values ('.stw', '.rtf'); + insert into files_converts (input, output) values ('.stw', '.txt'); + insert into files_converts (input, output) values ('.sxc', '.csv'); + insert into files_converts (input, output) values ('.sxc', '.ods'); + insert into files_converts (input, output) values ('.sxc', '.ots'); + insert into files_converts (input, output) values ('.sxc', '.pdf'); + insert into files_converts (input, output) values ('.sxc', '.xlsm'); + insert into files_converts (input, output) values ('.sxc', '.xlsx'); + insert into files_converts (input, output) values ('.sxc', '.xltm'); + insert into files_converts (input, output) values ('.sxc', '.xltx'); + insert into files_converts (input, output) values ('.sxi', '.odp'); + insert into files_converts (input, output) values ('.sxi', '.otp'); + insert into files_converts (input, output) values ('.sxi', '.pdf'); + insert into files_converts (input, output) values ('.sxi', '.potm'); + insert into files_converts (input, output) values ('.sxi', '.potx'); + insert into files_converts (input, output) values ('.sxi', '.ppsm'); + insert into files_converts (input, output) values ('.sxi', '.ppsx'); + insert into files_converts (input, output) values ('.sxi', '.pptm'); + insert into files_converts (input, output) values ('.sxi', '.pptx'); + insert into files_converts (input, output) values ('.sxw', '.docm'); + insert into files_converts (input, output) values ('.sxw', '.docx'); + insert into files_converts (input, output) values ('.sxw', '.dotm'); + insert into files_converts (input, output) values ('.sxw', '.dotx'); + insert into files_converts (input, output) values ('.sxw', '.epub'); + insert into files_converts (input, output) values ('.sxw', '.fb2'); + insert into files_converts (input, output) values ('.sxw', '.html'); + insert into files_converts (input, output) values ('.sxw', '.odt'); + insert into files_converts (input, output) values ('.sxw', '.ott'); + insert into files_converts (input, output) values ('.sxw', '.pdf'); + insert into files_converts (input, output) values ('.sxw', '.rtf'); + insert into files_converts (input, output) values ('.sxw', '.txt'); insert into files_converts (input, output) values ('.txt', '.docm'); insert into files_converts (input, output) values ('.txt', '.docx'); insert into files_converts (input, output) values ('.txt', '.dotm'); @@ -520,6 +668,30 @@ BEGIN insert into files_converts (input, output) values ('.txt', '.ott'); insert into files_converts (input, output) values ('.txt', '.pdf'); insert into files_converts (input, output) values ('.txt', '.rtf'); + insert into files_converts (input, output) values ('.wps', '.docm'); + insert into files_converts (input, output) values ('.wps', '.docx'); + insert into files_converts (input, output) values ('.wps', '.dotm'); + insert into files_converts (input, output) values ('.wps', '.dotx'); + insert into files_converts (input, output) values ('.wps', '.epub'); + insert into files_converts (input, output) values ('.wps', '.fb2'); + insert into files_converts (input, output) values ('.wps', '.html'); + insert into files_converts (input, output) values ('.wps', '.odt'); + insert into files_converts (input, output) values ('.wps', '.ott'); + insert into files_converts (input, output) values ('.wps', '.pdf'); + insert into files_converts (input, output) values ('.wps', '.rtf'); + insert into files_converts (input, output) values ('.wps', '.txt'); + insert into files_converts (input, output) values ('.wpt', '.docm'); + insert into files_converts (input, output) values ('.wpt', '.docx'); + insert into files_converts (input, output) values ('.wpt', '.dotm'); + insert into files_converts (input, output) values ('.wpt', '.dotx'); + insert into files_converts (input, output) values ('.wpt', '.epub'); + insert into files_converts (input, output) values ('.wpt', '.fb2'); + insert into files_converts (input, output) values ('.wpt', '.html'); + insert into files_converts (input, output) values ('.wpt', '.odt'); + insert into files_converts (input, output) values ('.wpt', '.ott'); + insert into files_converts (input, output) values ('.wpt', '.pdf'); + insert into files_converts (input, output) values ('.wpt', '.rtf'); + insert into files_converts (input, output) values ('.wpt', '.txt'); insert into files_converts (input, output) values ('.xls', '.csv'); insert into files_converts (input, output) values ('.xls', '.ods'); insert into files_converts (input, output) values ('.xls', '.ots'); @@ -536,6 +708,14 @@ BEGIN insert into files_converts (input, output) values ('.xlsm', '.xltm'); insert into files_converts (input, output) values ('.xlsm', '.xltx'); insert into files_converts (input, output) values ('.xlst', '.xlsx'); + insert into files_converts (input, output) values ('.xlsb', '.csv'); + insert into files_converts (input, output) values ('.xlsb', '.ods'); + insert into files_converts (input, output) values ('.xlsb', '.ots'); + insert into files_converts (input, output) values ('.xlsb', '.pdf'); + insert into files_converts (input, output) values ('.xlsb', '.xlsm'); + insert into files_converts (input, output) values ('.xlsb', '.xlsx'); + insert into files_converts (input, output) values ('.xlsb', '.xltm'); + insert into files_converts (input, output) values ('.xlsb', '.xltx'); insert into files_converts (input, output) values ('.xlsx', '.csv'); insert into files_converts (input, output) values ('.xlsx', '.ods'); insert into files_converts (input, output) values ('.xlsx', '.ots'); @@ -577,7 +757,18 @@ BEGIN insert into files_converts (input, output) values ('.xml', '.pdf'); insert into files_converts (input, output) values ('.xml', '.rtf'); insert into files_converts (input, output) values ('.xml', '.txt'); + insert into files_converts (input, output) values ('.xps', '.docm'); + insert into files_converts (input, output) values ('.xps', '.docx'); + insert into files_converts (input, output) values ('.xps', '.dotm'); + insert into files_converts (input, output) values ('.xps', '.dotx'); + insert into files_converts (input, output) values ('.xps', '.epub'); + insert into files_converts (input, output) values ('.xps', '.fb2'); + insert into files_converts (input, output) values ('.xps', '.html'); + insert into files_converts (input, output) values ('.xps', '.odt'); + insert into files_converts (input, output) values ('.xps', '.ott'); insert into files_converts (input, output) values ('.xps', '.pdf'); + insert into files_converts (input, output) values ('.xps', '.rtf'); + insert into files_converts (input, output) values ('.xps', '.txt'); commit; start transaction; diff --git a/build/sql/onlyoffice.sql b/build/sql/onlyoffice.sql index 42e2b47a3..5238d57cb 100644 --- a/build/sql/onlyoffice.sql +++ b/build/sql/onlyoffice.sql @@ -37,6 +37,7 @@ CREATE TABLE IF NOT EXISTS `backup_backup` ( `expires_on` datetime NOT NULL DEFAULT '0001-01-01 00:00:00', `storage_params` TEXT NULL, `hash` char(64) NOT NULL, + `removed` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `tenant_id` (`tenant_id`), KEY `expires_on` (`expires_on`), @@ -349,7 +350,6 @@ CREATE TABLE IF NOT EXISTS `core_user` ( `workfromdate` datetime DEFAULT NULL, `terminateddate` datetime DEFAULT NULL, `title` varchar(64) DEFAULT NULL, - `department` varchar(128) DEFAULT NULL, `culture` varchar(20) DEFAULT NULL, `contacts` varchar(1024) DEFAULT NULL, `phone` varchar(255) DEFAULT NULL, @@ -362,6 +362,7 @@ CREATE TABLE IF NOT EXISTS `core_user` ( `removed` int(11) NOT NULL DEFAULT '0', `create_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `last_modified` datetime NOT NULL, + `user_lead` VARCHAR(36) DEFAULT NULL, PRIMARY KEY (`id`), KEY `last_modified` (`last_modified`), KEY `username` (`tenant`,`username`), @@ -944,8 +945,10 @@ CREATE TABLE IF NOT EXISTS `feed_readed` ( CREATE TABLE IF NOT EXISTS `feed_users` ( `feed_id` varchar(88) NOT NULL, `user_id` char(38) NOT NULL, + `aggregated_date` datetime DEFAULT NULL, PRIMARY KEY (`feed_id`,`user_id`), - KEY `user_id` (`user_id`) + KEY `user_id` (`user_id`), + KEY `aggregated_date` (`aggregated_date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `files_bunch_objects` ( @@ -1035,9 +1038,11 @@ CREATE TABLE IF NOT EXISTS `files_security` ( `entry_id` varchar(50) NOT NULL, `entry_type` int(10) NOT NULL, `subject` char(38) NOT NULL, + `subject_type` tinyint(1) UNSIGNED NOT NULL, `owner` char(38) NOT NULL, `security` int(11) NOT NULL, `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `options` TEXT NULL, PRIMARY KEY (`tenant_id`,`entry_id`,`entry_type`,`subject`), KEY `owner` (`owner`), KEY `tenant_id` (`tenant_id`,`entry_type`,`entry_id`,`owner`) @@ -1305,8 +1310,10 @@ CREATE TABLE IF NOT EXISTS `jabber_offmessage` ( `id` int(11) NOT NULL AUTO_INCREMENT, `jid` varchar(255) NOT NULL, `message` mediumtext, + `stamp` datetime DEFAULT NULL, PRIMARY KEY (`id`), - KEY `jabber_offmessage_jid` (`jid`) + KEY `jabber_offmessage_jid` (`jid`), + KEY `jabber_offmessage_stamp` (`stamp`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `jabber_offpresence` ( @@ -2277,6 +2284,7 @@ CREATE TABLE IF NOT EXISTS `tenants_iprestrictions` ( `id` int(10) NOT NULL AUTO_INCREMENT, `tenant` int(10) NOT NULL, `ip` varchar(50) NOT NULL, + `for_admin` TINYINT(1) NOT NULL, PRIMARY KEY (`id`), KEY `tenant` (`tenant`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -2309,7 +2317,8 @@ CREATE TABLE IF NOT EXISTS `tenants_quotarow` ( `counter` bigint(20) NOT NULL DEFAULT '0', `tag` varchar(1024) DEFAULT NULL, `last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`tenant`,`path`), + `user_id` varchar(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', + PRIMARY KEY (`tenant`,`path`,`user_id`), KEY `last_modified` (`last_modified`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/build/sql/onlyoffice.upgrade86.sql b/build/sql/onlyoffice.upgrade86.sql index 056291592..b3ddcc032 100644 --- a/build/sql/onlyoffice.upgrade86.sql +++ b/build/sql/onlyoffice.upgrade86.sql @@ -21,12 +21,19 @@ BEGIN IF NOT EXISTS(SELECT * FROM information_schema.`TABLES` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'jabber_offmessage' AND `TABLE_COLLATION` = 'utf8mb4_general_ci') THEN RENAME TABLE jabber_offmessage TO jabber_offmessage_old; + + IF NOT EXISTS(SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'jabber_offmessage_old' AND COLUMN_NAME = 'stamp') THEN + ALTER TABLE `jabber_offmessage_old` ADD COLUMN `stamp` DATETIME NULL AFTER `message`, ADD INDEX `jabber_offmessage_stamp` (`stamp`); + END IF; + CREATE TABLE `jabber_offmessage` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `jid` VARCHAR(255) NOT NULL, `message` MEDIUMTEXT NULL DEFAULT NULL, + `stamp` datetime NOT NULL, PRIMARY KEY (`id`), - INDEX `jabber_offmessage_jid` (`jid`(190)) + INDEX `jabber_offmessage_jid` (`jid`(190)), + INDEX `jabber_offmessage_stamp` (`stamp`) ) COLLATE='utf8mb4_general_ci'; INSERT INTO jabber_offmessage SELECT * FROM jabber_offmessage_old; diff --git a/build/sql/onlyoffice.upgradev125.sql b/build/sql/onlyoffice.upgradev125.sql new file mode 100644 index 000000000..3ec0225fa --- /dev/null +++ b/build/sql/onlyoffice.upgradev125.sql @@ -0,0 +1,247 @@ +DELIMITER DLM00 + +DROP PROCEDURE IF EXISTS upgrade125 DLM00 + +CREATE PROCEDURE upgrade125() +BEGIN + + IF NOT EXISTS(SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tenants_iprestrictions' AND COLUMN_NAME = 'for_admin') THEN + ALTER TABLE `tenants_iprestrictions` ADD COLUMN `for_admin` TINYINT(1) NOT NULL AFTER `ip`; + END IF; + + IF NOT EXISTS(SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'feed_users' AND COLUMN_NAME = 'aggregated_date') THEN + + ALTER TABLE `feed_users` ADD COLUMN `aggregated_date` DATETIME NULL AFTER `user_id`; + ALTER TABLE `feed_users` ADD INDEX `aggregated_date` (`aggregated_date`); + + UPDATE feed_users fu + INNER JOIN feed_aggregate fa ON fu.feed_id = fa.id + SET fu.aggregated_date = fa.aggregated_date; + + END IF; + + IF NOT EXISTS(SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'files_security' AND COLUMN_NAME = 'subject_type') THEN + ALTER TABLE `files_security` ADD COLUMN `subject_type` TINYINT UNSIGNED NOT NULL AFTER `subject`, ADD COLUMN `options` TEXT NULL AFTER `timestamp`; + UPDATE files_security SET subject_type=1 WHERE subject='d77bd6af-828b-41f5-84ed-7ffe2565b13a'; + UPDATE files_security SET subject_type=2 WHERE subject='ee7a7468-cda5-4f8b-afdb-f4e42c318eb6' or subject='aafd9c26-9686-4996-9665-35ca72721c4c'; + END IF; + + IF NOT EXISTS(SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'core_user' AND COLUMN_NAME = 'user_lead') THEN + ALTER TABLE `core_user` ADD COLUMN `user_lead` VARCHAR(36) NULL AFTER `last_modified`; + END IF; + + IF EXISTS(SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'core_user' AND COLUMN_NAME = 'department') THEN + ALTER TABLE `core_user` DROP COLUMN `department`; + END IF; + + IF NOT EXISTS(SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'tenants_quotarow' AND COLUMN_NAME = 'user_id') THEN + ALTER TABLE `tenants_quotarow` ADD COLUMN `user_id` VARCHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' AFTER `last_modified`, DROP PRIMARY KEY, ADD PRIMARY KEY (`tenant`, `path`, `user_id`); + END IF; + + IF NOT EXISTS(SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'jabber_offmessage' AND COLUMN_NAME = 'stamp') THEN + ALTER TABLE `jabber_offmessage` ADD COLUMN `stamp` DATETIME NULL AFTER `message`, ADD INDEX `jabber_offmessage_stamp` (`stamp`); + END IF; + + IF NOT EXISTS(SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'backup_backup' AND COLUMN_NAME = 'removed') THEN + ALTER TABLE `backup_backup` ADD COLUMN `removed` tinyint(1) NOT NULL DEFAULT '0' AFTER `hash`; + END IF; + + UPDATE `crm_currency_info` SET `is_convertable` = 0 WHERE `abbreviation` IN ('LTL', 'LVL', 'VEF'); + INSERT IGNORE INTO `crm_currency_info` (`resource_key`, `abbreviation`, `symbol`, `culture_name`, `is_convertable`, `is_basic`) values ('Currency_AngolanKwanza', 'AOA', 'Kz', 'AO', 0, 0); + INSERT IGNORE INTO `crm_currency_info` (`resource_key`, `abbreviation`, `symbol`, `culture_name`, `is_convertable`, `is_basic`) values ('Currency_VenezuelanBolivarSoberano', 'VES', 'Bs.S', 'VE', 1, 0); + + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.docxf', '.docm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.docxf', '.dotm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dps', '.odp'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dps', '.otp'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dps', '.pdf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dps', '.potm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dps', '.potx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dps', '.ppsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dps', '.ppsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dps', '.pptm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dps', '.pptx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dpt', '.odp'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dpt', '.otp'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dpt', '.pdf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dpt', '.potm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dpt', '.potx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dpt', '.ppsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dpt', '.ppsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dpt', '.pptm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.dpt', '.pptx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.et', '.csv'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.et', '.ods'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.et', '.ots'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.et', '.pdf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.et', '.xlsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.et', '.xlsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.et', '.xltm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.et', '.xltx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.ett', '.csv'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.ett', '.ods'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.ett', '.ots'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.ett', '.pdf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.ett', '.xlsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.ett', '.xlsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.ett', '.xltm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.ett', '.xltx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.fodp', '.ppsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.fodp', '.ppsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.htm', '.docm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.htm', '.docx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.htm', '.dotm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.htm', '.dotx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.htm', '.epub'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.htm', '.fb2'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.htm', '.html'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.htm', '.odt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.htm', '.ott'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.htm', '.pdf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.htm', '.rtf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.htm', '.txt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.mht', '.html'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.mhtml', '.docm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.mhtml', '.docx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.mhtml', '.dotm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.mhtml', '.dotx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.mhtml', '.epub'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.mhtml', '.fb2'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.mhtml', '.html'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.mhtml', '.odt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.mhtml', '.ott'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.mhtml', '.pdf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.mhtml', '.rtf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.mhtml', '.txt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.odp', '.ppsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.odp', '.ppsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.otp', '.ppsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.otp', '.ppsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.oxps', '.docm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.oxps', '.docx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.oxps', '.dotm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.oxps', '.dotx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.oxps', '.epub'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.oxps', '.fb2'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.oxps', '.html'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.oxps', '.odt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.oxps', '.ott'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.oxps', '.rtf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.oxps', '.txt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pdf', '.docm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pdf', '.docx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pdf', '.dotm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pdf', '.dotx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pdf', '.epub'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pdf', '.fb2'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pdf', '.html'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pdf', '.odt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pdf', '.ott'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pdf', '.rtf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pdf', '.txt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pot', '.ppsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pot', '.ppsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.potm', '.ppsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.potm', '.ppsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.potx', '.ppsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.potx', '.ppsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pps', '.ppsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pps', '.ppsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.ppsm', '.ppsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.ppsx', '.ppsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.ppt', '.ppsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.ppt', '.ppsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pptm', '.ppsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pptm', '.ppsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pptx', '.ppsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.pptx', '.ppsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.stw', '.docm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.stw', '.docx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.stw', '.dotm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.stw', '.dotx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.stw', '.epub'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.stw', '.fb2'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.stw', '.html'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.stw', '.odt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.stw', '.ott'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.stw', '.pdf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.stw', '.rtf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.stw', '.txt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxc', '.csv'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxc', '.ods'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxc', '.ots'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxc', '.pdf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxc', '.xlsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxc', '.xlsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxc', '.xltm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxc', '.xltx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxi', '.odp'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxi', '.otp'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxi', '.pdf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxi', '.potm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxi', '.potx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxi', '.ppsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxi', '.ppsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxi', '.pptm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxi', '.pptx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxw', '.docm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxw', '.docx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxw', '.dotm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxw', '.dotx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxw', '.epub'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxw', '.fb2'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxw', '.html'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxw', '.odt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxw', '.ott'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxw', '.pdf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxw', '.rtf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.sxw', '.txt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wps', '.docm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wps', '.docx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wps', '.dotm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wps', '.dotx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wps', '.epub'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wps', '.fb2'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wps', '.html'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wps', '.odt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wps', '.ott'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wps', '.pdf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wps', '.rtf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wps', '.txt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wpt', '.docm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wpt', '.docx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wpt', '.dotm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wpt', '.dotx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wpt', '.epub'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wpt', '.fb2'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wpt', '.html'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wpt', '.odt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wpt', '.ott'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wpt', '.pdf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wpt', '.rtf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.wpt', '.txt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xlsb', '.csv'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xlsb', '.ods'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xlsb', '.ots'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xlsb', '.pdf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xlsb', '.xlsm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xlsb', '.xlsx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xlsb', '.xltm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xlsb', '.xltx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xps', '.docm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xps', '.docx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xps', '.dotm'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xps', '.dotx'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xps', '.epub'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xps', '.fb2'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xps', '.html'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xps', '.odt'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xps', '.ott'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xps', '.rtf'); + INSERT IGNORE INTO `files_converts` (`input`, `output`) VALUES ('.xps', '.txt'); + +END DLM00 + +CALL upgrade125() DLM00 + +DELIMITER ; diff --git a/common/ASC.ActiveDirectory/ASC.ActiveDirectory.Tests/Login/LoginAcceptedTests.cs b/common/ASC.ActiveDirectory/ASC.ActiveDirectory.Tests/Login/LoginAcceptedTests.cs index 4240282b7..8c3af8d80 100644 --- a/common/ASC.ActiveDirectory/ASC.ActiveDirectory.Tests/Login/LoginAcceptedTests.cs +++ b/common/ASC.ActiveDirectory/ASC.ActiveDirectory.Tests/Login/LoginAcceptedTests.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.ActiveDirectory.Base.Data; using ASC.Core.Users; diff --git a/common/ASC.ActiveDirectory/ASC.ActiveDirectory.Tests/Query/ParseTests.cs b/common/ASC.ActiveDirectory/ASC.ActiveDirectory.Tests/Query/ParseTests.cs index cd8471cff..4e883a362 100644 --- a/common/ASC.ActiveDirectory/ASC.ActiveDirectory.Tests/Query/ParseTests.cs +++ b/common/ASC.ActiveDirectory/ASC.ActiveDirectory.Tests/Query/ParseTests.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.ActiveDirectory.Base.Expressions; using NUnit.Framework; diff --git a/common/ASC.ActiveDirectory/ASC.ActiveDirectory.Tests/Utils/LdapHelperTests.cs b/common/ASC.ActiveDirectory/ASC.ActiveDirectory.Tests/Utils/LdapHelperTests.cs index 571092c73..48203d99e 100644 --- a/common/ASC.ActiveDirectory/ASC.ActiveDirectory.Tests/Utils/LdapHelperTests.cs +++ b/common/ASC.ActiveDirectory/ASC.ActiveDirectory.Tests/Utils/LdapHelperTests.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.ActiveDirectory.Base; using NUnit.Framework; diff --git a/common/ASC.ActiveDirectory/ASC.ActiveDirectory.csproj b/common/ASC.ActiveDirectory/ASC.ActiveDirectory.csproj index 548e57aca..ad6a221d5 100644 --- a/common/ASC.ActiveDirectory/ASC.ActiveDirectory.csproj +++ b/common/ASC.ActiveDirectory/ASC.ActiveDirectory.csproj @@ -21,6 +21,8 @@ DEBUG;TRACE prompt 4 + ..\..\web\studio\ASC.Web.Studio\bin\ASC.ActiveDirectory.xml + CS1591 none @@ -98,5 +100,8 @@ 2.3.8.1 + + + \ No newline at end of file diff --git a/common/ASC.ActiveDirectory/Base/Data/LdapCertificateConfirmRequest.cs b/common/ASC.ActiveDirectory/Base/Data/LdapCertificateConfirmRequest.cs index 31b139ae1..b4dd9bd33 100644 --- a/common/ASC.ActiveDirectory/Base/Data/LdapCertificateConfirmRequest.cs +++ b/common/ASC.ActiveDirectory/Base/Data/LdapCertificateConfirmRequest.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Net.Security; @@ -37,30 +37,40 @@ public class LdapCertificateConfirmRequest private volatile string _hash; private volatile int[] _certificateErrors; + ///true [DataMember] public bool Approved { get { return _approved; } set { _approved = value; } } + ///true [DataMember] public bool Requested { get { return _requested; } set { _requested = value; } } + ///SerialNumber [DataMember] public string SerialNumber { get { return _serialNumber; } set { _serialNumber = value; } } + ///IssuerName [DataMember] public string IssuerName { get { return _issuerName; } set { _issuerName = value; } } + ///SubjectName [DataMember] public string SubjectName { get { return _subjectName; } set { _subjectName = value; } } + ///2019-07-26T00:00:00 [DataMember] public DateTime ValidFrom { get; set; } + ///2019-07-26T00:00:00 [DataMember] public DateTime ValidUntil { get; set; } + ///Hash [DataMember] public string Hash { get { return _hash; } set { _hash = value; } } + ///1 + ///list [DataMember] public int[] CertificateErrors { get { return _certificateErrors; } set { _certificateErrors = value; } } diff --git a/common/ASC.ActiveDirectory/Base/Data/LdapLogin.cs b/common/ASC.ActiveDirectory/Base/Data/LdapLogin.cs index 2e636d5a7..fff05b297 100644 --- a/common/ASC.ActiveDirectory/Base/Data/LdapLogin.cs +++ b/common/ASC.ActiveDirectory/Base/Data/LdapLogin.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Linq; namespace ASC.ActiveDirectory.Base.Data diff --git a/common/ASC.ActiveDirectory/Base/Data/LdapObject.cs b/common/ASC.ActiveDirectory/Base/Data/LdapObject.cs index 70e1c8e52..4aaec5ad5 100644 --- a/common/ASC.ActiveDirectory/Base/Data/LdapObject.cs +++ b/common/ASC.ActiveDirectory/Base/Data/LdapObject.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; namespace ASC.ActiveDirectory.Base.Data @@ -40,6 +40,7 @@ public abstract class LdapObject /// Get property object /// /// property name + /// /// value object public abstract object GetValue(string propertyName, bool getBytes = false); diff --git a/common/ASC.ActiveDirectory/Base/Data/LdapObjectExtension.cs b/common/ASC.ActiveDirectory/Base/Data/LdapObjectExtension.cs index 7062b9299..dac2c6862 100644 --- a/common/ASC.ActiveDirectory/Base/Data/LdapObjectExtension.cs +++ b/common/ASC.ActiveDirectory/Base/Data/LdapObjectExtension.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Linq; @@ -111,7 +111,7 @@ private static void PopulateContacts(List Contacts, string type, List /// - /// себя + /// Self public Criteria Add(Criteria nested) { _nestedCriteras.Add(nested); diff --git a/common/ASC.ActiveDirectory/Base/Expressions/CriteriaType.cs b/common/ASC.ActiveDirectory/Base/Expressions/CriteriaType.cs index a10675d2a..08d3901b8 100644 --- a/common/ASC.ActiveDirectory/Base/Expressions/CriteriaType.cs +++ b/common/ASC.ActiveDirectory/Base/Expressions/CriteriaType.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.ActiveDirectory.Base.Expressions { /// diff --git a/common/ASC.ActiveDirectory/Base/Expressions/Expression.cs b/common/ASC.ActiveDirectory/Base/Expressions/Expression.cs index 9737aa011..f5d860f40 100644 --- a/common/ASC.ActiveDirectory/Base/Expressions/Expression.cs +++ b/common/ASC.ActiveDirectory/Base/Expressions/Expression.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Text; @@ -134,8 +134,8 @@ public override string ToString() /// Escapes the LDAP search filter to prevent LDAP injection attacks. /// /// The search filter. - /// - /// + /// + /// /// The escaped search filter. private static string EscapeLdapSearchFilter(string searchFilter) { diff --git a/common/ASC.ActiveDirectory/Base/Expressions/Op.cs b/common/ASC.ActiveDirectory/Base/Expressions/Op.cs index 9815f0a35..52044d042 100644 --- a/common/ASC.ActiveDirectory/Base/Expressions/Op.cs +++ b/common/ASC.ActiveDirectory/Base/Expressions/Op.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.ActiveDirectory.Base.Expressions { /// diff --git a/common/ASC.ActiveDirectory/Base/LdapConstants.cs b/common/ASC.ActiveDirectory/Base/LdapConstants.cs index 2353bd54e..03885bce4 100644 --- a/common/ASC.ActiveDirectory/Base/LdapConstants.cs +++ b/common/ASC.ActiveDirectory/Base/LdapConstants.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; namespace ASC.ActiveDirectory.Base diff --git a/common/ASC.ActiveDirectory/Base/LdapHelper.cs b/common/ASC.ActiveDirectory/Base/LdapHelper.cs index 657dc2d48..8a73db7a1 100644 --- a/common/ASC.ActiveDirectory/Base/LdapHelper.cs +++ b/common/ASC.ActiveDirectory/Base/LdapHelper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Linq; diff --git a/common/ASC.ActiveDirectory/Base/LdapNotifyConstants.cs b/common/ASC.ActiveDirectory/Base/LdapNotifyConstants.cs index 2c17037b5..9a6458864 100644 --- a/common/ASC.ActiveDirectory/Base/LdapNotifyConstants.cs +++ b/common/ASC.ActiveDirectory/Base/LdapNotifyConstants.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Notify.Model; diff --git a/common/ASC.ActiveDirectory/Base/LdapNotifyHelper.cs b/common/ASC.ActiveDirectory/Base/LdapNotifyHelper.cs index 46afa5442..240b156db 100644 --- a/common/ASC.ActiveDirectory/Base/LdapNotifyHelper.cs +++ b/common/ASC.ActiveDirectory/Base/LdapNotifyHelper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Threading.Tasks; diff --git a/common/ASC.ActiveDirectory/Base/LdapNotifySource.cs b/common/ASC.ActiveDirectory/Base/LdapNotifySource.cs index e5d33a014..62d7b5a43 100644 --- a/common/ASC.ActiveDirectory/Base/LdapNotifySource.cs +++ b/common/ASC.ActiveDirectory/Base/LdapNotifySource.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Core.Tenants; diff --git a/common/ASC.ActiveDirectory/Base/LdapUserImporter.cs b/common/ASC.ActiveDirectory/Base/LdapUserImporter.cs index a9899444c..939005110 100644 --- a/common/ASC.ActiveDirectory/Base/LdapUserImporter.cs +++ b/common/ASC.ActiveDirectory/Base/LdapUserImporter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ using ASC.ActiveDirectory.ComplexOperations; using ASC.Common.Logging; using ASC.Core; +using ASC.Core.Tenants; using ASC.Core.Users; // ReSharper disable RedundantToStringCall @@ -96,8 +97,8 @@ public List GetDiscoveredUsersByAttributes() if (!AllDomainUsers.Any() && !TryLoadLDAPUsers()) return users; - - var usersToAdd = AllDomainUsers.Select(ldapObject => ldapObject.ToUserInfo(this, _log)); + var quotaSettings = TenantUserQuotaSettings.Load(); + var usersToAdd = AllDomainUsers.Select(ldapObject => ldapObject.ToUserInfo(this, quotaSettings, _log)); users.AddRange(usersToAdd); @@ -134,6 +135,7 @@ private List GetGroupUsers(GroupInfo groupInfo, bool clearCache) _log.DebugFormat("LdapUserImporter.GetGroupUsers(Group name: {0})", groupInfo.Name); var users = new List(); + var quotaSettings = TenantUserQuotaSettings.Load(); if (!AllDomainGroups.Any() && !TryLoadLDAPGroups()) return users; @@ -182,7 +184,7 @@ private List GetGroupUsers(GroupInfo groupInfo, bool clearCache) continue; } - var userInfo = ldapUser.ToUserInfo(this, _log); + var userInfo = ldapUser.ToUserInfo(this, quotaSettings, _log); if (!users.Exists(u => u.Sid == userInfo.Sid)) users.Add(userInfo); @@ -195,7 +197,7 @@ private List GetGroupUsers(GroupInfo groupInfo, bool clearCache) foreach (var ldapUser in ldapUsers) { - var userInfo = ldapUser.ToUserInfo(this, _log); + var userInfo = ldapUser.ToUserInfo(this, quotaSettings, _log); if (!users.Exists(u => u.Sid == userInfo.Sid)) users.Add(userInfo); @@ -686,6 +688,8 @@ public List> FindLdapUsers(string login) var searchTerm = exps.Count > 1 ? Criteria.Any(exps.ToArray()).ToString() : exps.First().ToString(); + var quotaSettings = TenantUserQuotaSettings.Load(); + var users = LdapHelper.GetUsers(searchTerm, !string.IsNullOrEmpty(email) ? -1 : 1) .Where(user => user != null) .ToLookup(lu => @@ -699,7 +703,7 @@ public List> FindLdapUsers(string login) _ldapDomain = LdapUtils.DistinguishedNameToDomain(lu.DistinguishedName); } - ui = lu.ToUserInfo(this, _log); + ui = lu.ToUserInfo(this, quotaSettings, _log); } catch (Exception ex) { diff --git a/common/ASC.ActiveDirectory/Base/Settings/LdapSettings.cs b/common/ASC.ActiveDirectory/Base/Settings/LdapSettings.cs index 28c8db8cc..c7f784312 100644 --- a/common/ASC.ActiveDirectory/Base/Settings/LdapSettings.cs +++ b/common/ASC.ActiveDirectory/Base/Settings/LdapSettings.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Linq; @@ -29,7 +29,7 @@ namespace ASC.ActiveDirectory.Base.Settings { [Serializable] -[DataContract] + [DataContract] public class LdapSettings : BaseSettings, ICloneable { public override Guid ID @@ -58,7 +58,9 @@ public enum MappingFields AdditionalPhone, AdditionalMobilePhone, AdditionalMail, - Skype + Skype, + + UserQuotaLimit } public enum AccessRight @@ -92,7 +94,7 @@ public List GetTenants() .Where("IFNULL(JSON_EXTRACT(`Data`, '$.EnableLdapAuthentication'), 'false')", "true") .Distinct(); - using (var dbManager = DbManager.FromHttpContext("default", 180000)) + using (var dbManager = new DbManager("default", 180000)) { return dbManager.ExecuteList(query).ConvertAll(r => Convert.ToInt32(r[0])); } @@ -216,41 +218,53 @@ public object Clone() return MemberwiseClone(); } + ///true [DataMember] public bool EnableLdapAuthentication { get; set; } + ///true [DataMember] public bool StartTls { get; set; } + ///true [DataMember] public bool Ssl { get; set; } + ///true [DataMember] public bool SendWelcomeEmail { get; set; } + ///Server [DataMember] public string Server { get; set; } + ///UserDN [DataMember] // ReSharper disable once InconsistentNaming public string UserDN { get; set; } + ///1 [DataMember] public int PortNumber { get; set; } + ///UserFilter [DataMember] public string UserFilter { get; set; } + ///LoginAttribute [DataMember] public string LoginAttribute { get; set; } + ///null [DataMember] public Dictionary LdapMapping { get; set; } //ToDo: use SId instead of group name + ///null [DataMember] public Dictionary AccessRights { get; set; } + ///FirstNameAttribute [DataMember] public string FirstNameAttribute { @@ -265,6 +279,7 @@ public string FirstNameAttribute } } + ///SecondNameAttribute [DataMember] public string SecondNameAttribute { @@ -279,6 +294,7 @@ public string SecondNameAttribute } } + ///MailAttribute [DataMember] public string MailAttribute { @@ -293,6 +309,7 @@ public string MailAttribute } } + ///TitleAttribute [DataMember] public string TitleAttribute { @@ -307,6 +324,7 @@ public string TitleAttribute } } + ///MobilePhoneAttribute [DataMember] public string MobilePhoneAttribute { @@ -321,6 +339,7 @@ public string MobilePhoneAttribute } } + ///LocationAttribute [DataMember] public string LocationAttribute { @@ -335,43 +354,57 @@ public string LocationAttribute } } + ///true [DataMember] public bool GroupMembership { get; set; } + ///GroupDN [DataMember] // ReSharper disable once InconsistentNaming public string GroupDN { get; set; } + ///GroupNameAttribute [DataMember] public string GroupNameAttribute { get; set; } + ///GroupFilter [DataMember] public string GroupFilter { get; set; } + ///UserAttribute [DataMember] public string UserAttribute { get; set; } + ///GroupAttribute [DataMember] public string GroupAttribute { get; set; } + ///true [DataMember] public bool Authentication { get; set; } + ///Login [DataMember] public string Login { get; set; } + ///Password [DataMember] public string Password { get; set; } + ///1 + ///list [DataMember] public byte[] PasswordBytes { get; set; } + ///true [DataMember] public bool IsDefault { get; set; } + ///true [DataMember] public bool AcceptCertificate { get; set; } + ///AcceptCertificateHash [DataMember] public string AcceptCertificateHash { get; set; } diff --git a/common/ASC.ActiveDirectory/Base/Settings/LdapSettingsChecker.cs b/common/ASC.ActiveDirectory/Base/Settings/LdapSettingsChecker.cs index da60b5e8b..9a5dfe27a 100644 --- a/common/ASC.ActiveDirectory/Base/Settings/LdapSettingsChecker.cs +++ b/common/ASC.ActiveDirectory/Base/Settings/LdapSettingsChecker.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Common.Logging; diff --git a/common/ASC.ActiveDirectory/Base/Settings/LdapSettingsStatus.cs b/common/ASC.ActiveDirectory/Base/Settings/LdapSettingsStatus.cs index 8246408a7..353bb716e 100644 --- a/common/ASC.ActiveDirectory/Base/Settings/LdapSettingsStatus.cs +++ b/common/ASC.ActiveDirectory/Base/Settings/LdapSettingsStatus.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.ActiveDirectory.Base.Settings { public enum LdapSettingsStatus diff --git a/common/ASC.ActiveDirectory/BuiltIn/SystemLdapHelper.cs b/common/ASC.ActiveDirectory/BuiltIn/SystemLdapHelper.cs index 0917b706d..f8b4f6156 100644 --- a/common/ASC.ActiveDirectory/BuiltIn/SystemLdapHelper.cs +++ b/common/ASC.ActiveDirectory/BuiltIn/SystemLdapHelper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.ActiveDirectory.DirectoryServices; using ASC.ActiveDirectory.Expressions; using ASC.Security.Cryptography; diff --git a/common/ASC.ActiveDirectory/BuiltIn/SystemLdapSearcher.cs b/common/ASC.ActiveDirectory/BuiltIn/SystemLdapSearcher.cs index c0145064c..33ff38017 100644 --- a/common/ASC.ActiveDirectory/BuiltIn/SystemLdapSearcher.cs +++ b/common/ASC.ActiveDirectory/BuiltIn/SystemLdapSearcher.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Linq; using ASC.ActiveDirectory.Expressions; using ASC.Security.Cryptography; diff --git a/common/ASC.ActiveDirectory/BuiltIn/SystemLdapSettingsChecker.cs b/common/ASC.ActiveDirectory/BuiltIn/SystemLdapSettingsChecker.cs index c7a0b62e2..d08730b62 100644 --- a/common/ASC.ActiveDirectory/BuiltIn/SystemLdapSettingsChecker.cs +++ b/common/ASC.ActiveDirectory/BuiltIn/SystemLdapSettingsChecker.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.ActiveDirectory.DirectoryServices; using System; using System.DirectoryServices; diff --git a/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapChange.cs b/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapChange.cs index 6bbe585c9..1887ade32 100644 --- a/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapChange.cs +++ b/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapChange.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; using Newtonsoft.Json; diff --git a/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapChangeCollection.cs b/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapChangeCollection.cs index 98b1e4e40..d72bbf904 100644 --- a/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapChangeCollection.cs +++ b/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapChangeCollection.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.ComponentModel; diff --git a/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapChangeEnums.cs b/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapChangeEnums.cs index 997c235be..c18698a4d 100644 --- a/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapChangeEnums.cs +++ b/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapChangeEnums.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; diff --git a/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapItemChange.cs b/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapItemChange.cs index 0e323906e..34eb142cb 100644 --- a/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapItemChange.cs +++ b/common/ASC.ActiveDirectory/ComplexOperations/Data/LdapItemChange.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using Newtonsoft.Json; using Newtonsoft.Json.Converters; diff --git a/common/ASC.ActiveDirectory/ComplexOperations/LdapLocalization.cs b/common/ASC.ActiveDirectory/ComplexOperations/LdapLocalization.cs index 591cdc5a9..8ccfd7441 100644 --- a/common/ASC.ActiveDirectory/ComplexOperations/LdapLocalization.cs +++ b/common/ASC.ActiveDirectory/ComplexOperations/LdapLocalization.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Resources; namespace ASC.ActiveDirectory.ComplexOperations diff --git a/common/ASC.ActiveDirectory/ComplexOperations/LdapOperation.cs b/common/ASC.ActiveDirectory/ComplexOperations/LdapOperation.cs index 6554b8bf2..c92b325ee 100644 --- a/common/ASC.ActiveDirectory/ComplexOperations/LdapOperation.cs +++ b/common/ASC.ActiveDirectory/ComplexOperations/LdapOperation.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Globalization; using System.Linq; diff --git a/common/ASC.ActiveDirectory/ComplexOperations/LdapOperationStatus.cs b/common/ASC.ActiveDirectory/ComplexOperations/LdapOperationStatus.cs index 013a34088..5e46ec16f 100644 --- a/common/ASC.ActiveDirectory/ComplexOperations/LdapOperationStatus.cs +++ b/common/ASC.ActiveDirectory/ComplexOperations/LdapOperationStatus.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Runtime.Serialization; using ASC.ActiveDirectory.Base.Data; @@ -24,30 +24,39 @@ namespace ASC.ActiveDirectory.ComplexOperations [DataContract] public class LdapOperationStatus { + ///true [DataMember] public bool Completed { get; set; } + ///true [DataMember] public string Id { get; set; } + ///true [DataMember] public string Status { get; set; } + ///true [DataMember] public string Error { get; set; } + ///true [DataMember] public string Warning { get; set; } + ///true [DataMember] public int Percents { get; set; } + ///ASC.ActiveDirectory.Base.Data.LdapCertificateConfirmRequest, ASC.ActiveDirectory [DataMember] public LdapCertificateConfirmRequest CertificateConfirmRequest { get; set; } + ///Source [DataMember] public string Source { get; set; } + ///OperationType [DataMember] public string OperationType { get; set; } } diff --git a/common/ASC.ActiveDirectory/ComplexOperations/LdapOperationType.cs b/common/ASC.ActiveDirectory/ComplexOperations/LdapOperationType.cs index dce5bf956..d31816357 100644 --- a/common/ASC.ActiveDirectory/ComplexOperations/LdapOperationType.cs +++ b/common/ASC.ActiveDirectory/ComplexOperations/LdapOperationType.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.ActiveDirectory.ComplexOperations { public enum LdapOperationType diff --git a/common/ASC.ActiveDirectory/ComplexOperations/LdapSaveSyncOperation.cs b/common/ASC.ActiveDirectory/ComplexOperations/LdapSaveSyncOperation.cs index bbfda9b5c..b0830d423 100644 --- a/common/ASC.ActiveDirectory/ComplexOperations/LdapSaveSyncOperation.cs +++ b/common/ASC.ActiveDirectory/ComplexOperations/LdapSaveSyncOperation.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Linq; @@ -101,7 +101,7 @@ protected override void Do() ((LdapCurrentUserPhotos)LdapCurrentUserPhotos.Load().GetDefault()).Save(); ((LdapCurrentAcccessSettings)LdapCurrentAcccessSettings.Load().GetDefault()).Save(); - //не снимать права при выключении + //do not remove permissions on shutdown //var rights = new List(); //TakeUsersRights(rights); diff --git a/common/ASC.ActiveDirectory/LdapUserManager.cs b/common/ASC.ActiveDirectory/LdapUserManager.cs index 628a32f03..a0ffb4c48 100644 --- a/common/ASC.ActiveDirectory/LdapUserManager.cs +++ b/common/ASC.ActiveDirectory/LdapUserManager.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Globalization; @@ -127,6 +127,14 @@ public bool TryAddLDAPUser(UserInfo ldapUserInfo, bool onlyGetChanges, out UserI _log.DebugFormat("CoreContext.UserManager.SaveUserInfo({0})", ldapUserInfo.GetUserInfoString()); portalUserInfo = CoreContext.UserManager.SaveUserInfo(ldapUserInfo, syncCardDav: true); + + var quotaSettings = TenantUserQuotaSettings.Load(); + + if (quotaSettings.EnableUserQuota) + { + var userSettings = new UserQuotaSettings { UserQuota = ldapUserInfo.LdapQouta }; + userSettings.SaveForUser(ldapUserInfo.ID); + } var passwordHash = LdapUtils.GeneratePassword(); @@ -249,7 +257,6 @@ private UserInfo SyncLDAPUser(UserInfo ldapUserInfo, List ldapUsers, o null, new[] { new DirectRecipient(ldapUserInfo.Email, null, new[] { ldapUserInfo.Email }, false) }, new[] { ASC.Core.Configuration.Constants.NotifyEMailSenderSysName }, - null, new TagValue(NotifyConstants.TagUserName, ldapUserInfo.DisplayUserName()), new TagValue(NotifyConstants.TagUserEmail, ldapUserInfo.Email), new TagValue(NotifyConstants.TagMyStaffLink, CommonLinkUtility.GetFullAbsolutePath(CommonLinkUtility.GetMyStaff())), diff --git a/common/ASC.ActiveDirectory/LdapUtils.cs b/common/ASC.ActiveDirectory/LdapUtils.cs index cfd6431d0..33583e364 100644 --- a/common/ASC.ActiveDirectory/LdapUtils.cs +++ b/common/ASC.ActiveDirectory/LdapUtils.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Linq; using System.Text; @@ -156,6 +156,50 @@ public static bool IsCertInstalled(Syscert.X509Certificate certificate, ILog log return false; } + public static long ConvertSizeToBytes(string size) + { + long bytes = 0; + try + { + if (size == null) { return -1; } + + var regex = new Regex(@"\d+|\w+"); + var matches = regex.Matches(size); + if (matches.Count > 0) + { + var num = int.Parse(matches[0].Value); + var unit = matches[1].Value.ToLower(); + switch (unit) + { + case "bytes": + bytes = num; + break; + case "kb": + bytes = num * 1024; + break; + case "mb": + bytes = Convert.ToInt64(num * Math.Pow(1024, 2)); + break; + case "gb": + bytes = Convert.ToInt64(num * Math.Pow(1024, 3)); + break; + case "tb": + bytes = Convert.ToInt64(num * Math.Pow(1024, 4)); + break; + case "pb": + bytes = Convert.ToInt64(num * Math.Pow(1024, 5)); + break; + } + return bytes; + } + } + catch (Exception) + { + } + + return -1; + } + public static bool TryInstallCert(Syscert.X509Certificate certificate, ILog log = null) { try diff --git a/common/ASC.ActiveDirectory/Novell/Data/NovellLdapObject.cs b/common/ASC.ActiveDirectory/Novell/Data/NovellLdapObject.cs index b88b1752f..a3f250b4c 100644 --- a/common/ASC.ActiveDirectory/Novell/Data/NovellLdapObject.cs +++ b/common/ASC.ActiveDirectory/Novell/Data/NovellLdapObject.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Linq; @@ -108,6 +108,7 @@ public override bool IsDisabled /// Get property object /// /// property name + /// /// value object public sealed override object GetValue(string propertyName, bool getBytes = false) { diff --git a/common/ASC.ActiveDirectory/Novell/Exceptions/NovellLdapTlsCertificateRequestedException.cs b/common/ASC.ActiveDirectory/Novell/Exceptions/NovellLdapTlsCertificateRequestedException.cs index be2547c94..343062ca0 100644 --- a/common/ASC.ActiveDirectory/Novell/Exceptions/NovellLdapTlsCertificateRequestedException.cs +++ b/common/ASC.ActiveDirectory/Novell/Exceptions/NovellLdapTlsCertificateRequestedException.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.ActiveDirectory.Base.Data; diff --git a/common/ASC.ActiveDirectory/Novell/Extensions/NovellLdapEntryExtension.cs b/common/ASC.ActiveDirectory/Novell/Extensions/NovellLdapEntryExtension.cs index fad530e8d..eadf68556 100644 --- a/common/ASC.ActiveDirectory/Novell/Extensions/NovellLdapEntryExtension.cs +++ b/common/ASC.ActiveDirectory/Novell/Extensions/NovellLdapEntryExtension.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Globalization; diff --git a/common/ASC.ActiveDirectory/Novell/NovellLdapHelper.cs b/common/ASC.ActiveDirectory/Novell/NovellLdapHelper.cs index e61278dfe..13578dba6 100644 --- a/common/ASC.ActiveDirectory/Novell/NovellLdapHelper.cs +++ b/common/ASC.ActiveDirectory/Novell/NovellLdapHelper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Configuration; diff --git a/common/ASC.ActiveDirectory/Novell/NovellLdapSearcher.cs b/common/ASC.ActiveDirectory/Novell/NovellLdapSearcher.cs index 86b3f4690..c40f80977 100644 --- a/common/ASC.ActiveDirectory/Novell/NovellLdapSearcher.cs +++ b/common/ASC.ActiveDirectory/Novell/NovellLdapSearcher.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Configuration; diff --git a/common/ASC.ActiveDirectory/Novell/NovellLdapSettingsChecker.cs b/common/ASC.ActiveDirectory/Novell/NovellLdapSettingsChecker.cs index bc3422349..4d09dce49 100644 --- a/common/ASC.ActiveDirectory/Novell/NovellLdapSettingsChecker.cs +++ b/common/ASC.ActiveDirectory/Novell/NovellLdapSettingsChecker.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Linq; using System.Net.Sockets; diff --git a/common/ASC.ActiveDirectory/Novell/NovellLdapUserImporter.cs b/common/ASC.ActiveDirectory/Novell/NovellLdapUserImporter.cs index 8a6a4c251..56ab59b8e 100644 --- a/common/ASC.ActiveDirectory/Novell/NovellLdapUserImporter.cs +++ b/common/ASC.ActiveDirectory/Novell/NovellLdapUserImporter.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.ActiveDirectory.Base; using ASC.ActiveDirectory.Base.Settings; using ASC.ActiveDirectory.ComplexOperations; diff --git a/common/ASC.Common/ASC.Common.csproj b/common/ASC.Common/ASC.Common.csproj index b983464a8..42bf18732 100644 --- a/common/ASC.Common/ASC.Common.csproj +++ b/common/ASC.Common/ASC.Common.csproj @@ -27,6 +27,8 @@ 4 false AnyCPU + ..\..\web\studio\ASC.Web.Studio\bin\ASC.Common.xml + CS1591 none @@ -217,6 +219,7 @@ + @@ -229,6 +232,8 @@ + + @@ -263,17 +268,23 @@ 3.1.4 - 8.0.29 + 8.0.32.1 13.0.1 - 4.7.11 + 5.1.2 + + + 7.0.0 1.2.0 + + 7.2.3 + 2.2.88 @@ -296,6 +307,8 @@ + + diff --git a/common/ASC.Common/Caching/AscCache.cs b/common/ASC.Common/Caching/AscCache.cs index ed118030c..62bda91f4 100644 --- a/common/ASC.Common/Caching/AscCache.cs +++ b/common/ASC.Common/Caching/AscCache.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,8 +23,6 @@ using System.Runtime.Caching; using System.Text.RegularExpressions; -using StackExchange.Redis.Extensions.Core.Extensions; - namespace ASC.Common.Caching { public class AscCache : ICache, ICacheNotify @@ -100,38 +98,44 @@ public void Remove(Regex pattern) public IDictionary HashGetAll(string key) { var cache = GetCache(); - var dic = (IDictionary)cache.Get(key); - return dic != null ? new Dictionary(dic) : new Dictionary(); + var dic = (ConcurrentDictionary)cache.Get(key); + + return dic != null ? new ConcurrentDictionary(dic) : new ConcurrentDictionary(); } public T HashGet(string key, string field) { var cache = GetCache(); T value; - var dic = (IDictionary)cache.Get(key); + var dic = (ConcurrentDictionary)cache.Get(key); + if (dic != null && dic.TryGetValue(field, out value)) { return value; } + return default(T); } public void HashSet(string key, string field, T value) { var cache = GetCache(); - var dic = (IDictionary)cache.Get(key); + var dic = (ConcurrentDictionary)cache.Get(key); if (value != null) { if (dic == null) { - dic = new Dictionary(); + dic = new ConcurrentDictionary(); } - dic[field] = value; + + dic.AddOrUpdate(field, value, (k, v) => value); + cache.Set(key, dic, null); } else if (dic != null) { - dic.Remove(field); + dic.TryRemove(field, out _); + if (dic.Count == 0) { cache.Remove(key); diff --git a/common/ASC.Common/Caching/CacheNotifyAction.cs b/common/ASC.Common/Caching/CacheNotifyAction.cs index 443088452..1e352a670 100644 --- a/common/ASC.Common/Caching/CacheNotifyAction.cs +++ b/common/ASC.Common/Caching/CacheNotifyAction.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; diff --git a/common/ASC.Common/Caching/ICache.cs b/common/ASC.Common/Caching/ICache.cs index ef06649f8..422830c78 100644 --- a/common/ASC.Common/Caching/ICache.cs +++ b/common/ASC.Common/Caching/ICache.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Text.RegularExpressions; diff --git a/common/ASC.Common/Caching/ICacheNotify.cs b/common/ASC.Common/Caching/ICacheNotify.cs index 520fd8086..c4b9cc345 100644 --- a/common/ASC.Common/Caching/ICacheNotify.cs +++ b/common/ASC.Common/Caching/ICacheNotify.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; namespace ASC.Common.Caching diff --git a/common/ASC.Common/Caching/RedisCache.cs b/common/ASC.Common/Caching/RedisCache.cs index 37ffa4e8c..68ba26de6 100644 --- a/common/ASC.Common/Caching/RedisCache.cs +++ b/common/ASC.Common/Caching/RedisCache.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Collections/CachedDictionaryBase.cs b/common/ASC.Common/Collections/CachedDictionaryBase.cs index fd6e4785e..7ff0fe168 100644 --- a/common/ASC.Common/Collections/CachedDictionaryBase.cs +++ b/common/ASC.Common/Collections/CachedDictionaryBase.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Collections/HttpRequestDictionary.cs b/common/ASC.Common/Collections/HttpRequestDictionary.cs index d8c1361e4..b4116c8ae 100644 --- a/common/ASC.Common/Collections/HttpRequestDictionary.cs +++ b/common/ASC.Common/Collections/HttpRequestDictionary.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/AdoProxy/DbCommandProxy.cs b/common/ASC.Common/Data/AdoProxy/DbCommandProxy.cs index 8b7630f80..a207d5954 100644 --- a/common/ASC.Common/Data/AdoProxy/DbCommandProxy.cs +++ b/common/ASC.Common/Data/AdoProxy/DbCommandProxy.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/AdoProxy/DbConnectionProxy.cs b/common/ASC.Common/Data/AdoProxy/DbConnectionProxy.cs index 986337754..433cdabe2 100644 --- a/common/ASC.Common/Data/AdoProxy/DbConnectionProxy.cs +++ b/common/ASC.Common/Data/AdoProxy/DbConnectionProxy.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/AdoProxy/DbTransactionProxy.cs b/common/ASC.Common/Data/AdoProxy/DbTransactionProxy.cs index 45efa3526..19cf8af44 100644 --- a/common/ASC.Common/Data/AdoProxy/DbTransactionProxy.cs +++ b/common/ASC.Common/Data/AdoProxy/DbTransactionProxy.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/AdoProxy/EventArgs.cs b/common/ASC.Common/Data/AdoProxy/EventArgs.cs index 793ce2c21..0b97fdbba 100644 --- a/common/ASC.Common/Data/AdoProxy/EventArgs.cs +++ b/common/ASC.Common/Data/AdoProxy/EventArgs.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/AdoProxy/ExecuteHelper.cs b/common/ASC.Common/Data/AdoProxy/ExecuteHelper.cs index a9c1f8e6a..8c103aae1 100644 --- a/common/ASC.Common/Data/AdoProxy/ExecuteHelper.cs +++ b/common/ASC.Common/Data/AdoProxy/ExecuteHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/AdoProxy/ProxyContext.cs b/common/ASC.Common/Data/AdoProxy/ProxyContext.cs index 015eb42ff..139c17fed 100644 --- a/common/ASC.Common/Data/AdoProxy/ProxyContext.cs +++ b/common/ASC.Common/Data/AdoProxy/ProxyContext.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/DataExtensions.cs b/common/ASC.Common/Data/DataExtensions.cs index e786bace7..9a2670cea 100644 --- a/common/ASC.Common/Data/DataExtensions.cs +++ b/common/ASC.Common/Data/DataExtensions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,30 +30,6 @@ namespace ASC.Common.Data { public static class DataExtensions { - public static List ExecuteList(this DbConnection connection, string sql, params object[] parameters) - { - using (var command = connection.CreateCommand()) - { - return command.ExecuteList(sql, parameters); - } - } - - public static T ExecuteScalar(this DbConnection connection, string sql, params object[] parameters) - { - using (var command = connection.CreateCommand()) - { - return command.ExecuteScalar(sql, parameters); - } - } - - public static int ExecuteNonQuery(this DbConnection connection, string sql, params object[] parameters) - { - using (var command = connection.CreateCommand()) - { - return command.ExecuteNonQuery(sql, parameters); - } - } - public static DbCommand CreateCommand(this DbConnection connection, string sql, params object[] parameters) { var command = connection.CreateCommand(); @@ -198,28 +174,6 @@ public static T ExecuteScalar(this DbCommand command, string sql, params obje return (T)Convert.ChangeType(scalar, scalarType); } - public static async Task ExecuteScalarAsync(this DbCommand command, string sql, params object[] parameters) - { - command.PrepareCommand(sql, parameters); - - var scalar = await command.ExecuteScalarAsync(); - - if (scalar == null || scalar == DBNull.Value) - { - return default(T); - } - var scalarType = typeof(T); - if (scalarType == typeof(object)) - { - return (T)scalar; - } - if (scalarType.Name == "Nullable`1") - { - scalarType = scalarType.GetGenericArguments()[0]; - } - return (T)Convert.ChangeType(scalar, scalarType); - } - public static int ExecuteNonQuery(this DbCommand command, string sql, params object[] parameters) { command.PrepareCommand(sql, parameters); @@ -232,21 +186,21 @@ public static Task ExecuteNonQueryAsync(this DbCommand command, string sql, return command.ExecuteNonQueryAsync(); } - public static List ExecuteList(this DbCommand command, ISqlInstruction sql, ISqlDialect dialect) + public static List ExecuteList(this DbManager manager, ISqlInstruction sql, ISqlDialect dialect) { - ApplySqlInstruction(command, sql, dialect); + var command = manager.ApplySqlInstruction(sql, dialect); return command.ExecuteList(); } - public static Task> ExecuteListAsync(this DbCommand command, ISqlInstruction sql, ISqlDialect dialect) + public static Task> ExecuteListAsync(this DbManager manager, ISqlInstruction sql, ISqlDialect dialect) { - ApplySqlInstruction(command, sql, dialect); + var command = manager.ApplySqlInstruction(sql, dialect); return command.ExecuteListAsync(); } - public static List ExecuteList(this DbCommand command, ISqlInstruction sql, ISqlDialect dialect, Converter mapper) + public static List ExecuteList(this DbManager manager, ISqlInstruction sql, ISqlDialect dialect, Converter mapper) { - ApplySqlInstruction(command, sql, dialect); + var command = manager.ApplySqlInstruction(sql, dialect); var result = new List(); using (var reader = command.ExecuteReader()) { @@ -258,37 +212,47 @@ public static List ExecuteList(this DbCommand command, ISqlInstruction sql return result; } - public static T ExecuteScalar(this DbCommand command, ISqlInstruction sql, ISqlDialect dialect) + public static T ExecuteScalar(this DbManager manager, ISqlInstruction sql, ISqlDialect dialect) { - ApplySqlInstruction(command, sql, dialect); + var command = manager.ApplySqlInstruction(sql, dialect); return command.ExecuteScalar(); } - public static int ExecuteNonQuery(this DbCommand command, ISqlInstruction sql, ISqlDialect dialect) + public static int ExecuteNonQuery(this IDbManager manager, ISqlInstruction sql, ISqlDialect dialect) { - ApplySqlInstruction(command, sql, dialect); + var command = ApplySqlInstruction(manager, sql, dialect); return command.ExecuteNonQuery(); } - private static void ApplySqlInstruction(DbCommand command, ISqlInstruction sql, ISqlDialect dialect) + private static DbCommand ApplySqlInstruction(this IDbManager manager, ISqlInstruction sql, ISqlDialect dialect) { var sqlStr = sql.ToString(dialect); var parameters = sql.GetParameters(); - command.Parameters.Clear(); var sqlParts = sqlStr.Split('?'); var sqlBuilder = new StringBuilder(); var i = 0; - foreach(var p in parameters) + + var commandParameters = new Dictionary(); + + foreach (var p in parameters) { var name = $"p{i}"; - command.AddParameter(name, p); sqlBuilder.AppendFormat("{0}@{1}", sqlParts[i], name); + commandParameters.Add(name, p); i++; } sqlBuilder.Append(sqlParts[sqlParts.Length - 1]); + + var command = manager.Command; + command.Parameters.Clear(); + foreach (var p in commandParameters) + { + command.AddParameter(p.Key, p.Value); + } command.CommandText = sqlBuilder.ToString(); + return command; } diff --git a/common/ASC.Common/Data/DbManager.cs b/common/ASC.Common/Data/DbManager.cs index 45fb94157..8086dfdeb 100644 --- a/common/ASC.Common/Data/DbManager.cs +++ b/common/ASC.Common/Data/DbManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,17 +20,20 @@ using System.Data; using System.Data.Common; using System.Threading.Tasks; -using System.Web; using ASC.Common.Data.AdoProxy; using ASC.Common.Data.Sql; using ASC.Common.Logging; -using ASC.Common.Web; using LogManager = ASC.Common.Logging.BaseLogManager; namespace ASC.Common.Data { + public class DbSleepConnectionsCounter + { + public static volatile int SleepConnectionsCount; + } + public class DbManager : IDbManager { private readonly ILog logger = LogManager.GetLogger("ASC.SQL"); @@ -42,7 +45,7 @@ public class DbManager : IDbManager private readonly int? commandTimeout; - private DbCommand Command + public DbCommand Command { get { @@ -50,10 +53,27 @@ private DbCommand Command if (command == null) { command = OpenConnection().CreateCommand(); + + if (logger.IsTraceEnabled) + { + CheckSleepConnections("new command"); + } + } + + if (command.Connection.State == ConnectionState.Broken) + { + command.Connection.Close(); + command.Connection.Open(); } - if (command.Connection.State == ConnectionState.Closed || command.Connection.State == ConnectionState.Broken) + + if (command.Connection.State == ConnectionState.Closed) { command = OpenConnection().CreateCommand(); + + if (logger.IsTraceEnabled) + { + CheckSleepConnections("closed command"); + } } if (commandTimeout.HasValue) @@ -65,6 +85,38 @@ private DbCommand Command } } + private int CountSleepConnections() + { + return command.ExecuteScalar("SELECT COUNT(*) FROM information_schema.processlist WHERE command = 'Sleep'"); + } + + private void CheckSleepConnections(string flag) + { + try + { + var previousCount = DbSleepConnectionsCounter.SleepConnectionsCount; + var currentCount = CountSleepConnections(); + int diff = currentCount - previousCount; + + if (diff > 0) + { + logger.Error(string.Format( + "{0}. {1} connection(s) have been leaked! Previous count: {2}, Current count: {3}", + flag, + diff, + previousCount, + currentCount + )); + } + + DbSleepConnectionsCounter.SleepConnectionsCount = currentCount; + } + catch (Exception e) + { + logger.Error(e); + } + } + public string DatabaseId { get; private set; } public bool InTransaction @@ -83,9 +135,13 @@ public DbConnection Connection } - private DbManager(string databaseId, int? commandTimeout = null) - { - if (databaseId == null) throw new ArgumentNullException("databaseId"); + public DbManager(string databaseId, int? commandTimeout = null) + { + if (databaseId == null) + { + throw new ArgumentNullException("databaseId"); + } + DatabaseId = databaseId; if (logger.IsDebugEnabled) @@ -103,38 +159,28 @@ private DbManager(string databaseId, int? commandTimeout = null) public void Dispose() { - lock (this) + if (disposed) { - if (disposed) return; - disposed = true; - if (command != null) - { - if (command.Connection != null) command.Connection.Dispose(); - command.Dispose(); - command = null; - } + return; } - } - #endregion - - public static IDbManager FromHttpContext(string databaseId, int? commandTimeout = null) - { - if (HttpContext.Current != null) + disposed = true; + if (command != null) { - var dbManager = DisposableHttpContext.Current[databaseId] as DbManager; - if (dbManager == null || dbManager.disposed) + if (command.Connection != null) { - var localDbManager = new DbManager(databaseId, commandTimeout); - var dbManagerAdapter = new DbManagerProxy(localDbManager); - DisposableHttpContext.Current[databaseId] = localDbManager; - return dbManagerAdapter; + command.Connection.Close(); + command.Connection.Dispose(); } - return new DbManagerProxy(dbManager); + + command.Dispose(); + command = null; } - return new DbManager(databaseId, commandTimeout); } + #endregion + + private DbConnection OpenConnection() { var connection = GetConnection(); @@ -155,7 +201,10 @@ private DbConnection GetConnection() public IDbTransaction BeginTransaction() { - if (InTransaction) throw new InvalidOperationException("Transaction already open."); + if (InTransaction) + { + throw new InvalidOperationException("Transaction already open."); + } Command.Transaction = Command.Connection.BeginTransaction(); @@ -166,7 +215,10 @@ public IDbTransaction BeginTransaction() public IDbTransaction BeginTransaction(IsolationLevel il) { - if (InTransaction) throw new InvalidOperationException("Transaction already open."); + if (InTransaction) + { + throw new InvalidOperationException("Transaction already open."); + } il = GetDialect().GetSupportedIsolationLevel(il); Command.Transaction = Command.Connection.BeginTransaction(il); @@ -193,17 +245,17 @@ public Task> ExecuteListAsync(string sql, params object[] paramet public List ExecuteList(ISqlInstruction sql) { - return Command.ExecuteList(sql, GetDialect()); + return this.ExecuteList(sql, GetDialect()); } public Task> ExecuteListAsync(ISqlInstruction sql) { - return Command.ExecuteListAsync(sql, GetDialect()); + return this.ExecuteListAsync(sql, GetDialect()); } public List ExecuteList(ISqlInstruction sql, Converter converter) { - return Command.ExecuteList(sql, GetDialect(), converter); + return this.ExecuteList(sql, GetDialect(), converter); } public T ExecuteScalar(string sql, params object[] parameters) @@ -213,7 +265,7 @@ public T ExecuteScalar(string sql, params object[] parameters) public T ExecuteScalar(ISqlInstruction sql) { - return Command.ExecuteScalar(sql, GetDialect()); + return this.ExecuteScalar(sql, GetDialect()); } public int ExecuteNonQuery(string sql, params object[] parameters) @@ -228,12 +280,15 @@ public Task ExecuteNonQueryAsync(string sql, params object[] parameters) public int ExecuteNonQuery(ISqlInstruction sql) { - return Command.ExecuteNonQuery(sql, GetDialect()); + return this.ExecuteNonQuery(sql, GetDialect()); } public int ExecuteBatch(IEnumerable batch) { - if (batch == null) throw new ArgumentNullException("batch"); + if (batch == null) + { + throw new ArgumentNullException("batch"); + } var affected = 0; using (var tx = BeginTransaction()) @@ -257,7 +312,10 @@ private void TransactionUnavailable(object sender, EventArgs e) private void CheckDispose() { - if (disposed) throw new ObjectDisposedException(GetType().FullName); + if (disposed) + { + throw new ObjectDisposedException(GetType().FullName); + } } private ISqlDialect GetDialect() @@ -282,91 +340,4 @@ private string RemoveWhiteSpaces(string str) string.Empty; } } - - public class DbManagerProxy : IDbManager - { - private DbManager dbManager { get; set; } - - public DbManagerProxy(DbManager dbManager) - { - this.dbManager = dbManager; - } - - public void Dispose() - { - if (HttpContext.Current == null) - { - dbManager.Dispose(); - } - } - - public DbConnection Connection { get { return dbManager.Connection; } } - public string DatabaseId { get { return dbManager.DatabaseId; } } - public bool InTransaction { get { return dbManager.InTransaction; } } - public bool IsDisposed { get { return dbManager.IsDisposed; } } - public IDbTransaction BeginTransaction() - { - return dbManager.BeginTransaction(); - } - - public IDbTransaction BeginTransaction(IsolationLevel isolationLevel) - { - return dbManager.BeginTransaction(isolationLevel); - } - - public IDbTransaction BeginTransaction(bool nestedIfAlreadyOpen) - { - return dbManager.BeginTransaction(nestedIfAlreadyOpen); - } - - public List ExecuteList(string sql, params object[] parameters) - { - return dbManager.ExecuteList(sql, parameters); - } - - public List ExecuteList(ISqlInstruction sql) - { - return dbManager.ExecuteList(sql); - } - - public Task> ExecuteListAsync(ISqlInstruction sql) - { - return dbManager.ExecuteListAsync(sql); - } - - public List ExecuteList(ISqlInstruction sql, Converter converter) - { - return dbManager.ExecuteList(sql, converter); - } - - public T ExecuteScalar(string sql, params object[] parameters) - { - return dbManager.ExecuteScalar(sql, parameters); - } - - public T ExecuteScalar(ISqlInstruction sql) - { - return dbManager.ExecuteScalar(sql); - } - - public int ExecuteNonQuery(string sql, params object[] parameters) - { - return dbManager.ExecuteNonQuery(sql, parameters); - } - - public int ExecuteNonQuery(ISqlInstruction sql) - { - return dbManager.ExecuteNonQuery(sql); - } - - public int ExecuteBatch(IEnumerable batch) - { - return dbManager.ExecuteBatch(batch); - } - - public Task ExecuteNonQueryAsync(string sql, params object[] parameters) - { - return dbManager.ExecuteNonQueryAsync(sql, parameters); - } - } } \ No newline at end of file diff --git a/common/ASC.Common/Data/DbNestedTransaction.cs b/common/ASC.Common/Data/DbNestedTransaction.cs index 1b0d5dd6e..87b766133 100644 --- a/common/ASC.Common/Data/DbNestedTransaction.cs +++ b/common/ASC.Common/Data/DbNestedTransaction.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/DbRegistry.cs b/common/ASC.Common/Data/DbRegistry.cs index 9bfa48a0c..be42fd0c5 100644 --- a/common/ASC.Common/Data/DbRegistry.cs +++ b/common/ASC.Common/Data/DbRegistry.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/DbTransaction.cs b/common/ASC.Common/Data/DbTransaction.cs index d2a2b9096..b357aa188 100644 --- a/common/ASC.Common/Data/DbTransaction.cs +++ b/common/ASC.Common/Data/DbTransaction.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/IDbManager.cs b/common/ASC.Common/Data/IDbManager.cs index ced72eb50..c8a564717 100644 --- a/common/ASC.Common/Data/IDbManager.cs +++ b/common/ASC.Common/Data/IDbManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ namespace ASC.Common.Data { public interface IDbManager : IDisposable { + DbCommand Command { get; } DbConnection Connection { get; } string DatabaseId { get; } bool InTransaction { get; } diff --git a/common/ASC.Common/Data/MultiRegionalDbManager.cs b/common/ASC.Common/Data/MultiRegionalDbManager.cs index 5bb13f0a8..0998be50d 100644 --- a/common/ASC.Common/Data/MultiRegionalDbManager.cs +++ b/common/ASC.Common/Data/MultiRegionalDbManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,7 @@ namespace ASC.Common.Data { public class MultiRegionalDbManager : IDbManager { - private readonly List databases; + private readonly List databases; private readonly IDbManager localDb; @@ -45,6 +45,11 @@ public DbConnection Connection get { return localDb.Connection; } } + public DbCommand Command + { + get { return localDb.Command; } + } + public MultiRegionalDbManager(string dbId) { @@ -52,12 +57,12 @@ public MultiRegionalDbManager(string dbId) DatabaseId = dbId; databases = ConfigurationManager.ConnectionStrings.OfType() .Where(c => c.Name.Equals(dbId, cmp) || c.Name.StartsWith(dbId + ".", cmp)) - .Select(c => DbManager.FromHttpContext(c.Name)) + .Select(c => new DbManager(c.Name)) .ToList(); localDb = databases.SingleOrDefault(db => db.DatabaseId.Equals(dbId, cmp)); } - public MultiRegionalDbManager(IEnumerable databases) + public MultiRegionalDbManager(IEnumerable databases) { this.databases = databases.ToList(); localDb = databases.FirstOrDefault(); diff --git a/common/ASC.Common/Data/Sql/Dialects/MySQLDialect.cs b/common/ASC.Common/Data/Sql/Dialects/MySQLDialect.cs index 2726f7dc3..aa7fc19ce 100644 --- a/common/ASC.Common/Data/Sql/Dialects/MySQLDialect.cs +++ b/common/ASC.Common/Data/Sql/Dialects/MySQLDialect.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Dialects/SQLiteDialect.cs b/common/ASC.Common/Data/Sql/Dialects/SQLiteDialect.cs index f7a8c4b23..d51bb453d 100644 --- a/common/ASC.Common/Data/Sql/Dialects/SQLiteDialect.cs +++ b/common/ASC.Common/Data/Sql/Dialects/SQLiteDialect.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Dialects/SqlDialect.cs b/common/ASC.Common/Data/Sql/Dialects/SqlDialect.cs index b06c156fa..6b0d17904 100644 --- a/common/ASC.Common/Data/Sql/Dialects/SqlDialect.cs +++ b/common/ASC.Common/Data/Sql/Dialects/SqlDialect.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Expressions/AsExp.cs b/common/ASC.Common/Data/Sql/Expressions/AsExp.cs index eaf9c007a..2845df178 100644 --- a/common/ASC.Common/Data/Sql/Expressions/AsExp.cs +++ b/common/ASC.Common/Data/Sql/Expressions/AsExp.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Expressions/BetweenExp.cs b/common/ASC.Common/Data/Sql/Expressions/BetweenExp.cs index 9b2d2b4ff..975a45176 100644 --- a/common/ASC.Common/Data/Sql/Expressions/BetweenExp.cs +++ b/common/ASC.Common/Data/Sql/Expressions/BetweenExp.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Expressions/EqColumnsExp.cs b/common/ASC.Common/Data/Sql/Expressions/EqColumnsExp.cs index 7d6c8b76a..4bc59e0a0 100644 --- a/common/ASC.Common/Data/Sql/Expressions/EqColumnsExp.cs +++ b/common/ASC.Common/Data/Sql/Expressions/EqColumnsExp.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Expressions/EqExp.cs b/common/ASC.Common/Data/Sql/Expressions/EqExp.cs index f53277821..4e1c87730 100644 --- a/common/ASC.Common/Data/Sql/Expressions/EqExp.cs +++ b/common/ASC.Common/Data/Sql/Expressions/EqExp.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Expressions/ExistsExp.cs b/common/ASC.Common/Data/Sql/Expressions/ExistsExp.cs index cf1a74621..972feb1cc 100644 --- a/common/ASC.Common/Data/Sql/Expressions/ExistsExp.cs +++ b/common/ASC.Common/Data/Sql/Expressions/ExistsExp.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Expressions/Exp.cs b/common/ASC.Common/Data/Sql/Expressions/Exp.cs index a90d765c8..b08c7978a 100644 --- a/common/ASC.Common/Data/Sql/Expressions/Exp.cs +++ b/common/ASC.Common/Data/Sql/Expressions/Exp.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Expressions/IfExp.cs b/common/ASC.Common/Data/Sql/Expressions/IfExp.cs index 720d6bd46..0e76a5f36 100644 --- a/common/ASC.Common/Data/Sql/Expressions/IfExp.cs +++ b/common/ASC.Common/Data/Sql/Expressions/IfExp.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; namespace ASC.Common.Data.Sql.Expressions diff --git a/common/ASC.Common/Data/Sql/Expressions/InExp.cs b/common/ASC.Common/Data/Sql/Expressions/InExp.cs index 626ad55fb..3c8cb38fc 100644 --- a/common/ASC.Common/Data/Sql/Expressions/InExp.cs +++ b/common/ASC.Common/Data/Sql/Expressions/InExp.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Expressions/JunctionExp.cs b/common/ASC.Common/Data/Sql/Expressions/JunctionExp.cs index 6620bdf1b..546ecab88 100644 --- a/common/ASC.Common/Data/Sql/Expressions/JunctionExp.cs +++ b/common/ASC.Common/Data/Sql/Expressions/JunctionExp.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Expressions/LGtExp.cs b/common/ASC.Common/Data/Sql/Expressions/LGtExp.cs index a2a6e7518..f5738db48 100644 --- a/common/ASC.Common/Data/Sql/Expressions/LGtExp.cs +++ b/common/ASC.Common/Data/Sql/Expressions/LGtExp.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Expressions/LikeExp.cs b/common/ASC.Common/Data/Sql/Expressions/LikeExp.cs index 479b02641..f148a6125 100644 --- a/common/ASC.Common/Data/Sql/Expressions/LikeExp.cs +++ b/common/ASC.Common/Data/Sql/Expressions/LikeExp.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Expressions/SelectAgregate.cs b/common/ASC.Common/Data/Sql/Expressions/SelectAgregate.cs index 063c7158a..fffecc1f5 100644 --- a/common/ASC.Common/Data/Sql/Expressions/SelectAgregate.cs +++ b/common/ASC.Common/Data/Sql/Expressions/SelectAgregate.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Expressions/SqlExp.cs b/common/ASC.Common/Data/Sql/Expressions/SqlExp.cs index 5a5d4a837..89ea7618f 100644 --- a/common/ASC.Common/Data/Sql/Expressions/SqlExp.cs +++ b/common/ASC.Common/Data/Sql/Expressions/SqlExp.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/Expressions/SumExp.cs b/common/ASC.Common/Data/Sql/Expressions/SumExp.cs index 7e2cff273..10cb61523 100644 --- a/common/ASC.Common/Data/Sql/Expressions/SumExp.cs +++ b/common/ASC.Common/Data/Sql/Expressions/SumExp.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; namespace ASC.Common.Data.Sql.Expressions diff --git a/common/ASC.Common/Data/Sql/ISqlDialect.cs b/common/ASC.Common/Data/Sql/ISqlDialect.cs index c2f0eb952..c6ad874f7 100644 --- a/common/ASC.Common/Data/Sql/ISqlDialect.cs +++ b/common/ASC.Common/Data/Sql/ISqlDialect.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/ISqlInstruction.cs b/common/ASC.Common/Data/Sql/ISqlInstruction.cs index 9065f4de2..9fafc30c4 100644 --- a/common/ASC.Common/Data/Sql/ISqlInstruction.cs +++ b/common/ASC.Common/Data/Sql/ISqlInstruction.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/SqlCreate.cs b/common/ASC.Common/Data/Sql/SqlCreate.cs index 103108820..7f4e4f84a 100644 --- a/common/ASC.Common/Data/Sql/SqlCreate.cs +++ b/common/ASC.Common/Data/Sql/SqlCreate.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/SqlDebugView.cs b/common/ASC.Common/Data/Sql/SqlDebugView.cs index 91549d225..6f47c7e46 100644 --- a/common/ASC.Common/Data/Sql/SqlDebugView.cs +++ b/common/ASC.Common/Data/Sql/SqlDebugView.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/SqlDelete.cs b/common/ASC.Common/Data/Sql/SqlDelete.cs index 0f7ad276f..41c141ae5 100644 --- a/common/ASC.Common/Data/Sql/SqlDelete.cs +++ b/common/ASC.Common/Data/Sql/SqlDelete.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,6 +32,7 @@ public class SqlDelete : ISqlInstruction { private readonly string table; private Exp where = Exp.Empty; + private int limit; public SqlDelete(string table) { @@ -45,6 +46,7 @@ public string ToString(ISqlDialect dialect) var sql = new StringBuilder(); sql.AppendFormat("delete from {0}", table); if (where != Exp.Empty) sql.AppendFormat(" where {0}", where.ToString(dialect)); + if (limit > 0) sql.AppendFormat(" limit {0}", limit); return sql.ToString(); } @@ -66,6 +68,12 @@ public SqlDelete Where(string column, object value) return Where(Exp.Eq(column, value)); } + public SqlDelete SetLimit(int limit) + { + this.limit = limit; + return this; + } + public override string ToString() { return ToString(SqlDialect.Default); diff --git a/common/ASC.Common/Data/Sql/SqlIdentifier.cs b/common/ASC.Common/Data/Sql/SqlIdentifier.cs index 86d9342e0..515df185d 100644 --- a/common/ASC.Common/Data/Sql/SqlIdentifier.cs +++ b/common/ASC.Common/Data/Sql/SqlIdentifier.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/SqlInsert.cs b/common/ASC.Common/Data/Sql/SqlInsert.cs index 9cc246e2b..42796ab5a 100644 --- a/common/ASC.Common/Data/Sql/SqlInsert.cs +++ b/common/ASC.Common/Data/Sql/SqlInsert.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/SqlInstructionDebuggerDisplay.cs b/common/ASC.Common/Data/Sql/SqlInstructionDebuggerDisplay.cs index adef8c1e3..358dca6f2 100644 --- a/common/ASC.Common/Data/Sql/SqlInstructionDebuggerDisplay.cs +++ b/common/ASC.Common/Data/Sql/SqlInstructionDebuggerDisplay.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/SqlQuery.cs b/common/ASC.Common/Data/Sql/SqlQuery.cs index 3930d2d71..5b81d6089 100644 --- a/common/ASC.Common/Data/Sql/SqlQuery.cs +++ b/common/ASC.Common/Data/Sql/SqlQuery.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/Sql/SqlUpdate.cs b/common/ASC.Common/Data/Sql/SqlUpdate.cs index 7b943001b..11fd54600 100644 --- a/common/ASC.Common/Data/Sql/SqlUpdate.cs +++ b/common/ASC.Common/Data/Sql/SqlUpdate.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/StreamExtension.cs b/common/ASC.Common/Data/StreamExtension.cs index 8386a9ffd..f1ef09224 100644 --- a/common/ASC.Common/Data/StreamExtension.cs +++ b/common/ASC.Common/Data/StreamExtension.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/TempPath.cs b/common/ASC.Common/Data/TempPath.cs index 5c43cc703..c64eefe4e 100644 --- a/common/ASC.Common/Data/TempPath.cs +++ b/common/ASC.Common/Data/TempPath.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Data/TempStream.cs b/common/ASC.Common/Data/TempStream.cs index 39030128c..8657ffd06 100644 --- a/common/ASC.Common/Data/TempStream.cs +++ b/common/ASC.Common/Data/TempStream.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/DependencyInjection/AutofacConfigLoader.cs b/common/ASC.Common/DependencyInjection/AutofacConfigLoader.cs index 611d3b750..6aca762b2 100644 --- a/common/ASC.Common/DependencyInjection/AutofacConfigLoader.cs +++ b/common/ASC.Common/DependencyInjection/AutofacConfigLoader.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/DependencyInjection/AutofacConfigurationSection.cs b/common/ASC.Common/DependencyInjection/AutofacConfigurationSection.cs index b2cc287c5..9038ec0ab 100644 --- a/common/ASC.Common/DependencyInjection/AutofacConfigurationSection.cs +++ b/common/ASC.Common/DependencyInjection/AutofacConfigurationSection.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Configuration; using System.Linq; diff --git a/common/ASC.Common/DependencyInjection/ComponentElement.cs b/common/ASC.Common/DependencyInjection/ComponentElement.cs index 018d6b84e..9661ae7ec 100644 --- a/common/ASC.Common/DependencyInjection/ComponentElement.cs +++ b/common/ASC.Common/DependencyInjection/ComponentElement.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Configuration; namespace ASC.Common.DependencyInjection diff --git a/common/ASC.Common/DependencyInjection/ConfigurationElementCollection.cs b/common/ASC.Common/DependencyInjection/ConfigurationElementCollection.cs index c86ede20b..d3c0fb1b2 100644 --- a/common/ASC.Common/DependencyInjection/ConfigurationElementCollection.cs +++ b/common/ASC.Common/DependencyInjection/ConfigurationElementCollection.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections; using System.Collections.Generic; diff --git a/common/ASC.Common/DependencyInjection/ContainerElementCollection.cs b/common/ASC.Common/DependencyInjection/ContainerElementCollection.cs index 8dd6059d6..7e34252d8 100644 --- a/common/ASC.Common/DependencyInjection/ContainerElementCollection.cs +++ b/common/ASC.Common/DependencyInjection/ContainerElementCollection.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Configuration; namespace ASC.Common.DependencyInjection diff --git a/common/ASC.Common/DependencyInjection/DictionaryElementCollection.cs b/common/ASC.Common/DependencyInjection/DictionaryElementCollection.cs index 03290d887..752f8fb6b 100644 --- a/common/ASC.Common/DependencyInjection/DictionaryElementCollection.cs +++ b/common/ASC.Common/DependencyInjection/DictionaryElementCollection.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections; using System.Collections.Generic; diff --git a/common/ASC.Common/DependencyInjection/ListElementCollection.cs b/common/ASC.Common/DependencyInjection/ListElementCollection.cs index 7ab934bba..5247d3f66 100644 --- a/common/ASC.Common/DependencyInjection/ListElementCollection.cs +++ b/common/ASC.Common/DependencyInjection/ListElementCollection.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections; using System.Collections.Generic; diff --git a/common/ASC.Common/DependencyInjection/ListItemElement.cs b/common/ASC.Common/DependencyInjection/ListItemElement.cs index 16d772ca1..56d23c6b2 100644 --- a/common/ASC.Common/DependencyInjection/ListItemElement.cs +++ b/common/ASC.Common/DependencyInjection/ListItemElement.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Configuration; namespace ASC.Common.DependencyInjection diff --git a/common/ASC.Common/DependencyInjection/NamedConfigurationElementCollection.cs b/common/ASC.Common/DependencyInjection/NamedConfigurationElementCollection.cs index 2a21e044b..f8c9fbd92 100644 --- a/common/ASC.Common/DependencyInjection/NamedConfigurationElementCollection.cs +++ b/common/ASC.Common/DependencyInjection/NamedConfigurationElementCollection.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections; using System.Collections.Generic; diff --git a/common/ASC.Common/DependencyInjection/ParameterElement.cs b/common/ASC.Common/DependencyInjection/ParameterElement.cs index 7c68a0833..20c05b21e 100644 --- a/common/ASC.Common/DependencyInjection/ParameterElement.cs +++ b/common/ASC.Common/DependencyInjection/ParameterElement.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Configuration; diff --git a/common/ASC.Common/DependencyInjection/ParameterElementCollection.cs b/common/ASC.Common/DependencyInjection/ParameterElementCollection.cs index de57d9448..74edea641 100644 --- a/common/ASC.Common/DependencyInjection/ParameterElementCollection.cs +++ b/common/ASC.Common/DependencyInjection/ParameterElementCollection.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; using System.Reflection; diff --git a/common/ASC.Common/DependencyInjection/TypeManipulation.cs b/common/ASC.Common/DependencyInjection/TypeManipulation.cs index 36fc45394..29841cafa 100644 --- a/common/ASC.Common/DependencyInjection/TypeManipulation.cs +++ b/common/ASC.Common/DependencyInjection/TypeManipulation.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.ComponentModel; using System.Configuration; diff --git a/common/ASC.Common/Geolocation/GeolocationHelper.cs b/common/ASC.Common/Geolocation/GeolocationHelper.cs index 2d6a24bcc..1b1b37c43 100644 --- a/common/ASC.Common/Geolocation/GeolocationHelper.cs +++ b/common/ASC.Common/Geolocation/GeolocationHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,7 +44,7 @@ public bool HasData() { try { - using (var db = DbManager.FromHttpContext(dbid)) + using (var db = new DbManager(dbid)) { return db.ExecuteScalar("select exists(select 1 from dbip_location)"); } @@ -61,7 +61,7 @@ public IPGeolocationInfo GetIPGeolocation(string ip) try { var ipformatted = FormatIP(ip); - using (var db = DbManager.FromHttpContext(dbid)) + using (var db = new DbManager(dbid)) { var q = new SqlQuery("dbip_location") .Select("ip_start", "ip_end", "country", "city", "timezone_offset", "timezone_name") diff --git a/common/ASC.Common/Geolocation/IPGeolocationInfo.cs b/common/ASC.Common/Geolocation/IPGeolocationInfo.cs index 94c857d62..26601b0fe 100644 --- a/common/ASC.Common/Geolocation/IPGeolocationInfo.cs +++ b/common/ASC.Common/Geolocation/IPGeolocationInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * */ + namespace ASC.Geolocation { public class IPGeolocationInfo diff --git a/common/ASC.Common/Logging/Log.cs b/common/ASC.Common/Logging/Log.cs index 429821dd6..2f5b29161 100644 --- a/common/ASC.Common/Logging/Log.cs +++ b/common/ASC.Common/Logging/Log.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -436,7 +436,7 @@ private void Log(LogEventInfo theEvent) loger.Log(theEvent); } - public string LogDirectory { get { return NLog.LogManager.Configuration.Variables["logDirectory"].Text; } } + public string LogDirectory { get { return NLog.LogManager.Configuration.Variables["logDirectory"].ToString(); } } } diff --git a/common/ASC.Common/Logging/SelfCleaningAppender.cs b/common/ASC.Common/Logging/SelfCleaningAppender.cs index bb35e1018..cf40dd268 100644 --- a/common/ASC.Common/Logging/SelfCleaningAppender.cs +++ b/common/ASC.Common/Logging/SelfCleaningAppender.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.IO; using System.Linq; diff --git a/common/ASC.Common/Logging/SpecialFolderPathConverter.cs b/common/ASC.Common/Logging/SpecialFolderPathConverter.cs index cb29dde4e..d8e37f4dd 100644 --- a/common/ASC.Common/Logging/SpecialFolderPathConverter.cs +++ b/common/ASC.Common/Logging/SpecialFolderPathConverter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Module/BaseWcfClient.cs b/common/ASC.Common/Module/BaseWcfClient.cs index fbd2efb50..c974c5bc2 100644 --- a/common/ASC.Common/Module/BaseWcfClient.cs +++ b/common/ASC.Common/Module/BaseWcfClient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Module/IServiceController.cs b/common/ASC.Common/Module/IServiceController.cs index 0195f9de8..0aa956d48 100644 --- a/common/ASC.Common/Module/IServiceController.cs +++ b/common/ASC.Common/Module/IServiceController.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/AWSEmail.cs b/common/ASC.Common/Notify/AWSEmail.cs index bef0d9bef..337bdd686 100644 --- a/common/ASC.Common/Notify/AWSEmail.cs +++ b/common/ASC.Common/Notify/AWSEmail.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Channels/ISenderChannel.cs b/common/ASC.Common/Notify/Channels/ISenderChannel.cs index ab4a36fe5..a8447be6d 100644 --- a/common/ASC.Common/Notify/Channels/ISenderChannel.cs +++ b/common/ASC.Common/Notify/Channels/ISenderChannel.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Channels/SenderChannel.cs b/common/ASC.Common/Notify/Channels/SenderChannel.cs index 9fbd9f2da..f93cdcf6f 100644 --- a/common/ASC.Common/Notify/Channels/SenderChannel.cs +++ b/common/ASC.Common/Notify/Channels/SenderChannel.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Context.cs b/common/ASC.Common/Notify/Context.cs index c655b6139..988080e96 100644 --- a/common/ASC.Common/Notify/Context.cs +++ b/common/ASC.Common/Notify/Context.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Cron/CronExpression.cs b/common/ASC.Common/Notify/Cron/CronExpression.cs index e512a119e..652a273e4 100644 --- a/common/ASC.Common/Notify/Cron/CronExpression.cs +++ b/common/ASC.Common/Notify/Cron/CronExpression.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Cron/ISet.cs b/common/ASC.Common/Notify/Cron/ISet.cs index 7a066df44..2954a3837 100644 --- a/common/ASC.Common/Notify/Cron/ISet.cs +++ b/common/ASC.Common/Notify/Cron/ISet.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Cron/ISortedSet.cs b/common/ASC.Common/Notify/Cron/ISortedSet.cs index 00290f21d..693b94e32 100644 --- a/common/ASC.Common/Notify/Cron/ISortedSet.cs +++ b/common/ASC.Common/Notify/Cron/ISortedSet.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Cron/TreeSet.cs b/common/ASC.Common/Notify/Cron/TreeSet.cs index ba7ab4b84..193606d0f 100644 --- a/common/ASC.Common/Notify/Cron/TreeSet.cs +++ b/common/ASC.Common/Notify/Cron/TreeSet.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Engine/DispatchEngine.cs b/common/ASC.Common/Notify/Engine/DispatchEngine.cs index 331916653..f6a1f3fcc 100644 --- a/common/ASC.Common/Notify/Engine/DispatchEngine.cs +++ b/common/ASC.Common/Notify/Engine/DispatchEngine.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Engine/INotifyEngine.cs b/common/ASC.Common/Notify/Engine/INotifyEngine.cs index 3c930402e..dfe6c0b8c 100644 --- a/common/ASC.Common/Notify/Engine/INotifyEngine.cs +++ b/common/ASC.Common/Notify/Engine/INotifyEngine.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Engine/InterceptorStorage.cs b/common/ASC.Common/Notify/Engine/InterceptorStorage.cs index 985eb0e7f..e93984ba6 100644 --- a/common/ASC.Common/Notify/Engine/InterceptorStorage.cs +++ b/common/ASC.Common/Notify/Engine/InterceptorStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Engine/NotifyEngine.cs b/common/ASC.Common/Notify/Engine/NotifyEngine.cs index b7a40a2b1..976c2a572 100644 --- a/common/ASC.Common/Notify/Engine/NotifyEngine.cs +++ b/common/ASC.Common/Notify/Engine/NotifyEngine.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Engine/NotifyRequest.cs b/common/ASC.Common/Notify/Engine/NotifyRequest.cs index 26510269b..7b7756978 100644 --- a/common/ASC.Common/Notify/Engine/NotifyRequest.cs +++ b/common/ASC.Common/Notify/Engine/NotifyRequest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Engine/SendInterceptorSkeleton.cs b/common/ASC.Common/Notify/Engine/SendInterceptorSkeleton.cs index 4b4e59720..a93ed0d1a 100644 --- a/common/ASC.Common/Notify/Engine/SendInterceptorSkeleton.cs +++ b/common/ASC.Common/Notify/Engine/SendInterceptorSkeleton.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Engine/SingleRecipientInterceptor.cs b/common/ASC.Common/Notify/Engine/SingleRecipientInterceptor.cs index 8089ea873..057fc4f6a 100644 --- a/common/ASC.Common/Notify/Engine/SingleRecipientInterceptor.cs +++ b/common/ASC.Common/Notify/Engine/SingleRecipientInterceptor.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/INotifyClient.cs b/common/ASC.Common/Notify/INotifyClient.cs index 8f0398dc2..4bd092c83 100644 --- a/common/ASC.Common/Notify/INotifyClient.cs +++ b/common/ASC.Common/Notify/INotifyClient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,19 +23,18 @@ namespace ASC.Notify { - public delegate void SendNoticeCallback(INotifyAction action, string objectID, IRecipient recipient, NotifyResult result); public interface INotifyClient { - void SendNoticeToAsync(INotifyAction action, string objectID, IRecipient[] recipients, string[] senderNames, SendNoticeCallback sendCallback, params ITagValue[] args); + void SendNoticeToAsync(INotifyAction action, string objectID, IRecipient[] recipients, string[] senderNames, params ITagValue[] args); - void SendNoticeToAsync(INotifyAction action, string objectID, IRecipient[] recipients, SendNoticeCallback sendCallback, params ITagValue[] args); + void SendNoticeToAsync(INotifyAction action, string objectID, IRecipient[] recipients, params ITagValue[] args); void SendNoticeToAsync(INotifyAction action, string objectID, IRecipient[] recipients, bool checkSubscription, params ITagValue[] args); - void SendNoticeAsync(INotifyAction action, string objectID, SendNoticeCallback sendCallback, params ITagValue[] args); + void SendNoticeAsync(INotifyAction action, string objectID, params ITagValue[] args); - void SendNoticeAsync(INotifyAction action, string objectID, IRecipient recipient, SendNoticeCallback sendCallback, params ITagValue[] args); + void SendNoticeAsync(INotifyAction action, string objectID, IRecipient recipient, params ITagValue[] args); void SendNoticeAsync(INotifyAction action, string objectID, IRecipient recipient, bool checkSubscription, params ITagValue[] args); diff --git a/common/ASC.Common/Notify/INotifyRegistry.cs b/common/ASC.Common/Notify/INotifyRegistry.cs index 129446e78..7fd9c5a17 100644 --- a/common/ASC.Common/Notify/INotifyRegistry.cs +++ b/common/ASC.Common/Notify/INotifyRegistry.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/INotifyService.cs b/common/ASC.Common/Notify/INotifyService.cs index 3803fbb5a..16ecaa6ce 100644 --- a/common/ASC.Common/Notify/INotifyService.cs +++ b/common/ASC.Common/Notify/INotifyService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/ISendInterceptor.cs b/common/ASC.Common/Notify/ISendInterceptor.cs index 88b17104b..80186db37 100644 --- a/common/ASC.Common/Notify/ISendInterceptor.cs +++ b/common/ASC.Common/Notify/ISendInterceptor.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/InitiatorInterceptor.cs b/common/ASC.Common/Notify/InitiatorInterceptor.cs index 3b33b5bf5..5af064bde 100644 --- a/common/ASC.Common/Notify/InitiatorInterceptor.cs +++ b/common/ASC.Common/Notify/InitiatorInterceptor.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/InterceptorLifetime.cs b/common/ASC.Common/Notify/InterceptorLifetime.cs index be427b53d..fc3387b43 100644 --- a/common/ASC.Common/Notify/InterceptorLifetime.cs +++ b/common/ASC.Common/Notify/InterceptorLifetime.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/InterceptorPlace.cs b/common/ASC.Common/Notify/InterceptorPlace.cs index 123f9511f..59574e577 100644 --- a/common/ASC.Common/Notify/InterceptorPlace.cs +++ b/common/ASC.Common/Notify/InterceptorPlace.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Messages/INoticeMessage.cs b/common/ASC.Common/Notify/Messages/INoticeMessage.cs index 3dea9a2ee..8357c8bec 100644 --- a/common/ASC.Common/Notify/Messages/INoticeMessage.cs +++ b/common/ASC.Common/Notify/Messages/INoticeMessage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Messages/NoticeMessage.cs b/common/ASC.Common/Notify/Messages/NoticeMessage.cs index 597681a3c..ad5260c41 100644 --- a/common/ASC.Common/Notify/Messages/NoticeMessage.cs +++ b/common/ASC.Common/Notify/Messages/NoticeMessage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Messages/NotifyMessage.cs b/common/ASC.Common/Notify/Messages/NotifyMessage.cs index 3b38f8b2b..8da46a9d0 100644 --- a/common/ASC.Common/Notify/Messages/NotifyMessage.cs +++ b/common/ASC.Common/Notify/Messages/NotifyMessage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Messages/SendResponse.cs b/common/ASC.Common/Notify/Messages/SendResponse.cs index bd02d9e38..bcbfce246 100644 --- a/common/ASC.Common/Notify/Messages/SendResponse.cs +++ b/common/ASC.Common/Notify/Messages/SendResponse.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Messages/SendResult.cs b/common/ASC.Common/Notify/Messages/SendResult.cs index 71d0310d1..4bcb7b62d 100644 --- a/common/ASC.Common/Notify/Messages/SendResult.cs +++ b/common/ASC.Common/Notify/Messages/SendResult.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Model/ConstActionProvider.cs b/common/ASC.Common/Notify/Model/ConstActionProvider.cs index 8fbfe2493..a91ff4745 100644 --- a/common/ASC.Common/Notify/Model/ConstActionProvider.cs +++ b/common/ASC.Common/Notify/Model/ConstActionProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Model/IActionProvider.cs b/common/ASC.Common/Notify/Model/IActionProvider.cs index a1573d69f..62776a6e3 100644 --- a/common/ASC.Common/Notify/Model/IActionProvider.cs +++ b/common/ASC.Common/Notify/Model/IActionProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Model/INotifyAction.cs b/common/ASC.Common/Notify/Model/INotifyAction.cs index 20fb446ee..d87a08373 100644 --- a/common/ASC.Common/Notify/Model/INotifyAction.cs +++ b/common/ASC.Common/Notify/Model/INotifyAction.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Model/INotifySource.cs b/common/ASC.Common/Notify/Model/INotifySource.cs index e8887f396..1ab8375cf 100644 --- a/common/ASC.Common/Notify/Model/INotifySource.cs +++ b/common/ASC.Common/Notify/Model/INotifySource.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Model/ISubscriptionProvider.cs b/common/ASC.Common/Notify/Model/ISubscriptionProvider.cs index 666dcc1af..f6b8a5b30 100644 --- a/common/ASC.Common/Notify/Model/ISubscriptionProvider.cs +++ b/common/ASC.Common/Notify/Model/ISubscriptionProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Model/NotifyAction.cs b/common/ASC.Common/Notify/Model/NotifyAction.cs index 2d42fca84..0ef983ec9 100644 --- a/common/ASC.Common/Notify/Model/NotifyAction.cs +++ b/common/ASC.Common/Notify/Model/NotifyAction.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Model/NotifyClientImpl.cs b/common/ASC.Common/Notify/Model/NotifyClientImpl.cs index b9513ff4b..c8fa18784 100644 --- a/common/ASC.Common/Notify/Model/NotifyClientImpl.cs +++ b/common/ASC.Common/Notify/Model/NotifyClientImpl.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,36 +40,36 @@ public NotifyClientImpl(Context context, INotifySource notifySource) } - public void SendNoticeToAsync(INotifyAction action, string objectID, IRecipient[] recipients, string[] senderNames, SendNoticeCallback sendCallback, params ITagValue[] args) + public void SendNoticeToAsync(INotifyAction action, string objectID, IRecipient[] recipients, string[] senderNames, params ITagValue[] args) { - SendNoticeToAsync(action, objectID, recipients, senderNames, sendCallback, false, args); + SendNoticeToAsync(action, objectID, recipients, senderNames, false, args); } - public void SendNoticeToAsync(INotifyAction action, string objectID, IRecipient[] recipients, SendNoticeCallback sendCallback, params ITagValue[] args) + public void SendNoticeToAsync(INotifyAction action, string objectID, IRecipient[] recipients, params ITagValue[] args) { - SendNoticeToAsync(action, objectID, recipients, null, sendCallback, false, args); + SendNoticeToAsync(action, objectID, recipients, null, false, args); } public void SendNoticeToAsync(INotifyAction action, string objectID, IRecipient[] recipients, bool checkSubscription, params ITagValue[] args) { - SendNoticeToAsync(action, objectID, recipients, null, null, checkSubscription, args); + SendNoticeToAsync(action, objectID, recipients, null, checkSubscription, args); } - public void SendNoticeAsync(INotifyAction action, string objectID, IRecipient recipient, SendNoticeCallback sendCallback, params ITagValue[] args) + public void SendNoticeAsync(INotifyAction action, string objectID, IRecipient recipient, params ITagValue[] args) { - SendNoticeToAsync(action, objectID, new[] { recipient }, null, sendCallback, false, args); + SendNoticeToAsync(action, objectID, new[] { recipient }, null, false, args); } - public void SendNoticeAsync(INotifyAction action, string objectID, SendNoticeCallback sendCallback, params ITagValue[] args) + public void SendNoticeAsync(INotifyAction action, string objectID, params ITagValue[] args) { var subscriptionSource = notifySource.GetSubscriptionProvider(); var recipients = subscriptionSource.GetRecipients(action, objectID); - SendNoticeToAsync(action, objectID, recipients, null, sendCallback, false, args); + SendNoticeToAsync(action, objectID, recipients, null, false, args); } public void SendNoticeAsync(INotifyAction action, string objectID, IRecipient recipient, bool checkSubscription, params ITagValue[] args) { - SendNoticeToAsync(action, objectID, new[] { recipient }, null, null, checkSubscription, args); + SendNoticeToAsync(action, objectID, new[] { recipient }, null, checkSubscription, args); } @@ -108,7 +108,7 @@ public void RemoveInterceptor(string name) } - private void SendNoticeToAsync(INotifyAction action, string objectID, IRecipient[] recipients, string[] senderNames, SendNoticeCallback sendCallback, bool checkSubsciption, params ITagValue[] args) + private void SendNoticeToAsync(INotifyAction action, string objectID, IRecipient[] recipients, string[] senderNames, bool checkSubsciption, params ITagValue[] args) { if (recipients == null) throw new ArgumentNullException("recipients"); @@ -116,7 +116,7 @@ private void SendNoticeToAsync(INotifyAction action, string objectID, IRecipient foreach (var recipient in recipients) { - var r = CreateRequest(action, objectID, recipient, sendCallback, args, senderNames, checkSubsciption); + var r = CreateRequest(action, objectID, recipient, args, senderNames, checkSubsciption); SendAsync(r); } } @@ -127,11 +127,10 @@ private void SendAsync(NotifyRequest request) ctx.NotifyEngine.QueueRequest(request); } - private NotifyRequest CreateRequest(INotifyAction action, string objectID, IRecipient recipient, SendNoticeCallback sendCallback, ITagValue[] args, string[] senders, bool checkSubsciption) + private NotifyRequest CreateRequest(INotifyAction action, string objectID, IRecipient recipient, ITagValue[] args, string[] senders, bool checkSubsciption) { if (action == null) throw new ArgumentNullException("action"); if (recipient == null) throw new ArgumentNullException("recipient"); - if (sendCallback != null) throw new NotImplementedException("sendCallback"); var request = new NotifyRequest(notifySource, action, objectID, recipient); request.SenderNames = senders; diff --git a/common/ASC.Common/Notify/Model/TopSubscriptionProvider.cs b/common/ASC.Common/Notify/Model/TopSubscriptionProvider.cs index 4dd1f67f0..29bf52ca8 100644 --- a/common/ASC.Common/Notify/Model/TopSubscriptionProvider.cs +++ b/common/ASC.Common/Notify/Model/TopSubscriptionProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/NotifyException.cs b/common/ASC.Common/Notify/NotifyException.cs index 3a5b974d3..da2be04c6 100644 --- a/common/ASC.Common/Notify/NotifyException.cs +++ b/common/ASC.Common/Notify/NotifyException.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/NotifyResult.cs b/common/ASC.Common/Notify/NotifyResult.cs index f4b7d0692..523a0974d 100644 --- a/common/ASC.Common/Notify/NotifyResult.cs +++ b/common/ASC.Common/Notify/NotifyResult.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Patterns/IPattern.cs b/common/ASC.Common/Notify/Patterns/IPattern.cs index 422793342..5095337d1 100644 --- a/common/ASC.Common/Notify/Patterns/IPattern.cs +++ b/common/ASC.Common/Notify/Patterns/IPattern.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Patterns/IPatternFormatter.cs b/common/ASC.Common/Notify/Patterns/IPatternFormatter.cs index b2e2d0686..60d78018b 100644 --- a/common/ASC.Common/Notify/Patterns/IPatternFormatter.cs +++ b/common/ASC.Common/Notify/Patterns/IPatternFormatter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Patterns/IPatternProvider.cs b/common/ASC.Common/Notify/Patterns/IPatternProvider.cs index 56ccd8f5b..4bb493030 100644 --- a/common/ASC.Common/Notify/Patterns/IPatternProvider.cs +++ b/common/ASC.Common/Notify/Patterns/IPatternProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Patterns/IPatternStyler.cs b/common/ASC.Common/Notify/Patterns/IPatternStyler.cs index a28c1da68..9ffde2a34 100644 --- a/common/ASC.Common/Notify/Patterns/IPatternStyler.cs +++ b/common/ASC.Common/Notify/Patterns/IPatternStyler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Patterns/ITagValue.cs b/common/ASC.Common/Notify/Patterns/ITagValue.cs index 7c54b6453..07ca9b6de 100644 --- a/common/ASC.Common/Notify/Patterns/ITagValue.cs +++ b/common/ASC.Common/Notify/Patterns/ITagValue.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Patterns/NVelocityPatternFormatter.cs b/common/ASC.Common/Notify/Patterns/NVelocityPatternFormatter.cs index c8167d09c..77b699e45 100644 --- a/common/ASC.Common/Notify/Patterns/NVelocityPatternFormatter.cs +++ b/common/ASC.Common/Notify/Patterns/NVelocityPatternFormatter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Patterns/Pattern.cs b/common/ASC.Common/Notify/Patterns/Pattern.cs index abd21b844..19d698906 100644 --- a/common/ASC.Common/Notify/Patterns/Pattern.cs +++ b/common/ASC.Common/Notify/Patterns/Pattern.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Patterns/PatternFormatter.cs b/common/ASC.Common/Notify/Patterns/PatternFormatter.cs index 9eedc1d9f..95297ea90 100644 --- a/common/ASC.Common/Notify/Patterns/PatternFormatter.cs +++ b/common/ASC.Common/Notify/Patterns/PatternFormatter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Patterns/ReplacePatternFormatter.cs b/common/ASC.Common/Notify/Patterns/ReplacePatternFormatter.cs index a8172551a..141e69585 100644 --- a/common/ASC.Common/Notify/Patterns/ReplacePatternFormatter.cs +++ b/common/ASC.Common/Notify/Patterns/ReplacePatternFormatter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Patterns/TagValue.cs b/common/ASC.Common/Notify/Patterns/TagValue.cs index 842a223b2..3f649fc7e 100644 --- a/common/ASC.Common/Notify/Patterns/TagValue.cs +++ b/common/ASC.Common/Notify/Patterns/TagValue.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Patterns/XmlPatternProvider2.cs b/common/ASC.Common/Notify/Patterns/XmlPatternProvider2.cs index 489fce8ba..c6d5033e7 100644 --- a/common/ASC.Common/Notify/Patterns/XmlPatternProvider2.cs +++ b/common/ASC.Common/Notify/Patterns/XmlPatternProvider2.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Recipients/DirectRecipient.cs b/common/ASC.Common/Notify/Recipients/DirectRecipient.cs index 313b33871..f2110cdd3 100644 --- a/common/ASC.Common/Notify/Recipients/DirectRecipient.cs +++ b/common/ASC.Common/Notify/Recipients/DirectRecipient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Recipients/IDirectRecipient.cs b/common/ASC.Common/Notify/Recipients/IDirectRecipient.cs index 87d661d09..b73732833 100644 --- a/common/ASC.Common/Notify/Recipients/IDirectRecipient.cs +++ b/common/ASC.Common/Notify/Recipients/IDirectRecipient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Recipients/IRecipient.cs b/common/ASC.Common/Notify/Recipients/IRecipient.cs index 037434c7f..2c6cf90e6 100644 --- a/common/ASC.Common/Notify/Recipients/IRecipient.cs +++ b/common/ASC.Common/Notify/Recipients/IRecipient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Recipients/IRecipientsGroup.cs b/common/ASC.Common/Notify/Recipients/IRecipientsGroup.cs index 9d92ee82b..e8bee94f4 100644 --- a/common/ASC.Common/Notify/Recipients/IRecipientsGroup.cs +++ b/common/ASC.Common/Notify/Recipients/IRecipientsGroup.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Recipients/IRecipientsProvider.cs b/common/ASC.Common/Notify/Recipients/IRecipientsProvider.cs index 3e3ef76c1..57b4fb652 100644 --- a/common/ASC.Common/Notify/Recipients/IRecipientsProvider.cs +++ b/common/ASC.Common/Notify/Recipients/IRecipientsProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Recipients/RecipientsGroup.cs b/common/ASC.Common/Notify/Recipients/RecipientsGroup.cs index 93096a300..94ac9dc6b 100644 --- a/common/ASC.Common/Notify/Recipients/RecipientsGroup.cs +++ b/common/ASC.Common/Notify/Recipients/RecipientsGroup.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Sinks/DispatchSink.cs b/common/ASC.Common/Notify/Sinks/DispatchSink.cs index 99b896185..5f5234432 100644 --- a/common/ASC.Common/Notify/Sinks/DispatchSink.cs +++ b/common/ASC.Common/Notify/Sinks/DispatchSink.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Sinks/ISink.cs b/common/ASC.Common/Notify/Sinks/ISink.cs index b657fc805..179805784 100644 --- a/common/ASC.Common/Notify/Sinks/ISink.cs +++ b/common/ASC.Common/Notify/Sinks/ISink.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Notify/Sinks/Sink.cs b/common/ASC.Common/Notify/Sinks/Sink.cs index 5ffccb5d9..e6b91d70a 100644 --- a/common/ASC.Common/Notify/Sinks/Sink.cs +++ b/common/ASC.Common/Notify/Sinks/Sink.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Radicale/CalDavCalendar.cs b/common/ASC.Common/Radicale/CalDavCalendar.cs index f07acd1b8..753ab2236 100644 --- a/common/ASC.Common/Radicale/CalDavCalendar.cs +++ b/common/ASC.Common/Radicale/CalDavCalendar.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.Threading.Tasks; using System.Web; diff --git a/common/ASC.Common/Radicale/CardDavAddressbook.cs b/common/ASC.Common/Radicale/CardDavAddressbook.cs index 413afff5b..e0ee3d5bd 100644 --- a/common/ASC.Common/Radicale/CardDavAddressbook.cs +++ b/common/ASC.Common/Radicale/CardDavAddressbook.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; diff --git a/common/ASC.Common/Radicale/CardDavItem.cs b/common/ASC.Common/Radicale/CardDavItem.cs index 3e0f8339d..55ec67b33 100644 --- a/common/ASC.Common/Radicale/CardDavItem.cs +++ b/common/ASC.Common/Radicale/CardDavItem.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; diff --git a/common/ASC.Common/Radicale/Core/DbRadicale.cs b/common/ASC.Common/Radicale/Core/DbRadicale.cs index 7ce700407..2560bab2b 100644 --- a/common/ASC.Common/Radicale/Core/DbRadicale.cs +++ b/common/ASC.Common/Radicale/Core/DbRadicale.cs @@ -1,4 +1,20 @@ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Common.Data; @@ -8,7 +24,7 @@ namespace ASC.Common.Radicale.Core { public class DbRadicale { - private IDbManager db = DbManager.FromHttpContext("default"); + private IDbManager db = new DbManager("default"); public void SaveCardDavUser(int tenant, string id) { var i = new SqlInsert("core_userdav").ReplaceExists(true) diff --git a/common/ASC.Common/Radicale/Core/RadicaleClient.cs b/common/ASC.Common/Radicale/Core/RadicaleClient.cs index e6a5ca9bd..24be8953b 100644 --- a/common/ASC.Common/Radicale/Core/RadicaleClient.cs +++ b/common/ASC.Common/Radicale/Core/RadicaleClient.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.IO; using System.Net; using System.Net.Http; diff --git a/common/ASC.Common/Radicale/Core/RadicaleException.cs b/common/ASC.Common/Radicale/Core/RadicaleException.cs index 7feac0cd5..ae6157ced 100644 --- a/common/ASC.Common/Radicale/Core/RadicaleException.cs +++ b/common/ASC.Common/Radicale/Core/RadicaleException.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; namespace ASC.Common.Radicale { diff --git a/common/ASC.Common/Radicale/DavRequest.cs b/common/ASC.Common/Radicale/DavRequest.cs index 4d4f56991..550bc627d 100644 --- a/common/ASC.Common/Radicale/DavRequest.cs +++ b/common/ASC.Common/Radicale/DavRequest.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; diff --git a/common/ASC.Common/Radicale/DavResponse.cs b/common/ASC.Common/Radicale/DavResponse.cs index f73389790..8ba733371 100644 --- a/common/ASC.Common/Radicale/DavResponse.cs +++ b/common/ASC.Common/Radicale/DavResponse.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; diff --git a/common/ASC.Common/Radicale/IRadicaleEntity.cs b/common/ASC.Common/Radicale/IRadicaleEntity.cs index 346639713..1d4faf438 100644 --- a/common/ASC.Common/Radicale/IRadicaleEntity.cs +++ b/common/ASC.Common/Radicale/IRadicaleEntity.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.Collections.Generic; using System.Linq; using System.Text; diff --git a/common/ASC.Common/Radicale/RadicaleEntity.cs b/common/ASC.Common/Radicale/RadicaleEntity.cs index 4dc75887b..c28c63122 100644 --- a/common/ASC.Common/Radicale/RadicaleEntity.cs +++ b/common/ASC.Common/Radicale/RadicaleEntity.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.Configuration; using System.Text.RegularExpressions; using System.Web; diff --git a/common/ASC.Common/Security/AscRandom.cs b/common/ASC.Common/Security/AscRandom.cs index 2fc2656ec..e0a88cd5c 100644 --- a/common/ASC.Common/Security/AscRandom.cs +++ b/common/ASC.Common/Security/AscRandom.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authentication/Account.cs b/common/ASC.Common/Security/Authentication/Account.cs index 657ea3fb5..aa9e41c5d 100644 --- a/common/ASC.Common/Security/Authentication/Account.cs +++ b/common/ASC.Common/Security/Authentication/Account.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authentication/IAccount.cs b/common/ASC.Common/Security/Authentication/IAccount.cs index 42209ee21..5ab16241c 100644 --- a/common/ASC.Common/Security/Authentication/IAccount.cs +++ b/common/ASC.Common/Security/Authentication/IAccount.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authentication/ISystemAccount.cs b/common/ASC.Common/Security/Authentication/ISystemAccount.cs index b0963039d..2d4dc2d1c 100644 --- a/common/ASC.Common/Security/Authentication/ISystemAccount.cs +++ b/common/ASC.Common/Security/Authentication/ISystemAccount.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authentication/IUserAccount.cs b/common/ASC.Common/Security/Authentication/IUserAccount.cs index fb3bc9f9a..c8ac6c404 100644 --- a/common/ASC.Common/Security/Authentication/IUserAccount.cs +++ b/common/ASC.Common/Security/Authentication/IUserAccount.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authentication/SystemAccount.cs b/common/ASC.Common/Security/Authentication/SystemAccount.cs index 04a9122ab..a2302122b 100644 --- a/common/ASC.Common/Security/Authentication/SystemAccount.cs +++ b/common/ASC.Common/Security/Authentication/SystemAccount.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authorizing/AuthorizingException.cs b/common/ASC.Common/Security/Authorizing/AuthorizingException.cs index b119b0e6b..ad83e9d30 100644 --- a/common/ASC.Common/Security/Authorizing/AuthorizingException.cs +++ b/common/ASC.Common/Security/Authorizing/AuthorizingException.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authorizing/AzManager.cs b/common/ASC.Common/Security/Authorizing/AzManager.cs index c9ee66e3c..d59508823 100644 --- a/common/ASC.Common/Security/Authorizing/AzManager.cs +++ b/common/ASC.Common/Security/Authorizing/AzManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authorizing/AzObjectIdHelper.cs b/common/ASC.Common/Security/Authorizing/AzObjectIdHelper.cs index 19dcbc13c..4b153d9b5 100644 --- a/common/ASC.Common/Security/Authorizing/AzObjectIdHelper.cs +++ b/common/ASC.Common/Security/Authorizing/AzObjectIdHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authorizing/AzObjectSecurityProviderHelper.cs b/common/ASC.Common/Security/Authorizing/AzObjectSecurityProviderHelper.cs index c2db741f4..e05c7ebf7 100644 --- a/common/ASC.Common/Security/Authorizing/AzObjectSecurityProviderHelper.cs +++ b/common/ASC.Common/Security/Authorizing/AzObjectSecurityProviderHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authorizing/Constants.cs b/common/ASC.Common/Security/Authorizing/Constants.cs index 50f77bfb5..8044045b4 100644 --- a/common/ASC.Common/Security/Authorizing/Constants.cs +++ b/common/ASC.Common/Security/Authorizing/Constants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authorizing/Domain/Ace.cs b/common/ASC.Common/Security/Authorizing/Domain/Ace.cs index a6840e3bd..c7d086b4e 100644 --- a/common/ASC.Common/Security/Authorizing/Domain/Ace.cs +++ b/common/ASC.Common/Security/Authorizing/Domain/Ace.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authorizing/Domain/AceType.cs b/common/ASC.Common/Security/Authorizing/Domain/AceType.cs index 757f7d4aa..9be10f07a 100644 --- a/common/ASC.Common/Security/Authorizing/Domain/AceType.cs +++ b/common/ASC.Common/Security/Authorizing/Domain/AceType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authorizing/Domain/Action.cs b/common/ASC.Common/Security/Authorizing/Domain/Action.cs index a96c42f31..d60170e87 100644 --- a/common/ASC.Common/Security/Authorizing/Domain/Action.cs +++ b/common/ASC.Common/Security/Authorizing/Domain/Action.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authorizing/Domain/Role.cs b/common/ASC.Common/Security/Authorizing/Domain/Role.cs index d895f906e..b1cb86a4c 100644 --- a/common/ASC.Common/Security/Authorizing/Domain/Role.cs +++ b/common/ASC.Common/Security/Authorizing/Domain/Role.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authorizing/Interfaces/IAction.cs b/common/ASC.Common/Security/Authorizing/Interfaces/IAction.cs index 436cf2098..71f0b3612 100644 --- a/common/ASC.Common/Security/Authorizing/Interfaces/IAction.cs +++ b/common/ASC.Common/Security/Authorizing/Interfaces/IAction.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authorizing/Interfaces/IRole.cs b/common/ASC.Common/Security/Authorizing/Interfaces/IRole.cs index a8236cb8d..b484125d1 100644 --- a/common/ASC.Common/Security/Authorizing/Interfaces/IRole.cs +++ b/common/ASC.Common/Security/Authorizing/Interfaces/IRole.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Authorizing/Interfaces/ISubject.cs b/common/ASC.Common/Security/Authorizing/Interfaces/ISubject.cs index fe23cf7cc..1f3377cda 100644 --- a/common/ASC.Common/Security/Authorizing/Interfaces/ISubject.cs +++ b/common/ASC.Common/Security/Authorizing/Interfaces/ISubject.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Cryptography/HashAlg.cs b/common/ASC.Common/Security/Cryptography/HashAlg.cs index 36b08c58c..57f115290 100644 --- a/common/ASC.Common/Security/Cryptography/HashAlg.cs +++ b/common/ASC.Common/Security/Cryptography/HashAlg.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Cryptography/Hasher.cs b/common/ASC.Common/Security/Cryptography/Hasher.cs index 72104bccb..667080b05 100644 --- a/common/ASC.Common/Security/Cryptography/Hasher.cs +++ b/common/ASC.Common/Security/Cryptography/Hasher.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Cryptography/InstanceCrypto.cs b/common/ASC.Common/Security/Cryptography/InstanceCrypto.cs index 699c88040..56bd63645 100644 --- a/common/ASC.Common/Security/Cryptography/InstanceCrypto.cs +++ b/common/ASC.Common/Security/Cryptography/InstanceCrypto.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Cryptography/MachinePseudoKeys.cs b/common/ASC.Common/Security/Cryptography/MachinePseudoKeys.cs index f486f31c7..9c5c2d328 100644 --- a/common/ASC.Common/Security/Cryptography/MachinePseudoKeys.cs +++ b/common/ASC.Common/Security/Cryptography/MachinePseudoKeys.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/Cryptography/PasswordHasher.cs b/common/ASC.Common/Security/Cryptography/PasswordHasher.cs index d22dd2d53..e04d36a6e 100644 --- a/common/ASC.Common/Security/Cryptography/PasswordHasher.cs +++ b/common/ASC.Common/Security/Cryptography/PasswordHasher.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/IPermissionProvider.cs b/common/ASC.Common/Security/IPermissionProvider.cs index ac893445d..d5f94c52a 100644 --- a/common/ASC.Common/Security/IPermissionProvider.cs +++ b/common/ASC.Common/Security/IPermissionProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/IPermissionResolver.cs b/common/ASC.Common/Security/IPermissionResolver.cs index a7aedc32a..9696a0504 100644 --- a/common/ASC.Common/Security/IPermissionResolver.cs +++ b/common/ASC.Common/Security/IPermissionResolver.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/IRoleProvider.cs b/common/ASC.Common/Security/IRoleProvider.cs index 4a7655c4d..1f4e76531 100644 --- a/common/ASC.Common/Security/IRoleProvider.cs +++ b/common/ASC.Common/Security/IRoleProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/ISecurityObject.cs b/common/ASC.Common/Security/ISecurityObject.cs index 8a7fd43a6..288b2cb72 100644 --- a/common/ASC.Common/Security/ISecurityObject.cs +++ b/common/ASC.Common/Security/ISecurityObject.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/ISecurityObjectId.cs b/common/ASC.Common/Security/ISecurityObjectId.cs index a8c8a0461..486cb3cbf 100644 --- a/common/ASC.Common/Security/ISecurityObjectId.cs +++ b/common/ASC.Common/Security/ISecurityObjectId.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/ISecurityObjectProvider.cs b/common/ASC.Common/Security/ISecurityObjectProvider.cs index c169973b0..80438fc51 100644 --- a/common/ASC.Common/Security/ISecurityObjectProvider.cs +++ b/common/ASC.Common/Security/ISecurityObjectProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/SecurityCallContext.cs b/common/ASC.Common/Security/SecurityCallContext.cs index df41492e2..152222452 100644 --- a/common/ASC.Common/Security/SecurityCallContext.cs +++ b/common/ASC.Common/Security/SecurityCallContext.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Security/SecurityObjectId.cs b/common/ASC.Common/Security/SecurityObjectId.cs index 3e67fdc79..f8684ab87 100644 --- a/common/ASC.Common/Security/SecurityObjectId.cs +++ b/common/ASC.Common/Security/SecurityObjectId.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Threading/DistributedTask.cs b/common/ASC.Common/Threading/DistributedTask.cs index 1e345944b..f38450156 100644 --- a/common/ASC.Common/Threading/DistributedTask.cs +++ b/common/ASC.Common/Threading/DistributedTask.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,7 +43,8 @@ public class DistributedTask : ISerializable [JsonProperty] public string Exception { get; internal set; } - + [JsonProperty] + public DateTime LastModifiedOn { get; internal set; } public DistributedTask() { diff --git a/common/ASC.Common/Threading/DistributedTaskQueue.cs b/common/ASC.Common/Threading/DistributedTaskQueue.cs index bd36c51a4..f20f744ba 100644 --- a/common/ASC.Common/Threading/DistributedTaskQueue.cs +++ b/common/ASC.Common/Threading/DistributedTaskQueue.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -166,7 +166,12 @@ private void OnCompleted(Task task, string id) private Action GetPublication() { - return (t) => SetTask(t); + return (t) => + { + t.LastModifiedOn = DateTime.UtcNow; + + SetTask(t); + }; } diff --git a/common/ASC.Common/Threading/DistributedTaskStatus.cs b/common/ASC.Common/Threading/DistributedTaskStatus.cs index 7be279fd2..eda8bae16 100644 --- a/common/ASC.Common/Threading/DistributedTaskStatus.cs +++ b/common/ASC.Common/Threading/DistributedTaskStatus.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.Common.Threading { public enum DistributedTaskStatus diff --git a/common/ASC.Common/Threading/LimitedConcurrencyLevelTaskScheduler.cs b/common/ASC.Common/Threading/LimitedConcurrencyLevelTaskScheduler.cs index a1ff0c375..5d820e6e4 100644 --- a/common/ASC.Common/Threading/LimitedConcurrencyLevelTaskScheduler.cs +++ b/common/ASC.Common/Threading/LimitedConcurrencyLevelTaskScheduler.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Threading; diff --git a/common/ASC.Common/Threading/Progress/IProgressItem.cs b/common/ASC.Common/Threading/Progress/IProgressItem.cs index 4b2d02464..24b9119db 100644 --- a/common/ASC.Common/Threading/Progress/IProgressItem.cs +++ b/common/ASC.Common/Threading/Progress/IProgressItem.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Threading/Progress/ProgressBase.cs b/common/ASC.Common/Threading/Progress/ProgressBase.cs index befaa6b7d..33db20c2c 100644 --- a/common/ASC.Common/Threading/Progress/ProgressBase.cs +++ b/common/ASC.Common/Threading/Progress/ProgressBase.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Threading/Progress/ProgressQueue.cs b/common/ASC.Common/Threading/Progress/ProgressQueue.cs index 4da5665ac..461b105e2 100644 --- a/common/ASC.Common/Threading/Progress/ProgressQueue.cs +++ b/common/ASC.Common/Threading/Progress/ProgressQueue.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Threading/Workers/WorkItem.cs b/common/ASC.Common/Threading/Workers/WorkItem.cs index 9ba510069..976862faa 100644 --- a/common/ASC.Common/Threading/Workers/WorkItem.cs +++ b/common/ASC.Common/Threading/Workers/WorkItem.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Threading/Workers/WorkerQueue.cs b/common/ASC.Common/Threading/Workers/WorkerQueue.cs index 81899b098..f12aab447 100644 --- a/common/ASC.Common/Threading/Workers/WorkerQueue.cs +++ b/common/ASC.Common/Threading/Workers/WorkerQueue.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Utils/ConfigurationManagerExtension.cs b/common/ASC.Common/Utils/ConfigurationManagerExtension.cs index 5453d09e2..730c80be6 100644 --- a/common/ASC.Common/Utils/ConfigurationManagerExtension.cs +++ b/common/ASC.Common/Utils/ConfigurationManagerExtension.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Utils/DnsLookup.cs b/common/ASC.Common/Utils/DnsLookup.cs index 5fbe6e574..9ef0c5a2f 100644 --- a/common/ASC.Common/Utils/DnsLookup.cs +++ b/common/ASC.Common/Utils/DnsLookup.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Linq; diff --git a/common/ASC.Common/Utils/HtmlUtil.cs b/common/ASC.Common/Utils/HtmlUtil.cs index 4a36854c9..b02874889 100644 --- a/common/ASC.Common/Utils/HtmlUtil.cs +++ b/common/ASC.Common/Utils/HtmlUtil.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Utils/HttpRequestExtensions.cs b/common/ASC.Common/Utils/HttpRequestExtensions.cs index 6e2d17c7d..415cd18dd 100644 --- a/common/ASC.Common/Utils/HttpRequestExtensions.cs +++ b/common/ASC.Common/Utils/HttpRequestExtensions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Utils/IpAddressParser.cs b/common/ASC.Common/Utils/IpAddressParser.cs new file mode 100644 index 000000000..3be93a11a --- /dev/null +++ b/common/ASC.Common/Utils/IpAddressParser.cs @@ -0,0 +1,64 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; + +namespace ASC.Common.Utils +{ + public class IpAddressParser + { + /// + /// Parse the address into an array + /// + /// Comma-separated string value (e.g. X-Forwarded-For request header) + /// Address array + public static string[] ParseAddress(string value) + { + return string.IsNullOrWhiteSpace(value) + ? new string[] { } + : value.Split(new[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries); + } + + /// + /// Returns IP address without port + /// + /// IPv4 or IPv6 address with port (e.g. [::1]:80, 127.0.0.1:80) + /// IP address without port + public static string GetIpWithoutPort(string ip) + { + var s = ip.AsSpan(); + var lastColonPos = s.LastIndexOf(':'); + + // If it's IPv4 and there's no port then return the entire string + if (lastColonPos > 0) + { + // Look to see if this is an IPv6 address with a port. + if (s[lastColonPos - 1] == ']') + { + return s.Slice(0, lastColonPos).ToString(); + } + // Look to see if this is IPv4 with a port (IPv6 will have another colon) + else if (s.Slice(0, lastColonPos).LastIndexOf(':') == -1) + { + return s.Slice(0, lastColonPos).ToString(); + } + } + + return ip; + } + } +} diff --git a/common/ASC.Common/Utils/MailAddressUtils.cs b/common/ASC.Common/Utils/MailAddressUtils.cs index 7ad673552..9f9b9a5b0 100644 --- a/common/ASC.Common/Utils/MailAddressUtils.cs +++ b/common/ASC.Common/Utils/MailAddressUtils.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Utils/MimeHeaderUtils.cs b/common/ASC.Common/Utils/MimeHeaderUtils.cs index 7f5e9fa6f..8fc5388e6 100644 --- a/common/ASC.Common/Utils/MimeHeaderUtils.cs +++ b/common/ASC.Common/Utils/MimeHeaderUtils.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Utils/RandomString.cs b/common/ASC.Common/Utils/RandomString.cs index b31e92148..7ffea7820 100644 --- a/common/ASC.Common/Utils/RandomString.cs +++ b/common/ASC.Common/Utils/RandomString.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Utils/Signature.cs b/common/ASC.Common/Utils/Signature.cs index b0fee0b0f..6628f9c7e 100644 --- a/common/ASC.Common/Utils/Signature.cs +++ b/common/ASC.Common/Utils/Signature.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Utils/StringUtils.cs b/common/ASC.Common/Utils/StringUtils.cs index 4ec87e2da..36c74badf 100644 --- a/common/ASC.Common/Utils/StringUtils.cs +++ b/common/ASC.Common/Utils/StringUtils.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Linq; using System.Text; using System.Xml; diff --git a/common/ASC.Common/Utils/TimeZoneConverter/TimeZoneConverter.cs b/common/ASC.Common/Utils/TimeZoneConverter/TimeZoneConverter.cs index f2ed77ac9..a4138a1dc 100644 --- a/common/ASC.Common/Utils/TimeZoneConverter/TimeZoneConverter.cs +++ b/common/ASC.Common/Utils/TimeZoneConverter/TimeZoneConverter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Utils/VelocityFormatter.cs b/common/ASC.Common/Utils/VelocityFormatter.cs index 98da46f9c..90cd7abd1 100644 --- a/common/ASC.Common/Utils/VelocityFormatter.cs +++ b/common/ASC.Common/Utils/VelocityFormatter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Utils/Wildcard.cs b/common/ASC.Common/Utils/Wildcard.cs index e32d20a53..c74d49305 100644 --- a/common/ASC.Common/Utils/Wildcard.cs +++ b/common/ASC.Common/Utils/Wildcard.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Web/AbstractHttpAsyncHandler.cs b/common/ASC.Common/Web/AbstractHttpAsyncHandler.cs index c190db5e5..9f152cf0a 100644 --- a/common/ASC.Common/Web/AbstractHttpAsyncHandler.cs +++ b/common/ASC.Common/Web/AbstractHttpAsyncHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Web/DisposableHttpContext.cs b/common/ASC.Common/Web/DisposableHttpContext.cs index 9d6ad63f1..6a8cfc895 100644 --- a/common/ASC.Common/Web/DisposableHttpContext.cs +++ b/common/ASC.Common/Web/DisposableHttpContext.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,7 +32,11 @@ public class DisposableHttpContext : IDisposable public DisposableHttpContext(HttpContext ctx) { - if (ctx == null) throw new ArgumentNullException(); + if (ctx == null) + { + throw new ArgumentNullException(); + } + this.ctx = ctx; } @@ -40,19 +44,31 @@ public static DisposableHttpContext Current { get { - if (HttpContext.Current == null) throw new NotSupportedException("Avaliable in web request only."); + if (HttpContext.Current == null) + { + throw new NotSupportedException("Avaliable in web request only."); + } + return new DisposableHttpContext(HttpContext.Current); } } public object this[string key] { - get { return Items.ContainsKey(key) ? Items[key] : null; } + get { return Items.ContainsKey(key.ToLowerInvariant()) ? Items[key.ToLowerInvariant()] : null; } set { - if (value == null) throw new ArgumentNullException(); - if (!(value is IDisposable)) throw new ArgumentException("Only IDisposable may be added!"); - Items[key] = (IDisposable)value; + if (value == null) + { + throw new ArgumentNullException(); + } + + if (!(value is IDisposable)) + { + throw new ArgumentException("Only IDisposable may be added!"); + } + + Items[key.ToLowerInvariant()] = (IDisposable)value; } } @@ -78,15 +94,9 @@ public void Dispose() { if (!_isDisposed) { - foreach (IDisposable item in Items.Values) + foreach (var item in Items.Values) { - try - { - item.Dispose(); - } - catch - { - } + item.Dispose(); } _isDisposed = true; } diff --git a/common/ASC.Common/Web/DisposableHttpContextHttpModule.cs b/common/ASC.Common/Web/DisposableHttpContextHttpModule.cs index 4258e52ff..3f586c6ca 100644 --- a/common/ASC.Common/Web/DisposableHttpContextHttpModule.cs +++ b/common/ASC.Common/Web/DisposableHttpContextHttpModule.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Web/HttpClientFactory.cs b/common/ASC.Common/Web/HttpClientFactory.cs new file mode 100644 index 000000000..d8f2d3d4e --- /dev/null +++ b/common/ASC.Common/Web/HttpClientFactory.cs @@ -0,0 +1,56 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace ASC.Common.Web +{ + public static class HttpClientFactory + { + private static ConcurrentDictionary clientsStorage = new ConcurrentDictionary(); + private const string DEFAULT_NAME = "default"; + public static HttpClient CreateClient() + { + return CreateClient(DEFAULT_NAME); + } + + public static HttpClient CreateClient(string name, HttpClientHandler httpHandler = null) + { + if(!clientsStorage.TryGetValue(name, out var httpClient)) + { + if(httpHandler != null) + { + httpClient = new HttpClient(httpHandler); + } + else + { + httpClient = new HttpClient(); + } + + clientsStorage.TryAdd(name, httpClient); + } + + return httpClient; + } + } +} diff --git a/common/ASC.Common/Web/MimeMapping.cs b/common/ASC.Common/Web/MimeMapping.cs index 64550950c..4ce7789e3 100644 --- a/common/ASC.Common/Web/MimeMapping.cs +++ b/common/ASC.Common/Web/MimeMapping.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Common/Web/ResiliencePolicyManager.cs b/common/ASC.Common/Web/ResiliencePolicyManager.cs new file mode 100644 index 000000000..f349bfbbf --- /dev/null +++ b/common/ASC.Common/Web/ResiliencePolicyManager.cs @@ -0,0 +1,83 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Collections.Concurrent; +using System.Threading.Tasks; + +using Polly; +using Polly.CircuitBreaker; +using Polly.Wrap; + +namespace ASC.Common.Web +{ + public static class ResiliencePolicyManager + { + public const int RETRY_COUNT = 2; + public const int FUNCTION_BASIS = 2; + + public const double FAILURE_THRESHOLD = 0.5; + public const int SAMPLINF_DURATION_SEC = 30; + public const int MINIMUM_THROUGHPUT = 10; + public const int DURATION_OF_BREAK_SEC = 60; + + public const int OPERATION_TIMEOUT_SEC = 2; + + private static ConcurrentDictionary policiesStorage = new ConcurrentDictionary(); + + public async static Task GetStringWithPoliciesAsync(string requestIdentifier, Func> function) + { + var policy = GetAsyncPolicy(requestIdentifier); + + var responseString = await policy + .ExecuteAsync(function); + + return responseString; + } + + private static AsyncPolicyWrap GetAsyncPolicy(string policyEntryName) + { + if (policiesStorage.TryGetValue(policyEntryName, out var policy)) + { + return policy; + } + + var policyHandler = Policy.Handle(ex => ex.GetType() != typeof(BrokenCircuitException)); + //catch all errors except for errors from the breaker + + var retryPolicy = policyHandler.WaitAndRetryAsync(RETRY_COUNT, retryAttempt => + { + return TimeSpan.FromSeconds(Math.Pow(FUNCTION_BASIS, retryAttempt)); + }); + //retry with exponential delay + + var circuitPolicy = policyHandler + .AdvancedCircuitBreakerAsync(FAILURE_THRESHOLD, TimeSpan.FromSeconds(SAMPLINF_DURATION_SEC), MINIMUM_THROUGHPUT, TimeSpan.FromSeconds(DURATION_OF_BREAK_SEC)); + //circuit breaker accumulates statistics and starts canceling requests after a certain number of failures + + var operationTimeoutPolicy = Policy.TimeoutAsync(OPERATION_TIMEOUT_SEC); + //timeout for one operation + + policy = Policy + .WrapAsync(retryPolicy, circuitPolicy, operationTimeoutPolicy); + + policiesStorage.TryAdd(policyEntryName, policy); + + return policy; + } + } +} diff --git a/common/ASC.Common/Web/RouteCallInfo.cs b/common/ASC.Common/Web/RouteCallInfo.cs index c73d05ebf..7a556807f 100644 --- a/common/ASC.Common/Web/RouteCallInfo.cs +++ b/common/ASC.Common/Web/RouteCallInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/ASC.Core.Common.csproj b/common/ASC.Core.Common/ASC.Core.Common.csproj index 05cf350da..65cc4f987 100644 --- a/common/ASC.Core.Common/ASC.Core.Common.csproj +++ b/common/ASC.Core.Common/ASC.Core.Common.csproj @@ -26,6 +26,8 @@ prompt 4 false + ..\..\web\studio\ASC.Web.Studio\bin\ASC.Core.Common.xml + CS1591 none @@ -170,6 +172,7 @@ + @@ -185,6 +188,7 @@ + @@ -196,6 +200,7 @@ + @@ -246,6 +251,7 @@ + diff --git a/common/ASC.Core.Common/Audit/BaseEvent.cs b/common/ASC.Core.Common/Audit/BaseEvent.cs index 35f7d0953..6e69651f8 100644 --- a/common/ASC.Core.Common/Audit/BaseEvent.cs +++ b/common/ASC.Core.Common/Audit/BaseEvent.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; diff --git a/common/ASC.Core.Common/BaseCommonLinkUtility.cs b/common/ASC.Core.Common/BaseCommonLinkUtility.cs index c0e197fb1..8df539d6f 100644 --- a/common/ASC.Core.Common/BaseCommonLinkUtility.cs +++ b/common/ASC.Core.Common/BaseCommonLinkUtility.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web; diff --git a/common/ASC.Core.Common/Billing/BillingClient.cs b/common/ASC.Core.Common/Billing/BillingClient.cs index 4a72c427f..ed47da605 100644 --- a/common/ASC.Core.Common/Billing/BillingClient.cs +++ b/common/ASC.Core.Common/Billing/BillingClient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,7 +38,11 @@ public class BillingClient private readonly static string _billingSecret; private readonly bool _test; - private const int AvangatePaymentSystemId = 1; + public enum PaymentSystem + { + Avangate = 1, + Stripe = 9 + }; static BillingClient() { @@ -83,11 +87,11 @@ public IEnumerable GetPayments(string portalId) return payments; } - public IDictionary GetPaymentUrls(string portalId, string[] products, string affiliateId = null, string campaign = null, string currency = null, string language = null, string customerId = null, string quantity = null) + public IDictionary GetPaymentUrls(string portalId, string[] products, string affiliateId = null, string campaign = null, string currency = null, string language = null, string customerId = null, string quantity = null, PaymentSystem paymentSystem = PaymentSystem.Avangate) { var urls = new Dictionary(); - var additionalParameters = new List>() { Tuple.Create("PaymentSystemId", AvangatePaymentSystemId.ToString()) }; + var additionalParameters = new List>() { Tuple.Create("PaymentSystemId", ((int)paymentSystem).ToString()) }; if (!string.IsNullOrEmpty(affiliateId)) { additionalParameters.Add(Tuple.Create("AffiliateId", affiliateId)); @@ -136,9 +140,9 @@ public IDictionary GetPaymentUrls(string portalId, string[] product return urls; } - public string GetPaymentUrl(string portalId, string[] products, string affiliateId = null, string campaign = null, string currency = null, string language = null, string customerId = null, string quantity = null) + public string GetPaymentUrl(string portalId, string[] products, string affiliateId = null, string campaign = null, string currency = null, string language = null, string customerId = null, string customerEmail = null, string backUrl = null, string quantity = null, PaymentSystem paymentSystem = PaymentSystem.Avangate) { - var additionalParameters = new List>() { Tuple.Create("PaymentSystemId", AvangatePaymentSystemId.ToString()) }; + var additionalParameters = new List>() { Tuple.Create("PaymentSystemId", ((int)paymentSystem).ToString()) }; if (!string.IsNullOrEmpty(affiliateId)) { additionalParameters.Add(Tuple.Create("AffiliateId", affiliateId)); @@ -159,6 +163,14 @@ public string GetPaymentUrl(string portalId, string[] products, string affiliate { additionalParameters.Add(Tuple.Create("CustomerID", customerId)); } + if (!string.IsNullOrEmpty(customerEmail)) + { + additionalParameters.Add(Tuple.Create("CustomerEmail", customerEmail)); + } + if (!string.IsNullOrEmpty(backUrl)) + { + additionalParameters.Add(Tuple.Create("BackRef", backUrl)); + } if (!string.IsNullOrEmpty(quantity)) { additionalParameters.Add(Tuple.Create("Quantity", quantity)); @@ -176,7 +188,7 @@ public string GetPaymentUrl(string portalId, string[] products, string affiliate return paymentUrl; } - public IDictionary> GetProductPriceInfo(params string[] productIds) + public IDictionary> GetProductPriceInfo(string[] productIds, PaymentSystem paymentSystem = PaymentSystem.Avangate) { if (productIds == null) { @@ -184,14 +196,14 @@ public IDictionary> GetProductPriceInfo(para } var parameters = productIds.Select(pid => Tuple.Create("ProductId", pid)).ToList(); - parameters.Add(Tuple.Create("PaymentSystemId", AvangatePaymentSystemId.ToString())); + parameters.Add(Tuple.Create("PaymentSystemId", ((int)paymentSystem).ToString())); var result = Request("GetProductsPrices", null, parameters.ToArray()); - var prices = JsonConvert.DeserializeObject>>>(result); + var prices = JsonConvert.DeserializeObject>>>(result); - if (prices.ContainsKey(AvangatePaymentSystemId)) + if (prices.ContainsKey(paymentSystem)) { - var pricesPaymentSystem = prices[AvangatePaymentSystemId]; + var pricesPaymentSystem = prices[paymentSystem]; return productIds.Select(productId => { diff --git a/common/ASC.Core.Common/Billing/ITariffService.cs b/common/ASC.Core.Common/Billing/ITariffService.cs index 28f1482cf..0f881f820 100644 --- a/common/ASC.Core.Common/Billing/ITariffService.cs +++ b/common/ASC.Core.Common/Billing/ITariffService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,9 +34,9 @@ public interface ITariffService Uri GetShoppingUri(int? tenant, int quotaId, string affiliateId, string currency = null, string language = null, string customerId = null, string quantity = null); - Uri GetShoppingUri(string[] productIds, string affiliateId = null, string currency = null, string language = null, string customerId = null, string quantity = null); + Uri GetShoppingUri(string[] productIds, string affiliateId = null, string currency = null, string language = null, string customerId = null, string customerEmail = null, string backUrl = null, string quantity = null, BillingClient.PaymentSystem paymentSystem = BillingClient.PaymentSystem.Avangate); - IDictionary> GetProductPriceInfo(params string[] productIds); + IDictionary> GetProductPriceInfo(string[] productIds, BillingClient.PaymentSystem paymentSystem = BillingClient.PaymentSystem.Avangate); string GetButton(int tariffId, string partnerId); diff --git a/common/ASC.Core.Common/Billing/License/License.cs b/common/ASC.Core.Common/Billing/License/License.cs index ec9d5234b..edef63a45 100644 --- a/common/ASC.Core.Common/Billing/License/License.cs +++ b/common/ASC.Core.Common/Billing/License/License.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Billing/License/LicenseException.cs b/common/ASC.Core.Common/Billing/License/LicenseException.cs index 6c53675fe..1c619640f 100644 --- a/common/ASC.Core.Common/Billing/License/LicenseException.cs +++ b/common/ASC.Core.Common/Billing/License/LicenseException.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; namespace ASC.Core.Billing diff --git a/common/ASC.Core.Common/Billing/License/LicenseReader.cs b/common/ASC.Core.Common/Billing/License/LicenseReader.cs index ec89d2fd1..7b350e6df 100644 --- a/common/ASC.Core.Common/Billing/License/LicenseReader.cs +++ b/common/ASC.Core.Common/Billing/License/LicenseReader.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Billing/PaymentActive.cs b/common/ASC.Core.Common/Billing/PaymentActive.cs index 9297c8d25..8eff9f3b2 100644 --- a/common/ASC.Core.Common/Billing/PaymentActive.cs +++ b/common/ASC.Core.Common/Billing/PaymentActive.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Billing/PaymentInfo.cs b/common/ASC.Core.Common/Billing/PaymentInfo.cs index 32cea7c0a..85609ff85 100644 --- a/common/ASC.Core.Common/Billing/PaymentInfo.cs +++ b/common/ASC.Core.Common/Billing/PaymentInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Billing/Tariff.cs b/common/ASC.Core.Common/Billing/Tariff.cs index 6c873267f..294544f36 100644 --- a/common/ASC.Core.Common/Billing/Tariff.cs +++ b/common/ASC.Core.Common/Billing/Tariff.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,18 +26,25 @@ namespace ASC.Core.Billing [Serializable] public class Tariff { + ///1 public int QuotaId { get; set; } + ///1 public TariffState State { get; set; } + ///2019-07-26T00:00:00 public DateTime DueDate { get; set; } + ///2019-07-26T00:00:00 public DateTime DelayDueDate { get; set; } + ///2019-07-26T00:00:00 public DateTime LicenseDate { get; set; } + ///true public bool Autorenewal { get; set; } + ///true public bool Prolongable { get; set; } public int Quantity { get; set; } diff --git a/common/ASC.Core.Common/Billing/TariffService.cs b/common/ASC.Core.Common/Billing/TariffService.cs index be4236c81..6e5166bb2 100644 --- a/common/ASC.Core.Common/Billing/TariffService.cs +++ b/common/ASC.Core.Common/Billing/TariffService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -319,9 +319,9 @@ public Uri GetShoppingUri(int? tenant, int quotaId, string affiliateId, string c return null; } - public Uri GetShoppingUri(string[] productIds, string affiliateId = null, string currency = null, string language = null, string customerId = null, string quantity = null) + public Uri GetShoppingUri(string[] productIds, string affiliateId = null, string currency = null, string language = null, string customerId = null, string customerEmail = null, string backUrl = null, string quantity = null, BillingClient.PaymentSystem paymentSystem = BillingClient.PaymentSystem.Avangate) { - var key = "shopingurl" + string.Join("_", productIds) + (!string.IsNullOrEmpty(affiliateId) ? "_" + affiliateId : ""); + var key = "shopingurl" + string.Join("_", productIds) + (!string.IsNullOrEmpty(affiliateId) ? "_" + affiliateId : "") + "_" + paymentSystem; var url = cache.Get(key); if (url == null) { @@ -340,7 +340,10 @@ public Uri GetShoppingUri(string[] productIds, string affiliateId = null, string !string.IsNullOrEmpty(currency) ? "__Currency__" : null, !string.IsNullOrEmpty(language) ? "__Language__" : null, !string.IsNullOrEmpty(customerId) ? "__CustomerID__" : null, - !string.IsNullOrEmpty(quantity) ? "__Quantity__" : null + !string.IsNullOrEmpty(customerEmail) ? "__CustomerEmail__" : null, + !string.IsNullOrEmpty(backUrl) ? "__BackUrl__" : null, + !string.IsNullOrEmpty(quantity) ? "__Quantity__" : null, + paymentSystem ); } catch (Exception error) @@ -360,11 +363,13 @@ public Uri GetShoppingUri(string[] productIds, string affiliateId = null, string .Replace("__Currency__", HttpUtility.UrlEncode(currency ?? "")) .Replace("__Language__", HttpUtility.UrlEncode((language ?? "").ToLower())) .Replace("__CustomerID__", HttpUtility.UrlEncode(customerId ?? "")) + .Replace("__CustomerEmail__", HttpUtility.UrlEncode(customerEmail ?? "")) + .Replace("__BackUrl__", HttpUtility.UrlEncode(backUrl ?? "")) .Replace("__Quantity__", HttpUtility.UrlEncode(quantity ?? ""))); return result; } - public IDictionary> GetProductPriceInfo(params string[] productIds) + public IDictionary> GetProductPriceInfo(string[] productIds, BillingClient.PaymentSystem paymentSystem = BillingClient.PaymentSystem.Avangate) { if (productIds == null) { @@ -372,12 +377,12 @@ public IDictionary> GetProductPriceInfo(para } try { - var key = "biling-prices" + string.Join(",", productIds); + var key = "biling-prices" + string.Join(",", productIds) + "_" + paymentSystem; var result = cache.Get>>(key); if (result == null) { var client = GetBillingClient(); - result = client.GetProductPriceInfo(productIds); + result = client.GetProductPriceInfo(productIds, paymentSystem); cache.Insert(key, result, DateTime.Now.AddHours(1)); } return result; diff --git a/common/ASC.Core.Common/Billing/TariffState.cs b/common/ASC.Core.Common/Billing/TariffState.cs index c3c2154b5..ffdee4714 100644 --- a/common/ASC.Core.Common/Billing/TariffState.cs +++ b/common/ASC.Core.Common/Billing/TariffState.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Caching/AzRecordStore.cs b/common/ASC.Core.Common/Caching/AzRecordStore.cs index 10d1c8f44..2a799b72d 100644 --- a/common/ASC.Core.Common/Caching/AzRecordStore.cs +++ b/common/ASC.Core.Common/Caching/AzRecordStore.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Caching/CachedAzService.cs b/common/ASC.Core.Common/Caching/CachedAzService.cs index caa306735..4195de95a 100644 --- a/common/ASC.Core.Common/Caching/CachedAzService.cs +++ b/common/ASC.Core.Common/Caching/CachedAzService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Caching/CachedQuotaService.cs b/common/ASC.Core.Common/Caching/CachedQuotaService.cs index af91cbbdb..cafecb7b0 100644 --- a/common/ASC.Core.Common/Caching/CachedQuotaService.cs +++ b/common/ASC.Core.Common/Caching/CachedQuotaService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -63,19 +63,18 @@ public CachedQuotaService(IQuotaService service) } - public IEnumerable GetTenantQuotas() + public IEnumerable GetTenantQuotas(bool useCache = true) { - var quotas = cache.Get>(KEY_QUOTA); + var quotas = useCache ? cache.Get>(KEY_QUOTA) : null; if (quotas == null) { - cache.Insert(KEY_QUOTA, quotas = service.GetTenantQuotas(), DateTime.UtcNow.Add(CacheExpiration)); + cache.Insert(KEY_QUOTA, quotas = service.GetTenantQuotas(useCache), DateTime.UtcNow.Add(CacheExpiration)); } return quotas; } - - public TenantQuota GetTenantQuota(int tenant) + public TenantQuota GetTenantQuota(int tenant, bool useCache = true) { - return GetTenantQuotas().SingleOrDefault(q => q.Id == tenant); + return GetTenantQuotas(useCache).SingleOrDefault(q => q.Id == tenant); } public TenantQuota SaveTenantQuota(TenantQuota quota) @@ -95,6 +94,12 @@ public void SetTenantQuotaRow(TenantQuotaRow row, bool exchange) { service.SetTenantQuotaRow(row, exchange); cacheNotify.Publish(new QuotaCacheItem { Key = GetKey(row.Tenant) }, CacheNotifyAction.InsertOrUpdate); + + if (row.UserId != Guid.Empty) + { + cacheNotify.Publish(new QuotaCacheItem { Key = GetKey(row.Tenant, row.UserId) }, CacheNotifyAction.InsertOrUpdate); + } + } public IEnumerable FindTenantQuotaRows(int tenantId) @@ -111,11 +116,48 @@ public IEnumerable FindTenantQuotaRows(int tenantId) return result; } + public IEnumerable FindUserQuotaRows(int tenantId, Guid userId, bool useCache) + { + var key = GetKey(tenantId, userId); + var result = cache.Get>(key); + + if (result == null || !useCache) + { + result = service.FindUserQuotaRows(tenantId, userId, useCache); + cache.Insert(key, result, DateTime.UtcNow.Add(CacheExpiration)); + } + + return result; + } + + public TenantQuotaRow FindUserQuotaRow(int tenantId, Guid userId, Guid tag) + { + var key = GetKey(tenantId, userId, tag); + var result = cache.Get(key); + + if (result == null) + { + result = service.FindUserQuotaRow(tenantId, userId, tag); + if(result != null) cache.Insert(key, result, DateTime.UtcNow.Add(CacheExpiration)); + } + + return result; + } + public string GetKey(int tenant) { return KEY_QUOTA_ROWS + tenant; } + public string GetKey(int tenant, Guid userId) + { + return KEY_QUOTA_ROWS + tenant + userId; + } + public string GetKey(int tenant, Guid userId, Guid tag) + { + return KEY_QUOTA_ROWS + tenant + userId + tag; + } + [Serializable] class QuotaCacheItem diff --git a/common/ASC.Core.Common/Caching/CachedSubscriptionService.cs b/common/ASC.Core.Common/Caching/CachedSubscriptionService.cs index 1c985245f..a3f1382d8 100644 --- a/common/ASC.Core.Common/Caching/CachedSubscriptionService.cs +++ b/common/ASC.Core.Common/Caching/CachedSubscriptionService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Caching/CachedTenantService.cs b/common/ASC.Core.Common/Caching/CachedTenantService.cs index 0c2471503..b63fde1c3 100644 --- a/common/ASC.Core.Common/Caching/CachedTenantService.cs +++ b/common/ASC.Core.Common/Caching/CachedTenantService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Caching/CachedUserService.cs b/common/ASC.Core.Common/Caching/CachedUserService.cs index 5bf202ff0..769458223 100644 --- a/common/ASC.Core.Common/Caching/CachedUserService.cs +++ b/common/ASC.Core.Common/Caching/CachedUserService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Caching/ICachedService.cs b/common/ASC.Core.Common/Caching/ICachedService.cs index 08dcfee97..8c209278a 100644 --- a/common/ASC.Core.Common/Caching/ICachedService.cs +++ b/common/ASC.Core.Common/Caching/ICachedService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Caching/TrustInterval.cs b/common/ASC.Core.Common/Caching/TrustInterval.cs index 18dda79c1..dc7de9132 100644 --- a/common/ASC.Core.Common/Caching/TrustInterval.cs +++ b/common/ASC.Core.Common/Caching/TrustInterval.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Caching/UserGroupRefStore.cs b/common/ASC.Core.Common/Caching/UserGroupRefStore.cs index 04b48679e..907393b8a 100644 --- a/common/ASC.Core.Common/Caching/UserGroupRefStore.cs +++ b/common/ASC.Core.Common/Caching/UserGroupRefStore.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Configuration/AmazonS3Settings.cs b/common/ASC.Core.Common/Configuration/AmazonS3Settings.cs index 52d40d4df..57746766c 100644 --- a/common/ASC.Core.Common/Configuration/AmazonS3Settings.cs +++ b/common/ASC.Core.Common/Configuration/AmazonS3Settings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Configuration/AmiPublicDnsSyncService.cs b/common/ASC.Core.Common/Configuration/AmiPublicDnsSyncService.cs index b54aa4007..b210ecd83 100644 --- a/common/ASC.Core.Common/Configuration/AmiPublicDnsSyncService.cs +++ b/common/ASC.Core.Common/Configuration/AmiPublicDnsSyncService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Configuration/ConnectionStringNameTypeConverter.cs b/common/ASC.Core.Common/Configuration/ConnectionStringNameTypeConverter.cs index 8f32f751b..1c2e810d4 100644 --- a/common/ASC.Core.Common/Configuration/ConnectionStringNameTypeConverter.cs +++ b/common/ASC.Core.Common/Configuration/ConnectionStringNameTypeConverter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Configuration/Constants.cs b/common/ASC.Core.Common/Configuration/Constants.cs index 30d9a62b4..ff00705a2 100644 --- a/common/ASC.Core.Common/Configuration/Constants.cs +++ b/common/ASC.Core.Common/Configuration/Constants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Configuration/Consumer.cs b/common/ASC.Core.Common/Configuration/Consumer.cs index 7c7c9a0c5..43037e1ce 100644 --- a/common/ASC.Core.Common/Configuration/Consumer.cs +++ b/common/ASC.Core.Common/Configuration/Consumer.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections; using System.Collections.Generic; @@ -68,6 +68,9 @@ private Dictionary AllProps } } + private ICollection Optionals { get; set; } + private ICollection Passwords { get; set; } + private static readonly bool OnlyDefault; public bool IsSet @@ -86,29 +89,45 @@ public Consumer() Order = int.MaxValue; Props = new Dictionary(); Additional = new Dictionary(); + Optionals = new List(); + Passwords = new List(); } - public Consumer(string name, int order, Dictionary additional) + public Consumer(string name, int order, Dictionary additional) { Name = name; Order = order; Props = new Dictionary(); - Additional = additional; + Additional = ConvertToDictionaryString(additional); + Optionals = GetOptionalKeys(additional); + Passwords = GetPasswordsKeys(additional); } - public Consumer(string name, int order, Dictionary props, Dictionary additional) + public Consumer(string name, int order, Dictionary props, Dictionary additional) { Name = name; Order = order; - Props = props ?? new Dictionary(); - Additional = additional ?? new Dictionary(); - + Props = ConvertToDictionaryString(props) ?? new Dictionary(); + Additional = ConvertToDictionaryString(additional) ?? new Dictionary(); + Optionals = GetOptionalKeys(props, additional); + Passwords = GetPasswordsKeys(props, additional); if (props != null && props.Any()) { - CanSet = props.All(r => string.IsNullOrEmpty(r.Value)); + CanSet = props.All(r => string.IsNullOrEmpty(r.Value.value)); } } + public bool IsOptional(string key) + { + return Optionals.Contains(key); + } + + public bool IsPassword(string key) + { + return Passwords.Contains(key); + } + + public IEnumerator> GetEnumerator() { return AllProps.GetEnumerator(); @@ -235,6 +254,52 @@ protected virtual string GetSettingsKey(string name) { return "AuthKey_" + name; } + + protected Dictionary ConvertToDictionaryString(Dictionary props) + { + if (props == null) return null; + return props.ToDictionary(r => r.Key, r => r.Value.value); + } + + protected Dictionary ConvertToDictionaryProp(Dictionary props) + { + if (props == null) return null; + return props.ToDictionary(r => r.Key, r => new Prop() { value = r.Value , optional = Optionals.Contains(r.Key), password = Passwords.Contains(r.Key)}); + } + + private List GetOptionalKeys(Dictionary props) + { + if (props == null) return null; + return props.Where(r => r.Value.optional).Select(r=> r.Key).ToList(); + } + + private List GetOptionalKeys(Dictionary props1, Dictionary props2) + { + if (props1 == null && props2 == null) return null; + + props1 = props1 ?? new Dictionary(); + props2 = props2 ?? new Dictionary(); + + var props = props1.Union(props2); + return props.Where(r => r.Value.optional).Select(r => r.Key).ToList(); + } + + private List GetPasswordsKeys(Dictionary props) + { + if (props == null) return null; + return props.Where(r => r.Value.password).Select(r => r.Key).ToList(); + } + + private List GetPasswordsKeys(Dictionary props1, Dictionary props2) + { + if (props1 == null && props2 == null) return null; + + props1 = props1 ?? new Dictionary(); + props2 = props2 ?? new Dictionary(); + + var props = props1.Union(props2); + return props.Where(r => r.Value.password).Select(r => r.Key).ToList(); + } } public class DataStoreConsumer : Consumer, ICloneable @@ -250,13 +315,13 @@ public DataStoreConsumer() } - public DataStoreConsumer(string name, int order, Dictionary additional) + public DataStoreConsumer(string name, int order, Dictionary additional) : base(name, order, additional) { Init(additional); } - public DataStoreConsumer(string name, int order, Dictionary props, Dictionary additional) + public DataStoreConsumer(string name, int order, Dictionary props, Dictionary additional) : base(name, order, props, additional) { Init(additional); @@ -272,16 +337,16 @@ protected override string GetSettingsKey(string name) return base.GetSettingsKey(Name + name); } - private void Init(IReadOnlyDictionary additional) + private void Init(IReadOnlyDictionary additional) { if (additional == null || !additional.ContainsKey(HandlerTypeKey)) throw new ArgumentException(HandlerTypeKey); - HandlerType = Type.GetType(additional[HandlerTypeKey]); + HandlerType = Type.GetType(additional[HandlerTypeKey].value); if (additional.ContainsKey(CdnKey)) { - Cdn = GetCdn(additional[CdnKey]); + Cdn = GetCdn(additional[CdnKey].value); } } @@ -293,12 +358,14 @@ private DataStoreConsumer GetCdn(string cdn) var additional = fromConfig.AdditionalKeys.ToDictionary(prop => prop, prop => fromConfig[prop]); additional.Add(HandlerTypeKey, HandlerType.AssemblyQualifiedName); - return new DataStoreConsumer(fromConfig.Name, fromConfig.Order, props, additional); + return new DataStoreConsumer(fromConfig.Name, fromConfig.Order, ConvertToDictionaryProp(props), ConvertToDictionaryProp(additional)); } public object Clone() { - return new DataStoreConsumer(Name, Order, Props.ToDictionary(r => r.Key, r => r.Value), Additional.ToDictionary(r => r.Key, r => r.Value)); + var props = ConvertToDictionaryProp(Props); + var additional = ConvertToDictionaryProp(Additional); + return new DataStoreConsumer(Name, Order, props, additional); } } diff --git a/common/ASC.Core.Common/Configuration/ConsumerConfigurationSection.cs b/common/ASC.Core.Common/Configuration/ConsumerConfigurationSection.cs index 9948cba05..8838ab08a 100644 --- a/common/ASC.Core.Common/Configuration/ConsumerConfigurationSection.cs +++ b/common/ASC.Core.Common/Configuration/ConsumerConfigurationSection.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ using System; +using System.Collections.Generic; using System.Configuration; using System.Linq; @@ -60,10 +61,76 @@ public class ConsumerElement : ComponentElement public int Order { get { return Convert.ToInt32(this[OrderElement]); } } [ConfigurationProperty(PropsElement, IsRequired = false)] - public DictionaryElementCollection Props { get { return this[PropsElement] as DictionaryElementCollection; } } + public PropDictionaryElementCollection Props { get { return this[PropsElement] as PropDictionaryElementCollection; } } + } + + public class PropListItemElement : ConfigurationElement + { + private const string valueAttributeName = "value"; + private const string keyAttributeName = "key"; + private const string hiddenAttributeName = "hidden"; + private const string optionalAttributeName = "optional"; + private const string passwordAttributeName = "password"; + + [ConfigurationProperty(keyAttributeName, IsRequired = true)] + public string Key + { + get + { + return (string)this[keyAttributeName]; + } + } + + [ConfigurationProperty(valueAttributeName, IsRequired = true)] + public string Value + { + get + { + return (string)this[valueAttributeName]; + } + } + + [ConfigurationProperty(hiddenAttributeName, IsRequired = false)] + public bool Hidden + { + get + { + return (bool)this[hiddenAttributeName]; + } + } + + [ConfigurationProperty(optionalAttributeName, IsRequired = false)] + public bool Optional + { + get + { + return (bool)this[optionalAttributeName]; + } + } - [ConfigurationProperty(AdditionalElement, IsRequired = false)] - public DictionaryElementCollection Additional { get { return this[AdditionalElement] as DictionaryElementCollection; } } + [ConfigurationProperty(passwordAttributeName, IsRequired = false)] + public bool Password + { + get + { + return (bool)this[passwordAttributeName]; + } + } + } + + public class PropDictionaryElementCollection : ConfigurationElementCollection + { + public PropDictionaryElementCollection() + : base("item") + { + } + } + + public class Prop + { + public string value; + public bool optional; + public bool password; } public class ConsumerConfigLoader @@ -96,12 +163,10 @@ public static ContainerBuilder LoadConsumers(string section) if (component.Props != null && component.Props.Any()) { - builder.WithParameter(new NamedParameter(ConsumerElement.PropsElement, component.Props.ToDictionary(r => r.Key, r => r.Value))); - } - - if (component.Additional != null && component.Additional.Any()) - { - builder.WithParameter(new NamedParameter(ConsumerElement.AdditionalElement, component.Additional.ToDictionary(r => r.Key, r => r.Value))); + var props = component.Props.Where(r=> !r.Hidden).ToDictionary(r => r.Key, r => new Prop() { value = r.Value, password = r.Password, optional = r.Optional }); + var additional = component.Props.Where(r=> r.Hidden).ToDictionary(r => r.Key, r => new Prop() { value = r.Value, password = r.Password, optional = r.Optional }); + builder.WithParameter(new NamedParameter(ConsumerElement.PropsElement, props)); + builder.WithParameter(new NamedParameter(ConsumerElement.AdditionalElement, additional)); } } diff --git a/common/ASC.Core.Common/Configuration/SmtpSettings.cs b/common/ASC.Core.Common/Configuration/SmtpSettings.cs index a6e7db303..7d676162d 100644 --- a/common/ASC.Core.Common/Configuration/SmtpSettings.cs +++ b/common/ASC.Core.Common/Configuration/SmtpSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,6 +43,8 @@ public class SmtpSettings public bool EnableAuth { get; set; } + public bool UseNtlm { get; set; } + public bool IsDefaultSettings { get; internal set; } public static SmtpSettings Empty = new SmtpSettings(); @@ -142,10 +144,12 @@ public static SmtpSettings Deserialize(string value) { settings.SetCredentials(credentialsUserName, credentialsUserPassword, credentialsDomain); settings.EnableAuth = true; + settings.UseNtlm = 8 < props.Length && !string.IsNullOrEmpty(props[8]) && Convert.ToBoolean(props[8]); } else { settings.EnableAuth = false; + settings.UseNtlm = false; } return settings; @@ -161,7 +165,8 @@ public override string ToString() Port.ToString(), HttpUtility.UrlEncode(SenderAddress), HttpUtility.UrlEncode(SenderDisplayName), - EnableSSL.ToString()); + EnableSSL.ToString(), + UseNtlm.ToString()); } } } diff --git a/common/ASC.Core.Common/Context/CoreContext.cs b/common/ASC.Core.Common/Context/CoreContext.cs index b28d68ac1..d6bd15cd8 100644 --- a/common/ASC.Core.Common/Context/CoreContext.cs +++ b/common/ASC.Core.Common/Context/CoreContext.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Context/Impl/AuthManager.cs b/common/ASC.Core.Common/Context/Impl/AuthManager.cs index 16add1c72..5cf75ff5a 100644 --- a/common/ASC.Core.Common/Context/Impl/AuthManager.cs +++ b/common/ASC.Core.Common/Context/Impl/AuthManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Context/Impl/AuthorizationManager.cs b/common/ASC.Core.Common/Context/Impl/AuthorizationManager.cs index 8e360bab1..c95c30ef3 100644 --- a/common/ASC.Core.Common/Context/Impl/AuthorizationManager.cs +++ b/common/ASC.Core.Common/Context/Impl/AuthorizationManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Context/Impl/CoreConfiguration.cs b/common/ASC.Core.Common/Context/Impl/CoreConfiguration.cs index 8797c684c..75b4c9943 100644 --- a/common/ASC.Core.Common/Context/Impl/CoreConfiguration.cs +++ b/common/ASC.Core.Common/Context/Impl/CoreConfiguration.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Context/Impl/PaymentManager.cs b/common/ASC.Core.Common/Context/Impl/PaymentManager.cs index c7a5b52e4..711bfd954 100644 --- a/common/ASC.Core.Common/Context/Impl/PaymentManager.cs +++ b/common/ASC.Core.Common/Context/Impl/PaymentManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -74,6 +74,12 @@ public IDictionary> GetProductPriceInfo(para return tariffService.GetProductPriceInfo(productIds); } + // used in www + public IDictionary> GetProductPriceInfo(string[] productIds, BillingClient.PaymentSystem paymentSystem = BillingClient.PaymentSystem.Avangate) + { + return tariffService.GetProductPriceInfo(productIds, paymentSystem); + } + public Uri GetShoppingUri(int quotaId, bool forCurrentTenant = true, string affiliateId = null, string currency = null, string language = null, string customerId = null, string quantity = null) { @@ -87,15 +93,15 @@ public Uri GetShoppingUri(int quotaId, string affiliateId, string currency = nul } // used in www - public Uri GetShoppingUri(string productId, string currency = null, string language = null, string customerId = null, string quantity = null, string affiliateId = null) + public Uri GetShoppingUri(string productId, string currency = null, string language = null, string customerId = null, string customerEmail = null, string backUrl = null, string quantity = null, string affiliateId = null, BillingClient.PaymentSystem paymentSystem = BillingClient.PaymentSystem.Avangate) { - return tariffService.GetShoppingUri(new[] { productId }, affiliateId, currency, language, customerId, quantity); + return tariffService.GetShoppingUri(new[] { productId }, affiliateId, currency, language, customerId, customerEmail, backUrl, quantity, paymentSystem); } // used in www - public Uri GetShoppingUri(string[] productIds, string currency = null, string language = null, string customerId = null, string quantity = null, string affiliateId = null) + public Uri GetShoppingUri(string[] productIds, string currency = null, string language = null, string customerId = null, string customerEmail = null, string backUrl = null, string quantity = null, string affiliateId = null, BillingClient.PaymentSystem paymentSystem = BillingClient.PaymentSystem.Avangate) { - return tariffService.GetShoppingUri(productIds, affiliateId, currency, language, customerId, quantity); + return tariffService.GetShoppingUri(productIds, affiliateId, currency, language, customerId, customerEmail, backUrl, quantity, paymentSystem); } diff --git a/common/ASC.Core.Common/Context/Impl/SubscriptionManager.cs b/common/ASC.Core.Common/Context/Impl/SubscriptionManager.cs index ee0c47d43..627ac4d0c 100644 --- a/common/ASC.Core.Common/Context/Impl/SubscriptionManager.cs +++ b/common/ASC.Core.Common/Context/Impl/SubscriptionManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Context/Impl/TenantManager.cs b/common/ASC.Core.Common/Context/Impl/TenantManager.cs index 1d9f187bb..75f87bb8b 100644 --- a/common/ASC.Core.Common/Context/Impl/TenantManager.cs +++ b/common/ASC.Core.Common/Context/Impl/TenantManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -206,9 +206,9 @@ public IEnumerable GetTenantQuotas(bool all) return quotaService.GetTenantQuotas().Where(q => q.Id < 0 && (all || q.Visible)).OrderByDescending(q => q.Id).ToList(); } - public TenantQuota GetTenantQuota(int tenant) + public TenantQuota GetTenantQuota(int tenant, bool useCache = true) { - var defaultQuota = quotaService.GetTenantQuota(tenant) ?? quotaService.GetTenantQuota(Tenant.DEFAULT_TENANT) ?? TenantQuota.Default; + var defaultQuota = quotaService.GetTenantQuota(tenant, useCache) ?? quotaService.GetTenantQuota(Tenant.DEFAULT_TENANT, useCache) ?? TenantQuota.Default; if (defaultQuota.Id != tenant && tariffService != null) { var tariff = tariffService.GetTariff(tenant); @@ -255,5 +255,14 @@ public List FindTenantQuotaRows(int tenantId) { return quotaService.FindTenantQuotaRows(tenantId).ToList(); } + + public List FindUserQuotaRows(int tenantId, Guid userId, bool useCache = true) + { + return quotaService.FindUserQuotaRows(tenantId, userId, useCache).ToList(); + } + public TenantQuotaRow FindUserQuotaRow(int tenantId, Guid userId, Guid tag) + { + return quotaService.FindUserQuotaRow(tenantId, userId, tag); + } } } diff --git a/common/ASC.Core.Common/Context/Impl/UserManager.cs b/common/ASC.Core.Common/Context/Impl/UserManager.cs index c5c6eb0cb..c6a855729 100644 --- a/common/ASC.Core.Common/Context/Impl/UserManager.cs +++ b/common/ASC.Core.Common/Context/Impl/UserManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -244,6 +244,7 @@ public UserInfo SaveUserInfo(UserInfo u, bool isVisitor = false, bool syncCardDa } var oldUserData = userService.GetUserByUserName(CoreContext.TenantManager.GetCurrentTenant().TenantId, u.UserName); + var newUser = userService.SaveUser(CoreContext.TenantManager.GetCurrentTenant().TenantId, u); if (syncCardDav) @@ -527,6 +528,8 @@ public void RemoveUserFromGroup(Guid userId, Guid groupId) GetUsers(userId).ResetGroupCache(); } + + #endregion Users diff --git a/common/ASC.Core.Common/Context/SecurityContext.cs b/common/ASC.Core.Common/Context/SecurityContext.cs index 5b638a1aa..ecd6f088e 100644 --- a/common/ASC.Core.Common/Context/SecurityContext.cs +++ b/common/ASC.Core.Common/Context/SecurityContext.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Context/WorkContext.cs b/common/ASC.Core.Common/Context/WorkContext.cs index dfbcb3644..d03266ec8 100644 --- a/common/ASC.Core.Common/Context/WorkContext.cs +++ b/common/ASC.Core.Common/Context/WorkContext.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Contracts/BackupServiceClient.cs b/common/ASC.Core.Common/Contracts/BackupServiceClient.cs index 5ec667a17..31334f104 100644 --- a/common/ASC.Core.Common/Contracts/BackupServiceClient.cs +++ b/common/ASC.Core.Common/Contracts/BackupServiceClient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Contracts/BackupServiceModel.cs b/common/ASC.Core.Common/Contracts/BackupServiceModel.cs index ae324d9d2..719cadedf 100644 --- a/common/ASC.Core.Common/Contracts/BackupServiceModel.cs +++ b/common/ASC.Core.Common/Contracts/BackupServiceModel.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -62,15 +62,19 @@ public class StartBackupRequest [DataContract] public class BackupProgress { + ///false [DataMember] public bool IsCompleted { get; set; } + ///44 [DataMember] public int Progress { get; set; } + ///null [DataMember] public string Error { get; set; } + ///Link [DataMember] public string Link { get; set; } } @@ -78,18 +82,23 @@ public class BackupProgress [DataContract] public class BackupHistoryRecord { + ///38c0f464-f1e7-493e-8d95-dc4ee8ee834a [DataMember] public Guid Id { get; set; } + ///FileName [DataMember] public string FileName { get; set; } + ///1 [DataMember] public BackupStorageType StorageType { get; set; } + ///2019-07-26T00:00:00 [DataMember] public DateTime CreatedOn { get; set; } + ///2019-07-26T00:00:00 [DataMember] public DateTime ExpiresOn { get; set; } } diff --git a/common/ASC.Core.Common/Contracts/HealthCheck/Enums/HealthStatus.cs b/common/ASC.Core.Common/Contracts/HealthCheck/Enums/HealthStatus.cs index 8937d84d9..163734979 100644 --- a/common/ASC.Core.Common/Contracts/HealthCheck/Enums/HealthStatus.cs +++ b/common/ASC.Core.Common/Contracts/HealthCheck/Enums/HealthStatus.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.Core.Common.Contracts { public enum HealthStatus diff --git a/common/ASC.Core.Common/Contracts/HealthCheck/HealthCheckResponse.cs b/common/ASC.Core.Common/Contracts/HealthCheck/HealthCheckResponse.cs index 4eb7d8a20..08828bfdf 100644 --- a/common/ASC.Core.Common/Contracts/HealthCheck/HealthCheckResponse.cs +++ b/common/ASC.Core.Common/Contracts/HealthCheck/HealthCheckResponse.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Runtime.Serialization; namespace ASC.Core.Common.Contracts diff --git a/common/ASC.Core.Common/Contracts/HealthCheck/HealthCheckResult.cs b/common/ASC.Core.Common/Contracts/HealthCheck/HealthCheckResult.cs index c3f78b259..b054b8df0 100644 --- a/common/ASC.Core.Common/Contracts/HealthCheck/HealthCheckResult.cs +++ b/common/ASC.Core.Common/Contracts/HealthCheck/HealthCheckResult.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; namespace ASC.Core.Common.Contracts diff --git a/common/ASC.Core.Common/Contracts/HealthCheck/HealthCheckSvc.cs b/common/ASC.Core.Common/Contracts/HealthCheck/HealthCheckSvc.cs index 8cc5bf0f7..3c5122727 100644 --- a/common/ASC.Core.Common/Contracts/HealthCheck/HealthCheckSvc.cs +++ b/common/ASC.Core.Common/Contracts/HealthCheck/HealthCheckSvc.cs @@ -1,19 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Configuration; using System.Diagnostics; diff --git a/common/ASC.Core.Common/Contracts/HealthCheck/IHealthCheckService.cs b/common/ASC.Core.Common/Contracts/HealthCheck/IHealthCheckService.cs index 8170d683c..e7ebc5029 100644 --- a/common/ASC.Core.Common/Contracts/HealthCheck/IHealthCheckService.cs +++ b/common/ASC.Core.Common/Contracts/HealthCheck/IHealthCheckService.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.ServiceModel; using System.ServiceModel.Web; diff --git a/common/ASC.Core.Common/Contracts/IBackupService.cs b/common/ASC.Core.Common/Contracts/IBackupService.cs index bc9f21da4..f4b354251 100644 --- a/common/ASC.Core.Common/Contracts/IBackupService.cs +++ b/common/ASC.Core.Common/Contracts/IBackupService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/AzRecord.cs b/common/ASC.Core.Common/Core/AzRecord.cs index 471f96dc7..b4aef7857 100644 --- a/common/ASC.Core.Common/Core/AzRecord.cs +++ b/common/ASC.Core.Common/Core/AzRecord.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/DBResourceManager.cs b/common/ASC.Core.Common/Core/DBResourceManager.cs index d8d942091..e61ffe622 100644 --- a/common/ASC.Core.Common/Core/DBResourceManager.cs +++ b/common/ASC.Core.Common/Core/DBResourceManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/EmployeeActivationStatus.cs b/common/ASC.Core.Common/Core/EmployeeActivationStatus.cs index 79fdeedec..3006a3ba7 100644 --- a/common/ASC.Core.Common/Core/EmployeeActivationStatus.cs +++ b/common/ASC.Core.Common/Core/EmployeeActivationStatus.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/EmployeeStatus.cs b/common/ASC.Core.Common/Core/EmployeeStatus.cs index 6d91e7c56..13a23308e 100644 --- a/common/ASC.Core.Common/Core/EmployeeStatus.cs +++ b/common/ASC.Core.Common/Core/EmployeeStatus.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/EmployeeType.cs b/common/ASC.Core.Common/Core/EmployeeType.cs index 030071fd1..8bbe7f37a 100644 --- a/common/ASC.Core.Common/Core/EmployeeType.cs +++ b/common/ASC.Core.Common/Core/EmployeeType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/Group.cs b/common/ASC.Core.Common/Core/Group.cs index 017cf8efb..6bfc7300a 100644 --- a/common/ASC.Core.Common/Core/Group.cs +++ b/common/ASC.Core.Common/Core/Group.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/GroupInfo.cs b/common/ASC.Core.Common/Core/GroupInfo.cs index fc99a6e5e..3bb16b0b1 100644 --- a/common/ASC.Core.Common/Core/GroupInfo.cs +++ b/common/ASC.Core.Common/Core/GroupInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/IAzService.cs b/common/ASC.Core.Common/Core/IAzService.cs index 357579a29..f617dd4ba 100644 --- a/common/ASC.Core.Common/Core/IAzService.cs +++ b/common/ASC.Core.Common/Core/IAzService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/IQuotaService.cs b/common/ASC.Core.Common/Core/IQuotaService.cs index 50f2590ae..d6b23ca82 100644 --- a/common/ASC.Core.Common/Core/IQuotaService.cs +++ b/common/ASC.Core.Common/Core/IQuotaService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ +using System; using System.Collections.Generic; using ASC.Core.Tenants; @@ -23,9 +24,9 @@ namespace ASC.Core { public interface IQuotaService { - IEnumerable GetTenantQuotas(); + IEnumerable GetTenantQuotas(bool useCache = true); - TenantQuota GetTenantQuota(int id); + TenantQuota GetTenantQuota(int id, bool useCache = true); TenantQuota SaveTenantQuota(TenantQuota quota); @@ -33,7 +34,9 @@ public interface IQuotaService IEnumerable FindTenantQuotaRows(int tenantId); - + IEnumerable FindUserQuotaRows(int tenantId, Guid userId, bool useCache); + + TenantQuotaRow FindUserQuotaRow(int tenantId, Guid userId, Guid tag); void SetTenantQuotaRow(TenantQuotaRow row, bool exchange); } } diff --git a/common/ASC.Core.Common/Core/ISubscriptionService.cs b/common/ASC.Core.Common/Core/ISubscriptionService.cs index 4fb27936a..0e925c566 100644 --- a/common/ASC.Core.Common/Core/ISubscriptionService.cs +++ b/common/ASC.Core.Common/Core/ISubscriptionService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/ITenantService.cs b/common/ASC.Core.Common/Core/ITenantService.cs index 986965ec9..2ec6774ae 100644 --- a/common/ASC.Core.Common/Core/ITenantService.cs +++ b/common/ASC.Core.Common/Core/ITenantService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/IUserService.cs b/common/ASC.Core.Common/Core/IUserService.cs index 39f823700..3cf1a936c 100644 --- a/common/ASC.Core.Common/Core/IUserService.cs +++ b/common/ASC.Core.Common/Core/IUserService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/IncludeType.cs b/common/ASC.Core.Common/Core/IncludeType.cs index 12bf66c28..c7b46ffa9 100644 --- a/common/ASC.Core.Common/Core/IncludeType.cs +++ b/common/ASC.Core.Common/Core/IncludeType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/Partner.cs b/common/ASC.Core.Common/Core/Partner.cs index 33fbeee1c..052c0f10b 100644 --- a/common/ASC.Core.Common/Core/Partner.cs +++ b/common/ASC.Core.Common/Core/Partner.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/PartnerDisplayType.cs b/common/ASC.Core.Common/Core/PartnerDisplayType.cs index de7bd2560..60f3d8dbe 100644 --- a/common/ASC.Core.Common/Core/PartnerDisplayType.cs +++ b/common/ASC.Core.Common/Core/PartnerDisplayType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/PartnerPaymentMethod.cs b/common/ASC.Core.Common/Core/PartnerPaymentMethod.cs index 26ccb6683..27928c6de 100644 --- a/common/ASC.Core.Common/Core/PartnerPaymentMethod.cs +++ b/common/ASC.Core.Common/Core/PartnerPaymentMethod.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/PartnerStatus.cs b/common/ASC.Core.Common/Core/PartnerStatus.cs index 8960ea718..a5dc21a34 100644 --- a/common/ASC.Core.Common/Core/PartnerStatus.cs +++ b/common/ASC.Core.Common/Core/PartnerStatus.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/PartnerType.cs b/common/ASC.Core.Common/Core/PartnerType.cs index 290fd6aae..0a1b73ceb 100644 --- a/common/ASC.Core.Common/Core/PartnerType.cs +++ b/common/ASC.Core.Common/Core/PartnerType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/SubscriptionMethod.cs b/common/ASC.Core.Common/Core/SubscriptionMethod.cs index 0898fb44f..003ea9bd2 100644 --- a/common/ASC.Core.Common/Core/SubscriptionMethod.cs +++ b/common/ASC.Core.Common/Core/SubscriptionMethod.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/SubscriptionRecord.cs b/common/ASC.Core.Common/Core/SubscriptionRecord.cs index c2e307b8f..deb5eee91 100644 --- a/common/ASC.Core.Common/Core/SubscriptionRecord.cs +++ b/common/ASC.Core.Common/Core/SubscriptionRecord.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/UserGroupRef.cs b/common/ASC.Core.Common/Core/UserGroupRef.cs index d65e730bb..05db430e4 100644 --- a/common/ASC.Core.Common/Core/UserGroupRef.cs +++ b/common/ASC.Core.Common/Core/UserGroupRef.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/UserGroupRefDictionary.cs b/common/ASC.Core.Common/Core/UserGroupRefDictionary.cs index 68b82947c..9b0755a83 100644 --- a/common/ASC.Core.Common/Core/UserGroupRefDictionary.cs +++ b/common/ASC.Core.Common/Core/UserGroupRefDictionary.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/UserGroupRefType.cs b/common/ASC.Core.Common/Core/UserGroupRefType.cs index eda2c2c6c..f43cb427a 100644 --- a/common/ASC.Core.Common/Core/UserGroupRefType.cs +++ b/common/ASC.Core.Common/Core/UserGroupRefType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Core/UserInfo.cs b/common/ASC.Core.Common/Core/UserInfo.cs index b51af7110..500bcef58 100644 --- a/common/ASC.Core.Common/Core/UserInfo.cs +++ b/common/ASC.Core.Common/Core/UserInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,61 +40,97 @@ public UserInfo() LastModified = DateTime.UtcNow; } - + ///38c0f464-f1e7-493e-8d95-dc4ee8ee834a public Guid ID { get; set; } + ///FirstName public string FirstName { get; set; } + ///LastName public string LastName { get; set; } + ///UserName public string UserName { get; set; } + ///2019-07-26T00:00:00 public DateTime? BirthDate { get; set; } + ///true public bool? Sex { get; set; } + ///1 public EmployeeStatus Status { get; set; } + ///1 public EmployeeActivationStatus ActivationStatus { get; set; } + ///2019-07-26T00:00:00 public DateTime? TerminatedDate { get; set; } + ///Title public string Title { get; set; } + ///2019-07-26T00:00:00 public DateTime? WorkFromDate { get; set; } + ///Email public string Email { get; set; } + ///Contacts + ///list public List Contacts { get; set; } + ///Location public string Location { get; set; } + ///Notes public string Notes { get; set; } + ///false public bool Removed { get; set; } + ///2019-07-26T00:00:00 public DateTime LastModified { get; set; } + ///1 public int Tenant { get; set; } + ///072A8452-ADF3-40AA-B359-22DA7B8923E2 + public Guid? Lead {get; set;} + + ///false public bool IsActive { get { return ActivationStatus.HasFlag(EmployeeActivationStatus.Activated); } } + ///CultureName public string CultureName { get; set; } + ///MobilePhone public string MobilePhone { get; set; } + ///1 public MobilePhoneActivationStatus MobilePhoneActivationStatus { get; set; } + ///Sid public string Sid { get; set; } // LDAP user identificator + ///LdapQouta + public long LdapQouta { get; set; } // LDAP user quota attribute + + ///SsoNameId public string SsoNameId { get; set; } // SSO SAML user identificator + + ///SsoSessionId public string SsoSessionId { get; set; } // SSO SAML user session identificator + ///2019-07-26T00:00:00 public DateTime CreateDate { get; set; } + ///UsedSpace + public long UsedSpace { get; set; } + public override string ToString() { return String.Format("{0} {1}", FirstName, LastName).Trim(); diff --git a/common/ASC.Core.Common/Data/DbAzService.cs b/common/ASC.Core.Common/Data/DbAzService.cs index ff46b1066..6ac640cda 100644 --- a/common/ASC.Core.Common/Data/DbAzService.cs +++ b/common/ASC.Core.Common/Data/DbAzService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Data/DbBaseService.cs b/common/ASC.Core.Common/Data/DbBaseService.cs index 3ff65105f..292a8edf4 100644 --- a/common/ASC.Core.Common/Data/DbBaseService.cs +++ b/common/ASC.Core.Common/Data/DbBaseService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,7 +69,7 @@ protected void ExecBatch(IEnumerable batch) protected IDbManager GetDb() { - return DbManager.FromHttpContext(dbid); + return new DbManager(dbid); } protected SqlQuery Query(string table, int tenant) diff --git a/common/ASC.Core.Common/Data/DbLoginEventsManager.cs b/common/ASC.Core.Common/Data/DbLoginEventsManager.cs index afdb04d6b..86b878d8f 100644 --- a/common/ASC.Core.Common/Data/DbLoginEventsManager.cs +++ b/common/ASC.Core.Common/Data/DbLoginEventsManager.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Linq; @@ -191,7 +191,7 @@ private static string GetCacheKey(int tenantId, Guid userId) private static IDbManager GetDbManager() { - return DbManager.FromHttpContext(dbId); + return new DbManager(dbId); } } } diff --git a/common/ASC.Core.Common/Data/DbQuotaService.cs b/common/ASC.Core.Common/Data/DbQuotaService.cs index 2518f682a..ec6ce1463 100644 --- a/common/ASC.Core.Common/Data/DbQuotaService.cs +++ b/common/ASC.Core.Common/Data/DbQuotaService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,12 +38,12 @@ public DbQuotaService(ConnectionStringSettings connectionString) } - public IEnumerable GetTenantQuotas() + public IEnumerable GetTenantQuotas(bool useCache = false) { return GetTenantQuotas(Exp.Empty); } - public TenantQuota GetTenantQuota(int id) + public TenantQuota GetTenantQuota(int id, bool useCache = false) { return GetTenantQuotas(Exp.Eq("tenant", id)) .SingleOrDefault(); @@ -102,15 +102,28 @@ public void SetTenantQuotaRow(TenantQuotaRow row, bool exchange) using (var db = GetDb()) using (var tx = db.BeginTransaction()) { - var counter = db.ExecuteScalar(Query(tenants_quotarow, row.Tenant) - .Select("counter") - .Where("path", row.Path)); - db.ExecuteNonQuery(Insert(tenants_quotarow, row.Tenant) - .InColumnValue("path", row.Path) - .InColumnValue("counter", exchange ? counter + row.Counter : row.Counter) - .InColumnValue("tag", row.Tag) - .InColumnValue("last_modified", DateTime.UtcNow)); + var userQuotaRow = FindUserQuotaRow(row.Tenant, row.UserId, row.Path); + if(userQuotaRow == null) + { + db.ExecuteNonQuery(Insert(tenants_quotarow, row.Tenant) + .InColumnValue("path", row.Path) + .InColumnValue("counter", row.Counter) + .InColumnValue("tag", row.Tag) + .InColumnValue("user_id", row.UserId) + .InColumnValue("last_modified", DateTime.UtcNow)); + } + else + { + var update = new SqlUpdate(tenants_quotarow) + .Set("counter", exchange ? userQuotaRow.Counter + row.Counter : row.Counter) + .Set("last_modified", DateTime.UtcNow) + .Where("tenant", row.Tenant) + .Where("path", row.Path) + .Where("user_id", row.UserId); + + db.ExecuteNonQuery(update); + } tx.Commit(); } @@ -118,12 +131,13 @@ public void SetTenantQuotaRow(TenantQuotaRow row, bool exchange) public IEnumerable FindTenantQuotaRows(int tenantId) { - var q = new SqlQuery(tenants_quotarow).Select("tenant", "path", "counter", "tag"); + var q = new SqlQuery(tenants_quotarow).Select("tenant", "path", "counter", "tag", "user_id"); var where = Exp.Empty; if (tenantId != Tenant.DEFAULT_TENANT) { where &= Exp.Eq("tenant", tenantId); + where &= Exp.Eq("user_id", Guid.Empty); } if (where != Exp.Empty) @@ -141,6 +155,88 @@ public IEnumerable FindTenantQuotaRows(int tenantId) }); } + public IEnumerable FindUserQuotaRows(int tenantId, Guid userId, bool useCache) + { + var q = new SqlQuery(tenants_quotarow).Select("tenant", "user_id", "path", "counter", "tag"); + var where = Exp.Empty; + + if (tenantId != Tenant.DEFAULT_TENANT) + { + where &= Exp.Eq("tenant", tenantId); + where &= Exp.Eq("user_id", userId); + } + + if (where != Exp.Empty) + { + q.Where(where); + } + + return ExecList(q) + .ConvertAll(r => new TenantQuotaRow + { + Tenant = Convert.ToInt32(r[0]), + UserId = Guid.Parse((string)r[1]), + Path = (string)r[2], + Counter = Convert.ToInt64(r[3]), + Tag = (string)r[4], + }); + } + + public TenantQuotaRow FindUserQuotaRow(int tenantId, Guid userId, Guid tag) + { + var q = new SqlQuery(tenants_quotarow).Select("tenant", "user_id", "path", "counter", "tag"); + var where = Exp.Empty; + + if (tenantId != Tenant.DEFAULT_TENANT) + { + where &= Exp.Eq("tenant", tenantId); + where &= Exp.Eq("user_id", userId); + where &= Exp.Eq("tag", tag); + } + + if (where != Exp.Empty) + { + q.Where(where); + } + + return ExecList(q) + .ConvertAll(r => new TenantQuotaRow + { + Tenant = Convert.ToInt32(r[0]), + UserId = Guid.Parse((string)r[1]), + Path = (string)r[2], + Counter = Convert.ToInt64(r[3]), + Tag = (string)r[4], + }).SingleOrDefault(); + } + + public TenantQuotaRow FindUserQuotaRow(int tenantId, Guid userId, string path) + { + var q = new SqlQuery(tenants_quotarow).Select("tenant", "user_id", "path", "counter", "tag"); + var where = Exp.Empty; + + if (tenantId != Tenant.DEFAULT_TENANT) + { + where &= Exp.Eq("tenant", tenantId); + where &= Exp.Eq("user_id", userId); + where &= Exp.Eq("path", path); + } + + if (where != Exp.Empty) + { + q.Where(where); + } + + return ExecList(q) + .ConvertAll(r => new TenantQuotaRow + { + Tenant = Convert.ToInt32(r[0]), + UserId = Guid.Parse((string)r[1]), + Path = (string)r[2], + Counter = Convert.ToInt64(r[3]), + Tag = (string)r[4], + }).SingleOrDefault(); + } private static long GetInBytes(long bytes) { diff --git a/common/ASC.Core.Common/Data/DbSettingsManager.cs b/common/ASC.Core.Common/Data/DbSettingsManager.cs index fe54dc497..59862a519 100644 --- a/common/ASC.Core.Common/Data/DbSettingsManager.cs +++ b/common/ASC.Core.Common/Data/DbSettingsManager.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Configuration; @@ -127,14 +127,14 @@ private bool SaveSettingsFor(T settings, int tenantId, Guid userId) where T : } } - internal T LoadSettingsFor(int tenantId, Guid userId) where T : class, ISettings + internal T LoadSettingsFor(int tenantId, Guid userId, bool useCache = true) where T : class, ISettings { var settingsInstance = (ISettings)Activator.CreateInstance(); var key = settingsInstance.ID.ToString() + tenantId + userId; try { - var settings = cache.Get(key); + var settings = useCache ? cache.Get(key) : null; if (settings != null) return settings; using (var db = GetDbManager()) @@ -187,7 +187,7 @@ private byte[] Serialize(ISettings settings) private IDbManager GetDbManager() { - return DbManager.FromHttpContext(dbId); + return new DbManager(dbId); } private DataContractJsonSerializer GetJsonSerializer(Type type) diff --git a/common/ASC.Core.Common/Data/DbSubscriptionService.cs b/common/ASC.Core.Common/Data/DbSubscriptionService.cs index 3377c1104..103edf383 100644 --- a/common/ASC.Core.Common/Data/DbSubscriptionService.cs +++ b/common/ASC.Core.Common/Data/DbSubscriptionService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Data/DbTenantService.cs b/common/ASC.Core.Common/Data/DbTenantService.cs index 252fef23f..8b921e527 100644 --- a/common/ASC.Core.Common/Data/DbTenantService.cs +++ b/common/ASC.Core.Common/Data/DbTenantService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -60,7 +60,7 @@ public IEnumerable GetTenants(DateTime from, bool active = true) ? Exp.Eq("t.status", (int)TenantStatus.Active) : Exp.Empty, from != default(DateTime) - ? Exp.Ge("last_modified", from) + ? Exp.Ge("t.last_modified", from) : Exp.Empty ) ); @@ -124,7 +124,7 @@ public IEnumerable GetTenants(string login, string passwordHash) public Tenant GetTenant(int id) { - return GetTenants(Exp.Eq("id", id)) + return GetTenants(Exp.Eq("t.id", id)) .SingleOrDefault(); } @@ -132,7 +132,7 @@ public Tenant GetTenant(string domain) { if (string.IsNullOrEmpty(domain)) throw new ArgumentNullException("domain"); - return GetTenants(Exp.Eq("alias", domain.ToLowerInvariant()) | Exp.Eq("mappeddomain", domain.ToLowerInvariant())) + return GetTenants(Exp.Eq("t.alias", domain.ToLowerInvariant()) | Exp.Eq("t.mappeddomain", domain.ToLowerInvariant())) .OrderBy(a => a.Status == TenantStatus.Restoring ? TenantStatus.Active : a.Status) .ThenByDescending(a => a.Status == TenantStatus.Restoring ? 0 : a.TenantId) .FirstOrDefault(); diff --git a/common/ASC.Core.Common/Data/DbUserService.cs b/common/ASC.Core.Common/Data/DbUserService.cs index 9a4c0428b..a9691d9fb 100644 --- a/common/ASC.Core.Common/Data/DbUserService.cs +++ b/common/ASC.Core.Common/Data/DbUserService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -88,6 +88,7 @@ public UserInfo GetUserByPasswordHash(int tenant, string login, string passwordH { q = new SqlQuery("core_usersecurity s") .SelectCount() + .Where("s.tenant", user.Tenant) .Where("s.userid", user.ID) .Where(Exp.Eq("s.pwdhash", GetPasswordHash(user.ID, passwordHash))); var count = ExecScalar(q); @@ -167,7 +168,8 @@ public UserInfo SaveUser(int tenant, UserInfo user) .InColumnValue("sid", user.Sid) .InColumnValue("sso_name_id", user.SsoNameId) .InColumnValue("sso_session_id", user.SsoSessionId) - .InColumnValue("create_on", user.CreateDate); + .InColumnValue("create_on", user.CreateDate) + .InColumnValue("user_lead", user.Lead); db.ExecuteNonQuery(i); @@ -353,7 +355,7 @@ private static SqlQuery GetUserQuery() return new SqlQuery("core_user u") .Select("u.id", "u.username", "u.firstname", "u.lastname", "u.sex", "u.bithdate", "u.status", "u.title") .Select("u.workfromdate", "u.terminateddate", "u.contacts", "u.email", "u.location", "u.notes", "u.removed") - .Select("u.last_modified", "u.tenant", "u.activation_status", "u.culture", "u.phone", "u.phone_activation", "u.sid", "u.sso_name_id", "u.sso_session_id", "u.create_on"); + .Select("u.last_modified", "u.tenant", "u.activation_status", "u.culture", "u.phone", "u.phone_activation", "u.sid", "u.sso_name_id", "u.sso_session_id", "u.create_on", "u.user_lead"); } private static SqlQuery GetUserQuery(int tenant, DateTime from) @@ -406,7 +408,8 @@ private static UserInfo ToUser(object[] r) Sid = (string)r[21], SsoNameId = (string)r[22], SsoSessionId = (string)r[23], - CreateDate = Convert.ToDateTime(r[24]) + CreateDate = Convert.ToDateTime(r[24]), + Lead = r[25] != null ? new Guid((string)r[25]) : (Guid?)null }; u.ContactsFromString((string)r[10]); return u; diff --git a/common/ASC.Core.Common/Encryption/EncryprtionStatus.cs b/common/ASC.Core.Common/Encryption/EncryprtionStatus.cs index ea4129bf0..a39a9a920 100644 --- a/common/ASC.Core.Common/Encryption/EncryprtionStatus.cs +++ b/common/ASC.Core.Common/Encryption/EncryprtionStatus.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.Core.Encryption { public enum EncryprtionStatus diff --git a/common/ASC.Core.Common/Encryption/EncryptionSettings.cs b/common/ASC.Core.Common/Encryption/EncryptionSettings.cs index 6b7b4a37b..21b46be0a 100644 --- a/common/ASC.Core.Common/Encryption/EncryptionSettings.cs +++ b/common/ASC.Core.Common/Encryption/EncryptionSettings.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Runtime.Serialization; using System.Security.Cryptography; diff --git a/common/ASC.Core.Common/Encryption/ICrypt.cs b/common/ASC.Core.Common/Encryption/ICrypt.cs index ed14295da..e4c7faf9f 100644 --- a/common/ASC.Core.Common/Encryption/ICrypt.cs +++ b/common/ASC.Core.Common/Encryption/ICrypt.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.IO; namespace ASC.Core.Encryption diff --git a/common/ASC.Core.Common/HostedSolution.cs b/common/ASC.Core.Common/HostedSolution.cs index 47c42ede1..5362ae703 100644 --- a/common/ASC.Core.Common/HostedSolution.cs +++ b/common/ASC.Core.Common/HostedSolution.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -175,9 +175,9 @@ private string CreateAuthenticationCookie(int tenantId, UserInfo user) { if (user == null) return null; - var tenantSettings = settingsManager.LoadSettingsFor(tenantId, Guid.Empty); + var tenantSettings = settingsManager.LoadSettingsFor(tenantId, Guid.Empty, false); var expires = tenantSettings.IsDefault() ? DateTime.UtcNow.AddYears(1) : DateTime.UtcNow.AddMinutes(tenantSettings.LifeTime); - var userSettings = settingsManager.LoadSettingsFor(tenantId, user.ID); + var userSettings = settingsManager.LoadSettingsFor(tenantId, user.ID, false); return CookieStorage.EncryptCookie(tenantId, user.ID, tenantSettings.Index, expires, userSettings.Index, 0); } @@ -186,11 +186,21 @@ public Tariff GetTariff(int tenant, bool withRequestToPaymentSystem = true) return tariffService.GetTariff(tenant, withRequestToPaymentSystem); } + public TenantQuotaSettings GetTenantQuotaSettings(int tenantId) + { + return settingsManager.LoadSettingsFor(tenantId, Guid.Empty, false); + } + public TenantQuota GetTenantQuota(int tenant) { return clientTenantManager.GetTenantQuota(tenant); } + public List FindTenantQuotaRows(int tenant) + { + return clientTenantManager.FindTenantQuotaRows(tenant); + } + public IEnumerable GetTenantQuotas() { return clientTenantManager.GetTenantQuotas(); diff --git a/common/ASC.Core.Common/Logging/LogManager.cs b/common/ASC.Core.Common/Logging/LogManager.cs index e876f4654..8cf5fe21d 100644 --- a/common/ASC.Core.Common/Logging/LogManager.cs +++ b/common/ASC.Core.Common/Logging/LogManager.cs @@ -1,31 +1,53 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; + using ASC.Core; namespace ASC.Common.Logging { public class LogManager - { + { + private static bool CoreContextEnabled { get; set; } + + static LogManager() + { + try + { + var tenantManager = CoreContext.TenantManager; + if (tenantManager != null) + { + CoreContextEnabled = true; + } + } + catch (Exception) + { + CoreContextEnabled = false; + } + } + public static ILog GetLogger(string name) { - return BaseLogManager.GetLogger(name, () => - { - var tenant = CoreContext.TenantManager.GetCurrentTenant(false); + return BaseLogManager.GetLogger(name, () => + { + if (!CoreContextEnabled) return null; + + var tenant = CoreContext.TenantManager.GetCurrentTenant(false); return tenant == null ? null : tenant.TenantAlias; }); } diff --git a/common/ASC.Core.Common/Messaging/MessageAction.cs b/common/ASC.Core.Common/Messaging/MessageAction.cs index f46d4089e..ce84ab08a 100644 --- a/common/ASC.Core.Common/Messaging/MessageAction.cs +++ b/common/ASC.Core.Common/Messaging/MessageAction.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -535,6 +535,9 @@ public enum MessageAction ContactAdminMailSent = 7000, + ImpersonateUserLogin = 7001, + ImpersonateUserLogout = 7002, // last others + #endregion #region Partners diff --git a/common/ASC.Core.Common/MultiRegionHostedSolution.cs b/common/ASC.Core.Common/MultiRegionHostedSolution.cs index 60292249a..975802d41 100644 --- a/common/ASC.Core.Common/MultiRegionHostedSolution.cs +++ b/common/ASC.Core.Common/MultiRegionHostedSolution.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -158,12 +158,12 @@ public IEnumerable GetRegions() public IDbManager GetRegionDb(string region) { - return DbManager.FromHttpContext(GetRegionService(region).DbId); + return new DbManager(GetRegionService(region).DbId); } public IDbManager GetMultiRegionDb() { - return new MultiRegionalDbManager(GetRegions().Select(r => DbManager.FromHttpContext(GetRegionService(r).DbId))); + return new MultiRegionalDbManager(GetRegions().Select(r => new DbManager(GetRegionService(r).DbId))); } public ConnectionStringSettings GetRegionConnectionString(string region) @@ -241,7 +241,7 @@ private void Initialize() { try { - using (var db = DbManager.FromHttpContext(connectionString.Name)) + using (var db = new DbManager(connectionString.Name)) { var q = new SqlQuery("regions") .Select("region") diff --git a/common/ASC.Core.Common/Notify/DirectSubscriptionProvider.cs b/common/ASC.Core.Common/Notify/DirectSubscriptionProvider.cs index b247a2dd9..90ad81d5e 100644 --- a/common/ASC.Core.Common/Notify/DirectSubscriptionProvider.cs +++ b/common/ASC.Core.Common/Notify/DirectSubscriptionProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/EmailSenderSink.cs b/common/ASC.Core.Common/Notify/EmailSenderSink.cs index dd5221da9..b031181fe 100644 --- a/common/ASC.Core.Common/Notify/EmailSenderSink.cs +++ b/common/ASC.Core.Common/Notify/EmailSenderSink.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/FirebaseApiKey.cs b/common/ASC.Core.Common/Notify/FirebaseApiKey.cs index 464f5b489..243969f22 100644 --- a/common/ASC.Core.Common/Notify/FirebaseApiKey.cs +++ b/common/ASC.Core.Common/Notify/FirebaseApiKey.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.Configuration; using Newtonsoft.Json; diff --git a/common/ASC.Core.Common/Notify/Jabber/IJabberService.cs b/common/ASC.Core.Common/Notify/Jabber/IJabberService.cs index 874d32e72..5ac5523a7 100644 --- a/common/ASC.Core.Common/Notify/Jabber/IJabberService.cs +++ b/common/ASC.Core.Common/Notify/Jabber/IJabberService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Jabber/IReverseJabberService.cs b/common/ASC.Core.Common/Notify/Jabber/IReverseJabberService.cs index efe144e72..90b16e176 100644 --- a/common/ASC.Core.Common/Notify/Jabber/IReverseJabberService.cs +++ b/common/ASC.Core.Common/Notify/Jabber/IReverseJabberService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Jabber/JabberServiceClient.cs b/common/ASC.Core.Common/Notify/Jabber/JabberServiceClient.cs index 5d8ff33d6..9a96bd4c0 100644 --- a/common/ASC.Core.Common/Notify/Jabber/JabberServiceClient.cs +++ b/common/ASC.Core.Common/Notify/Jabber/JabberServiceClient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Jabber/JabberServiceClientWcf.cs b/common/ASC.Core.Common/Notify/Jabber/JabberServiceClientWcf.cs index 57376570b..f1eaef5d2 100644 --- a/common/ASC.Core.Common/Notify/Jabber/JabberServiceClientWcf.cs +++ b/common/ASC.Core.Common/Notify/Jabber/JabberServiceClientWcf.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Jabber/MessageStruct.cs b/common/ASC.Core.Common/Notify/Jabber/MessageStruct.cs index 0d15a5261..d3f3822f6 100644 --- a/common/ASC.Core.Common/Notify/Jabber/MessageStruct.cs +++ b/common/ASC.Core.Common/Notify/Jabber/MessageStruct.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/JabberSenderSink.cs b/common/ASC.Core.Common/Notify/JabberSenderSink.cs index 226b4d766..87b225cff 100644 --- a/common/ASC.Core.Common/Notify/JabberSenderSink.cs +++ b/common/ASC.Core.Common/Notify/JabberSenderSink.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/MentionProvider.cs b/common/ASC.Core.Common/Notify/MentionProvider.cs index 4200257a2..4607a1953 100644 --- a/common/ASC.Core.Common/Notify/MentionProvider.cs +++ b/common/ASC.Core.Common/Notify/MentionProvider.cs @@ -1,4 +1,21 @@ -using System.Linq; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System.Linq; using System.Text.RegularExpressions; using ASC.Core.Users; diff --git a/common/ASC.Core.Common/Notify/NotifyServiceClient.cs b/common/ASC.Core.Common/Notify/NotifyServiceClient.cs index 9c1063bb5..36833aa9a 100644 --- a/common/ASC.Core.Common/Notify/NotifyServiceClient.cs +++ b/common/ASC.Core.Common/Notify/NotifyServiceClient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/NotifySource.cs b/common/ASC.Core.Common/Notify/NotifySource.cs index 25b187868..ba86ab16c 100644 --- a/common/ASC.Core.Common/Notify/NotifySource.cs +++ b/common/ASC.Core.Common/Notify/NotifySource.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Push/Dao/FireBaseUser.cs b/common/ASC.Core.Common/Notify/Push/Dao/FireBaseUser.cs index bc030cb00..c5d11ffc1 100644 --- a/common/ASC.Core.Common/Notify/Push/Dao/FireBaseUser.cs +++ b/common/ASC.Core.Common/Notify/Push/Dao/FireBaseUser.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; namespace ASC.Core.Common.Notify.FireBase.Dao { diff --git a/common/ASC.Core.Common/Notify/Push/Dao/FirebaseDao.cs b/common/ASC.Core.Common/Notify/Push/Dao/FirebaseDao.cs index b811bfbd6..733702ca0 100644 --- a/common/ASC.Core.Common/Notify/Push/Dao/FirebaseDao.cs +++ b/common/ASC.Core.Common/Notify/Push/Dao/FirebaseDao.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.Collections.Generic; using System.Linq; @@ -81,7 +98,7 @@ public FireBaseUser UpdateUser(Guid userId, int tenantId, string fbDeviceToken, private IDbManager GetDbManager() { - return DbManager.FromHttpContext("default"); + return new DbManager("default"); } } diff --git a/common/ASC.Core.Common/Notify/Push/Dao/NotifyData.cs b/common/ASC.Core.Common/Notify/Push/Dao/NotifyData.cs index 681b120ac..0cf02f16a 100644 --- a/common/ASC.Core.Common/Notify/Push/Dao/NotifyData.cs +++ b/common/ASC.Core.Common/Notify/Push/Dao/NotifyData.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.Runtime.Serialization; using Newtonsoft.Json; diff --git a/common/ASC.Core.Common/Notify/Push/Dao/NotifyFileData.cs b/common/ASC.Core.Common/Notify/Push/Dao/NotifyFileData.cs index 61309a931..714328054 100644 --- a/common/ASC.Core.Common/Notify/Push/Dao/NotifyFileData.cs +++ b/common/ASC.Core.Common/Notify/Push/Dao/NotifyFileData.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.Runtime.Serialization; using Newtonsoft.Json; diff --git a/common/ASC.Core.Common/Notify/Push/Dao/NotifyFolderData.cs b/common/ASC.Core.Common/Notify/Push/Dao/NotifyFolderData.cs index 9fb7202bf..be31ad25b 100644 --- a/common/ASC.Core.Common/Notify/Push/Dao/NotifyFolderData.cs +++ b/common/ASC.Core.Common/Notify/Push/Dao/NotifyFolderData.cs @@ -1,4 +1,21 @@ -using System.Runtime.Serialization; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System.Runtime.Serialization; using Newtonsoft.Json; namespace ASC.Core.Common.Notify.FireBase.Dao diff --git a/common/ASC.Core.Common/Notify/Push/Enums.cs b/common/ASC.Core.Common/Notify/Push/Enums.cs index afc306390..0a7f8fabc 100644 --- a/common/ASC.Core.Common/Notify/Push/Enums.cs +++ b/common/ASC.Core.Common/Notify/Push/Enums.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Push/FirebaseHelper.cs b/common/ASC.Core.Common/Notify/Push/FirebaseHelper.cs index 2d0e24d08..19e4864dd 100644 --- a/common/ASC.Core.Common/Notify/Push/FirebaseHelper.cs +++ b/common/ASC.Core.Common/Notify/Push/FirebaseHelper.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.Collections.Generic; using ASC.Common.Logging; diff --git a/common/ASC.Core.Common/Notify/Push/IPushService.cs b/common/ASC.Core.Common/Notify/Push/IPushService.cs index 6e5117a84..573e23b36 100644 --- a/common/ASC.Core.Common/Notify/Push/IPushService.cs +++ b/common/ASC.Core.Common/Notify/Push/IPushService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Push/PushConstants.cs b/common/ASC.Core.Common/Notify/Push/PushConstants.cs index 380972ca2..ea6ecb1cd 100644 --- a/common/ASC.Core.Common/Notify/Push/PushConstants.cs +++ b/common/ASC.Core.Common/Notify/Push/PushConstants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Push/PushNotification.cs b/common/ASC.Core.Common/Notify/Push/PushNotification.cs index 632dc9dd7..09c8d8c68 100644 --- a/common/ASC.Core.Common/Notify/Push/PushNotification.cs +++ b/common/ASC.Core.Common/Notify/Push/PushNotification.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Push/PushServiceClient.cs b/common/ASC.Core.Common/Notify/Push/PushServiceClient.cs index 593b4d547..11fcc08a3 100644 --- a/common/ASC.Core.Common/Notify/Push/PushServiceClient.cs +++ b/common/ASC.Core.Common/Notify/Push/PushServiceClient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/PushSenderSink.cs b/common/ASC.Core.Common/Notify/PushSenderSink.cs index 2935f1c31..e56a73d7d 100644 --- a/common/ASC.Core.Common/Notify/PushSenderSink.cs +++ b/common/ASC.Core.Common/Notify/PushSenderSink.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/RecipientProviderImpl.cs b/common/ASC.Core.Common/Notify/RecipientProviderImpl.cs index b37538ec5..0f0a520a3 100644 --- a/common/ASC.Core.Common/Notify/RecipientProviderImpl.cs +++ b/common/ASC.Core.Common/Notify/RecipientProviderImpl.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Senders/AWSSender.cs b/common/ASC.Core.Common/Notify/Senders/AWSSender.cs index 5be3313da..f2f5eed72 100644 --- a/common/ASC.Core.Common/Notify/Senders/AWSSender.cs +++ b/common/ASC.Core.Common/Notify/Senders/AWSSender.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Senders/INotifySender.cs b/common/ASC.Core.Common/Notify/Senders/INotifySender.cs index 98efa41da..759b1f65a 100644 --- a/common/ASC.Core.Common/Notify/Senders/INotifySender.cs +++ b/common/ASC.Core.Common/Notify/Senders/INotifySender.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Senders/JabberSender.cs b/common/ASC.Core.Common/Notify/Senders/JabberSender.cs index 2dfe18933..2f0a2cbb0 100644 --- a/common/ASC.Core.Common/Notify/Senders/JabberSender.cs +++ b/common/ASC.Core.Common/Notify/Senders/JabberSender.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Senders/NoticeSendResult.cs b/common/ASC.Core.Common/Notify/Senders/NoticeSendResult.cs index 4862056eb..41a46919a 100644 --- a/common/ASC.Core.Common/Notify/Senders/NoticeSendResult.cs +++ b/common/ASC.Core.Common/Notify/Senders/NoticeSendResult.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Senders/NotifyServiceSender.cs b/common/ASC.Core.Common/Notify/Senders/NotifyServiceSender.cs index f50aa6f21..d0b32f823 100644 --- a/common/ASC.Core.Common/Notify/Senders/NotifyServiceSender.cs +++ b/common/ASC.Core.Common/Notify/Senders/NotifyServiceSender.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Senders/PushSender.cs b/common/ASC.Core.Common/Notify/Senders/PushSender.cs index 1b6d88b96..4394b83b5 100644 --- a/common/ASC.Core.Common/Notify/Senders/PushSender.cs +++ b/common/ASC.Core.Common/Notify/Senders/PushSender.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Text.RegularExpressions; diff --git a/common/ASC.Core.Common/Notify/Senders/SmtpSender.cs b/common/ASC.Core.Common/Notify/Senders/SmtpSender.cs index a8a47378a..29d1e3caa 100644 --- a/common/ASC.Core.Common/Notify/Senders/SmtpSender.cs +++ b/common/ASC.Core.Common/Notify/Senders/SmtpSender.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,6 +50,7 @@ internal class SmtpSender : INotifySender private int _port; private bool _ssl; private ICredentials _credentials; + private SaslMechanism _saslMechanism; const int NETWORK_TIMEOUT = 30000; public SmtpSender() @@ -90,9 +91,9 @@ private void BuildSmtpSettings() if (_initProperties.ContainsKey("userName")) { - _credentials = new NetworkCredential( - _initProperties["userName"], - _initProperties["password"]); + var useNtlm = _initProperties.ContainsKey("useNtlm") && bool.Parse(_initProperties["useNtlm"]); + _credentials = !useNtlm ? new NetworkCredential(_initProperties["userName"], _initProperties["password"]) : null; + _saslMechanism = useNtlm ? new SaslMechanismNtlm(_initProperties["userName"], _initProperties["password"]) : null; } } else @@ -101,10 +102,13 @@ private void BuildSmtpSettings() _host = s.Host; _port = s.Port; - _ssl = s.EnableSSL; - _credentials = !string.IsNullOrEmpty(s.CredentialsUserName) - ? new NetworkCredential(s.CredentialsUserName, s.CredentialsUserPassword) - : null; + _ssl = s.EnableSSL; + + if (!string.IsNullOrEmpty(s.CredentialsUserName)) + { + _credentials = !s.UseNtlm ? new NetworkCredential(s.CredentialsUserName, s.CredentialsUserPassword) : null; + _saslMechanism = s.UseNtlm ? new SaslMechanismNtlm(s.CredentialsUserName, s.CredentialsUserPassword) : null; + } } } @@ -131,6 +135,10 @@ public virtual NoticeSendResult Send(NotifyMessage m) { smtpClient.Authenticate(_credentials); } + else if (_saslMechanism != null) + { + smtpClient.Authenticate(_saslMechanism); + } smtpClient.Send(mail); result = NoticeSendResult.OK; diff --git a/common/ASC.Core.Common/Notify/Senders/TelegramSender.cs b/common/ASC.Core.Common/Notify/Senders/TelegramSender.cs index 18f1adfc9..66ec7d853 100644 --- a/common/ASC.Core.Common/Notify/Senders/TelegramSender.cs +++ b/common/ASC.Core.Common/Notify/Senders/TelegramSender.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Text.RegularExpressions; diff --git a/common/ASC.Core.Common/Notify/Signalr/ISignalrService.cs b/common/ASC.Core.Common/Notify/Signalr/ISignalrService.cs index 98c3b8ac8..97bf6aadc 100644 --- a/common/ASC.Core.Common/Notify/Signalr/ISignalrService.cs +++ b/common/ASC.Core.Common/Notify/Signalr/ISignalrService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Signalr/MailNotificationState.cs b/common/ASC.Core.Common/Notify/Signalr/MailNotificationState.cs index c90041054..e3f56bf5b 100644 --- a/common/ASC.Core.Common/Notify/Signalr/MailNotificationState.cs +++ b/common/ASC.Core.Common/Notify/Signalr/MailNotificationState.cs @@ -1,19 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.Core.Common.Notify.Signalr { public enum MailNotificationState diff --git a/common/ASC.Core.Common/Notify/Signalr/SignalrServiceClient.cs b/common/ASC.Core.Common/Notify/Signalr/SignalrServiceClient.cs index c2d84c947..d9b8ddfd5 100644 --- a/common/ASC.Core.Common/Notify/Signalr/SignalrServiceClient.cs +++ b/common/ASC.Core.Common/Notify/Signalr/SignalrServiceClient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Notify/Telegram/Dao/CachedTelegramDao.cs b/common/ASC.Core.Common/Notify/Telegram/Dao/CachedTelegramDao.cs index 50dbc9a7f..888401ecf 100644 --- a/common/ASC.Core.Common/Notify/Telegram/Dao/CachedTelegramDao.cs +++ b/common/ASC.Core.Common/Notify/Telegram/Dao/CachedTelegramDao.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Linq; diff --git a/common/ASC.Core.Common/Notify/Telegram/Dao/TelegramDao.cs b/common/ASC.Core.Common/Notify/Telegram/Dao/TelegramDao.cs index b9fa0eb14..9d155d19a 100644 --- a/common/ASC.Core.Common/Notify/Telegram/Dao/TelegramDao.cs +++ b/common/ASC.Core.Common/Notify/Telegram/Dao/TelegramDao.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; @@ -92,7 +92,7 @@ public void Delete(int telegramId) private IDbManager GetDbManager() { - return DbManager.FromHttpContext(_databaseID); + return new DbManager(_databaseID); } } } diff --git a/common/ASC.Core.Common/Notify/Telegram/Dao/TelegramUser.cs b/common/ASC.Core.Common/Notify/Telegram/Dao/TelegramUser.cs index af0c1fecf..5f34bb867 100644 --- a/common/ASC.Core.Common/Notify/Telegram/Dao/TelegramUser.cs +++ b/common/ASC.Core.Common/Notify/Telegram/Dao/TelegramUser.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; namespace ASC.Core.Common.Notify.Telegram diff --git a/common/ASC.Core.Common/Notify/Telegram/ITelegramLoginProvider.cs b/common/ASC.Core.Common/Notify/Telegram/ITelegramLoginProvider.cs index 24aa24b64..fecd98ae9 100644 --- a/common/ASC.Core.Common/Notify/Telegram/ITelegramLoginProvider.cs +++ b/common/ASC.Core.Common/Notify/Telegram/ITelegramLoginProvider.cs @@ -1,19 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.Core.Common.Notify.Telegram { public interface ITelegramLoginProvider diff --git a/common/ASC.Core.Common/Notify/Telegram/ITelegramService.cs b/common/ASC.Core.Common/Notify/Telegram/ITelegramService.cs index 958beb24e..04a6c43bf 100644 --- a/common/ASC.Core.Common/Notify/Telegram/ITelegramService.cs +++ b/common/ASC.Core.Common/Notify/Telegram/ITelegramService.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.ServiceModel; using ASC.Notify.Messages; diff --git a/common/ASC.Core.Common/Notify/Telegram/TelegramHelper.cs b/common/ASC.Core.Common/Notify/Telegram/TelegramHelper.cs index 790b5078d..0121ebb8e 100644 --- a/common/ASC.Core.Common/Notify/Telegram/TelegramHelper.cs +++ b/common/ASC.Core.Common/Notify/Telegram/TelegramHelper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Linq; using System.Security.Cryptography; diff --git a/common/ASC.Core.Common/Notify/Telegram/TelegramSenderSink.cs b/common/ASC.Core.Common/Notify/Telegram/TelegramSenderSink.cs index a24f55a55..0003b45c4 100644 --- a/common/ASC.Core.Common/Notify/Telegram/TelegramSenderSink.cs +++ b/common/ASC.Core.Common/Notify/Telegram/TelegramSenderSink.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Core.Notify.Senders; diff --git a/common/ASC.Core.Common/Notify/Telegram/TelegramServiceClient.cs b/common/ASC.Core.Common/Notify/Telegram/TelegramServiceClient.cs index a7466e74c..9b958b38c 100644 --- a/common/ASC.Core.Common/Notify/Telegram/TelegramServiceClient.cs +++ b/common/ASC.Core.Common/Notify/Telegram/TelegramServiceClient.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Common.Module; diff --git a/common/ASC.Core.Common/Security/Authentication/CookieStorage.cs b/common/ASC.Core.Common/Security/Authentication/CookieStorage.cs index 8b805bdfe..a8906fcad 100644 --- a/common/ASC.Core.Common/Security/Authentication/CookieStorage.cs +++ b/common/ASC.Core.Common/Security/Authentication/CookieStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Security/Authentication/UserAccount.cs b/common/ASC.Core.Common/Security/Authentication/UserAccount.cs index 6698c2485..ee3e8f293 100644 --- a/common/ASC.Core.Common/Security/Authentication/UserAccount.cs +++ b/common/ASC.Core.Common/Security/Authentication/UserAccount.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Security/Authorizing/PermissionProvider.cs b/common/ASC.Core.Common/Security/Authorizing/PermissionProvider.cs index 463448fc1..59016126f 100644 --- a/common/ASC.Core.Common/Security/Authorizing/PermissionProvider.cs +++ b/common/ASC.Core.Common/Security/Authorizing/PermissionProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Security/Authorizing/PermissionResolver.cs b/common/ASC.Core.Common/Security/Authorizing/PermissionResolver.cs index 9c9ca8b21..75fece10e 100644 --- a/common/ASC.Core.Common/Security/Authorizing/PermissionResolver.cs +++ b/common/ASC.Core.Common/Security/Authorizing/PermissionResolver.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Security/Authorizing/RoleProvider.cs b/common/ASC.Core.Common/Security/Authorizing/RoleProvider.cs index d20c16055..444b229e6 100644 --- a/common/ASC.Core.Common/Security/Authorizing/RoleProvider.cs +++ b/common/ASC.Core.Common/Security/Authorizing/RoleProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Security/Crypto.cs b/common/ASC.Core.Common/Security/Crypto.cs index 633eee006..d9ee3afd6 100644 --- a/common/ASC.Core.Common/Security/Crypto.cs +++ b/common/ASC.Core.Common/Security/Crypto.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Security/EmailValidationKeyProvider.cs b/common/ASC.Core.Common/Security/EmailValidationKeyProvider.cs index d395153bb..26c25eb7d 100644 --- a/common/ASC.Core.Common/Security/EmailValidationKeyProvider.cs +++ b/common/ASC.Core.Common/Security/EmailValidationKeyProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Security/UserSecurityProvider.cs b/common/ASC.Core.Common/Security/UserSecurityProvider.cs index fe3a05e19..d96fceef2 100644 --- a/common/ASC.Core.Common/Security/UserSecurityProvider.cs +++ b/common/ASC.Core.Common/Security/UserSecurityProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Settings/ISettings.cs b/common/ASC.Core.Common/Settings/ISettings.cs index a0a210217..d2b8f2f15 100644 --- a/common/ASC.Core.Common/Settings/ISettings.cs +++ b/common/ASC.Core.Common/Settings/ISettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Settings/SettingsManager.cs b/common/ASC.Core.Common/Settings/SettingsManager.cs index dae8c4e3f..460f1423f 100644 --- a/common/ASC.Core.Common/Settings/SettingsManager.cs +++ b/common/ASC.Core.Common/Settings/SettingsManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Tenants/Tenant.cs b/common/ASC.Core.Common/Tenants/Tenant.cs index fab76db8c..391bf366d 100644 --- a/common/ASC.Core.Common/Tenants/Tenant.cs +++ b/common/ASC.Core.Common/Tenants/Tenant.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,55 +55,80 @@ public Tenant(int id, string alias) TenantId = id; } - + ///1 public int TenantId { get; internal set; } + ///TenantAlias public string TenantAlias { get; set; } + ///MappedDomain public string MappedDomain { get; set; } + ///1 public int Version { get; set; } + ///2019-07-26T00:00:00 public DateTime VersionChanged { get; set; } + ///TenantDomain public string TenantDomain { get { return GetTenantDomain(); } } + ///HostedRegion public string HostedRegion { get; set; } + ///Name public string Name { get; set; } + ///Language public string Language { get; set; } + ///TimeZone public TimeZoneInfo TimeZone { get; set; } + ///TrustedDomains + ///list public List TrustedDomains { get; private set; } + ///1 public TenantTrustedDomainsType TrustedDomainsType { get; set; } + ///38c0f464-f1e7-493e-8d95-dc4ee8ee834a public Guid OwnerId { get; set; } + ///2019-07-26T00:00:00 public DateTime CreatedDateTime { get; internal set; } + ///ru-RU public CultureInfo GetCulture() { return !string.IsNullOrEmpty(Language) ? CultureInfo.GetCultureInfo(Language) : CultureInfo.CurrentCulture; } + ///2019-07-26T00:00:00 public DateTime LastModified { get; set; } + ///1 public TenantStatus Status { get; internal set; } + ///2019-07-26T00:00:00 public DateTime StatusChangeDate { get; internal set; } + ///PartnerId public string PartnerId { get; set; } + ///AffiliateId public string AffiliateId { get; set; } + ///Campaign public string Campaign { get; set; } + ///PaymentId public string PaymentId { get; set; } + ///1 public TenantIndustry Industry { get; set; } + ///true public bool Spam { get; set; } + ///true public bool Calls { get; set; } public void SetStatus(TenantStatus status) diff --git a/common/ASC.Core.Common/Tenants/TenantAuditSettings.cs b/common/ASC.Core.Common/Tenants/TenantAuditSettings.cs index 4f3551413..9296bc18b 100644 --- a/common/ASC.Core.Common/Tenants/TenantAuditSettings.cs +++ b/common/ASC.Core.Common/Tenants/TenantAuditSettings.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Runtime.Serialization; diff --git a/common/ASC.Core.Common/Tenants/TenantControlPanelSettings.cs b/common/ASC.Core.Common/Tenants/TenantControlPanelSettings.cs index 46d45612b..41cccbf04 100644 --- a/common/ASC.Core.Common/Tenants/TenantControlPanelSettings.cs +++ b/common/ASC.Core.Common/Tenants/TenantControlPanelSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Tenants/TenantCookieSettings.cs b/common/ASC.Core.Common/Tenants/TenantCookieSettings.cs index 1762f745c..3f821fd1e 100644 --- a/common/ASC.Core.Common/Tenants/TenantCookieSettings.cs +++ b/common/ASC.Core.Common/Tenants/TenantCookieSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Tenants/TenantDomainValidator.cs b/common/ASC.Core.Common/Tenants/TenantDomainValidator.cs index 74b22c933..029b1434c 100644 --- a/common/ASC.Core.Common/Tenants/TenantDomainValidator.cs +++ b/common/ASC.Core.Common/Tenants/TenantDomainValidator.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Tenants/TenantExceptions.cs b/common/ASC.Core.Common/Tenants/TenantExceptions.cs index 8e43bacf8..9549b9c7f 100644 --- a/common/ASC.Core.Common/Tenants/TenantExceptions.cs +++ b/common/ASC.Core.Common/Tenants/TenantExceptions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Tenants/TenantIndustry.cs b/common/ASC.Core.Common/Tenants/TenantIndustry.cs index 766a7d591..e974192f7 100644 --- a/common/ASC.Core.Common/Tenants/TenantIndustry.cs +++ b/common/ASC.Core.Common/Tenants/TenantIndustry.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Tenants/TenantQuota.cs b/common/ASC.Core.Common/Tenants/TenantQuota.cs index 16b23d493..adc295fe9 100644 --- a/common/ASC.Core.Common/Tenants/TenantQuota.cs +++ b/common/ASC.Core.Common/Tenants/TenantQuota.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,33 +34,53 @@ public class TenantQuota : ICloneable ActiveUsers = int.MaxValue, }; + ///234 + ///10 [DataMember(Name = "Id", Order = 10)] public int Id { get; private set; } + ///Name + ///20 [DataMember(Name = "Name", Order = 20)] public string Name { get; set; } + ///12345 + ///30 [DataMember(Name = "MaxFileSize", Order = 30)] public long MaxFileSize { get; set; } + ///12345 + ///40 [DataMember(Name = "MaxTotalSize", Order = 40)] public long MaxTotalSize { get; set; } + ///2 + ///50 [DataMember(Name = "ActiveUsers", Order = 50)] public int ActiveUsers { get; set; } + ///Features + ///60 [DataMember(Name = "Features", Order = 60)] public string Features { get; set; } + ///22.5 + ///70 [DataMember(Name = "Price", Order = 70)] public decimal Price { get; set; } + ///AvangateId + ///90 [DataMember(Name = "AvangateId", Order = 90)] public string AvangateId { get; set; } + ///true + ///100 [DataMember(Name = "Visible", Order = 100)] public bool Visible { get; set; } + ///true + ///110 [DataMember(Name = "Year", Order = 110)] public bool Year { @@ -68,6 +88,8 @@ public bool Year set { SetFeature("year", value); } } + ///true + ///110 [DataMember(Name = "Year3", Order = 110)] public bool Year3 { diff --git a/common/ASC.Core.Common/Tenants/TenantQuotaException.cs b/common/ASC.Core.Common/Tenants/TenantQuotaException.cs index a416aa484..4a2a954e1 100644 --- a/common/ASC.Core.Common/Tenants/TenantQuotaException.cs +++ b/common/ASC.Core.Common/Tenants/TenantQuotaException.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Tenants/TenantQuotaRow.cs b/common/ASC.Core.Common/Tenants/TenantQuotaRow.cs index e291afc4f..005044e64 100644 --- a/common/ASC.Core.Common/Tenants/TenantQuotaRow.cs +++ b/common/ASC.Core.Common/Tenants/TenantQuotaRow.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,5 +29,8 @@ public class TenantQuotaRow public long Counter { get; set; } public string Tag { get; set; } + + public Guid UserId { get; set; } + } } \ No newline at end of file diff --git a/common/ASC.Core.Common/Tenants/TenantQuotaSettings.cs b/common/ASC.Core.Common/Tenants/TenantQuotaSettings.cs new file mode 100644 index 000000000..ddfe242b6 --- /dev/null +++ b/common/ASC.Core.Common/Tenants/TenantQuotaSettings.cs @@ -0,0 +1,46 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Runtime.Serialization; + +using ASC.Core.Common.Settings; + + +namespace ASC.Core.Tenants +{ + [Serializable] + [DataContract] + public class TenantQuotaSettings : BaseSettings + { + [DataMember] + public bool DisableQuota { get; set; } + + public override ISettings GetDefault() + { + return new TenantQuotaSettings + { + DisableQuota = false + }; + } + + public override Guid ID + { + get { return new Guid("{62609D95-35D3-4F14-A6BA-2118979E04EA}"); } + } + } +} diff --git a/common/ASC.Core.Common/Tenants/TenantQuotaType.cs b/common/ASC.Core.Common/Tenants/TenantQuotaType.cs index 4ae58282c..c56f160eb 100644 --- a/common/ASC.Core.Common/Tenants/TenantQuotaType.cs +++ b/common/ASC.Core.Common/Tenants/TenantQuotaType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Tenants/TenantRegistrationInfo.cs b/common/ASC.Core.Common/Tenants/TenantRegistrationInfo.cs index 18a9e6c9b..21318e2e1 100644 --- a/common/ASC.Core.Common/Tenants/TenantRegistrationInfo.cs +++ b/common/ASC.Core.Common/Tenants/TenantRegistrationInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Tenants/TenantStatus.cs b/common/ASC.Core.Common/Tenants/TenantStatus.cs index aa406ff4a..5707bf8e7 100644 --- a/common/ASC.Core.Common/Tenants/TenantStatus.cs +++ b/common/ASC.Core.Common/Tenants/TenantStatus.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Tenants/TenantTrustedDomainsType.cs b/common/ASC.Core.Common/Tenants/TenantTrustedDomainsType.cs index 318d6ef16..3af42c3dc 100644 --- a/common/ASC.Core.Common/Tenants/TenantTrustedDomainsType.cs +++ b/common/ASC.Core.Common/Tenants/TenantTrustedDomainsType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Tenants/TenantUserQuotaSettings.cs b/common/ASC.Core.Common/Tenants/TenantUserQuotaSettings.cs new file mode 100644 index 000000000..9e6c0b429 --- /dev/null +++ b/common/ASC.Core.Common/Tenants/TenantUserQuotaSettings.cs @@ -0,0 +1,53 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Runtime.Serialization; +using ASC.Core.Common.Settings; + + +namespace ASC.Core.Tenants +{ + [Serializable] + [DataContract] + public class TenantUserQuotaSettings : BaseSettings + { + [DataMember] + public bool EnableUserQuota { get; set; } + [DataMember] + public long DefaultUserQuota { get; set; } + + [DataMember(IsRequired = false, EmitDefaultValue = false)] + public DateTime LastRecalculateDate { get; set; } + + public override ISettings GetDefault() + { + return new TenantUserQuotaSettings + { + EnableUserQuota = false, + DefaultUserQuota = -1, + LastRecalculateDate = new DateTime(0L, DateTimeKind.Unspecified) + }; + } + + + public override Guid ID + { + get { return new Guid("{5FE28053-BCD4-466B-8A4B-71B612F0D6FC}"); } + } + } +} diff --git a/common/ASC.Core.Common/Tenants/TenantUtil.cs b/common/ASC.Core.Common/Tenants/TenantUtil.cs index 4306c20d8..771524478 100644 --- a/common/ASC.Core.Common/Tenants/TenantUtil.cs +++ b/common/ASC.Core.Common/Tenants/TenantUtil.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Tenants/TenantVersion.cs b/common/ASC.Core.Common/Tenants/TenantVersion.cs index 8cedf04e1..04de4a2f6 100644 --- a/common/ASC.Core.Common/Tenants/TenantVersion.cs +++ b/common/ASC.Core.Common/Tenants/TenantVersion.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Users/Constants.cs b/common/ASC.Core.Common/Users/Constants.cs index 06d1abef0..9a089607a 100644 --- a/common/ASC.Core.Common/Users/Constants.cs +++ b/common/ASC.Core.Common/Users/Constants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Users/DisplayUserNameFormat.cs b/common/ASC.Core.Common/Users/DisplayUserNameFormat.cs index 614c964c5..ea995069b 100644 --- a/common/ASC.Core.Common/Users/DisplayUserNameFormat.cs +++ b/common/ASC.Core.Common/Users/DisplayUserNameFormat.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Users/PersonalQuotaSettings.cs b/common/ASC.Core.Common/Users/PersonalQuotaSettings.cs index 93169bfde..c6204f266 100644 --- a/common/ASC.Core.Common/Users/PersonalQuotaSettings.cs +++ b/common/ASC.Core.Common/Users/PersonalQuotaSettings.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Runtime.Serialization; diff --git a/common/ASC.Core.Common/Users/UserExtensions.cs b/common/ASC.Core.Common/Users/UserExtensions.cs index be0dacf77..69c2b70bc 100644 --- a/common/ASC.Core.Common/Users/UserExtensions.cs +++ b/common/ASC.Core.Common/Users/UserExtensions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Users/UserFormatter.cs b/common/ASC.Core.Common/Users/UserFormatter.cs index 0378f2a68..1619d0a6d 100644 --- a/common/ASC.Core.Common/Users/UserFormatter.cs +++ b/common/ASC.Core.Common/Users/UserFormatter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Core.Common/Users/UserQuotaSettings.cs b/common/ASC.Core.Common/Users/UserQuotaSettings.cs new file mode 100644 index 000000000..f146a9602 --- /dev/null +++ b/common/ASC.Core.Common/Users/UserQuotaSettings.cs @@ -0,0 +1,46 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Runtime.Serialization; + +using ASC.Core.Common.Settings; + +namespace ASC.Core.Users +{ + [Serializable] + [DataContract] + public class UserQuotaSettings : BaseSettings + { + [DataMember] + public long UserQuota { get; set; } + + public override ISettings GetDefault() + { + return new UserQuotaSettings + { + UserQuota = -1 + }; + } + + + public override Guid ID + { + get { return new Guid("{5A097CFA-1A8E-45CB-A4BB-FE8D2B5E5908}"); } + } + } +} diff --git a/common/ASC.Data.Backup.Console/Program.cs b/common/ASC.Data.Backup.Console/Program.cs index 461558f8a..7f2c1d09e 100644 --- a/common/ASC.Data.Backup.Console/Program.cs +++ b/common/ASC.Data.Backup.Console/Program.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup.Restore/MainForm.cs b/common/ASC.Data.Backup.Restore/MainForm.cs index 3b273444c..258eb9358 100644 --- a/common/ASC.Data.Backup.Restore/MainForm.cs +++ b/common/ASC.Data.Backup.Restore/MainForm.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup.Restore/Program.cs b/common/ASC.Data.Backup.Restore/Program.cs index 17bf1d524..44f734948 100644 --- a/common/ASC.Data.Backup.Restore/Program.cs +++ b/common/ASC.Data.Backup.Restore/Program.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup.Restore/Restarter.cs b/common/ASC.Data.Backup.Restore/Restarter.cs index 367081896..232233322 100644 --- a/common/ASC.Data.Backup.Restore/Restarter.cs +++ b/common/ASC.Data.Backup.Restore/Restarter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup.RestoreDemo/Service.cs b/common/ASC.Data.Backup.RestoreDemo/Service.cs index 77e410d7b..bd6a4ed6d 100644 --- a/common/ASC.Data.Backup.RestoreDemo/Service.cs +++ b/common/ASC.Data.Backup.RestoreDemo/Service.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/ASC.Data.Backup.csproj b/common/ASC.Data.Backup/ASC.Data.Backup.csproj index c3cf7517e..2b14b4548 100644 --- a/common/ASC.Data.Backup/ASC.Data.Backup.csproj +++ b/common/ASC.Data.Backup/ASC.Data.Backup.csproj @@ -43,6 +43,8 @@ prompt 4 false + ..\..\web\studio\ASC.Web.Studio\bin\ASC.Data.Backup.xml + CS1591 none @@ -54,6 +56,7 @@ false + @@ -69,7 +72,6 @@ - @@ -81,12 +83,10 @@ - - @@ -128,7 +128,6 @@ - @@ -196,10 +195,7 @@ 3.7.1.29 - 8.0.29 - - - 1.3.2 + 8.0.32.1 @@ -208,5 +204,6 @@ BackupResource.Designer.cs + \ No newline at end of file diff --git a/common/ASC.Data.Backup/ActionInvoker.cs b/common/ASC.Data.Backup/ActionInvoker.cs index d175cead4..676a6d266 100644 --- a/common/ASC.Data.Backup/ActionInvoker.cs +++ b/common/ASC.Data.Backup/ActionInvoker.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/DbBackupProvider.cs b/common/ASC.Data.Backup/DbBackupProvider.cs index 8cb9591cb..1278d22f8 100644 --- a/common/ASC.Data.Backup/DbBackupProvider.cs +++ b/common/ASC.Data.Backup/DbBackupProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ using ASC.Common; using ASC.Common.Data; using ASC.Common.Logging; +using ASC.Data.Storage.ZipOperators; namespace ASC.Data.Backup { diff --git a/common/ASC.Data.Backup/Exceptions/DbBackupException.cs b/common/ASC.Data.Backup/Exceptions/DbBackupException.cs index afd3c0f15..4cf0ef9d1 100644 --- a/common/ASC.Data.Backup/Exceptions/DbBackupException.cs +++ b/common/ASC.Data.Backup/Exceptions/DbBackupException.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Exceptions/ThrowHelper.cs b/common/ASC.Data.Backup/Exceptions/ThrowHelper.cs index 9ff1ec9dd..d1c0990d3 100644 --- a/common/ASC.Data.Backup/Exceptions/ThrowHelper.cs +++ b/common/ASC.Data.Backup/Exceptions/ThrowHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Extensions/DataExtensions.cs b/common/ASC.Data.Backup/Extensions/DataExtensions.cs index 981c0768e..19043a438 100644 --- a/common/ASC.Data.Backup/Extensions/DataExtensions.cs +++ b/common/ASC.Data.Backup/Extensions/DataExtensions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Extensions/EnumerableExtensions.cs b/common/ASC.Data.Backup/Extensions/EnumerableExtensions.cs index 97bb9e180..af6e2dd07 100644 --- a/common/ASC.Data.Backup/Extensions/EnumerableExtensions.cs +++ b/common/ASC.Data.Backup/Extensions/EnumerableExtensions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Extensions/XmlExtensions.cs b/common/ASC.Data.Backup/Extensions/XmlExtensions.cs index 2f32f07c4..92b87b47d 100644 --- a/common/ASC.Data.Backup/Extensions/XmlExtensions.cs +++ b/common/ASC.Data.Backup/Extensions/XmlExtensions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/FileBackupProvider.cs b/common/ASC.Data.Backup/FileBackupProvider.cs index 3c0bc785b..d883e9fe4 100644 --- a/common/ASC.Data.Backup/FileBackupProvider.cs +++ b/common/ASC.Data.Backup/FileBackupProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ using ASC.Common.Logging; using ASC.Data.Storage; +using ASC.Data.Storage.ZipOperators; namespace ASC.Data.Backup { diff --git a/common/ASC.Data.Backup/IBackupProvider.cs b/common/ASC.Data.Backup/IBackupProvider.cs index 83dcaf18b..66274f18e 100644 --- a/common/ASC.Data.Backup/IBackupProvider.cs +++ b/common/ASC.Data.Backup/IBackupProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,8 @@ using System.Collections.Generic; using System.Xml.Linq; +using ASC.Data.Storage.ZipOperators; + namespace ASC.Data.Backup { public interface IBackupProvider diff --git a/common/ASC.Data.Backup/NotifyHelper.cs b/common/ASC.Data.Backup/NotifyHelper.cs index c6838b44c..8b95d1216 100644 --- a/common/ASC.Data.Backup/NotifyHelper.cs +++ b/common/ASC.Data.Backup/NotifyHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Service/BackupCleanerService.cs b/common/ASC.Data.Backup/Service/BackupCleanerService.cs index 1f70466a1..a821e7e5c 100644 --- a/common/ASC.Data.Backup/Service/BackupCleanerService.cs +++ b/common/ASC.Data.Backup/Service/BackupCleanerService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Service/BackupCleanerTempFileService.cs b/common/ASC.Data.Backup/Service/BackupCleanerTempFileService.cs index 65178672b..196489798 100644 --- a/common/ASC.Data.Backup/Service/BackupCleanerTempFileService.cs +++ b/common/ASC.Data.Backup/Service/BackupCleanerTempFileService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Service/BackupConfiguration.cs b/common/ASC.Data.Backup/Service/BackupConfiguration.cs index 999738374..488c2ddf8 100644 --- a/common/ASC.Data.Backup/Service/BackupConfiguration.cs +++ b/common/ASC.Data.Backup/Service/BackupConfiguration.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,6 +44,16 @@ public int Limit set { this["limit"] = value; } } + [ConfigurationProperty("chunkSize", DefaultValue = 20971520L)] + public long ChunkSize + { + get + { + return long.Parse(this["chunkSize"].ToString()); + } + set { this["chunkSize"] = value; } + } + [ConfigurationProperty("service")] public ServiceConfigurationElement Service { diff --git a/common/ASC.Data.Backup/Service/BackupSchedulerService.cs b/common/ASC.Data.Backup/Service/BackupSchedulerService.cs index c53086450..9cb9b328a 100644 --- a/common/ASC.Data.Backup/Service/BackupSchedulerService.cs +++ b/common/ASC.Data.Backup/Service/BackupSchedulerService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Service/BackupService.cs b/common/ASC.Data.Backup/Service/BackupService.cs index c279b9c2b..0c1da9d43 100644 --- a/common/ASC.Data.Backup/Service/BackupService.cs +++ b/common/ASC.Data.Backup/Service/BackupService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Service/BackupServiceLauncher.cs b/common/ASC.Data.Backup/Service/BackupServiceLauncher.cs index 4e7f23db3..ea3c825ad 100644 --- a/common/ASC.Data.Backup/Service/BackupServiceLauncher.cs +++ b/common/ASC.Data.Backup/Service/BackupServiceLauncher.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Service/BackupWorker.cs b/common/ASC.Data.Backup/Service/BackupWorker.cs index 2240f68a6..ed816622a 100644 --- a/common/ASC.Data.Backup/Service/BackupWorker.cs +++ b/common/ASC.Data.Backup/Service/BackupWorker.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,6 +33,8 @@ using ASC.Data.Backup.Tasks; using ASC.Data.Backup.Tasks.Modules; using ASC.Data.Backup.Utils; +using ASC.Data.Storage.ZipOperators; +using ASC.Web.Studio.Core; namespace ASC.Data.Backup.Service { @@ -64,6 +66,8 @@ public static void Start(BackupConfigurationSection config) configPaths = config.WebConfigs.Cast().ToDictionary(el => el.Region, el => PathHelper.ToRootedConfigPath(el.Path)); configPaths[currentRegion] = PathHelper.ToRootedConfigPath(config.WebConfigs.CurrentPath); + SetupInfo.ChunkUploadSize = config.ChunkSize; + var invalidConfigPath = configPaths.Values.FirstOrDefault(path => !File.Exists(path)); if (invalidConfigPath != null) { @@ -294,22 +298,34 @@ public void RunJob() var backupName = string.Format("{0}_{1:yyyy-MM-dd_HH-mm-ss}.{2}", CoreContext.TenantManager.GetTenant(TenantId).TenantAlias, dateTime, ArchiveFormat); var tempFile = Path.Combine(TempFolder, backupName); var storagePath = tempFile; + string hash; try { + CoreContext.TenantManager.SetCurrentTenant(TenantId); var backupTask = new BackupPortalTask(Log, TenantId, configPaths[currentRegion], tempFile, limit); + var backupStorage = BackupStorageFactory.GetBackupStorage(StorageType, TenantId, StorageParams); + var writer = ZipWriteOperatorFactory.GetWriteOperator(StorageBasePath, backupName, TempFolder, UserId, backupStorage as IGetterWriteOperator); + backupTask.WriteOperator = writer; + if (!BackupMail) { backupTask.IgnoreModule(ModuleName.Mail); } + backupTask.ProgressChanged += (sender, args) => Percentage = 0.9 * args.Progress; backupTask.RunJob(); - var backupStorage = BackupStorageFactory.GetBackupStorage(StorageType, TenantId, StorageParams); - if (backupStorage != null) + if (writer.NeedUpload) { storagePath = backupStorage.Upload(StorageBasePath, tempFile, UserId); - Link = backupStorage.GetPublicLink(storagePath); + hash = GetBackupHash(tempFile); + } + else + { + storagePath = writer.StoragePath; + hash = writer.Hash; } + Link = backupStorage.GetPublicLink(storagePath); var repo = BackupStorageFactory.GetBackupRepository(); repo.SaveBackupRecord( @@ -318,14 +334,15 @@ public void RunJob() Id = (Guid)Id, TenantId = TenantId, IsScheduled = IsScheduled, - FileName = Path.GetFileName(tempFile), + FileName = backupName, StorageType = StorageType, StorageBasePath = StorageBasePath, StoragePath = storagePath, CreatedOn = DateTime.UtcNow, ExpiresOn = StorageType == BackupStorageType.DataStore ? DateTime.UtcNow.AddDays(1) : DateTime.MinValue, StorageParams = StorageParams, - Hash = GetBackupHash(tempFile) + Hash = hash, + Removed = false }); Percentage = 100; @@ -339,7 +356,7 @@ public void RunJob() } catch (Exception error) { - Log.ErrorFormat("RunJob - Params: {0}, Error = {1}", new { Id = Id, Tenant = TenantId, File = tempFile, BasePath = StorageBasePath, }, error); + Log.ErrorFormat("RunJob - Params: {0}, Error = {1}", new { Id = Id, Tenant = TenantId, File = backupName, BasePath = StorageBasePath, }, error); Error = error; IsCompleted = true; } diff --git a/common/ASC.Data.Backup/Storage/BackupRecord.cs b/common/ASC.Data.Backup/Storage/BackupRecord.cs index de3b4ea93..337a0e804 100644 --- a/common/ASC.Data.Backup/Storage/BackupRecord.cs +++ b/common/ASC.Data.Backup/Storage/BackupRecord.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -45,5 +45,7 @@ internal class BackupRecord public Dictionary StorageParams { get; set; } public string Hash { get; set; } + + public bool Removed { get; set; } } } diff --git a/common/ASC.Data.Backup/Storage/BackupRepository.cs b/common/ASC.Data.Backup/Storage/BackupRepository.cs index 96514e628..026142df0 100644 --- a/common/ASC.Data.Backup/Storage/BackupRepository.cs +++ b/common/ASC.Data.Backup/Storage/BackupRepository.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ using ASC.Common.Data.Sql.Expressions; using ASC.Core.Common.Contracts; using ASC.Core.Tenants; +using ASC.Data.Backup.Tasks; using Newtonsoft.Json; @@ -35,7 +36,7 @@ internal class BackupRepository : IBackupRepository public BackupRepository(string connectionStringName = null) { - this.connectionStringName = connectionStringName ?? "core"; + this.connectionStringName = connectionStringName ?? "default"; } public void SaveBackupRecord(BackupRecord backupRecord) @@ -52,7 +53,8 @@ public void SaveBackupRecord(BackupRecord backupRecord) .InColumnValue("created_on", backupRecord.CreatedOn) .InColumnValue("expires_on", backupRecord.ExpiresOn) .InColumnValue("storage_params", JsonConvert.SerializeObject(backupRecord.StorageParams)) - .InColumnValue("hash", backupRecord.Hash); + .InColumnValue("hash", backupRecord.Hash) + .InColumnValue("removed", backupRecord.Removed); using (var db = GetDbManager()) { @@ -63,7 +65,7 @@ public void SaveBackupRecord(BackupRecord backupRecord) public BackupRecord GetBackupRecord(Guid id) { var select = new SqlQuery("backup_backup") - .Select("id", "tenant_id", "is_scheduled", "name", "storage_type", "storage_base_path", "storage_path", "created_on", "expires_on", "storage_params") + .Select("id", "tenant_id", "is_scheduled", "name", "storage_type", "storage_base_path", "storage_path", "created_on", "expires_on", "storage_params","hash") .Where("id", id); using (var db = GetDbManager()) @@ -75,7 +77,7 @@ public BackupRecord GetBackupRecord(Guid id) public BackupRecord GetBackupRecord(string hash, int tenant) { var select = new SqlQuery("backup_backup") - .Select("id", "tenant_id", "is_scheduled", "name", "storage_type", "storage_base_path", "storage_path", "created_on", "expires_on", "storage_params") + .Select("id", "tenant_id", "is_scheduled", "name", "storage_type", "storage_base_path", "storage_path", "created_on", "expires_on", "storage_params", "hash") .Where("hash", hash) .Where("tenant_id", tenant); @@ -88,8 +90,9 @@ public BackupRecord GetBackupRecord(string hash, int tenant) public List GetExpiredBackupRecords() { var select = new SqlQuery("backup_backup") - .Select("id", "tenant_id", "is_scheduled", "name", "storage_type", "storage_base_path", "storage_path", "created_on", "expires_on", "storage_params") - .Where(!Exp.Eq("expires_on", DateTime.MinValue) & Exp.Le("expires_on", DateTime.UtcNow)); + .Select("id", "tenant_id", "is_scheduled", "name", "storage_type", "storage_base_path", "storage_path", "created_on", "expires_on", "storage_params", "hash") + .Where(!Exp.Eq("expires_on", DateTime.MinValue) & Exp.Le("expires_on", DateTime.UtcNow)) + .Where(Exp.Eq("removed", false)); using (var db = GetDbManager()) { @@ -100,8 +103,9 @@ public List GetExpiredBackupRecords() public List GetScheduledBackupRecords() { var select = new SqlQuery("backup_backup") - .Select("id", "tenant_id", "is_scheduled", "name", "storage_type", "storage_base_path", "storage_path", "created_on", "expires_on", "storage_params") - .Where(Exp.Eq("is_scheduled", true)); + .Select("id", "tenant_id", "is_scheduled", "name", "storage_type", "storage_base_path", "storage_path", "created_on", "expires_on", "storage_params", "hash") + .Where(Exp.Eq("is_scheduled", true)) + .Where(Exp.Eq("removed", false)); using (var db = GetDbManager()) { @@ -110,20 +114,55 @@ public List GetScheduledBackupRecords() } public List GetBackupRecordsByTenantId(int tenantId) + { + return GetBackupRecordsByTenantIdInternal(tenantId, false); + } + + private List GetBackupRecordsByTenantIdInternal(int tenantId, bool? visible = null) { var select = new SqlQuery("backup_backup") - .Select("id", "tenant_id", "is_scheduled", "name", "storage_type", "storage_base_path", "storage_path", "created_on", "expires_on", "storage_params") + .Select("id", "tenant_id", "is_scheduled", "name", "storage_type", "storage_base_path", "storage_path", "created_on", "expires_on", "storage_params", "hash") .Where("tenant_id", tenantId); + if (visible.HasValue) + { + select = select.Where(Exp.Eq("removed", visible.Value)); + } + using (var db = GetDbManager()) { return db.ExecuteList(select).Select(ToBackupRecord).ToList(); } } + public void MigrationBackupRecords(int tenantId, int newTenantId, string configPath) + { + var backupsRecords = GetBackupRecordsByTenantIdInternal(tenantId); + + if (backupsRecords.Any()) + { + var dbFactory = new DbFactory(configPath); + using (var db = dbFactory.OpenConnection()) + { + using (var command = db.CreateCommand()) + { + command.CommandText = "INSERT INTO backup_backup (id, tenant_id, is_scheduled, name, storage_type, storage_base_path, storage_path, created_on, expires_on, storage_params, hash, removed) VALUES "; + foreach (var backupRecord in backupsRecords) + { + command.CommandText += $"('{Guid.NewGuid()}', {newTenantId}, {backupRecord.IsScheduled}, '{backupRecord.FileName}', {(int)backupRecord.StorageType}, '{backupRecord.StorageBasePath}', '{backupRecord.StoragePath}', '{backupRecord.CreatedOn.ToString("yyyy-MM-dd HH:mm:ss.fff")}', '{backupRecord.ExpiresOn.ToString("yyyy-MM-dd HH:mm:ss.fff")}', '{JsonConvert.SerializeObject(backupRecord.StorageParams)}', '{backupRecord.Hash}', {true}),"; + } + command.CommandText = command.CommandText.Trim(','); + command.CommandText += ";"; + command.ExecuteNonQuery(); + } + } + } + } + public void DeleteBackupRecord(Guid id) { - var delete = new SqlDelete("backup_backup") + var delete = new SqlUpdate("backup_backup") + .Set("removed", true) .Where("id", id); using (var db = GetDbManager()) @@ -200,7 +239,8 @@ private static BackupRecord ToBackupRecord(object[] row) StoragePath = Convert.ToString(row[6]), CreatedOn = Convert.ToDateTime(row[7]), ExpiresOn = Convert.ToDateTime(row[8]), - StorageParams = JsonConvert.DeserializeObject>(Convert.ToString(row[9])) + StorageParams = JsonConvert.DeserializeObject>(Convert.ToString(row[9])), + Hash = Convert.ToString(row[10]) }; } @@ -220,7 +260,7 @@ private static Schedule ToSchedule(object[] row) private IDbManager GetDbManager() { - return DbManager.FromHttpContext(connectionStringName); + return new DbManager(connectionStringName); } } } diff --git a/common/ASC.Data.Backup/Storage/BackupStorageFactory.cs b/common/ASC.Data.Backup/Storage/BackupStorageFactory.cs index 241667700..a203f6e92 100644 --- a/common/ASC.Data.Backup/Storage/BackupStorageFactory.cs +++ b/common/ASC.Data.Backup/Storage/BackupStorageFactory.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,7 +51,7 @@ public static IBackupStorage GetBackupStorage(BackupStorageType type, int tenant case BackupStorageType.ThridpartyDocuments: return new DocumentsBackupStorage(tenantId, webConfigPath); case BackupStorageType.DataStore: - return new DataStoreBackupStorage(tenantId, webConfigPath); + return new ConsumerBackupStorage(tenantId, webConfigPath); case BackupStorageType.Local: return new LocalBackupStorage(); case BackupStorageType.ThirdPartyConsumer: diff --git a/common/ASC.Data.Backup/Storage/ConsumerBackupStorage.cs b/common/ASC.Data.Backup/Storage/ConsumerBackupStorage.cs index 11d965803..661d49369 100644 --- a/common/ASC.Data.Backup/Storage/ConsumerBackupStorage.cs +++ b/common/ASC.Data.Backup/Storage/ConsumerBackupStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,36 +20,50 @@ using System.IO; using System.Linq; +using ASC.Core.ChunkedUploader; using ASC.Data.Storage; using ASC.Data.Storage.Configuration; +using ASC.Data.Storage.ZipOperators; +using ASC.Web.Studio.Core; namespace ASC.Data.Backup.Storage { - internal class ConsumerBackupStorage : IBackupStorage + internal class ConsumerBackupStorage : IBackupStorage, IGetterWriteOperator { - private readonly IDataStore store; - private const string Domain = "backup"; + private readonly IDataStore _store; + private readonly bool _isTemporary; + private readonly CommonChunkedUploadSessionHolder _sessionHolder; + + private string Domain { get => _isTemporary ? "" : "backup"; } public ConsumerBackupStorage(IReadOnlyDictionary storageParams) { var settings = new StorageSettings { Module = storageParams["module"], Props = storageParams.Where(r => r.Key != "module").ToDictionary(r => r.Key, r => r.Value) }; - store = settings.DataStore; + _store = settings.DataStore; + _sessionHolder = new CommonChunkedUploadSessionHolder(_store, Domain, SetupInfo.ChunkUploadSize); + } + + public ConsumerBackupStorage(int tenant, string webConfigPath) + { + _store = StorageFactory.GetStorage(webConfigPath, tenant.ToString(), Domain, null); + _isTemporary = true; + _sessionHolder = new CommonChunkedUploadSessionHolder(_store, Domain, SetupInfo.ChunkUploadSize); } public string Upload(string storageBasePath, string localPath, Guid userId) { - using (var stream = File.OpenRead(localPath)) + using (var stream = System.IO.File.OpenRead(localPath)) { var storagePath = Path.GetFileName(localPath); - store.Save(Domain, storagePath, stream, ACL.Private); + _store.Save(Domain, storagePath, stream, ACL.Private); return storagePath; } } public void Download(string storagePath, string targetLocalPath) { - using (var source = store.GetReadStream(Domain, storagePath)) - using (var destination = File.OpenWrite(targetLocalPath)) + using (var source = _store.GetReadStream(Domain, storagePath)) + using (var destination = System.IO.File.OpenWrite(targetLocalPath)) { source.CopyTo(destination); } @@ -57,20 +71,39 @@ public void Download(string storagePath, string targetLocalPath) public void Delete(string storagePath) { - if (store.IsFile(Domain, storagePath)) + if (_store.IsFile(Domain, storagePath)) { - store.Delete(Domain, storagePath); + _store.Delete(Domain, storagePath); } } public bool IsExists(string storagePath) { - return store.IsFile(Domain, storagePath); + return _store.IsFile(Domain, storagePath); } public string GetPublicLink(string storagePath) + { + if (_isTemporary) + { + return _store.GetPreSignedUri(Domain, storagePath, TimeSpan.FromDays(1), null).ToString(); + } + else + { + return _store.GetInternalUri(Domain, storagePath, TimeSpan.FromDays(1), null).AbsoluteUri; + } + } + + + public IDataWriteOperator GetWriteOperator(string storageBasePath, string title, Guid userId) { - return store.GetInternalUri(Domain, storagePath, TimeSpan.FromDays(1), null).AbsoluteUri; + var session = new CommonChunkedUploadSession(-1) + { + TempPath = title, + UploadId = _store.InitiateChunkedUpload(Domain, title) + }; + + return _store.CreateDataWriteOperator(session, _sessionHolder); } } } diff --git a/common/ASC.Data.Backup/Storage/DataStoreBackupStorage.cs b/common/ASC.Data.Backup/Storage/DataStoreBackupStorage.cs deleted file mode 100644 index 455146813..000000000 --- a/common/ASC.Data.Backup/Storage/DataStoreBackupStorage.cs +++ /dev/null @@ -1,79 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.IO; - -using ASC.Data.Storage; - -namespace ASC.Data.Backup.Storage -{ - internal class DataStoreBackupStorage : IBackupStorage - { - private readonly string webConfigPath; - private readonly int _tenant; - - public DataStoreBackupStorage(int tenant, string webConfigPath) - { - this.webConfigPath = webConfigPath; - _tenant = tenant; - } - - public string Upload(string storageBasePath, string localPath, Guid userId) - { - using (var stream = File.OpenRead(localPath)) - { - var storagePath = Path.GetFileName(localPath); - GetDataStore().Save("", storagePath, stream); - return storagePath; - } - } - - public void Download(string storagePath, string targetLocalPath) - { - using (var source = GetDataStore().GetReadStream("", storagePath)) - using (var destination = File.OpenWrite(targetLocalPath)) - { - source.CopyTo(destination); - } - } - - public void Delete(string storagePath) - { - var dataStore = GetDataStore(); - if (dataStore.IsFile("", storagePath)) - { - dataStore.Delete("", storagePath); - } - } - - public bool IsExists(string storagePath) - { - return GetDataStore().IsFile("", storagePath); - } - - public string GetPublicLink(string storagePath) - { - return GetDataStore().GetPreSignedUri("", storagePath, TimeSpan.FromDays(1), null).ToString(); - } - - protected virtual IDataStore GetDataStore() - { - return StorageFactory.GetStorage(webConfigPath, _tenant.ToString(), "backup", null); - } - } -} diff --git a/common/ASC.Data.Backup/Storage/DocumentsBackupStorage.cs b/common/ASC.Data.Backup/Storage/DocumentsBackupStorage.cs index 0852f7804..2192ca4a7 100644 --- a/common/ASC.Data.Backup/Storage/DocumentsBackupStorage.cs +++ b/common/ASC.Data.Backup/Storage/DocumentsBackupStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,9 +19,12 @@ using System.IO; using ASC.Core; +using ASC.Core.ChunkedUploader; using ASC.Data.Storage; +using ASC.Data.Storage.ZipOperators; using ASC.Files.Core; using ASC.Web.Files.Classes; +using ASC.Web.Files.Utils; using ASC.Web.Studio.Core; using File = ASC.Files.Core.File; @@ -29,15 +32,20 @@ namespace ASC.Data.Backup.Storage { - internal class DocumentsBackupStorage : IBackupStorage + internal class DocumentsBackupStorage : IBackupStorage, IGetterWriteOperator { private readonly int tenantId; - private readonly string webConfigPath; + private readonly FilesChunkedUploadSessionHolder _sessionHolder; public DocumentsBackupStorage(int tenantId, string webConfigPath) { this.tenantId = tenantId; - this.webConfigPath = webConfigPath; + + // hack: create storage using webConfigPath and put it into DataStoreCache + // FileDao will use this storage and will not try to create the new one from service config + var store = StorageFactory.GetStorage(webConfigPath, tenantId.ToString(), "files"); + + _sessionHolder = new FilesChunkedUploadSessionHolder(store, "", SetupInfo.ChunkUploadSize); } public string Upload(string folderId, string localPath, Guid userId) @@ -142,6 +150,41 @@ public string GetPublicLink(string fileId) return string.Empty; } + public IDataWriteOperator GetWriteOperator(string storageBasePath, string title, Guid userId) + { + CoreContext.TenantManager.SetCurrentTenant(tenantId); + if (!userId.Equals(Guid.Empty)) + { + SecurityContext.CurrentUser = userId; + } + else + { + var tenant = CoreContext.TenantManager.GetTenant(tenantId); + SecurityContext.CurrentUser = tenant.OwnerId; + } + using (var folderDao = GetFolderDao()) + { + return folderDao.CreateDataWriteOperator(storageBasePath, InitUploadChunk(storageBasePath, title), _sessionHolder); + } + } + + private CommonChunkedUploadSession InitUploadChunk(string folderId, string title) + { + using (var folderDao = GetFolderDao()) + using (var fileDao = GetFileDao()) + { + var folder = folderDao.GetFolder(folderId); + var newFile = new File + { + Title = title, + FolderID = folder.ID + }; + var chunkedUploadSession = fileDao.CreateUploadSession(newFile, -1); + chunkedUploadSession.CheckQuota = false; + return chunkedUploadSession; + } + } + private IFolderDao GetFolderDao() { return Global.DaoFactory.GetFolderDao(); @@ -149,9 +192,6 @@ private IFolderDao GetFolderDao() private IFileDao GetFileDao() { - // hack: create storage using webConfigPath and put it into DataStoreCache - // FileDao will use this storage and will not try to create the new one from service config - StorageFactory.GetStorage(webConfigPath, tenantId.ToString(), "files"); return Global.DaoFactory.GetFileDao(); } } diff --git a/common/ASC.Data.Backup/Storage/IBackupRepository.cs b/common/ASC.Data.Backup/Storage/IBackupRepository.cs index 588c77413..819957588 100644 --- a/common/ASC.Data.Backup/Storage/IBackupRepository.cs +++ b/common/ASC.Data.Backup/Storage/IBackupRepository.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,7 @@ internal interface IBackupRepository List GetScheduledBackupRecords(); List GetBackupRecordsByTenantId(int tenantId); void DeleteBackupRecord(Guid id); - + void MigrationBackupRecords(int tenantId, int newTenantId, string configPath); void SaveBackupSchedule(Schedule schedule); Schedule GetBackupSchedule(int tenantId); List GetBackupSchedules(); diff --git a/common/ASC.Data.Backup/Storage/IBackupStorage.cs b/common/ASC.Data.Backup/Storage/IBackupStorage.cs index 4f16bf8e9..3739c8882 100644 --- a/common/ASC.Data.Backup/Storage/IBackupStorage.cs +++ b/common/ASC.Data.Backup/Storage/IBackupStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,7 +19,7 @@ namespace ASC.Data.Backup.Storage { - internal interface IBackupStorage + public interface IBackupStorage { string Upload(string storageBasePath, string localPath, Guid userId); diff --git a/common/ASC.Data.Backup/Storage/LocalBackupStorage.cs b/common/ASC.Data.Backup/Storage/LocalBackupStorage.cs index 3c1c080b1..df4a6f9ca 100644 --- a/common/ASC.Data.Backup/Storage/LocalBackupStorage.cs +++ b/common/ASC.Data.Backup/Storage/LocalBackupStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,9 +18,11 @@ using System; using System.IO; +using ASC.Data.Storage.ZipOperators; + namespace ASC.Data.Backup.Storage { - internal class LocalBackupStorage : IBackupStorage + internal class LocalBackupStorage : IBackupStorage, IGetterWriteOperator { public string Upload(string storageBasePath, string localPath, Guid userId) { @@ -55,5 +57,10 @@ public string GetPublicLink(string storagePath) { return string.Empty; } + + public IDataWriteOperator GetWriteOperator(string storageBasePath, string title, Guid userId) + { + return null; + } } } diff --git a/common/ASC.Data.Backup/Storage/S3BackupStorage.cs b/common/ASC.Data.Backup/Storage/S3BackupStorage.cs deleted file mode 100644 index fb0323c11..000000000 --- a/common/ASC.Data.Backup/Storage/S3BackupStorage.cs +++ /dev/null @@ -1,146 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using System; -using System.IO; - -using Amazon; -using Amazon.S3; -using Amazon.S3.Model; -using Amazon.S3.Transfer; - -using ASC.Common.Logging; - - -namespace ASC.Data.Backup.Storage -{ - internal class S3BackupStorage : IBackupStorage - { - private readonly string accessKeyId; - private readonly string secretAccessKey; - private readonly string bucket; - private readonly string region; - - private readonly ILog log = LogManager.GetLogger("ASC.Backup.Service"); - - public S3BackupStorage(string accessKeyId, string secretAccessKey, string bucket, string region) - { - this.accessKeyId = accessKeyId; - this.secretAccessKey = secretAccessKey; - this.bucket = bucket; - this.region = region; - } - - public string Upload(string storageBasePath, string localPath, Guid userId) - { - String key = String.Empty; - - if (String.IsNullOrEmpty(storageBasePath)) - key = "backup/" + Path.GetFileName(localPath); - else - key = String.Concat(storageBasePath.Trim(new char[] { ' ', '/', '\\' }), "/", Path.GetFileName(localPath)); - - using (var fileTransferUtility = new TransferUtility(accessKeyId, secretAccessKey, RegionEndpoint.GetBySystemName(region))) - { - fileTransferUtility.Upload( - new TransferUtilityUploadRequest - { - BucketName = bucket, - FilePath = localPath, - StorageClass = S3StorageClass.StandardInfrequentAccess, - PartSize = 6291456, // 6 MB. - Key = key - }); - } - - - return key; - } - - public void Download(string storagePath, string targetLocalPath) - { - var request = new GetObjectRequest - { - BucketName = bucket, - Key = GetKey(storagePath), - }; - - using (var s3 = GetClient()) - using (var response = s3.GetObject(request)) - { - response.WriteResponseStreamToFile(targetLocalPath); - } - } - - public void Delete(string storagePath) - { - using (var s3 = GetClient()) - { - s3.DeleteObject(new DeleteObjectRequest - { - BucketName = bucket, - Key = GetKey(storagePath) - }); - } - } - - public bool IsExists(string storagePath) - { - using (var s3 = GetClient()) - { - try - { - var request = new ListObjectsRequest { BucketName = bucket, Prefix = GetKey(storagePath) }; - var response = s3.ListObjects(request); - return response.S3Objects.Count > 0; - } - catch (AmazonS3Exception ex) - { - log.Warn(ex); - - return false; - } - } - } - - public string GetPublicLink(string storagePath) - { - using (var s3 = GetClient()) - { - return s3.GetPreSignedURL( - new GetPreSignedUrlRequest - { - BucketName = bucket, - Key = GetKey(storagePath), - Expires = DateTime.UtcNow.AddDays(1), - Verb = HttpVerb.GET - }); - } - } - - private string GetKey(string fileName) - { - // return "backup/" + Path.GetFileName(fileName); - return fileName; - } - - private AmazonS3Client GetClient() - { - return new AmazonS3Client(accessKeyId, secretAccessKey, new AmazonS3Config { RegionEndpoint = RegionEndpoint.GetBySystemName(region) }); - } - } -} diff --git a/common/ASC.Data.Backup/Storage/Schedule.cs b/common/ASC.Data.Backup/Storage/Schedule.cs index 52533e6d8..20d9e7763 100644 --- a/common/ASC.Data.Backup/Storage/Schedule.cs +++ b/common/ASC.Data.Backup/Storage/Schedule.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/BackupFileInfo.cs b/common/ASC.Data.Backup/Tasks/BackupFileInfo.cs index 843caf7ee..16277b6c5 100644 --- a/common/ASC.Data.Backup/Tasks/BackupFileInfo.cs +++ b/common/ASC.Data.Backup/Tasks/BackupFileInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/BackupPortalTask.cs b/common/ASC.Data.Backup/Tasks/BackupPortalTask.cs index 29bfdaa3f..0d69b0b8a 100644 --- a/common/ASC.Data.Backup/Tasks/BackupPortalTask.cs +++ b/common/ASC.Data.Backup/Tasks/BackupPortalTask.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,6 +37,7 @@ using ASC.Data.Backup.Tasks.Data; using ASC.Data.Backup.Tasks.Modules; using ASC.Data.Storage; +using ASC.Data.Storage.ZipOperators; using Newtonsoft.Json; @@ -64,14 +65,11 @@ public BackupPortalTask(ILog logger, int tenantId, string fromConfigPath, string public override void RunJob() { Logger.DebugFormat("begin backup {0}", TenantId); - CoreContext.TenantManager.SetCurrentTenant(TenantId); - - - using (var writer = new ZipWriteOperator(BackupFilePath)) + using (WriteOperator) { if (Dump) { - DoDump(writer); + DoDump(WriteOperator); } else { @@ -84,11 +82,11 @@ public override void RunJob() foreach (var module in modulesToProcess) { - DoBackupModule(writer, dbFactory, module); + DoBackupModule(WriteOperator, dbFactory, module); } if (ProcessStorage) { - DoBackupStorage(writer, fileGroups); + DoBackupStorage(WriteOperator, fileGroups); } } } @@ -98,20 +96,28 @@ public override void RunJob() private void DoDump(IDataWriteOperator writer) { Dictionary> databases = new Dictionary>(); - using (var dbManager = DbManager.FromHttpContext("default", 100000)) + using (var dbManager = new DbManager("default", 100000)) { - dbManager.ExecuteList("select id, connection_string from mail_server_server").ForEach((r => + dbManager.ExecuteList("select id, connection_string from mail_server_server").ForEach(r => { var dbName = GetDbName((int)r[0], JsonConvert.DeserializeObject>(Convert.ToString(r[1]))["DbConnection"].ToString()); - using (var dbManager1 = DbManager.FromHttpContext(dbName, 100000)) + using (var dbManager1 = new DbManager(dbName, 100000)) { - var tables = dbManager1.ExecuteList("show tables;").Select(res => Convert.ToString(res[0])).ToList(); - databases.Add(dbName, tables); + try + { + var tables = dbManager1.ExecuteList("show tables;").Select(res => Convert.ToString(res[0])).ToList(); + databases.Add(dbName, tables); + } + catch (Exception e) + { + Logger.Error(e); + DbRegistry.UnRegisterDatabase(dbName); + } } - })); + }); } - using (var dbManager = DbManager.FromHttpContext("default", 100000)) + using (var dbManager = new DbManager("default", 100000)) { var tables = dbManager.ExecuteList("show tables;").Select(res => Convert.ToString(res[0])).ToList(); databases.Add("default", tables); @@ -124,8 +130,8 @@ private void DoDump(IDataWriteOperator writer) var files = new List(); - var stepscount = 0; - foreach(var db in databases) + var stepscount = 0; + foreach (var db in databases) { stepscount += db.Value.Count * 4;// (schema + data) * (dump + zip) } @@ -142,7 +148,7 @@ private void DoDump(IDataWriteOperator writer) SetStepsCount(stepscount); - foreach(var db in databases) + foreach (var db in databases) { DoDump(writer, db.Key, db.Value); } @@ -223,7 +229,7 @@ private IEnumerable GetFiles(int tenantId) var files = GetFilesToProcess(tenantId).ToList(); var exclude = new List(); - using (var db = DbManager.FromHttpContext("default")) + using (var db = new DbManager("default")) { var query = new SqlQuery("backup_backup") .Select("storage_path") @@ -243,7 +249,7 @@ private void DumpTableScheme(string t, string dir, string dbName) try { Logger.DebugFormat("dump table scheme start {0}", t); - using (var dbManager = DbManager.FromHttpContext(dbName, 100000)) + using (var dbManager = new DbManager(dbName, 100000)) { var createScheme = dbManager.ExecuteList(string.Format("SHOW CREATE TABLE `{0}`", t)); var creates = new StringBuilder(); @@ -277,7 +283,7 @@ private int SelectCount(string t, string dbName) { try { - using (var dbManager = DbManager.FromHttpContext(dbName, 100000)) + using (var dbManager = new DbManager(dbName, 100000)) { dbManager.ExecuteNonQuery("analyze table " + t); return dbManager.ExecuteScalar(new SqlQuery("information_schema.`TABLES`").Select("table_rows").Where("TABLE_NAME", t).Where("TABLE_SCHEMA", dbManager.Connection.Database)); @@ -309,7 +315,7 @@ private void DumpTableData(string t, string dir, int count, string dbName, IData int primaryIndexStart = 0; List columns; - using (var dbManager = DbManager.FromHttpContext(dbName, 100000)) + using (var dbManager = new DbManager(dbName, 100000)) { var columnsData = dbManager.ExecuteList(string.Format("SHOW COLUMNS FROM `{0}`;", t)); columns = columnsData @@ -387,7 +393,7 @@ private void DumpTableData(string t, string dir, int count, string dbName, IData private List GetData(string t, List columns, int offset, string dbName) { - using (var dbManager = DbManager.FromHttpContext(dbName, 100000)) + using (var dbManager = new DbManager(dbName, 100000)) { var query = new SqlQuery(t) .Select(columns.ToArray()) @@ -398,7 +404,7 @@ private List GetData(string t, List columns, int offset, strin } private List GetDataWithPrimary(string t, List columns, string primary, int start, int step, string dbName) { - using (var dbManager = DbManager.FromHttpContext(dbName, 100000)) + using (var dbManager = new DbManager(dbName, 100000)) { var query = new SqlQuery(t) .Select(columns.ToArray()) @@ -417,7 +423,7 @@ private string GetDbName(int id, string connectionString) { DbRegistry.UnRegisterDatabase(connectionSettings.Name); } - + DbRegistry.RegisterDatabase(connectionSettings.Name, connectionSettings); return connectionSettings.Name; } @@ -585,14 +591,28 @@ private List> GetFilesGroup(DbFactory dbFactor var exclude = new List(); using (var db = dbFactory.OpenConnection()) - using (var command = db.CreateCommand()) { - command.CommandText = "select storage_path from backup_backup where tenant_id = " + TenantId + " and storage_type = 0 and storage_path is not null"; - using (var reader = command.ExecuteReader()) + using (var command = db.CreateCommand()) { - while (reader.Read()) + command.CommandText = "select storage_path from backup_backup where tenant_id = " + TenantId + " and storage_type = 0 and storage_path is not null and removed = 0"; + using (var reader = command.ExecuteReader()) { - exclude.Add(reader.GetString(0)); + while (reader.Read()) + { + exclude.Add(reader.GetString(0)); + } + } + } + + using (var command = db.CreateCommand()) + { + command.CommandText = "select id from files_file where tenant_id = " + TenantId + " and title like '%tar.gz' and content_length > 1073741824"; + using (var reader = command.ExecuteReader()) + { + while (reader.Read()) + { + exclude.Add(reader.GetString(0)); + } } } } @@ -677,15 +697,17 @@ private void DoBackupStorage(IDataWriteOperator writer, List { var f = (BackupFileInfo)state; - using (var fileStream = storage.GetReadStream(f.Domain, f.Path)) - { - writer.WriteEntry(file1.GetZipKey(), fileStream); - } + fileStream = storage.GetReadStream(f.Domain, f.Path); }, file, 5, error => Logger.WarnFormat("can't backup file ({0}:{1}): {2}", file1.Module, file1.Path, error)); - + if (fileStream != null) + { + writer.WriteEntry(file1.GetZipKey(), fileStream); + fileStream.Dispose(); + } SetCurrentStepProgress((int)(++filesProcessed * 100 / (double)filesCount)); } } diff --git a/common/ASC.Data.Backup/Tasks/ColumnMapper.cs b/common/ASC.Data.Backup/Tasks/ColumnMapper.cs index 2080a41ef..6b7da3d1c 100644 --- a/common/ASC.Data.Backup/Tasks/ColumnMapper.cs +++ b/common/ASC.Data.Backup/Tasks/ColumnMapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Data/DataRowInfo.cs b/common/ASC.Data.Backup/Tasks/Data/DataRowInfo.cs index 045e74c76..fd516c820 100644 --- a/common/ASC.Data.Backup/Tasks/Data/DataRowInfo.cs +++ b/common/ASC.Data.Backup/Tasks/Data/DataRowInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Data/DataRowInfoReader.cs b/common/ASC.Data.Backup/Tasks/Data/DataRowInfoReader.cs index c1bfbb1dc..4cdd1dff6 100644 --- a/common/ASC.Data.Backup/Tasks/Data/DataRowInfoReader.cs +++ b/common/ASC.Data.Backup/Tasks/Data/DataRowInfoReader.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Data/RelationInfo.cs b/common/ASC.Data.Backup/Tasks/Data/RelationInfo.cs index c5ce29dce..492adb516 100644 --- a/common/ASC.Data.Backup/Tasks/Data/RelationInfo.cs +++ b/common/ASC.Data.Backup/Tasks/Data/RelationInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Data/TableInfo.cs b/common/ASC.Data.Backup/Tasks/Data/TableInfo.cs index 60613898a..4ceebdcf3 100644 --- a/common/ASC.Data.Backup/Tasks/Data/TableInfo.cs +++ b/common/ASC.Data.Backup/Tasks/Data/TableInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/DbFactory.cs b/common/ASC.Data.Backup/Tasks/DbFactory.cs index 8ecf92536..f942af26e 100644 --- a/common/ASC.Data.Backup/Tasks/DbFactory.cs +++ b/common/ASC.Data.Backup/Tasks/DbFactory.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/DeletePortalTask.cs b/common/ASC.Data.Backup/Tasks/DeletePortalTask.cs index b9b8120f2..e634da11f 100644 --- a/common/ASC.Data.Backup/Tasks/DeletePortalTask.cs +++ b/common/ASC.Data.Backup/Tasks/DeletePortalTask.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/KeyHelper.cs b/common/ASC.Data.Backup/Tasks/KeyHelper.cs index 41f097753..fd3c1a703 100644 --- a/common/ASC.Data.Backup/Tasks/KeyHelper.cs +++ b/common/ASC.Data.Backup/Tasks/KeyHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Modules/AuditModuleSpecifics.cs b/common/ASC.Data.Backup/Tasks/Modules/AuditModuleSpecifics.cs index 94855629a..12a37baa6 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/AuditModuleSpecifics.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/AuditModuleSpecifics.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Modules/CalendarModuleSpecifics.cs b/common/ASC.Data.Backup/Tasks/Modules/CalendarModuleSpecifics.cs index bd56f6dec..299b66249 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/CalendarModuleSpecifics.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/CalendarModuleSpecifics.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Modules/CommunityModuleSpecifics.cs b/common/ASC.Data.Backup/Tasks/Modules/CommunityModuleSpecifics.cs index 064c56db3..249e54c5f 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/CommunityModuleSpecifics.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/CommunityModuleSpecifics.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Modules/CoreModuleSpecifics.cs b/common/ASC.Data.Backup/Tasks/Modules/CoreModuleSpecifics.cs index a4dd1ff69..1b8563c6c 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/CoreModuleSpecifics.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/CoreModuleSpecifics.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -65,7 +65,6 @@ internal class CoreModuleSpecifics : ModuleSpecificsBase DateColumns = new Dictionary {{"timestamp", false}} }, new TableInfo("feed_users") {InsertMethod = InsertMethod.None}, - new TableInfo("backup_backup", "tenant_id", "id", IdType.Guid), new TableInfo("backup_schedule", "tenant_id"), new TableInfo("core_settings", "tenant") }; @@ -134,12 +133,6 @@ internal class CoreModuleSpecifics : ModuleSpecificsBase new RelationInfo("core_user", "id", "feed_users", "user_id", typeof(CoreModuleSpecifics)), - new RelationInfo("files_folder", "id", "backup_backup", "storage_base_path", typeof(FilesModuleSpecifics), - x => IsDocumentsStorageType(Convert.ToString(x["storage_type"]))), - - new RelationInfo("files_file", "id", "backup_backup", "storage_path", typeof(FilesModuleSpecifics), - x => IsDocumentsStorageType(Convert.ToString(x["storage_type"]))), - new RelationInfo("files_folder", "id", "backup_schedule", "storage_base_path", typeof(FilesModuleSpecifics), x => IsDocumentsStorageType(Convert.ToString(x["storage_type"]))), }; diff --git a/common/ASC.Data.Backup/Tasks/Modules/CrmModuleSpecifics.cs b/common/ASC.Data.Backup/Tasks/Modules/CrmModuleSpecifics.cs index 31f57ae1b..0acac9f89 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/CrmModuleSpecifics.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/CrmModuleSpecifics.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Modules/FilesModuleSpecifics.cs b/common/ASC.Data.Backup/Tasks/Modules/FilesModuleSpecifics.cs index 91da4bea4..f87545781 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/FilesModuleSpecifics.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/FilesModuleSpecifics.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -151,7 +151,7 @@ protected override string GetSelectCommandConditionText(int tenantId, TableInfo if (table.Name == "files_file") { // do not backup previus backup files - return "where not exists(select 1 from backup_backup b where b.tenant_id = t.tenant_id and b.storage_path = t.id) and t.tenant_id = " + tenantId; + return "where not exists(select 1 from backup_backup b where b.tenant_id = t.tenant_id and b.storage_path = t.id and b.removed = 0) and not (t.title LIKE '%tar.gz' and t.content_length > 1073741824) and t.tenant_id = " + tenantId; } return base.GetSelectCommandConditionText(tenantId, table); } diff --git a/common/ASC.Data.Backup/Tasks/Modules/Helpers.cs b/common/ASC.Data.Backup/Tasks/Modules/Helpers.cs index ff3ac3462..babc66409 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/Helpers.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/Helpers.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Modules/IModuleSpecifics.cs b/common/ASC.Data.Backup/Tasks/Modules/IModuleSpecifics.cs index d56b40326..dda740506 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/IModuleSpecifics.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/IModuleSpecifics.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Modules/MailModuleSpecifics.cs b/common/ASC.Data.Backup/Tasks/Modules/MailModuleSpecifics.cs index fb528e0da..cad4834c8 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/MailModuleSpecifics.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/MailModuleSpecifics.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Modules/ModuleProvider.cs b/common/ASC.Data.Backup/Tasks/Modules/ModuleProvider.cs index 99412caf9..444e9f46f 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/ModuleProvider.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/ModuleProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Modules/ModuleSpecificsBase.cs b/common/ASC.Data.Backup/Tasks/Modules/ModuleSpecificsBase.cs index 8868b1be0..e74df1938 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/ModuleSpecificsBase.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/ModuleSpecificsBase.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Modules/ProjectsModuleSpecifics.cs b/common/ASC.Data.Backup/Tasks/Modules/ProjectsModuleSpecifics.cs index d05709375..f2a744bbd 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/ProjectsModuleSpecifics.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/ProjectsModuleSpecifics.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Modules/TenantsModuleSpecifics.cs b/common/ASC.Data.Backup/Tasks/Modules/TenantsModuleSpecifics.cs index 54594edd6..24465ce2d 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/TenantsModuleSpecifics.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/TenantsModuleSpecifics.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/Modules/WebStudioModuleSpecifics.cs b/common/ASC.Data.Backup/Tasks/Modules/WebStudioModuleSpecifics.cs index d1db66d7c..e9c2929fe 100644 --- a/common/ASC.Data.Backup/Tasks/Modules/WebStudioModuleSpecifics.cs +++ b/common/ASC.Data.Backup/Tasks/Modules/WebStudioModuleSpecifics.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Tasks/PortalTaskBase.cs b/common/ASC.Data.Backup/Tasks/PortalTaskBase.cs index 25457618a..49c86e2a5 100644 --- a/common/ASC.Data.Backup/Tasks/PortalTaskBase.cs +++ b/common/ASC.Data.Backup/Tasks/PortalTaskBase.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,8 +27,10 @@ using ASC.Common.Data; using ASC.Common.Logging; +using ASC.Data.Backup.Storage; using ASC.Data.Backup.Tasks.Modules; using ASC.Data.Storage; +using ASC.Data.Storage.ZipOperators; namespace ASC.Data.Backup.Tasks { @@ -56,6 +58,7 @@ public abstract class PortalTaskBase public string ConfigPath { get; private set; } public bool ProcessStorage { get; set; } + public IDataWriteOperator WriteOperator { get; set; } protected PortalTaskBase(ILog logger, int tenantId, string configPath) { @@ -238,7 +241,7 @@ protected Dictionary ParseConnectionString(string connectionStri protected async Task RunMysqlFile(Stream stream, string db, string delimiter = ";") { - using (var dbManager = DbManager.FromHttpContext(db, 100000)) + using (var dbManager = new DbManager(db, 100000)) using (var tr = dbManager.BeginTransaction()) { await dbManager.ExecuteNonQueryAsync("SET FOREIGN_KEY_CHECKS=0;"); @@ -301,7 +304,7 @@ protected Dictionary ParseConnectionString(string connectionStri } protected async Task RunMysqlProcedure(Stream stream) { - using (var dbManager = DbManager.FromHttpContext("default", 100000)) + using (var dbManager = new DbManager("default", 100000)) { if (stream == null) return; diff --git a/common/ASC.Data.Backup/Tasks/RestoreDbModuleTask.cs b/common/ASC.Data.Backup/Tasks/RestoreDbModuleTask.cs index ae4141e03..9caa447b3 100644 --- a/common/ASC.Data.Backup/Tasks/RestoreDbModuleTask.cs +++ b/common/ASC.Data.Backup/Tasks/RestoreDbModuleTask.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ using ASC.Data.Backup.Extensions; using ASC.Data.Backup.Tasks.Data; using ASC.Data.Backup.Tasks.Modules; +using ASC.Data.Storage.ZipOperators; namespace ASC.Data.Backup.Tasks { diff --git a/common/ASC.Data.Backup/Tasks/RestorePortalTask.cs b/common/ASC.Data.Backup/Tasks/RestorePortalTask.cs index 104788765..74a4b4e26 100644 --- a/common/ASC.Data.Backup/Tasks/RestorePortalTask.cs +++ b/common/ASC.Data.Backup/Tasks/RestorePortalTask.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,8 +30,10 @@ using ASC.Core.Billing; using ASC.Core.Tenants; using ASC.Data.Backup.Extensions; +using ASC.Data.Backup.Storage; using ASC.Data.Backup.Tasks.Modules; using ASC.Data.Storage; +using ASC.Data.Storage.ZipOperators; using Newtonsoft.Json; @@ -100,6 +102,8 @@ public override void RunJob() } restoreTask.RunJob(); } + var backupRepository = BackupStorageFactory.GetBackupRepository(); + backupRepository.MigrationBackupRecords(TenantId, _columnMapper.GetTenantMapping(), ConfigPath); } Logger.Debug("end restore data"); @@ -191,7 +195,7 @@ private void RestoreFromDump(IDataReadOperator dataReader) Task.WaitAll(tasks.ToArray()); } - using (var dbManager = DbManager.FromHttpContext("default", 100000)) + using (var dbManager = new DbManager("default", 100000)) { dbManager.ExecuteList("select id, connection_string from mail_server_server").ForEach(r => { diff --git a/common/ASC.Data.Backup/Tasks/TransferPortalTask.cs b/common/ASC.Data.Backup/Tasks/TransferPortalTask.cs index 2b8039561..dcaa13c1e 100644 --- a/common/ASC.Data.Backup/Tasks/TransferPortalTask.cs +++ b/common/ASC.Data.Backup/Tasks/TransferPortalTask.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ using ASC.Data.Backup.Extensions; using ASC.Data.Backup.Tasks.Modules; using ASC.Data.Storage; +using ASC.Data.Storage.ZipOperators; namespace ASC.Data.Backup.Tasks { @@ -81,6 +82,8 @@ public override void RunJob() //save db data to temporary file var backupTask = new BackupPortalTask(Logger, TenantId, ConfigPath, backupFilePath, Limit) { ProcessStorage = false }; backupTask.ProgressChanged += (sender, args) => SetCurrentStepProgress(args.Progress); + backupTask.WriteOperator = ZipWriteOperatorFactory.GetDefaultWriteOperator(backupFilePath); + foreach (var moduleName in IgnoredModules) { backupTask.IgnoreModule(moduleName); diff --git a/common/ASC.Data.Backup/Utils/ConfigurationProvider.cs b/common/ASC.Data.Backup/Utils/ConfigurationProvider.cs index 210000eda..8b88f49f2 100644 --- a/common/ASC.Data.Backup/Utils/ConfigurationProvider.cs +++ b/common/ASC.Data.Backup/Utils/ConfigurationProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Backup/Utils/FCKEditorPathUtility.cs b/common/ASC.Data.Backup/Utils/FCKEditorPathUtility.cs index ab9d33074..fff23c5a9 100644 --- a/common/ASC.Data.Backup/Utils/FCKEditorPathUtility.cs +++ b/common/ASC.Data.Backup/Utils/FCKEditorPathUtility.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Text.RegularExpressions; using ASC.Data.Storage; diff --git a/common/ASC.Data.Backup/Utils/PathHelper.cs b/common/ASC.Data.Backup/Utils/PathHelper.cs index d8a84f71c..1b117f8f7 100644 --- a/common/ASC.Data.Backup/Utils/PathHelper.cs +++ b/common/ASC.Data.Backup/Utils/PathHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Encryption/ASC.Data.Encryption.csproj b/common/ASC.Data.Encryption/ASC.Data.Encryption.csproj index 0b7f05019..60cd3da27 100644 --- a/common/ASC.Data.Encryption/ASC.Data.Encryption.csproj +++ b/common/ASC.Data.Encryption/ASC.Data.Encryption.csproj @@ -22,6 +22,8 @@ DEBUG;TRACE prompt 4 + ..\..\web\studio\ASC.Web.Studio\bin\ASC.Data.Encryption.xml + CS1591 pdbonly diff --git a/common/ASC.Data.Encryption/Crypt.cs b/common/ASC.Data.Encryption/Crypt.cs index 0d34d5b55..4991e8ff8 100644 --- a/common/ASC.Data.Encryption/Crypt.cs +++ b/common/ASC.Data.Encryption/Crypt.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Encryption/CryptoStreamWrapper.cs b/common/ASC.Data.Encryption/CryptoStreamWrapper.cs index 23364c822..a46d09db4 100644 --- a/common/ASC.Data.Encryption/CryptoStreamWrapper.cs +++ b/common/ASC.Data.Encryption/CryptoStreamWrapper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.IO; using System.Security.Cryptography; diff --git a/common/ASC.Data.Encryption/IntegrityProtectionException.cs b/common/ASC.Data.Encryption/IntegrityProtectionException.cs index 6d8494b8f..5985d316e 100644 --- a/common/ASC.Data.Encryption/IntegrityProtectionException.cs +++ b/common/ASC.Data.Encryption/IntegrityProtectionException.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; namespace ASC.Data.Encryption diff --git a/common/ASC.Data.Encryption/Metadata.cs b/common/ASC.Data.Encryption/Metadata.cs index f03c6b6a0..c875ab6fb 100644 --- a/common/ASC.Data.Encryption/Metadata.cs +++ b/common/ASC.Data.Encryption/Metadata.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Configuration; using System.IO; diff --git a/common/ASC.Data.Encryption/StreamWrapper.cs b/common/ASC.Data.Encryption/StreamWrapper.cs index 6dd4ab3ce..06e3ccdd1 100644 --- a/common/ASC.Data.Encryption/StreamWrapper.cs +++ b/common/ASC.Data.Encryption/StreamWrapper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.IO; using System.Security.Cryptography; diff --git a/common/ASC.Data.Storage.Encryption/ASC.Data.Storage.Encryption.csproj b/common/ASC.Data.Storage.Encryption/ASC.Data.Storage.Encryption.csproj index f4fc2128a..3d40c2210 100644 --- a/common/ASC.Data.Storage.Encryption/ASC.Data.Storage.Encryption.csproj +++ b/common/ASC.Data.Storage.Encryption/ASC.Data.Storage.Encryption.csproj @@ -20,6 +20,8 @@ DEBUG;TRACE prompt 4 + ..\..\web\studio\ASC.Web.Studio\bin\ASC.Data.Storage.Encryption.xml + CS1591 none @@ -65,7 +67,7 @@ - 4.7.11 + 5.1.2 diff --git a/common/ASC.Data.Storage.Encryption/EncryptionOperation.cs b/common/ASC.Data.Storage.Encryption/EncryptionOperation.cs index ca680a745..bafcc541c 100644 --- a/common/ASC.Data.Storage.Encryption/EncryptionOperation.cs +++ b/common/ASC.Data.Storage.Encryption/EncryptionOperation.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Configuration; diff --git a/common/ASC.Data.Storage.Encryption/EncryptionService.cs b/common/ASC.Data.Storage.Encryption/EncryptionService.cs index 0e2378601..b14ee6467 100644 --- a/common/ASC.Data.Storage.Encryption/EncryptionService.cs +++ b/common/ASC.Data.Storage.Encryption/EncryptionService.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.Common.Threading.Progress; using ASC.Core.Common.Contracts; using ASC.Core.Encryption; diff --git a/common/ASC.Data.Storage.Encryption/EncryptionWorker.cs b/common/ASC.Data.Storage.Encryption/EncryptionWorker.cs index 8ca5ff67a..18a305b9f 100644 --- a/common/ASC.Data.Storage.Encryption/EncryptionWorker.cs +++ b/common/ASC.Data.Storage.Encryption/EncryptionWorker.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Threading; using System.Threading.Tasks; diff --git a/common/ASC.Data.Storage.Encryption/Launcher.cs b/common/ASC.Data.Storage.Encryption/Launcher.cs index b68689a6a..a6e6f5e57 100644 --- a/common/ASC.Data.Storage.Encryption/Launcher.cs +++ b/common/ASC.Data.Storage.Encryption/Launcher.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.ServiceModel; using ASC.Common.Module; diff --git a/common/ASC.Data.Storage.Encryption/NotifyHelper.cs b/common/ASC.Data.Storage.Encryption/NotifyHelper.cs index 74a270d67..5e1402ed3 100644 --- a/common/ASC.Data.Storage.Encryption/NotifyHelper.cs +++ b/common/ASC.Data.Storage.Encryption/NotifyHelper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Common.Logging; diff --git a/common/ASC.Data.Storage.Migration/ASC.Data.Storage.Migration.csproj b/common/ASC.Data.Storage.Migration/ASC.Data.Storage.Migration.csproj index 6f22f6eef..8c459a924 100644 --- a/common/ASC.Data.Storage.Migration/ASC.Data.Storage.Migration.csproj +++ b/common/ASC.Data.Storage.Migration/ASC.Data.Storage.Migration.csproj @@ -20,6 +20,8 @@ DEBUG;TRACE prompt 4 + ..\..\web\studio\ASC.Web.Studio\bin\ASC.Data.Storage.Migration.xml + CS1591 none diff --git a/common/ASC.Data.Storage.Migration/Launcher.cs b/common/ASC.Data.Storage.Migration/Launcher.cs index 052051ebc..8abf6d2ed 100644 --- a/common/ASC.Data.Storage.Migration/Launcher.cs +++ b/common/ASC.Data.Storage.Migration/Launcher.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.ServiceModel; using ASC.Common.Module; diff --git a/common/ASC.Data.Storage.Migration/Service.cs b/common/ASC.Data.Storage.Migration/Service.cs index 39668ff5c..502f04a5b 100644 --- a/common/ASC.Data.Storage.Migration/Service.cs +++ b/common/ASC.Data.Storage.Migration/Service.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.Common.Logging; using ASC.Common.Threading.Progress; using ASC.Core; diff --git a/common/ASC.Data.Storage/ASC.Data.Storage.csproj b/common/ASC.Data.Storage/ASC.Data.Storage.csproj index bf654026e..10386aa65 100644 --- a/common/ASC.Data.Storage/ASC.Data.Storage.csproj +++ b/common/ASC.Data.Storage/ASC.Data.Storage.csproj @@ -44,7 +44,8 @@ prompt 4 false - 5 + ..\..\web\studio\ASC.Web.Studio\bin\ASC.Data.Storage.xml + CS1591 none @@ -53,7 +54,6 @@ prompt 4 false - 5 @@ -105,6 +105,12 @@ + + + + + + @@ -139,6 +145,9 @@ + + 2.0.3 + 3.5.0 @@ -157,8 +166,13 @@ 0.8.5 + + 1.4.2 + + + diff --git a/common/ASC.Data.Storage/BaseStorage.cs b/common/ASC.Data.Storage/BaseStorage.cs index 817ec5fa0..119fb51b8 100644 --- a/common/ASC.Data.Storage/BaseStorage.cs +++ b/common/ASC.Data.Storage/BaseStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,9 @@ using System.Web; using ASC.Core; +using ASC.Core.ChunkedUploader; using ASC.Data.Storage.Configuration; +using ASC.Data.Storage.ZipOperators; using ASC.Security.Cryptography; namespace ASC.Data.Storage @@ -34,6 +36,7 @@ public abstract class BaseStorage : IDataStore #region IDataStore Members internal string _modulename; + internal bool _cache; internal DataList _dataList; internal string _tenant; internal Dictionary _domainsExpires = new Dictionary(); @@ -135,25 +138,34 @@ public virtual Uri GetInternalUri(string domain, string path, TimeSpan expire, I } public abstract Stream GetReadStream(string domain, string path); - public abstract Stream GetReadStream(string domain, string path, int offset); - public abstract Task GetReadStreamAsync(string domain, string path, int offset); + public abstract Stream GetReadStream(string domain, string path, long offset); + public abstract Task GetReadStreamAsync(string domain, string path, long offset); public abstract Uri Save(string domain, string path, Stream stream); + public abstract Uri Save(string domain, string path, Stream stream, Guid ownerId); public abstract Uri Save(string domain, string path, Stream stream, ACL acl); public Uri Save(string domain, string path, Stream stream, string attachmentFileName) + { + return Save(domain, path, Guid.Empty, stream, attachmentFileName); + } + + public Uri Save(string domain, string path, Guid ownerId, Stream stream, string attachmentFileName) { if (!string.IsNullOrEmpty(attachmentFileName)) { - return SaveWithAutoAttachment(domain, path, stream, attachmentFileName); + return SaveWithAutoAttachment(domain, path, ownerId, stream, attachmentFileName); } - return Save(domain, path, stream); + return Save(domain, path, stream, ownerId); } protected abstract Uri SaveWithAutoAttachment(string domain, string path, Stream stream, string attachmentFileName); + protected abstract Uri SaveWithAutoAttachment(string domain, string path, Guid ownerId, Stream stream, string attachmentFileName); public abstract Uri Save(string domain, string path, Stream stream, string contentType, string contentDisposition); + public abstract Uri Save(string domain, string path, Guid ownerId, Stream stream, string contentType, + string contentDisposition); public abstract Uri Save(string domain, string path, Stream stream, string contentEncoding, int cacheDays); public virtual bool IsSupportedPreSignedUri @@ -176,6 +188,11 @@ public virtual string UploadChunk(string domain, string path, string uploadId, S throw new NotImplementedException(); } + public virtual Task UploadChunkAsync(string domain, string path, string uploadId, Stream stream, long defaultChunkSize, int chunkNumber, long chunkLength) + { + throw new NotImplementedException(); + } + public virtual Uri FinalizeChunkedUpload(string domain, string path, string uploadId, Dictionary eTags) { throw new NotImplementedException(); @@ -188,9 +205,17 @@ public virtual void AbortChunkedUpload(string domain, string path, string upload public virtual bool IsSupportChunking { get { return false; } } + public virtual IDataWriteOperator CreateDataWriteOperator( + CommonChunkedUploadSession chunkedUploadSession, + CommonChunkedUploadSessionHolder sessionHolder) + { + return null; + } + #endregion public abstract void Delete(string domain, string path); + public abstract void DeleteFiles(string domain, string folderPath, string pattern, bool recursive, Guid ownerId); public abstract void DeleteFiles(string domain, string folderPath, string pattern, bool recursive); public abstract void DeleteFiles(string domain, List paths); public abstract void DeleteFiles(string domain, string folderPath, DateTime fromDate, DateTime toDate); @@ -202,6 +227,7 @@ public virtual void AbortChunkedUpload(string domain, string path, string upload public abstract bool IsFile(string domain, string path); public abstract Task IsFileAsync(string domain, string path); public abstract bool IsDirectory(string domain, string path); + public abstract void DeleteDirectory(string domain, string path, Guid ownerId); public abstract void DeleteDirectory(string domain, string path); public abstract long GetFileSize(string domain, string path); public abstract Task GetFileSizeAsync(string domain, string path); @@ -274,7 +300,10 @@ public bool IsDirectory(string path) { return IsDirectory(string.Empty, path); } - + public void DeleteDirectory(Guid ownerId, string path) + { + DeleteDirectory(string.Empty, path, ownerId); + } public void DeleteDirectory(string path) { DeleteDirectory(string.Empty, path); @@ -324,20 +353,26 @@ public abstract string GetPostParams(string domain, string directoryPath, long m string contentDisposition); #endregion - internal void QuotaUsedAdd(string domain, long size, bool quotaCheckFileSize = true) + { + QuotaUsedAdd(domain, size, Guid.Empty, quotaCheckFileSize); + } + internal void QuotaUsedAdd(string domain, long size, Guid ownerId, bool quotaCheckFileSize = true) { if (QuotaController != null) { - QuotaController.QuotaUsedAdd(_modulename, domain, _dataList.GetData(domain), size, quotaCheckFileSize); + QuotaController.QuotaUsedAdd(_modulename, domain, _dataList.GetData(domain), size, ownerId, quotaCheckFileSize); } } - internal void QuotaUsedDelete(string domain, long size) + { + QuotaUsedDelete(domain, size, Guid.Empty); + } + internal void QuotaUsedDelete(string domain, long size, Guid ownerId) { if (QuotaController != null) { - QuotaController.QuotaUsedDelete(_modulename, domain, _dataList.GetData(domain), size); + QuotaController.QuotaUsedDelete(_modulename, domain, _dataList.GetData(domain), size, ownerId); } } @@ -346,6 +381,22 @@ internal static string EnsureLeadingSlash(string str) return "/" + str.TrimStart('/'); } + protected abstract DateTime GetLastModificationDate(string domain, string path); + + public bool TryGetFileEtag(string domain, string path, out string etag) + { + etag = ""; + + if (_cache) + { + var lastModificationDate = GetLastModificationDate(domain, path); + etag = '"' + lastModificationDate.Ticks.ToString("X8", CultureInfo.InvariantCulture) + '"'; + return true; + } + + return false; + } + internal class MonoUri : Uri { public MonoUri(Uri baseUri, string relativeUri) diff --git a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs index d032a121a..c9bf22559 100644 --- a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs +++ b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.IO; @@ -37,10 +37,13 @@ public class CommonChunkedUploadSession : ICloneable public long BytesUploaded { get; set; } public long BytesTotal { get; set; } + public bool LastChunk { get; set; } public int TenantId { get; set; } public Guid UserId { get; set; } + + public string LinkId { get; set; } public bool UseChunks { get; set; } @@ -76,8 +79,10 @@ public CommonChunkedUploadSession(long bytesTotal) BytesUploaded = 0; BytesTotal = bytesTotal; UseChunks = true; + LastChunk = false; } + public T GetItemOrDefault(string key) { if (Items.ContainsKey(key) && Items[key] != null) diff --git a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSessionHolder.cs b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSessionHolder.cs index 246edd929..3e3895104 100644 --- a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSessionHolder.cs +++ b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSessionHolder.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; using ASC.Common.Logging; using ASC.Data.Storage; @@ -31,8 +32,9 @@ public class CommonChunkedUploadSessionHolder public IDataStore DataStore { get; set; } private string Domain { get; set; } - private long MaxChunkUploadSize { get; set; } - private const string StoragePath = "sessions"; + public long MaxChunkUploadSize { get; private set; } + private const string StoragePath = "sessions"; + private readonly object locker = new object(); public CommonChunkedUploadSessionHolder(IDataStore dataStore, string domain, long maxChunkUploadSize = 10 * 1024 * 1024) @@ -78,7 +80,7 @@ public T Get(string sessionId) public void Init(CommonChunkedUploadSession chunkedUploadSession) { - if (chunkedUploadSession.BytesTotal < MaxChunkUploadSize) + if (chunkedUploadSession.BytesTotal < MaxChunkUploadSize && chunkedUploadSession.BytesTotal != -1) { chunkedUploadSession.UseChunks = false; return; @@ -91,15 +93,14 @@ public void Init(CommonChunkedUploadSession chunkedUploadSession) chunkedUploadSession.UploadId = uploadId; } - public void Finalize(CommonChunkedUploadSession uploadSession) + public virtual string Finalize(CommonChunkedUploadSession uploadSession) { var tempPath = uploadSession.TempPath; var uploadId = uploadSession.UploadId; - var eTags = uploadSession.GetItemOrDefault>("ETag") - .Select((x, i) => new KeyValuePair(i + 1, x)) - .ToDictionary(x => x.Key, x => x.Value); + var eTags = uploadSession.GetItemOrDefault>("ETag"); - DataStore.FinalizeChunkedUpload(Domain, tempPath, uploadId, eTags); + DataStore.FinalizeChunkedUpload(Domain, tempPath, uploadId, eTags); + return Path.GetFileName(tempPath); } public void Move(CommonChunkedUploadSession chunkedUploadSession, string newPath, bool quotaCheckFileSize = true) @@ -122,7 +123,7 @@ public void Abort(CommonChunkedUploadSession uploadSession) } } - public void UploadChunk(CommonChunkedUploadSession uploadSession, Stream stream, long length) + public virtual string UploadChunk(CommonChunkedUploadSession uploadSession, Stream stream, long length) { var tempPath = uploadSession.TempPath; var uploadId = uploadSession.UploadId; @@ -136,9 +137,34 @@ public void UploadChunk(CommonChunkedUploadSession uploadSession, Stream stream, uploadSession.Items["ChunksUploaded"] = chunkNumber.ToString(); uploadSession.BytesUploaded += length; - var eTags = uploadSession.GetItemOrDefault>("ETag") ?? new List(); - eTags.Add(eTag); - uploadSession.Items["ETag"] = eTags; + var eTags = uploadSession.GetItemOrDefault>("ETag") ?? new Dictionary(); + eTags.Add(chunkNumber, eTag); + uploadSession.Items["ETag"] = eTags; + return Path.GetFileName(tempPath); + } + + public virtual async Task UploadChunkAsync(CommonChunkedUploadSession uploadSession, Stream stream, long length) + { + var tempPath = uploadSession.TempPath; + var uploadId = uploadSession.UploadId; + + int chunkNumber; + lock (locker) + { + int.TryParse(uploadSession.GetItemOrDefault("ChunksUploaded"), out chunkNumber); + chunkNumber++; + uploadSession.Items["ChunksUploaded"] = chunkNumber.ToString(); + uploadSession.BytesUploaded += length; + } + + var eTag = await DataStore.UploadChunkAsync(Domain, tempPath, uploadId, stream, MaxChunkUploadSize, chunkNumber, length); + + lock (locker) + { + var eTags = uploadSession.GetItemOrDefault>("ETag") ?? new Dictionary(); + eTags.Add(chunkNumber, eTag); + uploadSession.Items["ETag"] = eTags; + } } public Stream UploadSingleChunk(CommonChunkedUploadSession uploadSession, Stream stream, long chunkLength) diff --git a/common/ASC.Data.Storage/Configuration/ACL.cs b/common/ASC.Data.Storage/Configuration/ACL.cs index 1233c97c1..e4dcad4a2 100644 --- a/common/ASC.Data.Storage/Configuration/ACL.cs +++ b/common/ASC.Data.Storage/Configuration/ACL.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/Configuration/AppenderConfigurationCollection.cs b/common/ASC.Data.Storage/Configuration/AppenderConfigurationCollection.cs index 47f8f05b6..55454ea9c 100644 --- a/common/ASC.Data.Storage/Configuration/AppenderConfigurationCollection.cs +++ b/common/ASC.Data.Storage/Configuration/AppenderConfigurationCollection.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/Configuration/AppenderConfigurationElement.cs b/common/ASC.Data.Storage/Configuration/AppenderConfigurationElement.cs index 6aac30152..4fb8ed0c3 100644 --- a/common/ASC.Data.Storage/Configuration/AppenderConfigurationElement.cs +++ b/common/ASC.Data.Storage/Configuration/AppenderConfigurationElement.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/Configuration/DomainConfigurationCollection.cs b/common/ASC.Data.Storage/Configuration/DomainConfigurationCollection.cs index 939e4866c..702fd4358 100644 --- a/common/ASC.Data.Storage/Configuration/DomainConfigurationCollection.cs +++ b/common/ASC.Data.Storage/Configuration/DomainConfigurationCollection.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/Configuration/DomainConfigurationElement.cs b/common/ASC.Data.Storage/Configuration/DomainConfigurationElement.cs index 92fb3b3e3..31165cd1f 100644 --- a/common/ASC.Data.Storage/Configuration/DomainConfigurationElement.cs +++ b/common/ASC.Data.Storage/Configuration/DomainConfigurationElement.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/Configuration/HandlerConfigurationElement.cs b/common/ASC.Data.Storage/Configuration/HandlerConfigurationElement.cs index 3f12f194e..a32fdfe24 100644 --- a/common/ASC.Data.Storage/Configuration/HandlerConfigurationElement.cs +++ b/common/ASC.Data.Storage/Configuration/HandlerConfigurationElement.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/Configuration/HandlersConfigurationCollection.cs b/common/ASC.Data.Storage/Configuration/HandlersConfigurationCollection.cs index 2055027d7..1299d2f2d 100644 --- a/common/ASC.Data.Storage/Configuration/HandlersConfigurationCollection.cs +++ b/common/ASC.Data.Storage/Configuration/HandlersConfigurationCollection.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/Configuration/ModuleConfigurationCollection.cs b/common/ASC.Data.Storage/Configuration/ModuleConfigurationCollection.cs index 36464aa75..0ebd8ec79 100644 --- a/common/ASC.Data.Storage/Configuration/ModuleConfigurationCollection.cs +++ b/common/ASC.Data.Storage/Configuration/ModuleConfigurationCollection.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/Configuration/ModuleConfigurationElement.cs b/common/ASC.Data.Storage/Configuration/ModuleConfigurationElement.cs index ddd351422..73152c666 100644 --- a/common/ASC.Data.Storage/Configuration/ModuleConfigurationElement.cs +++ b/common/ASC.Data.Storage/Configuration/ModuleConfigurationElement.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -122,5 +122,12 @@ public bool DisabledEncryption get { return (bool)this[Schema.DISABLEDENCRYPTION]; } set { this[Schema.DISABLEDENCRYPTION] = value; } } + + [ConfigurationProperty(Schema.CACHE)] + public bool Cache + { + get { return (bool)this[Schema.CACHE]; } + set { this[Schema.CACHE] = value; } + } } } \ No newline at end of file diff --git a/common/ASC.Data.Storage/Configuration/Schema.cs b/common/ASC.Data.Storage/Configuration/Schema.cs index 306f22bbe..393e0f608 100644 --- a/common/ASC.Data.Storage/Configuration/Schema.cs +++ b/common/ASC.Data.Storage/Configuration/Schema.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,5 +47,6 @@ static class Schema public const string PUBLIC = "public"; public const string DISABLEDMIGRATE = "disableMigrate"; public const string DISABLEDENCRYPTION = "disableEncryption"; + public const string CACHE = "cache"; } } \ No newline at end of file diff --git a/common/ASC.Data.Storage/Configuration/StorageConfigurationSection.cs b/common/ASC.Data.Storage/Configuration/StorageConfigurationSection.cs index b9b227414..4d9834526 100644 --- a/common/ASC.Data.Storage/Configuration/StorageConfigurationSection.cs +++ b/common/ASC.Data.Storage/Configuration/StorageConfigurationSection.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/Configuration/StorageSettings.cs b/common/ASC.Data.Storage/Configuration/StorageSettings.cs index 820acd626..1de2803c5 100644 --- a/common/ASC.Data.Storage/Configuration/StorageSettings.cs +++ b/common/ASC.Data.Storage/Configuration/StorageSettings.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Runtime.Serialization; @@ -31,9 +31,12 @@ namespace ASC.Data.Storage.Configuration [DataContract] public abstract class BaseStorageSettings : BaseSettings where T : class, ISettings, new() { + ///Module [DataMember(Name = "Module")] public string Module { get; set; } + ///Props + ///list [DataMember(Name = "Props")] public Dictionary Props { get; set; } @@ -119,6 +122,7 @@ public IDataStore DataStore public virtual Func Switch { get { return d => d; } } } + ///ASC.Data.Storage.Configuration.BaseStorageSettings`1, ASC.Data.Storage [Serializable] [DataContract] public class StorageSettings : BaseStorageSettings @@ -129,6 +133,7 @@ public override Guid ID } } + ///ASC.Data.Storage.Configuration.BaseStorageSettings`1, ASC.Data.Storage [Serializable] [DataContract] public class CdnStorageSettings : BaseStorageSettings diff --git a/common/ASC.Data.Storage/Constants.cs b/common/ASC.Data.Storage/Constants.cs index 1bbfbb65e..a5848356b 100644 --- a/common/ASC.Data.Storage/Constants.cs +++ b/common/ASC.Data.Storage/Constants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,5 +24,6 @@ class Constants public const string QUERY_AUTH = "auth"; public const string QUERY_EXPIRE = "expire"; public const string QUERY_HEADER = "headers"; + public const string SECUREKEY_HEADER = "SecureKey"; } } \ No newline at end of file diff --git a/common/ASC.Data.Storage/CrossModuleTransferUtility.cs b/common/ASC.Data.Storage/CrossModuleTransferUtility.cs index 43c2a5065..a464c6a5d 100644 --- a/common/ASC.Data.Storage/CrossModuleTransferUtility.cs +++ b/common/ASC.Data.Storage/CrossModuleTransferUtility.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/DataList.cs b/common/ASC.Data.Storage/DataList.cs index 657e7592f..4ce03e8e8 100644 --- a/common/ASC.Data.Storage/DataList.cs +++ b/common/ASC.Data.Storage/DataList.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/DataStoreCache.cs b/common/ASC.Data.Storage/DataStoreCache.cs index 5aa2120e1..85967f9fd 100644 --- a/common/ASC.Data.Storage/DataStoreCache.cs +++ b/common/ASC.Data.Storage/DataStoreCache.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/DiscStorage/DiscDataHandler.cs b/common/ASC.Data.Storage/DiscStorage/DiscDataHandler.cs index 43f949ef8..93fb4e070 100644 --- a/common/ASC.Data.Storage/DiscStorage/DiscDataHandler.cs +++ b/common/ASC.Data.Storage/DiscStorage/DiscDataHandler.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Globalization; using System.IO; diff --git a/common/ASC.Data.Storage/DiscStorage/DiscDataStore.cs b/common/ASC.Data.Storage/DiscStorage/DiscDataStore.cs index 9ff4a694f..0b2550172 100644 --- a/common/ASC.Data.Storage/DiscStorage/DiscDataStore.cs +++ b/common/ASC.Data.Storage/DiscStorage/DiscDataStore.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,9 +24,11 @@ using ASC.Common; using ASC.Common.Logging; using ASC.Core; +using ASC.Core.ChunkedUploader; using ASC.Core.Encryption; using ASC.Data.Storage.Configuration; using ASC.Data.Storage.Encryption; +using ASC.Data.Storage.ZipOperators; namespace ASC.Data.Storage.DiscStorage { @@ -42,6 +44,7 @@ public DiscDataStore(string tenant, HandlerConfigurationElement handlerConfig, M _tenant = tenant; //Fill map path _modulename = moduleConfig.Name; + _cache = moduleConfig.Cache; _dataList = new DataList(moduleConfig); foreach (DomainConfigurationElement domain in moduleConfig.Domains) { @@ -97,7 +100,7 @@ public Stream GetReadStream(string domain, string path, bool withDecription) } - public override Stream GetReadStream(string domain, string path, int offset) + public override Stream GetReadStream(string domain, string path, long offset) { if (path == null) throw new ArgumentNullException("path"); var target = GetTarget(domain, path); @@ -111,16 +114,23 @@ public override Stream GetReadStream(string domain, string path, int offset) throw new FileNotFoundException("File not found", Path.GetFullPath(target)); } - public override Task GetReadStreamAsync(string domain, string path, int offset) + public override Task GetReadStreamAsync(string domain, string path, long offset) { return Task.FromResult(GetReadStream(domain, path, offset)); } + protected override Uri SaveWithAutoAttachment(string domain, string path, Guid ownerId, Stream stream, string attachmentFileName) + { + return Save(domain, path, stream, ownerId); + } protected override Uri SaveWithAutoAttachment(string domain, string path, Stream stream, string attachmentFileName) { return Save(domain, path, stream); } - + public override Uri Save(string domain, string path, Guid ownerId, Stream stream, string contentType, string contentDisposition) + { + return Save(domain, path, stream, ownerId); + } public override Uri Save(string domain, string path, Stream stream, string contentType, string contentDisposition) { return Save(domain, path, stream); @@ -130,14 +140,17 @@ public override Uri Save(string domain, string path, Stream stream, string conte { return Save(domain, path, stream); } - public override Uri Save(string domain, string path, Stream stream) + { + return Save(domain, path, stream, Guid.Empty); + } + public override Uri Save(string domain, string path, Stream stream, Guid ownerId) { LogManager.GetLogger("ASC").Debug("Save " + path); var buffered = stream.GetBuffered(); if (QuotaController != null) { - QuotaController.QuotaUsedCheck(buffered.Length); + QuotaController.QuotaUsedCheck(buffered.Length, ownerId); } if (path == null) throw new ArgumentNullException("path"); @@ -177,7 +190,7 @@ public override Uri Save(string domain, string path, Stream stream) } } - QuotaUsedAdd(domain, fslen); + QuotaUsedAdd(domain, fslen, ownerId); crypt.EncryptFile(target); @@ -199,6 +212,13 @@ public override bool IsSupportedPreSignedUri #region chunking + public override IDataWriteOperator CreateDataWriteOperator( + CommonChunkedUploadSession chunkedUploadSession, + CommonChunkedUploadSessionHolder sessionHolder) + { + return new ChunkZipWriteOperator(chunkedUploadSession, sessionHolder); + } + public override string InitiateChunkedUpload(string domain, string path) { var target = GetTarget(domain, path); @@ -295,6 +315,10 @@ public override void DeleteFiles(string domain, List paths) } public override void DeleteFiles(string domain, string folderPath, string pattern, bool recursive) + { + DeleteFiles(domain, folderPath, pattern, recursive, Guid.Empty); + } + public override void DeleteFiles(string domain, string folderPath, string pattern, bool recursive, Guid ownerId) { if (folderPath == null) throw new ArgumentNullException("folderPath"); @@ -307,7 +331,7 @@ public override void DeleteFiles(string domain, string folderPath, string patter { var size = crypt.GetFileSize(entry); File.Delete(entry); - QuotaUsedDelete(domain, size); + QuotaUsedDelete(domain, size, ownerId); } } else @@ -400,8 +424,11 @@ public override bool IsDirectory(string domain, string path) } return !string.IsNullOrEmpty(targetDir) && Directory.Exists(targetDir); } - public override void DeleteDirectory(string domain, string path) + { + DeleteDirectory(domain, path, Guid.Empty); + } + public override void DeleteDirectory(string domain, string path, Guid ownerId) { if (path == null) throw new ArgumentNullException("path"); @@ -426,7 +453,7 @@ public override void DeleteDirectory(string domain, string path) Directory.Delete(targetDir, true); - QuotaUsedDelete(domain, size); + QuotaUsedDelete(domain, size, ownerId); } public override long GetFileSize(string domain, string path) @@ -729,5 +756,19 @@ public void Decrypt(string domain, string path) throw new FileNotFoundException("file not found", target); } } + + protected override DateTime GetLastModificationDate(string domain, string path) + { + if (path == null) throw new ArgumentNullException("path"); + + var target = GetTarget(domain, path); + + if (File.Exists(target)) + { + return File.GetLastWriteTimeUtc(target); + } + + throw new FileNotFoundException("File not found", Path.GetFullPath(target)); + } } } \ No newline at end of file diff --git a/common/ASC.Data.Storage/DiscStorage/MappedPath.cs b/common/ASC.Data.Storage/DiscStorage/MappedPath.cs index 5dfd51109..d6d66d9ea 100644 --- a/common/ASC.Data.Storage/DiscStorage/MappedPath.cs +++ b/common/ASC.Data.Storage/DiscStorage/MappedPath.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; using System.IO; diff --git a/common/ASC.Data.Storage/Encryption/EncryptionFactory.cs b/common/ASC.Data.Storage/Encryption/EncryptionFactory.cs index 993e51ded..1cce55459 100644 --- a/common/ASC.Data.Storage/Encryption/EncryptionFactory.cs +++ b/common/ASC.Data.Storage/Encryption/EncryptionFactory.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.Common.DependencyInjection; using ASC.Core.Encryption; diff --git a/common/ASC.Data.Storage/Encryption/EncryptionServiceClient.cs b/common/ASC.Data.Storage/Encryption/EncryptionServiceClient.cs index 1e7541eaf..e0171a601 100644 --- a/common/ASC.Data.Storage/Encryption/EncryptionServiceClient.cs +++ b/common/ASC.Data.Storage/Encryption/EncryptionServiceClient.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.Common.Module; using ASC.Core.Encryption; diff --git a/common/ASC.Data.Storage/Encryption/FakeCrypt.cs b/common/ASC.Data.Storage/Encryption/FakeCrypt.cs index 76961587b..8a58fee6b 100644 --- a/common/ASC.Data.Storage/Encryption/FakeCrypt.cs +++ b/common/ASC.Data.Storage/Encryption/FakeCrypt.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.IO; using ASC.Core.Encryption; diff --git a/common/ASC.Data.Storage/Encryption/IEncryptionService.cs b/common/ASC.Data.Storage/Encryption/IEncryptionService.cs index a47ace447..5779f1644 100644 --- a/common/ASC.Data.Storage/Encryption/IEncryptionService.cs +++ b/common/ASC.Data.Storage/Encryption/IEncryptionService.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.ServiceModel; using ASC.Core.Encryption; diff --git a/common/ASC.Data.Storage/Extensions.cs b/common/ASC.Data.Storage/Extensions.cs index 9f9871565..cb7d018c1 100644 --- a/common/ASC.Data.Storage/Extensions.cs +++ b/common/ASC.Data.Storage/Extensions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/GoogleCloud/GoogleCloudStorage.cs b/common/ASC.Data.Storage/GoogleCloud/GoogleCloudStorage.cs index a0201d25e..e9fd4a308 100644 --- a/common/ASC.Data.Storage/GoogleCloud/GoogleCloudStorage.cs +++ b/common/ASC.Data.Storage/GoogleCloud/GoogleCloudStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -61,6 +61,7 @@ public GoogleCloudStorage(string tenant) _tenant = tenant; _modulename = string.Empty; + _cache = false; _dataList = null; _domainsExpires = new Dictionary { { string.Empty, TimeSpan.Zero } }; @@ -74,6 +75,7 @@ public GoogleCloudStorage(string tenant, HandlerConfigurationElement handlerConf _tenant = tenant; _modulename = moduleConfig.Name; + _cache = moduleConfig.Cache; _dataList = new DataList(moduleConfig); _domainsExpires = @@ -202,7 +204,7 @@ public override System.IO.Stream GetReadStream(string domain, string path) return GetReadStream(domain, path, 0); } - public override System.IO.Stream GetReadStream(string domain, string path, int offset) + public override System.IO.Stream GetReadStream(string domain, string path, long offset) { var tempStream = TempStream.Create(); @@ -218,7 +220,7 @@ public override System.IO.Stream GetReadStream(string domain, string path, int o return tempStream; } - public override async Task GetReadStreamAsync(string domain, string path, int offset) + public override async Task GetReadStreamAsync(string domain, string path, long offset) { var tempStream = TempStream.Create(); @@ -234,6 +236,10 @@ public override async Task GetReadStreamAsync(string domain, string path return tempStream; } + public override Uri Save(string domain, string path, System.IO.Stream stream, Guid ownerId) + { + return Save(domain, path, ownerId, stream, string.Empty, string.Empty); + } public override Uri Save(string domain, string path, System.IO.Stream stream) { return Save(domain, path, stream, string.Empty, string.Empty); @@ -245,6 +251,11 @@ public override Uri Save(string domain, string path, System.IO.Stream stream, Co } protected override Uri SaveWithAutoAttachment(string domain, string path, System.IO.Stream stream, string attachmentFileName) + { + return SaveWithAutoAttachment(domain, path, Guid.Empty, stream, attachmentFileName); + } + + protected override Uri SaveWithAutoAttachment(string domain, string path, Guid ownerId, System.IO.Stream stream, string attachmentFileName) { var contentDisposition = string.Format("attachment; filename={0};", HttpUtility.UrlPathEncode(attachmentFileName)); @@ -255,26 +266,33 @@ protected override Uri SaveWithAutoAttachment(string domain, string path, System } return Save(domain, path, stream, null, contentDisposition); } - public override Uri Save(string domain, string path, System.IO.Stream stream, string contentType, string contentDisposition) { - return Save(domain, path, stream, contentType, contentDisposition, ACL.Auto); + return Save(domain, path, Guid.Empty, stream, contentType, contentDisposition); + } + public override Uri Save(string domain, string path, Guid ownerId, System.IO.Stream stream, string contentType, string contentDisposition) + { + return Save(domain, path, ownerId, stream, contentType, contentDisposition, ACL.Auto); } public override Uri Save(string domain, string path, System.IO.Stream stream, string contentEncoding, int cacheDays) { return Save(domain, path, stream, string.Empty, string.Empty, ACL.Auto, contentEncoding, cacheDays); } - public Uri Save(string domain, string path, Stream stream, string contentType, string contentDisposition, ACL acl, string contentEncoding = null, int cacheDays = 5) { + return Save(domain, path, Guid.Empty, stream, contentType, contentDisposition, acl, contentEncoding, cacheDays); + } + public Uri Save(string domain, string path, Guid ownerId, Stream stream, string contentType, + string contentDisposition, ACL acl, string contentEncoding = null, int cacheDays = 5) + { var buffered = stream.GetBuffered(); if (QuotaController != null) { - QuotaController.QuotaUsedCheck(buffered.Length); + QuotaController.QuotaUsedCheck(buffered.Length, ownerId); } var mime = string.IsNullOrEmpty(contentType) @@ -293,7 +311,7 @@ public Uri Save(string domain, string path, Stream stream, string contentType, var uploaded = storage.UploadObject(_bucket, MakePath(domain, path), mime, buffered, uploadObjectOptions, null); uploaded.ContentEncoding = contentEncoding; - uploaded.CacheControl = String.Format("public, maxage={0}", (int)TimeSpan.FromDays(cacheDays).TotalSeconds); + uploaded.CacheControl = String.Format("public, max-age={0}", (int)TimeSpan.FromDays(cacheDays).TotalSeconds); if (uploaded.Metadata == null) uploaded.Metadata = new Dictionary(); @@ -313,7 +331,7 @@ public Uri Save(string domain, string path, Stream stream, string contentType, // InvalidateCloudFront(MakePath(domain, path)); - QuotaUsedAdd(domain, buffered.Length); + QuotaUsedAdd(domain, buffered.Length, ownerId); return GetUri(domain, path); } @@ -362,6 +380,10 @@ public override void Delete(string domain, string path) public override void DeleteFiles(string domain, string folderPath, string pattern, bool recursive) + { + DeleteFiles(domain, folderPath, pattern, recursive, Guid.Empty); + } + public override void DeleteFiles(string domain, string folderPath, string pattern, bool recursive, Guid ownerId) { var storage = GetStorage(); @@ -377,7 +399,7 @@ public override void DeleteFiles(string domain, string folderPath, string patter foreach (var obj in objToDel) { storage.DeleteObject(_bucket, obj.Name); - QuotaUsedDelete(domain, Convert.ToInt64(obj.Size)); + QuotaUsedDelete(domain, Convert.ToInt64(obj.Size), ownerId); } } @@ -533,6 +555,10 @@ public override bool IsDirectory(string domain, string path) } public override void DeleteDirectory(string domain, string path) + { + DeleteDirectory(domain, path, Guid.Empty); + } + public override void DeleteDirectory(string domain, string path, Guid ownerId) { var storage = GetStorage(); @@ -542,7 +568,7 @@ public override void DeleteDirectory(string domain, string path) foreach (var obj in objToDel) { storage.DeleteObject(_bucket, obj.Name); - QuotaUsedDelete(domain, Convert.ToInt64(obj.Size)); + QuotaUsedDelete(domain, Convert.ToInt64(obj.Size), ownerId); } } @@ -692,7 +718,7 @@ public override string SavePrivate(string domain, string path, System.IO.Stream var uploaded = storage.UploadObject(_bucket, MakePath(domain, path), "application/octet-stream", buffered, uploadObjectOptions, null); - uploaded.CacheControl = String.Format("public, maxage={0}", (int)TimeSpan.FromDays(5).TotalSeconds); + uploaded.CacheControl = String.Format("public, max-age={0}", (int)TimeSpan.FromDays(5).TotalSeconds); uploaded.ContentDisposition = "attachment"; if (uploaded.Metadata == null) @@ -875,6 +901,17 @@ public override string GetPostParams(string domain, string directoryPath, long m { throw new NotImplementedException(); } + + protected override DateTime GetLastModificationDate(string domain, string path) + { + var storage = GetStorage(); + + var obj = storage.GetObject(_bucket, MakePath(domain, path)); + + if (obj == null) throw new FileNotFoundException(); + + return obj.Updated ?? obj.TimeCreated ?? DateTime.MinValue; + } } } diff --git a/common/ASC.Data.Storage/IDataStore.cs b/common/ASC.Data.Storage/IDataStore.cs index 99c1c43e8..79e1630b9 100644 --- a/common/ASC.Data.Storage/IDataStore.cs +++ b/common/ASC.Data.Storage/IDataStore.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,9 @@ using System.IO; using System.Threading.Tasks; +using ASC.Core.ChunkedUploader; using ASC.Data.Storage.Configuration; +using ASC.Data.Storage.ZipOperators; namespace ASC.Data.Storage { @@ -29,6 +31,10 @@ namespace ASC.Data.Storage /// public interface IDataStore { + IDataWriteOperator CreateDataWriteOperator( + CommonChunkedUploadSession chunkedUploadSession, + CommonChunkedUploadSessionHolder sessionHolder); + IQuotaController QuotaController { get; set; } TimeSpan GetExpire(string domain); @@ -89,18 +95,19 @@ public interface IDataStore /// /// /// + /// /// - Stream GetReadStream(string domain, string path, int offset); + Stream GetReadStream(string domain, string path, long offset); - Task GetReadStreamAsync(string domain, string path, int offset); + Task GetReadStreamAsync(string domain, string path, long offset); /// /// Saves the contents of the stream in the repository. - /// + /// /// /// /// flow. Is read from the current position! Desirable to set to 0 when the transmission MemoryStream instance - /// + /// Uri Save(string domain, string path, Stream stream); /// @@ -123,6 +130,17 @@ public interface IDataStore /// Uri Save(string domain, string path, Stream stream, string attachmentFileName); + /// + /// Saves the contents of the stream in the repository. + /// + /// + /// + /// + /// + /// + /// + Uri Save(string domain, string path, Guid ownerId, Stream stream, string attachmentFileName); + /// /// Saves the contents of the stream in the repository. /// @@ -149,6 +167,8 @@ public interface IDataStore string UploadChunk(string domain, string path, string uploadId, Stream stream, long defaultChunkSize, int chunkNumber, long chunkLength); + Task UploadChunkAsync(string domain, string path, string uploadId, Stream stream, long defaultChunkSize, int chunkNumber, long chunkLength); + Uri FinalizeChunkedUpload(string domain, string path, string uploadId, Dictionary eTags); void AbortChunkedUpload(string domain, string path, string uploadId); @@ -177,7 +197,7 @@ public interface IDataStore /// Deletes files /// /// - /// + /// void DeleteFiles(string domain, List paths); /// @@ -205,6 +225,7 @@ public interface IDataStore /// /// /// + /// /// Uri Move(string srcdomain, string srcpath, string newdomain, string newpath, bool quotaCheckFileSize = true); @@ -293,6 +314,7 @@ public interface IDataStore bool IsFile(string path); bool IsDirectory(string path); void DeleteDirectory(string path); + void DeleteDirectory(Guid ownerId, string path); long GetFileSize(string path); long GetDirectorySize(string path); Uri Copy(string path, string newdomain, string newpath); @@ -313,5 +335,7 @@ string GetUploadForm(string domain, string directoryPath, string redirectTo, lon string GetPostParams(string domain, string directoryPath, long maxUploadSize, string contentType, string contentDisposition); + + bool TryGetFileEtag(string domain, string path, out string etag); } } \ No newline at end of file diff --git a/common/ASC.Data.Storage/IQuotaController.cs b/common/ASC.Data.Storage/IQuotaController.cs index 57e9b8061..dbd37a5d6 100644 --- a/common/ASC.Data.Storage/IQuotaController.cs +++ b/common/ASC.Data.Storage/IQuotaController.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,17 +15,21 @@ */ +using System; + namespace ASC.Data.Storage { public interface IQuotaController { //quotaCheckFileSize:hack for Backup bug 48873 + void QuotaUsedAdd(string module, string domain, string dataTag, long size, Guid ownerId, bool quotaCheckFileSize = true); void QuotaUsedAdd(string module, string domain, string dataTag, long size, bool quotaCheckFileSize = true); void QuotaUsedDelete(string module, string domain, string dataTag, long size); + void QuotaUsedDelete(string module, string domain, string dataTag, long size, Guid ownerId); void QuotaUsedSet(string module, string domain, string dataTag, long size); - void QuotaUsedCheck(long size); + void QuotaUsedCheck(long size, Guid ownerId); } } \ No newline at end of file diff --git a/common/ASC.Data.Storage/Migration/IService.cs b/common/ASC.Data.Storage/Migration/IService.cs index 03d4d1c53..9e80f94f8 100644 --- a/common/ASC.Data.Storage/Migration/IService.cs +++ b/common/ASC.Data.Storage/Migration/IService.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.ServiceModel; using ASC.Data.Storage.Configuration; diff --git a/common/ASC.Data.Storage/Migration/MigrateServiceClient.cs b/common/ASC.Data.Storage/Migration/MigrateServiceClient.cs index af5b26de6..474f5ba92 100644 --- a/common/ASC.Data.Storage/Migration/MigrateServiceClient.cs +++ b/common/ASC.Data.Storage/Migration/MigrateServiceClient.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.Common.Module; using ASC.Data.Storage.Configuration; diff --git a/common/ASC.Data.Storage/PathUtils.cs b/common/ASC.Data.Storage/PathUtils.cs index 942c02552..38e309817 100644 --- a/common/ASC.Data.Storage/PathUtils.cs +++ b/common/ASC.Data.Storage/PathUtils.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/ProgressStream.cs b/common/ASC.Data.Storage/ProgressStream.cs index 7d2c324c7..8aad3bf5b 100644 --- a/common/ASC.Data.Storage/ProgressStream.cs +++ b/common/ASC.Data.Storage/ProgressStream.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/RackspaceCloud/RackspaceCloudStorage.cs b/common/ASC.Data.Storage/RackspaceCloud/RackspaceCloudStorage.cs index 2b060d268..211335424 100644 --- a/common/ASC.Data.Storage/RackspaceCloud/RackspaceCloudStorage.cs +++ b/common/ASC.Data.Storage/RackspaceCloud/RackspaceCloudStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,6 +55,7 @@ public RackspaceCloudStorage(string tenant) _tenant = tenant; _modulename = string.Empty; + _cache = false; _dataList = null; _domainsExpires = new Dictionary { { string.Empty, TimeSpan.Zero } }; @@ -67,6 +68,7 @@ public RackspaceCloudStorage(string tenant, HandlerConfigurationElement handlerC _tenant = tenant; _modulename = moduleConfig.Name; + _cache = moduleConfig.Cache; _dataList = new DataList(moduleConfig); _domains.AddRange( @@ -211,7 +213,7 @@ public override Stream GetReadStream(string domain, string path) return GetReadStream(domain, path, 0); } - public override Stream GetReadStream(string domain, string path, int offset) + public override Stream GetReadStream(string domain, string path, long offset) { Stream outputStream = TempStream.Create(); @@ -226,22 +228,28 @@ public override Stream GetReadStream(string domain, string path, int offset) return outputStream; } - public override Task GetReadStreamAsync(string domain, string path, int offset) + public override Task GetReadStreamAsync(string domain, string path, long offset) { return Task.FromResult(GetReadStream(domain, path, offset)); } - + public override Uri Save(string domain, string path, Stream stream, Guid ownerId) + { + return Save(domain, path, ownerId, stream, string.Empty, string.Empty); + } public override Uri Save(string domain, string path, Stream stream) { - return Save(domain, path, stream, string.Empty, string.Empty); + return Save(domain, path, Guid.Empty, stream, string.Empty, string.Empty); } public override Uri Save(string domain, string path, Stream stream, ACL acl) { return Save(domain, path, stream, null, null, acl); } - - protected override Uri SaveWithAutoAttachment(string domain, string path, Stream stream, string attachmentFileName) + protected override Uri SaveWithAutoAttachment(string domain, string path, System.IO.Stream stream, string attachmentFileName) + { + return SaveWithAutoAttachment(domain, path, Guid.Empty, stream, attachmentFileName); + } + protected override Uri SaveWithAutoAttachment(string domain, string path, Guid ownerId, System.IO.Stream stream, string attachmentFileName) { var contentDisposition = string.Format("attachment; filename={0};", HttpUtility.UrlPathEncode(attachmentFileName)); @@ -251,9 +259,12 @@ protected override Uri SaveWithAutoAttachment(string domain, string path, Stream HttpUtility.UrlPathEncode(attachmentFileName)); } - return Save(domain, path, stream, null, contentDisposition); + return Save(domain, path, ownerId, stream, null, contentDisposition); + } + public override Uri Save(string domain, string path, Guid ownerId, Stream stream, string contentType, string contentDisposition) + { + return Save(domain, path, ownerId, stream, contentType, contentDisposition, ACL.Auto); } - public override Uri Save(string domain, string path, Stream stream, string contentType, string contentDisposition) { return Save(domain, path, stream, contentType, contentDisposition, ACL.Auto); @@ -263,8 +274,13 @@ public override Uri Save(string domain, string path, Stream stream, string conte { return Save(domain, path, stream, string.Empty, string.Empty, ACL.Auto, contentEncoding, cacheDays); } - public Uri Save(string domain, string path, Stream stream, string contentType, + string contentDisposition, ACL acl, string contentEncoding = null, int cacheDays = 5, + DateTime? deleteAt = null, long? deleteAfter = null) + { + return Save(domain, path, Guid.Empty, stream, contentType,contentDisposition, acl, contentEncoding, cacheDays = 5,deleteAt, deleteAfter); + } + public Uri Save(string domain, string path, Guid ownerId, Stream stream, string contentType, string contentDisposition, ACL acl, string contentEncoding = null, int cacheDays = 5, DateTime? deleteAt = null, long? deleteAfter = null) { @@ -272,7 +288,7 @@ public Uri Save(string domain, string path, Stream stream, string contentType, if (QuotaController != null) { - QuotaController.QuotaUsedCheck(buffered.Length); + QuotaController.QuotaUsedCheck(buffered.Length, ownerId); } var client = GetClient(); @@ -290,7 +306,7 @@ public Uri Save(string domain, string path, Stream stream, string contentType, if (cacheDays > 0) { - customHeaders.Add("Cache-Control", String.Format("public, maxage={0}", (int)TimeSpan.FromDays(cacheDays).TotalSeconds)); + customHeaders.Add("Cache-Control", String.Format("public, max-age={0}", (int)TimeSpan.FromDays(cacheDays).TotalSeconds)); customHeaders.Add("Expires", DateTime.UtcNow.Add(TimeSpan.FromDays(cacheDays)).ToString()); } @@ -356,7 +372,7 @@ public Uri Save(string domain, string path, Stream stream, string contentType, _region ); - QuotaUsedAdd(domain, buffered.Length); + QuotaUsedAdd(domain, buffered.Length, ownerId); return GetUri(domain, path); @@ -389,6 +405,10 @@ public override void Delete(string domain, string path) } public override void DeleteFiles(string domain, string folderPath, string pattern, bool recursive) + { + DeleteFiles(domain, folderPath, pattern, recursive, Guid.Empty); + } + public override void DeleteFiles(string domain, string folderPath, string pattern, bool recursive, Guid ownerId) { var client = GetClient(); @@ -401,7 +421,7 @@ public override void DeleteFiles(string domain, string folderPath, string patter if (QuotaController != null) { - QuotaUsedDelete(domain, files.Select(x => x.Bytes).Sum()); + QuotaUsedDelete(domain, files.Select(x => x.Bytes).Sum(), ownerId); } } @@ -540,8 +560,10 @@ public override bool IsDirectory(string domain, string path) { return IsFile(domain, path); } - - public override void DeleteDirectory(string domain, string path) + public override void DeleteDirectory(string domain, string path) { + DeleteDirectory(domain, path, Guid.Empty); + } + public override void DeleteDirectory(string domain, string path, Guid ownerId) { var client = GetClient(); @@ -550,7 +572,7 @@ public override void DeleteDirectory(string domain, string path) foreach (var obj in objToDel) { client.DeleteObject(_private_container, obj.Name); - QuotaUsedDelete(domain, Convert.ToInt64(obj.Bytes)); + QuotaUsedDelete(domain, Convert.ToInt64(obj.Bytes), ownerId); } } @@ -744,5 +766,16 @@ public override Uri FinalizeChunkedUpload(string domain, string path, string fil public override bool IsSupportChunking { get { return true; } } #endregion + + protected override DateTime GetLastModificationDate(string domain, string path) + { + var client = GetClient(); + + var obj = client.ListObjects(_private_container, null, null, null, MakePath(domain, path), _region).FirstOrDefault(); + + if (obj == null) throw new FileNotFoundException(); + + return obj.LastModified.UtcDateTime; + } } } diff --git a/common/ASC.Data.Storage/S3/S3Storage.cs b/common/ASC.Data.Storage/S3/S3Storage.cs index a54bd1084..a7cc0fd11 100644 --- a/common/ASC.Data.Storage/S3/S3Storage.cs +++ b/common/ASC.Data.Storage/S3/S3Storage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; +using System.Configuration; using System.Globalization; using System.IO; using System.Linq; @@ -28,14 +29,19 @@ using Amazon; using Amazon.CloudFront; using Amazon.CloudFront.Model; +using Amazon.Extensions.S3.Encryption; +using Amazon.Extensions.S3.Encryption.Primitives; using Amazon.S3; +using Amazon.S3.Internal; using Amazon.S3.Model; using Amazon.S3.Transfer; using Amazon.Util; using ASC.Common; using ASC.Core; +using ASC.Core.ChunkedUploader; using ASC.Data.Storage.Configuration; +using ASC.Data.Storage.ZipOperators; using MimeMapping = ASC.Common.Web.MimeMapping; @@ -51,22 +57,25 @@ public class S3Storage : BaseStorage private string _recycleDir = ""; private Uri _bucketRoot; private Uri _bucketSSlRoot; - private string _region = String.Empty; + private string _region = ""; private string _serviceurl; private bool _forcepathstyle; private string _secretAccessKeyId = ""; - private ServerSideEncryptionMethod _sse = ServerSideEncryptionMethod.AES256; private bool _useHttp = true; private bool _lowerCasing = true; private bool _revalidateCloudFront; - private string _distributionId = string.Empty; - private String _subDir = String.Empty; + private string _distributionId = ""; + private string _subDir = ""; + + private EncryptionMethod _encryptionMethod = EncryptionMethod.None; + private string _encryptionKey = null; public S3Storage(string tenant) { _tenant = tenant; _modulename = string.Empty; + _cache = false; _dataList = null; //Make expires @@ -80,6 +89,7 @@ public S3Storage(string tenant, HandlerConfigurationElement handlerConfig, Modul { _tenant = tenant; _modulename = moduleConfig.Name; + _cache = moduleConfig.Cache; _dataList = new DataList(moduleConfig); _domains.AddRange( moduleConfig.Domains.Cast().Select(x => string.Format("{0}/", x.Name))); @@ -159,6 +169,11 @@ public override Uri GetInternalUri(string domain, string path, TimeSpan expire, foreach (var h in headers) { + if (h.StartsWith("SecureKey")) + { + continue; + } + if (h.StartsWith("Content-Disposition")) headersOverrides.ContentDisposition = (h.Substring("Content-Disposition".Length + 1)); else if (h.StartsWith("Cache-Control")) headersOverrides.CacheControl = (h.Substring("Cache-Control".Length + 1)); else if (h.StartsWith("Content-Encoding")) headersOverrides.ContentEncoding = (h.Substring("Content-Encoding".Length + 1)); @@ -180,15 +195,21 @@ private Uri MakeUri(string preSignedURL) { var uri = new Uri(preSignedURL); var signedPart = uri.PathAndQuery.TrimStart('/'); - return new UnencodedUri(uri.Scheme.Equals("https", StringComparison.OrdinalIgnoreCase) ? _bucketSSlRoot : _bucketRoot, signedPart); + + var baseUri = uri.Scheme.Equals("https", StringComparison.OrdinalIgnoreCase) ? _bucketSSlRoot : _bucketRoot; + + if (preSignedURL.StartsWith(baseUri.ToString())) return uri; + + return new UnencodedUri(baseUri, signedPart); } + public override Stream GetReadStream(string domain, string path) { return GetReadStream(domain, path, 0); } - public override Stream GetReadStream(string domain, string path, int offset) + public override Stream GetReadStream(string domain, string path, long offset) { var request = new GetObjectRequest { @@ -215,7 +236,7 @@ public override Stream GetReadStream(string domain, string path, int offset) throw; } } - public override async Task GetReadStreamAsync(string domain, string path, int offset) + public override async Task GetReadStreamAsync(string domain, string path, long offset) { var request = new GetObjectRequest { @@ -242,8 +263,11 @@ public override async Task GetReadStreamAsync(string domain, string path throw; } } - - protected override Uri SaveWithAutoAttachment(string domain, string path, Stream stream, string attachmentFileName) + protected override Uri SaveWithAutoAttachment(string domain, string path, System.IO.Stream stream, string attachmentFileName) + { + return SaveWithAutoAttachment(domain, path, Guid.Empty, stream, attachmentFileName); + } + protected override Uri SaveWithAutoAttachment(string domain, string path, Guid ownerId, System.IO.Stream stream, string attachmentFileName) { var contentDisposition = string.Format("attachment; filename={0};", HttpUtility.UrlPathEncode(attachmentFileName)); @@ -252,23 +276,31 @@ protected override Uri SaveWithAutoAttachment(string domain, string path, Stream contentDisposition = string.Format("attachment; filename*=utf-8''{0};", HttpUtility.UrlPathEncode(attachmentFileName)); } - return Save(domain, path, stream, null, contentDisposition); + return Save(domain, path, ownerId, stream, null, contentDisposition); + } + public override Uri Save(string domain, string path, Guid ownerId, Stream stream, string contentType, + string contentDisposition) + { + return Save(domain, path, ownerId, stream, contentType, contentDisposition, ACL.Auto); } - public override Uri Save(string domain, string path, Stream stream, string contentType, string contentDisposition) { return Save(domain, path, stream, contentType, contentDisposition, ACL.Auto); } - public Uri Save(string domain, string path, Stream stream, string contentType, string contentDisposition, ACL acl, string contentEncoding = null, int cacheDays = 5) + { + return Save(domain, path, Guid.Empty, stream, contentType, contentDisposition, acl, contentEncoding, cacheDays); + } + public Uri Save(string domain, string path, Guid ownerId, Stream stream, string contentType, + string contentDisposition, ACL acl, string contentEncoding = null, int cacheDays = 5) { var buffered = stream.GetBuffered(); if (QuotaController != null) { - QuotaController.QuotaUsedCheck(buffered.Length); + QuotaController.QuotaUsedCheck(buffered.Length, ownerId); } using (var client = GetClient()) @@ -283,16 +315,22 @@ public Uri Save(string domain, string path, Stream stream, string contentType, BucketName = _bucket, Key = MakePath(domain, path), ContentType = mime, - ServerSideEncryptionMethod = _sse, InputStream = buffered, AutoCloseStream = false, Headers = { - CacheControl = string.Format("public, maxage={0}", (int)TimeSpan.FromDays(cacheDays).TotalSeconds), + CacheControl = string.Format("public, max-age={0}", (int)TimeSpan.FromDays(cacheDays).TotalSeconds), ExpiresUtc = DateTime.UtcNow.Add(TimeSpan.FromDays(cacheDays)) } }; + if (!(client is IAmazonS3Encryption)) + { + string kmsKeyId; + request.ServerSideEncryptionMethod = GetServerSideEncryptionMethod(out kmsKeyId); + request.ServerSideEncryptionKeyManagementServiceKeyId = kmsKeyId; + } + if (!WorkContext.IsMono) // System.Net.Sockets.SocketException: Connection reset by peer { switch (acl) @@ -325,7 +363,7 @@ public Uri Save(string domain, string path, Stream stream, string contentType, InvalidateCloudFront(MakePath(domain, path)); - QuotaUsedAdd(domain, buffered.Length); + QuotaUsedAdd(domain, buffered.Length, ownerId); return GetUri(domain, path); } @@ -356,10 +394,13 @@ private void InvalidateCloudFront(params string[] paths) cfClient.CreateInvalidation(invalidationRequest); } } - + public override Uri Save(string domain, string path, Stream stream, Guid ownerId) + { + return Save(domain, path, ownerId, stream, string.Empty, string.Empty); + } public override Uri Save(string domain, string path, Stream stream) { - return Save(domain, path, stream, string.Empty, string.Empty); + return Save(domain, path, Guid.Empty, stream, string.Empty, string.Empty); } public override Uri Save(string domain, string path, Stream stream, string contentEncoding, int cacheDays) @@ -373,18 +414,23 @@ public override Uri Save(string domain, string path, Stream stream, ACL acl) } #region chunking - public override string InitiateChunkedUpload(string domain, string path) { var request = new InitiateMultipartUploadRequest { BucketName = _bucket, - Key = MakePath(domain, path), - ServerSideEncryptionMethod = _sse + Key = MakePath(domain, path) }; using (var s3 = GetClient()) { + if (!(s3 is IAmazonS3Encryption)) + { + string kmsKeyId; + request.ServerSideEncryptionMethod = GetServerSideEncryptionMethod(out kmsKeyId); + request.ServerSideEncryptionKeyManagementServiceKeyId = kmsKeyId; + } + var response = s3.InitiateMultipartUpload(request); return response.UploadId; } @@ -420,6 +466,36 @@ public override string UploadChunk(string domain, string path, string uploadId, } } + public override async Task UploadChunkAsync(string domain, string path, string uploadId, Stream stream, long defaultChunkSize, int chunkNumber, long chunkLength) + { + var request = new UploadPartRequest + { + BucketName = _bucket, + Key = MakePath(domain, path), + UploadId = uploadId, + PartNumber = chunkNumber, + InputStream = stream + }; + + try + { + using (var s3 = GetClient()) + { + var response = await s3.UploadPartAsync(request); + return response.ETag; + } + } + catch (AmazonS3Exception error) + { + if (error.ErrorCode == "NoSuchUpload") + { + AbortChunkedUpload(domain, path, uploadId); + } + + throw; + } + } + public override Uri FinalizeChunkedUpload(string domain, string path, string uploadId, Dictionary eTags) { var request = new CompleteMultipartUploadRequest @@ -476,6 +552,13 @@ public override void AbortChunkedUpload(string domain, string path, string uploa public override bool IsSupportChunking { get { return true; } } + public override IDataWriteOperator CreateDataWriteOperator( + CommonChunkedUploadSession chunkedUploadSession, + CommonChunkedUploadSessionHolder sessionHolder) + { + return new S3ZipWriteOperator(chunkedUploadSession, sessionHolder); + } + #endregion public override void Delete(string domain, string path) @@ -551,6 +634,10 @@ public override void DeleteFiles(string domain, List paths) } public override void DeleteFiles(string domain, string path, string pattern, bool recursive) + { + DeleteFiles(domain, path, pattern, recursive, Guid.Empty); + } + public override void DeleteFiles(string domain, string path, string pattern, bool recursive, Guid ownerId) { var makedPath = MakePath(domain, path) + '/'; var objToDel = GetS3Objects(domain, path) @@ -573,7 +660,7 @@ public override void DeleteFiles(string domain, string path, string pattern, boo client.DeleteObject(deleteRequest); - QuotaUsedDelete(domain, Convert.ToInt64(s3Object.Size)); + QuotaUsedDelete(domain, Convert.ToInt64(s3Object.Size), ownerId); } } } @@ -674,7 +761,7 @@ public override string SavePrivate(string domain, string path, Stream stream, Da InputStream = buffered, Headers = { - CacheControl = string.Format("public, maxage={0}", (int)TimeSpan.FromDays(5).TotalSeconds), + CacheControl = string.Format("public, max-age={0}", (int)TimeSpan.FromDays(5).TotalSeconds), ExpiresUtc = DateTime.UtcNow.Add(TimeSpan.FromDays(5)), ContentDisposition = "attachment", } @@ -911,7 +998,11 @@ public override bool IsDirectory(string domain, string path) public override void DeleteDirectory(string domain, string path) { - DeleteFiles(domain, path, "*", true); + DeleteDirectory(domain, path, Guid.Empty); + } + public override void DeleteDirectory(string domain, string path, Guid ownerId) + { + DeleteFiles(domain, path, "*", true, ownerId); } public override long GetFileSize(string domain, string path) @@ -1082,20 +1173,28 @@ public override IDataStore Configure(IDictionary props) switch (props["sse"].ToLower()) { case "none": - _sse = ServerSideEncryptionMethod.None; + _encryptionMethod = EncryptionMethod.None; break; case "aes256": - _sse = ServerSideEncryptionMethod.AES256; + _encryptionMethod = EncryptionMethod.ServerS3; break; case "awskms": - _sse = ServerSideEncryptionMethod.AWSKMS; + _encryptionMethod = EncryptionMethod.ServerKms; + break; + case "clientawskms": + _encryptionMethod = EncryptionMethod.ClientKms; break; default: - _sse = ServerSideEncryptionMethod.None; + _encryptionMethod = EncryptionMethod.None; break; } } + if (props.ContainsKey("ssekey") && !string.IsNullOrEmpty(props["ssekey"])) + { + _encryptionKey = props["ssekey"]; + } + _bucketRoot = props.ContainsKey("cname") && Uri.IsWellFormedUriString(props["cname"], UriKind.Absolute) ? new Uri(props["cname"], UriKind.Absolute) : new Uri(String.Format("http://s3.{1}.amazonaws.com/{0}/", _bucket, _region), UriKind.Absolute); @@ -1188,10 +1287,16 @@ private void CopyFile(string sourceKey, string destinationKey, string newdomain, { BucketName = _bucket, Key = destinationKey, - CannedACL = GetDomainACL(newdomain), - ServerSideEncryptionMethod = _sse + CannedACL = GetDomainACL(newdomain) }; + if (!(client is IAmazonS3Encryption)) + { + string kmsKeyId; + initiateRequest.ServerSideEncryptionMethod = GetServerSideEncryptionMethod(out kmsKeyId); + initiateRequest.ServerSideEncryptionKeyManagementServiceKeyId = kmsKeyId; + } + if (storageClass != null) { initiateRequest.StorageClass = storageClass; @@ -1201,7 +1306,7 @@ private void CopyFile(string sourceKey, string destinationKey, string newdomain, var uploadId = initResponse.UploadId; - var partSize = 5 * (long)Math.Pow(2, 20); // Part size is 5 MB. + var partSize = GetChunkSize(); long bytePosition = 0; for (int i = 1; bytePosition < objectSize; i++) @@ -1243,10 +1348,16 @@ private void CopyFile(string sourceKey, string destinationKey, string newdomain, DestinationBucket = _bucket, DestinationKey = destinationKey, CannedACL = GetDomainACL(newdomain), - ServerSideEncryptionMethod = _sse, MetadataDirective = metadataDirective, }; + if (!(client is IAmazonS3Encryption)) + { + string kmsKeyId; + request.ServerSideEncryptionMethod = GetServerSideEncryptionMethod(out kmsKeyId); + request.ServerSideEncryptionKeyManagementServiceKeyId = kmsKeyId; + } + if (storageClass != null) { request.StorageClass = storageClass; @@ -1265,9 +1376,16 @@ private IAmazonCloudFront GetCloudFrontClient() private IAmazonS3 GetClient() { + var encryptionClient = GetEncryptionClient(); + + if (encryptionClient != null) + { + return encryptionClient; + } + var cfg = new AmazonS3Config { MaxErrorRetry = 3 }; - if (!String.IsNullOrEmpty(_serviceurl)) + if (!string.IsNullOrEmpty(_serviceurl)) { cfg.ServiceURL = _serviceurl; @@ -1358,5 +1476,115 @@ protected override void Dispose(bool disposing) if (disposing) _response.Dispose(); } } + + + private IAmazonS3 GetEncryptionClient() + { + if (string.IsNullOrEmpty(_encryptionKey)) + { + return null; + } + + EncryptionMaterialsV2 encryptionMaterials = null; + + switch (_encryptionMethod) + { + case EncryptionMethod.ClientKms: + var encryptionContext = new Dictionary(); + encryptionMaterials = new EncryptionMaterialsV2(_encryptionKey, KmsType.KmsContext, encryptionContext); + break; + //case EncryptionMethod.ClientAes: + // var symmetricAlgorithm = Aes.Create(); + // symmetricAlgorithm.Key = Encoding.UTF8.GetBytes(_encryptionKey); + // encryptionMaterials = new EncryptionMaterialsV2(symmetricAlgorithm, SymmetricAlgorithmType.AesGcm); + // break; + //case EncryptionMethod.ClientRsa: + // var asymmetricAlgorithm = RSA.Create(); + // asymmetricAlgorithm.FromXmlString(_encryptionKey); + // encryptionMaterials = new EncryptionMaterialsV2(asymmetricAlgorithm, AsymmetricAlgorithmType.RsaOaepSha1); + // break; + } + + if (encryptionMaterials == null) + { + return null; + } + + var cfg = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy) + { + StorageMode = CryptoStorageMode.ObjectMetadata, + MaxErrorRetry = 3 + }; + + if (!string.IsNullOrEmpty(_serviceurl)) + { + cfg.ServiceURL = _serviceurl; + cfg.ForcePathStyle = _forcepathstyle; + } + else + { + cfg.RegionEndpoint = RegionEndpoint.GetBySystemName(_region); + } + + cfg.UseHttp = _useHttp; + + return new AmazonS3EncryptionClientV2(_accessKeyId, _secretAccessKeyId, cfg, encryptionMaterials); + } + + private ServerSideEncryptionMethod GetServerSideEncryptionMethod(out string kmsKeyId) + { + kmsKeyId = null; + + var method = ServerSideEncryptionMethod.None; + + switch (_encryptionMethod) + { + case EncryptionMethod.ServerS3: + method = ServerSideEncryptionMethod.AES256; + break; + case EncryptionMethod.ServerKms: + method = ServerSideEncryptionMethod.AWSKMS; + if (!string.IsNullOrEmpty(_encryptionKey)) + { + kmsKeyId = _encryptionKey; + } + break; + } + + return method; + } + + protected override DateTime GetLastModificationDate(string domain, string path) + { + using (var client = GetClient()) + { + var a = new Amazon.S3.IO.S3FileInfo(client, _bucket, MakePath(domain, path)); + if (a.Exists) return a.LastWriteTimeUtc; + } + + throw new FileNotFoundException("file not found", path); + } + + private long GetChunkSize() + { + var configSetting = ConfigurationManagerExtension.AppSettings["files.uploader.chunk-size"]; + if (!string.IsNullOrEmpty(configSetting)) + { + configSetting = configSetting.Trim(); + return long.Parse(configSetting); + } + long defaultValue = 10 * 1024 * 1024; + return defaultValue; + } + + private enum EncryptionMethod + { + None, + ServerS3, + ServerKms, + ClientKms, + //ClientAes, + //ClientRsa + } } } \ No newline at end of file diff --git a/common/ASC.Data.Storage/S3/S3UploadGuard.cs b/common/ASC.Data.Storage/S3/S3UploadGuard.cs index 228338234..f4139fff0 100644 --- a/common/ASC.Data.Storage/S3/S3UploadGuard.cs +++ b/common/ASC.Data.Storage/S3/S3UploadGuard.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/S3/UnencodedUri.cs b/common/ASC.Data.Storage/S3/UnencodedUri.cs index 1a77ceee2..e4a489d14 100644 --- a/common/ASC.Data.Storage/S3/UnencodedUri.cs +++ b/common/ASC.Data.Storage/S3/UnencodedUri.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Runtime.Serialization; diff --git a/common/ASC.Data.Storage/SecureHelper.cs b/common/ASC.Data.Storage/SecureHelper.cs index eea284b95..4a654c75a 100644 --- a/common/ASC.Data.Storage/SecureHelper.cs +++ b/common/ASC.Data.Storage/SecureHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,11 @@ using System; +using System.IO; using System.Web; using ASC.Common.Logging; +using ASC.Security.Cryptography; namespace ASC.Data.Storage { @@ -36,5 +38,32 @@ public static bool IsSecure() return false; } } + + public static string GenerateSecureKeyHeader(string path) + { + var ticks = DateTime.UtcNow.Ticks; + var data = path.Replace('/', Path.DirectorySeparatorChar).Replace('\\', Path.DirectorySeparatorChar) + "." + ticks; + var key = EmailValidationKeyProvider.GetEmailKey(data); + + return Constants.SECUREKEY_HEADER + ":" + ticks + "-" + key; + } + + public static bool CheckSecureKeyHeader(string header, string path) + { + if (string.IsNullOrEmpty(header)) + { + return false; + } + + header = header.Replace(Constants.SECUREKEY_HEADER + ":", string.Empty); + + var separatorPosition = header.IndexOf('-'); + var ticks = header.Substring(0, separatorPosition); + var key = header.Substring(separatorPosition + 1); + + var validateResult = EmailValidationKeyProvider.ValidateEmailKey(path + "." + ticks, key); + + return validateResult == EmailValidationKeyProvider.ValidationResult.Ok; + } } } \ No newline at end of file diff --git a/common/ASC.Data.Storage/Selectel/SelectelStorage.cs b/common/ASC.Data.Storage/Selectel/SelectelStorage.cs index 02f2578af..d0a1dbdf9 100644 --- a/common/ASC.Data.Storage/Selectel/SelectelStorage.cs +++ b/common/ASC.Data.Storage/Selectel/SelectelStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,6 +55,7 @@ public SelectelStorage(String tenant) { _tenant = tenant; _modulename = string.Empty; + _cache = false; _dataList = null; _domainsExpires = new Dictionary { { string.Empty, TimeSpan.Zero } }; @@ -67,6 +68,7 @@ public SelectelStorage(String tenant, HandlerConfigurationElement handlerConfig, { _tenant = tenant; _modulename = moduleConfig.Name; + _cache = moduleConfig.Cache; _dataList = new DataList(moduleConfig); _domainsExpires = moduleConfig.Domains.Cast() @@ -178,7 +180,7 @@ public override System.IO.Stream GetReadStream(string domain, string path) } - public override System.IO.Stream GetReadStream(string domain, string path, int offset) + public override System.IO.Stream GetReadStream(string domain, string path, long offset) { var client = GetClient().Result; @@ -204,7 +206,7 @@ public override System.IO.Stream GetReadStream(string domain, string path, int o return fileStream; } - public override async Task GetReadStreamAsync(string domain, string path, int offset) + public override async Task GetReadStreamAsync(string domain, string path, long offset) { var client = await GetClient(); @@ -229,18 +231,24 @@ public override async Task GetReadStreamAsync(string domain, string path return fileStream; } - + public override Uri Save(string domain, string path, System.IO.Stream stream, Guid ownerId) + { + return Save(domain, path, ownerId, stream, null, null, ACL.Auto, null); + } public override Uri Save(string domain, string path, System.IO.Stream stream) { - return Save(domain, path, stream, null, null, ACL.Auto, null); + return Save(domain, path, Guid.Empty, stream, null, null, ACL.Auto, null); } public override Uri Save(string domain, string path, System.IO.Stream stream, Configuration.ACL acl) { return Save(domain, path, stream, null, null, acl); } - protected override Uri SaveWithAutoAttachment(string domain, string path, System.IO.Stream stream, string attachmentFileName) + { + return SaveWithAutoAttachment(domain, path, Guid.Empty, stream, attachmentFileName); + } + protected override Uri SaveWithAutoAttachment(string domain, string path, Guid ownerId, System.IO.Stream stream, string attachmentFileName) { var contentDisposition = string.Format("attachment; filename={0};", HttpUtility.UrlPathEncode(attachmentFileName)); @@ -250,9 +258,12 @@ protected override Uri SaveWithAutoAttachment(string domain, string path, System HttpUtility.UrlPathEncode(attachmentFileName)); } - return Save(domain, path, stream, null, null, ACL.Auto, null); + return Save(domain, path, ownerId, stream, null, null, ACL.Auto, null); + } + public override Uri Save(string domain, string path, Guid ownerId, System.IO.Stream stream, string contentType, string contentDisposition) + { + return Save(domain, path, stream, contentType, contentDisposition, ACL.Auto, null); } - public override Uri Save(string domain, string path, System.IO.Stream stream, string contentType, string contentDisposition) { return Save(domain, path, stream, contentType, contentDisposition, ACL.Auto, null); @@ -262,10 +273,14 @@ public override Uri Save(string domain, string path, System.IO.Stream stream, st { return Save(domain, path, stream, null, null, ACL.Auto, contentEncoding, cacheDays); } - public Uri Save(string domain, string path, Stream stream, string contentType, string contentDisposition, ACL acl, string contentEncoding = null, int cacheDays = 5, DateTime? deleteAt = null, long? deleteAfter = null) { + return Save(domain, path, Guid.Empty, stream, contentType, contentDisposition, acl, contentEncoding, cacheDays, deleteAt, deleteAfter); + } + public Uri Save(string domain, string path, Guid ownerId, Stream stream, string contentType, + string contentDisposition, ACL acl, string contentEncoding = null, int cacheDays = 5, DateTime? deleteAt = null, long? deleteAfter = null) + { var client = GetClient().Result; @@ -274,7 +289,7 @@ public Uri Save(string domain, string path, Stream stream, string contentType, if (QuotaController != null) { - QuotaController.QuotaUsedCheck(buffered.Length); + QuotaController.QuotaUsedCheck(buffered.Length, ownerId); } var mime = string.IsNullOrEmpty(contentType) @@ -290,7 +305,7 @@ public Uri Save(string domain, string path, Stream stream, string contentType, if (cacheDays > 0) { - customHeaders.Add("Cache-Control", String.Format("public, maxage={0}", (int)TimeSpan.FromDays(cacheDays).TotalSeconds)); + customHeaders.Add("Cache-Control", String.Format("public, max-age={0}", (int)TimeSpan.FromDays(cacheDays).TotalSeconds)); customHeaders.Add("Expires", DateTime.UtcNow.Add(TimeSpan.FromDays(cacheDays))); } @@ -327,7 +342,7 @@ public Uri Save(string domain, string path, Stream stream, string contentType, } } - QuotaUsedAdd(domain, buffered.Length); + QuotaUsedAdd(domain, buffered.Length, ownerId); return GetUri(domain, path); } @@ -361,6 +376,10 @@ public override void Delete(string domain, string path) } public override void DeleteFiles(string domain, string folderPath, string pattern, bool recursive) + { + DeleteFiles(domain, folderPath, pattern, recursive, Guid.Empty); + } + public override void DeleteFiles(string domain, string folderPath, string pattern, bool recursive, Guid ownerId) { var client = GetClient().Result; @@ -375,7 +394,7 @@ public override void DeleteFiles(string domain, string folderPath, string patter if (QuotaController != null) { - QuotaUsedDelete(domain, files.Select(x => x.Bytes).Sum()); + QuotaUsedDelete(domain, files.Select(x => x.Bytes).Sum(), ownerId); } } @@ -529,6 +548,10 @@ public override bool IsDirectory(string domain, string path) } public override void DeleteDirectory(string domain, string path) + { + DeleteDirectory(domain, path, Guid.Empty); + } + public override void DeleteDirectory(string domain, string path, Guid ownerId) { var client = GetClient().Result; @@ -540,7 +563,7 @@ public override void DeleteDirectory(string domain, string path) if (QuotaController != null) { - QuotaUsedDelete(domain, files.Select(x => x.Bytes).Sum()); + QuotaUsedDelete(domain, files.Select(x => x.Bytes).Sum(), ownerId); } } @@ -735,5 +758,16 @@ public override Uri FinalizeChunkedUpload(string domain, string path, string fil #endregion + protected override DateTime GetLastModificationDate(string domain, string path) + { + var client = GetClient().Result; + + var file = client.GetFileAsync(_private_container, MakePath(domain, path), null, false).Result; + + if (file == null) throw new FileNotFoundException(); + + return file.LastModified; + } + } } diff --git a/common/ASC.Data.Storage/StaticUploader.cs b/common/ASC.Data.Storage/StaticUploader.cs index 0b0041bcf..9f1c90c11 100644 --- a/common/ASC.Data.Storage/StaticUploader.cs +++ b/common/ASC.Data.Storage/StaticUploader.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.IO; diff --git a/common/ASC.Data.Storage/StorageFactory.cs b/common/ASC.Data.Storage/StorageFactory.cs index 6ab08e7ca..39248557b 100644 --- a/common/ASC.Data.Storage/StorageFactory.cs +++ b/common/ASC.Data.Storage/StorageFactory.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/StorageHandler.cs b/common/ASC.Data.Storage/StorageHandler.cs index e30d38a5b..f5a861465 100644 --- a/common/ASC.Data.Storage/StorageHandler.cs +++ b/common/ASC.Data.Storage/StorageHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -89,17 +89,22 @@ public IHttpHandler GetHttpHandler(RequestContext requestContext) public void ProcessRequest(HttpContext context) { + var path = _path; + var header = context.Request[Constants.QUERY_HEADER] ?? ""; + var headers = header.Length > 0 ? header.Split('&').Select(HttpUtility.UrlDecode) : new string[] { }; + if (_checkAuth && !SecurityContext.IsAuthenticated) { - context.Response.StatusCode = (int)HttpStatusCode.Forbidden; - return; + var secureKeyHeader = headers.FirstOrDefault(x => x.StartsWith(Constants.SECUREKEY_HEADER)); + if (!SecureHelper.CheckSecureKeyHeader(secureKeyHeader, path)) + { + context.Response.StatusCode = (int)HttpStatusCode.Forbidden; + return; + } } var storage = StorageFactory.GetStorage(CoreContext.TenantManager.GetCurrentTenant().TenantId.ToString(CultureInfo.InvariantCulture), _module); - var path = _path; - var header = context.Request[Constants.QUERY_HEADER] ?? ""; - var auth = context.Request[Constants.QUERY_AUTH]; var storageExpire = storage.GetExpire(_domain); @@ -122,10 +127,10 @@ public void ProcessRequest(HttpContext context) return; } - var headers = header.Length > 0 ? header.Split('&').Select(HttpUtility.UrlDecode) : new string[] { }; - const int bigSize = 5 * 1024 * 1024; - if (storage.IsSupportInternalUri && bigSize < storage.GetFileSize(_domain, path)) + var fileSize = storage.GetFileSize(_domain, path); + + if (storage.IsSupportInternalUri && bigSize < fileSize) { var uri = storage.GetInternalUri(_domain, path, TimeSpan.FromMinutes(15), headers); @@ -136,6 +141,20 @@ public void ProcessRequest(HttpContext context) return; } + if (storage.TryGetFileEtag(_domain, path, out var etag)) + { + if (string.Equals(context.Request.Headers["If-None-Match"], etag)) + { + context.Response.StatusCode = (int)HttpStatusCode.NotModified; + return; + } + + context.Response.CacheControl = "public"; + context.Response.AppendHeader("Cache-Control", "public"); + context.Response.Cache.SetETag(etag); + context.Response.Cache.SetCacheability(HttpCacheability.Public); + } + string encoding = null; if (storage is DiscDataStore && storage.IsFile(_domain, path + ".gz")) { @@ -161,20 +180,15 @@ public void ProcessRequest(HttpContext context) return; } - using (var stream = storage.GetReadStream(_domain, path)) - { - context.Response.Buffer = false; + long offset = 0; + var length = ProcessRangeHeader(context, fileSize, ref offset); - long offset = 0; - var length = stream.Length; - if (stream.CanSeek) - { - length = ProcessRangeHeader(context, stream.Length, ref offset); - stream.Seek(offset, SeekOrigin.Begin); - } + context.Response.AddHeader("Connection", "Keep-Alive"); + context.Response.AddHeader("Content-Length", length.ToString(CultureInfo.InvariantCulture)); - context.Response.AddHeader("Connection", "Keep-Alive"); - context.Response.AddHeader("Content-Length", length.ToString(CultureInfo.InvariantCulture)); + using (var stream = storage.GetReadStream(_domain, path, offset)) + { + context.Response.Buffer = false; try { diff --git a/common/ASC.Data.Storage/StorageUploader.cs b/common/ASC.Data.Storage/StorageUploader.cs index 8acf4cb4f..cc1da42f1 100644 --- a/common/ASC.Data.Storage/StorageUploader.cs +++ b/common/ASC.Data.Storage/StorageUploader.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/TenantPath.cs b/common/ASC.Data.Storage/TenantPath.cs index 492433308..32351541d 100644 --- a/common/ASC.Data.Storage/TenantPath.cs +++ b/common/ASC.Data.Storage/TenantPath.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/TenantQuotaController.cs b/common/ASC.Data.Storage/TenantQuotaController.cs index 458860544..a481f7630 100644 --- a/common/ASC.Data.Storage/TenantQuotaController.cs +++ b/common/ASC.Data.Storage/TenantQuotaController.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ using ASC.Core; using ASC.Core.Tenants; +using ASC.Core.Users; namespace ASC.Data.Storage { @@ -38,26 +39,44 @@ public TenantQuotaController(int tenant) } #region IQuotaController Members - public void QuotaUsedAdd(string module, string domain, string dataTag, long size, bool quotaCheckFileSize = true) + { + QuotaUsedAdd(module, domain, dataTag, size, Guid.Empty, quotaCheckFileSize); + } + public void QuotaUsedAdd(string module, string domain, string dataTag, long size, Guid ownerId, bool quotaCheckFileSize) { size = Math.Abs(size); if (UsedInQuota(dataTag)) { - QuotaUsedCheck(size, quotaCheckFileSize); + QuotaUsedCheck(size, quotaCheckFileSize, ownerId); Interlocked.Add(ref _currentSize, size); } - SetTenantQuotaRow(module, domain, size, dataTag, true); + + SetTenantQuotaRow(module, domain, size, dataTag, true, Guid.Empty); + if (ownerId != Core.Configuration.Constants.CoreSystem.ID) + { + SetTenantQuotaRow(module, domain, size, dataTag, true, ownerId != Guid.Empty ? ownerId : SecurityContext.CurrentAccount.ID); + } + } public void QuotaUsedDelete(string module, string domain, string dataTag, long size) + { + QuotaUsedDelete(module, domain, dataTag, size, Guid.Empty); + } + public void QuotaUsedDelete(string module, string domain, string dataTag, long size, Guid ownerId) { size = -Math.Abs(size); if (UsedInQuota(dataTag)) { Interlocked.Add(ref _currentSize, size); } - SetTenantQuotaRow(module, domain, size, dataTag, true); + + SetTenantQuotaRow(module, domain, size, dataTag, true, Guid.Empty); + if (ownerId != Core.Configuration.Constants.CoreSystem.ID) + { + SetTenantQuotaRow(module, domain, size, dataTag, true, ownerId != Guid.Empty ? ownerId : SecurityContext.CurrentAccount.ID); + } } public void QuotaUsedSet(string module, string domain, string dataTag, long size) @@ -67,15 +86,15 @@ public void QuotaUsedSet(string module, string domain, string dataTag, long size { Interlocked.Exchange(ref _currentSize, size); } - SetTenantQuotaRow(module, domain, size, dataTag, false); + SetTenantQuotaRow(module, domain, size, dataTag, false, Guid.Empty); } - public void QuotaUsedCheck(long size) + public void QuotaUsedCheck(long size, Guid ownedId) { - QuotaUsedCheck(size, true); + QuotaUsedCheck(size, true, ownedId); } - public void QuotaUsedCheck(long size, bool quotaCheckFileSize) + public void QuotaUsedCheck(long size, bool quotaCheckFileSize, Guid ownedId) { var quota = CoreContext.TenantManager.GetTenantQuota(_tenant); if (quota != null) @@ -84,9 +103,41 @@ public void QuotaUsedCheck(long size, bool quotaCheckFileSize) { throw new TenantQuotaException(string.Format("Exceeds the maximum file size ({0}MB)", BytesToMegabytes(quota.MaxFileSize))); } - if (quota.MaxTotalSize != 0 && quota.MaxTotalSize < _currentSize + size) + + if (CoreContext.Configuration.Standalone) + { + var tenantQuotaSettings = TenantQuotaSettings.Load(); + if (!tenantQuotaSettings.DisableQuota) + { + if (quota.MaxTotalSize != 0 && quota.MaxTotalSize < _currentSize + size) + { + throw new TenantQuotaException(string.Format("Exceeded maximum amount of disk quota ({0}MB)", BytesToMegabytes(quota.MaxTotalSize))); + } + } + } + else { - throw new TenantQuotaException(string.Format("Exceeded maximum amount of disk quota ({0}MB)", BytesToMegabytes(quota.MaxTotalSize))); + if (quota.MaxTotalSize != 0 && quota.MaxTotalSize < _currentSize + size) + { + throw new TenantQuotaException(string.Format("Exceeded maximum amount of disk quota ({0}MB)", BytesToMegabytes(quota.MaxTotalSize))); + } + } + } + var quotaSettings = TenantUserQuotaSettings.Load(); + + if (quotaSettings.EnableUserQuota) + { + var userQuotaSettings = UserQuotaSettings.LoadForUser(ownedId); + var quotaLimit = userQuotaSettings.UserQuota; + + if (quotaLimit != -1) + { + var userUsedSpace = Math.Max(0, CoreContext.TenantManager.FindUserQuotaRows(_tenant, ownedId).Where(r => !string.IsNullOrEmpty(r.Tag)).Where(r => r.Tag != Guid.Empty.ToString()).Sum(r => r.Counter)); + + if (quotaLimit - userUsedSpace < size) + { + throw new TenantQuotaException(string.Format("Exceeds the maximum file size ({0}MB)", BytesToMegabytes(quotaLimit))); + } } } } @@ -98,10 +149,10 @@ public long QuotaCurrentGet() return _currentSize; } - private void SetTenantQuotaRow(string module, string domain, long size, string dataTag, bool exchange) + private void SetTenantQuotaRow(string module, string domain, long size, string dataTag, bool exchange, Guid userId) { CoreContext.TenantManager.SetTenantQuotaRow( - new TenantQuotaRow { Tenant = _tenant, Path = string.Format("/{0}/{1}", module, domain), Counter = size, Tag = dataTag }, + new TenantQuotaRow { Tenant = _tenant, Path = string.Format("/{0}/{1}", module, domain), Counter = size, Tag = dataTag, UserId = userId}, exchange); } diff --git a/common/ASC.Data.Storage/WebPath.cs b/common/ASC.Data.Storage/WebPath.cs index 46e18f755..20f9fa6b0 100644 --- a/common/ASC.Data.Storage/WebPath.cs +++ b/common/ASC.Data.Storage/WebPath.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/Wildcard.cs b/common/ASC.Data.Storage/Wildcard.cs index 4b588e06e..6766abe7f 100644 --- a/common/ASC.Data.Storage/Wildcard.cs +++ b/common/ASC.Data.Storage/Wildcard.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Data.Storage/ZipOperators/ChunkZipWriteOperator.cs b/common/ASC.Data.Storage/ZipOperators/ChunkZipWriteOperator.cs new file mode 100644 index 000000000..ff99b14b5 --- /dev/null +++ b/common/ASC.Data.Storage/ZipOperators/ChunkZipWriteOperator.cs @@ -0,0 +1,168 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.IO; +using System.Security.Cryptography; +using System.Text; + +using ASC.Common; +using ASC.Core.ChunkedUploader; + +using ICSharpCode.SharpZipLib.GZip; +using ICSharpCode.SharpZipLib.Tar; + +namespace ASC.Data.Storage.ZipOperators +{ + public class ChunkZipWriteOperator : IDataWriteOperator + { + private readonly TarOutputStream _tarOutputStream; + private readonly GZipOutputStream _gZipOutputStream; + private readonly CommonChunkedUploadSession _chunkedUploadSession; + private readonly CommonChunkedUploadSessionHolder _sessionHolder; + private readonly SHA _sha; + private Stream _fileStream; + private byte[] _hash; + + public string Hash { get; private set; } + public string StoragePath { get; private set; } + public bool NeedUpload + { + get + { + return false; + } + } + + public ChunkZipWriteOperator( + CommonChunkedUploadSession chunkedUploadSession, + CommonChunkedUploadSessionHolder sessionHolder) + { + _chunkedUploadSession = chunkedUploadSession; + _sessionHolder = sessionHolder; + + _fileStream = TempStream.Create(); + _gZipOutputStream = new GZipOutputStream(_fileStream) + { + IsStreamOwner = false + }; + _tarOutputStream = new TarOutputStream(_gZipOutputStream, Encoding.UTF8); + _sha = new SHA(); + } + + public void WriteEntry(string key, Stream stream) + { + if (_fileStream == null) + { + _fileStream = TempStream.Create(); + _gZipOutputStream.baseOutputStream_ = _fileStream; + } + using (var buffered = stream.GetBuffered()) + { + var entry = TarEntry.CreateTarEntry(key); + entry.Size = buffered.Length; + _tarOutputStream.PutNextEntry(entry); + buffered.Position = 0; + buffered.CopyTo(_tarOutputStream); + _tarOutputStream.Flush(); + _tarOutputStream.CloseEntry(); + } + + if (_fileStream.Length > 100 * 1024 * 1024) + { + Upload(false); + } + } + + private void Upload(bool last) + { + var chunkUploadSize = _sessionHolder.MaxChunkUploadSize; + + var buffer = new byte[chunkUploadSize]; + int bytesRead; + _fileStream.Position = 0; + while ((bytesRead = _fileStream.Read(buffer, 0, (int)chunkUploadSize)) > 0) + { + using (var theMemStream = new MemoryStream()) + { + theMemStream.Write(buffer, 0, bytesRead); + theMemStream.Position = 0; + if (bytesRead == chunkUploadSize || last) + { + if (_fileStream.Position == _fileStream.Length && last) + { + _chunkedUploadSession.LastChunk = true; + } + + _hash = _sha.ComputeHash(theMemStream, bytesRead != chunkUploadSize); + + theMemStream.Position = 0; + StoragePath = _sessionHolder.UploadChunk(_chunkedUploadSession, theMemStream, theMemStream.Length); + } + else + { + _fileStream.Dispose(); + _fileStream = TempStream.Create(); + _gZipOutputStream.baseOutputStream_ = _fileStream; + + theMemStream.CopyTo(_fileStream); + _fileStream.Flush(); + } + } + } + } + + public void Dispose() + { + _tarOutputStream.Close(); + _tarOutputStream.Dispose(); + Upload(true); + _fileStream.Dispose(); + _sha.Dispose(); + Hash = BitConverter.ToString(_hash).Replace("-", string.Empty); + } + } + + internal class SHA : SHA256Managed + { + public byte[] ComputeHash(Stream inputStream, bool isFinal) + { + byte[] array = new byte[4096]; + int num; + do + { + num = inputStream.Read(array, 0, 4096); + if (num > 0) + { + HashCore(array, 0, num); + } + } + while (num > 0); + if (isFinal) + { + HashValue = HashFinal(); + byte[] result = (byte[])HashValue.Clone(); + Initialize(); + return result; + } + else + { + return null; + } + } + } +} diff --git a/common/ASC.Data.Backup/IDataOperator.cs b/common/ASC.Data.Storage/ZipOperators/IDataOperator.cs similarity index 82% rename from common/ASC.Data.Backup/IDataOperator.cs rename to common/ASC.Data.Storage/ZipOperators/IDataOperator.cs index 15060610a..a61345f11 100644 --- a/common/ASC.Data.Backup/IDataOperator.cs +++ b/common/ASC.Data.Storage/ZipOperators/IDataOperator.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,22 +15,25 @@ */ -using System; -using System.Collections.Generic; -using System.IO; - -namespace ASC.Data.Backup -{ - public interface IDataWriteOperator : IDisposable - { - void WriteEntry(string key, Stream stream); - } - - public interface IDataReadOperator : IDisposable - { - Stream GetEntry(string key); - IEnumerable GetEntries(string key); - IEnumerable GetDirectories(string key); - - } +using System; +using System.Collections.Generic; +using System.IO; + +namespace ASC.Data.Storage.ZipOperators +{ + public interface IDataWriteOperator : IDisposable + { + void WriteEntry(string key, Stream stream); + bool NeedUpload { get; } + string Hash { get; } + string StoragePath { get; } + } + + public interface IDataReadOperator : IDisposable + { + Stream GetEntry(string key); + IEnumerable GetEntries(string key); + IEnumerable GetDirectories(string key); + + } } \ No newline at end of file diff --git a/common/ASC.Data.Storage/ZipOperators/IGetterWriteOperator.cs b/common/ASC.Data.Storage/ZipOperators/IGetterWriteOperator.cs new file mode 100644 index 000000000..76a85435a --- /dev/null +++ b/common/ASC.Data.Storage/ZipOperators/IGetterWriteOperator.cs @@ -0,0 +1,26 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; + +namespace ASC.Data.Storage.ZipOperators +{ + public interface IGetterWriteOperator + { + IDataWriteOperator GetWriteOperator(string storageBasePath, string title, Guid userId); + } +} diff --git a/common/ASC.Data.Storage/ZipOperators/S3ZipWriteOperator.cs b/common/ASC.Data.Storage/ZipOperators/S3ZipWriteOperator.cs new file mode 100644 index 000000000..67588d251 --- /dev/null +++ b/common/ASC.Data.Storage/ZipOperators/S3ZipWriteOperator.cs @@ -0,0 +1,176 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading.Tasks; + +using ASC.Common; +using ASC.Core.ChunkedUploader; + +using ICSharpCode.SharpZipLib.GZip; +using ICSharpCode.SharpZipLib.Tar; + +namespace ASC.Data.Storage.ZipOperators +{ + public class S3ZipWriteOperator : IDataWriteOperator + { + private readonly TarOutputStream _tarOutputStream; + private readonly GZipOutputStream _gZipOutputStream; + private CommonChunkedUploadSession _chunkedUploadSession; + private readonly CommonChunkedUploadSessionHolder _sessionHolder; + private readonly SHA _sha; + private Stream _fileStream; + private byte[] _hash; + protected const int TasksLimit = 10; + private readonly List tasks = new List(TasksLimit); + private readonly List streams = new List(TasksLimit); + + public string Hash { get; private set; } + public string StoragePath { get; private set; } + public bool NeedUpload + { + get + { + return false; + } + } + + public S3ZipWriteOperator( + CommonChunkedUploadSession chunkedUploadSession, + CommonChunkedUploadSessionHolder sessionHolder) + { + _chunkedUploadSession = chunkedUploadSession; + _sessionHolder = sessionHolder; + + + _fileStream = TempStream.Create(); + _gZipOutputStream = new GZipOutputStream(_fileStream) + { + IsStreamOwner = false + }; + _tarOutputStream = new TarOutputStream(_gZipOutputStream, Encoding.UTF8); + _sha = new SHA(); + } + + public void WriteEntry(string key, Stream stream) + { + if (_fileStream == null) + { + _fileStream = TempStream.Create(); + _gZipOutputStream.baseOutputStream_ = _fileStream; + } + using (var buffered = stream.GetBuffered()) + { + var entry = TarEntry.CreateTarEntry(key); + entry.Size = buffered.Length; + _tarOutputStream.PutNextEntry(entry); + buffered.Position = 0; + buffered.CopyTo(_tarOutputStream); + _tarOutputStream.Flush(); + _tarOutputStream.CloseEntry(); + } + + if (_fileStream.Length > _sessionHolder.MaxChunkUploadSize) + { + var fs = _fileStream; + _fileStream = null; + SplitAndUpload(fs); + } + } + + private void SplitAndUpload(Stream stream, bool last = false) + { + stream.Position = 0; + var buffer = new byte[_sessionHolder.MaxChunkUploadSize]; + + int bytesRead; + + while ((bytesRead = stream.Read(buffer, 0, (int)_sessionHolder.MaxChunkUploadSize)) > 0) + { + var tempStream = TempStream.Create(); + + tempStream.Write(buffer, 0, bytesRead); + if (tempStream.Length == _sessionHolder.MaxChunkUploadSize) + { + tempStream.Position = 0; + ComputeHash(tempStream, false); + Upload(tempStream); + } + else + { + if (last) + { + ComputeHash(tempStream, last); + Upload(tempStream); + } + else + { + tempStream.Position = tempStream.Length; + _fileStream = tempStream; + _gZipOutputStream.baseOutputStream_ = _fileStream; + } + } + } + stream.Dispose(); + } + + private void ComputeHash(Stream stream, bool isLast) + { + stream.Position = 0; + _hash = _sha.ComputeHash(stream, isLast); + } + + private void Upload(Stream stream) + { + stream.Position = 0; + if (tasks.Count == TasksLimit) + { + Task.WaitAny(tasks.ToArray()); + for (int i = 0; i < tasks.Count; i++) + { + if (tasks[i].IsCompleted) + { + tasks.RemoveAt(i); + streams[i].Dispose(); + streams.RemoveAt(i); + } + } + } + streams.Add(stream); + tasks.Add(_sessionHolder.UploadChunkAsync(_chunkedUploadSession, stream, stream.Length)); + } + + public void Dispose() + { + _tarOutputStream.Close(); + _tarOutputStream.Dispose(); + + SplitAndUpload(_fileStream, true); + Task.WaitAll(tasks.ToArray()); + + StoragePath = _sessionHolder.Finalize(_chunkedUploadSession); + + _sha.Dispose(); + Hash = BitConverter.ToString(_hash).Replace("-", string.Empty); + + streams.ForEach(s => s.Dispose()); + } + } +} diff --git a/common/ASC.Data.Backup/ZipOperator.cs b/common/ASC.Data.Storage/ZipOperators/ZipOperator.cs similarity index 86% rename from common/ASC.Data.Backup/ZipOperator.cs rename to common/ASC.Data.Storage/ZipOperators/ZipOperator.cs index 405dd959e..e21e4a01c 100644 --- a/common/ASC.Data.Backup/ZipOperator.cs +++ b/common/ASC.Data.Storage/ZipOperators/ZipOperator.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,95 +15,116 @@ */ -using System.Collections.Generic; -using System.IO; -using System.Text; - -using ASC.Common; - -using ICSharpCode.SharpZipLib.GZip; -using ICSharpCode.SharpZipLib.Tar; - -namespace ASC.Data.Backup -{ - public class ZipWriteOperator : IDataWriteOperator - { - private readonly GZipOutputStream gZipOutputStream; - private readonly TarOutputStream tarOutputStream; - private readonly Stream file; - - - public ZipWriteOperator(string targetFile) - { - file = new FileStream(targetFile, FileMode.Create); - gZipOutputStream = new GZipOutputStream(file); - tarOutputStream = new TarOutputStream(gZipOutputStream, Encoding.UTF8); - } - - public void WriteEntry(string key, Stream stream) - { - using (var buffered = stream.GetBuffered()) - { - var entry = TarEntry.CreateTarEntry(key); - entry.Size = buffered.Length; - tarOutputStream.PutNextEntry(entry); - buffered.Position = 0; - buffered.CopyTo(tarOutputStream); - tarOutputStream.CloseEntry(); - } - } - - public void Dispose() - { - tarOutputStream.Close(); - tarOutputStream.Dispose(); - } - } - - public class ZipReadOperator : IDataReadOperator - { - private readonly string tmpdir; - - public ZipReadOperator(string targetFile) - { - tmpdir = Path.Combine(Path.GetDirectoryName(targetFile), Path.GetFileNameWithoutExtension(targetFile).Replace('>', '_').Replace(':', '_').Replace('?', '_')); - - using (var stream = File.OpenRead(targetFile)) - using (var reader = new GZipInputStream(stream)) - using (var tarOutputStream = TarArchive.CreateInputTarArchive(reader, Encoding.UTF8)) - { - tarOutputStream.ExtractContents(tmpdir); - } - - File.Delete(targetFile); - } - - public Stream GetEntry(string key) - { - var filePath = Path.Combine(tmpdir, key); - return File.Exists(filePath) ? File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read) : null; - } - - public IEnumerable GetEntries(string key) - { - var path = Path.Combine(tmpdir, key); - var files = Directory.EnumerateFiles(path); - return files; - } - - public IEnumerable GetDirectories(string key) - { - var path = Path.Combine(tmpdir, key); - var files = Directory.EnumerateDirectories(path); - return files; - } - - public void Dispose() - { - if (Directory.Exists(tmpdir)) - { - Directory.Delete(tmpdir, true); - } - } - } +using System.Collections.Generic; +using System.IO; +using System.Text; + +using ASC.Common; + +using ICSharpCode.SharpZipLib.GZip; +using ICSharpCode.SharpZipLib.Tar; + +namespace ASC.Data.Storage.ZipOperators +{ + public class ZipWriteOperator : IDataWriteOperator + { + private readonly GZipOutputStream gZipOutputStream; + private readonly TarOutputStream tarOutputStream; + private readonly Stream file; + + public bool NeedUpload + { + get + { + return true; + } + } + public string Hash + { + get + { + throw new System.NotImplementedException(); + } + } + public string StoragePath + { + get + { + throw new System.NotImplementedException(); + } + } + + public ZipWriteOperator(string targetFile) + { + file = new FileStream(targetFile, FileMode.Create); + gZipOutputStream = new GZipOutputStream(file); + tarOutputStream = new TarOutputStream(gZipOutputStream, Encoding.UTF8); + } + + public void WriteEntry(string key, Stream stream) + { + using (var buffered = stream.GetBuffered()) + { + var entry = TarEntry.CreateTarEntry(key); + entry.Size = buffered.Length; + tarOutputStream.PutNextEntry(entry); + buffered.Position = 0; + buffered.CopyTo(tarOutputStream); + tarOutputStream.CloseEntry(); + } + } + + public void Dispose() + { + tarOutputStream.Close(); + tarOutputStream.Dispose(); + } + } + + public class ZipReadOperator : IDataReadOperator + { + private readonly string tmpdir; + + public ZipReadOperator(string targetFile) + { + tmpdir = Path.Combine(Path.GetDirectoryName(targetFile), Path.GetFileNameWithoutExtension(targetFile).Replace('>', '_').Replace(':', '_').Replace('?', '_')); + + using (var stream = File.OpenRead(targetFile)) + using (var reader = new GZipInputStream(stream)) + using (var tarOutputStream = TarArchive.CreateInputTarArchive(reader, Encoding.UTF8)) + { + tarOutputStream.ExtractContents(tmpdir); + } + + File.Delete(targetFile); + } + + public Stream GetEntry(string key) + { + var filePath = Path.Combine(tmpdir, key); + return File.Exists(filePath) ? File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read) : null; + } + + public IEnumerable GetEntries(string key) + { + var path = Path.Combine(tmpdir, key); + var files = Directory.EnumerateFiles(path); + return files; + } + + public IEnumerable GetDirectories(string key) + { + var path = Path.Combine(tmpdir, key); + var files = Directory.EnumerateDirectories(path); + return files; + } + + public void Dispose() + { + if (Directory.Exists(tmpdir)) + { + Directory.Delete(tmpdir, true); + } + } + } } \ No newline at end of file diff --git a/common/ASC.Data.Storage/ZipOperators/ZipWriteOperatorFactory.cs b/common/ASC.Data.Storage/ZipOperators/ZipWriteOperatorFactory.cs new file mode 100644 index 000000000..5c5512c53 --- /dev/null +++ b/common/ASC.Data.Storage/ZipOperators/ZipWriteOperatorFactory.cs @@ -0,0 +1,37 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.IO; + +namespace ASC.Data.Storage.ZipOperators +{ + public static class ZipWriteOperatorFactory + { + public static IDataWriteOperator GetWriteOperator(string storageBasePath, string title, string tempFolder, Guid userId, IGetterWriteOperator getter) + { + var writer = getter.GetWriteOperator(storageBasePath, title, userId); + + return writer ?? new ZipWriteOperator(Path.Combine(tempFolder, title)); + } + + public static IDataWriteOperator GetDefaultWriteOperator(string backupFilePath) + { + return new ZipWriteOperator(backupFilePath); + } + } +} diff --git a/common/ASC.IPSecurity/ASC.IPSecurity.csproj b/common/ASC.IPSecurity/ASC.IPSecurity.csproj index ab126567a..d683d03f3 100644 --- a/common/ASC.IPSecurity/ASC.IPSecurity.csproj +++ b/common/ASC.IPSecurity/ASC.IPSecurity.csproj @@ -20,6 +20,8 @@ DEBUG;TRACE prompt 4 + ..\..\web\studio\ASC.Web.Studio\bin\ASC.IPSecurity.xml + CS1591 none diff --git a/common/ASC.IPSecurity/IPAddressRange.cs b/common/ASC.IPSecurity/IPAddressRange.cs index f79dbb285..db90319ce 100644 --- a/common/ASC.IPSecurity/IPAddressRange.cs +++ b/common/ASC.IPSecurity/IPAddressRange.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ +using System; using System.Net; using System.Net.Sockets; @@ -58,5 +59,24 @@ public bool IsInRange(IPAddress address) return true; } + + public static bool IsInRange(string ipAddress, string CIDRmask) + { + string[] parts = CIDRmask.Split('/'); + + var requestIP = IPAddress.Parse(ipAddress); + var restrictionIP = IPAddress.Parse(parts[0]); + + if (requestIP.AddressFamily != restrictionIP.AddressFamily) + { + return false; + } + + int IP_addr = BitConverter.ToInt32(requestIP.GetAddressBytes(), 0); + int CIDR_addr = BitConverter.ToInt32(restrictionIP.GetAddressBytes(), 0); + int CIDR_mask = IPAddress.HostToNetworkOrder(-1 << (32 - int.Parse(parts[1]))); + + return (IP_addr & CIDR_mask) == (CIDR_addr & CIDR_mask); + } } } \ No newline at end of file diff --git a/common/ASC.IPSecurity/IPRestriction.cs b/common/ASC.IPSecurity/IPRestriction.cs index d1ed770d1..21f21455f 100644 --- a/common/ASC.IPSecurity/IPRestriction.cs +++ b/common/ASC.IPSecurity/IPRestriction.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,16 +17,25 @@ using System; - namespace ASC.IPSecurity { [Serializable] - public class IPRestriction + public class IPRestriction : IPRestrictionBase { + ///123 public int Id { get; set; } + ///1 public int TenantId { get; set; } + } + [Serializable] + public class IPRestrictionBase + { + ///Ip public string Ip { get; set; } + + ///false + public bool ForAdmin { get; set; } } } \ No newline at end of file diff --git a/common/ASC.IPSecurity/IPRestrictionsRepository.cs b/common/ASC.IPSecurity/IPRestrictionsRepository.cs index cba9c1dbf..f1c4e8d0b 100644 --- a/common/ASC.IPSecurity/IPRestrictionsRepository.cs +++ b/common/ASC.IPSecurity/IPRestrictionsRepository.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,27 +26,28 @@ namespace ASC.IPSecurity { internal class IPRestrictionsRepository { - private const string dbId = "core"; + private const string dbId = "default"; public static List Get(int tenant) { - using (var db = DbManager.FromHttpContext(dbId)) + using (var db = new DbManager(dbId)) { return db - .ExecuteList(new SqlQuery("tenants_iprestrictions").Select("id", "ip").Where("tenant", tenant)) + .ExecuteList(new SqlQuery("tenants_iprestrictions").Select("id", "ip", "for_admin").Where("tenant", tenant)) .ConvertAll(r => new IPRestriction { Id = Convert.ToInt32(r[0]), Ip = Convert.ToString(r[1]), + ForAdmin = Convert.ToBoolean(r[2]), TenantId = tenant, }); } } - public static List Save(IEnumerable ips, int tenant) + public static List Save(IEnumerable ips, int tenant) { - using (var db = DbManager.FromHttpContext(dbId)) + using (var db = new DbManager(dbId)) using (var tx = db.BeginTransaction()) { var d = new SqlDelete("tenants_iprestrictions").Where("tenant", tenant); @@ -57,7 +58,8 @@ public static List Save(IEnumerable ips, int tenant) { var i = new SqlInsert("tenants_iprestrictions") .InColumnValue("tenant", tenant) - .InColumnValue("ip", ip); + .InColumnValue("ip", ip.Ip) + .InColumnValue("for_admin", ip.ForAdmin); db.ExecuteNonQuery(i); } diff --git a/common/ASC.IPSecurity/IPRestrictionsService.cs b/common/ASC.IPSecurity/IPRestrictionsService.cs index c74e7c830..4b25f68f1 100644 --- a/common/ASC.IPSecurity/IPRestrictionsService.cs +++ b/common/ASC.IPSecurity/IPRestrictionsService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,7 +47,7 @@ public static IEnumerable Get(int tenant) return restrictions; } - public static IEnumerable Save(IEnumerable ips, int tenant) + public static IEnumerable Save(IEnumerable ips, int tenant) { var restrictions = IPRestrictionsRepository.Save(ips, tenant); notify.Publish(new IPRestriction { TenantId = tenant }, CacheNotifyAction.InsertOrUpdate); diff --git a/common/ASC.IPSecurity/IPSecurity.cs b/common/ASC.IPSecurity/IPSecurity.cs index cac82b0a1..6c2a00c2c 100644 --- a/common/ASC.IPSecurity/IPSecurity.cs +++ b/common/ASC.IPSecurity/IPSecurity.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,8 +24,10 @@ using System.Web; using ASC.Common.Logging; +using ASC.Common.Utils; using ASC.Core; using ASC.Core.Tenants; +using ASC.Core.Users; namespace ASC.IPSecurity { @@ -49,7 +51,7 @@ public static bool IpSecurityEnabled private static readonly string MyNetworks = ConfigurationManagerExtension.AppSettings["ipsecurity.mynetworks"]; - public static bool Verify(Tenant tenant) + public static bool Verify(Tenant tenant, string login = null) { if (!IpSecurityEnabled) return true; @@ -58,24 +60,35 @@ public static bool Verify(Tenant tenant) if (tenant == null || SecurityContext.CurrentAccount.ID == tenant.OwnerId) return true; - string requestIps = null; + string address = null; try { var restrictions = IPRestrictionsService.Get(tenant.TenantId).ToList(); if (!restrictions.Any()) return true; - if (string.IsNullOrWhiteSpace(requestIps = CurrentIpForTest)) + if (string.IsNullOrWhiteSpace(address = CurrentIpForTest)) { var request = httpContext.Request; - requestIps = request.Headers["X-Forwarded-For"] ?? request.UserHostAddress; + address = request.Headers["X-Forwarded-For"] ?? request.UserHostAddress; } - var ips = string.IsNullOrWhiteSpace(requestIps) - ? new string[] { } - : requestIps.Split(new[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries); + var ips = IpAddressParser.ParseAddress(address).Select(IpAddressParser.GetIpWithoutPort); - if (ips.Any(requestIp => restrictions.Any(restriction => MatchIPs(GetIpWithoutPort(requestIp), restriction.Ip)))) + var currentUserId = SecurityContext.CurrentAccount.ID; + bool isAdmin; + + if (!string.IsNullOrEmpty(login) && currentUserId == ASC.Core.Configuration.Constants.Guest.ID) + { + var currentUser = CoreContext.UserManager.GetUserByEmail(login); + isAdmin = currentUser.IsAdmin(); + } + else + { + isAdmin = CoreContext.UserManager.IsUserInGroup(currentUserId, Constants.GroupAdmin.ID); + } + + if (ips.Any(requestIp => restrictions.Any(restriction => (restriction.ForAdmin ? isAdmin : true) && MatchIPs(requestIp, restriction.Ip)))) { return true; } @@ -87,15 +100,15 @@ public static bool Verify(Tenant tenant) } catch (Exception ex) { - Log.ErrorFormat("Can't verify request with IP-address: {0}. Tenant: {1}. Error: {2} ", requestIps ?? "", tenant, ex); + Log.ErrorFormat("Can't verify request with IP-address: {0}. Tenant: {1}. Error: {2} ", address ?? "", tenant, ex); return false; } - Log.InfoFormat("Restricted from IP-address: {0}. Tenant: {1}. Request to: {2}", requestIps ?? "", tenant, httpContext.Request.Url); + Log.InfoFormat("Restricted from IP-address: {0}. Tenant: {1}. Request to: {2}", address ?? "", tenant, httpContext.Request.Url); return false; } - private static bool MatchIPs(string requestIp, string restrictionIp) + public static bool MatchIPs(string requestIp, string restrictionIp) { var dividerIdx = restrictionIp.IndexOf('-'); if (restrictionIp.IndexOf('-') > 0) @@ -107,16 +120,15 @@ private static bool MatchIPs(string requestIp, string restrictionIp) return range.IsInRange(IPAddress.Parse(requestIp)); } - return requestIp == restrictionIp; - } + if (restrictionIp.IndexOf('/') > 0) + { + return IPAddressRange.IsInRange(requestIp, restrictionIp); + } - private static string GetIpWithoutPort(string ip) - { - var portIdx = ip.IndexOf(':'); - return portIdx > 0 ? ip.Substring(0, portIdx) : ip; + return requestIp == restrictionIp; } - private static bool IsMyNetwork(string[] ips) + private static bool IsMyNetwork(IEnumerable ips) { try { @@ -124,7 +136,7 @@ private static bool IsMyNetwork(string[] ips) { var myNetworkIps = MyNetworks.Split(new[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries); - if (ips.Any(requestIp => myNetworkIps.Any(ipAddress => MatchIPs(GetIpWithoutPort(requestIp), ipAddress)))) + if (ips.Any(requestIp => myNetworkIps.Any(ipAddress => MatchIPs(requestIp, ipAddress)))) { return true; } diff --git a/common/ASC.IPSecurity/IPSecurityException.cs b/common/ASC.IPSecurity/IPSecurityException.cs index 6e80ee3fb..e47aa2df8 100644 --- a/common/ASC.IPSecurity/IPSecurityException.cs +++ b/common/ASC.IPSecurity/IPSecurityException.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Notify.Textile/ASC.Notify.Textile.csproj b/common/ASC.Notify.Textile/ASC.Notify.Textile.csproj index dba61d2f5..cd3b83161 100644 --- a/common/ASC.Notify.Textile/ASC.Notify.Textile.csproj +++ b/common/ASC.Notify.Textile/ASC.Notify.Textile.csproj @@ -43,6 +43,8 @@ prompt 4 false + ..\..\web\studio\ASC.Web.Studio\bin\ASC.Notify.Textile.xml + CS1591 none diff --git a/common/ASC.Notify.Textile/JabberStyler.cs b/common/ASC.Notify.Textile/JabberStyler.cs index c26c2d688..903d6437d 100644 --- a/common/ASC.Notify.Textile/JabberStyler.cs +++ b/common/ASC.Notify.Textile/JabberStyler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Notify.Textile/MarkDownStyler.cs b/common/ASC.Notify.Textile/MarkDownStyler.cs index 963e1168e..dc694fe1f 100644 --- a/common/ASC.Notify.Textile/MarkDownStyler.cs +++ b/common/ASC.Notify.Textile/MarkDownStyler.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Text.RegularExpressions; using System.Web; diff --git a/common/ASC.Notify.Textile/PushStyler.cs b/common/ASC.Notify.Textile/PushStyler.cs index b56656974..b99a3280d 100644 --- a/common/ASC.Notify.Textile/PushStyler.cs +++ b/common/ASC.Notify.Textile/PushStyler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.Designer.cs b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.Designer.cs index 0920c670a..ad710597b 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.Designer.cs +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.Designer.cs @@ -66,9 +66,9 @@ internal NotifyTemplateResource() { /// <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> /// <img src="%IMAGEPATH%/tech-100.png" style="width: [rest of string was truncated]";. /// - public static string FooterCommonV10 { + public static string FooterCommonV121 { get { - return ResourceManager.GetString("FooterCommonV10", resourceCulture); + return ResourceManager.GetString("FooterCommonV121", resourceCulture); } } @@ -78,9 +78,9 @@ public static string FooterCommonV10 { /// <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> /// <img src="%IMAGEPATH%/tech-100.png" style="width: [rest of string was truncated]";. /// - public static string FooterOpensourceV10 { + public static string FooterOpensourceV121 { get { - return ResourceManager.GetString("FooterOpensourceV10", resourceCulture); + return ResourceManager.GetString("FooterOpensourceV121", resourceCulture); } } @@ -119,9 +119,9 @@ public static string HtmlMasterPersonal { /// </td> /// <td style="width: 40px; vertical-a [rest of string was truncated]";. /// - public static string SocialNetworksFooterV10 { + public static string SocialNetworksFooterV121 { get { - return ResourceManager.GetString("SocialNetworksFooterV10", resourceCulture); + return ResourceManager.GetString("SocialNetworksFooterV121", resourceCulture); } } diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.az-Latn-AZ.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.az-Latn-AZ.resx index 405cc7713..203c82d30 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.az-Latn-AZ.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.az-Latn-AZ.resx @@ -58,66 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;">&nbsp;</td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Texniki dəstək lazımdır?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Satışla bağlı Suallar</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Demo Sifariş Et</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Sualınızı göndərin</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Bizə e-məktub yazın</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Sorğu göndərin</a> - </td> - </tr> - - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;">&nbsp;</td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Texniki dəstək lazımdır?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Satışla bağlı Suallar</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Demo Sifariçedin</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="http://dev.onlyoffice.org/" target="_blank" style="color: #333;">İcmadan soruşun</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:sales@onlyoffice.com" style="color: #333;">Bizə e-məktub yazın</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="http://www.onlyoffice.com/demo-order.aspx" target="_blank" style="color: #333;">Bizə sorğu göndərin</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> @@ -199,40 +139,6 @@ </div> </body> - - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 155px;"> - <a href="https://www.facebook.com/pages/OnlyOffice/833032526736775" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-fb-40.png" alt="Facebook" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://twitter.com/ONLY_OFFICE" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-tw-40.png" alt="Twitter" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.onlyoffice.com/blog" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-blog-40.png" alt="ONLYOFFICE" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.youtube.com/user/onlyofficeTV" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-youtube-40.png" alt="YouTube" style="width: 40px; height: 40x;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://vk.com/onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-vk-40.png" alt="VK" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 155px 0 5px;"> - <a href="https://www.instagram.com/the_onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-inst-40.png" alt="Instagram" style="width: 40px; height: 40px;" /> - </a> - </td> - </tr> - Bu e-poçt avtomatik olaraq yaradılır və ona cavab vermək lazım deyil. <br />Siz <a href="{0}" style="color: #7b7b7b;" target="_blank">{0}</a>-nin qeydiyyatdan keçmiş istifadəçisi olduğunuz üçün bu e-poçtu alırsınız. diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.bg.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.bg.resx index 8ad8ae667..c8ecf4c42 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.bg.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.bg.resx @@ -58,66 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;">&nbsp;</td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;"/> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;"/> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;"/> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Нуждаете се от техническа помощ?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Търговски въпроси</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Демо за поръчка</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Изпрати своя въпрос</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Пишете ни</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Изпращане на заявка</a> - </td> - </tr> - - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;">&nbsp;</td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;"/> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;"/> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;"/> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Нуждаете се от техническа помощ?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Търговски въпроси</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Демо за поръчка</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="http://dev.onlyoffice.org/" target="_blank" style="color: #333;">Изпрати своя въпрос</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:sales@onlyoffice.com" style="color: #333;">Пишете ни</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="http://www.onlyoffice.com/demo-order.aspx" target="_blank" style="color: #333;">Изпращане на заявка</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.cs.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.cs.resx index 8ddd06468..6d66db2b1 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.cs.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.cs.resx @@ -58,36 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Potřebujete technickou pomoc?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Prodejní otázky</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Objednat demo</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Pošlete nám Vaše dotazy</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Napište nám email</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Poslat žádost</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.de.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.de.resx index a12015c28..72a61ddbe 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.de.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.de.resx @@ -58,66 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Benötigen Sie technische Unterstützung?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Verkaufsfragen</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Demoversion bestellen</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Senden Sie uns Ihre Frage</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Senden Sie uns eine E-Mail an</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Senden Sie eine Anfrage an uns</a> - </td> - </tr> - - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Benötigen Sie Hilfe?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Verkaufsfragen</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Demo anfragen</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="http://dev.onlyoffice.org/" target="_blank" style="color: #333;">Frage stellen</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:sales@onlyoffice.com" style="color: #333;">Email us</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="http://www.onlyoffice.com/demo-order.aspx" target="_blank" style="color: #333;">Send a request</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> @@ -158,40 +98,6 @@ </div> </body> - - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 155px;"> - <a href="https://www.facebook.com/pages/OnlyOffice/833032526736775" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-fb-40.png" alt="Facebook" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://twitter.com/ONLY_OFFICE" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-tw-40.png" alt="Twitter" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.onlyoffice.com/blog" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-blog-40.png" alt="ONLYOFFICE" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.youtube.com/user/onlyofficeTV" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-youtube-40.png" alt="YouTube" style="width: 40px; height: 40x;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://vk.com/onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-vk-40.png" alt="VK" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 155px 0 5px;"> - <a href="https://www.instagram.com/the_onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-inst-40.png" alt="Instagram" style="width: 40px; height: 40px;" /> - </a> - </td> - </tr> - Diese E-Mail ist automatisch generiert und erfordert keine Antwort. <br />Sie erhalten diese E-Mail, weil Sie ein registrierter Benutzer bzw. eine registrierte Benutzerin von <a href="{0}" style="color: #7b7b7b;" target="_blank">{0}</a> sind. diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.es.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.es.resx index 4fe25a134..25281d0c5 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.es.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.es.resx @@ -58,66 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">¿Se necesita ayuda?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Preguntas de ventas</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Solicitar demostración</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Haga pregunta</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Contáctenos</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Envie solicitud</a> - </td> - </tr> - - - <tr borde = "0" espaciadodecelda = "0" rellenodecelda = "0"> <td colspan = "3" estilo = "altura: 10px; línea-altura: 10px; fondo: #fff; relleno: 0; margen: 0 ; "> & nbsp; </ td> </ tr> -        <tr borde = "0" espaciadodecelda = "0" rellenodecelda = "0"> -            <td estilo = "alineación vertical: superior; margen: 0; relleno: 34px 0 0 0; ancho: 210px; alto: 108px; fondo: # f6f6f6; -moz-borde-radio-izquierdasuperior: 6px; -webkit-borde -superior-izquierdo-radio: 6px; borde-superior-izquierdo-radio: 6px; "> -              <img src = "%IMAGEPATH%/tech-100.png" estilo = "ancho: 100px; altura: 100px; margen: 0 auto;" /> -            </ td> -            <td estilo = "alineación vertical: superior; margen: 0; relleno: 34px 0 0 0; ancho: 180px; alto: 108px; fondo: # f6f6f6;"> -              <img src = "%IMAGEPATH%/mailus-100.png" style = "ancho: 100px; altura: 100px; margen: 0 auto;" /> -            </ td> -            <td estilo = "alineamiento vertical: superior; margen: 0; relleno: 34px 0 0 0; ancho: 210px; alto: 108px; fondo: # f6f6f6; -moz-border-radio-superiorderecha: 6px; -webkit-borde -superior-derecha-radio: 6px; borde-superior-derecha-radio: 6px; "> -              <img src = "%IMAGEPATH%/demo-100.png" style = "ancho: 100px; altura: 100px; margen: 0 auto;" /> -            </ td> -        </ tr> -        <tr borde = "0" espaciadodecelda= "0" rellenodecelda= "0"> -            <td estilo= "alineamiento vertical: superior; margen: 0; relleno: 0; ancho: 210px; alto: 16px; fondo: # f6f6f6;"> ¿Necesita ayuda técnica? </ td> -            <td estilo = "alinemaiento vertical: superior; margen: 0; relleno: 0; ancho: 180px; alto: 16px; fondo: # f6f6f6;"> Preguntas de venta </ td> -            <td estilo= "alineamiento vertical: superior; margen: 0; relleno: 0; ancho: 210px; alto: 16px; fondo: # f6f6f6;"> Pedir Demo </ td> -        </ tr> -        <tr borde = "0" espaciadodecelda= "0" rellenodecelda= "0"> -            <td estilo= "alineamiento vertical: superior; margen: 0; relleno: 0 0 30px; ancho: 210px; fondo: # f6f6f6; -moz-border-radio-inferiorizquierdo: 6px; -webkit-borde-inferior-izquierda- radio: 6px; borde-inferior-radio-izquierdo: 6px; "> -              <a href="http://dev.onlyoffice.org/" destino="_en blanco" estilo="color: #333;"> Pregunta a la comunidad </a> -            </ td> -            <td estilo= "alineción vertical: superior; margen: 0; relleno: 0 0 30px; ancho: 180px; fondo: # f6f6f6;"> -              <a href="mailto:sales@onlyoffice.com" estilo="color: #333;"> Envíenos un correo electrónico </a> -            </ td> -            <td estilo= "alineación vertical: superior; margen: 0; relleno: 0 0 30px; ancho: 210px; fondo: # f6f6f6; -moz-borde-radio-inferiorderecha: 6px; -webkit-borde-inferior-derecha- radio: 6px; borde-inferior-derecho-radio: 6px; "> -              <a href="http://www.onlyoffice.com/demo-order.aspx" destino="_en blanco" estilo="color: #333;"> Enviar una solicitud </a> -            </ td> -        </ tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> @@ -158,40 +98,6 @@ </div> </body> - - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 155px;"> - <a href="https://www.facebook.com/pages/OnlyOffice/833032526736775" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-fb-40.png" alt="Facebook" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://twitter.com/ONLY_OFFICE" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-tw-40.png" alt="Twitter" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.onlyoffice.com/blog" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-blog-40.png" alt="ONLYOFFICE" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.youtube.com/user/onlyofficeTV" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-youtube-40.png" alt="YouTube" style="width: 40px; height: 40x;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://vk.com/onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-vk-40.png" alt="VK" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 155px 0 5px;"> - <a href="https://www.instagram.com/the_onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-inst-40.png" alt="Instagram" style="width: 40px; height: 40px;" /> - </a> - </td> - </tr> - Este correo electrónico se genera automáticamente y no es necesario responder. <br />Usted recibe este correo electrónico porque usted es un usuario registrado de <a href="{0}" style="color: #7b7b7b;" target="_blank">{0}</a> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.fi.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.fi.resx index 886466fd3..5320f4ba6 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.fi.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.fi.resx @@ -58,34 +58,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Haluatko teknistä tukea?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Ostoon liittyvät kysymykset</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Tilaa koejakso</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Lähetä kysymyksesi</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Lähetä meille sähköpostia</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Lähetä pyyntö</a> - </td> - </tr> - \ No newline at end of file diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.fr.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.fr.resx index 7e1285a65..8e39ee997 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.fr.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.fr.resx @@ -58,66 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Besoin d'aide technique ?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Questions sur les ventes</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Commandez une démo</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Envoyez votre question</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Écrivez-nous</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Envoyez une demande</a> - </td> - </tr> - - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> -<tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Besoin d'assistance technique?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Questions de vente</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Demander un démo</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="http://dev.onlyoffice.org/" target="_blank" style="color: #333;">Demandez à la communauté</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:sales@onlyoffice.com" style="color: #333;">Écrivez nous</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="http://www.onlyoffice.com/demo-order.aspx" target="_blank" style="color: #333;">Envoyez une demande</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> @@ -158,40 +98,6 @@ </div> </body> - - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 155px;"> - <a href="https://www.facebook.com/pages/OnlyOffice/833032526736775" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-fb-40.png" alt="Facebook" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://twitter.com/ONLY_OFFICE" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-tw-40.png" alt="Twitter" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.onlyoffice.com/blog" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-blog-40.png" alt="ONLYOFFICE" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.youtube.com/user/onlyofficeTV" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-youtube-40.png" alt="YouTube" style="width: 40px; height: 40x;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://vk.com/onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-vk-40.png" alt="VK" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 155px 0 5px;"> - <a href="https://www.instagram.com/the_onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-inst-40.png" alt="Instagram" style="width: 40px; height: 40px;" /> - </a> - </td> - </tr> - Cet e-mail est généré automatiquement et vous n'avez pas besoin de répondre. <br />Vous recevez ce courriel parce que vous êtes un utilisateur enregistré de <a href="{0}" style="color: #7b7b7b;" target="_blank">{0}</a> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.it.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.it.resx index df1196d78..0391694f2 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.it.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.it.resx @@ -58,66 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Serve assistenza tecnica?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Domande su Vendite</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Ordina Demo</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Send your question</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Email us</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Invia una richiesta</a> - </td> - </tr> - - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Serve assistenza?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Domande sulla vendita</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Ordina una Demo</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="http://dev.onlyoffice.org/" target="_blank" style="color: #333;">Chiedi alla Community</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:sales@onlyoffice.com" style="color: #333;">Scrivici</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="http://www.onlyoffice.com/demo-order.aspx" target="_blank" style="color: #333;">Send a request</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> @@ -158,40 +98,6 @@ </div> </body> - - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 155px;"> - <a href="https://www.facebook.com/pages/OnlyOffice/833032526736775" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-fb-40.png" alt="Facebook" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://twitter.com/ONLY_OFFICE" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-tw-40.png" alt="Twitter" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.onlyoffice.com/blog" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-blog-40.png" alt="ONLYOFFICE" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.youtube.com/user/onlyofficeTV" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-youtube-40.png" alt="YouTube" style="width: 40px; height: 40x;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://vk.com/onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-vk-40.png" alt="VK" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 155px 0 5px;"> - <a href="https://www.instagram.com/the_onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-inst-40.png" alt="Instagram" style="width: 40px; height: 40px;" /> - </a> - </td> - </tr> - Questo messaggio è stato generato automaticamente e non necessità di risposta. <br />Hai ricevuto questo messaggio in quanto sei un untente registrato su <a href="{0}" style="color: #7b7b7b;" target="_blank">{0}</a> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.lv.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.lv.resx index 3459ac8c9..780bbe716 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.lv.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.lv.resx @@ -58,66 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Нужна помощь?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Вопросы по покупке</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Заказ демонстрации</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Задайте вопрос</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Напишите нам</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Отправьте запрос</a> - </td> - </tr> - - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Нужна помощь?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Вопросы по покупке</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Заказ демонстрации</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="http://dev.onlyoffice.org/" target="_blank" style="color: #333;">Задайте вопрос</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:sales@onlyoffice.com" style="color: #333;">Напишите нам</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="http://www.onlyoffice.com/demo-order.aspx" target="_blank" style="color: #333;">Отправьте запрос</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.nl.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.nl.resx index f5fbe1957..5cdbffba9 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.nl.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.nl.resx @@ -58,36 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Technische hulp nodig?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Verkoopvragen</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Orderdemo</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Verstuur uw vraag</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Email us</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Stuur een verzoek</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pl.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pl.resx index ae53e6e25..6cdefff96 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pl.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pl.resx @@ -58,36 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Potřebujete technickou pomoc?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Prodejní otázky</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Objednat demo</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Send your question</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Email us</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Poslat žádost</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pt-BR.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pt-BR.resx index 4eeee8bf8..8e1959f5a 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pt-BR.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.pt-BR.resx @@ -58,66 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Precisa de ajuda técnica?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Perguntas sobre vendas</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Demonstração de pedido</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Envie sua pergunta</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Envie-nos um e-mail</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Envie uma solicitação</a> - </td> - </tr> - - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;">&nbsp;</td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Need tech help?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Sales Questions</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Order Demo</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="http://dev.onlyoffice.org/" target="_blank" style="color: #333;">Ask the Community</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:sales@onlyoffice.com" style="color: #333;">Email us</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="http://www.onlyoffice.com/demo-order.aspx" target="_blank" style="color: #333;">Send a request</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> @@ -158,40 +98,6 @@ </div> </body> - - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 155px;"> - <a href="https://www.facebook.com/pages/OnlyOffice/833032526736775" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-fb-40.png" alt="Facebook" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://twitter.com/ONLY_OFFICE" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-tw-40.png" alt="Twitter" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.onlyoffice.com/blog" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-blog-40.png" alt="ONLYOFFICE" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.youtube.com/user/onlyofficeTV" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-youtube-40.png" alt="YouTube" style="width: 40px; height: 40x;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://vk.com/onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-vk-40.png" alt="VK" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 155px 0 5px;"> - <a href="https://www.instagram.com/the_onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-inst-40.png" alt="Instagram" style="width: 40px; height: 40px;" /> - </a> - </td> - </tr> - Este e-mail é gerado automaticamente e você não precisa respondê-lo. <br />Você está recebendo este e-mail por que é um usuário registrado do <a href="{0}" style="color: #7b7b7b;" target="_blank">{0}</a> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.resx index 3cb3ef1e1..a3a8e9c77 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.resx @@ -58,7 +58,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;">&nbsp;</td></tr> <tr border="0" cellspacing="0" cellpadding="0"> <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> @@ -88,7 +88,7 @@ </td> </tr> - + <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;">&nbsp;</td></tr> <tr border="0" cellspacing="0" cellpadding="0"> <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> @@ -199,7 +199,7 @@ </div> </body> - + <tr border="0" cellspacing="0" cellpadding="0"> <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 155px;"> <a href="https://www.facebook.com/pages/OnlyOffice/833032526736775" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.ru.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.ru.resx index 512e2e592..b867f6563 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.ru.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.ru.resx @@ -58,66 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;">&nbsp;</td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Нужна помощь?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Вопросы по покупке</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Заказ демонстрации</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Задайте вопрос</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Напишите нам</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Отправьте запрос</a> - </td> - </tr> - - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;">&nbsp;</td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Нужна помощь?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Вопросы по покупке</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Заказ демонстрации</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="http://dev.onlyoffice.org/" target="_blank" style="color: #333;">Задайте вопрос</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:sales@onlyoffice.com" style="color: #333;">Напишите нам</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="http://www.onlyoffice.com/demo-order.aspx" target="_blank" style="color: #333;">Отправьте запрос</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> @@ -158,40 +98,6 @@ </div> </body> - - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 155px;"> - <a href="https://www.facebook.com/pages/OnlyOffice/833032526736775" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-fb-40.png" alt="Facebook" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://twitter.com/ONLY_OFFICE" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-tw-40.png" alt="Twitter" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.onlyoffice.com/blog" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-blog-40.png" alt="ONLYOFFICE" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.youtube.com/user/onlyofficeTV" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-youtube-40.png" alt="YouTube" style="width: 40px; height: 40x;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://vk.com/onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-vk-40.png" alt="VK" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 155px 0 5px;"> - <a href="https://www.instagram.com/the_onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-inst-40.png" alt="Instagram" style="width: 40px; height: 40px;" /> - </a> - </td> - </tr> - Это сообщение создано автоматически, и отвечать на него не нужно. <br />Вы получили это сообщение, так как являетесь зарегистрированным пользователем <a href="{0}" style="color: #7b7b7b;" target="_blank">{0}</a> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.sk.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.sk.resx index eaefade77..8f7353258 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.sk.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.sk.resx @@ -58,36 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Need tech help?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Sales Questions</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Order Demo</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Send your question</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Email us</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Send a request</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.tr.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.tr.resx index e537786a5..208c94a0a 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.tr.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.tr.resx @@ -58,36 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Need tech help?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Sales Questions</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Demo Sipariş Et</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Soru Gönder</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">E-posta Gönder</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Talep Gönder</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.uk.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.uk.resx index 54d7d7a9b..aec4ce981 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.uk.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.uk.resx @@ -58,36 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Need tech help?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Sales Questions</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Order Demo</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Send your question</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Email us</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Send a request</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.vi.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.vi.resx index b83ac12bb..52159d7c3 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.vi.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.vi.resx @@ -58,36 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Bạn cần hỗ trợ kỹ thật?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Câu hỏi về bán hàng</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Đặt bản Demo</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Gửi câu hỏi</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Gửi email cho chúng tôi</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Gửi yêu cầu</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-CN.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-CN.resx index 5cb21b3ec..fc24e84d3 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-CN.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-CN.resx @@ -58,36 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;"> </td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Need tech help?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Sales Questions</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Order Demo</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Send your question</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Email us</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Send a request</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> diff --git a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-TW.resx b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-TW.resx index 8f1dc3b44..0cf2d66ca 100644 --- a/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-TW.resx +++ b/common/ASC.Notify.Textile/Resources/NotifyTemplateResource.zh-TW.resx @@ -58,66 +58,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.6.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;">&nbsp;</td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Need tech help?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Sales Questions</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Order Demo</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="%SUPPORTURL%" target="_blank" style="color: #333;">Send your question</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:%SALESEMAIL%" style="color: #333;">Email us</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="%DEMOURL%" target="_blank" style="color: #333;">Send a request</a> - </td> - </tr> - - - <tr border="0" cellspacing="0" cellpadding="0"><td colspan="3" style="height: 10px; line-height: 10px; background: #fff; padding: 0; margin: 0;">&nbsp;</td></tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px;"> - <img src="%IMAGEPATH%/tech-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 180px; height: 108px; background: #f6f6f6;"> - <img src="%IMAGEPATH%/mailus-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - <td style="vertical-align: top; margin: 0; padding: 34px 0 0 0; width: 210px; height: 108px; background: #f6f6f6; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px;"> - <img src="%IMAGEPATH%/demo-100.png" style="width: 100px; height: 100px;margin: 0 auto;" /> - </td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Need tech help?</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 180px; height: 16px; background: #f6f6f6;">Sales Questions</td> - <td style="vertical-align: top; margin: 0; padding: 0; width: 210px; height: 16px; background: #f6f6f6;">Order Demo</td> - </tr> - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px;"> - <a href="http://dev.onlyoffice.org/" target="_blank" style="color: #333;">Ask the Community</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 180px; background: #f6f6f6;"> - <a href="mailto:sales@onlyoffice.com" style="color: #333;">Email us</a> - </td> - <td style="vertical-align: top; margin: 0; padding: 0 0 30px; width: 210px; background: #f6f6f6;-moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px;"> - <a href="http://www.onlyoffice.com/demo-order.aspx" target="_blank" style="color: #333;">Send a request</a> - </td> - </tr> - <body style="margin: 0; padding: 0; text-align: center; width: 100%; font-family: Arial, sans-serif; font-size: 14px; color: #333;"> <div style="background-color: #fff; width: 600px; margin: 0 auto; text-align: left;"> @@ -158,40 +98,6 @@ </div> </body> - - <tr border="0" cellspacing="0" cellpadding="0"> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 155px;"> - <a href="https://www.facebook.com/pages/OnlyOffice/833032526736775" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-fb-40.png" alt="Facebook" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://twitter.com/ONLY_OFFICE" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-tw-40.png" alt="Twitter" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.onlyoffice.com/blog" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-blog-40.png" alt="ONLYOFFICE" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://www.youtube.com/user/onlyofficeTV" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-youtube-40.png" alt="YouTube" style="width: 40px; height: 40x;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 5px 0 5px;"> - <a href="https://vk.com/onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-vk-40.png" alt="VK" style="width: 40px; height: 40px;" /> - </a> - </td> - <td style="width: 40px; vertical-align: top; margin: 0; padding: 22px 155px 0 5px;"> - <a href="https://www.instagram.com/the_onlyoffice" style="width: 40px; height: 40px; display: block; margin: 0; padding: 0;" target="_blank"> - <img src="%IMAGEPATH%/social-inst-40.png" alt="Instagram" style="width: 40px; height: 40px;" /> - </a> - </td> - </tr> - 該電子郵件是自動生成的,您無需回答。 <br />您收到此電子郵件的原因是您是<a href =“ {0}” style =“ color:#7b7b7b;”的註冊用戶。 target =“ _ blank”> {0} </a> diff --git a/common/ASC.Notify.Textile/Resources/style.css b/common/ASC.Notify.Textile/Resources/style.css index d9fd5b526..9fc3bcc77 100644 --- a/common/ASC.Notify.Textile/Resources/style.css +++ b/common/ASC.Notify.Textile/Resources/style.css @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/ASC.Notify.Textile/TextileStyler.cs b/common/ASC.Notify.Textile/TextileStyler.cs index a6729aa8d..045f83880 100644 --- a/common/ASC.Notify.Textile/TextileStyler.cs +++ b/common/ASC.Notify.Textile/TextileStyler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,7 +39,7 @@ namespace ASC.Notify.Textile public class TextileStyler : IPatternStyler { private static readonly Regex VelocityArguments = new Regex(NVelocityPatternFormatter.NoStylePreffix + "(?.*?)" + NVelocityPatternFormatter.NoStyleSuffix, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled); - + private static readonly Regex SupReplacement = new Regex(@"(\S+)\[(.*?)\]", RegexOptions.Compiled); static TextileStyler() { const string file = "ASC.Notify.Textile.Resources.style.css"; @@ -61,7 +61,7 @@ public void ApplyFormating(NoticeMessage message) } if (string.IsNullOrEmpty(message.Body)) return; - + message.Body = SupReplacement.Replace(message.Body, @"$1[$2]"); formatter.Format(message.Body); var template = GetTemplate(message); @@ -187,13 +187,13 @@ private static void InitFooter(NoticeMessage message, MailWhiteLabelSettings set InitSocialFooter(settings, out footerSocialContent); break; case "personal": - footerSocialContent = NotifyTemplateResource.SocialNetworksFooterV10; + footerSocialContent = NotifyTemplateResource.SocialNetworksFooterV121; break; case "personalCustomMode": break; case "opensource": - footerContent = NotifyTemplateResource.FooterOpensourceV10; - footerSocialContent = NotifyTemplateResource.SocialNetworksFooterV10; + footerContent = NotifyTemplateResource.FooterOpensourceV121; + footerSocialContent = NotifyTemplateResource.SocialNetworksFooterV121; break; } } @@ -206,21 +206,21 @@ private static void InitCommonFooter(MailWhiteLabelSettings settings, out string if (settings == null) { footerContent = - NotifyTemplateResource.FooterCommonV10 + NotifyTemplateResource.FooterCommonV121 .Replace("%SUPPORTURL%", MailWhiteLabelSettings.DefaultMailSupportUrl) .Replace("%SALESEMAIL%", MailWhiteLabelSettings.DefaultMailSalesEmail) .Replace("%DEMOURL%", MailWhiteLabelSettings.DefaultMailDemoUrl); - footerSocialContent = NotifyTemplateResource.SocialNetworksFooterV10; + footerSocialContent = NotifyTemplateResource.SocialNetworksFooterV121; } else if (settings.FooterEnabled) { footerContent = - NotifyTemplateResource.FooterCommonV10 + NotifyTemplateResource.FooterCommonV121 .Replace("%SUPPORTURL%", String.IsNullOrEmpty(settings.SupportUrl) ? "mailto:" + settings.SalesEmail : settings.SupportUrl) .Replace("%SALESEMAIL%", settings.SalesEmail) .Replace("%DEMOURL%", String.IsNullOrEmpty(settings.DemoUrl) ? "mailto:" + settings.SalesEmail : settings.DemoUrl); - footerSocialContent = settings.FooterSocialEnabled ? NotifyTemplateResource.SocialNetworksFooterV10 : string.Empty; + footerSocialContent = settings.FooterSocialEnabled ? NotifyTemplateResource.SocialNetworksFooterV121 : string.Empty; } } @@ -229,7 +229,7 @@ private static void InitSocialFooter(MailWhiteLabelSettings settings, out string footerSocialContent = string.Empty; if (settings == null || (settings.FooterEnabled && settings.FooterSocialEnabled)) - footerSocialContent = NotifyTemplateResource.SocialNetworksFooterV10; + footerSocialContent = NotifyTemplateResource.SocialNetworksFooterV121; } private static string GetUnsubscribeText(NoticeMessage message, MailWhiteLabelSettings settings) diff --git a/common/LoginTests.cs b/common/LoginTests.cs index f9f0a6dfe..488fb75d8 100644 --- a/common/LoginTests.cs +++ b/common/LoginTests.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using NUnit.Framework; using ASC.ActiveDirectory.Base.Data; diff --git a/common/TMResourceManager/ASC.Resource.Data/ASC.Resource.Data.csproj b/common/TMResourceManager/ASC.Resource.Data/ASC.Resource.Data.csproj index 8e060cb10..f62dc6e30 100644 --- a/common/TMResourceManager/ASC.Resource.Data/ASC.Resource.Data.csproj +++ b/common/TMResourceManager/ASC.Resource.Data/ASC.Resource.Data.csproj @@ -28,6 +28,8 @@ prompt 4 false + ..\..\..\web\studio\ASC.Web.Studio\bin\ASC.Resource.Data.xml + CS1591 none @@ -70,13 +72,14 @@ 13.0.1 - 1.3.2 + 1.4.2 + \ No newline at end of file diff --git a/common/TMResourceManager/ASC.Resource.Data/JsonManager.cs b/common/TMResourceManager/ASC.Resource.Data/JsonManager.cs index a2086cf47..706ad4001 100644 --- a/common/TMResourceManager/ASC.Resource.Data/JsonManager.cs +++ b/common/TMResourceManager/ASC.Resource.Data/JsonManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ using System.Linq; using System.Text.RegularExpressions; using System.Xml; +using System.Xml.Linq; using ASC.Common.Logging; @@ -261,7 +262,25 @@ var word in return zipPath; } - private static string GetCultureFromFileName(string fileName) + public static string GetJsonFromResx(string path) + { + var culture = GetCultureFromFileName(Path.GetFileName(path)); + + var obj = XElement.Parse(File.ReadAllText(path)) + .Elements("data") + .ToDictionary(el => el.Attribute("name").Value, el => el.Element("value").Value.Trim()); + + string json = JsonConvert.SerializeObject(obj, Formatting.Indented); + + return json; + } + + public static Dictionary GetResxDataFromJson(string path) + { + return JsonConvert.DeserializeObject>(File.ReadAllText(path)); + } + + public static string GetCultureFromFileName(string fileName) { var culture = "Neutral"; var nameWithoutExtension = Path.GetFileNameWithoutExtension(fileName); @@ -273,5 +292,19 @@ private static string GetCultureFromFileName(string fileName) return culture; } + + public static string GetCultureAndFileName(string fileName) + { + var culture = "en"; + var nameWithoutExtension = Path.GetFileNameWithoutExtension(fileName); + + if (nameWithoutExtension != null && nameWithoutExtension.Split('.').Length > 1) + { + culture = nameWithoutExtension.Split('.')[1]; + nameWithoutExtension = nameWithoutExtension.Split('.')[0]; + } + + return Path.Combine(culture, $"{nameWithoutExtension}.json"); + } } } \ No newline at end of file diff --git a/common/TMResourceManager/ASC.Resource.Data/Model/Author.cs b/common/TMResourceManager/ASC.Resource.Data/Model/Author.cs index 046bb4a47..f7ce55f02 100644 --- a/common/TMResourceManager/ASC.Resource.Data/Model/Author.cs +++ b/common/TMResourceManager/ASC.Resource.Data/Model/Author.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/TMResourceManager/ASC.Resource.Data/Model/ResCulture.cs b/common/TMResourceManager/ASC.Resource.Data/Model/ResCulture.cs index ab2611d7e..00dfb8dc4 100644 --- a/common/TMResourceManager/ASC.Resource.Data/Model/ResCulture.cs +++ b/common/TMResourceManager/ASC.Resource.Data/Model/ResCulture.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/TMResourceManager/ASC.Resource.Data/Model/ResCurrent.cs b/common/TMResourceManager/ASC.Resource.Data/Model/ResCurrent.cs index 8a23c05cb..147f2b071 100644 --- a/common/TMResourceManager/ASC.Resource.Data/Model/ResCurrent.cs +++ b/common/TMResourceManager/ASC.Resource.Data/Model/ResCurrent.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * */ + namespace TMResourceData.Model { public class ResCurrent diff --git a/common/TMResourceManager/ASC.Resource.Data/Model/ResFile.cs b/common/TMResourceManager/ASC.Resource.Data/Model/ResFile.cs index 63dbd71ad..53bc16a7c 100644 --- a/common/TMResourceManager/ASC.Resource.Data/Model/ResFile.cs +++ b/common/TMResourceManager/ASC.Resource.Data/Model/ResFile.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/TMResourceManager/ASC.Resource.Data/Model/ResModule.cs b/common/TMResourceManager/ASC.Resource.Data/Model/ResModule.cs index 165b07d7d..34161a71c 100644 --- a/common/TMResourceManager/ASC.Resource.Data/Model/ResModule.cs +++ b/common/TMResourceManager/ASC.Resource.Data/Model/ResModule.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/TMResourceManager/ASC.Resource.Data/Model/ResProject.cs b/common/TMResourceManager/ASC.Resource.Data/Model/ResProject.cs index 2f104622d..e79d28119 100644 --- a/common/TMResourceManager/ASC.Resource.Data/Model/ResProject.cs +++ b/common/TMResourceManager/ASC.Resource.Data/Model/ResProject.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/TMResourceManager/ASC.Resource.Data/Model/ResWord.cs b/common/TMResourceManager/ASC.Resource.Data/Model/ResWord.cs index 38d559b34..bce2df89a 100644 --- a/common/TMResourceManager/ASC.Resource.Data/Model/ResWord.cs +++ b/common/TMResourceManager/ASC.Resource.Data/Model/ResWord.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/TMResourceManager/ASC.Resource.Data/Model/StatisticModule.cs b/common/TMResourceManager/ASC.Resource.Data/Model/StatisticModule.cs index 76214e98a..396dfce78 100644 --- a/common/TMResourceManager/ASC.Resource.Data/Model/StatisticModule.cs +++ b/common/TMResourceManager/ASC.Resource.Data/Model/StatisticModule.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/TMResourceManager/ASC.Resource.Data/Model/StatisticUser.cs b/common/TMResourceManager/ASC.Resource.Data/Model/StatisticUser.cs index 180c6a9bf..0ffaeaf56 100644 --- a/common/TMResourceManager/ASC.Resource.Data/Model/StatisticUser.cs +++ b/common/TMResourceManager/ASC.Resource.Data/Model/StatisticUser.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/TMResourceManager/ASC.Resource.Data/Model/WordStatusEnum.cs b/common/TMResourceManager/ASC.Resource.Data/Model/WordStatusEnum.cs index 6924d6850..f1d811eb5 100644 --- a/common/TMResourceManager/ASC.Resource.Data/Model/WordStatusEnum.cs +++ b/common/TMResourceManager/ASC.Resource.Data/Model/WordStatusEnum.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/TMResourceManager/ASC.Resource.Data/ResourceData.cs b/common/TMResourceManager/ASC.Resource.Data/ResourceData.cs index a6cb8b3d7..1ecf9bddc 100644 --- a/common/TMResourceManager/ASC.Resource.Data/ResourceData.cs +++ b/common/TMResourceManager/ASC.Resource.Data/ResourceData.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,7 +43,7 @@ public static class ResourceData public static DateTime GetLastUpdate() { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResFilesTable).SelectMax("LastUpdate"); @@ -53,7 +53,7 @@ public static DateTime GetLastUpdate() public static List GetListLanguages(int fileId, string title) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResCultureTable) .Select("res_cultures.title", "res_cultures.value", "res_cultures.available") @@ -71,7 +71,7 @@ public static List GetListLanguages(int fileId, string title) public static Dictionary> GetCulturesWithAuthors() { - using (var dbManager = DbManager.FromHttpContext("tmresource")) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery("res_authorslang ral") .Select(new[] { "ral.authorLogin", "rc.title", "rc.value" }) @@ -87,7 +87,7 @@ public static Dictionary> GetCulturesWithAuthors() public static void AddCulture(string cultureTitle, string name) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sqlInsert = new SqlInsert(ResCultureTable); sqlInsert.InColumnValue("title", cultureTitle).InColumnValue("value", name); @@ -97,22 +97,22 @@ public static void AddCulture(string cultureTitle, string name) public static void AddResource(string cultureTitle, string resType, DateTime date, ResWord word, bool isConsole, string authorLogin, bool updateIfExist = true) { - using (var db = DbManager.FromHttpContext(Dbid)) + using (var db = new DbManager(Dbid)) { var resData = db.ExecuteScalar(GetQuery(ResDataTable, cultureTitle, word)); var resReserve = db.ExecuteScalar(GetQuery(ResReserveTable, cultureTitle, word)); - //нет ключа + //no key if (string.IsNullOrEmpty(resData)) { - //добавляем в основную таблицу + //add to main table db.ExecuteNonQuery(Insert(ResDataTable, cultureTitle, word) .InColumnValue("resourceType", resType) .InColumnValue("timechanges", date) .InColumnValue("flag", 2) .InColumnValue("authorLogin", authorLogin)); - //добавляем в резервную таблицу + //add to backup table if (isConsole) db.ExecuteNonQuery(Insert(ResReserveTable, cultureTitle, word)); } else @@ -131,10 +131,10 @@ public static void AddResource(string cultureTitle, string resType, DateTime dat if (!updateIfExist) return; - //при работе с консолью изменилось по сравнению с res_data и res_reserve, либо при работе с сайтом изменилось по сравнению с res_reserve + //when working with the console has changed compared to res_data and res_reserve, or when working with the site has changed compared to res_reserve if ((isConsole && isChangeResData && isChangeResReserve) || !isConsole) { - // изменилась нейтральная культура - выставлен флаг у всех ключей из выбранного файла с выбранным title + // neutral culture changed - flag set for all keys from the selected file with the selected title if (cultureTitle == "Neutral") { var update = new SqlUpdate(ResDataTable) @@ -144,7 +144,7 @@ public static void AddResource(string cultureTitle, string resType, DateTime dat db.ExecuteNonQuery(update); } - // изменилась не нейтральная культура + // non-neutral culture changed db.ExecuteNonQuery(Insert(ResDataTable, cultureTitle, word) .InColumnValue("resourceType", resType) .InColumnValue("timechanges", date) @@ -163,7 +163,7 @@ public static void AddResource(string cultureTitle, string resType, DateTime dat public static void EditEnglish(ResWord word) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var update = new SqlUpdate(ResDataTable); update.Set("textvalue", word.ValueFrom).Where("fileID", word.ResFile.FileID).Where("title", word.Title).Where("cultureTitle", "Neutral"); @@ -174,7 +174,7 @@ public static void EditEnglish(ResWord word) public static void AddComment(ResWord word) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sqlUpdate = new SqlUpdate(ResDataTable); sqlUpdate.Set("description", word.TextComment).Where("title", word.Title).Where("fileID", word.ResFile.FileID).Where("cultureTitle", "Neutral"); @@ -191,7 +191,7 @@ public static int AddFile(string fileName, string projectName, string moduleName fileName = fileNameWithoutExtension.Split('.')[0] + Path.GetExtension(fileName); } - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResFilesTable) .SelectCount() @@ -224,7 +224,7 @@ public static int AddFile(string fileName, string projectName, string moduleName public static IEnumerable GetCultures() { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResCultureTable); sql.Select("title", "value", "available") @@ -236,7 +236,7 @@ public static IEnumerable GetCultures() public static void SetCultureAvailable(string title) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlUpdate(ResCultureTable); sql.Set("available", true).Where("title", title); @@ -251,7 +251,7 @@ private static ResCulture GetCultureFromDB(IList r) public static List GetAllFiles() { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResFilesTable); @@ -267,7 +267,7 @@ public static List GetAllFiles() public static IEnumerable GetResProjects() { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResFilesTable); sql.Select("projectName").Distinct(); @@ -290,7 +290,7 @@ public static IEnumerable GetResProjects() public static IEnumerable GetListResWords(ResCurrent current, string search) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var exist = new SqlQuery(ResDataTable + " rd3") .Select("rd3.title") @@ -335,7 +335,7 @@ public static IEnumerable GetListResWords(ResCurrent current, string se public static List GetListResWords(ResFile resFile, string to, string search) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResDataTable) .Select("title", "fileid", "textValue", "description", "flag", "link") @@ -359,7 +359,7 @@ public static List GetListResWords(ResFile resFile, string to, string s public static void GetListModules(ResCurrent currentData) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var notExist = new SqlQuery(ResDataTable + " rd1") .Select("1") @@ -398,7 +398,7 @@ public static void GetListModules(ResCurrent currentData) public static void LockModules(string projectName, string modules) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sqlUpdate = new SqlUpdate(ResFilesTable); sqlUpdate.Set("isLock", 1).Where("projectName", projectName).Where(Exp.In("moduleName", modules.Split(','))); @@ -408,7 +408,7 @@ public static void LockModules(string projectName, string modules) public static void UnLockModules() { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sqlUpdate = new SqlUpdate(ResFilesTable); sqlUpdate.Set("isLock", 0); @@ -418,7 +418,7 @@ public static void UnLockModules() public static void AddLink(string resource, string fileName, string page) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var query = new SqlQuery(ResDataTable); query.Select(ResDataTable + ".id") @@ -435,7 +435,7 @@ public static void AddLink(string resource, string fileName, string page) public static void GetResWordByKey(ResWord word, string to) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResDataTable) .Select("textvalue", "description", "link") @@ -467,7 +467,7 @@ public static void GetResWordByKey(ResWord word, string to) public static void GetValueByKey(ResWord word, string to) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResDataTable); sql.Select("textvalue") @@ -492,7 +492,7 @@ private static void GetValue(ResWord word, string to, IList r) public static List GetListAuthors() { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResAuthorsTable) .Select("login", "password", "isAdmin"); @@ -503,7 +503,7 @@ public static List GetListAuthors() public static Author GetAuthor(string login) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResAuthorsTable) .Select("login", "password", "isAdmin") @@ -554,7 +554,7 @@ public static Author GetAuthor(string login) public static void CreateAuthor(Author author, IEnumerable languages, string modules) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sqlInsert = new SqlInsert(ResAuthorsTable, true) .InColumnValue("login", author.Login) @@ -597,7 +597,7 @@ public static void CreateAuthor(Author author, IEnumerable languages, st public static void DeleteAuthor(string login) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlDelete(ResAuthorsTable).Where("login", login); @@ -607,7 +607,7 @@ public static void DeleteAuthor(string login) public static bool IsAuthor(string login, string password) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResAuthorsTable) .SelectCount() @@ -620,7 +620,7 @@ public static bool IsAuthor(string login, string password) public static void SetAuthorOnline(string login) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlUpdate(ResAuthorsTable) .Set("lastVisit", DateTime.UtcNow) @@ -632,7 +632,7 @@ public static void SetAuthorOnline(string login) public static List GetOnlineAuthors() { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResAuthorsTable) .Select("login") @@ -644,7 +644,7 @@ public static List GetOnlineAuthors() public static void AddAuthorLang(string login, string cultureTitle) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlInsert(ResAuthorsLangTable) .InColumnValue("cultureTitle", cultureTitle) @@ -656,7 +656,7 @@ public static void AddAuthorLang(string login, string cultureTitle) public static List GetStatistic() { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResDataTable + " r1") .Select("sum(LENGTH(r1.textvalue) - LENGTH(REPLACE(r1.textvalue, ' ', '')) + 1)") @@ -701,7 +701,7 @@ public static List GetUserStatisticForLang() public static List GetUserStatisticForLang(DateTime from, DateTime till) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResDataTable + " as r1"); @@ -725,7 +725,7 @@ public static List GetUserStatisticForLang(DateTime from, DateTim public static List GetUserStatisticForModules(string login, DateTime from, DateTime till) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResDataTable + " as r1"); @@ -755,7 +755,7 @@ private static StatisticUser GetUserStatisticFromDB(IList r) public static List SearchAll(string projectName, string moduleName, string languageTo, string searchText, string searchType) { - using (var dbManager = DbManager.FromHttpContext(Dbid)) + using (var dbManager = new DbManager(Dbid)) { var sql = new SqlQuery(ResDataTable) .Select("title", "fileid", "textValue", "resName", "moduleName", "projectName") @@ -780,7 +780,7 @@ public static List SearchAll(string projectName, string moduleName, str public static void UpdateHashTable(ref Hashtable table, DateTime date) { - using (var dbManager = DbManager.FromHttpContext("tmresourceTrans")) + using (var dbManager = new DbManager("tmresourceTrans")) { var sql = new SqlQuery(ResDataTable) .Select(ResDataTable + ".textValue", ResDataTable + ".title", ResFilesTable + ".ResName", ResDataTable + ".cultureTitle") diff --git a/common/Tests/ASC.Api.Calendar.Test/RecurrenceRuleTest.cs b/common/Tests/ASC.Api.Calendar.Test/RecurrenceRuleTest.cs index 0a4498378..a7dd764f2 100644 --- a/common/Tests/ASC.Api.Calendar.Test/RecurrenceRuleTest.cs +++ b/common/Tests/ASC.Api.Calendar.Test/RecurrenceRuleTest.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.Web.Core.Calendars; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; @@ -40,7 +40,7 @@ public void YearlyRules() ByMonth = new int[] { 6, 7 } }; - var dates = r1.GetDates(new DateTime(1997, 6, 10, 9, 0, 0), _fromDate, _toDate); + var dates = r1.GetDates(new DateTime(1997, 6, 10, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){new DateTime(1997, 6, 10, 9, 0, 0), new DateTime(1997, 7, 10, 9, 0, 0), new DateTime(1998, 6, 10, 9, 0, 0),new DateTime(1998, 7, 10, 9, 0, 0), @@ -57,7 +57,7 @@ public void YearlyRules() Count = 10, ByMonth = new int[] { 1, 2,3 } }; - dates = r1.GetDates(new DateTime(1997, 3, 10, 9, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(1997, 3, 10, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){new DateTime(1997, 3, 10, 9, 0, 0), new DateTime(1999, 1, 10, 9, 0, 0),new DateTime(1999, 2, 10, 9, 0, 0), new DateTime(1999, 3, 10, 9, 0, 0), @@ -74,7 +74,7 @@ public void YearlyRules() Count = 10, ByYearDay = new int[] { 1, 100, 200 } }; - dates = r1.GetDates(new DateTime(1997, 1, 1, 9, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(1997, 1, 1, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 1, 1, 9, 0, 0),new DateTime(1997, 4, 10, 9, 0, 0),new DateTime(1997, 7, 19, 9, 0, 0), @@ -91,7 +91,7 @@ public void YearlyRules() Count = 3, ByDay = new RecurrenceRule.WeekDay[] { RecurrenceRule.WeekDay.Parse("20MO") } }; - dates = r1.GetDates(new DateTime(1997, 5, 19, 9, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(1997, 5, 19, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 5, 19, 9, 0, 0),new DateTime(1998, 5, 18, 9, 0, 0),new DateTime(1999, 5, 17, 9, 0, 0) @@ -106,7 +106,7 @@ public void YearlyRules() ByWeekNo = new int[]{20}, ByDay = new RecurrenceRule.WeekDay[] { RecurrenceRule.WeekDay.Parse("MO") } }; - dates = r1.GetDates(new DateTime(1997, 5, 12, 9, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(1997, 5, 12, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 5, 12, 9, 0, 0),new DateTime(1998, 5, 11, 9, 0, 0),new DateTime(1999, 5, 17, 9, 0, 0) @@ -120,7 +120,7 @@ public void YearlyRules() ByMonth = new int[] { 3 }, ByDay = new RecurrenceRule.WeekDay[] { RecurrenceRule.WeekDay.Parse("TH") } }; - dates = r1.GetDates(new DateTime(1997, 3, 13, 9, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(1997, 3, 13, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 3, 13, 9, 0, 0), new DateTime(1997, 3, 20, 9, 0, 0),new DateTime(1997, 3, 27, 9, 0, 0), @@ -137,7 +137,7 @@ public void YearlyRules() ByMonth = new int[] { 6,7,8 }, ByDay = new RecurrenceRule.WeekDay[] { RecurrenceRule.WeekDay.Parse("TH") } }; - dates = r1.GetDates(new DateTime(1997, 6, 5, 9, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(1997, 6, 5, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 6, 5, 9, 0, 0), new DateTime(1997, 6, 12, 9, 0, 0),new DateTime(1997, 6, 19, 9, 0, 0),new DateTime(1997, 6, 26, 9, 0, 0), @@ -156,7 +156,7 @@ public void YearlyRules() ByMonthDay = new int[] { 2,3,4,5,6,7,8 }, ByDay = new RecurrenceRule.WeekDay[] { RecurrenceRule.WeekDay.Parse("TU") } }; - dates = r1.GetDates(new DateTime(1996, 11, 5, 9, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(1996, 11, 5, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1996, 11, 5, 9, 0, 0), @@ -173,7 +173,7 @@ public void YearlyRules() ByMonthDay = new int[] { 13 }, ByDay = new RecurrenceRule.WeekDay[] { RecurrenceRule.WeekDay.Parse("fr") } }; - dates = r1.GetDates(new DateTime(2012, 1, 1, 0, 0, 0), _fromDate, new DateTime(2014, 1, 1, 0, 0, 0)); + dates = r1.GetDates(new DateTime(2012, 1, 1, 0, 0, 0), TimeZoneInfo.Utc, false, _fromDate, new DateTime(2014, 1, 1, 0, 0, 0)); @@ -190,7 +190,7 @@ public void MonthlyRules() ByDay = new RecurrenceRule.WeekDay[] { RecurrenceRule.WeekDay.Parse("1FR") } }; - var dates = r1.GetDates(new DateTime(1997, 9, 5, 9, 0, 0), _fromDate, _toDate); + var dates = r1.GetDates(new DateTime(1997, 9, 5, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 9, 5, 9, 0, 0), new DateTime(1997, 10, 3, 9, 0, 0), @@ -207,7 +207,7 @@ public void MonthlyRules() ByDay = new RecurrenceRule.WeekDay[] { RecurrenceRule.WeekDay.Parse("1FR") } }; - dates = r1.GetDates(new DateTime(1997, 9, 5, 9, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(1997, 9, 5, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 9, 5, 9, 0, 0), new DateTime(1997, 10, 3, 9, 0, 0), @@ -223,7 +223,7 @@ public void MonthlyRules() ByDay = new RecurrenceRule.WeekDay[] { RecurrenceRule.WeekDay.Parse("1SU"), RecurrenceRule.WeekDay.Parse("-1SU") } }; - dates = r1.GetDates(new DateTime(1997, 9, 7, 9, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(1997, 9, 7, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 9, 7, 9, 0, 0), new DateTime(1997, 9, 28, 9, 0, 0), @@ -242,7 +242,7 @@ public void MonthlyRules() ByDay = new RecurrenceRule.WeekDay[] { RecurrenceRule.WeekDay.Parse("-2MO")} }; - dates = r1.GetDates(new DateTime(1997, 9, 22, 9, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(1997, 9, 22, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 9, 22, 9, 0, 0), new DateTime(1997, 10, 20, 9, 0, 0), @@ -260,7 +260,7 @@ public void MonthlyRules() ByMonthDay = new int[] {10,11,12,13,14,15 } }; - dates = r1.GetDates(new DateTime(1997, 9, 10, 9, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(1997, 9, 10, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 9, 10, 9, 0, 0), new DateTime(1997, 9, 11, 9, 0, 0), @@ -283,7 +283,7 @@ public void WeeklyRules() Count = 10 }; - var dates = r1.GetDates(new DateTime(1997, 9, 2, 9, 0, 0), _fromDate, _toDate); + var dates = r1.GetDates(new DateTime(1997, 9, 2, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 9, 2, 9, 0, 0), new DateTime(1997, 9, 9, 9, 0, 0), @@ -302,7 +302,7 @@ public void WeeklyRules() Count = 10 }; - dates = r1.GetDates(new DateTime(1997, 9, 2, 9, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(1997, 9, 2, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 9, 2, 9, 0, 0), new DateTime(1997, 9, 16, 9, 0, 0), @@ -321,7 +321,7 @@ public void WeeklyRules() ByDay = new RecurrenceRule.WeekDay[] { RecurrenceRule.WeekDay.Parse("tu"), RecurrenceRule.WeekDay.Parse("th") } }; - dates = r1.GetDates(new DateTime(1997, 9, 2, 9, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(1997, 9, 2, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 9, 2, 9, 0, 0), new DateTime(1997, 9, 4, 9, 0, 0), @@ -331,7 +331,7 @@ public void WeeklyRules() r1 = RecurrenceRule.Parse("freq=weekly;count=3;interval=2;byday=mo"); - dates = r1.GetDates(new DateTime(2012, 1, 2, 0, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(2012, 1, 2, 0, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(2012, 1, 2, 0, 0, 0), new DateTime(2012, 1, 16, 0, 0, 0), @@ -353,7 +353,7 @@ public void DailyRules() Interval = 10 }; - var dates = r1.GetDates(new DateTime(1997, 9, 2, 9, 0, 0), _fromDate, _toDate); + var dates = r1.GetDates(new DateTime(1997, 9, 2, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 9, 2, 9, 0, 0), new DateTime(1997, 9, 12, 9, 0, 0), @@ -373,7 +373,7 @@ public void HorlyRules() Interval = 3 }; - var dates = r1.GetDates(new DateTime(1997, 9, 2, 9, 0, 0), _fromDate, _toDate); + var dates = r1.GetDates(new DateTime(1997, 9, 2, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 9, 2, 9, 0, 0), new DateTime(1997, 9, 2, 12, 0, 0), @@ -392,7 +392,7 @@ public void MinutelyRules() Interval = 20 }; - var dates = r1.GetDates(new DateTime(1997, 9, 2, 9, 0, 0), _fromDate, _toDate); + var dates = r1.GetDates(new DateTime(1997, 9, 2, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 9, 2, 9, 0, 0), new DateTime(1997, 9, 2, 9, 20, 0), @@ -404,7 +404,7 @@ public void BySetPosRules() { //test 1 var r1 = RecurrenceRule.Parse("FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2;count=7"); - var dates = r1.GetDates(new DateTime(1997, 9, 29, 9, 0, 0), _fromDate, _toDate); + var dates = r1.GetDates(new DateTime(1997, 9, 29, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 9, 29, 9, 0, 0), new DateTime(1997, 10, 30, 9, 0, 0), new DateTime(1997, 11, 27, 9, 0, 0),new DateTime(1997, 12, 30, 9, 0, 0),new DateTime(1998, 1, 29, 9, 0, 0), @@ -413,7 +413,7 @@ public void BySetPosRules() //test 2 r1 = RecurrenceRule.Parse("FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3"); - dates = r1.GetDates(new DateTime(1997, 9, 4, 9, 0, 0), _fromDate, _toDate); + dates = r1.GetDates(new DateTime(1997, 9, 4, 9, 0, 0), TimeZoneInfo.Utc, false, _fromDate, _toDate); CollectionAssert.AreEqual(new List(){ new DateTime(1997, 9, 4, 9, 0, 0), new DateTime(1997, 10, 7, 9, 0, 0), new DateTime(1997, 11, 6, 9, 0, 0)}, dates); diff --git a/common/Tests/ASC.Api.Core.Tests/ApiDateTimeTests.cs b/common/Tests/ASC.Api.Core.Tests/ApiDateTimeTests.cs index 80fa06640..827ca8406 100644 --- a/common/Tests/ASC.Api.Core.Tests/ApiDateTimeTests.cs +++ b/common/Tests/ASC.Api.Core.Tests/ApiDateTimeTests.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + #if DEBUG using System; using ASC.Specific; diff --git a/common/Tests/ASC.Api.Core.Tests/FormBinderTests.cs b/common/Tests/ASC.Api.Core.Tests/FormBinderTests.cs index 405304b67..de262f9ce 100644 --- a/common/Tests/ASC.Api.Core.Tests/FormBinderTests.cs +++ b/common/Tests/ASC.Api.Core.Tests/FormBinderTests.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + #if DEBUG using Microsoft.VisualStudio.TestTools.UnitTesting; using Newtonsoft.Json; diff --git a/common/Tests/ASC.BenchmarkTest/DbManagerTest.cs b/common/Tests/ASC.BenchmarkTest/DbManagerTest.cs index d0ddc44df..2f6075d20 100644 --- a/common/Tests/ASC.BenchmarkTest/DbManagerTest.cs +++ b/common/Tests/ASC.BenchmarkTest/DbManagerTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.BenchmarkTest/Program.cs b/common/Tests/ASC.BenchmarkTest/Program.cs index 0c3f71f3d..689a4189e 100644 --- a/common/Tests/ASC.BenchmarkTest/Program.cs +++ b/common/Tests/ASC.BenchmarkTest/Program.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/ASC.Common.Tests.csproj b/common/Tests/ASC.Common.Tests/ASC.Common.Tests.csproj index 8f768b251..c795264c8 100644 --- a/common/Tests/ASC.Common.Tests/ASC.Common.Tests.csproj +++ b/common/Tests/ASC.Common.Tests/ASC.Common.Tests.csproj @@ -49,6 +49,7 @@ + @@ -71,6 +72,7 @@ + @@ -90,7 +92,7 @@ 2.1.1 - 8.0.19 + 8.0.32.1 diff --git a/common/Tests/ASC.Common.Tests/Data/DataTest.cs b/common/Tests/ASC.Common.Tests/Data/DataTest.cs index 801340050..9d88806c2 100644 --- a/common/Tests/ASC.Common.Tests/Data/DataTest.cs +++ b/common/Tests/ASC.Common.Tests/Data/DataTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/Data/ExpTest.cs b/common/Tests/ASC.Common.Tests/Data/ExpTest.cs index 1984bef52..3a820e5a2 100644 --- a/common/Tests/ASC.Common.Tests/Data/ExpTest.cs +++ b/common/Tests/ASC.Common.Tests/Data/ExpTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,8 @@ #if DEBUG using System.Data; +using System.Linq; + using ASC.Common.Data.Sql; using ASC.Common.Data.Sql.Expressions; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -146,8 +148,8 @@ public void SqlUnionTest() .Union(new SqlQuery("t2").Select("c2").Where("c2", 7)); Assert.AreEqual("select c1 from t1 where c1 = ? union select c2 from t2 where c2 = ?", union.ToString()); - Assert.AreEqual(4, union.GetParameters()[0]); - Assert.AreEqual(7, union.GetParameters()[1]); + Assert.AreEqual(4, union.GetParameters().ToArray()[0]); + Assert.AreEqual(7, union.GetParameters().ToArray()[1]); } [TestMethod] diff --git a/common/Tests/ASC.Common.Tests/Data/MultiRegionalDbTest.cs b/common/Tests/ASC.Common.Tests/Data/MultiRegionalDbTest.cs index c45de8849..f6abf939c 100644 --- a/common/Tests/ASC.Common.Tests/Data/MultiRegionalDbTest.cs +++ b/common/Tests/ASC.Common.Tests/Data/MultiRegionalDbTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/Geolocation/GeolocationTest.cs b/common/Tests/ASC.Common.Tests/Geolocation/GeolocationTest.cs index 1c4b889bb..d0f519d67 100644 --- a/common/Tests/ASC.Common.Tests/Geolocation/GeolocationTest.cs +++ b/common/Tests/ASC.Common.Tests/Geolocation/GeolocationTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/Logging/ConvertTest.cs b/common/Tests/ASC.Common.Tests/Logging/ConvertTest.cs index 7a0fc21ba..9d44fe406 100644 --- a/common/Tests/ASC.Common.Tests/Logging/ConvertTest.cs +++ b/common/Tests/ASC.Common.Tests/Logging/ConvertTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/Logging/SpecialFolderPathConverterTest.cs b/common/Tests/ASC.Common.Tests/Logging/SpecialFolderPathConverterTest.cs index 395f2fd94..40be7c420 100644 --- a/common/Tests/ASC.Common.Tests/Logging/SpecialFolderPathConverterTest.cs +++ b/common/Tests/ASC.Common.Tests/Logging/SpecialFolderPathConverterTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/Notify/XmlPatternProvider2Test.cs b/common/Tests/ASC.Common.Tests/Notify/XmlPatternProvider2Test.cs index deee89359..9ab55200d 100644 --- a/common/Tests/ASC.Common.Tests/Notify/XmlPatternProvider2Test.cs +++ b/common/Tests/ASC.Common.Tests/Notify/XmlPatternProvider2Test.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/Security/Authorizing/AzManagerTest.cs b/common/Tests/ASC.Common.Tests/Security/Authorizing/AzManagerTest.cs index 2184b1656..06cea3d50 100644 --- a/common/Tests/ASC.Common.Tests/Security/Authorizing/AzManagerTest.cs +++ b/common/Tests/ASC.Common.Tests/Security/Authorizing/AzManagerTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/Security/Authorizing/Class1.cs b/common/Tests/ASC.Common.Tests/Security/Authorizing/Class1.cs index 5c1e31756..3867b6bd7 100644 --- a/common/Tests/ASC.Common.Tests/Security/Authorizing/Class1.cs +++ b/common/Tests/ASC.Common.Tests/Security/Authorizing/Class1.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/Security/Authorizing/Domain.cs b/common/Tests/ASC.Common.Tests/Security/Authorizing/Domain.cs index a8b72fb13..e6b1ae08c 100644 --- a/common/Tests/ASC.Common.Tests/Security/Authorizing/Domain.cs +++ b/common/Tests/ASC.Common.Tests/Security/Authorizing/Domain.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/Security/Authorizing/DomainStub.cs b/common/Tests/ASC.Common.Tests/Security/Authorizing/DomainStub.cs index d4e66c823..7bfa19c11 100644 --- a/common/Tests/ASC.Common.Tests/Security/Authorizing/DomainStub.cs +++ b/common/Tests/ASC.Common.Tests/Security/Authorizing/DomainStub.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/Security/Cryptography/Hasher_Test.cs b/common/Tests/ASC.Common.Tests/Security/Cryptography/Hasher_Test.cs index 69d8b9d95..8bf0afbfb 100644 --- a/common/Tests/ASC.Common.Tests/Security/Cryptography/Hasher_Test.cs +++ b/common/Tests/ASC.Common.Tests/Security/Cryptography/Hasher_Test.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/Utils/DnsLookupTest.cs b/common/Tests/ASC.Common.Tests/Utils/DnsLookupTest.cs index f74c9b489..2d739970f 100644 --- a/common/Tests/ASC.Common.Tests/Utils/DnsLookupTest.cs +++ b/common/Tests/ASC.Common.Tests/Utils/DnsLookupTest.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + #if DEBUG namespace ASC.Common.Tests.Utils { diff --git a/common/Tests/ASC.Common.Tests/Utils/HtmlUtil_Test.cs b/common/Tests/ASC.Common.Tests/Utils/HtmlUtil_Test.cs index 96109d429..077ff685f 100644 --- a/common/Tests/ASC.Common.Tests/Utils/HtmlUtil_Test.cs +++ b/common/Tests/ASC.Common.Tests/Utils/HtmlUtil_Test.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/Utils/MimeHeaderUtilsTest.cs b/common/Tests/ASC.Common.Tests/Utils/MimeHeaderUtilsTest.cs index 57dbb080a..356aacfdd 100644 --- a/common/Tests/ASC.Common.Tests/Utils/MimeHeaderUtilsTest.cs +++ b/common/Tests/ASC.Common.Tests/Utils/MimeHeaderUtilsTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/Web/MimeMappingTest.cs b/common/Tests/ASC.Common.Tests/Web/MimeMappingTest.cs index 630603c0b..e25518454 100644 --- a/common/Tests/ASC.Common.Tests/Web/MimeMappingTest.cs +++ b/common/Tests/ASC.Common.Tests/Web/MimeMappingTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Common.Tests/Web/ResiliencePoliciesTest.cs b/common/Tests/ASC.Common.Tests/Web/ResiliencePoliciesTest.cs new file mode 100644 index 000000000..f16a289ef --- /dev/null +++ b/common/Tests/ASC.Common.Tests/Web/ResiliencePoliciesTest.cs @@ -0,0 +1,157 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Threading.Tasks; +using System.Web; + +using ASC.Common.Web; + +using Microsoft.VisualStudio.TestTools.UnitTesting; + +using Polly.CircuitBreaker; + +namespace ASC.Common.Tests.Web +{ + [TestClass] + public class ResiliencePoliciesTest + { + private string REQUEST_IDENTIFIER; + + private const string TEST_MESSAGE = "test"; + private int retryCounter; + + [TestInitialize()] + public void Setup() + { + REQUEST_IDENTIFIER = Guid.NewGuid().ToString(); + retryCounter = 0; + } + + [TestMethod] + public async Task CheckSuccessfulCase() + { + var response = await ResiliencePolicyManager.GetStringWithPoliciesAsync(REQUEST_IDENTIFIER, GetSuccessfullFunction()); + Assert.AreEqual(response, TEST_MESSAGE); + } + + [TestMethod] + public async Task CheckFailedCase() + { + try + { + var response = await ResiliencePolicyManager.GetStringWithPoliciesAsync(REQUEST_IDENTIFIER, GetFailedFunction()); + } + catch (Exception ex) + { + Assert.AreEqual(ex.Message, TEST_MESSAGE); + } + } + + [TestMethod] + public async Task CheckRetryPolicy() + { + await ResiliencePolicyManager.GetStringWithPoliciesAsync(REQUEST_IDENTIFIER, GetSuccessfullFunction()); + Assert.AreEqual(retryCounter, 1); + retryCounter = 0; + + try + { + await ResiliencePolicyManager.GetStringWithPoliciesAsync(REQUEST_IDENTIFIER, GetFailedFunction()); + } + catch (Exception) + { + Assert.AreEqual(retryCounter, ResiliencePolicyManager.RETRY_COUNT + 1); + } + } + + + [TestMethod] + public async Task CheckCircuitBreakerPolicy() + { + for (int i = 0; i < ResiliencePolicyManager.MINIMUM_THROUGHPUT + 1; i++) + { + try + { + await ResiliencePolicyManager.GetStringWithPoliciesAsync(REQUEST_IDENTIFIER, GetFailedFunction()); + } + catch(HttpException) + { + continue; + } + catch (BrokenCircuitException) + { + break; + } + } + + Assert.AreEqual(retryCounter, ResiliencePolicyManager.MINIMUM_THROUGHPUT); + } + + + [TestMethod] + public async Task CheckMixedSequenceRequests() + { + var numberSuccessedRequests = ResiliencePolicyManager.MINIMUM_THROUGHPUT + * (1 - ResiliencePolicyManager.FAILURE_THRESHOLD) + / ResiliencePolicyManager.RETRY_COUNT; + + for (int i = 0; i < ResiliencePolicyManager.MINIMUM_THROUGHPUT + 1; i++) + { + try + { + if(i < numberSuccessedRequests) + { + await ResiliencePolicyManager.GetStringWithPoliciesAsync(REQUEST_IDENTIFIER, GetSuccessfullFunction()); + } + else + { + await ResiliencePolicyManager.GetStringWithPoliciesAsync(REQUEST_IDENTIFIER, GetFailedFunction()); + } + } + catch (HttpException) + { + continue; + } + catch (BrokenCircuitException) + { + break; + } + } + + Assert.AreEqual(retryCounter, ResiliencePolicyManager.MINIMUM_THROUGHPUT); + } + + private Func> GetSuccessfullFunction() + { + return async () => + { + retryCounter++; + return await Task.FromResult(TEST_MESSAGE); + }; + } + + private Func> GetFailedFunction() + { + return () => + { + retryCounter++; + throw new HttpException(TEST_MESSAGE); + }; + } + } +} diff --git a/common/Tests/ASC.Core.Common.Tests/ASC.Core.Common.Tests.csproj b/common/Tests/ASC.Core.Common.Tests/ASC.Core.Common.Tests.csproj index b4ade51b6..4cf4c4449 100644 --- a/common/Tests/ASC.Core.Common.Tests/ASC.Core.Common.Tests.csproj +++ b/common/Tests/ASC.Core.Common.Tests/ASC.Core.Common.Tests.csproj @@ -92,7 +92,7 @@ 2.1.1 - 8.0.19 + 8.0.32.1 diff --git a/common/Tests/ASC.Core.Common.Tests/BillingClientTest.cs b/common/Tests/ASC.Core.Common.Tests/BillingClientTest.cs index 894baf1e7..560d36404 100644 --- a/common/Tests/ASC.Core.Common.Tests/BillingClientTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/BillingClientTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,7 +31,7 @@ public class BillingClientTest public BillingClientTest() { - billingClient = new BillingClient(); + billingClient = new BillingClient(true); } @@ -47,15 +47,15 @@ public void GetLastPaymentTest() [TestMethod] public void GetPaymentsTest() { - var payments = billingClient.GetPayments("918", DateTime.MinValue, DateTime.MaxValue).ToList(); + var payments = billingClient.GetPayments("918").ToList(); Assert.AreEqual(10, payments.Count); - Assert.AreEqual(payments[0].ProductId, "1"); + Assert.AreEqual(payments[0].ProductRef, "1"); Assert.AreEqual(payments[0].CartId, "11806812"); - Assert.AreEqual(payments[0].Currency, "EUR"); - Assert.AreEqual(payments[0].Date, new DateTime(2012, 4, 8, 13, 36, 30)); + Assert.AreEqual(payments[0].PaymentCurrency, "EUR"); + Assert.AreEqual(payments[0].PaymentDate, new DateTime(2012, 4, 8, 13, 36, 30)); Assert.AreEqual(payments[0].Email, "digiredo@mac.com"); - Assert.AreEqual(payments[0].Method, "PayPal"); - Assert.AreEqual(payments[0].Name, "Erik van der Zijden"); + Assert.AreEqual(payments[0].PaymentMethod, "PayPal"); + Assert.AreEqual(payments[0].FName + payments[0].LName, "Erik van der Zijden"); Assert.AreEqual(payments[0].Price, 37.5); } @@ -64,31 +64,31 @@ public void ShoppingUriBatchTest() { var result = billingClient.GetPaymentUrls("55380i", new[] { "78", "79", "80", "107", "108" }); Assert.AreEqual(5, result.Count); - Assert.IsNotNull(result["12"].Item1); - Assert.IsNotNull(result["13"].Item1); - Assert.IsNotNull(result["14"].Item1); - Assert.IsNull(result["0"].Item1); - Assert.IsNull(result["-2"].Item1); + Assert.IsNotNull(result["12"]); + Assert.IsNotNull(result["13"]); + Assert.IsNotNull(result["14"]); + Assert.IsNull(result["0"]); + Assert.IsNull(result["-2"]); - Assert.IsNull(result["12"].Item2); - Assert.IsNull(result["13"].Item2); - Assert.IsNull(result["14"].Item2); - Assert.IsNull(result["0"].Item2); - Assert.IsNull(result["-2"].Item2); + Assert.IsNull(result["12"]); + Assert.IsNull(result["13"]); + Assert.IsNull(result["14"]); + Assert.IsNull(result["0"]); + Assert.IsNull(result["-2"]); } [TestMethod] public void GetInvoiceTest() { - var result = billingClient.GetInvoice("11806812"); - Assert.IsNotNull(result.Sale); - Assert.IsNull(result.Refund); + //var result = billingClient.GetInvoice("11806812"); + //Assert.IsNotNull(result.Sale); + //Assert.IsNull(result.Refund); } [TestMethod] public void GetProductPriceInfoTest() { - var result = billingClient.GetProductPriceInfo("36", "60", "131"); + var result = billingClient.GetProductPriceInfo(new[] { "36", "60", "131" }); Assert.IsNotNull(result); } } diff --git a/common/Tests/ASC.Core.Common.Tests/CachedSubscriptionServiceTest.cs b/common/Tests/ASC.Core.Common.Tests/CachedSubscriptionServiceTest.cs index ef9e7ddfb..3c1546acd 100644 --- a/common/Tests/ASC.Core.Common.Tests/CachedSubscriptionServiceTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/CachedSubscriptionServiceTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Core.Common.Tests/ClientPaymentManagerTest.cs b/common/Tests/ASC.Core.Common.Tests/ClientPaymentManagerTest.cs index 6edb0d335..bd552f899 100644 --- a/common/Tests/ASC.Core.Common.Tests/ClientPaymentManagerTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/ClientPaymentManagerTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Core.Common.Tests/CookieStorageTest.cs b/common/Tests/ASC.Core.Common.Tests/CookieStorageTest.cs index 0d4dfc7a5..eb44fa4b2 100644 --- a/common/Tests/ASC.Core.Common.Tests/CookieStorageTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/CookieStorageTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Core.Common.Tests/DbAzServiceTest.cs b/common/Tests/ASC.Core.Common.Tests/DbAzServiceTest.cs index cdb7c838d..b1ac1287a 100644 --- a/common/Tests/ASC.Core.Common.Tests/DbAzServiceTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/DbAzServiceTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Core.Common.Tests/DbBaseTest.cs b/common/Tests/ASC.Core.Common.Tests/DbBaseTest.cs index 770a722cc..8d30e4fc1 100644 --- a/common/Tests/ASC.Core.Common.Tests/DbBaseTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/DbBaseTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Core.Common.Tests/DbQuotaServiceTest.cs b/common/Tests/ASC.Core.Common.Tests/DbQuotaServiceTest.cs index 8e49912ff..2c42598ce 100644 --- a/common/Tests/ASC.Core.Common.Tests/DbQuotaServiceTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/DbQuotaServiceTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,7 +37,7 @@ public class DbQuotaServiceTest : DbBaseTest public void ClearData() { Service.RemoveTenantQuota(Tenant); - foreach (var row in Service.FindTenantQuotaRows(new TenantQuotaRowQuery(Tenant) { Path = "path" })) + foreach (var row in Service.FindTenantQuotaRows(Tenant)) { DeleteQuotaRow(row); } @@ -61,12 +61,12 @@ public void QuotaMethod() var row = new TenantQuotaRow { Tenant = this.Tenant, Path = "path", Counter = 1000, Tag = "tag" }; Service.SetTenantQuotaRow(row, false); - var rows = Service.FindTenantQuotaRows(new TenantQuotaRowQuery(Tenant).WithPath("path")).ToList(); + var rows = Service.FindTenantQuotaRows(Tenant).ToList(); CompareQuotaRows(row, rows.Find(r => r.Tenant == row.Tenant && r.Tag == row.Tag)); Service.SetTenantQuotaRow(row, true); row.Counter += 1000; - rows = Service.FindTenantQuotaRows(new TenantQuotaRowQuery(Tenant).WithPath("path")).ToList(); + rows = Service.FindTenantQuotaRows(Tenant).ToList(); CompareQuotaRows(row, rows.Find(r => r.Tenant == row.Tenant && r.Tag == row.Tag)); DeleteQuotaRow(row); @@ -81,7 +81,6 @@ public void SerializeTest() Features = "trial,year", Name = "quota1", Price = 12.5m, - Price2 = 45.23m, Visible = true, MaxFileSize = 3, MaxTotalSize = 4, @@ -106,7 +105,6 @@ private void CompareQuotas(TenantQuota q1, TenantQuota q2) Assert.AreEqual(q1.ActiveUsers, q2.ActiveUsers); Assert.AreEqual(q1.Features, q2.Features); Assert.AreEqual(q1.Price, q2.Price); - Assert.AreEqual(q1.Price2, q2.Price2); Assert.AreEqual(q1.AvangateId, q2.AvangateId); Assert.AreEqual(q1.Visible, q2.Visible); } @@ -122,7 +120,7 @@ private void CompareQuotaRows(TenantQuotaRow r1, TenantQuotaRow r2) private void DeleteQuotaRow(TenantQuotaRow row) { var d = new SqlDelete(DbQuotaService.tenants_quotarow).Where("tenant", row.Tenant).Where("path", row.Path); - new DbManager("core").ExecuteNonQuery(d); + DbManager.FromHttpContext("core").ExecuteNonQuery(d); } } } diff --git a/common/Tests/ASC.Core.Common.Tests/DbSubscriptionServiceTest.cs b/common/Tests/ASC.Core.Common.Tests/DbSubscriptionServiceTest.cs index f84324717..6a746c921 100644 --- a/common/Tests/ASC.Core.Common.Tests/DbSubscriptionServiceTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/DbSubscriptionServiceTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Core.Common.Tests/DbTenantServiceTest.cs b/common/Tests/ASC.Core.Common.Tests/DbTenantServiceTest.cs index 3ceb8eebf..cb645148a 100644 --- a/common/Tests/ASC.Core.Common.Tests/DbTenantServiceTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/DbTenantServiceTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Core.Common.Tests/DbUserServiceTest.cs b/common/Tests/ASC.Core.Common.Tests/DbUserServiceTest.cs index 411f733bf..023e694b2 100644 --- a/common/Tests/ASC.Core.Common.Tests/DbUserServiceTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/DbUserServiceTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Core.Common.Tests/EmailValidationKeyPairProvider_Test.cs b/common/Tests/ASC.Core.Common.Tests/EmailValidationKeyPairProvider_Test.cs index 4a81cd39c..40487a58d 100644 --- a/common/Tests/ASC.Core.Common.Tests/EmailValidationKeyPairProvider_Test.cs +++ b/common/Tests/ASC.Core.Common.Tests/EmailValidationKeyPairProvider_Test.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Core.Common.Tests/HostedSolutionTest.cs b/common/Tests/ASC.Core.Common.Tests/HostedSolutionTest.cs index 9d7286969..4842def7e 100644 --- a/common/Tests/ASC.Core.Common.Tests/HostedSolutionTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/HostedSolutionTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Core.Common.Tests/SignatureTest.cs b/common/Tests/ASC.Core.Common.Tests/SignatureTest.cs index 850c41a2f..dbf520e37 100644 --- a/common/Tests/ASC.Core.Common.Tests/SignatureTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/SignatureTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Core.Common.Tests/TariffServiceTest.cs b/common/Tests/ASC.Core.Common.Tests/TariffServiceTest.cs index 8df220a91..efcefd6e0 100644 --- a/common/Tests/ASC.Core.Common.Tests/TariffServiceTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/TariffServiceTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,7 +48,7 @@ public void TestShoppingUriBatch() [TestMethod] public void TestPaymentInfo() { - var payments = tariffService.GetPayments(918, DateTime.MinValue, DateTime.MaxValue); + var payments = tariffService.GetPayments(918); Assert.IsNotNull(payments); } @@ -72,12 +72,12 @@ public void TestSetTariff() [TestMethod] public void TestInvoice() { - var payments = tariffService.GetPayments(918, DateTime.MinValue, DateTime.MaxValue); - foreach (var p in payments) - { - var invoice = tariffService.GetInvoice(p.CartId); - Assert.IsNotNull(invoice); - } + //var payments = tariffService.GetPayments(918); + //foreach (var p in payments) + //{ + // var invoice = tariffService.GetInvoice(p.CartId); + // Assert.IsNotNull(invoice); + //} } } } diff --git a/common/Tests/ASC.Core.Common.Tests/TopSubscriptionProviderTest.cs b/common/Tests/ASC.Core.Common.Tests/TopSubscriptionProviderTest.cs index 209f53ae6..63206872c 100644 --- a/common/Tests/ASC.Core.Common.Tests/TopSubscriptionProviderTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/TopSubscriptionProviderTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Core.Common.Tests/UserManagerTest.cs b/common/Tests/ASC.Core.Common.Tests/UserManagerTest.cs index 6d678087b..5c25777a2 100644 --- a/common/Tests/ASC.Core.Common.Tests/UserManagerTest.cs +++ b/common/Tests/ASC.Core.Common.Tests/UserManagerTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Data.Storage.Tests/ASC.Data.Storage.Tests.csproj b/common/Tests/ASC.Data.Storage.Tests/ASC.Data.Storage.Tests.csproj index 19b883646..00eb46007 100644 --- a/common/Tests/ASC.Data.Storage.Tests/ASC.Data.Storage.Tests.csproj +++ b/common/Tests/ASC.Data.Storage.Tests/ASC.Data.Storage.Tests.csproj @@ -84,7 +84,7 @@ 2.1.1 - 8.0.19 + 8.0.32.1 diff --git a/common/Tests/ASC.Data.Storage.Tests/DataStorageTest.cs b/common/Tests/ASC.Data.Storage.Tests/DataStorageTest.cs index a03ea492c..680352e6c 100644 --- a/common/Tests/ASC.Data.Storage.Tests/DataStorageTest.cs +++ b/common/Tests/ASC.Data.Storage.Tests/DataStorageTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Data.Storage.Tests/Encryption/CommonFileInfo.cs b/common/Tests/ASC.Data.Storage.Tests/Encryption/CommonFileInfo.cs index 6fce71277..4826f20ca 100644 --- a/common/Tests/ASC.Data.Storage.Tests/Encryption/CommonFileInfo.cs +++ b/common/Tests/ASC.Data.Storage.Tests/Encryption/CommonFileInfo.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.IO; namespace ASC.Data.Storage.Tests.Encryption diff --git a/common/Tests/ASC.Data.Storage.Tests/Encryption/CommonMethods.cs b/common/Tests/ASC.Data.Storage.Tests/Encryption/CommonMethods.cs index c7de33839..f2fbe7f68 100644 --- a/common/Tests/ASC.Data.Storage.Tests/Encryption/CommonMethods.cs +++ b/common/Tests/ASC.Data.Storage.Tests/Encryption/CommonMethods.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.IO; using System.Linq; diff --git a/common/Tests/ASC.Data.Storage.Tests/Encryption/CryptTest.cs b/common/Tests/ASC.Data.Storage.Tests/Encryption/CryptTest.cs index 2988d78e8..a4d6a9b78 100644 --- a/common/Tests/ASC.Data.Storage.Tests/Encryption/CryptTest.cs +++ b/common/Tests/ASC.Data.Storage.Tests/Encryption/CryptTest.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using Microsoft.VisualStudio.TestTools.UnitTesting; using System.IO; using ASC.Core.Encryption; diff --git a/common/Tests/ASC.Data.Storage.Tests/Encryption/SpeedTest.cs b/common/Tests/ASC.Data.Storage.Tests/Encryption/SpeedTest.cs index 887ec42b6..c3be44d95 100644 --- a/common/Tests/ASC.Data.Storage.Tests/Encryption/SpeedTest.cs +++ b/common/Tests/ASC.Data.Storage.Tests/Encryption/SpeedTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/common/Tests/ASC.Notify.Textile.Test/ASC.Notify.Textile.Test.csproj b/common/Tests/ASC.Notify.Textile.Test/ASC.Notify.Textile.Test.csproj index 3674f4a86..aa253db37 100644 --- a/common/Tests/ASC.Notify.Textile.Test/ASC.Notify.Textile.Test.csproj +++ b/common/Tests/ASC.Notify.Textile.Test/ASC.Notify.Textile.Test.csproj @@ -71,7 +71,7 @@ 2.1.1 - 8.0.19 + 8.0.32.1 diff --git a/common/Tests/ASC.Notify.Textile.Test/StylerTests.cs b/common/Tests/ASC.Notify.Textile.Test/StylerTests.cs index 3f78ba5bc..c07fce055 100644 --- a/common/Tests/ASC.Notify.Textile.Test/StylerTests.cs +++ b/common/Tests/ASC.Notify.Textile.Test/StylerTests.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.Notify.Messages; using Microsoft.VisualStudio.TestTools.UnitTesting; diff --git a/licenses/3rd-Party.license b/licenses/3rd-Party.license index a599e205f..da2e22d3b 100644 --- a/licenses/3rd-Party.license +++ b/licenses/3rd-Party.license @@ -8,6 +8,10 @@ AjaxPro.2 - .NET Library that provides AJAX related methods to simplify the comm License: MIT License License File: AjaxPro.2.license +Amazon.Extensions.S3.Encryption - The Amazon S3 Encryption Client for .NET simplifies encrypting and decrypting objects to S3 using KMS or custom keys. (https://github.com/aws/amazon-s3-encryption-client-dotnet/blob/main/LICENSE) +License: Apache License 2.0 +License File: Amazon.Extensions.S3.Encryption.license + AntiXSS - AntiXSS is an encoding library which uses a safe list approach to encoding. It provides Html, XML, Url, Form, LDAP, CSS, JScript and VBScript encoding methods to allow you to avoid Cross Site Scripting attacks. This library is part of the Microsoft SDL tools. (http://wpl.codeplex.com/license) License: MS-PL License License File: AntiXSS.license @@ -76,7 +80,7 @@ CommandLineParser - The Command Line Parser Library offers to CLR applications a License: MIT License License File: CommandLineParser.license -CsvHelper - A library for reading and writing CSV files. Extremely fast, flexible, and easy to use. Supports reading and writing of custom class objects. (https://licenses.nuget.org/MS-PL, или https://licenses.nuget.org/Apache-2.0) +CsvHelper - A library for reading and writing CSV files. Extremely fast, flexible, and easy to use. Supports reading and writing of custom class objects. (https://licenses.nuget.org/MS-PL, or https://licenses.nuget.org/Apache-2.0) License: MS-PL or Apache License 2.0 License File: CsvHelper.license @@ -448,6 +452,10 @@ Pipelines.Sockets.Unofficial - Package Description (https://raw.githubuserconten License: MIT License License File: Pipelines.Sockets.Unofficial.license +Polly - Polly is a library that allows developers to express resilience and transient fault handling policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner. (https://github.com/App-vNext/Polly/blob/main/LICENSE.txt) +License: BSD-3-Clause "New" License +License File: Polly.license + Portable.BouncyCastle - BouncyCastle portable version with support for .NET 4, .NET Standard 2.0 (https://www.bouncycastle.org/csharp/licence.html) License: MIT X11 License  License File: Portable.BouncyCastle.license diff --git a/licenses/nuget packages/Amazon.Extensions.S3.Encryption.license b/licenses/nuget packages/Amazon.Extensions.S3.Encryption.license new file mode 100644 index 000000000..f49a4e16e --- /dev/null +++ b/licenses/nuget packages/Amazon.Extensions.S3.Encryption.license @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/licenses/nuget packages/Polly.license b/licenses/nuget packages/Polly.license new file mode 100644 index 000000000..7d1eb3058 --- /dev/null +++ b/licenses/nuget packages/Polly.license @@ -0,0 +1,26 @@ +New BSD License += +Copyright (c) 2015-2020, App vNext +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of App vNext nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.Cases.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.Cases.cs index 35c3160d4..6c6473d16 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.Cases.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.Cases.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,6 +34,7 @@ namespace ASC.Api.CRM { + ///crm public partial class CRMApi { /// @@ -41,12 +42,14 @@ public partial class CRMApi /// /// Close a case /// Cases - /// Case ID + /// Case ID /// /// - /// + /// /// Case /// + /// api/2.0/crm/case/{caseid}/close + /// PUT [Update(@"case/{caseid:[0-9]+}/close")] public CasesWrapper CloseCases(int caseid) { @@ -61,16 +64,18 @@ public CasesWrapper CloseCases(int caseid) } /// - /// Resumes a case with the ID specified in the request. + /// Reopens a case with the ID specified in the request. /// - /// Resume a case + /// Reopen a case /// Cases - /// Case ID + /// Case ID /// /// - /// + /// /// Case /// + /// api/2.0/crm/case/{caseid}/reopen + /// PUT [Update(@"case/{caseid:[0-9]+}/reopen")] public CasesWrapper ReOpenCases(int caseid) { @@ -88,13 +93,13 @@ public CasesWrapper ReOpenCases(int caseid) /// Creates a case with the parameters specified in the request. /// /// Create a case - /// Case title - /// Case participants - /// List of case custom fields - /// Case privacy: private or not - /// List of users with access to the case - /// Notifies users from the access list about the case - /// Case + /// Case title + /// List of contact IDs of the case participants + /// List of case custom fields + /// Case privacy: private or not + /// List of users with access to the case + /// Notifies users from the access list about the case + /// Case /// Cases /// /// @@ -110,6 +115,8 @@ public CasesWrapper ReOpenCases(int caseid) /// /// ]]> /// + /// api/2.0/crm/case + /// POST [Create(@"case")] public CasesWrapper CreateCases( string title, @@ -158,15 +165,15 @@ public CasesWrapper CreateCases( /// Updates the selected case with the parameters specified in the request. /// /// Update a case - /// Case ID - /// New case title - /// New case participants - /// New list of case custom fields - /// Case privacy: private or not - /// New list of users with access to the case - /// Notifies users from the access list about the case + /// Case ID + /// New case title + /// List of contact IDs of the case participants + /// New list of case custom fields + /// Case privacy: private or not + /// New list of users with access to the case + /// Notifies users from the access list about the case /// Cases - /// Case + /// Case /// /// /// @@ -183,6 +190,8 @@ public CasesWrapper CreateCases( /// /// ]]> /// + /// api/2.0/crm/case/{caseid} + /// PUT [Update(@"case/{caseid:[0-9]+}")] public CasesWrapper UpdateCases( int caseid, @@ -231,16 +240,18 @@ public CasesWrapper UpdateCases( /// /// Sets access rights to the selected case with the parameters specified in the request. /// - /// Case ID - /// Case privacy: private or not - /// List of users with access to the case + /// Case ID + /// Case privacy: private or not + /// List of users with access to the case /// Set access rights to the case /// Cases /// /// - /// + /// /// Case /// + /// api/2.0/crm/case/{caseid}/access + /// PUT [Update(@"case/{caseid:[0-9]+}/access")] public CasesWrapper SetAccessToCases(int caseid, bool isPrivate, IEnumerable accessList) { @@ -292,16 +303,19 @@ private CasesWrapper SetAccessToCases(Cases cases, bool isPrivate, IEnumerable /// Sets access rights to the list of cases with the IDs specified in the request. /// - /// List of case IDs - /// Case privacy: private or not - /// List of users with access + /// List of case IDs + /// Case privacy: private or not + /// List of users with access /// Set access rights to the cases by IDs /// Cases /// /// - /// + /// /// List of cases /// + /// api/2.0/crm/case/access + /// PUT + /// list [Update(@"case/access")] public IEnumerable SetAccessToBatchCases(IEnumerable casesid, bool isPrivate, IEnumerable accessList) { @@ -327,18 +341,21 @@ public IEnumerable SetAccessToBatchCases(IEnumerable casesid, /// /// Sets access rights to the list of all the cases matching the parameters specified in the request. /// - /// Contact ID - /// Case status - /// Case tags - /// Case privacy: private or not - /// List of users with access + /// Contact ID + /// Case status: closed or not + /// Case tags + /// Case privacy: private or not + /// List of users with access /// Set access rights to the cases by parameters /// Cases /// /// - /// + /// /// List of cases /// + /// api/2.0/crm/case/filter/access + /// PUT + ///list [Update(@"case/filter/access")] public IEnumerable SetAccessToBatchCases( int contactid, @@ -372,10 +389,12 @@ IEnumerable accessList /// /// Get a case by ID /// Cases - /// Case ID - /// Case + /// Case ID /// /// + ///api/2.0/crm/case/{caseid} + ///GET + /// Case [Read(@"case/{caseid:[0-9]+}")] public CasesWrapper GetCaseByID(int caseid) { @@ -391,13 +410,16 @@ public CasesWrapper GetCaseByID(int caseid) /// Returns a list of all the cases matching the parameters specified in the request. /// /// Get cases - /// Contact ID - /// Case status - /// Case tags + /// Contact ID + /// Case status: closed or not + /// Case tags /// Cases - /// + /// /// List of cases /// + /// api/2.0/crm/case/filter + /// GET + /// list [Read(@"case/filter")] public IEnumerable GetCases(int contactid, bool? isClosed, IEnumerable tags) { @@ -473,13 +495,15 @@ public IEnumerable GetCases(int contactid, bool? isClosed, IEnumer /// Deletes a case with the ID specified in the request. /// /// Delete a case - /// Case ID + /// Case ID /// Cases /// /// - /// + /// /// Case /// + /// api/2.0/crm/case/{caseid} + /// DELETE [Delete(@"case/{caseid:[0-9]+}")] public CasesWrapper DeleteCase(int caseid) { @@ -498,14 +522,17 @@ public CasesWrapper DeleteCase(int caseid) /// /// Deletes a group of cases with the IDs specified in the request. /// - /// List of case IDs + /// List of case IDs /// /// /// Delete cases by IDs /// Cases - /// + /// /// List of cases /// + /// api/2.0/crm/case + /// PUT + /// list [Update(@"case")] public IEnumerable DeleteBatchCases(IEnumerable casesids) { @@ -524,16 +551,19 @@ public IEnumerable DeleteBatchCases(IEnumerable casesids) /// /// Deletes a list of all the cases matching the parameters specified in the request. /// - /// Contact ID - /// Case status - /// Case tags + /// Contact ID + /// Case status: closed or not + /// Case tags /// /// /// Delete cases by parameters /// Cases - /// + /// /// List of cases /// + /// api/2.0/crm/case/filter + /// DELETE + /// list [Delete(@"case/filter")] public IEnumerable DeleteBatchCases(int contactid, bool? isClosed, IEnumerable tags) { @@ -551,10 +581,13 @@ public IEnumerable DeleteBatchCases(int contactid, bool? isClosed, /// Returns a list of all the contacts related to the case with the ID specified in the request. /// /// Get case contacts - /// Case ID + /// Case ID /// Cases - /// List of contacts + /// List of contacts /// + ///api/2.0/crm/case/{caseid}/contact + ///GET + /// list [Read(@"case/{caseid:[0-9]+}/contact")] public IEnumerable GetCasesMembers(int caseid) { @@ -569,13 +602,15 @@ public IEnumerable GetCasesMembers(int caseid) /// /// Add a case contact /// Cases - /// Case ID - /// Contact ID + /// Case ID + /// Contact ID /// /// - /// + /// /// Contact /// + /// api/2.0/crm/case/{caseid}/contact + /// POST [Create(@"case/{caseid:[0-9]+}/contact")] public ContactWrapper AddMemberToCases(int caseid, int contactid) { @@ -600,13 +635,15 @@ public ContactWrapper AddMemberToCases(int caseid, int contactid) /// /// Delete a case contact /// Cases - /// Case ID - /// Contact ID + /// Case ID + /// Contact ID /// /// - /// + /// /// Contact /// + /// api/2.0/crm/case/{caseid}/contact/{contactid} + /// DELETE [Delete(@"case/{caseid:[0-9]+}/contact/{contactid:[0-9]+}")] public ContactWrapper DeleteMemberFromCases(int caseid, int contactid) { @@ -631,12 +668,15 @@ public ContactWrapper DeleteMemberFromCases(int caseid, int contactid) /// /// Returns a list of 30 cases from the CRM module with a prefix specified in the request. /// - /// Case prefix - /// Contact ID + /// Case prefix + /// Contact ID /// Cases /// /// List of cases /// + /// api/2.0/crm/case/byprefix + /// GET + /// list /// false [Read(@"case/byprefix")] public IEnumerable GetCasesByPrefix(string prefix, int contactID) diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.ContactInfo.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.ContactInfo.cs index 1a9efcefd..d7427ccc0 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.ContactInfo.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.ContactInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,17 +35,21 @@ namespace ASC.Api.CRM { + ///crm public partial class CRMApi { /// /// Returns a list of all the available contact categories of the specified information type. /// - /// Contact information type + /// Contact information type /// Get contact categories by information type /// Contacts /// /// List of contact categories /// + /// api/2.0/crm/contact/data/{infoType}/category + /// GET + /// list [Read(@"contact/data/{infoType}/category")] public IEnumerable GetContactInfoCategory(ContactInfoType infoType) { @@ -58,6 +62,9 @@ public IEnumerable GetContactInfoCategory(ContactInfoType infoType) /// Get contact information types /// Contacts /// List of all the contact information types + /// list + /// api/2.0/crm/contact/data/infoType + /// GET [Read(@"contact/data/infoType")] public IEnumerable GetContactInfoType() { @@ -67,12 +74,15 @@ public IEnumerable GetContactInfoType() /// /// Returns the detailed information on the contact with the ID specified in the request. /// - /// Contact ID + /// Contact ID /// Get contact information /// Contacts - /// + /// /// Contact information /// + /// api/2.0/crm/contact/{contactid}/data + /// GET + /// list [Read(@"contact/{contactid:[0-9]+}/data")] public IEnumerable GetContactInfo(int contactid) { @@ -90,12 +100,14 @@ public IEnumerable GetContactInfo(int contactid) /// /// Returns the detailed contact information with the ID specified in the request. /// - /// Contact ID - /// Contact information ID + /// Contact ID + /// Contact information ID /// Get contact information by ID /// Contacts - /// Contact information + /// Contact information /// + ///api/2.0/crm/contact/{contactid}/data/{id} + ///GET [Read(@"contact/{contactid:[0-9]+}/data/{id:[0-9]+}")] public ContactInfoWrapper GetContactInfoByID(int contactid, int id) { @@ -114,19 +126,21 @@ public ContactInfoWrapper GetContactInfoByID(int contactid, int id) /// /// Adds the information with the parameters specified in the request to the contact with the selected ID. /// - ///Contact ID - ///Contact information type - ///New data - ///Contact information importance: primary or not - ///Contact information category + ///Contact ID + ///Contact information type + ///New data + ///Contact information importance: primary or not + ///Contact information category ///Add contact information ///Contacts /// /// - /// + /// /// Contact information /// /// + ///api/2.0/crm/contact/{contactid}/data + ///POST [Create(@"contact/{contactid:[0-9]+}/data")] public ContactInfoWrapper CreateContactInfo(int contactid, ContactInfoType infoType, string data, bool isPrimary, string category) { @@ -176,17 +190,19 @@ public ContactInfoWrapper CreateContactInfo(int contactid, ContactInfoType infoT /// /// Adds the address information to the contact with the ID specified in the request. /// - /// Contact ID - /// Address data + /// Contact ID + /// Address data /// Add contact address information /// Contacts /// /// - /// + /// /// Contact information /// /// /// + /// api/2.0/crm/contact/{contactid}/addressdata + /// POST [Create(@"contact/{contactid:[0-9]+}/addressdata")] public ContactInfoWrapper CreateContactInfoAddress(int contactid, Address address) { @@ -234,11 +250,11 @@ public ContactInfoWrapper CreateContactInfoAddress(int contactid, Address addres } /// - /// Creates contact information (add new information to the existing list) with the parameters specified in the request for the contact with the selected ID. + /// Adds a list of contact information items with the parameters specified in the request for the contact with the selected ID. /// - ///Add new contact information - /// Contact ID - /// Contact information + ///Add contact information items + /// Contact ID + /// Contact information /// /// /// Contact information /// + /// api/2.0/crm/contact/{contactid}/batch + /// POST + /// list /// false [Create(@"contact/{contactid:[0-9]+}/batch")] public IEnumerable CreateBatchContactInfo(int contactid, IEnumerable items) @@ -286,18 +305,20 @@ public IEnumerable CreateBatchContactInfo(int contactid, IEn /// /// Updates the contact information with the parameters specified in the request. /// - ///Contact information record ID - ///Contact ID - ///New contact information type - ///New data - ///New contact information importance: primary or not - ///New contact information category + ///Contact information record ID + ///Contact ID + ///New contact information type + ///New data + ///New contact information importance: primary or not + ///New contact information category ///Update contact information ///Contacts /// - /// + /// /// Updated contact information /// + /// api/2.0/crm/contact/{contactid}/data/{id} + /// PUT [Update(@"contact/{contactid:[0-9]+}/data/{id:[0-9]+}")] public ContactInfoWrapper UpdateContactInfo(int id, int contactid, ContactInfoType? infoType, string data, bool? isPrimary, string category) { @@ -348,16 +369,18 @@ public ContactInfoWrapper UpdateContactInfo(int id, int contactid, ContactInfoTy /// /// Updates the contact address information with the parameter specified in the request. /// - /// Contact information record ID - /// Contact ID - /// New address data + /// Contact information record ID + /// Contact ID + /// New address data /// Update contact address information /// Contacts /// /// - /// + /// /// Contact information with the updated address /// + /// api/2.0/crm/contact/{contactid}/addressdata/{id} + /// PUT [Update(@"contact/{contactid:[0-9]+}/addressdata/{id:[0-9]+}")] public ContactInfoWrapper UpdateContactInfoAddress(int id, int contactid, Address address) { @@ -401,11 +424,11 @@ public ContactInfoWrapper UpdateContactInfoAddress(int id, int contactid, Addres } /// - /// Updates contact information (delete the existing information and add a new list) with the parameters specified in the request for the contact with the selected ID. + /// Updates the contact information items with the parameters specified in the request for the contact with the selected ID. /// - ///Update contact information - ///Contact ID - ///New contact information + ///Update contact information items + ///Contact ID + ///New contact information /// /// Updated contact information /// + /// api/2.0/crm/contact/{contactid}/batch + /// PUT + /// list /// false [Update(@"contact/{contactid:[0-9]+}/batch")] public IEnumerable UpdateBatchContactInfo(int contactid, IEnumerable items) @@ -452,13 +478,16 @@ public IEnumerable UpdateBatchContactInfo(int contactid, IEn /// /// Returns the detailed contact information by the information type specified in the request. /// - /// Contact ID - /// Contact information type - /// Get contact information by type + /// Contact ID + /// Contact information type + /// Get contact information by its type /// Contacts /// /// Contact information /// + /// api/2.0/crm/contact/{contactid}/data/{infoType} + /// GET + /// list [Read(@"contact/{contactid:[0-9]+}/data/{infoType}")] public IEnumerable GetContactInfo(int contactid, ContactInfoType infoType) { @@ -472,17 +501,19 @@ public IEnumerable GetContactInfo(int contactid, ContactInfoType infoTyp /// - /// Deletes the selected information for the contact with the ID specified in the request. + /// Deletes the selected information from the contact with the ID specified in the request. /// - /// Contact ID - /// Contact information record ID + /// Contact ID + /// Contact information record ID /// Delete contact information /// Contacts /// /// - /// + /// /// Contact information /// + /// api/2.0/crm/contact/{contactid}/data/{id} + /// DELETE [Delete(@"contact/{contactid:[0-9]+}/data/{id:[0-9]+}")] public ContactInfoWrapper DeleteContactInfo(int contactid, int id) { diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.Contacts.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.Contacts.cs index 02e91193e..11a2cd22b 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.Contacts.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.Contacts.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,12 +53,14 @@ public partial class CRMApi /// /// Returns the detailed information about a contact with the ID specified in the request. /// - /// Contact ID - /// Contact + /// Contact ID + /// Contact /// Get a contact by ID /// Contacts /// /// + /// api/2.0/crm/contact/{contactid} + /// GET [Read(@"contact/{contactid:[0-9]+}")] public ContactWrapper GetContactByID(int contactid) { @@ -82,12 +84,15 @@ public IEnumerable GetContactsByID(IEnumerable contactid) /// /// Get contacts by project ID /// - /// Project ID + /// Project ID /// Contacts - /// + /// /// List of contacts /// /// + ///api/2.0/crm/contact/project/{projectid} + ///GET + /// list [Read(@"contact/project/{projectid:[0-9]+}")] public IEnumerable GetContactsByProjectID(int projectid) { @@ -100,13 +105,15 @@ public IEnumerable GetContactsByProjectID(int projectid) /// /// Links the selected contact to the project with the ID specified in the request. /// - /// Contact ID - /// Project ID + /// Contact ID + /// Project ID /// Contacts /// Link a contact to the project /// /// - /// Contact information + /// Contact information + /// api/2.0/crm/contact/{contactid}/project/{projectid} + /// POST [Create(@"contact/{contactid:[0-9]+}/project/{projectid:[0-9]+}")] public ContactWrapper SetRelativeContactToProject(int contactid, int projectid) { @@ -134,15 +141,18 @@ public ContactWrapper SetRelativeContactToProject(int contactid, int projectid) /// /// Links the selected contacts to the project with the ID specified in the request. /// - /// Array of contact IDs - /// Project ID + /// Array of contact IDs + /// Project ID /// Contacts /// Link contacts to the project /// /// - /// + /// /// List of contacts /// + /// api/2.0/crm/contact/project/{projectid} + /// POST + /// list [Create(@"contact/project/{projectid:[0-9]+}")] public IEnumerable SetRelativeContactListToProject(IEnumerable contactid, int projectid) { @@ -175,13 +185,15 @@ public IEnumerable SetRelativeContactListToProject(IEnumerable /// Removes a link to the selected project from the contact with the ID specified in the request. /// - /// Contact ID - /// Project ID + /// Contact ID + /// Project ID /// Contacts /// Remove a contact from the project - /// + /// /// Contact information /// + /// api/2.0/crm/contact/{contactid}/project/{projectid} + /// DELETE [Delete(@"contact/{contactid:[0-9]+}/project/{projectid:[0-9]+}")] public ContactBaseWrapper RemoveRelativeContactToProject(int contactid, int projectid) { @@ -208,14 +220,16 @@ public ContactBaseWrapper RemoveRelativeContactToProject(int contactid, int proj /// /// Adds the selected opportunity to the contact with the ID specified in the request. /// - /// Opportunity ID - /// Contact ID + /// Opportunity ID + /// Contact ID /// Add a contact opportunity /// Contacts /// - /// + /// /// Opportunity /// + /// api/2.0/crm/contact/{contactid}/opportunity/{opportunityid} + /// POST [Create(@"contact/{contactid:[0-9]+}/opportunity/{opportunityid:[0-9]+}")] public OpportunityWrapper AddDealToContact(int contactid, int opportunityid) { @@ -238,14 +252,16 @@ public OpportunityWrapper AddDealToContact(int contactid, int opportunityid) /// /// Deletes the selected opportunity from the contact with the ID specified in the request. /// - /// Opportunity ID - /// Contact ID + /// Opportunity ID + /// Contact ID /// Delete a contact opportunity /// Contacts /// - /// + /// /// Opportunity /// + /// api/2.0/crm/contact/{contactid}/opportunity/{opportunityid} + /// DELETE [Delete(@"contact/{contactid:[0-9]+}/opportunity/{opportunityid:[0-9]+}")] public OpportunityWrapper DeleteDealFromContact(int contactid, int opportunityid) { @@ -265,19 +281,22 @@ public OpportunityWrapper DeleteDealFromContact(int contactid, int opportunityid /// /// Returns a list of all the contacts in the CRM module matching the parameters specified in the request. /// - /// Contact tag - /// Contact stage ID (warmth) - /// Contact type ID - /// Contact list view - /// Start date - /// End date - /// Responsible ID - /// Contact privacy: private or not + /// Contact tag + /// Contact stage ID (warmth) + /// Contact type ID + /// Contact list view + /// Responsible ID + /// Contact privacy: private or not + /// Start date + /// End date /// Get filtered contacts /// Contacts - /// + /// /// List of contacts /// + /// api/2.0/crm/contact/filter + /// GET + /// list [Read(@"contact/filter")] public IEnumerable GetContacts( IEnumerable tags, @@ -380,13 +399,16 @@ public IEnumerable GetContacts( /// /// Searches for contacts by their emails. /// - /// String part of contact name, lastname or email - /// Maximum result count + /// String part of contact name, lastname or email + /// Maximum result count /// Search contacts by email /// Contacts /// /// List of contacts /// + /// api/2.0/crm/contact/simple/byEmail + /// GET + /// list /// false [Read(@"contact/simple/byEmail")] public IEnumerable SearchContactsByEmail(string term, int maxCount) @@ -401,19 +423,22 @@ public IEnumerable SearchContactsByEmail(string term, in /// /// Returns a list of all the contacts with their tasks in the CRM module matching the parameters specified in the request. /// - /// Contact tag - /// Contact stage ID (warmth) - /// Contact type ID - /// Contact list view - /// Responsible ID - /// Contact privacy: private or not - /// Start date - /// End date + /// Contact tags + /// Contact stage ID (warmth) + /// Contact type ID + /// Contact list view + /// Responsible ID + /// Contact privacy: private or not + /// Start date + /// End date /// Get filtered contacts with tasks /// Contacts /// - /// List of contacts + /// List of contacts with tasks /// + /// api/2.0/crm/contact/simple/filter + /// GET + /// list /// false [Read(@"contact/simple/filter")] public IEnumerable GetSimpleContacts( @@ -515,14 +540,17 @@ public IEnumerable GetSimpleContacts( /// /// Returns a group of contacts with the IDs specified in the request and their emails. /// - /// List of contact IDs + /// List of contact IDs /// /// /// Get contacts with emails /// Contacts /// - /// List of contacts + /// List of contacts with their emails /// + /// api/2.0/crm/contact/mail + /// GET + /// list /// false [Read(@"contact/mail")] public IEnumerable GetContactsForMail(IEnumerable contactids) @@ -538,19 +566,22 @@ public IEnumerable GetContactsForMail(IEnumerable /// Deletes a list of all the contacts in the CRM module matching the parameters specified in the request. /// - /// Contact tags - /// Contact stage ID (warmth) - /// Contact type ID - /// Contact list view - /// Start date - /// End date + /// Contact tags + /// Contact stage ID (warmth) + /// Contact type ID + /// Contact list view + /// Start date + /// End date /// /// /// Delete contacts by parameters /// Contacts - /// + /// /// List of contacts /// + /// api/2.0/crm/contact/filter + /// DELETE + /// list [Delete(@"contact/filter")] public IEnumerable DeleteBatchContacts( IEnumerable tags, @@ -587,13 +618,16 @@ public IEnumerable DeleteBatchContacts( /// /// Returns a list of all the persons linked to the company with the ID specified in the request. /// - /// Company ID + /// Company ID /// - /// Get persons linked to the company + /// Get company persons /// Contacts - /// - /// Company linked persons + /// + /// Company persons /// + /// api/2.0/crm/contact/company/{companyid}/person + /// GET + /// list [Read(@"contact/company/{companyid:[0-9]+}/person")] public IEnumerable GetPeopleFromCompany(int companyid) { @@ -608,22 +642,24 @@ public IEnumerable GetPeopleFromCompany(int companyid) /// /// Adds the selected person to the company with the ID specified in the request. /// - /// Company ID - /// Person ID + /// Company ID + /// Person ID /// Add a person to the company /// Contacts /// /// - /// + /// /// Person /// + /// api/2.0/crm/contact/company/{companyid}/person + /// POST [Create(@"contact/company/{companyid:[0-9]+}/person")] public PersonWrapper AddPeopleToCompany(int companyid, int personid) { if ((companyid <= 0) || (personid <= 0)) throw new ArgumentException(); var company = DaoFactory.ContactDao.GetByID(companyid); - var person = DaoFactory.ContactDao.GetByID(personid); + var person = DaoFactory.ContactDao.GetByID(personid) as Person; if (person == null || company == null || !CRMSecurity.CanAccessTo(person) || !CRMSecurity.CanAccessTo(company)) throw new ItemNotFoundException(); @@ -636,15 +672,17 @@ public PersonWrapper AddPeopleToCompany(int companyid, int personid) /// /// Deletes the selected person from the company with the ID specified in the request. /// - /// Company ID - /// Person ID + /// Company ID + /// Person ID /// Delete a person from the company /// Contacts /// /// - /// + /// /// Person /// + /// api/2.0/crm/contact/company/{companyid}/person + /// DELETE [Delete(@"contact/company/{companyid:[0-9]+}/person")] public PersonWrapper DeletePeopleFromCompany(int companyid, int personid) { @@ -664,18 +702,20 @@ public PersonWrapper DeletePeopleFromCompany(int companyid, int personid) /// /// Creates a person with the parameters (first name, last name, description, etc.) specified in the request. /// - /// First name - /// Last name - /// Job title - /// Company ID - /// Person description text - /// Person privacy: 0 - not shared, 1 - shared for reading/writing, 2 - shared for reading only - /// List of person managers - /// Custom field list - /// Contact photo (upload using multipart/form-data) + /// First name + /// Last name + /// Job title + /// Company ID + /// Person description text + /// Person privacy: 0 - not shared, 1 - shared for reading/writing, 2 - shared for reading only + /// List of person managers + /// Custom field list + /// Contact photo (upload using multipart/form-data) /// Create a person /// Contacts - /// Person + /// Person + /// POST + /// api/2.0/crm/contact/person /// [Create(@"contact/person")] public PersonWrapper CreatePerson( @@ -740,14 +780,16 @@ public PersonWrapper CreatePerson( /// /// Changes a photo for the contact with the ID specified in the request. /// - /// Contact ID - /// Contact photo (upload using multipart/form-data) + /// Contact ID + /// Contact photo (upload using multipart/form-data) /// Change a contact photo /// Contacts /// /// /// Path to the contact photo /// + /// api/2.0/crm/contact/{contactid}/changephoto + /// PUT [Update(@"contact/{contactid:[0-9]+}/changephoto")] public string ChangeContactPhoto(int contactid, IEnumerable photo) { @@ -775,16 +817,18 @@ public string ChangeContactPhoto(int contactid, IEnumerable } /// - /// Changes a photo for the contact with the ID specified in the request by URL. + /// Changes a photo using its URL for the contact with the ID specified in the request. /// - /// Contact ID - /// Contact photo URL + /// Contact ID + /// Contact photo URL /// Change a contact photo by URL /// Contacts /// /// /// Path to the contact photo /// + /// api/2.0/crm/contact/{contactid}/changephotobyurl + /// PUT [Update(@"contact/{contactid:[0-9]+}/changephotobyurl")] public string ChangeContactPhoto(int contactid, string photourl) { @@ -799,16 +843,18 @@ public string ChangeContactPhoto(int contactid, string photourl) /// /// Merges two contacts specified in the request. /// - /// The first contact ID to merge - /// The second contact ID to merge + /// The first contact ID to merge + /// The second contact ID to merge /// Merge contacts /// Contacts /// /// /// - /// + /// /// Contact /// + /// api/2.0/crm/contact/merge + /// PUT [Update(@"contact/merge")] public ContactWrapper MergeContacts(int fromcontactid, int tocontactid) { @@ -833,21 +879,23 @@ public ContactWrapper MergeContacts(int fromcontactid, int tocontactid) /// /// Updates the selected person with the parameters (first name, last name, description, etc.) specified in the request. /// - /// Person ID - /// New first name - /// New last name - /// New job title - /// New company ID - /// New person description text - /// New person privacy: 0 - not shared, 1 - shared for reading/writing, 2 - shared for reading only - /// New list of person managers - /// New custom field list - /// New contact photo (upload using multipart/form-data) + /// Person ID + /// New first name + /// New last name + /// New job title + /// New company ID + /// New person description text + /// New person privacy: 0 - not shared, 1 - shared for reading/writing, 2 - shared for reading only + /// New list of person managers + /// New custom field list + /// New contact photo (upload using multipart/form-data) /// Update a person /// Contacts - /// Person + /// Person /// /// + /// api/2.0/crm/contact/person/{personid} + /// PUT [Update(@"contact/person/{personid:[0-9]+}")] public PersonWrapper UpdatePerson( int personid, @@ -910,16 +958,18 @@ public PersonWrapper UpdatePerson( /// /// Creates a company with the parameters specified in the request. /// - /// Company name - /// Company description text - /// List of persons linked to the company - /// Company privacy: 0 - not shared, 1 - shared for reading/writing, 2 - shared for reading only - /// List of company managers - /// Custom field list - /// Contact photo (upload using multipart/form-data) + /// Company name + /// Company description text + /// List of persons linked to the company + /// Company privacy: 0 - not shared, 1 - shared for reading/writing, 2 - shared for reading only + /// List of company managers + /// Custom field list + /// Contact photo (upload using multipart/form-data) /// Create a company /// Contacts - /// Company + /// Company + /// api/2.0/crm/contact/company + /// POST /// [Create(@"contact/company")] public CompanyWrapper CreateCompany( @@ -946,7 +996,7 @@ public CompanyWrapper CreateCompany( { foreach (var personID in personList) { - var person = DaoFactory.ContactDao.GetByID(personID); + var person = DaoFactory.ContactDao.GetByID(personID) as Person; ; if (person == null || !CRMSecurity.CanAccessTo(person)) continue; AddPeopleToCompany(companyInst.ID, personID); @@ -988,10 +1038,13 @@ public CompanyWrapper CreateCompany( /// /// Create companies /// - /// Company name + /// Company names /// Contacts - /// List of contacts + /// List of contacts + /// api/2.0/crm/contact/company/quick + /// POST /// + /// list [Create(@"contact/company/quick")] public IEnumerable CreateCompany(IEnumerable companyName) { @@ -1032,7 +1085,7 @@ public IEnumerable CreateCompany(IEnumerable company /// /// Create persons /// - /// Pairs: user first name, user last name + /// Pairs: user first name, user last name /// /// CreateCompany(IEnumerable company /// ]]> /// /// Contacts - /// List of contacts + /// List of contacts /// + /// api/2.0/crm/contact/person/quick + /// POST + /// list [Create(@"contact/person/quick")] public IEnumerable CreatePerson(IEnumerable> data) { @@ -1082,18 +1138,20 @@ public IEnumerable CreatePerson(IEnumerable /// Updates the selected company with the parameters specified in the request. /// - /// Company ID - /// New company name - /// New company description text - /// New company privacy: 0 - not shared, 1 - shared for reading/writnig, 2 - shared for reading only - /// New list of company managers - /// New custom field list + /// Company ID + /// New company name + /// New company description text + /// New company privacy: 0 - not shared, 1 - shared for reading/writnig, 2 - shared for reading only + /// New list of company managers + /// New custom field list /// Update a company /// Contacts /// - /// + /// /// Company /// + /// api/2.0/crm/contact/company/{companyid} + /// PUT [Update(@"contact/company/{companyid:[0-9]+}")] public CompanyWrapper UpdateCompany( int companyid, @@ -1139,15 +1197,17 @@ public CompanyWrapper UpdateCompany( /// /// Updates a status of the contact with the ID specified in the request. /// - /// Contact ID - /// New contact status ID + /// Contact ID + /// New contact status ID /// Update a contact status by ID /// Contacts /// /// - /// - /// Company + /// + /// Contact /// + /// api/2.0/crm/contact/{contactid}/status + /// PUT [Update(@"contact/{contactid:[0-9]+}/status")] public ContactWrapper UpdateContactStatus(int contactid, int contactStatusid) { @@ -1178,15 +1238,17 @@ public ContactWrapper UpdateContactStatus(int contactid, int contactStatusid) /// /// Updates a status of the selected company and all its participants. /// - /// Company ID - /// New contact status ID - /// Update a status of a company and its participants + /// Company ID + /// New contact status ID + /// Update a company status /// Contacts /// /// - /// + /// /// Company /// + /// api/2.0/crm/contact/company/{companyid}/status + /// PUT [Update(@"contact/company/{companyid:[0-9]+}/status")] public ContactWrapper UpdateCompanyAndParticipantsStatus(int companyid, int contactStatusid) { @@ -1228,15 +1290,17 @@ public ContactWrapper UpdateCompanyAndParticipantsStatus(int companyid, int cont /// /// Updates a status of the selected person, related company and all its participants. /// - /// Person ID - /// New contact status ID - /// Update a status of a person, related company and its participants + /// Person ID + /// New contact status ID + /// Update a person and his company status /// Contacts /// /// - /// + /// /// Person /// + /// api/2.0/crm/contact/person/{personid}/status + /// PUT [Update(@"contact/person/{personid:[0-9]+}/status")] public ContactWrapper UpdatePersonAndItsCompanyStatus(int personid, int contactStatusid) { @@ -1297,15 +1361,18 @@ public ContactWrapper UpdatePersonAndItsCompanyStatus(int personid, int contactS } /// - /// Returns access rights to the contact with the ID specified in the request. + /// Returns access rights of the contact with the ID specified in the request. /// - /// Contact ID + /// Contact ID /// Get contact access rights /// Contacts /// /// /// - /// List of contacts + /// List of contacts + /// api/2.0/crm/contact/{contactid}/access + /// GET + /// list [Read(@"contact/{contactid:[0-9]+}/access")] public IEnumerable GetContactAccessList(int contactid) { @@ -1326,17 +1393,19 @@ public IEnumerable GetContactAccessList(int contactid) /// /// Sets access rights to the contact with the ID specified in the request. /// - /// Contact ID - /// Contact privacy: private or not - /// List of managers - /// Set access rights to the contact + /// Contact ID + /// Contact privacy: private or not + /// List of managers + /// Set contact access rights /// Contacts /// /// /// - /// + /// /// Contact /// + /// api/2.0/crm/contact/{contactid}/access + /// PUT [Update(@"contact/{contactid:[0-9]+}/access")] public ContactWrapper SetAccessToContact(int contactid, bool isShared, IEnumerable managerList) { @@ -1381,16 +1450,19 @@ private void SetAccessToContact(Contact contact, bool isShared, IEnumerable /// Sets access rights to the list of contacts with the IDs specified in the request. /// - /// List of contact IDs - /// Company privacy: shared or not - /// List of managers + /// List of contact IDs + /// Company privacy: shared or not + /// List of managers /// Set access rights to the contacts by IDs /// Contacts /// /// - /// + /// /// List of contacts /// + /// api/2.0/crm/contact/access + /// PUT + /// list [Update(@"contact/access")] public IEnumerable SetAccessToBatchContact(IEnumerable contactid, bool isShared, IEnumerable managerList) { @@ -1410,21 +1482,24 @@ public IEnumerable SetAccessToBatchContact(IEnumerable cont /// /// Sets access rights to the list of contacts with the parameters specified in the request. /// - /// Contact privacy: private or not - /// List of managers - /// Contact tags - /// Contact stage ID (warmth) - /// Contact type ID - /// Contact list view - /// Start date - /// End date + /// Contact tags + /// Contact stage ID (warmth) + /// Contact type ID + /// Contact list view + /// Start date + /// End date + /// Contact privacy: private or not + /// List of managers /// Set access rights to the contacts by parameters /// Contacts /// /// - /// + /// /// List of contacts /// + /// api/2.0/crm/contact/filter/access + /// PUT + /// list [Update(@"contact/filter/access")] public IEnumerable SetAccessToBatchContact( IEnumerable tags, @@ -1473,12 +1548,14 @@ IEnumerable managerList /// /// Delete a contact /// Contacts - /// Contact ID + /// Contact ID /// /// - /// + /// /// Contact /// + /// api/2.0/crm/contact/{contactid} + /// DELETE [Delete(@"contact/{contactid:[0-9]+}")] public ContactWrapper DeleteContact(int contactid) { @@ -1496,14 +1573,17 @@ public ContactWrapper DeleteContact(int contactid) /// /// Deletes a group of contacts with the IDs specified in the request. /// - /// List of contact IDs + /// List of contact IDs /// /// /// Delete contacts by IDs /// Contacts - /// + /// /// List of contacts /// + /// api/2.0/crm/contact + /// PUT + /// list [Update(@"contact")] public IEnumerable DeleteBatchContacts(IEnumerable contactids) { @@ -1519,14 +1599,17 @@ public IEnumerable DeleteBatchContacts(IEnumerable cont /// Returns a list of 30 contacts from the CRM module with a prefix specified in the request. /// /// Get contacts by prefix - /// Contact prefix - /// Contact search type - /// Contact entity type - /// Contact entity ID + /// Contact prefix + /// Contact search type + /// Contact entity type + /// Contact entity ID /// Contacts /// /// List of contacts /// + /// api/2.0/crm/contact/byprefix + /// GET + /// list /// false [Read(@"contact/byprefix")] public IEnumerable GetContactsByPrefix(string prefix, int searchType, EntityType entityType, int entityID) @@ -1586,15 +1669,19 @@ public IEnumerable GetContactsByPrefix(string prefi /// /// Returns a list of contacts from the CRM module with the contact information specified in the request. /// - /// Contact information type - /// Contact data - /// Contact category - /// Contact importance: primary or not + /// Contact information type + /// Contact data + /// Contact category + /// Contact importance: primary or not /// Get contacts by contact information /// Contacts - /// + /// Please note that if the contact data from the "data" parameter refers to one of the contact information types, then the "infoType" parameter must be specified. For example, the "Paris" contact information is related to the "Address" information type. + /// /// List of contacts /// + /// api/2.0/crm/contact/bycontactinfo + /// GET + /// list [Read(@"contact/bycontactinfo")] public IEnumerable GetContactsByContactInfo(ContactInfoType? infoType, String data, int? category, bool? isPrimary) { @@ -1610,11 +1697,14 @@ public IEnumerable GetContactsByContactInfo(ContactInfoType? inf /// /// Returns a certain number of tweets created by a user with the ID specified in the request. /// - /// Contact ID - /// Number of tweets + /// Contact ID + /// Number of tweets /// Get user tweets /// Contacts - /// List of tweets + /// List of tweets + /// api/2.0/crm/contact/{contactid}/tweets + /// GET + /// list [Read(@"contact/{contactid:[0-9]+}/tweets")] public List GetUserTweets(int contactid, int count) { @@ -1675,10 +1765,13 @@ public List GetUserTweets(int contactid, int count) /// /// Returns a list of twitter profiles by the search text specified in the request. /// - /// Search text + /// Search text /// Get twitter profiles /// Contacts - /// List of twitter profiles + /// List of twitter profiles + /// api/2.0/crm/contact/twitterprofile + /// GET + /// list [Read(@"contact/twitterprofile")] public List FindTwitterProfiles(string searchText) { @@ -1705,12 +1798,14 @@ public List FindTwitterProfiles(string searchText) /// /// Deletes an avatar of the contact with the ID specified in the request. /// - /// Contact ID - /// Contact type ID - /// Defines if an avatar is already uploaded or not + /// Contact ID + /// Contact type + /// Defines whether to upload a new avatar only or also delete an old one /// Delete a contact avatar /// Contacts /// Default photo + /// api/2.0/crm/contact/{contactid}/avatar + /// DELETE [Delete(@"contact/{contactid:[0-9]+}/avatar")] public string DeleteContactAvatar(int contactId, string contactType, bool uploadOnly) { @@ -1741,10 +1836,13 @@ public string DeleteContactAvatar(int contactId, string contactType, bool upload /// /// Returns a list of the social media images for the contact with the ID specified in the request. /// - /// Contact ID + /// Contact ID /// Get contact social media images by contact ID /// Contacts - /// List of social media images + /// List of social media images + /// api/2.0/crm/contact/{contactid}/socialmediaavatar + /// GET + /// list [Read(@"contact/{contactid:[0-9]+}/socialmediaavatar")] public List GetContactSMImages(int contactId) { @@ -1752,12 +1850,15 @@ public List GetContactSMImages(int contactId) } /// - /// Returns a list of the contact social media images for the social networks specified in the request. + /// Returns a list of the contact social media images from the social networks specified in the request. /// - /// List of contact social networks + /// List of contact social networks /// Get contact social media images by networks /// Contacts - /// List of social media images + /// List of social media images + /// api/2.0/crm/contact/socialmediaavatar + /// POST + /// list [Create(@"contact/socialmediaavatar")] public List GetContactSMImagesByNetworks(List socialNetworks) { @@ -1778,14 +1879,16 @@ public List GetContactSMImagesByNetworks(List /// Uploads an avatar of the contact with the ID specified in the request from the social network. /// - /// Contact ID - /// Contact social network - /// User identity - /// Defines if an avatar is already uploaded or not - /// Temporary directory name + /// Contact ID + /// Contact social network + /// User identity + /// Defines whether to upload an avatar only or also save it to a folder + /// Temporary directory name /// Upload an avatar from social network /// Contacts - /// Avatar + /// Avatar + /// api/2.0/crm/contact/{contactid}/avatar + /// PUT [Update(@"contact/{contactid:[0-9]+}/avatar")] public ContactPhotoManager.PhotoData UploadUserAvatarFromSocialNetwork(int contactId, SocialNetworks socialNetwork, string userIdentity, bool uploadOnly, string tmpDirName) { @@ -1811,16 +1914,18 @@ public ContactPhotoManager.PhotoData UploadUserAvatarFromSocialNetwork(int conta } /// - /// Sends a mail through SMTP to contacts with the IDs specified in the request. + /// Sends a mail through SMTP to the contacts with the IDs specified in the request. /// - /// File IDs - /// Contact IDs - /// Mail subject - /// Mail body - /// Defines if a mail will be stored in the history or not + /// File IDs + /// Contact IDs + /// Mail subject + /// Mail body + /// Defines if a mail will be stored in the history or not /// Send a mail /// Contacts /// Mail + /// api/2.0/crm/contact/mailsmtp/send + /// POST /// false [Create(@"contact/mailsmtp/send")] public IProgressItem SendMailSMTPToContacts(List fileIDs, List contactIds, String subject, String body, bool storeInHistory) @@ -1834,13 +1939,15 @@ public IProgressItem SendMailSMTPToContacts(List fileIDs, List contact } /// - /// Returns a preview of a mail sent through SMTP to contact with the ID specified in the request. + /// Returns a preview of a mail sent through SMTP to the contact with the ID specified in the request. /// - /// Mail template - /// Contact ID + /// Mail template + /// Contact ID /// Get a mail preview /// Contacts /// Mail preview + /// api/2.0/crm/contact/mailsmtp/preview + /// POST /// false [Create(@"contact/mailsmtp/preview")] public string GetMailSMTPToContactsPreview(string template, int contactId) @@ -1859,6 +1966,8 @@ public string GetMailSMTPToContactsPreview(string template, int contactId) /// Get a mail status /// Contacts /// Mail status + /// api/2.0/crm/contact/mailsmtp/status + /// GET /// false [Read(@"contact/mailsmtp/status")] public IProgressItem GetMailSMTPToContactsStatus() @@ -1872,6 +1981,8 @@ public IProgressItem GetMailSMTPToContactsStatus() /// Cancel mail sending /// Contacts /// Mail status + /// api/2.0/crm/contact/mailsmtp/cancel + /// PUT /// false [Update(@"contact/mailsmtp/cancel")] public IProgressItem CancelMailSMTPToContacts() @@ -1884,10 +1995,12 @@ public IProgressItem CancelMailSMTPToContacts() /// /// Sets the creation date of a contact with the ID specified in the request. /// - /// Contact ID - /// Contact creation date + /// Contact ID + /// Contact creation date /// Set the contact creation date /// Contacts + /// api/2.0/crm/contact/{contactid}/creationdate + /// PUT /// false [Update(@"contact/{contactid:[0-9]+}/creationdate")] public void SetContactCreationDate(int contactId, ApiDateTime creationDate) @@ -1904,9 +2017,11 @@ public void SetContactCreationDate(int contactId, ApiDateTime creationDate) /// /// Sets the last modified date of a contact with the ID specified in the request. /// - /// Contact ID - /// Contact last modified date + /// Contact ID + /// Contact last modified date /// Set the contact last modified date + /// api/2.0/crm/contact/{contactid}/lastmodifeddate + /// PUT /// false [Update(@"contact/{contactid:[0-9]+}/lastmodifeddate")] public void SetContactLastModifedDate(int contactId, ApiDateTime lastModifedDate) diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.CurrencyRates.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.CurrencyRates.cs index 30d53e902..a09919b0f 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.CurrencyRates.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.CurrencyRates.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ namespace ASC.Api.CRM { + ///crm public partial class CRMApi { //TABLE `crm_currency_rate` column `rate` DECIMAL(10,2) NOT NULL @@ -35,11 +36,14 @@ public partial class CRMApi /// /// Returns a list of all the currency rates. /// - /// Get all currency rates - /// Common - /// + /// Get currency rates + /// Currencies + /// /// List of currency rates /// + /// api/2.0/crm/currency/rates + /// GET + /// list [Read(@"currency/rates")] public IEnumerable GetCurrencyRates() { @@ -49,13 +53,15 @@ public IEnumerable GetCurrencyRates() /// /// Returns a currency rate by ID. /// - /// Currency rate ID + /// Currency rate ID /// Get a currency rate by ID - /// Common - /// + /// Currencies + /// /// Currency rate /// /// + /// api/2.0/crm/currency/rates/{id} + /// GET [Read(@"currency/rates/{id:[0-9]+}")] public CurrencyRateWrapper GetCurrencyRate(int id) { @@ -69,14 +75,16 @@ public CurrencyRateWrapper GetCurrencyRate(int id) /// /// Returns a currency rate by currencies. /// - /// Original currency - /// Converted currency + /// Currency to convert + /// Currency into which the original currency will be converted /// Get a currency rate by currencies - /// Common - /// + /// Currencies + /// /// Currency rate /// /// + /// api/2.0/crm/currency/rates/{fromCurrency}/{toCurrency} + /// GET [Read(@"currency/rates/{fromCurrency}/{toCurrency}")] public CurrencyRateWrapper GetCurrencyRate(string fromCurrency, string toCurrency) { @@ -91,12 +99,14 @@ public CurrencyRateWrapper GetCurrencyRate(string fromCurrency, string toCurrenc /// /// Creates a new currency rate with the parameters specified in the request. /// - /// Original currency - /// Converted currency - /// Currency rate + /// Currency to convert + /// Currency into which the original currency will be converted + /// Exchange rate /// Create a currency rate - /// Common - /// Currency rate + /// Currencies + /// Currency rate + /// api/2.0/crm/currency/rates + /// POST [Create(@"currency/rates")] public CurrencyRateWrapper CreateCurrencyRate(string fromCurrency, string toCurrency, decimal rate) { @@ -120,13 +130,15 @@ public CurrencyRateWrapper CreateCurrencyRate(string fromCurrency, string toCurr /// /// Updates a currency rate with the parameters specified in the request. /// - /// Currency ID - /// New original currency - /// New converted currency - /// New currency rate + /// Currency ID + /// New currency to convert + /// New currency into which the original currency will be converted + /// New currency rate /// Update a currency rate - /// Common - /// Updated currency rate + /// Currencies + /// Updated currency rate + /// api/2.0/crm/currency/rates/{id} + /// PUT [Update(@"currency/rates/{id:[0-9]+}")] public CurrencyRateWrapper UpdateCurrencyRate(int id, string fromCurrency, string toCurrency, decimal rate) { @@ -153,13 +165,16 @@ public CurrencyRateWrapper UpdateCurrencyRate(int id, string fromCurrency, strin } /// - /// Sets rates to the currency specified in the request. + /// Sets currency rates to the currency specified in the request. /// - /// Currency (abbreviation) - /// List of currency rates + /// Currency (abbreviation) + /// List of currency rates /// Set currency rates - /// Common - /// Currency information + /// Currencies + /// Currency information + /// api/2.0/crm/currency/setrates + /// POST + /// list [Create(@"currency/setrates")] public List SetCurrencyRates(String currency, List rates) { @@ -198,10 +213,13 @@ public List SetCurrencyRates(String currency, List /// Adds currency rates specified in the request. /// - /// List of currency rates + /// List of currency rates /// Add currency rates - /// Common - /// Currency information + /// Currencies + /// Currency information + /// api/2.0/crm/currency/addrates + /// POST + /// list [Create(@"currency/addrates")] public List AddCurrencyRates(List rates) { @@ -237,14 +255,15 @@ public List AddCurrencyRates(List rates) return existingRates.Select(ToCurrencyRateWrapper).ToList(); } - /// /// Deletes a currency rate with the ID specified in the request. /// - /// Currency rate ID + /// Currency rate ID /// Delete a currency rate - /// Common - /// Currency rate + /// Currencies + /// Currency rate + /// api/2.0/crm/currency/rates/{id} + /// DELETE [Delete(@"currency/rates/{id:[0-9]+}")] public CurrencyRateWrapper DeleteCurrencyRate(int id) { diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.CustomFields.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.CustomFields.cs index 9142cb2e8..e97d1fb86 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.CustomFields.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.CustomFields.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,13 +37,16 @@ public partial class CRMApi /// /// Returns a list of descriptions for all the existing custom fields. /// - /// Entity type + /// Entity type /// Get custom fields /// Custom fields - /// + /// /// List of custom fields /// + /// api/2.0/crm/{entityType}/customfield/definitions + /// GET /// + ///list [Read(@"{entityType:(contact|person|company|opportunity|case)}/customfield/definitions")] public IEnumerable GetCustomFieldDefinitions(string entityType) { @@ -53,11 +56,14 @@ public IEnumerable GetCustomFieldDefinitions(string entityTy /// /// Returns a list of all the custom fields for the entity type and ID specified in the request. /// - /// Entity type - /// Entity ID + /// Entity type + /// Entity ID /// Get entity custom fields /// Custom fields - /// List of entity custom fields + /// List of entity custom fields + /// api/2.0/crm/{entityType}/{entityid}/customfield + /// GET + /// list [Read(@"{entityType:(contact|person|company|opportunity|case)}/{entityid:[0-9]+}/customfield")] public IEnumerable GetCustomFieldForSubject(string entityType, int entityid) { @@ -67,15 +73,17 @@ public IEnumerable GetCustomFieldForSubject(string entit /// /// Sets the selected custom field to the entity with type and ID specified in the request. /// - /// Entity type - /// Entity ID - /// Field ID - /// Field value + /// Entity type + /// Entity ID + /// Field ID + /// Field value /// Set an entity custom field /// Custom fields - /// + /// /// Custom field /// + /// api/2.0/crm/{entityType}/{entityid}/customfield/{fieldid} + /// POST [Create(@"{entityType:(contact|person|company|opportunity|case)}/{entityid:[0-9]+}/customfield/{fieldid:[0-9]+}")] public CustomFieldBaseWrapper SetEntityCustomFieldValue(string entityType, int entityid, int fieldid, string fieldValue) { @@ -94,17 +102,17 @@ public CustomFieldBaseWrapper SetEntityCustomFieldValue(string entityType, int e /// /// Creates a new custom field with the parameters (entity type, field title, type, etc.) specified in the request. /// - /// Entity type - /// Field title - /// + /// Entity type + /// Field title + /// /// Custom field type /// - /// Field position - /// Mask + /// Field position + /// Mask /// Create a custom field /// Custom fields - /// + /// /// Custom field /// /// @@ -183,6 +191,8 @@ public CustomFieldBaseWrapper SetEntityCustomFieldValue(string entityType, int e /// /// ]]> /// + /// api/2.0/crm/{entityType}/customfield + /// POST [Create(@"{entityType:(contact|person|company|opportunity|case)}/customfield")] public CustomFieldWrapper CreateCustomFieldValue(string entityType, string label, int fieldType, int position, string mask) { @@ -200,18 +210,18 @@ public CustomFieldWrapper CreateCustomFieldValue(string entityType, string label /// /// Updates the selected custom field with the parameters (entity type, field title, type, etc.) specified in the request. /// - /// Custom field ID - /// New entity type - /// New field title - /// + /// Custom field ID + /// New entity type + /// New field title + /// /// New custom field type /// - /// New field position - /// New mask + /// New field position + /// New mask /// Update a custom field /// Custom fields - /// + /// /// Updated custom field /// /// @@ -221,6 +231,8 @@ public CustomFieldWrapper CreateCustomFieldValue(string entityType, string label /// /// /// + /// api/2.0/crm/{entityType}/customfield/{id} + /// PUT [Update(@"{entityType:(contact|person|company|opportunity|case)}/customfield/{id:[0-9]+}")] public CustomFieldWrapper UpdateCustomFieldValue(int id, string entityType, string label, int fieldType, int position, string mask) { @@ -252,15 +264,17 @@ public CustomFieldWrapper UpdateCustomFieldValue(int id, string entityType, stri /// /// Deletes a custom field with the ID specified in the request. /// - /// Entity type - /// Field ID + /// Entity type + /// Field ID /// Delete a custom field /// Custom fields /// /// - /// + /// /// Custom field /// + /// api/2.0/crm/{entityType}/customfield/{fieldid} + /// DELETE [Delete(@"{entityType:(contact|person|company|opportunity|case)}/customfield/{fieldid:[0-9]+}")] public CustomFieldWrapper DeleteCustomField(string entityType, int fieldid) { @@ -282,18 +296,21 @@ public CustomFieldWrapper DeleteCustomField(string entityType, int fieldid) } /// - /// Updates the custom field order with the custom field list specified in the request. + /// Updates the order of the custom fields with a list specified in the request. /// - /// List of custom field IDs - /// Entity type - /// Update the custom field order + /// List of custom field IDs + /// Entity type + /// Update the order of custom fields /// Custom fields - /// + /// /// Custom fields in the new order /// /// /// /// + /// api/2.0/crm/{entityType}/customfield/reorder + /// PUT + /// list [Update(@"{entityType:(contact|person|company|opportunity|case)}/customfield/reorder")] public IEnumerable UpdateCustomFieldsOrder(IEnumerable fieldids, string entityType) { diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.Deals.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.Deals.cs index e57199b3c..29f8c625f 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.Deals.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.Deals.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,14 +39,16 @@ public partial class CRMApi /// /// Returns the detailed information about an opportunity with the ID specified in the request. /// - /// Opportunity ID - /// + /// Opportunity ID + /// /// Opportunity /// - /// Get an opportunity by ID + /// Get an opportunity /// Opportunities /// /// + ///api/2.0/crm/opportunity/{opportunityid} + ///GET [Read(@"opportunity/{opportunityid:[0-9]+}")] public OpportunityWrapper GetDealByID(int opportunityid) { @@ -61,15 +63,17 @@ public OpportunityWrapper GetDealByID(int opportunityid) /// /// Updates the selected opportunity to the stage with the ID specified in the request. /// - /// Opportunity ID - /// New opportunity stage ID - /// + /// Opportunity ID + /// New opportunity stage ID + /// /// Opportunity with the updated stage /// /// Update an opportunity stage by ID /// Opportunities /// /// + ///api/2.0/crm/opportunity/{opportunityid}/stage/{id} + ///PUT [Update(@"opportunity/{opportunityid:[0-9]+}/stage/{id:[0-9]+}")] public OpportunityWrapper UpdateToDealMilestone(int opportunityid, int stageid) { @@ -94,16 +98,18 @@ public OpportunityWrapper UpdateToDealMilestone(int opportunityid, int stageid) /// /// Sets access rights to the selected opportunity with the parameters specified in the request. /// - /// Opportunity ID - /// Opportunity privacy: private or not - /// List of users with access rights - /// Set access rights to the opportunity + /// Opportunity ID + /// Opportunity privacy: private or not + /// List of users with access rights + /// Set opportunity access rights /// Opportunities /// /// - /// + /// /// Opportunity /// + /// api/2.0/crm/opportunity/{opportunityid}/access + /// PUT [Update(@"opportunity/{opportunityid:[0-9]+}/access")] public OpportunityWrapper SetAccessToDeal(int opportunityid, bool isPrivate, IEnumerable accessList) { @@ -156,23 +162,26 @@ private OpportunityWrapper SetAccessToDeal(Deal deal, bool isPrivate, IEnumerabl /// /// Sets access rights to the list of all the opportunities matching the parameters specified in the request. /// - /// Opportunity responsible ID - /// Opportunity stage ID - /// Opportunity tags - /// Contact ID - /// Participation status: take into account opportunities where the contact is a participant or not - /// Start date - /// End date - /// Opportunity stage type - /// Opportunity privacy: private or not - /// List of users with access rights + /// Opportunity responsible ID + /// Opportunity stage ID + /// Opportunity tags + /// Contact ID + /// Opportunity stage type + /// Participation status: take into account opportunities where the contact is a participant or not + /// Start date + /// End date + /// Opportunity privacy: private or not + /// List of users with access rights /// Set access rights to the filtered opportunities /// Opportunities /// /// - /// + /// /// List of opportunities /// + /// api/2.0/crm/opportunity/filter/access + /// PUT + /// list [Update(@"opportunity/filter/access")] public IEnumerable SetAccessToBatchDeal( Guid responsibleid, @@ -215,16 +224,19 @@ IEnumerable accessList /// /// Sets access rights to the list of opportunities with the IDs specified in the request. /// - /// List of opportunity IDs - /// Opportunity privacy: private or not - /// List of users with access rights + /// List of opportunity IDs + /// Opportunity privacy: private or not + /// List of users with access rights /// Set access rights to the opportunities by IDs /// Opportunities /// /// - /// + /// /// List of opportunities /// + /// api/2.0/crm/opportunity/access + /// PUT + /// list [Update(@"opportunity/access")] public IEnumerable SetAccessToBatchDeal(IEnumerable opportunityid, bool isPrivate, IEnumerable accessList) { @@ -253,14 +265,17 @@ public IEnumerable SetAccessToBatchDeal(IEnumerable opp /// /// Deletes a group of opportunities with the IDs specified in the request. /// - /// List of opportunity IDs + /// List of opportunity IDs /// /// /// Delete opportunities by IDs /// Opportunities - /// + /// /// List of opportunities /// + /// api/2.0/crm/opportunity + /// PUT + /// list [Update(@"opportunity")] public IEnumerable DeleteBatchDeals(IEnumerable opportunityids) { @@ -275,21 +290,24 @@ public IEnumerable DeleteBatchDeals(IEnumerable opportu /// /// Deletes a list of all the opportunities matching the parameters specified in the request. /// - /// Opportunity responsible ID - /// Opportunity stage ID - /// Opportunity tags - /// Contact ID - /// Participation status: take into account opportunities where the contact is a participant or not - /// Start date - /// End date - /// Opportunity stage type + /// Opportunity responsible ID + /// Opportunity stage ID + /// Opportunity tags + /// Contact ID + /// Opportunity stage type + /// Participation status: take into account opportunities where the contact is a participant or not + /// Start date + /// End date /// /// /// Delete filtered opportunities /// Opportunities - /// + /// /// List of opportunities /// + /// api/2.0/crm/opportunity/filter + /// DELETE + /// list [Delete(@"opportunity/filter")] public IEnumerable DeleteBatchDeals( Guid responsibleid, @@ -321,19 +339,22 @@ public IEnumerable DeleteBatchDeals( /// /// Returns a list of all the opportunities matching the parameters specified in the request. /// - /// Opportunity responsible ID - /// Opportunity stage ID - /// Opportunity tags - /// Contact ID - /// Participation status: take into account opportunities where the contact is a participant or not - /// Start date - /// End date - /// Opportunity stage type + /// Opportunity responsible ID + /// Opportunity stage ID + /// Opportunity tags + /// Contact ID + /// Opportunity stage type + /// Participation status: take into account opportunities where the contact is a participant or not + /// Start date + /// End date /// Get filtered opportunities /// Opportunities - /// + /// /// List of opportunities /// + /// api/2.0/crm/opportunity/filter + /// GET + /// list [Read(@"opportunity/filter")] public IEnumerable GetDeals( Guid responsibleid, @@ -434,14 +455,16 @@ public IEnumerable GetDeals( /// /// Deletes an opportunity with the ID specified in the request. /// - /// Opportunity ID + /// Opportunity ID /// Delete an opportunity /// Opportunities /// /// - /// + /// /// Opportunity /// + /// api/2.0/crm/opportunity/{opportunityid} + /// DELETE [Delete(@"opportunity/{opportunityid:[0-9]+}")] public OpportunityWrapper DeleteDeal(int opportunityid) { @@ -459,28 +482,30 @@ public OpportunityWrapper DeleteDeal(int opportunityid) /// Creates an opportunity with the parameters specified in the request. /// /// Create an opportunity - /// Opportunity primary contact ID - /// Opportunity participants - /// Opportunity title - /// Opportunity description - /// Opportunity responsible ID - /// Bid type - /// Amount of transactions - /// Currency (abbreviation) - /// Amount per period - /// Stage ID - /// Opportunity success probability - /// Actual opportunity closure date - /// Expected opportunity closure date - /// Custom field list - /// Opportunity privacy: private or not - /// List of users with access rights to the opportunity - /// Notifies users from the access list about the opportunity + /// Opportunity primary contact ID + /// Opportunity participants + /// Opportunity title + /// Opportunity description + /// Opportunity responsible ID + /// Bid type + /// Amount of transactions + /// Currency (abbreviation) + /// Amount per period + /// Stage ID + /// Opportunity success probability + /// Actual opportunity closure date + /// Expected opportunity closure date + /// Custom field list + /// Opportunity privacy: private or not + /// List of users with access rights to the opportunity + /// Notifies users from the access list about the opportunity or not /// Opportunities - /// + /// /// Opportunity /// /// + ///api/2.0/crm/opportunity + ///POST [Create(@"opportunity")] public OpportunityWrapper CreateDeal( int contactid, @@ -555,29 +580,31 @@ public OpportunityWrapper CreateDeal( /// Updates the selected opportunity with the parameters specified in the request. /// /// Update an opportunity - ///Opportunity ID - ///New opportunity primary contact ID - /// New opportunity participants - /// New opportunity title - /// New opportunity description - /// New opportunity responsible ID - /// New bid type - /// New amount of transactions - /// New currency (abbreviation) - /// New amount per period - /// New stage ID - /// New opportunity success probability - /// New actual opportunity closure date - /// New expected opportunity closure date - /// New custom field list - /// New opportunity privacy: private or not - /// New list of users with access rights to the opportunity - /// Notifies users from the access list about the opportunity + /// Opportunity ID + /// New opportunity primary contact ID + /// New opportunity participants + /// New opportunity title + /// New opportunity description + /// New opportunity responsible ID + /// New bid type + /// New amount of transactions + /// New currency (abbreviation) + /// New amount per period + /// New stage ID + /// New opportunity success probability + /// New actual opportunity closure date + /// New expected opportunity closure date + /// New custom field list + /// New opportunity privacy: private or not + /// New list of users with access rights to the opportunity + /// Notifies users from the access list about the opportunity or not /// Opportunities - /// + /// /// Updated opportunity /// /// + ///api/2.0/crm/opportunity/{opportunityid} + ///PUT [Update(@"opportunity/{opportunityid:[0-9]+}")] public OpportunityWrapper UpdateDeal( int opportunityid, @@ -652,12 +679,15 @@ public OpportunityWrapper UpdateDeal( /// /// Returns a list of all the contacts related to the opportunity with the ID specified in the request. /// - /// Opportunity ID + /// Opportunity ID /// Get opportunity contacts /// Opportunities - /// List of contacts + /// List of contacts /// /// + ///api/2.0/crm/opportunity/{opportunityid}/contact + ///GET + /// list [Read(@"opportunity/{opportunityid:[0-9]+}/contact")] public IEnumerable GetDealMembers(int opportunityid) { @@ -678,14 +708,16 @@ public IEnumerable GetDealMembers(int opportunityid) /// /// Adds the selected contact to the opportunity with the ID specified in the request. /// - /// Opportunity ID - /// Contact ID + /// Opportunity ID + /// Contact ID /// Add an opportunity contact /// Opportunities /// - /// + /// /// Contact /// + /// api/2.0/crm/opportunity/{opportunityid}/contact/{contactid} + /// POST [Create(@"opportunity/{opportunityid:[0-9]+}/contact/{contactid:[0-9]+}")] public ContactWrapper AddMemberToDeal(int opportunityid, int contactid) { @@ -710,15 +742,17 @@ public ContactWrapper AddMemberToDeal(int opportunityid, int contactid) /// /// Deletes the selected contact from the opportunity with the ID specified in the request. /// - /// Opportunity ID - /// Contact ID + /// Opportunity ID + /// Contact ID /// Delete an opportunity contact /// Opportunities /// /// - /// + /// /// Contact /// + /// api/2.0/crm/opportunity/{opportunityid}/contact/{contactid} + /// DELETE [Delete(@"opportunity/{opportunityid:[0-9]+}/contact/{contactid:[0-9]+}")] public ContactWrapper DeleteMemberFromDeal(int opportunityid, int contactid) { @@ -743,13 +777,16 @@ public ContactWrapper DeleteMemberFromDeal(int opportunityid, int contactid) /// /// Returns a list of 30 opportunities in the CRM module with a prefix specified in the request. /// - /// Opportunity prefix - /// Contact ID - /// Internal search or not + /// Opportunity prefix + /// Contact ID + /// Internal search or not /// Opportunities /// /// List of opportunities /// + /// api/2.0/crm/opportunity/byprefix + /// GET + /// list /// false [Read(@"opportunity/byprefix")] public IEnumerable GetDealsByPrefix(string prefix, int contactID, bool internalSearch = true) @@ -785,12 +822,15 @@ public IEnumerable GetDealsByPrefix(string prefix, int conta /// /// Returns a list of all the opportunities for the contact with the ID specified in the request. /// - /// Contact ID + /// Contact ID /// Get contact opportunities /// Opportunities - /// + /// /// List of opportunities /// + /// api/2.0/crm/opportunity/bycontact/{contactid} + /// GET + /// list [Read(@"opportunity/bycontact/{contactid:[0-9]+}")] public IEnumerable GetDeals(int contactid) { @@ -801,10 +841,12 @@ public IEnumerable GetDeals(int contactid) /// /// Sets the opportunity creation date specified in the request. /// - /// Opportunity ID - /// Opportunity creation date + /// Opportunity ID + /// Opportunity creation date /// Set the opportunity creation date /// Opportunities + /// api/2.0/crm/opportunity/{opportunityid}/creationdate + /// PUT /// false [Update(@"opportunity/{opportunityid:[0-9]+}/creationdate")] public void SetDealCreationDate(int opportunityid, ApiDateTime creationDate) @@ -821,10 +863,12 @@ public void SetDealCreationDate(int opportunityid, ApiDateTime creationDate) /// /// Sets the opportunity last modified date specified in the request. /// - /// Opportunity ID - /// Opportunity last modified date + /// Opportunity ID + /// Opportunity last modified date /// Set the opportunity last modified date /// Opportunities + /// api/2.0/crm/opportunity/{opportunityid}/lastmodifeddate + /// PUT /// false [Update(@"opportunity/{opportunityid:[0-9]+}/lastmodifeddate")] public void SetDealLastModifedDate(int opportunityid, ApiDateTime lastModifedDate) diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.Invoices.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.Invoices.cs index 82bd70b83..e012b8c6f 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.Invoices.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.Invoices.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,10 +40,12 @@ public partial class CRMApi /// /// Returns the detailed information about an invoice with the ID specified in the request. /// - /// Invoice ID + /// Invoice ID /// Get an invoice by ID /// Invoices - /// Invoice + /// Invoice + /// api/2.0/crm/invoice/{invoiceid} + /// GET [Read(@"invoice/{invoiceid:[0-9]+}")] public InvoiceWrapper GetInvoiceByID(int invoiceid) { @@ -65,7 +67,9 @@ public InvoiceWrapper GetInvoiceByID(int invoiceid) /// /// Get an invoice sample /// Invoices - /// Invoice + /// Invoice + /// api/2.0/crm/invoice/sample + /// GET [Read(@"invoice/sample")] public InvoiceWrapper GetInvoiceSample() { @@ -87,10 +91,12 @@ public InvoiceWrapper GetInvoiceSample() /// /// Returns the JSON data of an invoice with the ID specified in the request. /// - /// Invoice ID + /// Invoice ID /// Get the invoice JSON data /// Invoices /// Invoice JSON data + /// api/2.0/crm/invoice/jsondata/{invoiceid} + /// GET [Read(@"invoice/jsondata/{invoiceid:[0-9]+}")] public string GetInvoiceJsonData(int invoiceid) { @@ -108,17 +114,20 @@ public string GetInvoiceJsonData(int invoiceid) /// /// Returns a list of invoices matching the parameters specified in the request. /// - /// Invoice status - /// Invoice start issue date - /// Invoice end issue date - /// Invoice start due date - /// Invoice end due date - /// Invoice entity type - /// Invoice entity ID - /// Invoice currency (abbreviation) + /// Invoice status + /// Invoice start issue date + /// Invoice end issue date + /// Invoice start due date + /// Invoice end due date + /// Invoice entity type + /// Invoice entity ID + /// Invoice currency (abbreviation) /// Get invoices /// Invoices - /// List of invoices + /// List of invoices + /// api/2.0/crm/invoice/filter + /// GET + /// list [Read(@"invoice/filter")] public IEnumerable GetInvoices( InvoiceStatus? status, @@ -218,11 +227,14 @@ String currency /// /// Returns a list of all the invoices related to the entity with the ID and type specified in the request. /// - /// Invoice entity type - /// Invoice entity ID + /// Invoice entity type + /// Invoice entity ID /// Get entity invoices /// Invoices - /// List of invoices + /// List of invoices + /// api/2.0/crm/{entityType}/invoicelist/{entityid} + /// GET + /// list [Read(@"{entityType:(contact|person|company|opportunity)}/invoicelist/{entityid:[0-9]+}")] public IEnumerable GetEntityInvoices(String entityType, int entityid) { @@ -234,11 +246,14 @@ public IEnumerable GetEntityInvoices(String entityType, int /// /// Updates a status of invoices with the IDs specified in the request. /// - /// List of invoice IDs - /// New invoice status + /// List of invoice IDs + /// New invoice status /// Update an invoice group status /// Invoices /// Invoice information + /// api/2.0/crm/invoice/status/{status} + /// PUT + /// list [Update(@"invoice/status/{status:[\w\d-]+}")] public KeyValuePair, IEnumerable> UpdateInvoiceBatchStatus( int[] invoiceids, @@ -344,10 +359,12 @@ InvoiceStatus status /// /// Deletes an invoice with the ID specified in the request. /// - /// Invoice ID + /// Invoice ID /// Delete an invoice /// Invoices - /// Invoice + /// Invoice + /// api/2.0/crm/invoice/{invoiceid} + /// DELETE [Delete(@"invoice/{invoiceid:[0-9]+}")] public InvoiceBaseWrapper DeleteInvoice(int invoiceid) { @@ -363,10 +380,13 @@ public InvoiceBaseWrapper DeleteInvoice(int invoiceid) /// /// Deletes a group of invoices with the IDs specified in the request. /// - /// List of invoice IDs - /// Delete an invoice group + /// List of invoice IDs + /// Delete invoices /// Invoices - /// List of invoices + /// List of invoices + /// api/2.0/crm/invoice + /// DELETE + /// list [Delete(@"invoice")] public IEnumerable DeleteBatchInvoices(IEnumerable invoiceids) { @@ -381,25 +401,25 @@ public IEnumerable DeleteBatchInvoices(IEnumerable invo /// /// Creates an invoice with the parameters (contact ID, consignee ID, etc.) specified in the request. /// - /// Invoice number - /// Invoice issue date - /// Invoice template type - /// Invoice contact ID - /// Invoice consignee ID - /// Invoice entity ID - /// Invoice billing address ID - /// Invoice delivery address ID - /// Invoice due date - /// Invoice language - /// Invoice currency (abbreviation) - /// Invoice exchange rate - /// Invoice purchase order number - /// Invoice terms - /// Invoice description - /// List of invoice lines + /// Invoice number + /// Invoice issue date + /// Invoice template type + /// Invoice contact ID + /// Invoice consignee ID + /// Invoice entity ID + /// Invoice billing address ID + /// Invoice delivery address ID + /// Invoice due date + /// Invoice language + /// Invoice currency (abbreviation) + /// Invoice exchange rate + /// Invoice purchase order number + /// Invoice terms + /// Invoice description + /// List of invoice lines /// Create an invoice /// Invoices - /// Invoice + /// Invoice /// /// DeleteBatchInvoices(IEnumerable invo /// /// ]]> /// + /// api/2.0/crm/invoice + /// POST [Create(@"invoice")] public InvoiceWrapper CreateInvoice( string number, @@ -547,25 +569,25 @@ private List CreateInvoiceLines(List invoiceLines, Inv /// /// Updates the selected invoice with the parameters (contact ID, consignee ID, etc.) specified in the request. /// - /// Invoice ID - /// New invoice issue date - /// New invoice template type - /// New invoice contact ID - /// New invoice consignee ID - /// New invoice entity ID - /// New invoice billing address ID - /// New invoice delivery address ID - /// New invoice due date - /// New invoice language - /// New invoice currency (abbreviation) - /// New invoice exchange rate - /// New invoice purchase order number - /// New invoice terms - /// New invoice description - /// New list of invoice lines + /// Invoice ID + /// New invoice issue date + /// New invoice template type + /// New invoice contact ID + /// New invoice consignee ID + /// New invoice entity ID + /// New invoice billing address ID + /// New invoice delivery address ID + /// New invoice due date + /// New invoice language + /// New invoice currency (abbreviation) + /// New invoice exchange rate + /// New invoice purchase order number + /// New invoice terms + /// New invoice description + /// New list of invoice lines /// Update an invoice /// Invoices - /// Updated invoice + /// Updated invoice /// /// CreateInvoiceLines(List invoiceLines, Inv /// /// ]]> /// + /// api/2.0/crm/invoice/{id} + /// PUT [Update(@"invoice/{id:[0-9]+}")] public InvoiceWrapper UpdateInvoice( int id, @@ -672,10 +696,12 @@ public InvoiceWrapper UpdateInvoice( /// /// Returns the pdf file related to an invoice with the ID specified in the request. /// - /// Invoice ID + /// Invoice ID /// Get the invoice pdf file /// Invoices - /// Pdf file + /// Pdf file + /// api/2.0/crm/invoice/{invoiceid}/pdf + /// GET [Read(@"invoice/{invoiceid:[0-9]+}/pdf")] public FileWrapper GetInvoicePdfExistOrCreate(int invoiceid) { @@ -695,12 +721,14 @@ public FileWrapper GetInvoicePdfExistOrCreate(int invoiceid) /// /// Returns information about the generation of the invoice pdf file. /// - /// Invoice ID - /// Storage URL - /// Revision ID + /// Invoice ID + /// Storage URL + /// Revision ID /// Get invoice converter data /// Invoices - /// Converter data + /// Converter data + /// api/2.0/crm/invoice/converter/data + /// POST [Create(@"invoice/converter/data")] public ConverterData GetInvoiceConverterData(int invoiceId, string storageUrl, string revisionId) { @@ -754,10 +782,12 @@ public ConverterData GetInvoiceConverterData(int invoiceId, string storageUrl, s /// /// Returns the existence of an invoice with the number specified in the request. /// - /// Invoice number + /// Invoice number /// Check invoice existence by number /// Invoices /// Invoice existence + /// api/2.0/crm/invoice/bynumber/exist + /// GET [Read(@"invoice/bynumber/exist")] public Boolean GetInvoiceByNumberExistence(string number) { @@ -768,10 +798,12 @@ public Boolean GetInvoiceByNumberExistence(string number) /// /// Returns the detailed information about an invoice with the number specified in the request. /// - /// Invoice number + /// Invoice number /// Get an invoice by number /// Invoices - /// Invoice + /// Invoice + /// api/2.0/crm/invoice/bynumber + /// GET [Read(@"invoice/bynumber")] public InvoiceWrapper GetInvoiceByNumber(string number) { @@ -790,11 +822,14 @@ public InvoiceWrapper GetInvoiceByNumber(string number) /// /// Returns a list of invoice items matching the parameters specified in the request. /// - /// Invoice status - /// Inventory stock - /// Get filtered invoices + /// Invoice status + /// Specifies if the inventory is tracked or not + /// Get filtered invoice items /// Invoices - /// List of invoice items + /// List of invoice items + /// api/2.0/crm/invoiceitem/filter + /// GET + /// list [Read(@"invoiceitem/filter")] public IEnumerable GetInvoiceItems(int status, bool? inventoryStock) { @@ -869,10 +904,12 @@ public IEnumerable GetInvoiceItems(int status, bool? invento /// /// Returns the detailed information about an invoice item with the ID specified in the request. /// - /// Invoice item ID + /// Invoice item ID /// Get an invoice item by ID /// Invoices - /// Invoice item + /// Invoice item + /// api/2.0/crm/invoiceitem/{invoiceitemid} + /// GET [Read(@"invoiceitem/{invoiceitemid:[0-9]+}")] public InvoiceItemWrapper GetInvoiceItemByID(int invoiceitemid) { @@ -887,18 +924,20 @@ public InvoiceItemWrapper GetInvoiceItemByID(int invoiceitemid) /// /// Creates an invoice line with the parameters (invoice ID, invoice item ID, etc.) specified in the request. /// - /// Invoice ID - /// Invoice item ID - /// First invoice tax ID - /// Second invoice tax ID - /// Sort order - /// Description - /// Quantity - /// Price - /// Discount + /// Invoice ID + /// Invoice item ID + /// First invoice tax ID + /// Second invoice tax ID + /// Sort order + /// Description + /// Quantity + /// Price + /// Discount /// Create an invoice line /// Invoices - /// Invoice line + /// Invoice line + /// api/2.0/crm/invoiceline + /// POST [Create(@"invoiceline")] public InvoiceLineWrapper CreateInvoiceLine( int invoiceId, @@ -944,19 +983,21 @@ decimal discount /// /// Updates the selected invoice line with the parameters (invoice ID, invoice item ID, etc.) specified in the request. /// - /// Invoice line ID - /// Invoice ID - /// Invoice item ID - /// New first invoice tax ID - /// New second invoice tax ID - /// New sort order - /// New description - /// New quantity - /// New price - /// New discount + /// Invoice line ID + /// Invoice ID + /// Invoice item ID + /// New first invoice tax ID + /// New second invoice tax ID + /// New sort order + /// New description + /// New quantity + /// New price + /// New discount /// Update an invoice line /// Invoices - /// Updated invoice line + /// Updated invoice line + /// api/2.0/crm/invoiceline/{id} + /// PUT [Update(@"invoiceline/{id:[0-9]+}")] public InvoiceLineWrapper UpdateInvoiceLine( int id, @@ -1005,10 +1046,12 @@ decimal discount /// /// Deletes an invoice line with the ID specified in the request. /// - /// Invoice line ID + /// Invoice line ID /// Delete an invoice line /// Invoices /// Invoice line ID + /// api/2.0/crm/invoiceline/{id} + /// DELETE [Delete(@"invoiceline/{id:[0-9]+}")] public int DeleteInvoiceLine(int id) { @@ -1058,17 +1101,19 @@ private InvoiceBaseWrapper ToInvoiceBaseWrapper(Invoice invoice) /// /// Creates an invoice item with the parameters (title, description, price, etc.) specified in the request. /// - /// Invoice item title - /// Invoice item description - /// Invoice item price - /// Invoice item stock keeping unit - /// Invoice item stock quantity - /// Invoice item track inventory - /// Item first invoice tax ID - /// Item second invoice tax ID + /// Invoice item title + /// Invoice item description + /// Invoice item price + /// Invoice item stock keeping unit + /// Invoice item stock quantity + /// Specifies if the inventory is tracked or not + /// First invoice item tax ID + /// Second invoice item tax ID /// Create an invoice item /// Invoices - /// Invoice item + /// Invoice item + /// api/2.0/crm/invoiceitem + /// POST [Create(@"invoiceitem")] public InvoiceItemWrapper CreateInvoiceItem( string title, @@ -1108,18 +1153,20 @@ public InvoiceItemWrapper CreateInvoiceItem( /// /// Updates the selected invoice item with the parameters (title, description, price, etc.) specified in the request. /// - /// Invoice item ID - /// New invoice item title - /// New invoice item description - /// New invoice item price - /// New invoice item stock keeping unit - /// New invoice item stock quantity - /// New invoice item track inventory - /// New item first invoice tax ID - /// New item second invoice tax ID + /// Invoice item ID + /// New invoice item title + /// New invoice item description + /// New invoice item price + /// New invoice item stock keeping unit + /// New invoice item stock quantity + /// Specifies if the inventory is tracked or not + /// New first invoice item tax ID + /// New second invoice item tax ID /// Update an invoice item /// Invoices - /// Updated invoice item + /// Updated invoice item + /// api/2.0/crm/invoiceitem/{id} + /// PUT [Update(@"invoiceitem/{id:[0-9]+}")] public InvoiceItemWrapper UpdateInvoiceItem(int id, string title, @@ -1162,10 +1209,12 @@ public InvoiceItemWrapper UpdateInvoiceItem(int id, /// /// Deletes an invoice item with the ID specified in the request. /// - /// Invoice item ID + /// Invoice item ID /// Delete an invoice item /// Invoices - /// Invoice item + /// Invoice item + /// api/2.0/crm/invoiceitem/{id} + /// DELETE [Delete(@"invoiceitem/{id:[0-9]+}")] public InvoiceItemWrapper DeleteInvoiceItem(int id) { @@ -1186,10 +1235,13 @@ public InvoiceItemWrapper DeleteInvoiceItem(int id) /// /// Deletes a group of invoice items with the IDs specified in the request. /// - /// List of invoice item IDs + /// List of invoice item IDs /// Delete invoice items /// Invoices - /// List of invoice items + /// List of invoice items + /// api/2.0/crm/invoiceitem + /// DELETE + /// list [Delete(@"invoiceitem")] public IEnumerable DeleteBatchItems(IEnumerable ids) { @@ -1212,7 +1264,10 @@ public IEnumerable DeleteBatchItems(IEnumerable ids) /// /// Get invoice taxes /// Invoices - /// List of invoice taxes + /// List of invoice taxes + /// api/2.0/crm/invoice/tax + /// GET + /// list [Read(@"invoice/tax")] public IEnumerable GetInvoiceTaxes() { @@ -1222,12 +1277,14 @@ public IEnumerable GetInvoiceTaxes() /// /// Creates an invoice tax with the parameters (name, description, rate) specified in the request. /// - /// Tax name - /// Tax description - /// Tax rate + /// Tax name + /// Tax description + /// Tax rate /// Create an invoice tax /// Invoices - /// Invoice tax + /// Invoice tax + /// api/2.0/crm/invoice/tax + /// POST [Create(@"invoice/tax")] public InvoiceTaxWrapper CreateInvoiceTax( string name, @@ -1258,13 +1315,15 @@ public InvoiceTaxWrapper CreateInvoiceTax( /// /// Updates the selected invoice tax with the parameters (name, description, rate) specified in the request. /// - /// Tax ID - /// New tax name - /// New tax description - /// New tax rate + /// Tax ID + /// New tax name + /// New tax description + /// New tax rate /// Update an invoice tax /// Invoices - /// Updated invoice tax + /// Updated invoice tax + /// api/2.0/crm/invoice/tax/{id} + /// PUT [Update(@"invoice/tax/{id:[0-9]+}")] public InvoiceTaxWrapper UpdateInvoiceTax( int id, @@ -1298,10 +1357,12 @@ public InvoiceTaxWrapper UpdateInvoiceTax( /// /// Deletes an invoice tax with the ID specified in the request. /// - /// Tax ID + /// Tax ID /// Delete an invoice tax /// Invoices - /// Invoice tax + /// Invoice tax + /// api/2.0/crm/invoice/tax/{id} + /// DELETE [Delete(@"invoice/tax/{id:[0-9]+}")] public InvoiceTaxWrapper DeleteInvoiceTax(int id) { @@ -1324,7 +1385,9 @@ public InvoiceTaxWrapper DeleteInvoiceTax(int id) /// /// Get the default invoice settings /// Invoices - /// Default invoice settings + /// Default invoice settings + /// api/2.0/crm/invoice/settings + /// GET [Read(@"invoice/settings")] public InvoiceSetting GetSettings() { @@ -1332,14 +1395,16 @@ public InvoiceSetting GetSettings() } /// - /// Saves the default settings for invoice number specified in the request. + /// Saves the default settings for the invoice number specified in the request. /// - /// Defines if the default invoice number is autogenerated or not - /// Invoice prefix - /// Invoice number - /// Save the default settings for invoice number + /// Defines if the default invoice number is autogenerated or not + /// Invoice prefix + /// Invoice number + /// Save the invoice number default settings /// Invoices - /// Invoice settings + /// Invoice settings + /// api/2.0/crm/invoice/settings/name + /// PUT [Update(@"invoice/settings/name")] public InvoiceSetting SaveNumberSettings(bool autogenerated, string prefix, string number) { @@ -1364,12 +1429,14 @@ public InvoiceSetting SaveNumberSettings(bool autogenerated, string prefix, stri } /// - /// Saves the default settings for invoice terms specified in the request. + /// Saves the default settings for the invoice terms specified in the request. /// - /// Invoice terms - /// Save the default setting for invoice terms + /// Invoice terms + /// Save the invoice terms default settings /// Invoices - /// Invoice settings + /// Invoice settings + /// api/2.0/crm/invoice/settings/terms + /// PUT [Update(@"invoice/settings/terms")] public InvoiceSetting SaveTermsSettings(string terms) { @@ -1386,12 +1453,14 @@ public InvoiceSetting SaveTermsSettings(string terms) } /// - /// Sets the creation date to the invoice with the ID specified in the request. + /// Sets the creation date to an invoice with the ID specified in the request. /// - /// Invoice ID - /// Invoice creation date + /// Invoice ID + /// Invoice creation date /// Set the invoice creation date /// Invoices + /// api/2.0/crm/invoice/{invoiceid}/creationdate + /// PUT /// false [Update(@"invoice/{invoiceid:[0-9]+}/creationdate")] public void SetInvoiceCreationDate(int invoiceid, ApiDateTime creationDate) @@ -1406,10 +1475,10 @@ public void SetInvoiceCreationDate(int invoiceid, ApiDateTime creationDate) } /// - /// Sets the last modified date to the invoice with the ID specified in the request. + /// Sets the last modified date to an invoice with the ID specified in the request. /// - /// Invoice ID - /// Invoice last modified date + /// Invoice ID + /// Invoice last modified date /// Set the invoice last modified date /// Invoices /// false diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.ListItem.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.ListItem.cs index 951332aa8..93d1c0161 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.ListItem.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.ListItem.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,17 +34,19 @@ public partial class CRMApi /// /// Creates an opportunity stage with the parameters (title, description, success probability, etc.) specified in the request. /// - /// Stage title - /// Stage description - /// Stage color - /// Stage success probability - /// Stage type + /// Stage title + /// Stage description + /// Stage color + /// Stage success probability + /// Stage type /// Create an opportunity stage /// Opportunities /// /// /// Opportunity stage /// + /// api/2.0/crm/opportunity/stage + /// POST [Create(@"opportunity/stage")] public DealMilestoneWrapper CreateDealMilestone( string title, @@ -77,19 +79,21 @@ public DealMilestoneWrapper CreateDealMilestone( /// /// Updates the selected opportunity stage with the parameters (title, description, success probability, etc.) specified in the request. /// - /// Opportunity stage ID - /// New stage title - /// New stage description - /// New stage color - /// New stage success probability - /// New stage type - /// Update an opportunity stage by parameters + /// Opportunity stage ID + /// New stage title + /// New stage description + /// New stage color + /// New stage success probability + /// New stage type + /// Update an opportunity stage /// Opportunities /// /// - /// + /// /// Updated opportunity stage /// + /// api/2.0/crm/opportunity/stage/{id} + /// PUT [Update(@"opportunity/stage/{id:[0-9]+}")] public DealMilestoneWrapper UpdateDealMilestone( int id, @@ -125,17 +129,19 @@ public DealMilestoneWrapper UpdateDealMilestone( } /// - /// Updates the selected opportunity stage with the color specified in the request. + /// Updates the selected opportunity stage with a color specified in the request. /// - /// Opportunity stage ID - /// New stage color + /// Opportunity stage ID + /// New stage color /// Update an opportunity stage color /// Opportunities /// /// - /// + /// /// Opportunity stage with the updated color /// + /// api/2.0/crm/opportunity/stage/{id}/color + /// PUT [Update(@"opportunity/stage/{id:[0-9]+}/color")] public DealMilestoneWrapper UpdateDealMilestoneColor(int id, string color) { @@ -160,14 +166,17 @@ public DealMilestoneWrapper UpdateDealMilestoneColor(int id, string color) /// /// Update the order of opportunity stages /// - /// List of opportunity stage IDs + /// List of opportunity stage IDs /// Opportunities - /// + /// /// Opportunity stages in the new order /// /// /// /// + /// api/2.0/crm/opportunity/stage/reorder + /// PUT + /// list [Update(@"opportunity/stage/reorder")] public IEnumerable UpdateDealMilestonesOrder(IEnumerable ids) { @@ -190,12 +199,14 @@ public IEnumerable UpdateDealMilestonesOrder(IEnumerable /// Delete an opportunity stage /// Opportunities - /// Opportunity stage ID + /// Opportunity stage ID /// /// - /// + /// /// Opportunity stage /// + /// api/2.0/crm/opportunity/stage/{id} + /// DELETE [Delete(@"opportunity/stage/{id:[0-9]+}")] public DealMilestoneWrapper DeleteDealMilestone(int id) { @@ -217,14 +228,16 @@ public DealMilestoneWrapper DeleteDealMilestone(int id) /// /// Creates a new history category with the parameters (title, description, etc.) specified in the request. /// - ///History category title - ///History category description - ///History category order - ///Image name of the history category + ///History category title + ///History category description + ///Image name of the history category + ///History category order ///Create a history category /// History - ///History category + ///History category /// + ///api/2.0/crm/history/category + ///POST [Create(@"history/category")] public HistoryCategoryWrapper CreateHistoryCategory(string title, string description, string imageName, int sortOrder) { @@ -249,16 +262,18 @@ public HistoryCategoryWrapper CreateHistoryCategory(string title, string descrip /// /// Updates the selected history category with the parameters (title, description, etc.) specified in the request. /// - ///History category ID - ///New history category title - ///New history category description - ///New history category order - ///New image name of the history category + ///History category ID + ///New history category title + ///New history category description + ///New image name of the history category + ///New history category order ///Update a history category ///History - ///Updated history category + ///Updated history category /// /// + ///api/2.0/crm/history/category/{id} + ///PUT [Update(@"history/category/{id:[0-9]+}")] public HistoryCategoryWrapper UpdateHistoryCategory(int id, string title, string description, string imageName, int sortOrder) { @@ -287,15 +302,17 @@ public HistoryCategoryWrapper UpdateHistoryCategory(int id, string title, string /// /// Updates an icon of a history category with the ID specified in the request. /// - /// History category ID - /// New icon name of the history category + /// History category ID + /// New image name of the history category /// Update a history category icon /// History /// /// - /// + /// /// History category with the updated icon /// + /// api/2.0/crm/history/category/{id}/icon + /// PUT [Update(@"history/category/{id:[0-9]+}/icon")] public HistoryCategoryWrapper UpdateHistoryCategoryIcon(int id, string imageName) { @@ -320,14 +337,17 @@ public HistoryCategoryWrapper UpdateHistoryCategoryIcon(int id, string imageName /// /// Update the order of history categories /// - /// List of history category titles + /// List of history category titles /// History - /// + /// /// History categories in the new order /// /// /// /// + /// api/2.0/crm/history/category/reorder + /// PUT + /// list [Update(@"history/category/reorder")] public IEnumerable UpdateHistoryCategoriesOrder(IEnumerable titles) { @@ -348,11 +368,13 @@ public IEnumerable UpdateHistoryCategoriesOrder(IEnumera /// /// Delete a history category /// History - /// History category ID + /// History category ID /// /// /// - /// History category + /// History category + /// api/2.0/crm/history/category/{id} + /// DELETE [Delete(@"history/category/{id:[0-9]+}")] public HistoryCategoryWrapper DeleteHistoryCategory(int id) { @@ -380,14 +402,16 @@ public HistoryCategoryWrapper DeleteHistoryCategory(int id) /// /// Creates a new task category with the parameters (title, description, etc.) specified in the request. /// - ///Task category title - ///Task category description - ///Task category order - ///Image name of task category + ///Task category title + ///Task category description + ///Image name of task category + ///Task category order ///Create a task category ///Tasks - ///Task category /// + ///Task category + ///api/2.0/crm/task/category + ///POST [Create(@"task/category")] public TaskCategoryWrapper CreateTaskCategory(string title, string description, string imageName, int sortOrder) { @@ -410,17 +434,19 @@ public TaskCategoryWrapper CreateTaskCategory(string title, string description, /// /// Updates the selected task category with the parameters (title, description, etc.) specified in the request. /// - ///Task category ID - ///New task category title - ///New task category description - ///New task category order - ///New image name of task category + ///Task category ID + ///New task category title + ///New task category description + ///New image name of task category + ///New task category order ///Update a task category ///Tasks - ///Updated task category + ///Updated task category /// /// /// + ///api/2.0/crm/task/category/{id} + ///PUT [Update(@"task/category/{id:[0-9]+}")] public TaskCategoryWrapper UpdateTaskCategory(int id, string title, string description, string imageName, int sortOrder) { @@ -449,15 +475,17 @@ public TaskCategoryWrapper UpdateTaskCategory(int id, string title, string descr /// /// Updates an icon of the task category with the ID specified in the request. /// - /// Task category ID - /// New icon name of task category + /// Task category ID + /// New icon name of task category /// Update a task category icon /// Tasks /// /// - /// + /// /// Task category with the updated icon /// + /// api/2.0/crm/task/category/{id}/icon + /// PUT [Update(@"task/category/{id:[0-9]+}/icon")] public TaskCategoryWrapper UpdateTaskCategoryIcon(int id, string imageName) { @@ -482,14 +510,17 @@ public TaskCategoryWrapper UpdateTaskCategoryIcon(int id, string imageName) /// /// Update the order of task categories /// - /// List of task category titles + /// List of task category titles /// Tasks - /// + /// /// Task categories in the new order /// /// /// /// + /// api/2.0/crm/task/category/reorder + /// PUT + /// list [Update(@"task/category/reorder")] public IEnumerable UpdateTaskCategoriesOrder(IEnumerable titles) { @@ -510,12 +541,14 @@ public IEnumerable UpdateTaskCategoriesOrder(IEnumerable /// Delete a task category /// Tasks - /// Task category ID - /// Task category ID to replace the deleted category in the tasks with the current task category - /// Task category + /// Task category ID + /// Task category ID to replace the deleted category in the tasks with the current task category /// /// /// + ///api/2.0/crm/task/category/{categoryid} + ///DELETE + ///Task category [Delete(@"task/category/{categoryid:[0-9]+}")] public TaskCategoryWrapper DeleteTaskCategory(int categoryid, int newcategoryid) { @@ -541,14 +574,16 @@ public TaskCategoryWrapper DeleteTaskCategory(int categoryid, int newcategoryid) /// /// Creates a new contact status with the parameters (title, description, etc.) specified in the request. /// - ///Contact status title - ///Contact status description - ///Contact status color - ///Contact status sort order - ///Contact status + ///Contact status title + ///Contact status description + ///Contact status color + ///Contact status sort order /// Create a contact status /// Contacts /// + /// Contact status + /// api/2.0/crm/contact/status + /// POST [Create(@"contact/status")] public ContactStatusWrapper CreateContactStatus(string title, string description, string color, int sortOrder) { @@ -571,17 +606,20 @@ public ContactStatusWrapper CreateContactStatus(string title, string description /// /// Updates the selected contact status with the parameters (title, description, etc.) specified in the request. /// - ///Contact status ID - ///New contact status title - ///New contact status description - ///New contact status color - ///New contact status sort order + ///Contact status ID + ///New contact status title + ///New contact status description + ///New contact status color + ///New contact status sort order ///Updated contact status /// Update a contact status /// Contacts /// /// /// + /// Contact status + /// api/2.0/crm/contact/status/{id} + /// PUT [Update(@"contact/status/{id:[0-9]+}")] public ContactStatusWrapper UpdateContactStatus(int id, string title, string description, string color, int sortOrder) { @@ -610,15 +648,17 @@ public ContactStatusWrapper UpdateContactStatus(int id, string title, string des /// /// Updates a color of the selected contact status with a new color specified in the request. /// - /// Contact status ID - /// New contact status color + /// Contact status ID + /// New contact status color /// Update a contact status color /// Contacts /// /// - /// - /// Contact status with the new color + /// + /// Contact status with a new color /// + /// api/2.0/crm/contact/status/{id}/color + /// PUT [Update(@"contact/status/{id:[0-9]+}/color")] public ContactStatusWrapper UpdateContactStatusColor(int id, string color) { @@ -643,14 +683,17 @@ public ContactStatusWrapper UpdateContactStatusColor(int id, string color) /// /// Update the order of contact statuses /// - /// List of contact status titles + /// List of contact status titles /// Contacts - /// + /// /// Contact statuses in the new order /// /// /// /// + /// api/2.0/crm/contact/status/reorder + /// PUT + /// list [Update(@"contact/status/reorder")] public IEnumerable UpdateContactStatusesOrder(IEnumerable titles) { @@ -671,13 +714,15 @@ public IEnumerable UpdateContactStatusesOrder(IEnumerable< /// /// Delete a contact status /// Contacts - /// Contact status ID + /// Contact status ID /// /// /// - /// + /// /// Contact status /// + /// api/2.0/crm/contact/status/{contactStatusid} + /// DELETE [Delete(@"contact/status/{contactStatusid:[0-9]+}")] public ContactStatusWrapper DeleteContactStatus(int contactStatusid) { @@ -705,12 +750,14 @@ public ContactStatusWrapper DeleteContactStatus(int contactStatusid) /// /// Returns a contact status with the ID specified in the request. /// - /// Contact status ID - /// Contact status + /// Contact status ID + /// Contact status /// Get a contact status /// Contacts /// /// + ///api/2.0/crm/contact/status/{contactStatusid} + ///GET [Read(@"contact/status/{contactStatusid:[0-9]+}")] public ContactStatusWrapper GetContactStatusByID(int contactStatusid) { @@ -723,14 +770,16 @@ public ContactStatusWrapper GetContactStatusByID(int contactStatusid) } /// - /// Creates a new contact type with the parameters (title, etc.) specified in the request. + /// Creates a new contact type with the parameters specified in the request. /// - ///Contact type title - ///Contact type sort order - ///Contact type + ///Contact type title + ///Contact type sort order /// Create a contact type /// Contacts /// + /// Contact type + /// api/2.0/crm/contact/type + /// POST [Create(@"contact/type")] public ContactTypeWrapper CreateContactType(string title, int sortOrder) { @@ -750,17 +799,20 @@ public ContactTypeWrapper CreateContactType(string title, int sortOrder) } /// - /// Updates the selected contact type with the parameters (title, description, etc.) specified in the request. + /// Updates the selected contact type with the parameters specified in the request. /// - ///Contact type ID - ///New contact type title - ///New contact type order + ///Contact type ID + ///New contact type title + ///New contact type order ///Updated contact type /// Update a contact type /// Contacts /// /// /// + /// Contact type + /// api/2.0/crm/contact/type/{id} + /// PUT [Update(@"contact/type/{id:[0-9]+}")] public ContactTypeWrapper UpdateContactType(int id, string title, int sortOrder) { @@ -790,14 +842,17 @@ public ContactTypeWrapper UpdateContactType(int id, string title, int sortOrder) /// /// Update the order of contact types /// - /// List of contact type titles + /// List of contact type titles /// Contacts - /// + /// /// Contact types in the new order /// /// /// /// + /// api/2.0/crm/contact/type/reorder + /// PUT + /// list [Update(@"contact/type/reorder")] public IEnumerable UpdateContactTypesOrder(IEnumerable titles) { @@ -818,13 +873,15 @@ public IEnumerable UpdateContactTypesOrder(IEnumerable /// Delete a contact type /// Contacts - /// Contact type ID + /// Contact type ID /// /// /// - /// + /// /// Contact type /// + /// api/2.0/crm/contact/type/{contactTypeid} + /// DELETE [Delete(@"contact/type/{contactTypeid:[0-9]+}")] public ContactTypeWrapper DeleteContactType(int contactTypeid) { @@ -852,12 +909,14 @@ public ContactTypeWrapper DeleteContactType(int contactTypeid) /// /// Returns a contact type with the ID specified in the request. /// - /// Contact type ID - /// Contact type + /// Contact type ID + /// Contact type /// Get a contact type /// Contacts /// /// + ///api/2.0/crm/contact/type/{contactTypeid} + ///GET [Read(@"contact/type/{contactTypeid:[0-9]+}")] public ContactTypeWrapper GetContactTypeByID(int contactTypeid) { @@ -872,12 +931,14 @@ public ContactTypeWrapper GetContactTypeByID(int contactTypeid) /// /// Returns an opportunity stage with the ID specified in the request. /// - /// Opportunity stage ID - /// Opportunity stage + /// Opportunity stage ID + /// Opportunity stage /// Get an opportunity stage /// Opportunities /// /// + ///api/2.0/crm/opportunity/stage/{stageid} + ///GET [Read(@"opportunity/stage/{stageid:[0-9]+}")] public DealMilestoneWrapper GetDealMilestoneByID(int stageid) { @@ -892,12 +953,14 @@ public DealMilestoneWrapper GetDealMilestoneByID(int stageid) /// /// Returns a task category with the ID specified in the request. /// - /// Task category ID - /// Task category + /// Task category ID + /// Task category /// Get a task category /// Tasks /// /// + ///api/2.0/crm/task/category/{categoryid} + ///GET [Read(@"task/category/{categoryid:[0-9]+}")] public TaskCategoryWrapper GetTaskCategoryByID(int categoryid) { @@ -912,11 +975,14 @@ public TaskCategoryWrapper GetTaskCategoryByID(int categoryid) /// /// Returns a list of all the history categories available on the portal. /// - /// Get all history categories + /// Get history categories /// History - /// + /// /// List of all the history categories /// + /// api/2.0/crm/history/category + /// GET + /// list [Read(@"history/category")] public IEnumerable GetHistoryCategoryWrapper() { @@ -935,11 +1001,14 @@ public IEnumerable GetHistoryCategoryWrapper() /// /// Returns a list of all the task categories available on the portal. /// - /// Get all task categories + /// Get task categories /// Tasks - /// + /// /// List of all the task categories /// + /// api/2.0/crm/task/category + /// GET + /// list [Read(@"task/category")] public IEnumerable GetTaskCategories() { @@ -958,11 +1027,14 @@ public IEnumerable GetTaskCategories() /// /// Returns a list of all the contact statuses available on the portal. /// - /// Get all contact statuses + /// Get contact statuses /// Contacts - /// + /// ///List of all the contact statuses /// + /// api/2.0/crm/contact/status + /// GET + /// list [Read(@"contact/status")] public IEnumerable GetContactStatuses() { @@ -981,11 +1053,14 @@ public IEnumerable GetContactStatuses() /// /// Returns a list of all the contact types available on the portal. /// - /// Get all contact types + /// Get contact types /// Contacts - /// + /// /// List of all the contact types /// + /// api/2.0/crm/contact/type + /// GET + /// list [Read(@"contact/type")] public IEnumerable GetContactTypes() { @@ -1005,11 +1080,14 @@ public IEnumerable GetContactTypes() /// /// Returns a list of all the opportunity stages available on the portal. /// - /// Get all opportunity stages + /// Get opportunity stages /// Opportunities - /// + /// /// List of all the opportunity stages /// + /// api/2.0/crm/opportunity/stage + /// GET + /// list [Read(@"opportunity/stage")] public IEnumerable GetDealMilestones() { diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.RelationshipEvent.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.RelationshipEvent.cs index 08dbf8f5c..b49f86cf5 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.RelationshipEvent.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.RelationshipEvent.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,15 +50,18 @@ public partial class CRMApi /// Get filtered events /// /// History - /// Related entity type - /// Related entity ID - /// Event category ID - /// Event author - /// Earliest event due date - /// Latest event due date - /// + /// Related entity type + /// Related entity ID + /// Event category ID + /// Event author + /// Earliest event due date + /// Latest event due date + /// /// Event list /// + /// api/2.0/crm/history/filter + /// GET + /// list [Read(@"history/filter")] public IEnumerable GetHistory( string entityType, @@ -154,15 +157,17 @@ public IEnumerable GetHistory( /// Deletes an event with the ID specified in the request and all the files associated with this event. /// /// - /// Delete an event and related files + /// Delete an event /// /// History - /// Event ID + /// Event ID /// /// - /// + /// /// Event /// + /// api/2.0/crm/history/{id} + /// DELETE [Delete(@"history/{id:[0-9]+}")] public RelationshipEventWrapper DeleteHistory(int id) { @@ -186,13 +191,15 @@ public RelationshipEventWrapper DeleteHistory(int id) /// /// Create a text file /// Files - /// Related entity type - /// Related entity ID - /// File title - /// File contents - /// + /// Related entity type + /// Related entity ID + /// File title + /// File contents + /// /// File information /// + /// api/2.0/crm/{entityType}/{entityid}/files/text + /// POST [Create(@"{entityType:(contact|opportunity|case)}/{entityid:[0-9]+}/files/text")] public FileWrapper CreateTextFile(string entityType, int entityid, string title, string content) { @@ -236,16 +243,18 @@ public FileWrapper CreateTextFile(string entityType, int entityid, string title, ///
  • Using standart multipart/form-data method.
  • /// ]]> /// - /// Related entity type - /// Related entity ID - /// Request input stream - /// Content-Type header - /// Content-Disposition header - /// List of files when posted as multipart/form-data - /// Defines if the documents in the original formats are also uploaded or not - /// - /// File informatin + /// Related entity type + /// Related entity ID + /// Request input stream + /// Content-Type header + /// Content-Disposition header + /// List of files when posted as multipart/form-data + /// Defines if the documents in the original formats are also stored or not + /// + /// File information /// + /// api/2.0/crm/{entityType}/{entityid}/files/upload + /// POST [Create(@"{entityType:(contact|opportunity|case)}/{entityid:[0-9]+}/files/upload")] public FileWrapper UploadFileInCRM( string entityType, @@ -295,22 +304,24 @@ private static FileWrapper SaveFile(object folderid, Stream file, string fileNam /// Create an event /// /// History - /// Contact ID - /// Related entity type - /// Related entity ID + /// Related entity type + /// Related entity ID + /// Contact ID /// /// /// - /// Event contents - /// Event category ID - /// Event creation date - /// List of file IDs for the current event - /// List of users who will be notified about the event - /// + /// Event contents + /// Event category ID + /// Event creation date + /// List of file IDs for the current event + /// List of users who will be notified about the event + /// /// Created event /// + /// api/2.0/crm/history + /// POST [Create(@"history")] public RelationshipEventWrapper AddHistoryTo( string entityType, @@ -386,7 +397,11 @@ public RelationshipEventWrapper AddHistoryTo( if (fileId != null) { var fileIds = fileId.ToList(); - var files = FilesDaoFactory.GetFileDao().GetFiles(fileIds.Cast().ToList()); + List files; + using (var dao = FilesDaoFactory.GetFileDao()) + { + files = dao.GetFiles(fileIds.Cast().ToList()); + } if (needNotify) { @@ -436,17 +451,23 @@ public RelationshipEventWrapper AddHistoryTo( /// /// Attach files to the entity /// - /// Entity type - /// Entity ID - /// List of IDs of the files + /// Entity type + /// Entity ID + /// List of file IDs /// Files - /// Entity with the file(s) attached + /// Entity with the file(s) attached + /// api/2.0/crm/{entityType}/{entityid}/files + /// POST [Create(@"{entityType:(contact|opportunity|case)}/{entityid:[0-9]+}/files")] public RelationshipEventWrapper AttachFiles(string entityType, int entityid, IEnumerable fileids) { if (entityid <= 0 || fileids == null) throw new ArgumentException(); - var files = FilesDaoFactory.GetFileDao().GetFiles(fileids.Cast().ToList()); + List files; + using (var dao = FilesDaoFactory.GetFileDao()) + { + files = dao.GetFiles(fileids.Cast().ToList()); + } var folderid = GetRootFolderID(); @@ -480,13 +501,15 @@ public RelationshipEventWrapper AttachFiles(string entityType, int entityid, IEn } /// - /// Returns the ID for the root folder used to store the files for the CRM module. + /// Returns the ID of the root folder used to store the CRM module files. /// /// Get root folder ID /// Files /// /// Root folder ID /// + /// api/2.0/crm/files/root + /// GET [Read(@"files/root")] public object GetRootFolderID() { @@ -496,13 +519,16 @@ public object GetRootFolderID() /// /// Returns a list of all the files for the entity with the ID and type specified in the request. /// - /// Entity type - /// Entity ID + /// Entity type + /// Entity ID /// Get entity files /// Files - /// + /// /// List of files /// + /// api/2.0/crm/{entityType}/{entityid}/files + /// GET + /// list [Read(@"{entityType:(contact|opportunity|case)}/{entityid:[0-9]+}/files")] public IEnumerable GetFiles(string entityType, int entityid) { @@ -527,18 +553,25 @@ public IEnumerable GetFiles(string entityType, int entityid) /// /// Delete a file /// Files - /// File ID + /// File ID /// /// - /// + /// /// File information /// + /// api/2.0/crm/files/{fileid} + /// DELETE [Delete(@"files/{fileid:[0-9]+}")] public FileWrapper DeleteCRMFile(int fileid) { if (fileid < 0) throw new ArgumentException(); - var file = FilesDaoFactory.GetFileDao().GetFile(fileid); + Files.Core.File file; + using (var dao = FilesDaoFactory.GetFileDao()) + { + file = dao.GetFile(fileid); + } + if (file == null) throw new ItemNotFoundException(); var result = new FileWrapper(file); diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.Reports.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.Reports.cs index c7000ff95..78942dd04 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.Reports.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.Reports.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,8 +34,11 @@ public partial class CRMApi /// Returns a list of all the user report files. /// Get report files /// Reports - /// Report files - /// if user can't create reports + /// Report files + /// If the user can't create reports + /// api/2.0/crm/report/files + /// GET + /// list [Read(@"report/files")] public IEnumerable GetFiles() { @@ -62,12 +65,15 @@ public IEnumerable GetFiles() } /// Deletes a report file with the ID specified in the request. - /// File ID + /// File ID /// Delete a report file /// Reports - /// if user can't create reports - /// if file ID is less than 0 - /// if file is not found + /// + /// If the user can't create reports + /// If file ID is less than 0 + /// If file is not found + /// api/2.0/crm/report/file/{fileid} + /// DELETE [Delete(@"report/file/{fileid:[0-9]+}")] public void DeleteFile(int fileid) { @@ -83,11 +89,13 @@ public void DeleteFile(int fileid) DaoFactory.ReportDao.DeleteFile(fileid); } - /// Returns a state of the report generation task. - /// Get report generation state + /// Returns a status of the report generation task. + /// Get the report generation status /// Reports - /// Report state - /// if user can't create reports + /// Report status + /// If the user can't create reports + /// api/2.0/crm/report/status + /// GET [Read(@"report/status")] public ReportState GetStatus() { @@ -100,7 +108,10 @@ public ReportState GetStatus() /// Terminates the report generation task. /// Terminate the report generation /// Reports - /// if user can't create reports + /// + /// If the user can't create reports + /// api/2.0/crm/report/terminate + /// GET [Read(@"report/terminate")] public void Terminate() { @@ -110,14 +121,16 @@ public void Terminate() DocbuilderReportsUtility.Terminate(ReportOrigin.CRM); } - /// Checks report data for the parameters specified in the request. - /// Report type - /// Time period - /// Managers + /// Checks the report data for the parameters specified in the request. + /// Report type + /// Report time period + /// Managers /// Check report data /// Reports /// Report information - /// if user can't create reports + /// api/2.0/crm/report/check + /// POST + /// If the user can't create reports [Create(@"report/check")] public object CheckReportData(ReportType type, ReportTimePeriod timePeriod, Guid[] managers) { @@ -132,13 +145,15 @@ public object CheckReportData(ReportType type, ReportTimePeriod timePeriod, Guid } /// Runs the report generation task with the parameters specified in the request. - /// Report type - /// Time period - /// Managers + /// Report type + /// Report time period + /// Managers /// Generate a report /// Reports - /// Report state - /// if user can't create reports + /// Report status + /// If the user can't create reports + /// api/2.0/crm/report/generate + /// POST [Create(@"report/generate")] public ReportState GenerateReport(ReportType type, ReportTimePeriod timePeriod, Guid[] managers) { diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.Tag.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.Tag.cs index 70287b120..add243644 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.Tag.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.Tag.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,14 +36,17 @@ public partial class CRMApi /// /// Returns a list of all the tags related to the entity with the ID and type specified in the request. /// - /// Entity type - /// Entity ID + /// Entity type + /// Entity ID /// Get entity tags /// Tags /// /// Tag /// /// + ///api/2.0/crm/{entityType}/tag/{entityid} + ///GET + ///list [Read(@"{entityType:(contact|opportunity|case)}/tag/{entityid:[0-9]+}")] public IEnumerable GetEntityTags(string entityType, int entityid) { @@ -78,13 +81,16 @@ public IEnumerable GetEntityTags(string entityType, int entityid) /// /// Returns a list of all the tags for the contact with the ID specified in the request. /// - /// Contact ID + /// Contact ID /// Get contact tags /// Tags /// /// List of contact tags /// + /// api/2.0/crm/contact/{contactid}/tag + /// GET /// + ///list [Read(@"contact/{contactid:[0-9]+}/tag")] public IEnumerable GetContactTags(int contactid) { @@ -98,13 +104,15 @@ public IEnumerable GetContactTags(int contactid) /// /// Creates a tag for the selected entity with a tag name specified in the request. /// - /// Entity type - /// Tag name + /// Entity type + /// Tag name /// Create a tag /// Tags /// /// Tag /// + /// api/2.0/crm/{entityType}/tag + /// POST /// [Create(@"{entityType:(contact|opportunity|case)}/tag")] public string CreateTag(string entityType, string tagName) @@ -124,13 +132,16 @@ public string CreateTag(string entityType, string tagName) /// /// Returns a list of all the tags associated with the entity type specified in the request. /// - /// Entity type - /// Get tags for entity type + /// Entity type + /// Get entity type tags /// Tags - /// + /// /// Tag /// /// + ///api/2.0/crm/{entityType}/tag + ///GET + ///list [Read(@"{entityType:(contact|opportunity|case)}/tag")] public IEnumerable GetAllTags(string entityType) { @@ -154,13 +165,15 @@ public IEnumerable GetAllTags(string entityType) /// /// Add a tag to the entities /// Tags - /// Entity type - /// List of entity IDs - /// Tag name + /// Entity type + /// List of entity IDs + /// Tag name /// /// /// Tag /// + /// api/2.0/crm/{entityType}/taglist + /// POST [Create(@"{entityType:(contact|opportunity|case)}/taglist")] public string AddTagToBatch(string entityType, IEnumerable entityid, string tagName) { @@ -177,19 +190,21 @@ public string AddTagToBatch(string entityType, IEnumerable entityid, string /// /// Adds the selected tag to the group of contacts with the parameters specified in the request. /// - /// Add a tag to a contact group + /// Add a tag to contacts /// Tags - /// Contact tags - /// Contact stage ID (warmth) - /// Contact type ID - /// Contact list view - /// Start date - /// End date - /// Tag name + /// Contact tags + /// Contact stage ID (warmth) + /// Contact type ID + /// Contact list view + /// Start date + /// End date + /// Tag name /// /// /// Tag /// + /// api/2.0/crm/contact/filter/taglist + /// POST [Create(@"contact/filter/taglist")] public string AddTagToBatchContacts( IEnumerable tags, @@ -224,21 +239,23 @@ public string AddTagToBatchContacts( /// /// Adds the selected tag to the group of opportunities with the parameters specified in the request. /// - /// Add a tag to an opportunity group + /// Add a tag to opportunities /// Tags - /// Opportunity responsible ID - /// Opportunity stage ID - /// Opportunity tags - /// Contact ID - /// Participation status: take into account opportunities where the contact is a participant or not - /// Start date - /// End date - /// Opportunity stage type - /// Tag name + /// Opportunity responsible ID + /// Opportunity stage ID + /// Opportunity tags + /// Contact ID + /// Opportunity stage type + /// Participation status: take into account opportunities where the contact is a participant or not + /// Start date + /// End date + /// Tag name /// /// /// Tag /// + /// api/2.0/crm/opportunity/filter/taglist + /// POST [Create(@"opportunity/filter/taglist")] public string AddTagToBatchDeals( Guid responsibleid, @@ -273,16 +290,18 @@ public string AddTagToBatchDeals( /// /// Adds the selected tag to the group of cases with the parameters specified in the request. /// - /// Add a tag to a case group + /// Add a tag to cases /// Tags - /// Contact ID - /// Case status - /// Case tags - /// Tag name + /// Contact ID + /// Case status: closed or not + /// Case tags + /// Tag name /// /// /// Tag /// + /// api/2.0/crm/case/filter/taglist + /// POST [Create(@"case/filter/taglist")] public string AddTagToBatchCases(int contactid, bool? isClosed, IEnumerable tags, string tagName) { @@ -304,8 +323,11 @@ public string AddTagToBatchCases(int contactid, bool? isClosed, IEnumerable /// Delete unused tags /// Tags - /// Entity type + /// Entity type /// Tags + /// api/2.0/crm/{entityType}/tag/unused + /// DELETE + /// list [Delete(@"{entityType:(contact|opportunity|case)}/tag/unused")] public IEnumerable DeleteUnusedTag(string entityType) { @@ -325,13 +347,15 @@ public IEnumerable DeleteUnusedTag(string entityType) /// /// Add a tag to the entity /// Tags - /// Entity type - /// Entity ID - /// Tag name + /// Entity type + /// Entity ID + /// Tag name /// /// /// Tag /// + /// api/2.0/crm/{entityType}/{entityid}/tag + /// POST [Create(@"{entityType:(contact|opportunity|case)}/{entityid:[0-9]+}/tag")] public string AddTagTo(string entityType, int entityid, string tagName) { @@ -355,9 +379,9 @@ public string AddTagTo(string entityType, int entityid, string tagName) /// Adds the selected tag to the entity (company or person) specified in the request and to all the related contacts. /// /// Add a tag to the entity and related contacts - /// Entity type - /// Entity ID - /// Tag name + /// Entity type + /// Entity ID + /// Tag name /// Tags /// /// @@ -365,6 +389,8 @@ public string AddTagTo(string entityType, int entityid, string tagName) /// /// Tag /// + /// POST + /// api/2.0/crm/{entityType}/{entityid}/tag/group [Create(@"{entityType:(company|person)}/{entityid:[0-9]+}/tag/group")] public string AddContactTagToGroup(string entityType, int entityid, string tagName) { @@ -444,15 +470,17 @@ public string AddContactTagToGroup(string entityType, int entityid, string tagNa /// /// Deletes the selected tag from the entities with the type specified in the request. /// - /// Delete a tag from the entities - /// Entity type - /// Tag name + /// Delete a tag from entities + /// Entity type + /// Tag name /// Tags /// /// /// /// Tag /// + /// api/2.0/crm/{entityType}/tag + /// DELETE [Delete(@"{entityType:(contact|opportunity|case)}/tag")] public string DeleteTag(string entityType, string tagName) { @@ -474,15 +502,17 @@ public string DeleteTag(string entityType, string tagName) /// /// Deletes the selected tag from the entity with the type and ID specified in the request. /// - /// Delete a tag from the entity + /// Delete an entity tag /// Tags - /// Entity type - /// Entity ID - /// Tag name + /// Entity type + /// Entity ID + /// Tag name /// /// /// Tag /// + /// api/2.0/crm/{entityType}/{entityid}/tag + /// DELETE [Delete(@"{entityType:(contact|opportunity|case)}/{entityid:[0-9]+}/tag")] public string DeleteTagFrom(string entityType, int entityid, string tagName) { @@ -508,9 +538,9 @@ public string DeleteTagFrom(string entityType, int entityid, string tagName) /// Deletes the selected tag from the entity (company or person) specified in the request and from all the related contacts. /// /// Delete a tag from the entity and related contacts - /// Entity type - /// Entity ID - /// Tag name + /// Entity type + /// Entity ID + /// Tag name /// Tags /// /// @@ -518,6 +548,8 @@ public string DeleteTagFrom(string entityType, int entityid, string tagName) /// /// Tag /// + /// api/2.0/crm/{entityType}/{entityid}/tag/group + /// DELETE [Delete(@"{entityType:(company|person)}/{entityid:[0-9]+}/tag/group")] public string DeleteContactTagFromGroup(string entityType, int entityid, string tagName) { diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.TaskTemplate.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.TaskTemplate.cs index ef474a3de..98b03a5f2 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.TaskTemplate.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.TaskTemplate.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,14 +32,16 @@ public partial class CRMApi /// /// Creates a new task template container with the type and title specified in the request. /// - /// Entity type - /// Template container title + /// Entity type + /// Template container title /// Create a task template container /// Task templates /// /// Task template container /// /// + /// api/2.0/crm/{entityType}/tasktemplatecontainer + /// POST /// false [Create(@"{entityType:(contact|person|company|opportunity|case)}/tasktemplatecontainer")] public TaskTemplateContainerWrapper CreateTaskTemplateContainer(string entityType, string title) @@ -59,12 +61,15 @@ public TaskTemplateContainerWrapper CreateTaskTemplateContainer(string entityTyp /// /// Returns a complete list of all the task template containers available on the portal. /// - /// Entity type + /// Entity type /// Get task template containers /// Task templates /// /// List of task template containers /// + /// api/2.0/crm/{entityType}/tasktemplatecontainer + /// GET + /// list /// false [Read(@"{entityType:(contact|person|company|opportunity|case)}/tasktemplatecontainer")] public IEnumerable GetTaskTemplateContainers(string entityType) @@ -75,7 +80,7 @@ public IEnumerable GetTaskTemplateContainers(strin /// /// Deletes a task template container with the ID specified in the request. /// - /// Task template container ID + /// Task template container ID /// Delete a task template container /// Task templates /// @@ -83,6 +88,8 @@ public IEnumerable GetTaskTemplateContainers(strin /// /// /// + /// api/2.0/crm/tasktemplatecontainer/{containerid} + /// DELETE /// false [Delete(@"tasktemplatecontainer/{containerid:[0-9]+}")] public TaskTemplateContainerWrapper DeleteTaskTemplateContainer(int containerid) @@ -100,8 +107,8 @@ public TaskTemplateContainerWrapper DeleteTaskTemplateContainer(int containerid) /// /// Updates a task template container with the ID specified in the request. /// - /// Task template container ID - /// New template container title + /// Task template container ID + /// New template container title /// Update a task template container /// Task templates /// @@ -109,6 +116,8 @@ public TaskTemplateContainerWrapper DeleteTaskTemplateContainer(int containerid) /// /// /// + /// api/2.0/crm/tasktemplatecontainer/{containerid} + /// PUT /// false [Update(@"tasktemplatecontainer/{containerid:[0-9]+}")] public TaskTemplateContainerWrapper UpdateTaskTemplateContainer(int containerid, string title) @@ -128,7 +137,7 @@ public TaskTemplateContainerWrapper UpdateTaskTemplateContainer(int containerid, /// /// Returns the detailed information on the task template container with the ID specified in the request. /// - /// Task template container ID + /// Task template container ID /// Get a task template container by ID /// Task templates /// @@ -136,6 +145,8 @@ public TaskTemplateContainerWrapper UpdateTaskTemplateContainer(int containerid, /// /// /// + /// api/2.0/crm/tasktemplatecontainer/{containerid} + /// GET /// false [Read(@"tasktemplatecontainer/{containerid:[0-9]+}")] public TaskTemplateContainerWrapper GetTaskTemplateContainerByID(int containerid) @@ -151,7 +162,7 @@ public TaskTemplateContainerWrapper GetTaskTemplateContainerByID(int containerid /// /// Returns a list of all the tasks in the container with the ID specified in the request. /// - /// Task template container ID + /// Task template container ID /// Get container tasks /// Task templates /// @@ -159,6 +170,9 @@ public TaskTemplateContainerWrapper GetTaskTemplateContainerByID(int containerid /// /// /// + /// api/2.0/crm/tasktemplatecontainer/{containerid}/tasktemplate + /// GET + /// list /// false [Read(@"tasktemplatecontainer/{containerid:[0-9]+}/tasktemplate")] public IEnumerable GetTaskTemplates(int containerid) @@ -174,19 +188,21 @@ public IEnumerable GetTaskTemplates(int containerid) /// /// Creates a new task template with the parameters specified in the request in the container with the selected ID. /// - /// Task template container ID - /// Task template title - /// Task template description - /// Task template responsible ID - /// Task template category ID - /// Responsible notification: notifies or not - /// Tick offset - /// Defines if the deadline is fixed or not + /// Task template container ID + /// Task template title + /// Task template description + /// Task template responsible ID + /// Task template category ID + /// Responsible notification: notifies or not + /// Tick offset + /// Defines if the deadline is fixed or not /// Create a task template /// Task templates /// Task template /// /// + /// api/2.0/crm/tasktemplatecontainer/{containerid}/tasktemplate + /// POST /// false [Create(@"tasktemplatecontainer/{containerid:[0-9]+}/tasktemplate")] public TaskTemplateWrapper CreateTaskTemplate( @@ -225,20 +241,22 @@ bool deadLineIsFixed /// /// Updates the selected task template with the parameters specified in the request. /// - /// Task template ID - /// New task template container ID - /// New task template title - /// New task template description - /// New task template responsible ID - /// New task template category ID - /// Responsible notification: notifies or not - /// New tick offset - /// Defines if the deadline is fixed or not + /// Task template ID + /// New task template container ID + /// New task template title + /// New task template description + /// New task template responsible ID + /// New task template category ID + /// Responsible notification: notifies or not + /// New tick offset + /// Defines if the deadline is fixed or not /// Update a task template /// Task templates /// Task template /// /// + /// api/2.0/crm/tasktemplatecontainer/{containerid}/tasktemplate + /// PUT /// false [Update(@"tasktemplatecontainer/{containerid:[0-9]+}/tasktemplate")] public TaskTemplateWrapper UpdateTaskTemplate( @@ -282,12 +300,14 @@ bool deadLineIsFixed /// /// Deletes a task template with the ID specified in the request. /// - /// Task template ID + /// Task template ID /// Delete a task template /// Task templates /// Task template /// /// + /// api/2.0/crm/tasktemplatecontainer/tasktemplate/{id} + /// DELETE /// false [Delete(@"tasktemplatecontainer/tasktemplate/{id:[0-9]+}")] public TaskTemplateWrapper DeleteTaskTemplate(int id) @@ -307,12 +327,14 @@ public TaskTemplateWrapper DeleteTaskTemplate(int id) /// /// Returns a task template with the ID specified in the request. /// - /// Task template ID + /// Task template ID /// Get a task template by ID /// Task templates /// Task template /// /// + /// api/2.0/crm/tasktemplatecontainer/tasktemplate/{id} + /// GET /// false [Read(@"tasktemplatecontainer/tasktemplate/{id:[0-9]+}")] public TaskTemplateWrapper GetTaskTemplateByID(int id) diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.Tasks.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.Tasks.cs index 7e7ed0380..d5352fd5d 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.Tasks.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.Tasks.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,14 +34,16 @@ namespace ASC.Api.CRM public partial class CRMApi { /// - /// Returns the detailed information about a task with the ID specified in the request. + /// Returns the detailed information about a task with the ID specified in the request. /// - /// Task ID - /// Task + /// Task ID + /// Task /// Get task by ID /// Tasks /// /// + ///api/2.0/crm/task/{taskid} + ///GET [Read(@"task/{taskid:[0-9]+}")] public TaskWrapper GetTaskByID(int taskid) { @@ -59,21 +61,24 @@ public TaskWrapper GetTaskByID(int taskid) } /// - /// Returns a list of tasks matching the parameters specified in the request. + /// Returns a list of tasks matching the parameters specified in the request. /// - /// Task responsible ID - /// Task category ID - /// Task status - /// Earliest task due date - /// Latest task due date - /// Related entity type - /// Related entity ID + /// Task responsible ID + /// Task category ID + /// Task status + /// Earliest task due date + /// Latest task due date + /// Related entity type + /// Related entity ID /// /// Get tasks /// Tasks - /// + /// /// List of all tasks /// + /// api/2.0/crm/task/filter + /// GET + /// list [Read(@"task/filter")] public IEnumerable GetAllTasks( Guid responsibleid, @@ -186,11 +191,13 @@ public IEnumerable GetAllTasks( /// /// Reopen a task /// Tasks - /// Task ID + /// Task ID /// - /// + /// /// Task /// + /// api/2.0/crm/task/{taskid}/reopen + /// PUT [Update(@"task/{taskid:[0-9]+}/reopen")] public TaskWrapper ReOpenTask(int taskid) { @@ -209,11 +216,13 @@ public TaskWrapper ReOpenTask(int taskid) /// /// Close a task /// Tasks - /// Task ID + /// Task ID /// - /// + /// /// Task /// + /// api/2.0/crm/task/{taskid}/close + /// PUT [Update(@"task/{taskid:[0-9]+}/close")] public TaskWrapper CloseTask(int taskid) { @@ -232,12 +241,14 @@ public TaskWrapper CloseTask(int taskid) /// /// Delete a task /// Tasks - /// Task ID + /// Task ID /// /// - /// + /// /// Deleted task /// + /// api/2.0/crm/task/{taskid} + /// DELETE [Delete(@"task/{taskid:[0-9]+}")] public TaskWrapper DeleteTask(int taskid) { @@ -255,20 +266,22 @@ public TaskWrapper DeleteTask(int taskid) /// /// Creates a task with the parameters (title, description, due date, etc.) specified in the request. /// - /// Task title - /// Task description - /// Task due date - /// Task responsible ID - /// Task category ID - /// Contact ID - /// Related entity type - /// Related entity ID - /// Notifies the responsible about the task - /// Time period in minutes to remind the responsible of the task + /// Task title + /// Task description + /// Task due date + /// Task responsible ID + /// Task category ID + /// Contact ID + /// Related entity type + /// Related entity ID + /// Notifies the responsible about the task or not + /// Time period in minutes to remind the responsible of the task /// /// Create a task /// Tasks - /// Task + /// Task + /// api/2.0/crm/task + /// POST [Create(@"task")] public TaskWrapper CreateTask( string title, @@ -345,20 +358,23 @@ int alertValue /// /// Creates a group of the same task with the parameters (title, description, due date, etc.) specified in the request for several contacts. /// - /// Task title - /// Task description - /// Task due date - /// Task responsible ID - /// Task category ID - /// List of contact IDs - /// Related entity type - /// Related entity ID - /// Notifies the responsible about the task - /// Time period in minutes to remind the responsible of the task + /// Task title + /// Task description + /// Task due date + /// Task responsible ID + /// Task category ID + /// List of contact IDs + /// Related entity type + /// Related entity ID + /// Notifies the responsible about the task or not + /// Time period in minutes to remind the responsible of the task /// /// Create a task group /// Tasks /// Tasks + /// api/2.0/crm/contact/task/group + /// POST + /// list /// false [Create(@"contact/task/group")] public IEnumerable CreateTaskGroup( @@ -456,20 +472,22 @@ public IEnumerable CreateTaskGroup( /// /// Updates the selected task with the parameters (title, description, due date, etc.) specified in the request. /// - /// Task ID - /// New task title - /// New task description - /// New task due date - /// New task responsible ID - /// New task category ID - /// New contact ID - /// New related entity type - /// New related entity ID - /// Notifies the responsible about the task - /// New time period in minutes to remind the responsible of the task + /// Task ID + /// New task title + /// New task description + /// New task due date + /// New task responsible ID + /// New task category ID + /// New contact ID + /// New related entity type + /// New related entity ID + /// Notifies the responsible about the task or not + /// New time period in minutes to remind the responsible of the task /// Update a task /// Tasks - /// Task + /// Task + /// api/2.0/crm/task/{taskid} + /// PUT [Update(@"task/{taskid:[0-9]+}")] public TaskWrapper UpdateTask( int taskid, @@ -545,10 +563,12 @@ public TaskWrapper UpdateTask( /// /// Sets the creation date to the task with the ID specified in the request. /// - /// Task ID - /// Task creation date + /// Task ID + /// Task creation date /// Set the task creation date /// Tasks + /// api/2.0/crm/task/{taskid}/creationdate + /// PUT /// false [Update(@"task/{taskid:[0-9]+}/creationdate")] public void SetTaskCreationDate(int taskId, ApiDateTime creationDate) @@ -565,10 +585,12 @@ public void SetTaskCreationDate(int taskId, ApiDateTime creationDate) /// /// Sets the last modified date to the task with the ID specified in the request. /// - /// Task ID - /// Task last modified date + /// Task ID + /// Task last modified date /// Set the task last modified date /// Tasks + /// api/2.0/crm/task/{taskid}/lastmodifeddate + /// PUT /// false [Update(@"task/{taskid:[0-9]+}/lastmodifeddate")] public void SetTaskLastModifedDate(int taskId, ApiDateTime lastModifedDate) diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.Utils.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.Utils.cs index 4d16744be..5900364c1 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.Utils.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.Utils.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,16 +32,20 @@ namespace ASC.Api.CRM { + ///crm public partial class CRMApi { /// /// Returns a list of all the currencies currently available on the portal. /// /// Get available currencies - /// Common - /// + /// Currencies + /// /// List of available currencies /// + /// api/2.0/crm/settings/currency + /// GET + /// list [Read(@"settings/currency")] public IEnumerable GetAvaliableCurrency() { @@ -51,14 +55,16 @@ public IEnumerable GetAvaliableCurrency() /// /// Returns a result of converting one currency into another. /// - /// Amount to convert - /// Currency to be converted - /// Currency into which the original currency will be converted + /// Amount to convert + /// Currency to convert + /// Currency into which the original currency will be converted /// Convert a currency - /// Common + /// Currencies /// /// Decimal result of converting /// + /// api/2.0/crm/settings/currency/convert + /// GET [Read(@"settings/currency/convert")] public Decimal ConvertAmount(Decimal amount, String fromcurrency, String tocurrency) { @@ -68,13 +74,16 @@ public Decimal ConvertAmount(Decimal amount, String fromcurrency, String tocurre /// /// Returns a summary table with the rates for the currency specified in the request. /// - /// Currency (abbreviation) - /// Get currency rates - /// Common - /// - /// Dictionary of currency rates + /// Currency (abbreviation) + /// Get currency summary table + /// Currencies + /// + /// Dictionary of currency rates for the specified currency /// /// + /// api/2.0/crm/settings/currency/summarytable + /// GET + /// list [Read(@"settings/currency/summarytable")] public IEnumerable GetSummaryTable(String currency) { @@ -96,13 +105,15 @@ public IEnumerable GetSummaryTable(String currency) /// /// Updates the contact status setting with the parameter specified in the request. /// - /// Defines if the contact status setting is changed automatically or not + /// Defines if the contact status setting is changed automatically or not /// Update the contact status setting /// Contacts /// /// Updated contact status setting value (true, false or null) /// /// + /// api/2.0/crm/contact/status/settings + /// PUT [Update(@"contact/status/settings")] public Boolean? UpdateCRMContactStatusSettings(Boolean? changeContactStatusGroupAuto) { @@ -118,13 +129,15 @@ public IEnumerable GetSummaryTable(String currency) /// /// Updates the setting for writing mails to the history with the parameter specified in the request. /// - /// Defines if the mails are written to the history automatically or not + /// Defines if the mails are written to the history automatically or not /// Update the setting for writing mails to the history /// Contacts /// /// Updated setting for writing mails to the history (true or false) /// /// + /// api/2.0/crm/contact/mailtohistory/settings + /// PUT [Update(@"contact/mailtohistory/settings")] public Boolean UpdateCRMWriteMailToHistorySettings(Boolean writeMailToHistoryAuto) { @@ -139,13 +152,15 @@ public Boolean UpdateCRMWriteMailToHistorySettings(Boolean writeMailToHistoryAut /// /// Updates the setting for adding tags to the contact with the parameter specified in the request. /// - /// Defines if a tag is added to the contact automatically or not + /// Defines if a tag is added to the contact automatically or not /// Update the setting for adding tags to the contact /// Contacts /// - /// Setting for adding tags to contact (true, false or null) + /// Updated setting for adding tags to the contact (true, false or null) /// /// + /// api/2.0/crm/contact/tag/settings + /// PUT [Update(@"contact/tag/settings")] public Boolean? UpdateCRMContactTagSettings(Boolean? addTagToContactGroupAuto) { @@ -158,17 +173,18 @@ public Boolean UpdateCRMWriteMailToHistorySettings(Boolean writeMailToHistoryAut return addTagToContactGroupAuto; } - /// - /// Sets the tenant setting for portal configuration and website contact form key specified in the request. + /// Sets the tenant settings specified in the request to the portal. /// - /// Defines if the tenant setting for portal configuration is set or not - /// Website contact form key - /// Set the tenant setting - /// Common + /// Defines if the portal is configured or not + /// Website contact form key + /// Set the tenant settings + /// Contacts /// - /// Tenant setting for portal configuration value (true or false) + /// The tenant setting for the portal configuration value (true or false) /// + /// api/2.0/crm/settings + /// PUT [Update(@"settings")] public Boolean SetIsPortalConfigured(Boolean? configured, Guid? webFormKey) { @@ -183,10 +199,12 @@ public Boolean SetIsPortalConfigured(Boolean? configured, Guid? webFormKey) /// /// Updates a company name with the one specified in the request. /// - /// New company name + /// New company name /// Update a company name - /// Organisation + /// Organization /// Updated company name + /// api/2.0/crm/settings/organisation/base + /// PUT /// [Update(@"settings/organisation/base")] public String UpdateOrganisationSettingsCompanyName(String companyName) @@ -207,17 +225,19 @@ public String UpdateOrganisationSettingsCompanyName(String companyName) } /// - /// Updates the company address with the one specified in the request. + /// Updates a company address with the one specified in the request. /// - /// New company street/building/apartment - /// New company city - /// New company state - /// New company zip - /// New company country - /// Update the company address - /// Organisation + /// New company street/building/apartment + /// New company city + /// New company state + /// New company zip + /// New company country + /// Update a company address + /// Organization /// Updated company address /// + /// api/2.0/crm/settings/organisation/address + /// PUT [Update(@"settings/organisation/address")] public String UpdateOrganisationSettingsCompanyAddress(String street, String city, String state, String zip, String country) { @@ -250,14 +270,16 @@ public String UpdateOrganisationSettingsCompanyAddress(String street, String cit } /// - /// Updates the organisation logo setting with the parameter specified in the request. + /// Updates the organization logo setting with the parameter specified in the request. /// - /// Resets organisation logo or not - /// Update the organisation logo setting - /// Organisation - /// Organisation logo ID + /// Resets the organization logo or not + /// Update the organization logo setting + /// Organization + /// Organization logo ID /// /// + /// api/2.0/crm/settings/organisation/logo + /// PUT [Update(@"settings/organisation/logo")] public Int32 UpdateOrganisationSettingsLogo(bool reset) { @@ -290,13 +312,15 @@ public Int32 UpdateOrganisationSettingsLogo(bool reset) } /// - /// Returns an organisation logo with the ID specified in the request in the base64 format. + /// Returns an organization logo with the ID specified in the request in the base64 format. /// - /// Organisation logo ID - /// Get an organisation logo - /// Organisation - /// Organisation logo in the base64 format + /// Organization logo ID + /// Get an organization logo + /// Organization + /// Organization logo in the base64 format /// + /// api/2.0/crm/settings/organisation/logo + /// GET [Read(@"settings/organisation/logo")] public String GetOrganisationSettingsLogo(int id) { @@ -319,10 +343,12 @@ public String GetOrganisationSettingsLogo(int id) /// /// Updates the website contact form key. /// - /// Update web form key - /// Common + /// Update the web form key + /// Contacts /// Updated web form key /// + /// api/2.0/crm/settings/webformkey/change + /// PUT [Update(@"settings/webformkey/change")] public string ChangeWebToLeadFormKey() { @@ -340,12 +366,14 @@ public string ChangeWebToLeadFormKey() /// /// Updates the default CRM currency with the currency specified in the request. /// - /// Currency (abbreviation) + /// Currency (abbreviation) /// Update a currency - /// Common - /// Updated currency + /// Currencies + /// Updated currency /// /// + /// api/2.0/crm/settings/currency + /// PUT [Update(@"settings/currency")] public CurrencyInfoWrapper UpdateCRMCurrency(String currency) { @@ -366,13 +394,15 @@ public CurrencyInfoWrapper UpdateCRMCurrency(String currency) } /// - /// Starts the import from the csv file specified in the request. + /// Starts an import of the contacts, opportunities, cases, or tasks from the csv file specified in the request. /// - /// Entity type - /// URI to the csv file - /// JSON settings in the string format + /// Entity type + /// URI to the csv file + /// JSON settings in the string format /// Start import from csv file - /// Common + /// Import + /// api/2.0/crm/{entityType}/import/start + /// POST /// false [Create(@"{entityType:(contact|opportunity|case|task)}/import/start")] public string StartImportFromCSV(string entityType, string csvFileURI, string jsonSettings) @@ -403,12 +433,14 @@ public string StartImportFromCSV(string entityType, string csvFileURI, string js } /// - /// Returns a status of import from the csv file. + /// Returns an import status of the csv file. /// - /// Entity type + /// Entity type /// Get import status - /// Common + /// Import /// Import status + /// api/2.0/crm/{entityType}/import/status + /// GET /// false [Read(@"{entityType:(contact|opportunity|case|task)}/import/status")] public IProgressItem GetImportFromCSVStatus(string entityType) @@ -440,12 +472,14 @@ public IProgressItem GetImportFromCSVStatus(string entityType) /// /// Returns a sample row from the imported csv file specified in the request. /// - /// URI to the csv file - /// Sample row index - /// JSON settings in the string format + /// URI to the csv file + /// Sample row index + /// JSON settings in the string format /// Get a sample row - /// Common + /// Import /// Sample row + /// api/2.0/crm/import/samplerow + /// GET /// false [Read(@"import/samplerow")] public String GetImportFromCSVSampleRow(string csvFileURI, int indexRow, string jsonSettings) @@ -460,13 +494,15 @@ public String GetImportFromCSVSampleRow(string csvFileURI, int indexRow, string } /// - /// Processes the fake upload of the csv file specified in the request. + /// Processes a fake upload of the csv file specified in the request. /// - /// URI to the csv file - /// JSON settings in the string format + /// URI to the csv file + /// JSON settings in the string format /// Process fake upload - /// Common + /// Import /// Uploaded file + /// api/2.0/crm/import/uploadfake + /// POST /// false [Create(@"import/uploadfake")] public FileUploadResult ProcessUploadFake(string csvFileURI, string jsonSettings) @@ -475,11 +511,13 @@ public FileUploadResult ProcessUploadFake(string csvFileURI, string jsonSettings } /// - /// Returns a status of export to the csv file. + /// Returns an export status of the csv file. /// /// Get export status - /// Common + /// Export /// Export status + /// api/2.0/crm/export/status + /// GET /// false [Read(@"export/status")] public IProgressItem GetExportStatus() @@ -489,11 +527,13 @@ public IProgressItem GetExportStatus() } /// - /// Cancels the export to the csv file. + /// Cancels an export to the csv file. /// /// Cancel export to csv file - /// Common + /// Export /// Export status + /// api/2.0/crm/export/cancel + /// PUT /// false [Update(@"export/cancel")] public IProgressItem CancelExport() @@ -504,11 +544,13 @@ public IProgressItem CancelExport() } /// - /// Starts the export to the csv file. + /// Starts an export to the csv file. /// /// Start export to csv file - /// Common + /// Export /// Export data operation + /// api/2.0/crm/export/start + /// POST /// false [Create(@"export/start")] public IProgressItem StartExport() @@ -524,8 +566,10 @@ public IProgressItem StartExport() /// Returns a status of partial export to the csv file. /// /// Get status of partial export - /// Common + /// Export /// Partial export status + /// api/2.0/crm/export/partial/status + /// GET /// false [Read(@"export/partial/status")] public IProgressItem GetPartialExportStatus() @@ -534,11 +578,13 @@ public IProgressItem GetPartialExportStatus() } /// - /// Cancels the partial export to the csv file. + /// Cancels a partial export to the csv file. /// /// Cancel partial export to csv file - /// Common + /// Export /// Partial export status + /// api/2.0/crm/export/partial/cancel + /// PUT /// false [Update(@"export/partial/cancel")] public IProgressItem CancelPartialExport() @@ -548,13 +594,15 @@ public IProgressItem CancelPartialExport() } /// - /// Starts the partial export to the csv file. + /// Starts a partial export to the csv file. /// - /// Entity type - /// Filter string in the base64 format + /// Entity type + /// Filter string in the base64 format /// Start partial export to csv file - /// Common + /// Export /// Export data operation + /// api/2.0/crm/export/partial/{entityType}/start + /// POST /// false [Create(@"export/partial/{entityType:(contact|opportunity|case|task|invoiceitem)}/start")] public IProgressItem StartPartialExport(string entityType, string base64FilterString) diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.Voip.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.Voip.cs index 279cccba6..ff819c6d3 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.Voip.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.Voip.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -49,13 +49,16 @@ public partial class CRMApi /// /// Returns all the available phone numbers matching the parameters specified in the request. /// - /// Number type - /// ISO country code - /// Get available phone numbers - /// Voip - /// Phone numbers + /// Number type + /// ISO country code + /// Get filtered phone numbers + /// VoIP + /// Phone numbers /// /// + /// api/2.0/crm/voip/numbers/available + /// GET + /// list [Read(@"voip/numbers/available")] public IEnumerable GetAvailablePhoneNumbers(PhoneNumberType numberType, string isoCountryCode) { @@ -69,9 +72,12 @@ public IEnumerable GetAvailablePhoneNumbers(PhoneNumberType numberTyp /// Returns a list of all the unlinked phone numbers. /// /// Get unlinked phone numbers - /// Voip - /// List of unlinked phone numbers + /// VoIP + /// List of unlinked phone numbers /// + /// api/2.0/crm/voip/numbers/unlinked + /// GET + /// list [Read(@"voip/numbers/unlinked")] public IEnumerable GetUnlinkedPhoneNumbers() { @@ -87,9 +93,12 @@ public IEnumerable GetUnlinkedPhoneNumbers() /// Returns all the existing phone numbers. /// /// Get all phone numbers - /// Voip - /// Existing phone numbers + /// VoIP + /// Existing phone numbers /// + /// api/2.0/crm/voip/numbers/existing + /// GET + /// list [Read(@"voip/numbers/existing")] public IEnumerable GetExistingPhoneNumbers() { @@ -100,11 +109,13 @@ public IEnumerable GetExistingPhoneNumbers() /// /// Buys a phone number specified in the request. /// - /// Phone number + /// Phone number /// Buy a phone number - /// Voip - /// Phone number + /// VoIP + /// Phone number /// + /// api/2.0/crm/voip/numbers + /// POST [Create(@"voip/numbers")] public VoipPhone BuyNumber(string number) { @@ -120,13 +131,15 @@ public VoipPhone BuyNumber(string number) } /// - /// Links a new phone number with the ID specified in the request to the voip provider. + /// Links a new phone number with the ID specified in the request to the VoIP provider. /// - /// Phone number ID + /// Phone number ID /// Link a phone number - /// Voip - /// Phone number + /// VoIP + /// Phone number /// + /// api/2.0/crm/voip/numbers/link + /// POST [Create(@"voip/numbers/link")] public VoipPhone LinkNumber(string id) { @@ -169,11 +182,13 @@ public void SetDefaultAudio(VoipPhone newPhone) /// /// Deletes a phone number with the ID specified in the request. /// - /// Phone number ID + /// Phone number ID /// Delete a phone number - /// Voip - /// Phone number + /// VoIP + /// Phone number /// + /// api/2.0/crm/voip/numbers/{numberId} + /// DELETE [Delete(@"voip/numbers/{numberId:\w+}")] public VoipPhone DeleteNumber(string numberId) { @@ -192,11 +207,13 @@ public VoipPhone DeleteNumber(string numberId) /// /// Returns a phone number with the ID specified in the request. /// - /// Phone number ID + /// Phone number ID /// Get a phone number - /// Voip - /// Phone number + /// VoIP + /// Phone number /// + /// api/2.0/crm/voip/numbers/{numberId} + /// GET [Read(@"voip/numbers/{numberId:\w+}")] public VoipPhone GetNumber(string numberId) { @@ -207,8 +224,10 @@ public VoipPhone GetNumber(string numberId) /// Returns the current phone number. /// /// Get the current phone number - /// Voip - /// Current phone number + /// VoIP + /// Current phone number + /// api/2.0/crm/voip/numbers/current + /// GET [Read(@"voip/numbers/current")] public VoipPhone GetCurrentNumber() { @@ -218,9 +237,11 @@ public VoipPhone GetCurrentNumber() /// /// Returns a token for the current phone number. /// - /// Get a token - /// Voip + /// Get a phone number token + /// VoIP /// Token + /// api/2.0/crm/voip/token + /// GET [Read(@"voip/token")] public string GetToken() { @@ -230,19 +251,21 @@ public string GetToken() /// /// Updates the settings of the phone number with the ID specified in the request. /// - /// Phone number ID - /// New phone number greeting audio - /// New phone number audio for holding up - /// New phone number waiting URL - /// New phone number voice mail - /// New phone number working hours - /// Defines if a phone number allows making the outgoing calls or not - /// Defines if the phone number allows recording the calls or not - /// New phone number alias - /// Update phone number settings - /// Voip - /// Updated phone number settings + /// Phone number ID + /// New first greeting that callers hear when they call to this phone number + /// New music on hold that callers hear when they are placed in the waiting queue + /// New URL to which the customer is redirected to the voice mail service when the waiting timeout is exceeded + /// New message that callers hear when the waiting queue length or max waiting time is exceeded and the callers are able to leave a voicemail message + /// New phone number working hours + /// Defines if a phone number allows making the outgoing calls or not + /// Defines if the phone number allows recording the calls or not + /// New phone number alias + /// Update the phone number settings + /// VoIP + /// Updated phone number settings /// + /// api/2.0/crm/voip/numbers/{numberId}/settings + /// PUT [Update(@"voip/numbers/{numberId:\w+}/settings")] public VoipPhone UpdateSettings(string numberId, string greeting, string holdUp, string wait, string voiceMail, WorkingHours workingHours, bool? allowOutgoingCalls, bool? record, string alias) { @@ -286,14 +309,16 @@ public VoipPhone UpdateSettings(string numberId, string greeting, string holdUp, } /// - /// Updates the voip settings with the parameters specified in the request. + /// Updates the VoIP settings with the parameters specified in the request. /// - /// Connection waiting queue - /// Defines if a phone number will be paused or not - /// Update voip settings - /// Voip - /// Updated voip settings + /// Connection waiting queue + /// Defines if the operator have some time before accepting calls again. This can be used to take some notes on the previous call, etc. + /// Update the VoIP settings + /// VoIP + /// Updated VoIP settings /// + /// api/2.0/crm/voip/numbers/settings + /// PUT [Update(@"voip/numbers/settings")] public object UpdateSettings(Queue queue, bool pause) { @@ -335,13 +360,14 @@ public object UpdateSettings(Queue queue, bool pause) } /// - /// Returns the voip settings. + /// Returns the VoIP settings. /// - /// Get voip settings - /// Voip - /// Voip settings + /// Get the VoIP settings + /// VoIP + /// VoIP settings /// - + /// api/2.0/crm/voip/numbers/settings + /// GET [Read(@"voip/numbers/settings")] public object GetVoipSettings() { @@ -360,12 +386,15 @@ public object GetVoipSettings() } /// - /// Returns the links to the voip uploaded files. + /// Returns the links to the VoIP uploaded files. /// /// Get the links to the uploaded files - /// Voip - /// Links to the voip uploaded files + /// VoIP + /// Links to the VoIP uploaded files /// + /// api/2.0/crm/voip/uploads + /// GET + /// list [Read(@"voip/uploads")] public IEnumerable GetUploadedFilesUri() { @@ -409,13 +438,15 @@ private static VoipUpload GetVoipUpload(Uri link, string fileName, AudioType aud /// /// Deletes an uploaded file with the name specified in the request. /// - /// Audio type - /// Uploaded file name + /// Audio type + /// Uploaded file name /// Delete an uploaded file - /// Voip - /// Uploaded file + /// VoIP + /// Uploaded file /// /// + /// api/2.0/crm/voip/uploads + /// DELETE [Delete(@"voip/uploads")] public VoipUpload DeleteUploadedFile(AudioType audioType, string fileName) { @@ -483,11 +514,13 @@ public VoipUpload DeleteUploadedFile(AudioType audioType, string fileName) /// /// Returns the operators of the phone number with the ID specified in the request. /// - /// Phone number ID + /// Phone number ID /// Get operators - /// Voip + /// VoIP /// Phone number operators /// + /// api/2.0/crm/voip/numbers/{numberId}/oper + /// GET [Read(@"voip/numbers/{numberId:\w+}/oper")] public IEnumerable GetOperators(string numberId) { @@ -497,13 +530,16 @@ public IEnumerable GetOperators(string numberId) /// /// Adds the operators to the phone number with the ID specified in the request. /// - /// Phone number ID - /// Phone number operators + /// Phone number ID + /// Phone number operators /// Add operators - /// Voip - /// Added phone number operators + /// VoIP + /// Added phone number operators /// /// + /// api/2.0/crm/voip/numbers/{numberId}/oper + /// PUT + /// list [Update(@"voip/numbers/{numberId:\w+}/oper")] public IEnumerable AddOperators(string numberId, IEnumerable operators) { @@ -529,12 +565,14 @@ public IEnumerable AddOperators(string numberId, IEnumerable operat /// /// Deletes an operator from the phone number with the ID specified in the request. /// - /// Phone number ID - /// Phone number operator GUID + /// Phone number ID + /// Phone number operator GUID /// Delete an operator - /// Voip + /// VoIP /// Phone number operator /// + /// api/2.0/crm/voip/numbers/{numberId}/oper + /// DELETE [Delete(@"voip/numbers/{numberId:\w+}/oper")] public Guid DeleteOperator(string numberId, Guid oper) { @@ -560,16 +598,18 @@ public Guid DeleteOperator(string numberId, Guid oper) /// /// Updates a phone number operator with the parameters specified in the request. /// - /// Phone number operator ID - /// New operator status - /// Defines if an operator allows making the outgoing calls or not - /// Defines if an operator allows recording calls or not - /// New operator answer type - /// New redirect phone number + /// Phone number operator ID + /// New operator status + /// Defines if an operator allows making the outgoing calls or not + /// Defines if an operator allows recording calls or not + /// New operator answer type + /// New redirect phone number /// Update an operator - /// Voip - /// Updated operator + /// VoIP + /// Updated operator /// + /// api/2.0/crm/voip/opers/{operatorId} + /// PUT [Update(@"voip/opers/{operatorId}")] public Agent UpdateOperator(Guid operatorId, AgentStatus? status, bool? allowOutgoingCalls, bool? record, AnswerType? answerType, string redirectToNumber) { @@ -622,12 +662,14 @@ public Agent UpdateOperator(Guid operatorId, AgentStatus? status, bool? allowOut /// /// Makes a call to the phone number specified in the request. /// - /// Phone number to call - /// Contact ID + /// Phone number to call + /// Contact ID /// Make a call - /// Voip - /// Phone call information + /// VoIP + /// Phone call information /// + /// api/2.0/crm/voip/call + /// POST [Create(@"voip/call")] public VoipCallWrapper MakeCall(string to, string contactId) { @@ -652,10 +694,12 @@ public VoipCallWrapper MakeCall(string to, string contactId) /// /// Answers a phone call with the ID specified in the request. /// - /// Phone call ID + /// Phone call ID /// Answer a call - /// Voip - /// Phone call information + /// VoIP + /// Phone call information + /// api/2.0/crm/voip/call/{callId}/answer + /// POST [Create(@"voip/call/{callId:\w+}/answer")] public VoipCallWrapper AnswerCall(string callId) { @@ -669,10 +713,12 @@ public VoipCallWrapper AnswerCall(string callId) /// /// Rejects a phone call with the ID specified in the request. /// - /// Phone call ID + /// Phone call ID /// Reject a call - /// Voip - /// Phone call information + /// VoIP + /// Phone call information + /// api/2.0/crm/voip/call/{callId}/reject + /// POST [Create(@"voip/call/{callId:\w+}/reject")] public VoipCallWrapper RejectCall(string callId) { @@ -684,13 +730,15 @@ public VoipCallWrapper RejectCall(string callId) } /// - /// Redirects a phone call with the ID specified in the request. + /// Redirects a phone call with the ID specified in the request to the specified phone number. /// - /// Phone call ID - /// Redirect phone number + /// Phone call ID + /// Phone number to redirect the phone call /// Redirect a call - /// Voip - /// Phone call information + /// VoIP + /// Phone call information + /// api/2.0/crm/voip/call/{callId}/redirect + /// POST [Create(@"voip/call/{callId:\w+}/redirect")] public VoipCallWrapper ReditectCall(string callId, string to) { @@ -717,16 +765,18 @@ public VoipCallWrapper ReditectCall(string callId, string to) /// /// Saves a call with the parameters specified in the request. /// - /// Phone call ID - /// Phone number that is calling - /// Phone number to call - /// Phone number ID that answered a call - /// Phone call status - /// Contact ID - /// Phone call price + /// Phone call ID + /// Phone number that is calling + /// Phone number to call + /// Phone number ID that answered a call + /// Phone call status + /// Contact ID + /// Phone call price /// Save a call - /// Voip - /// Phone call information + /// VoIP + /// Phone call information + /// api/2.0/crm/voip/call/{callId} + /// POST [Create(@"voip/call/{callId:\w+}")] public VoipCallWrapper SaveCall(string callId, string from, string to, Guid answeredBy, VoipCallStatus? status, string contactId, decimal? price) { @@ -797,9 +847,12 @@ public VoipCallWrapper SaveCall(string callId, string from, string to, Guid answ /// /// Saves a price for the call with the ID specified in the request. /// - /// Phone call ID + /// Phone call ID /// Save a call price - /// Voip + /// VoIP + /// api/2.0/crm/voip/price/{callId} + /// POST + /// [Create(@"voip/price/{callId:\w+}")] public void SavePrice(string callId) { @@ -809,15 +862,18 @@ public void SavePrice(string callId) /// /// Returns a list of the calls matching the parameters specified in the request. /// - /// Phone call type - /// Phone number that is calling - /// Phone number to call - /// Call agent - /// Call client - /// Contact ID + /// Phone call type + /// Start date + /// End date + /// Call agent + /// Call client + /// Contact ID /// Get calls - /// Voip - /// List of calls + /// VoIP + /// List of calls + /// api/2.0/crm/voip/call + /// GET + /// list [Read(@"voip/call")] public IEnumerable GetCalls(string callType, ApiDateTime from, ApiDateTime to, Guid? agent, int? client, int? contactID) { @@ -868,8 +924,11 @@ public IEnumerable GetCalls(string callType, ApiDateTime from, /// Returns a list of all the missed calls. /// /// Get missed calls - /// Voip - /// List of missed calls + /// VoIP + /// List of missed calls + /// api/2.0/crm/voip/call/missed + /// GET + /// list [Read(@"voip/call/missed")] public IEnumerable GetMissedCalls() { @@ -905,10 +964,12 @@ public IEnumerable GetMissedCalls() /// /// Returns the detailed information about a phone call with the ID specified in the request. /// - /// Phone call ID + /// Phone call ID /// Get a call - /// Voip - /// Phone call information + /// VoIP + /// Phone call information + /// api/2.0/crm/voip/call/{callId} + /// GET [Read(@"voip/call/{callId:\w+}")] public VoipCallWrapper GetCall(string callId) { diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApi.cs b/module/ASC.Api/ASC.Api.CRM/CRMApi.cs index 9e3637bf7..a940a7e3f 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApi.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.CRM/CRMApiBase.cs b/module/ASC.Api/ASC.Api.CRM/CRMApiBase.cs index 0aae4bc76..5c31ae308 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMApiBase.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMApiBase.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.CRM/CRMBootstrap.cs b/module/ASC.Api/ASC.Api.CRM/CRMBootstrap.cs index 0da1933e4..b9f43e928 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMBootstrap.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMBootstrap.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.CRM/CRMCalendar.cs b/module/ASC.Api/ASC.Api.CRM/CRMCalendar.cs index bad88aa02..ab0f95712 100644 --- a/module/ASC.Api/ASC.Api.CRM/CRMCalendar.cs +++ b/module/ASC.Api/ASC.Api.CRM/CRMCalendar.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/CasesWrapper.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/CasesWrapper.cs index 8da0c4de9..b03a31cc3 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/CasesWrapper.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/CasesWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ namespace ASC.Api.CRM.Wrappers { + ///ASC.Api.CRM.Wrappers.ObjectWrapperBase, ASC.Api.CRM [DataContract(Name = "case", Namespace = "")] public class CasesWrapper : ObjectWrapperBase { @@ -54,30 +55,42 @@ public CasesWrapper(Cases cases) CanEdit = CRMSecurity.CanEdit(cases); } + ///ASC.Api.CRM.Wrappers.ContactBaseWrapper, ASC.Api.CRM + ///list [DataMember(IsRequired = false, EmitDefaultValue = false)] public IEnumerable Members { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee [DataMember(IsRequired = false, EmitDefaultValue = false)] public EmployeeWraper CreateBy { get; set; } + ///2020-12-08T17:37:04.5736385Z [DataMember(IsRequired = false, EmitDefaultValue = false)] public ApiDateTime Created { get; set; } + ///Exhibition organization [DataMember(IsRequired = false, EmitDefaultValue = false)] public String Title { get; set; } + ///false [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool IsClosed { get; set; } + ///false [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool IsPrivate { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///list [DataMember(IsRequired = false, EmitDefaultValue = false)] public IEnumerable AccessList { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool CanEdit { get; set; } + ///ASC.Api.CRM.Wrappers.CustomFieldBaseWrapper, ASC.Api.CRM + ///list [DataMember(IsRequired = false, EmitDefaultValue = false)] public IEnumerable CustomFields { get; set; } diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/ContactInfoWrapper.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/ContactInfoWrapper.cs index 846b24ac1..e7cfcfa23 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/ContactInfoWrapper.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/ContactInfoWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -81,27 +81,43 @@ public static bool TryParse(ContactInfo contactInfo, out Address res) } } + ///Lubanas st. 125a-25 + ///1 [DataMember(Order = 1, IsRequired = false, EmitDefaultValue = false)] public String Street { get; set; } + /// + ///2 [DataMember(Order = 2, IsRequired = false, EmitDefaultValue = false)] public String City { get; set; } + /// + ///3 [DataMember(Order = 3, IsRequired = false, EmitDefaultValue = false)] public String State { get; set; } + ///LV-1021 + ///4 [DataMember(Order = 4, IsRequired = false, EmitDefaultValue = false)] public String Zip { get; set; } + ///Latvia + ///5 [DataMember(Order = 5, IsRequired = false, EmitDefaultValue = false)] public String Country { get; set; } + ///0 + ///6 [DataMember(Order = 6, IsRequired = false, EmitDefaultValue = false)] public int Category { get; set; } + ///Home + ///7 [DataMember(Order = 7, IsRequired = false, EmitDefaultValue = false)] public String CategoryName { get; set; } + ///true + ///8 [DataMember(Order = 8, IsRequired = false, EmitDefaultValue = false)] public Boolean IsPrimary { get; set; } @@ -125,6 +141,7 @@ public static Address GetSample() /// /// Contact information /// + ///ASC.Api.CRM.Wrappers.ObjectWrapperBase, ASC.Api.CRM [DataContract(Name = "commonDataItem", Namespace = "")] public class ContactInfoWrapper : ObjectWrapperBase { @@ -149,19 +166,28 @@ public ContactInfoWrapper(ContactInfo contactInfo) ID = contactInfo.ID; } - + ///1 + ///1 [DataMember(Order = 1)] public ContactInfoType InfoType { get; set; } + ///0 + ///2 [DataMember(Order = 2)] public int Category { get; set; } + ///support@onlyoffice.com + ///3 [DataMember(Order = 3)] public String Data { get; set; } + ///Home + ///4 [DataMember(Order = 4)] public String CategoryName { get; set; } + ///true + ///5 [DataMember(Order = 5)] public bool IsPrimary { get; set; } diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/ContactWrapper.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/ContactWrapper.cs index 5bd5b0a37..13acae71e 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/ContactWrapper.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/ContactWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +35,7 @@ namespace ASC.Api.CRM.Wrappers /// /// Person /// + ///ASC.Api.CRM.Wrappers.ContactWrapper, ASC.Api.CRM [DataContract(Name = "person", Namespace = "")] public class PersonWrapper : ContactWrapper { @@ -88,16 +89,19 @@ public static PersonWrapper ToPersonWrapperQuick(Person person) return result; } - + ///Tadjeddine [DataMember(IsRequired = true, EmitDefaultValue = false)] public String FirstName { get; set; } + ///Bachir [DataMember(IsRequired = true, EmitDefaultValue = false)] public String LastName { get; set; } + ///ASC.Api.CRM.Wrappers.ContactBaseWrapper, ASC.Api.CRM [DataMember(IsRequired = false, EmitDefaultValue = false)] public ContactBaseWrapper Company { get; set; } + ///Programmer [DataMember(IsRequired = false, EmitDefaultValue = false)] public String Title { get; set; } @@ -123,6 +127,7 @@ public static PersonWrapper ToPersonWrapperQuick(Person person) /// /// Company /// + /// ASC.Api.CRM.Wrappers.ContactWrapper, ASC.Api.CRM [DataContract(Name = "company", Namespace = "")] public class CompanyWrapper : ContactWrapper { @@ -174,13 +179,16 @@ public static CompanyWrapper ToCompanyWrapperQuick(Company company) return result; } - + ///Food and Culture Project [DataMember(IsRequired = true, EmitDefaultValue = false)] public String CompanyName { get; set; } + ///ASC.Api.CRM.Wrappers.ContactBaseWrapper, ASC.Api.CRM + ///list [DataMember(IsRequired = true, EmitDefaultValue = false)] public IEnumerable Persons { get; set; } + ///33 [DataMember(IsRequired = true, EmitDefaultValue = false)] public int PersonsCount { get; set; } @@ -198,6 +206,7 @@ public static CompanyWrapper ToCompanyWrapperQuick(Company company) } } + ///ASC.Api.CRM.Wrappers.ContactBaseWrapper, ASC.Api.CRM [DataContract(Name = "contact", Namespace = "")] [KnownType(typeof(PersonWrapper))] [KnownType(typeof(CompanyWrapper))] @@ -216,41 +225,55 @@ protected ContactWrapper(Contact contact) About = contact.About; Industry = contact.Industry; } - + ///ASC.Api.CRM.Wrappers.Address, ASC.Api.CRM + ///list [DataMember(IsRequired = false, EmitDefaultValue = false)] public IEnumerable
    Addresses { get; set; } - + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee [DataMember(IsRequired = false, EmitDefaultValue = false)] public EmployeeWraper CreateBy { get; set; } + ///2020-12-08T17:37:04.5916406Z [DataMember(IsRequired = false, EmitDefaultValue = false)] public ApiDateTime Created { get; set; } + ///About [DataMember(IsRequired = false, EmitDefaultValue = false)] public String About { get; set; } + ///Industry [DataMember(IsRequired = false, EmitDefaultValue = false)] public String Industry { get; set; } + ///ASC.Api.CRM.Wrappers.ContactStatusBaseWrapper, ASC.Api.CRM [DataMember(IsRequired = false, EmitDefaultValue = false)] public ContactStatusBaseWrapper ContactStatus { get; set; } + ///ASC.Api.CRM.Wrappers.ContactTypeBaseWrapper, ASC.Api.CRM [DataMember(IsRequired = false, EmitDefaultValue = false)] public ContactTypeBaseWrapper ContactType { get; set; } + ///ASC.Api.CRM.Wrappers.ContactInfoWrapper, ASC.Api.CRM + ///list [DataMember(IsRequired = false, EmitDefaultValue = false)] public IEnumerable CommonData { get; set; } + ///ASC.Api.CRM.Wrappers.CustomFieldBaseWrapper, ASC.Api.CRM + ///list [DataMember(IsRequired = false, EmitDefaultValue = false)] public IEnumerable CustomFields { get; set; } + ///Tag1,Tag2 + ///list [DataMember(IsRequired = false, EmitDefaultValue = false)] public IEnumerable Tags { get; set; } + ///1 [DataMember(IsRequired = false, EmitDefaultValue = false)] public int TaskCount { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool HaveLateTasks { get; set; } @@ -278,7 +301,7 @@ protected ContactWrapper(Contact contact) }; } } - + ///ASC.Api.CRM.Wrappers.ContactBaseWrapper, ASC.Api.CRM [DataContract(Name = "contactBase", Namespace = "")] public class ContactBaseWithEmailWrapper : ContactBaseWrapper { @@ -314,7 +337,7 @@ public ContactBaseWithEmailWrapper(ContactWrapper contactWrapper) : base(contact } } - + ///ASC.Api.CRM.Wrappers.ContactInfoWrapper, ASC.Api.CRM [DataMember(IsRequired = false, EmitDefaultValue = false)] public ContactInfoWrapper Email { get; set; } } @@ -365,6 +388,7 @@ public ContactBaseWithPhoneWrapper(ContactWrapper contactWrapper) /// /// Contact base information /// + ///ASC.Api.CRM.Wrappers.ObjectWrapperBase, ASC.Api.CRM [DataContract(Name = "contactBase", Namespace = "")] public class ContactBaseWrapper : ObjectWrapperBase { @@ -425,36 +449,48 @@ protected ContactBaseWrapper(int contactID) { } + ///url to foto [DataMember(IsRequired = false, EmitDefaultValue = false)] public String SmallFotoUrl { get; set; } + ///url to foto [DataMember(IsRequired = false, EmitDefaultValue = false)] public String MediumFotoUrl { get; set; } + ///Tadjeddine Bachir [DataMember(IsRequired = false, EmitDefaultValue = true)] public String DisplayName { get; set; } + ///false [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool IsCompany { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///list [DataMember(IsRequired = false, EmitDefaultValue = false)] public IEnumerable AccessList { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool IsPrivate { get; set; } + ///false [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool IsShared { get; set; } + ///0 [DataMember(IsRequired = false, EmitDefaultValue = true)] public ShareType ShareType { get; set; } + ///ASC.Api.CRM.CurrencyInfoWrapper, ASC.Api.CRM [DataMember] public CurrencyInfoWrapper Currency { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool CanEdit { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool CanDelete { get; set; } diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/CurrencyInfoWrapper.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/CurrencyInfoWrapper.cs index 7639b6f09..79ba61e00 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/CurrencyInfoWrapper.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/CurrencyInfoWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,21 +42,27 @@ public CurrencyInfoWrapper(CurrencyInfo currencyInfo) IsBasic = currencyInfo.IsBasic; } + ///Chinese Yuan [DataMember] public String Title { get; set; } + ///¥ [DataMember] public String Symbol { get; set; } + ///CNY [DataMember] public String Abbreviation { get; set; } + ///CN [DataMember] public String CultureName { get; set; } + ///true [DataMember] public bool IsConvertable { get; set; } + ///false [DataMember] public bool IsBasic { get; set; } @@ -78,6 +84,7 @@ public static CurrencyInfoWrapper GetSample() /// /// Currency rate information /// + /// ASC.Api.CRM.CurrencyInfoWrapper, ASC.Api.CRM [DataContract(Name = "currencyRateInfo", Namespace = "")] public class CurrencyRateInfoWrapper : CurrencyInfoWrapper { @@ -90,6 +97,7 @@ public CurrencyRateInfoWrapper(CurrencyInfo currencyInfo, Decimal rate) : base(c Rate = rate; } + ///1,1 [DataMember] public Decimal Rate { get; set; } } diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/CurrencyRateWrapper.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/CurrencyRateWrapper.cs index 96997f381..965e19b07 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/CurrencyRateWrapper.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/CurrencyRateWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ namespace ASC.Api.CRM /// /// Currency rate /// + /// ASC.Api.CRM.Wrappers.ObjectWrapperBase, ASC.Api.CRM [DataContract(Name = "currencyRate", Namespace = "")] public class CurrencyRateWrapper : ObjectWrapperBase { @@ -41,12 +42,15 @@ public CurrencyRateWrapper(CurrencyRate currencyRate) Rate = currencyRate.Rate; } + ///EUR [DataMember] public String FromCurrency { get; set; } + ///USD [DataMember] public String ToCurrency { get; set; } + ///1.1 [DataMember] public decimal Rate { get; set; } diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/CustomFieldWrapper.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/CustomFieldWrapper.cs index 77cca72c3..5bb52805a 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/CustomFieldWrapper.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/CustomFieldWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ namespace ASC.Api.CRM.Wrappers { + ///ASC.Api.CRM.Wrappers.CustomFieldBaseWrapper, ASC.Api.CRM [DataContract(Name = "customField", Namespace = "")] public class CustomFieldWrapper : CustomFieldBaseWrapper { @@ -37,6 +38,7 @@ public CustomFieldWrapper(CustomField customField) { } + ///0 [DataMember] public int RelativeItemsCount { get; set; } @@ -58,6 +60,7 @@ public CustomFieldWrapper(CustomField customField) /// /// User custom fields /// + /// ASC.Api.CRM.Wrappers.ObjectWrapperBase, ASC.Api.CRM [DataContract(Name = "customField", Namespace = "")] public class CustomFieldBaseWrapper : ObjectWrapperBase { @@ -76,21 +79,27 @@ public CustomFieldBaseWrapper(CustomField customField) Mask = customField.Mask; } + ///14523423 [DataMember] public int EntityId { get; set; } + ///Birthdate [DataMember] public String Label { get; set; } + ///2020-12-08T17:37:04.5916406Z [DataMember] public String FieldValue { get; set; } + ///5 [DataMember] public CustomFieldType FieldType { get; set; } + ///10 [DataMember] public int Position { get; set; } + /// [DataMember] public String Mask { get; set; } diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/InvoiceWrapper.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/InvoiceWrapper.cs index 18067fede..b305cfa1b 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/InvoiceWrapper.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/InvoiceWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,6 +34,7 @@ namespace ASC.Api.CRM.Wrappers /// /// Invoice /// + /// ASC.Api.CRM.Wrappers.ObjectWrapperBase, ASC.Api.CRM [DataContract(Name = "invoiceBase", Namespace = "")] public class InvoiceBaseWrapper : ObjectWrapperBase { @@ -65,64 +66,83 @@ public InvoiceBaseWrapper(Invoice invoice) CanDelete = CRMSecurity.CanDelete(invoice); } - + ///ASC.Api.CRM.Wrappers.InvoiceStatusWrapper, ASC.Api.CRM [DataMember] public InvoiceStatusWrapper Status { get; set; } + /// [DataMember] public string Number { get; set; } + ///2020-12-14T22:13:41.5378233Z [DataMember] public ApiDateTime IssueDate { get; set; } + ///0 [DataMember] public InvoiceTemplateType TemplateType { get; set; } + ///ASC.Api.CRM.Wrappers.ContactBaseWrapper, ASC.Api.CRM [DataMember] public ContactBaseWrapper Contact { get; set; } + ///ASC.Api.CRM.Wrappers.ContactBaseWrapper, ASC.Api.CRM [DataMember] public ContactBaseWrapper Consignee { get; set; } + ///ASC.Api.CRM.Wrappers.EntityWrapper, ASC.Api.CRM [DataMember] public EntityWrapper Entity { get; set; } + ///2020-12-14T22:13:41.5378233Z [DataMember] public ApiDateTime DueDate { get; set; } + /// [DataMember] public string Language { get; set; } + ///ASC.Api.CRM.CurrencyInfoWrapper, ASC.Api.CRM [DataMember] public CurrencyInfoWrapper Currency { get; set; } + ///1,0 [DataMember] public decimal ExchangeRate { get; set; } + /// [DataMember] public string PurchaseOrderNumber { get; set; } + /// [DataMember] public string Terms { get; set; } + /// [DataMember] public string Description { get; set; } + ///-1 [DataMember] public int FileID { get; set; } + ///2020-12-14T22:13:41.5378233Z [DataMember] public ApiDateTime CreateOn { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee [DataMember] public EmployeeWraper CreateBy { get; set; } + ///0,0 [DataMember] public decimal Cost { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool CanEdit { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool CanDelete { get; set; } } @@ -130,6 +150,7 @@ public InvoiceBaseWrapper(Invoice invoice) /// /// Invoice /// + /// ASC.Api.CRM.Wrappers.InvoiceBaseWrapper, ASC.Api.CRM [DataContract(Name = "invoice", Namespace = "")] public class InvoiceWrapper : InvoiceBaseWrapper { @@ -161,6 +182,8 @@ public InvoiceWrapper(Invoice invoice) CanDelete = CRMSecurity.CanDelete(invoice); } + ///ASC.Api.CRM.Wrappers.InvoiceLineWrapper, ASC.Api.CRM + ///list [DataMember] public List InvoiceLines { get; set; } @@ -193,6 +216,7 @@ public static InvoiceWrapper GetSample() /// /// Invoice Item /// + /// ASC.Api.CRM.Wrappers.ObjectWrapperBase, ASC.Api.CRM [DataContract(Name = "invoiceItem", Namespace = "")] public class InvoiceItemWrapper : ObjectWrapperBase { @@ -220,43 +244,55 @@ public InvoiceItemWrapper(InvoiceItem invoiceItem) CanDelete = CRMSecurity.CanDelete(invoiceItem); } - + ///Title [DataMember] public string Title { get; set; } + ///StockKeepingUnit [DataMember] public string StockKeepingUnit { get; set; } + ///Description [DataMember] public string Description { get; set; } + ///1.2 [DataMember] public decimal Price { get; set; } + ///ASC.Api.CRM.CurrencyInfoWrapper, ASC.Api.CRM [DataMember] public CurrencyInfoWrapper Currency { get; set; } + ///2.2 [DataMember] public decimal StockQuantity { get; set; } + ///true [DataMember] public bool TrackInvenory { get; set; } + ///ASC.Api.CRM.Wrappers.InvoiceTaxWrapper, ASC.Api.CRM [DataMember] public InvoiceTaxWrapper InvoiceTax1 { get; set; } + ///ASC.Api.CRM.Wrappers.InvoiceTaxWrapper, ASC.Api.CRM [DataMember] public InvoiceTaxWrapper InvoiceTax2 { get; set; } + ///2020-12-14T22:13:41.5378233Z [DataMember] public ApiDateTime CreateOn { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee [DataMember] public EmployeeWraper CreateBy { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool CanEdit { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool CanDelete { get; set; } } @@ -264,6 +300,7 @@ public InvoiceItemWrapper(InvoiceItem invoiceItem) /// /// Invoice Tax /// + /// ASC.Api.CRM.Wrappers.ObjectWrapperBase, ASC.Api.CRM [DataContract(Name = "invoiceTax", Namespace = "")] public class InvoiceTaxWrapper : ObjectWrapperBase { @@ -286,25 +323,31 @@ public InvoiceTaxWrapper(InvoiceTax invoiceTax) } - + ///Name [DataMember] public string Name { get; set; } + ///Description [DataMember] public string Description { get; set; } + ///Rate [DataMember] public decimal Rate { get; set; } + ///2020-12-14T22:13:41.5378233Z [DataMember] public ApiDateTime CreateOn { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee [DataMember] public EmployeeWraper CreateBy { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool CanEdit { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool CanDelete { get; set; } } @@ -312,6 +355,7 @@ public InvoiceTaxWrapper(InvoiceTax invoiceTax) /// /// Invoice Line /// + /// ASC.Api.CRM.Wrappers.ObjectWrapperBase, ASC.Api.CRM [DataContract(Name = "invoiceLine", Namespace = "")] public class InvoiceLineWrapper : ObjectWrapperBase { @@ -334,30 +378,39 @@ public InvoiceLineWrapper(InvoiceLine invoiceLine) Discount = invoiceLine.Discount; } + ///0 [DataMember] public int InvoiceID { get; set; } + ///0 [DataMember] public int InvoiceItemID { get; set; } + ///0 [DataMember] public int InvoiceTax1ID { get; set; } + ///0 [DataMember] public int InvoiceTax2ID { get; set; } + ///0 [DataMember] public int SortOrder { get; set; } + ///Description [DataMember] public string Description { get; set; } + ///0,0 [DataMember] public decimal Quantity { get; set; } + ///0,0 [DataMember] public decimal Price { get; set; } + ///0,0 [DataMember] public decimal Discount { get; set; } @@ -380,6 +433,7 @@ public static InvoiceLineWrapper GetSample() /// /// Invoice Status /// + /// ASC.Api.CRM.Wrappers.ObjectWrapperBase, ASC.Api.CRM [DataContract(Name = "invoiceStatus", Namespace = "")] public class InvoiceStatusWrapper : ObjectWrapperBase { @@ -396,7 +450,7 @@ public InvoiceStatusWrapper(InvoiceStatus status) Title = status.ToLocalizedString(); } - + ///Title [DataMember] public string Title { get; set; } } diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/ListItemWrapper.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/ListItemWrapper.cs index e0e019d17..437e79cde 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/ListItemWrapper.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/ListItemWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ namespace ASC.Api.CRM.Wrappers #region History Category + ///ASC.Api.CRM.Wrappers.ListItemWrapper, ASC.Api.CRM [DataContract(Name = "historyCategoryBase", Namespace = "")] public class HistoryCategoryBaseWrapper : ListItemWrapper { @@ -41,7 +42,7 @@ public HistoryCategoryBaseWrapper(ListItem listItem) if (!String.IsNullOrEmpty(listItem.AdditionalParams)) ImagePath = WebImageSupplier.GetAbsoluteWebPath(listItem.AdditionalParams, ProductEntryPoint.ID); } - + ///path to image [DataMember] public String ImagePath { get; set; } @@ -59,6 +60,7 @@ public static HistoryCategoryBaseWrapper GetSample() } } + ///ASC.Api.CRM.Wrappers.HistoryCategoryBaseWrapper, ASC.Api.CRM [DataContract(Name = "historyCategory", Namespace = "")] public class HistoryCategoryWrapper : HistoryCategoryBaseWrapper { @@ -71,6 +73,7 @@ public HistoryCategoryWrapper(ListItem listItem) { } + ///1 [DataMember(IsRequired = false, EmitDefaultValue = false)] public int RelativeItemsCount { get; set; } @@ -92,7 +95,7 @@ public HistoryCategoryWrapper(ListItem listItem) #endregion #region Deal Milestone - + ///ASC.Api.CRM.Wrappers.ListItemWrapper, ASC.Api.CRM [DataContract(Name = "opportunityStagesBase", Namespace = "")] public class DealMilestoneBaseWrapper : ListItemWrapper { @@ -111,9 +114,11 @@ public DealMilestoneBaseWrapper(DealMilestone dealMilestone) Title = dealMilestone.Title; } + ///20 [DataMember] public int SuccessProbability { get; set; } + ///0 [DataMember] public DealMilestoneStatus StageType { get; set; } @@ -132,6 +137,7 @@ public static DealMilestoneBaseWrapper GetSample() } } + ///ASC.Api.CRM.Wrappers.DealMilestoneBaseWrapper, ASC.Api.CRM [DataContract(Name = "opportunityStages", Namespace = "")] public class DealMilestoneWrapper : DealMilestoneBaseWrapper { @@ -144,6 +150,7 @@ public DealMilestoneWrapper(DealMilestone dealMilestone) { } + ///1 [DataMember(IsRequired = false, EmitDefaultValue = false)] public int RelativeItemsCount { get; set; } @@ -166,7 +173,7 @@ public DealMilestoneWrapper(DealMilestone dealMilestone) #endregion #region Task Category - + ///ASC.Api.CRM.Wrappers.ListItemWrapper, ASC.Api.CRM [DataContract(Name = "taskCategoryBase", Namespace = "")] public class TaskCategoryBaseWrapper : ListItemWrapper { @@ -181,6 +188,7 @@ public TaskCategoryBaseWrapper(ListItem listItem) ImagePath = WebImageSupplier.GetAbsoluteWebPath(listItem.AdditionalParams, ProductEntryPoint.ID); } + ///path to image [DataMember(IsRequired = false, EmitDefaultValue = false)] public String ImagePath { get; set; } @@ -197,6 +205,7 @@ public static TaskCategoryBaseWrapper GetSample() } } + ///ASC.Api.CRM.Wrappers.TaskCategoryBaseWrapper, ASC.Api.CRM [DataContract(Name = "taskCategory", Namespace = "")] public class TaskCategoryWrapper : TaskCategoryBaseWrapper { @@ -209,6 +218,7 @@ public TaskCategoryWrapper(ListItem listItem) { } + ///1 [DataMember(IsRequired = false, EmitDefaultValue = false)] public int RelativeItemsCount { get; set; } @@ -229,7 +239,7 @@ public TaskCategoryWrapper(ListItem listItem) #endregion #region Contact Status - + ///ASC.Api.CRM.Wrappers.ListItemWrapper, ASC.Api.CRM [DataContract(Name = "contactStatusBase", Namespace = "")] public class ContactStatusBaseWrapper : ListItemWrapper { @@ -255,6 +265,7 @@ public static ContactStatusBaseWrapper GetSample() } } + ///ASC.Api.CRM.Wrappers.ContactStatusBaseWrapper, ASC.Api.CRM [DataContract(Name = "contactStatus", Namespace = "")] public class ContactStatusWrapper : ContactStatusBaseWrapper { @@ -267,6 +278,7 @@ public ContactStatusWrapper(ListItem listItem) { } + ///1 [DataMember(IsRequired = false, EmitDefaultValue = false)] public int RelativeItemsCount { get; set; } @@ -286,7 +298,7 @@ public ContactStatusWrapper(ListItem listItem) #endregion #region Contact Type - + ///ASC.Api.CRM.Wrappers.ListItemWrapper, ASC.Api.CRM [DataContract(Name = "contactTypeBase", Namespace = "")] public class ContactTypeBaseWrapper : ListItemWrapper { @@ -312,6 +324,7 @@ public static ContactTypeBaseWrapper GetSample() } } + ///ASC.Api.CRM.Wrappers.ContactTypeBaseWrapper, ASC.Api.CRM [DataContract(Name = "contactType", Namespace = "")] public class ContactTypeWrapper : ContactTypeBaseWrapper { @@ -324,6 +337,7 @@ public ContactTypeWrapper(ListItem listItem) { } + ///1 [DataMember(IsRequired = false, EmitDefaultValue = false)] public int RelativeItemsCount { get; set; } @@ -359,9 +373,11 @@ public TagWrapper(String tag, int relativeItemsCount = 0) RelativeItemsCount = relativeItemsCount; } + ///Tag [DataMember(IsRequired = true, EmitDefaultValue = false)] public String Title { get; set; } + ///1 [DataMember(IsRequired = false, EmitDefaultValue = false)] public int RelativeItemsCount { get; set; } @@ -376,7 +392,7 @@ public static TagWrapper GetSample() } #endregion - + ///ASC.Api.CRM.Wrappers.ObjectWrapperBase, ASC.Api.CRM [DataContract(Name = "listItem", Namespace = "")] public abstract class ListItemWrapper : ObjectWrapperBase { @@ -394,15 +410,19 @@ protected ListItemWrapper(ListItem listItem) SortOrder = listItem.SortOrder; } + ///Title [DataMember(IsRequired = false, EmitDefaultValue = false)] public String Title { get; set; } + ///Description [DataMember(IsRequired = false, EmitDefaultValue = false)] public String Description { get; set; } + ///#a7fc00 [DataMember(IsRequired = false, EmitDefaultValue = false)] public String Color { get; set; } + ///1 [DataMember(IsRequired = false, EmitDefaultValue = false)] public int SortOrder { get; set; } } diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/ObjectWrapperBase.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/ObjectWrapperBase.cs index 6dfe5b591..71077ee24 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/ObjectWrapperBase.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/ObjectWrapperBase.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ namespace ASC.Api.CRM.Wrappers [DataContract(Namespace = "")] public class ObjectWrapperBase { + ///1234 [DataMember(Name = "id")] public int ID { get; set; } diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/OpportunityWrapper.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/OpportunityWrapper.cs index 323c220e7..189b255f6 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/OpportunityWrapper.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/OpportunityWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ namespace ASC.Api.CRM.Wrappers /// /// Opportunity /// + /// ASC.Api.CRM.Wrappers.ObjectWrapperBase, ASC.Api.CRM [DataContract(Name = "opportunity", Namespace = "")] public class OpportunityWrapper : ObjectWrapperBase { @@ -54,60 +55,82 @@ public OpportunityWrapper(int id) { } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee [DataMember(IsRequired = false, EmitDefaultValue = false)] public EmployeeWraper CreateBy { get; set; } + ///2020-12-11T03:36:09.7011881Z [DataMember(IsRequired = false, EmitDefaultValue = false)] public ApiDateTime Created { get; set; } + ///ASC.Api.CRM.Wrappers.ContactBaseWrapper, ASC.Api.CRM + ///list [DataMember(IsRequired = false, EmitDefaultValue = false)] public IEnumerable Members { get; set; } + ///ASC.Api.CRM.Wrappers.ContactBaseWrapper, ASC.Api.CRM [DataMember(IsRequired = false, EmitDefaultValue = false)] public ContactBaseWrapper Contact { get; set; } + ///Hotel catalogue [DataMember(IsRequired = true, EmitDefaultValue = false)] public String Title { get; set; } + ///description [DataMember(IsRequired = false, EmitDefaultValue = false)] public String Description { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee [DataMember(IsRequired = false, EmitDefaultValue = false)] public EmployeeWraper Responsible { get; set; } + ///0 [DataMember(IsRequired = false, EmitDefaultValue = false)] public BidType BidType { get; set; } + ///1,1 [DataMember(IsRequired = false, EmitDefaultValue = false)] public decimal BidValue { get; set; } + ///ASC.Api.CRM.CurrencyInfoWrapper, ASC.Api.CRM [DataMember(IsRequired = false, EmitDefaultValue = false)] public CurrencyInfoWrapper BidCurrency { get; set; } + ///1 [DataMember(IsRequired = false, EmitDefaultValue = false)] public int PerPeriodValue { get; set; } + ///ASC.Api.CRM.Wrappers.DealMilestoneBaseWrapper, ASC.Api.CRM [DataMember(IsRequired = false, EmitDefaultValue = false)] public DealMilestoneBaseWrapper Stage { get; set; } + ///65 [DataMember(IsRequired = false, EmitDefaultValue = false)] public int SuccessProbability { get; set; } + ///2020-12-11T03:36:09.7011881Z [DataMember(IsRequired = false, EmitDefaultValue = false)] public ApiDateTime ActualCloseDate { get; set; } + ///2020-12-11T03:36:09.7011881Z [DataMember(IsRequired = false, EmitDefaultValue = false)] public ApiDateTime ExpectedCloseDate { get; set; } + ///false [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool IsPrivate { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///list [DataMember(IsRequired = false, EmitDefaultValue = false)] public IEnumerable AccessList { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = true)] public bool CanEdit { get; set; } + ///ASC.Api.CRM.Wrappers.CustomFieldBaseWrapper, ASC.Api.CRM + ///list [DataMember(IsRequired = false, EmitDefaultValue = false)] public IEnumerable CustomFields { get; set; } diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/RelationshipEventWrapper.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/RelationshipEventWrapper.cs index 7d5c1f994..1e2fd8f7c 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/RelationshipEventWrapper.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/RelationshipEventWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,12 +30,15 @@ namespace ASC.Api.CRM.Wrappers [DataContract(Name = "entity", Namespace = "")] public class EntityWrapper { + ///opportunity [DataMember] public String EntityType { get; set; } + ///123445 [DataMember] public int EntityId { get; set; } + ///Household appliances internet shop [DataMember] public String EntityTitle { get; set; } @@ -50,7 +53,7 @@ public static EntityWrapper GetSample() } } - + ///ASC.Api.CRM.Wrappers.ObjectWrapperBase, ASC.Api.CRM [DataContract(Name = "historyEvent", Namespace = "")] public class RelationshipEventWrapper : ObjectWrapperBase @@ -70,27 +73,36 @@ public RelationshipEventWrapper(RelationshipEvent relationshipEvent) CanEdit = CRMSecurity.CanEdit(relationshipEvent); } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee [DataMember(IsRequired = false, EmitDefaultValue = false)] public EmployeeWraper CreateBy { get; set; } + ///2020-12-13T17:13:31.5902727Z [DataMember(IsRequired = true, EmitDefaultValue = false)] public ApiDateTime Created { get; set; } + ///Agreed to meet at lunch and discuss the client commercial offer [DataMember(IsRequired = true, EmitDefaultValue = false)] public String Content { get; set; } + ///ASC.Api.CRM.Wrappers.HistoryCategoryBaseWrapper, ASC.Api.CRM [DataMember(IsRequired = true, EmitDefaultValue = false)] public HistoryCategoryBaseWrapper Category { get; set; } + ///ASC.Api.CRM.Wrappers.ContactBaseWrapper, ASC.Api.CRM [DataMember(IsRequired = false, EmitDefaultValue = false)] public ContactBaseWrapper Contact { get; set; } + ///ASC.Api.CRM.Wrappers.EntityWrapper, ASC.Api.CRM [DataMember] public EntityWrapper Entity { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = false)] public bool CanEdit { get; set; } + ///ASC.Api.Documents.FileWrapper, ASC.Api.Documents + ///list [DataMember(IsRequired = false, EmitDefaultValue = false)] public IEnumerable Files { get; set; } diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/ReportWrapper.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/ReportWrapper.cs index d90d7384f..18e295f93 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/ReportWrapper.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/ReportWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/Subject.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/Subject.cs index 0d0e00931..6d2178260 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/Subject.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/Subject.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/TaskTemplateContainerWrapper.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/TaskTemplateContainerWrapper.cs index 4e5d6aecc..86b475e13 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/TaskTemplateContainerWrapper.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/TaskTemplateContainerWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/TaskWrapper.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/TaskWrapper.cs index c3b086e85..dc4276c2b 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/TaskWrapper.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/TaskWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ namespace ASC.Api.CRM.Wrappers /// /// Task /// + /// ASC.Api.CRM.Wrappers.ObjectWrapperBase, ASC.Api.CRM [DataContract(Name = "task", Namespace = "")] public class TaskWrapper : ObjectWrapperBase { @@ -46,39 +47,51 @@ public TaskWrapper(Task task) : base(task.ID) AlertValue = task.AlertValue; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee [DataMember(IsRequired = false, EmitDefaultValue = false)] public EmployeeWraper CreateBy { get; set; } + ///2020-12-16T03:11:54.3573531Z [DataMember(IsRequired = false, EmitDefaultValue = false)] public ApiDateTime Created { get; set; } + ///ASC.Api.CRM.Wrappers.ContactBaseWithEmailWrapper, ASC.Api.CRM [DataMember(IsRequired = false, EmitDefaultValue = false)] public ContactBaseWithEmailWrapper Contact { get; set; } + ///Send a commercial offer [DataMember(IsRequired = false, EmitDefaultValue = false)] public String Title { get; set; } + ///Description [DataMember(IsRequired = false, EmitDefaultValue = false)] public String Description { get; set; } + ///2020-12-16T03:11:54.3573531Z [DataMember(IsRequired = false, EmitDefaultValue = false)] public ApiDateTime DeadLine { get; set; } + ///1 [DataMember(IsRequired = false, EmitDefaultValue = false)] public int AlertValue { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee [DataMember(IsRequired = false, EmitDefaultValue = false)] public EmployeeWraper Responsible { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = false)] public bool IsClosed { get; set; } + ///ASC.Api.CRM.Wrappers.TaskCategoryBaseWrapper, ASC.Api.CRM [DataMember(IsRequired = false, EmitDefaultValue = false)] public TaskCategoryBaseWrapper Category { get; set; } + ///ASC.Api.CRM.Wrappers.EntityWrapper, ASC.Api.CRM [DataMember(IsRequired = false, EmitDefaultValue = false)] public EntityWrapper Entity { get; set; } + ///true [DataMember(IsRequired = false, EmitDefaultValue = false)] public bool CanEdit { get; set; } diff --git a/module/ASC.Api/ASC.Api.CRM/Wrappers/VoipCallWrapper.cs b/module/ASC.Api/ASC.Api.CRM/Wrappers/VoipCallWrapper.cs index 6a2139586..4287ff5bd 100644 --- a/module/ASC.Api/ASC.Api.CRM/Wrappers/VoipCallWrapper.cs +++ b/module/ASC.Api/ASC.Api.CRM/Wrappers/VoipCallWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,39 +28,63 @@ namespace ASC.Api.CRM.Wrappers [DataContract(Name = "voipCall", Namespace = "")] public class VoipCallWrapper { + ///Id + ///1 [DataMember(Order = 1)] public string Id { get; set; } + ///From + ///2 [DataMember(Order = 2)] public string From { get; set; } + ///To + ///3 [DataMember(Order = 3)] public string To { get; set; } + ///1 + ///4 [DataMember(Order = 4)] public VoipCallStatus? Status { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///5 [DataMember(Order = 5)] public EmployeeWraper AnsweredBy { get; set; } + ///2020-12-23T04:11:57.1649297Z + ///6 [DataMember(Order = 6)] public ApiDateTime DialDate { get; set; } + ///1 + ///7 [DataMember(Order = 7)] public int DialDuration { get; set; } + ///5.3 + ///10 [DataMember(Order = 10)] public decimal Cost { get; set; } + ///ASC.Api.CRM.Wrappers.ContactWrapper, ASC.Api.CRM + ///11 [DataMember(Order = 11)] public ContactWrapper Contact { get; set; } + ///null + ///11 [DataMember(Order = 11, EmitDefaultValue = false)] public IEnumerable Calls { get; set; } + ///RecordUrl + ///13 [DataMember(Order = 13)] public string RecordUrl { get; set; } + ///2 + ///14 [DataMember(Order = 14)] public int RecordDuration { get; set; } diff --git a/module/ASC.Api/ASC.Api.Calendar/AccessRights.cs b/module/ASC.Api/ASC.Api.Calendar/AccessRights.cs index 23133d93a..7808de0b8 100644 --- a/module/ASC.Api/ASC.Api.Calendar/AccessRights.cs +++ b/module/ASC.Api/ASC.Api.Calendar/AccessRights.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/Attachments/AttachmentEngine.cs b/module/ASC.Api/ASC.Api.Calendar/Attachments/AttachmentEngine.cs index 57b523eef..043ba2b4e 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Attachments/AttachmentEngine.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Attachments/AttachmentEngine.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.IO; diff --git a/module/ASC.Api/ASC.Api.Calendar/Attachments/SecurityAdapter.cs b/module/ASC.Api/ASC.Api.Calendar/Attachments/SecurityAdapter.cs index bc8c74649..22967a708 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Attachments/SecurityAdapter.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Attachments/SecurityAdapter.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; diff --git a/module/ASC.Api/ASC.Api.Calendar/Attachments/SecurityAdapterProvider.cs b/module/ASC.Api/ASC.Api.Calendar/Attachments/SecurityAdapterProvider.cs index 7a131260d..3271ed4db 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Attachments/SecurityAdapterProvider.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Attachments/SecurityAdapterProvider.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; diff --git a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/Calendar.cs b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/Calendar.cs index 6c876365b..09ef05595 100644 --- a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/Calendar.cs +++ b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/Calendar.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/ColumnCollection.cs b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/ColumnCollection.cs index 0bb52c345..6d96ac373 100644 --- a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/ColumnCollection.cs +++ b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/ColumnCollection.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/DataProvider.cs b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/DataProvider.cs index 4c59656b9..0290d6552 100644 --- a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/DataProvider.cs +++ b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/DataProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,8 +38,7 @@ namespace ASC.Api.Calendar.BusinessObjects { public class DataProvider : IDisposable { - private IDbManager _db; - private const string DBId = "calendar"; + private const string DBId = "default"; private const string _calendarTable = "calendar_calendars cal"; private const string _calendarItemTable = "calendar_calendar_item cal_itm"; private const string _calendarUserTable = "calendar_calendar_user cal_usr"; @@ -63,22 +62,6 @@ public static string EventUidDomain } } - private IDbManager db - { - get - { - if (_db == null || _db.IsDisposed) - { - _db = DbManager.FromHttpContext(DBId); - } - return _db; - } - } - - public DataProvider() - { - _db = DbManager.FromHttpContext(DBId); - } public List GetUserViewSettings(Guid userId, List calendarIds) { @@ -101,7 +84,11 @@ public List GetUserViewSettings(Guid userId, List cale Exp.In(calId.Name, calendarIds)) & Exp.Eq(usrId.Name, userId)); - var data = db.ExecuteList(query); + List data; + using(var db = new DbManager(DBId)) + { + data = db.ExecuteList(query); + } var options = new List(); foreach (var r in data) @@ -125,7 +112,6 @@ public List GetUserViewSettings(Guid userId, List cale return options; } - public List LoadTodoCalendarsForUser(Guid userId) { var currentTenantId = CoreContext.TenantManager.GetCurrentTenant().TenantId; @@ -135,22 +121,30 @@ public List LoadTodoCalendarsForUser(Guid userId) .Where("cal.is_todo", 1) .Where("cal.tenant", currentTenantId); - var calIds = db.ExecuteList(queryGetCalIds).Select(r => r[0]); + List calIdsList; + using(var db = new DbManager(DBId)) + { + calIdsList = db.ExecuteList(queryGetCalIds); + } + var calIds = calIdsList.Select(r => r[0]); var cals = GetCalendarsByIds(calIds.ToArray()); return cals; } public void RemoveTodo(int todoId) { - using (var tr = db.BeginTransaction()) + var tenant = CoreContext.TenantManager.GetCurrentTenant().TenantId; + using (var db = new DbManager(DBId)) { - var tenant = CoreContext.TenantManager.GetCurrentTenant().TenantId; - - db.ExecuteNonQuery(new SqlDelete("calendar_todos").Where("id", todoId).Where("tenant", tenant)); + using (var tr = db.BeginTransaction()) + { + db.ExecuteNonQuery(new SqlDelete("calendar_todos").Where("id", todoId).Where("tenant", tenant)); - tr.Commit(); + tr.Commit(); + } } + } public List LoadCalendarsForUser(Guid userId, out int newCalendarsCount) { @@ -167,7 +161,12 @@ public List LoadCalendarsForUser(Guid userId, out int newCalendarsCoun .Where("cal.owner_id", userId) .Where("cal.tenant", currentTenantId)); - var calIds = db.ExecuteList(queryGetCalIds).Select(r => r[0]); + List calIdsList; + using(var db = new DbManager(DBId)) + { + calIdsList = db.ExecuteList(queryGetCalIds); + } + var calIds = calIdsList.Select(r => r[0]); var cals = GetCalendarsByIds(calIds.ToArray()); @@ -189,7 +188,12 @@ public List LoadiCalStreamsForUser(Guid userId) .Where("cal.owner_id", userId) .Where(!Exp.Eq("cal.ical_url", null)); - var calIds = db.ExecuteList(queryGetCalIds).Select(r => r[0]); + List calIdsList; + using (var db = new DbManager(DBId)) + { + calIdsList = db.ExecuteList(queryGetCalIds); + } + var calIds = calIdsList.Select(r => r[0]); var calendars = GetCalendarsByIds(calIds.ToArray()); return calendars; @@ -199,11 +203,16 @@ public List LoadSubscriptionsForUser(Guid userId) { var groups = GetUserGroups(userId); - var calIds = db.ExecuteList(new SqlQuery(_calendarItemTable).Select("cal_itm.calendar_id") + List calIdsList; + using (var db = new DbManager(DBId)) + { + calIdsList = db.ExecuteList(new SqlQuery(_calendarItemTable).Select("cal_itm.calendar_id") .InnerJoin(_calendarTable, Exp.EqColumns("cal.id", "cal_itm.calendar_id")) .Where("cal.tenant", CoreContext.TenantManager.GetCurrentTenant().TenantId) .Where(Exp.Eq("cal_itm.item_id", userId) | (Exp.In("cal_itm.item_id", groups.ToArray()) & Exp.Eq("cal_itm.is_group", true))) - ).Select(r => r[0]); + ); + } + var calIds = calIdsList.Select(r => r[0]); var calendars = GetCalendarsByIds(calIds.ToArray()); return calendars; @@ -216,7 +225,11 @@ public TimeZoneInfo GetTimeZoneForSharedEventsCalendar(Guid userId) .Where("ext_calendar_id", SharedEventsCalendar.CalendarId) .Where("user_id", userId); - var data = db.ExecuteList(q); + List data; + using(var db = new DbManager(DBId)) + { + data = db.ExecuteList(q); + } if (data.Count > 0) return data.Select(r => TimeZoneConverter.GetTimeZone(Convert.ToString(r[0]))).First(); @@ -225,17 +238,25 @@ public TimeZoneInfo GetTimeZoneForSharedEventsCalendar(Guid userId) public TimeZoneInfo GetTimeZoneForCalendar(Guid userId, int calendarId) { - var timeZone = db.ExecuteList(new SqlQuery(_calendarUserTable).Select("cal_usr.time_zone") + List timeZoneList; + + using (var db = new DbManager(DBId)) + { + timeZoneList = db.ExecuteList(new SqlQuery(_calendarUserTable).Select("cal_usr.time_zone") .Where(Exp.Eq("cal_usr.user_id", userId)) - .Where(Exp.Eq("cal_usr.calendar_id", calendarId))) - .Select(r => (r[0] == null || r[0] == DBNull.Value) ? null : TimeZoneConverter.GetTimeZone(Convert.ToString(r[0]))); + .Where(Exp.Eq("cal_usr.calendar_id", calendarId))); + } + var timeZone = timeZoneList.Select(r => (r[0] == null || r[0] == DBNull.Value) ? null : TimeZoneConverter.GetTimeZone(Convert.ToString(r[0]))); if (timeZone.Count() != 0 && timeZone.First() == null) { - timeZone = db.ExecuteList(new SqlQuery(_calendarUserTable).Select("cal_usr.time_zone") + using (var db = new DbManager(DBId)) + { + timeZoneList = db.ExecuteList(new SqlQuery(_calendarUserTable).Select("cal_usr.time_zone") .Where(Exp.Eq("cal_usr.user_id", GetCalendarById(calendarId).OwnerId)) - .Where(Exp.Eq("cal_usr.calendar_id", calendarId))) - .Select(r => (r[0] == null || r[0] == DBNull.Value) ? null : TimeZoneConverter.GetTimeZone(Convert.ToString(r[0]))); + .Where(Exp.Eq("cal_usr.calendar_id", calendarId))); + } + timeZone = timeZoneList.Select(r => (r[0] == null || r[0] == DBNull.Value) ? null : TimeZoneConverter.GetTimeZone(Convert.ToString(r[0]))); } if (timeZone.Count() == 0) @@ -249,7 +270,11 @@ public TimeZoneInfo GetTimeZoneForCalendar(Guid userId, int calendarId) } public List GetCalendarIdByCaldavGuid(string caldavGuid) { - var data = db.ExecuteList(new SqlQuery(_calendarTable).Select("id", "owner_id", "tenant").Where("caldav_guid", caldavGuid)); + List data; + using (var db = new DbManager(DBId)) + { + data = db.ExecuteList(new SqlQuery(_calendarTable).Select("id", "owner_id", "tenant").Where("caldav_guid", caldavGuid)); + } return data; } public Event GetEventIdByUid(string uid, int calendarId) @@ -259,8 +284,11 @@ public Event GetEventIdByUid(string uid, int calendarId) .Where(Exp.Like("uid", uid)) .Where("calendar_id", calendarId); - var eventId = db.ExecuteScalar(sql); - + int eventId; + using (var db = new DbManager(DBId)) + { + eventId = db.ExecuteScalar(sql); + } return eventId == 0 ? null : GetEventById(eventId); } public Event GetEventIdOnlyByUid(string uid) @@ -268,8 +296,11 @@ public Event GetEventIdOnlyByUid(string uid) var sql = new SqlQuery("calendar_events") .Select("id") .Where(Exp.Like("uid", uid)); - - var eventId = db.ExecuteScalar(sql); + int eventId; + using (var db = new DbManager(DBId)) + { + eventId = db.ExecuteScalar(sql); + } return eventId == 0 ? null : GetEventById(eventId); } @@ -299,11 +330,15 @@ public List GetCalendarsByIds(object[] calIds) var usrCalName = cc.RegistryColumn("cal_usr.name"); var usrTimeZone = cc.RegistryColumn("cal_usr.time_zone"); - var data = db.ExecuteList(new SqlQuery(_calendarTable).Select(cc.SelectQuery) + List data; + using (var db = new DbManager(DBId)) + { + data = db.ExecuteList(new SqlQuery(_calendarTable).Select(cc.SelectQuery) .LeftOuterJoin(_calendarUserTable, Exp.EqColumns(calId.Name, "cal_usr.calendar_id")) .Where(Exp.In(calId.Name, calIds))); + } var cc1 = new ColumnCollection(); @@ -311,10 +346,13 @@ public List GetCalendarsByIds(object[] calIds) var itemId = cc1.RegistryColumn("cal_itm.item_id"); var itemIsGroup = cc1.RegistryColumn("cal_itm.is_group"); - var sharingData = db.ExecuteList(new SqlQuery(_calendarItemTable).Select(cc1.SelectQuery) - .Where(Exp.In(itemCalId.Name, - calIds))); - + List sharingData; + using (var db = new DbManager(DBId)) + { + sharingData = db.ExecuteList(new SqlQuery(_calendarItemTable).Select(cc1.SelectQuery) + .Where(Exp.In(itemCalId.Name, + calIds))); + } //parsing var calendars = new List(); @@ -398,58 +436,62 @@ public Calendar GetCalendarById(int calendarId) public Calendar CreateCalendar(Guid ownerId, string name, string description, string textColor, string backgroundColor, TimeZoneInfo timeZone, EventAlertType eventAlertType, string iCalUrl, List publicItems, List viewSettings, Guid calDavGuid, int isTodo = 0) { int calendarId; - using (var tr = db.BeginTransaction()) - { - description = StringUtils.NormalizeStringForMySql(description); - name = StringUtils.NormalizeStringForMySql(name); - calendarId = db.ExecuteScalar(new SqlInsert("calendar_calendars") - .InColumnValue("id", 0) - .InColumnValue("tenant", - CoreContext.TenantManager - .GetCurrentTenant().TenantId) - .InColumnValue("owner_id", ownerId) - .InColumnValue("name", name) - .InColumnValue("description", description) - .InColumnValue("text_color", textColor) - .InColumnValue("background_color", backgroundColor) - .InColumnValue("alert_type", (int)eventAlertType) - .InColumnValue("time_zone", timeZone.Id) - .InColumnValue("ical_url", iCalUrl) - .InColumnValue("caldav_guid", calDavGuid) - .InColumnValue("is_todo", isTodo) - .Identity(0, 0, true)); + description = StringUtils.NormalizeStringForMySql(description); + name = StringUtils.NormalizeStringForMySql(name); - if (publicItems != null) + using (var db = new DbManager(DBId)) + { + using (var tr = db.BeginTransaction()) { - foreach (var item in publicItems) + calendarId = db.ExecuteScalar(new SqlInsert("calendar_calendars") + .InColumnValue("id", 0) + .InColumnValue("tenant", + CoreContext.TenantManager + .GetCurrentTenant().TenantId) + .InColumnValue("owner_id", ownerId) + .InColumnValue("name", name) + .InColumnValue("description", description) + .InColumnValue("text_color", textColor) + .InColumnValue("background_color", backgroundColor) + .InColumnValue("alert_type", (int)eventAlertType) + .InColumnValue("time_zone", timeZone.Id) + .InColumnValue("ical_url", iCalUrl) + .InColumnValue("caldav_guid", calDavGuid) + .InColumnValue("is_todo", isTodo) + .Identity(0, 0, true)); + + if (publicItems != null) { - db.ExecuteNonQuery(new SqlInsert("calendar_calendar_item") - .InColumnValue("calendar_id", calendarId) - .InColumnValue("item_id", item.Id) - .InColumnValue("is_group", item.IsGroup)); + foreach (var item in publicItems) + { + db.ExecuteNonQuery(new SqlInsert("calendar_calendar_item") + .InColumnValue("calendar_id", calendarId) + .InColumnValue("item_id", item.Id) + .InColumnValue("is_group", item.IsGroup)); + } } - } - if (viewSettings != null) - { - foreach (var view in viewSettings) + if (viewSettings != null) { - db.ExecuteNonQuery(new SqlInsert("calendar_calendar_user") - .InColumnValue("calendar_id", calendarId) - .InColumnValue("user_id", view.UserId) - .InColumnValue("hide_events", view.IsHideEvents) - .InColumnValue("is_accepted", view.IsAccepted) - .InColumnValue("text_color", view.TextColor) - .InColumnValue("background_color", view.BackgroundColor) - .InColumnValue("alert_type", (int)view.EventAlertType) - .InColumnValue("name", view.Name ?? "") - .InColumnValue("time_zone", - view.TimeZone != null ? view.TimeZone.Id : null) - ); + foreach (var view in viewSettings) + { + db.ExecuteNonQuery(new SqlInsert("calendar_calendar_user") + .InColumnValue("calendar_id", calendarId) + .InColumnValue("user_id", view.UserId) + .InColumnValue("hide_events", view.IsHideEvents) + .InColumnValue("is_accepted", view.IsAccepted) + .InColumnValue("text_color", view.TextColor) + .InColumnValue("background_color", view.BackgroundColor) + .InColumnValue("alert_type", (int)view.EventAlertType) + .InColumnValue("name", view.Name ?? "") + .InColumnValue("time_zone", + view.TimeZone != null ? view.TimeZone.Id : null) + ); + } } + tr.Commit(); } - tr.Commit(); } return GetCalendarById(calendarId); @@ -457,113 +499,120 @@ public Calendar CreateCalendar(Guid ownerId, string name, string description, st public Calendar UpdateCalendarGuid(int calendarId, Guid calDavGuid) { - using (var tr = db.BeginTransaction()) + using (var db = new DbManager(DBId)) { - db.ExecuteNonQuery(new SqlUpdate("calendar_calendars") - .Set("caldav_guid", calDavGuid) - .Where("id", calendarId)); - tr.Commit(); + using (var tr = db.BeginTransaction()) + { + db.ExecuteNonQuery(new SqlUpdate("calendar_calendars") + .Set("caldav_guid", calDavGuid) + .Where("id", calendarId)); + tr.Commit(); + } } + return GetCalendarById(calendarId); } public Calendar UpdateCalendar(int calendarId, string name, string description, List publicItems, List viewSettings) { - using (var tr = db.BeginTransaction()) + using (var db = new DbManager(DBId)) { + using (var tr = db.BeginTransaction()) + { - db.ExecuteNonQuery(new SqlUpdate("calendar_calendars") - .Set("name", name) - .Set("description", description) - .Where("id", calendarId)); + db.ExecuteNonQuery(new SqlUpdate("calendar_calendars") + .Set("name", name) + .Set("description", description) + .Where("id", calendarId)); - //sharing - var sqlQuery = new SqlQuery("calendar_calendar_item") - .Select("item_id", "is_group") - .Where(Exp.Eq("calendar_id", calendarId)); - var existsItems = db.ExecuteList(sqlQuery).ConvertAll(row => new SharingOptions.PublicItem - { - Id = new Guid((string)row[0]), - IsGroup = Convert.ToBoolean(row[1]) - }); + //sharing + var sqlQuery = new SqlQuery("calendar_calendar_item") + .Select("item_id", "is_group") + .Where(Exp.Eq("calendar_id", calendarId)); + var existsItems = db.ExecuteList(sqlQuery).ConvertAll(row => new SharingOptions.PublicItem + { + Id = new Guid((string)row[0]), + IsGroup = Convert.ToBoolean(row[1]) + }); - foreach (var existCalendar in existsItems) - { - db.ExecuteNonQuery(new SqlDelete("calendar_calendar_item") - .Where("calendar_id", calendarId) - .Where("item_id", existCalendar.Id) - .Where("is_group", existCalendar.IsGroup)); - } + foreach (var existCalendar in existsItems) + { + db.ExecuteNonQuery(new SqlDelete("calendar_calendar_item") + .Where("calendar_id", calendarId) + .Where("item_id", existCalendar.Id) + .Where("is_group", existCalendar.IsGroup)); + } - foreach (var item in publicItems) - { - db.ExecuteNonQuery(new SqlInsert("calendar_calendar_item") - .InColumnValue("calendar_id", calendarId) - .InColumnValue("item_id", item.Id) - .InColumnValue("is_group", item.IsGroup)); - } + foreach (var item in publicItems) + { + db.ExecuteNonQuery(new SqlInsert("calendar_calendar_item") + .InColumnValue("calendar_id", calendarId) + .InColumnValue("item_id", item.Id) + .InColumnValue("is_group", item.IsGroup)); + } - //view - sqlQuery = new SqlQuery("calendar_calendar_user") - .Select("ext_calendar_id", "user_id") - .Where(Exp.Eq("calendar_id", calendarId)); - var existsUsers = db.ExecuteList(sqlQuery).Select(row => new - { - ExtCalendarId = (string)row[0], - Id = (string)row[1] - }).ToList(); + //view + sqlQuery = new SqlQuery("calendar_calendar_user") + .Select("ext_calendar_id", "user_id") + .Where(Exp.Eq("calendar_id", calendarId)); + var existsUsers = db.ExecuteList(sqlQuery).Select(row => new + { + ExtCalendarId = (string)row[0], + Id = (string)row[1] + }).ToList(); - foreach (var user in existsUsers) - { - db.ExecuteNonQuery(new SqlDelete("calendar_calendar_user") - .Where("calendar_id", calendarId) - .Where("ext_calendar_id", user.ExtCalendarId) - .Where("user_id", user.Id)); - } + foreach (var user in existsUsers) + { + db.ExecuteNonQuery(new SqlDelete("calendar_calendar_user") + .Where("calendar_id", calendarId) + .Where("ext_calendar_id", user.ExtCalendarId) + .Where("user_id", user.Id)); + } - foreach (var view in viewSettings) - { - db.ExecuteNonQuery(new SqlInsert("calendar_calendar_user") - .InColumnValue("calendar_id", calendarId) - .InColumnValue("user_id", view.UserId) - .InColumnValue("hide_events", view.IsHideEvents) - .InColumnValue("is_accepted", view.IsAccepted) - .InColumnValue("text_color", view.TextColor) - .InColumnValue("background_color", view.BackgroundColor) - .InColumnValue("alert_type", (int)view.EventAlertType) - .InColumnValue("name", view.Name ?? "") - .InColumnValue("time_zone", - view.TimeZone != null ? view.TimeZone.Id : null) - ); + foreach (var view in viewSettings) + { + db.ExecuteNonQuery(new SqlInsert("calendar_calendar_user") + .InColumnValue("calendar_id", calendarId) + .InColumnValue("user_id", view.UserId) + .InColumnValue("hide_events", view.IsHideEvents) + .InColumnValue("is_accepted", view.IsAccepted) + .InColumnValue("text_color", view.TextColor) + .InColumnValue("background_color", view.BackgroundColor) + .InColumnValue("alert_type", (int)view.EventAlertType) + .InColumnValue("name", view.Name ?? "") + .InColumnValue("time_zone", + view.TimeZone != null ? view.TimeZone.Id : null) + ); - } + } - //update notifications - var cc = new ColumnCollection(); - var eId = cc.RegistryColumn("e.id"); - var eStartDate = cc.RegistryColumn("e.start_date"); - var eAlertType = cc.RegistryColumn("e.alert_type"); - var eRRule = cc.RegistryColumn("e.rrule"); - var eIsAllDay = cc.RegistryColumn("e.all_day_long"); - var eTimeZone = cc.RegistryColumn("e.time_zone"); - - var eventsData = db.ExecuteList( - new SqlQuery("calendar_events e") - .Select(cc.SelectQuery) - .Where("e.calendar_id", calendarId) - .Where("e.tenant", CoreContext.TenantManager.GetCurrentTenant().TenantId)); - - foreach (var r in eventsData) - { - UpdateEventNotifications(eId.Parse(r), calendarId, - eStartDate.Parse(r), - (EventAlertType)eAlertType.Parse(r), - eRRule.Parse(r), null, publicItems, - eIsAllDay.Parse(r), - eTimeZone.Parse(r)); - } + //update notifications + var cc = new ColumnCollection(); + var eId = cc.RegistryColumn("e.id"); + var eStartDate = cc.RegistryColumn("e.start_date"); + var eAlertType = cc.RegistryColumn("e.alert_type"); + var eRRule = cc.RegistryColumn("e.rrule"); + var eIsAllDay = cc.RegistryColumn("e.all_day_long"); + var eTimeZone = cc.RegistryColumn("e.time_zone"); + + var eventsData = db.ExecuteList( + new SqlQuery("calendar_events e") + .Select(cc.SelectQuery) + .Where("e.calendar_id", calendarId) + .Where("e.tenant", CoreContext.TenantManager.GetCurrentTenant().TenantId)); + + foreach (var r in eventsData) + { + UpdateEventNotifications(eId.Parse(r), calendarId, + eStartDate.Parse(r), + (EventAlertType)eAlertType.Parse(r), + eRRule.Parse(r), null, publicItems, + eIsAllDay.Parse(r), + eTimeZone.Parse(r)); + } - tr.Commit(); + tr.Commit(); + } } return GetCalendarById(calendarId); @@ -571,13 +620,10 @@ public Calendar UpdateCalendar(int calendarId, string name, string description, public void UpdateCalendarUserView(List viewSettings) { - using (var tr = db.BeginTransaction()) - { - foreach (var s in viewSettings) - UpdateCalendarUserView(s); - tr.Commit(); - } + foreach (var s in viewSettings) + UpdateCalendarUserView(s); + } public void UpdateCalendarUserView(UserViewSettings viewSettings) { @@ -594,20 +640,23 @@ public void UpdateCalendarUserView(UserViewSettings viewSettings) int calendarId; if (int.TryParse(viewSettings.CalendarId, out calendarId)) { - db.ExecuteNonQuery(new SqlInsert("calendar_calendar_user", true) - .InColumnValue("calendar_id", calendarId) - .InColumnValue("user_id", viewSettings.UserId) - .InColumnValue("hide_events", viewSettings.IsHideEvents) - .InColumnValue("text_color", viewSettings.TextColor) - .InColumnValue("background_color", viewSettings.BackgroundColor) - .InColumnValue("is_accepted", viewSettings.IsAccepted) - .InColumnValue("alert_type", (int)viewSettings.EventAlertType) - .InColumnValue("name", viewSettings.Name ?? "") - .InColumnValue("time_zone", - viewSettings.TimeZone != null - ? viewSettings.TimeZone.Id - : null) - ); + using (var db = new DbManager(DBId)) + { + db.ExecuteNonQuery(new SqlInsert("calendar_calendar_user", true) + .InColumnValue("calendar_id", calendarId) + .InColumnValue("user_id", viewSettings.UserId) + .InColumnValue("hide_events", viewSettings.IsHideEvents) + .InColumnValue("text_color", viewSettings.TextColor) + .InColumnValue("background_color", viewSettings.BackgroundColor) + .InColumnValue("is_accepted", viewSettings.IsAccepted) + .InColumnValue("alert_type", (int)viewSettings.EventAlertType) + .InColumnValue("name", viewSettings.Name ?? "") + .InColumnValue("time_zone", + viewSettings.TimeZone != null + ? viewSettings.TimeZone.Id + : null) + ); + } //update notifications var updateNotifications = new Task(() => @@ -615,26 +664,28 @@ public void UpdateCalendarUserView(UserViewSettings viewSettings) CoreContext.TenantManager.SetCurrentTenant(tenant); try { - using (var db = DbManager.FromHttpContext(DBId)) + List eventsData; + using (var db = new DbManager(DBId)) { using (var tr = db.BeginTransaction()) { - var eventsData = db.ExecuteList(new SqlQuery("calendar_events e") - .Select(cc.SelectQuery) - .Where("e.calendar_id", calendarId) - .Where("e.tenant", tenant.TenantId)); + eventsData = db.ExecuteList(new SqlQuery("calendar_events e") + .Select(cc.SelectQuery) + .Where("e.calendar_id", calendarId) + .Where("e.tenant", tenant.TenantId)); - foreach (var r in eventsData) - { - UpdateEventNotifications(eId.Parse(r), calendarId, - eStartDate.Parse(r), - (EventAlertType)eAlertType.Parse(r), - eRRule.Parse(r), null, null, - eIsAllDay.Parse(r), - eTimeZone.Parse(r), db); - } + tr.Commit(); } + } + foreach (var r in eventsData) + { + UpdateEventNotifications(eId.Parse(r), calendarId, + eStartDate.Parse(r), + (EventAlertType)eAlertType.Parse(r), + eRRule.Parse(r), null, null, + eIsAllDay.Parse(r), + eTimeZone.Parse(r)); } } @@ -647,24 +698,27 @@ public void UpdateCalendarUserView(UserViewSettings viewSettings) updateNotifications.ConfigureAwait(false); updateNotifications.Start(); - } else { - db.ExecuteNonQuery(new SqlInsert("calendar_calendar_user", true) - .InColumnValue("ext_calendar_id", viewSettings.CalendarId) - .InColumnValue("user_id", viewSettings.UserId) - .InColumnValue("hide_events", viewSettings.IsHideEvents) - .InColumnValue("text_color", viewSettings.TextColor) - .InColumnValue("background_color", viewSettings.BackgroundColor) - .InColumnValue("alert_type", (int)viewSettings.EventAlertType) - .InColumnValue("is_accepted", viewSettings.IsAccepted) - .InColumnValue("name", viewSettings.Name ?? "") - .InColumnValue("time_zone", - viewSettings.TimeZone != null - ? viewSettings.TimeZone.Id - : null) + using (var db = new DbManager(DBId)) + { + db.ExecuteNonQuery(new SqlInsert("calendar_calendar_user", true) + .InColumnValue("ext_calendar_id", viewSettings.CalendarId) + .InColumnValue("user_id", viewSettings.UserId) + .InColumnValue("hide_events", viewSettings.IsHideEvents) + .InColumnValue("text_color", viewSettings.TextColor) + .InColumnValue("background_color", viewSettings.BackgroundColor) + .InColumnValue("alert_type", (int)viewSettings.EventAlertType) + .InColumnValue("is_accepted", viewSettings.IsAccepted) + .InColumnValue("name", viewSettings.Name ?? "") + .InColumnValue("time_zone", + viewSettings.TimeZone != null + ? viewSettings.TimeZone.Id + : null) ); + } + if (String.Equals(viewSettings.CalendarId, SharedEventsCalendar.CalendarId, StringComparison.InvariantCultureIgnoreCase)) @@ -676,12 +730,12 @@ public void UpdateCalendarUserView(UserViewSettings viewSettings) CoreContext.TenantManager.SetCurrentTenant(tenant); try { - using (var db = DbManager.FromHttpContext(DBId)) + var groups = GetUserGroups(viewSettings.UserId); + List eventsData; + using (var db = new DbManager(DBId)) { using (var tr = db.BeginTransaction()) { - var groups = GetUserGroups(viewSettings.UserId); - var q = new SqlQuery("calendar_events e") .Select(cc.SelectQuery) .InnerJoin("calendar_event_item ei", Exp.EqColumns("ei.event_id", eId.Name)) @@ -689,19 +743,19 @@ public void UpdateCalendarUserView(UserViewSettings viewSettings) .Where((Exp.Eq("ei.is_group", false) & Exp.Eq("ei.item_id", viewSettings.UserId)) | (Exp.Eq("ei.is_group", true) & Exp.In("ei.item_id", groups.ToArray()))); - var eventsData = db.ExecuteList(q); - - foreach (var r in eventsData) - { - UpdateEventNotifications(eId.Parse(r), eCalId.Parse(r), - eStartDate.Parse(r), - (EventAlertType)eAlertType.Parse(r), - eRRule.Parse(r), null, null, - eIsAllDay.Parse(r), - eTimeZone.Parse(r), db); - } - } + eventsData = db.ExecuteList(q); + tr.Commit(); + } + } + foreach (var r in eventsData) + { + UpdateEventNotifications(eId.Parse(r), eCalId.Parse(r), + eStartDate.Parse(r), + (EventAlertType)eAlertType.Parse(r), + eRRule.Parse(r), null, null, + eIsAllDay.Parse(r), + eTimeZone.Parse(r)); } } @@ -719,57 +773,64 @@ public void UpdateCalendarUserView(UserViewSettings viewSettings) public Guid RemoveCalendar(int calendarId) { - using (var tr = db.BeginTransaction()) + var caldavGuid = Guid.Empty; + using (var db = new DbManager(DBId)) { - var caldavGuid = Guid.Empty; - try - { - var dataCaldavGuid = - db.ExecuteList(new SqlQuery("calendar_calendars").Select("caldav_guid").Where("id", calendarId)) - .Select(r => r[0]) - .ToArray(); - if (dataCaldavGuid[0] != null) caldavGuid = Guid.Parse(dataCaldavGuid[0].ToString()); - } - catch (Exception ex) + using (var tr = db.BeginTransaction()) { - Log.Error(ex); - } + try + { + var dataCaldavGuid = + db.ExecuteList(new SqlQuery("calendar_calendars").Select("caldav_guid").Where("id", calendarId)) + .Select(r => r[0]) + .ToArray(); + if (dataCaldavGuid[0] != null) caldavGuid = Guid.Parse(dataCaldavGuid[0].ToString()); + } + catch (Exception ex) + { + Log.Error(ex); + } - db.ExecuteNonQuery(new SqlDelete("calendar_calendars").Where("id", calendarId)); - db.ExecuteNonQuery(new SqlDelete("calendar_calendar_user").Where("calendar_id", calendarId)); - db.ExecuteNonQuery(new SqlDelete("calendar_calendar_item").Where("calendar_id", calendarId)); + db.ExecuteNonQuery(new SqlDelete("calendar_calendars").Where("id", calendarId)); + db.ExecuteNonQuery(new SqlDelete("calendar_calendar_user").Where("calendar_id", calendarId)); + db.ExecuteNonQuery(new SqlDelete("calendar_calendar_item").Where("calendar_id", calendarId)); - var tenant = CoreContext.TenantManager.GetCurrentTenant().TenantId; + var tenant = CoreContext.TenantManager.GetCurrentTenant().TenantId; - var data = db.ExecuteList(new SqlQuery("calendar_events") - .Select("id") - .Where("calendar_id", calendarId) - .Where("tenant", tenant)) - .Select(r => r[0]) - .ToArray(); + var data = db.ExecuteList(new SqlQuery("calendar_events") + .Select("id") + .Where("calendar_id", calendarId) + .Where("tenant", tenant)) + .Select(r => r[0]) + .ToArray(); - db.ExecuteNonQuery(new SqlDelete("calendar_events").Where("calendar_id", calendarId).Where("tenant", tenant)); - db.ExecuteNonQuery(new SqlDelete("calendar_event_item").Where(Exp.In("event_id", data))); - db.ExecuteNonQuery(new SqlDelete("calendar_event_user").Where(Exp.In("event_id", data))); - db.ExecuteNonQuery(new SqlDelete("calendar_notifications").Where(Exp.In("event_id", data))); - db.ExecuteNonQuery(new SqlDelete("calendar_event_history").Where("tenant", tenant).Where(Exp.In("event_id", data))); + db.ExecuteNonQuery(new SqlDelete("calendar_events").Where("calendar_id", calendarId).Where("tenant", tenant)); + db.ExecuteNonQuery(new SqlDelete("calendar_event_item").Where(Exp.In("event_id", data))); + db.ExecuteNonQuery(new SqlDelete("calendar_event_user").Where(Exp.In("event_id", data))); + db.ExecuteNonQuery(new SqlDelete("calendar_notifications").Where(Exp.In("event_id", data))); + db.ExecuteNonQuery(new SqlDelete("calendar_event_history").Where("tenant", tenant).Where(Exp.In("event_id", data))); - tr.Commit(); + tr.Commit(); - return caldavGuid; + } } + + return caldavGuid; + } public void RemoveExternalCalendarData(string calendarId) { - using (var tr = db.BeginTransaction()) + using(var db = new DbManager(DBId)) { - db.ExecuteNonQuery(new SqlDelete("calendar_calendar_user").Where("ext_calendar_id", calendarId)); - tr.Commit(); + using (var tr = db.BeginTransaction()) + { + db.ExecuteNonQuery(new SqlDelete("calendar_calendar_user").Where("ext_calendar_id", calendarId)); + tr.Commit(); + } } } - public Todo GetTodoByUid(string todoUid) { var sql = new SqlQuery("calendar_todos t") @@ -781,8 +842,11 @@ public Todo GetTodoByUid(string todoUid) .Where("c.owner_id", SecurityContext.CurrentAccount.ID) .Where("c.ical_url", null); - var todoId = db.ExecuteScalar(sql); - + int todoId; + using (var db = new DbManager(DBId)) + { + todoId = db.ExecuteScalar(sql); + } return todoId == 0 ? null : GetTodoById(todoId); } public Todo GetTodoIdByUid(string uid, int calendarId) @@ -792,7 +856,11 @@ public Todo GetTodoIdByUid(string uid, int calendarId) .Where(Exp.Like("uid", uid)) .Where("calendar_id", calendarId); - var todoId = db.ExecuteScalar(sql); + int todoId; + using (var db = new DbManager(DBId)) + { + todoId = db.ExecuteScalar(sql); + } return todoId == 0 ? null : GetTodoById(todoId); } @@ -800,26 +868,26 @@ public Todo UpdateTodo(string id, int calendarId, Guid ownerId, string name, str { int todoId; - - using (var tr = db.BeginTransaction()) + using (var db = new DbManager(DBId)) { + using (var tr = db.BeginTransaction()) + { - todoId = db.ExecuteScalar(new SqlUpdate("calendar_todos") - .Set("name", name) - .Set("description", description) - .Set("calendar_id", calendarId) - .Set("owner_id", ownerId) - .Set("start_date", utcStartDate == DateTime.MinValue ? null : utcStartDate.ToString("yyyy-MM-dd HH:mm:ss")) - .Set("uid", GetEventUid(uid)) - .Set("completed", completed == DateTime.MinValue ? null : completed.ToString("yyyy-MM-dd HH:mm:ss")) - .Where(Exp.Eq("id", id))); - - - tr.Commit(); + todoId = db.ExecuteScalar(new SqlUpdate("calendar_todos") + .Set("name", name) + .Set("description", description) + .Set("calendar_id", calendarId) + .Set("owner_id", ownerId) + .Set("start_date", utcStartDate == DateTime.MinValue ? null : utcStartDate.ToString("yyyy-MM-dd HH:mm:ss")) + .Set("uid", GetEventUid(uid)) + .Set("completed", completed == DateTime.MinValue ? null : completed.ToString("yyyy-MM-dd HH:mm:ss")) + .Where(Exp.Eq("id", id))); + + tr.Commit(); + } } return GetTodoById(int.Parse(id)); - } public Todo CreateTodo(int calendarId, @@ -831,29 +899,30 @@ public Todo CreateTodo(int calendarId, DateTime completed) { int todoId; + description = StringUtils.NormalizeStringForMySql(description); + name = StringUtils.NormalizeStringForMySql(name); - - using (var tr = db.BeginTransaction()) + using (var db = new DbManager(DBId)) { - - description = StringUtils.NormalizeStringForMySql(description); - name = StringUtils.NormalizeStringForMySql(name); - todoId = db.ExecuteScalar(new SqlInsert("calendar_todos") - .InColumnValue("id", 0) - .InColumnValue("tenant", - CoreContext.TenantManager.GetCurrentTenant - ().TenantId) - .InColumnValue("name", name) - .InColumnValue("description", description) - .InColumnValue("calendar_id", calendarId) - .InColumnValue("owner_id", ownerId) - .InColumnValue("start_date", utcStartDate == DateTime.MinValue ? null : utcStartDate.ToString("yyyy-MM-dd HH:mm:ss")) - .InColumnValue("uid", GetEventUid(uid)) - .InColumnValue("completed", completed == DateTime.MinValue ? null : completed.ToString("yyyy-MM-dd HH:mm:ss")) - .Identity(0, 0, true)); + using (var tr = db.BeginTransaction()) + { + todoId = db.ExecuteScalar(new SqlInsert("calendar_todos") + .InColumnValue("id", 0) + .InColumnValue("tenant", + CoreContext.TenantManager.GetCurrentTenant + ().TenantId) + .InColumnValue("name", name) + .InColumnValue("description", description) + .InColumnValue("calendar_id", calendarId) + .InColumnValue("owner_id", ownerId) + .InColumnValue("start_date", utcStartDate == DateTime.MinValue ? null : utcStartDate.ToString("yyyy-MM-dd HH:mm:ss")) + .InColumnValue("uid", GetEventUid(uid)) + .InColumnValue("completed", completed == DateTime.MinValue ? null : completed.ToString("yyyy-MM-dd HH:mm:ss")) + .Identity(0, 0, true)); - tr.Commit(); + tr.Commit(); + } } return GetTodoById(todoId); @@ -880,31 +949,34 @@ public List GetTodosByIds(object[] todoIds, Guid userId, int tenantId = -1 var tdOwner = cc.RegistryColumn("td.owner_id"); var tdUid = cc.RegistryColumn("td.uid"); - var data = new List(); + var data = new List(); if (todoIds.Length > 0) { if (tenantId != -1) { - data = db.ExecuteList(new SqlQuery(_todoTable) + using (var db = new DbManager(DBId)) + { + data = db.ExecuteList(new SqlQuery(_todoTable) - .Select(cc.SelectQuery) - .Where(Exp.In(tdId.Name, todoIds)) - .Where("owner_id", userId) - .Where("tenant", tenantId)); + .Select(cc.SelectQuery) + .Where(Exp.In(tdId.Name, todoIds)) + .Where("owner_id", userId) + .Where("tenant", tenantId)); + } } else { - data = db.ExecuteList(new SqlQuery(_todoTable) - - .Select(cc.SelectQuery) - .Where("owner_id", userId) - .Where(Exp.In(tdId.Name, todoIds))); + using (var db = new DbManager(DBId)) + { + data = db.ExecuteList(new SqlQuery(_todoTable) + .Select(cc.SelectQuery) + .Where("owner_id", userId) + .Where(Exp.In(tdId.Name, todoIds))); + } } } - - //parsing var todos = new List(); @@ -943,31 +1015,40 @@ public List LoadTodos(int calendarId, Guid userId, int tenantId, DateTime Exp.Eq("td.tenant", tenantId) ); - var tdIds = db.ExecuteList(sqlQuery).Select(r => r[0]); + List tdIdsList; + using (var db = new DbManager(DBId)) + { + tdIdsList = db.ExecuteList(sqlQuery); + } + var tdIds = tdIdsList.Select(r => r[0]); return GetTodosByIds(tdIds.ToArray(), userId, tenantId); } internal List LoadSharedEvents(Guid userId, int tenantId, DateTime utcStartDate, DateTime utcEndDate) { var groups = GetUserGroups(userId); + List evIdsList; - var evIds = db.ExecuteList( - new SqlQuery(_eventTable).Select("evt.id") - .InnerJoin(_eventItemTable, Exp.EqColumns("evt_itm.event_id", "evt.id")) - .Where("evt.tenant", tenantId) - .Where( - (Exp.Eq("evt_itm.item_id", userId) | (Exp.In("evt_itm.item_id", groups.ToArray()) & Exp.Eq("evt_itm.is_group", true))) - & Exp.Eq("evt.tenant", tenantId) - & ((Exp.Ge("evt.start_date", utcStartDate) & Exp.Le("evt.start_date", utcEndDate) & Exp.Eq("evt.rrule", "") - | !Exp.Eq("evt.rrule", ""))) - - & !Exp.Eq("evt.owner_id", userId) - - & !Exp.Exists(new SqlQuery("calendar_event_user evt_usr").Select("evt_usr.event_id") + using (var db = new DbManager(DBId)) + { + evIdsList = db.ExecuteList( + new SqlQuery(_eventTable).Select("evt.id") + .InnerJoin(_eventItemTable, Exp.EqColumns("evt_itm.event_id", "evt.id")) + .Where("evt.tenant", tenantId) + .Where( + (Exp.Eq("evt_itm.item_id", userId) | (Exp.In("evt_itm.item_id", groups.ToArray()) & Exp.Eq("evt_itm.is_group", true))) + & Exp.Eq("evt.tenant", tenantId) + & ((Exp.Ge("evt.start_date", utcStartDate) & Exp.Le("evt.start_date", utcEndDate) & Exp.Eq("evt.rrule", "") + | !Exp.Eq("evt.rrule", ""))) + & !Exp.Eq("evt.owner_id", userId) + & !Exp.Exists(new SqlQuery("calendar_event_user evt_usr").Select("evt_usr.event_id") .Where(Exp.EqColumns("evt_usr.event_id", "evt.id") & Exp.Eq("evt_usr.user_id", userId) & Exp.Eq("evt_usr.is_unsubscribe", true))) - )).Select(r => r[0]); + )); + } + + var evIds = evIdsList.Select(r => r[0]); return GetEventsByIds(evIds.ToArray(), userId, tenantId); } @@ -991,7 +1072,14 @@ public List LoadEvents(int calendarId, Guid userId, int tenantId, DateTim ) ); - var evIds = db.ExecuteList(sqlQuery).Select(r => r[0]); + List evIdsList; + + using(var db = new DbManager(DBId)) + { + evIdsList = db.ExecuteList(sqlQuery); + } + + var evIds = evIdsList.Select(r => r[0]); return GetEventsByIds(evIds.ToArray(), userId, tenantId); } @@ -1032,23 +1120,28 @@ public List GetEventsByIds(object[] evtIds, Guid userId, int tenantId = - { if (tenantId != -1) { - data = db.ExecuteList(new SqlQuery(_eventTable) + using (var db = new DbManager(DBId)) + { + data = db.ExecuteList(new SqlQuery(_eventTable) .LeftOuterJoin("calendar_event_user evt_usr", Exp.EqColumns(eId.Name, "evt_usr.event_id") & Exp.Eq("evt_usr.user_id", userId)) .Select(cc.SelectQuery) .Where(Exp.In(eId.Name, evtIds)) .Where("tenant", tenantId)); + } } else { - data = db.ExecuteList(new SqlQuery(_eventTable) + using (var db = new DbManager(DBId)) + { + data = db.ExecuteList(new SqlQuery(_eventTable) .LeftOuterJoin("calendar_event_user evt_usr", Exp.EqColumns(eId.Name, "evt_usr.event_id") & Exp.Eq("evt_usr.user_id", userId)) .Select(cc.SelectQuery) .Where(Exp.In(eId.Name, evtIds))); - + } } } @@ -1062,8 +1155,10 @@ public List GetEventsByIds(object[] evtIds, Guid userId, int tenantId = - if (evtIds.Length > 0) { - sharingData = db.ExecuteList(new SqlQuery(_eventItemTable).Select(cc1.SelectQuery) - .Where(Exp.In(evId.Name, evtIds))); + using (var db = new DbManager(DBId)) + { + sharingData = db.ExecuteList(new SqlQuery(_eventItemTable).Select(cc1.SelectQuery).Where(Exp.In(evId.Name, evtIds))); + } } //parsing @@ -1127,7 +1222,11 @@ public Event GetEventByUid(string eventUid) .Where("c.owner_id", SecurityContext.CurrentAccount.ID) .Where("c.ical_url", null); - var eventId = db.ExecuteScalar(sql); + int eventId; + using(var db = new DbManager(DBId)) + { + eventId = db.ExecuteScalar(sql); + } return eventId == 0 ? null : GetEventById(eventId); } @@ -1138,55 +1237,68 @@ public Event GetEventOnlyByUid(string eventUid) .Where("e.tenant", CoreContext.TenantManager.GetCurrentTenant().TenantId) .Where("e.uid", eventUid); - var eventId = db.ExecuteScalar(sql); + int eventId; + using (var db = new DbManager(DBId)) + { + eventId = db.ExecuteScalar(sql); + } return eventId == 0 ? null : GetEventById(eventId); } public void SetEventUid(int eventId, string uid) { - using (var tr = db.BeginTransaction()) + using (var db = new DbManager(DBId)) { - db.ExecuteNonQuery(new SqlUpdate("calendar_events") - .Set("uid", uid) - .Where(Exp.Eq("id", eventId))); + using (var tr = db.BeginTransaction()) + { + db.ExecuteNonQuery(new SqlUpdate("calendar_events") + .Set("uid", uid) + .Where(Exp.Eq("id", eventId))); - tr.Commit(); + tr.Commit(); + } } } public void UnsubscribeFromEvent(int eventID, Guid userId) { - using (var tr = db.BeginTransaction()) + using (var db = new DbManager(DBId)) { - if (db.ExecuteNonQuery(new SqlDelete("calendar_event_item").Where(Exp.Eq("event_id", eventID) - & Exp.Eq("item_id", userId) - & Exp.Eq("is_group", false))) == 0) + using (var tr = db.BeginTransaction()) { - db.ExecuteNonQuery(new SqlInsert("calendar_event_user", true).InColumnValue("event_id", eventID) - .InColumnValue("user_id", userId) - .InColumnValue("is_unsubscribe", true)); - } + if (db.ExecuteNonQuery(new SqlDelete("calendar_event_item").Where(Exp.Eq("event_id", eventID) + & Exp.Eq("item_id", userId) + & Exp.Eq("is_group", false))) == 0) + { + db.ExecuteNonQuery(new SqlInsert("calendar_event_user", true).InColumnValue("event_id", eventID) + .InColumnValue("user_id", userId) + .InColumnValue("is_unsubscribe", true)); + } - db.ExecuteNonQuery(new SqlDelete("calendar_notifications").Where(Exp.Eq("event_id", eventID) & Exp.Eq("user_id", userId))); + db.ExecuteNonQuery(new SqlDelete("calendar_notifications").Where(Exp.Eq("event_id", eventID) & Exp.Eq("user_id", userId))); - tr.Commit(); + tr.Commit(); + } } } public void RemoveEvent(int eventId) { - using (var tr = db.BeginTransaction()) + using (var db = new DbManager(DBId)) { - var tenant = CoreContext.TenantManager.GetCurrentTenant().TenantId; + using (var tr = db.BeginTransaction()) + { + var tenant = CoreContext.TenantManager.GetCurrentTenant().TenantId; - db.ExecuteNonQuery(new SqlDelete("calendar_events").Where("id", eventId).Where("tenant", tenant)); - db.ExecuteNonQuery(new SqlDelete("calendar_event_item").Where("event_id", eventId)); - db.ExecuteNonQuery(new SqlDelete("calendar_event_user").Where("event_id", eventId)); - db.ExecuteNonQuery(new SqlDelete("calendar_notifications").Where("event_id", eventId)); - db.ExecuteNonQuery(new SqlDelete("calendar_event_history").Where("tenant", tenant).Where("event_id", eventId)); + db.ExecuteNonQuery(new SqlDelete("calendar_events").Where("id", eventId).Where("tenant", tenant)); + db.ExecuteNonQuery(new SqlDelete("calendar_event_item").Where("event_id", eventId)); + db.ExecuteNonQuery(new SqlDelete("calendar_event_user").Where("event_id", eventId)); + db.ExecuteNonQuery(new SqlDelete("calendar_notifications").Where("event_id", eventId)); + db.ExecuteNonQuery(new SqlDelete("calendar_event_history").Where("tenant", tenant).Where("event_id", eventId)); - tr.Commit(); + tr.Commit(); + } } } @@ -1207,48 +1319,52 @@ public Event CreateEvent(int calendarId, bool hasAttachments) { int eventId; - using (var tr = db.BeginTransaction()) - { - description = StringUtils.NormalizeStringForMySql(description); - name = StringUtils.NormalizeStringForMySql(name); - eventId = db.ExecuteScalar(new SqlInsert("calendar_events") - .InColumnValue("id", 0) - .InColumnValue("tenant", - CoreContext.TenantManager.GetCurrentTenant - ().TenantId) - .InColumnValue("name", name) - .InColumnValue("description", description) - .InColumnValue("calendar_id", calendarId) - .InColumnValue("owner_id", ownerId) - .InColumnValue("start_date", - utcStartDate.ToString( - "yyyy-MM-dd HH:mm:ss")) - .InColumnValue("end_date", - utcEndDate.ToString("yyyy-MM-dd HH:mm:ss")) - .InColumnValue("update_date", createDate.ToString("yyyy-MM-dd HH:mm:ss")) - .InColumnValue("all_day_long", isAllDayLong) - .InColumnValue("rrule", rrule.ToString()) - .InColumnValue("alert_type", (int)alertType) - .InColumnValue("uid", GetEventUid(uid)) - .InColumnValue("status", (int)status) - .InColumnValue("time_zone", timeZone?.Id) - .InColumnValue("has_attachments", hasAttachments) - .Identity(0, 0, true)); - - foreach (var item in publicItems) + description = StringUtils.NormalizeStringForMySql(description); + name = StringUtils.NormalizeStringForMySql(name); + + using (var db = new DbManager(DBId)) + { + using (var tr = db.BeginTransaction()) { - db.ExecuteNonQuery(new SqlInsert("calendar_event_item") - .InColumnValue("event_id", eventId) - .InColumnValue("item_id", item.Id) - .InColumnValue("is_group", item.IsGroup)); - } + eventId = db.ExecuteScalar(new SqlInsert("calendar_events") + .InColumnValue("id", 0) + .InColumnValue("tenant", + CoreContext.TenantManager.GetCurrentTenant + ().TenantId) + .InColumnValue("name", name) + .InColumnValue("description", description) + .InColumnValue("calendar_id", calendarId) + .InColumnValue("owner_id", ownerId) + .InColumnValue("start_date", + utcStartDate.ToString( + "yyyy-MM-dd HH:mm:ss")) + .InColumnValue("end_date", + utcEndDate.ToString("yyyy-MM-dd HH:mm:ss")) + .InColumnValue("update_date", createDate.ToString("yyyy-MM-dd HH:mm:ss")) + .InColumnValue("all_day_long", isAllDayLong) + .InColumnValue("rrule", rrule.ToString()) + .InColumnValue("alert_type", (int)alertType) + .InColumnValue("uid", GetEventUid(uid)) + .InColumnValue("status", (int)status) + .InColumnValue("time_zone", timeZone?.Id) + .InColumnValue("has_attachments", hasAttachments) + .Identity(0, 0, true)); - //update notifications - UpdateEventNotifications(eventId, calendarId, utcStartDate, alertType, rrule, publicItems, null, isAllDayLong, timeZone); + foreach (var item in publicItems) + { + db.ExecuteNonQuery(new SqlInsert("calendar_event_item") + .InColumnValue("event_id", eventId) + .InColumnValue("item_id", item.Id) + .InColumnValue("is_group", item.IsGroup)); + + } - tr.Commit(); + tr.Commit(); + } } + //update notifications + UpdateEventNotifications(eventId, calendarId, utcStartDate, alertType, rrule, publicItems, null, isAllDayLong, timeZone); return GetEventById(eventId); } @@ -1270,74 +1386,77 @@ public Event UpdateEvent(int eventId, bool hasAttachments ) { - using (var tr = db.BeginTransaction()) - { - var query = new SqlUpdate("calendar_events") - .Set("name", name) - .Set("description", description) - .Set("calendar_id", calendarId) - .Set("owner_id", ownerId) - .Set("start_date", utcStartDate.ToString("yyyy-MM-dd HH:mm:ss")) - .Set("end_date", utcEndDate.ToString("yyyy-MM-dd HH:mm:ss")) - .Set("update_date", createDate.ToString("yyyy-MM-dd HH:mm:ss")) - .Set("all_day_long", isAllDayLong) - .Set("rrule", rrule.ToString()) - .Set("status", (int)status) - .Set("time_zone", timeZone?.Id) - .Set("has_attachments", hasAttachments) - .Where(Exp.Eq("id", eventId)); - - if (ownerId.Equals(SecurityContext.CurrentAccount.ID)) - query = query.Set("alert_type", (int)alertType); - else - db.ExecuteNonQuery(new SqlInsert("calendar_event_user", true) - .InColumnValue("event_id", eventId) - .InColumnValue("user_id", SecurityContext.CurrentAccount.ID) - .InColumnValue("alert_type", alertType)); + List baseAlertTypeList; + using (var db = new DbManager(DBId)) + { + using (var tr = db.BeginTransaction()) + { + var query = new SqlUpdate("calendar_events") + .Set("name", name) + .Set("description", description) + .Set("calendar_id", calendarId) + .Set("owner_id", ownerId) + .Set("start_date", utcStartDate.ToString("yyyy-MM-dd HH:mm:ss")) + .Set("end_date", utcEndDate.ToString("yyyy-MM-dd HH:mm:ss")) + .Set("update_date", createDate.ToString("yyyy-MM-dd HH:mm:ss")) + .Set("all_day_long", isAllDayLong) + .Set("rrule", rrule.ToString()) + .Set("status", (int)status) + .Set("time_zone", timeZone?.Id) + .Set("has_attachments", hasAttachments) + .Where(Exp.Eq("id", eventId)); + + if (ownerId.Equals(SecurityContext.CurrentAccount.ID)) + query = query.Set("alert_type", (int)alertType); + else + db.ExecuteNonQuery(new SqlInsert("calendar_event_user", true) + .InColumnValue("event_id", eventId) + .InColumnValue("user_id", SecurityContext.CurrentAccount.ID) + .InColumnValue("alert_type", alertType)); - db.ExecuteNonQuery(query); - var userIds = db.ExecuteList(new SqlQuery("calendar_event_user") - .Select("user_id") - .Where("event_id", eventId)) - .Select(r => new Guid(Convert.ToString(r[0]))); + db.ExecuteNonQuery(query); - foreach (var usrId in userIds) - { - if (!publicItems.Exists(i => (i.IsGroup && CoreContext.UserManager.IsUserInGroup(usrId, i.Id)) - || (!i.IsGroup && i.Id.Equals(usrId)))) + var userIds = db.ExecuteList(new SqlQuery("calendar_event_user") + .Select("user_id") + .Where("event_id", eventId)) + .Select(r => new Guid(Convert.ToString(r[0]))); + + foreach (var usrId in userIds) { - db.ExecuteNonQuery(new SqlDelete("calendar_event_user") - .Where(Exp.Eq("user_id", usrId) & Exp.Eq("event_id", eventId))); + if (!publicItems.Exists(i => (i.IsGroup && CoreContext.UserManager.IsUserInGroup(usrId, i.Id)) + || (!i.IsGroup && i.Id.Equals(usrId)))) + { + db.ExecuteNonQuery(new SqlDelete("calendar_event_user") + .Where(Exp.Eq("user_id", usrId) & Exp.Eq("event_id", eventId))); + } } - } - - db.ExecuteNonQuery(new SqlDelete("calendar_event_item").Where("event_id", eventId)); - foreach (var item in publicItems) - { - db.ExecuteNonQuery(new SqlInsert("calendar_event_item") - .InColumnValue("event_id", eventId) - .InColumnValue("item_id", item.Id) - .InColumnValue("is_group", item.IsGroup)); + db.ExecuteNonQuery(new SqlDelete("calendar_event_item").Where("event_id", eventId)); + foreach (var item in publicItems) + { + db.ExecuteNonQuery(new SqlInsert("calendar_event_item") + .InColumnValue("event_id", eventId) + .InColumnValue("item_id", item.Id) + .InColumnValue("is_group", item.IsGroup)); - } - //update notifications - var baseAlertType = - db.ExecuteList(new SqlQuery("calendar_events").Select("alert_type").Where("id", eventId)) - .Select(r => (EventAlertType)Convert.ToInt32(r[0])).First(); - UpdateEventNotifications(eventId, calendarId, utcStartDate, baseAlertType, rrule, publicItems, null, isAllDayLong, timeZone); + } + baseAlertTypeList = db.ExecuteList(new SqlQuery("calendar_events").Select("alert_type").Where("id", eventId)); - tr.Commit(); + tr.Commit(); + } } - return GetEventById(eventId); - } + //update notifications + var baseAlertType = baseAlertTypeList.Select(r => (EventAlertType)Convert.ToInt32(r[0])).First(); + UpdateEventNotifications(eventId, calendarId, utcStartDate, baseAlertType, rrule, publicItems, null, isAllDayLong, timeZone); + return GetEventById(eventId); + } public EventHistory GetEventHistory(string eventUid) { @@ -1354,7 +1473,12 @@ public EventHistory GetEventHistory(string eventUid) .Where("c.owner_id", SecurityContext.CurrentAccount.ID) .Where("c.ical_url", null); - var items = db.ExecuteList(sql).ConvertAll(ToEventHistory); + List itemsList; + using (var db = new DbManager(DBId)) + { + itemsList = db.ExecuteList(sql); + } + var items = itemsList.ConvertAll(ToEventHistory); return items.Count > 0 ? items[0] : null; } @@ -1369,7 +1493,12 @@ public List GetEventsHistory(int[] eventIds) .Where("tenant", CoreContext.TenantManager.GetCurrentTenant().TenantId) .Where(Exp.In("event_id", eventIds)); - return db.ExecuteList(sql).ConvertAll(ToEventHistory); + List itemsList; + using (var db = new DbManager(DBId)) + { + itemsList = db.ExecuteList(sql); + } + return itemsList.ConvertAll(ToEventHistory); } public EventHistory GetEventHistory(int eventId) @@ -1387,47 +1516,49 @@ public EventHistory AddEventHistory(int calendarId, string eventUid, int eventId if (icsEvent == null) return null; - EventHistory history; - using (var tr = db.BeginTransaction()) - { - ISqlInstruction sql; - - history = GetEventHistory(eventId); + EventHistory history = GetEventHistory(eventId); - if (history == null) - { - history = new EventHistory(calendarId, eventUid, eventId, ics); - - sql = new SqlInsert("calendar_event_history") - .InColumnValue("tenant", CoreContext.TenantManager.GetCurrentTenant().TenantId) - .InColumnValue("calendar_id", calendarId) - .InColumnValue("event_uid", eventUid) - .InColumnValue("event_id", eventId) - .InColumnValue("ics", history.Ics); - } - else + using (var db = new DbManager(DBId)) + { + using (var tr = db.BeginTransaction()) { - var exist = history.History - .Where(x => x.Method == icsCalendar.Method) - .Select(x => x.Events.FirstOrDefault()) - .Any(x => x.Uid == icsEvent.Uid && - x.Sequence == icsEvent.Sequence && - DDayICalParser.ToUtc(x.DtStamp) == DDayICalParser.ToUtc(icsEvent.DtStamp)); - - if (exist) return history; - - history.Ics = history.Ics + Environment.NewLine + ics; - - sql = new SqlUpdate("calendar_event_history") - .Set("ics", history.Ics) - .Where("tenant", CoreContext.TenantManager.GetCurrentTenant().TenantId) - .Where("calendar_id", calendarId) - .Where("event_uid", eventUid); - } + ISqlInstruction sql; - db.ExecuteNonQuery(sql); + if (history == null) + { + history = new EventHistory(calendarId, eventUid, eventId, ics); + + sql = new SqlInsert("calendar_event_history") + .InColumnValue("tenant", CoreContext.TenantManager.GetCurrentTenant().TenantId) + .InColumnValue("calendar_id", calendarId) + .InColumnValue("event_uid", eventUid) + .InColumnValue("event_id", eventId) + .InColumnValue("ics", history.Ics); + } + else + { + var exist = history.History + .Where(x => x.Method == icsCalendar.Method) + .Select(x => x.Events.FirstOrDefault()) + .Any(x => x.Uid == icsEvent.Uid && + x.Sequence == icsEvent.Sequence && + DDayICalParser.ToUtc(x.DtStamp) == DDayICalParser.ToUtc(icsEvent.DtStamp)); + + if (exist) return history; + + history.Ics = history.Ics + Environment.NewLine + ics; + + sql = new SqlUpdate("calendar_event_history") + .Set("ics", history.Ics) + .Where("tenant", CoreContext.TenantManager.GetCurrentTenant().TenantId) + .Where("calendar_id", calendarId) + .Where("event_uid", eventUid); + } - tr.Commit(); + db.ExecuteNonQuery(sql); + + tr.Commit(); + } } return history; @@ -1440,7 +1571,10 @@ public void RemoveEventHistory(int calendarId, string eventUid) .Where("calendar_id", calendarId) .Where("event_uid", eventUid); - db.ExecuteNonQuery(sql); + using (var db = new DbManager(DBId)) + { + db.ExecuteNonQuery(sql); + } } public void RemoveEventHistory(int eventId) @@ -1449,7 +1583,10 @@ public void RemoveEventHistory(int eventId) .Where("tenant", CoreContext.TenantManager.GetCurrentTenant().TenantId) .Where("event_id", eventId); - db.ExecuteNonQuery(sql); + using (var db = new DbManager(DBId)) + { + db.ExecuteNonQuery(sql); + } } private static EventHistory ToEventHistory(object[] row) @@ -1552,18 +1689,23 @@ public UserAlertType(Guid userId, EventAlertType alertType, TimeZoneInfo timeZon private void UpdateEventNotifications(int eventId, int calendarId, DateTime eventUtcStartDate, EventAlertType baseEventAlertType, RecurrenceRule rrule, IEnumerable eventPublicItems, IEnumerable calendarPublicItems, - bool isAllDayLong, TimeZoneInfo eventTimeZone, IDbManager dbManager = null) + bool isAllDayLong, TimeZoneInfo eventTimeZone) { - dbManager = dbManager == null ? db : dbManager; var cc = new ColumnCollection(); var userIdCol = cc.RegistryColumn("user_id"); var alertTypeCol = cc.RegistryColumn("alert_type"); var isUnsubscribeCol = cc.RegistryColumn("is_unsubscribe"); - var eventUsersData = dbManager.ExecuteList(new SqlQuery("calendar_event_user").Select(cc.SelectQuery).Where(Exp.Eq("event_id", eventId))); - var calendarData = dbManager.ExecuteList(new SqlQuery("calendar_calendars").Select("alert_type", "owner_id", "time_zone").Where(Exp.Eq("id", calendarId))); + List eventUsersData; + List calendarData; + using (var db = new DbManager(DBId)) + { + eventUsersData = db.ExecuteList(new SqlQuery("calendar_event_user").Select(cc.SelectQuery).Where(Exp.Eq("event_id", eventId))); + calendarData = db.ExecuteList(new SqlQuery("calendar_calendars").Select("alert_type", "owner_id", "time_zone").Where(Exp.Eq("id", calendarId))); + } + var calendarAlertType = calendarData.Select(r => (EventAlertType)Convert.ToInt32(r[0])).First(); var calendarOwner = calendarData.Select(r => new Guid(Convert.ToString(r[1]))).First(); var calendarTimeZone = calendarData.Select(r => TimeZoneConverter.GetTimeZone(Convert.ToString(r[2]))).First(); @@ -1574,8 +1716,12 @@ private void UpdateEventNotifications(int eventId, int calendarId, DateTime even if (eventPublicItems == null) { - eventPublicItems = new List(dbManager.ExecuteList(new SqlQuery("calendar_event_item").Select("item_id", "is_group").Where(Exp.Eq("event_id", eventId))) - .Select(r => new SharingOptions.PublicItem { Id = new Guid(Convert.ToString(r[0])), IsGroup = Convert.ToBoolean(r[1]) })); + List eventPublicItemIdsList; + using(var db = new DbManager(DBId)) + { + eventPublicItemIdsList = db.ExecuteList(new SqlQuery("calendar_event_item").Select("item_id", "is_group").Where(Exp.Eq("event_id", eventId))); + } + eventPublicItems = new List(eventPublicItemIdsList.Select(r => new SharingOptions.PublicItem { Id = new Guid(Convert.ToString(r[0])), IsGroup = Convert.ToBoolean(r[1]) })); } foreach (var item in eventPublicItems) @@ -1609,10 +1755,14 @@ private void UpdateEventNotifications(int eventId, int calendarId, DateTime even //remove and exec sharing calendar options if (eventUsers.Count > 0) { - var extCalendarAlertTypes = dbManager.ExecuteList(new SqlQuery("calendar_calendar_user cu") + List extCalendarAlertTypes; + using (var db = new DbManager(DBId)) + { + extCalendarAlertTypes = db.ExecuteList(new SqlQuery("calendar_calendar_user cu") .Select("cu.user_id", "cu.alert_type", "cu.is_accepted", "cu.time_zone") .Where(Exp.Eq("cu.ext_calendar_id", SharedEventsCalendar.CalendarId) & Exp.In("cu.user_id", eventUsers.Select(u => u.UserId).ToArray()))); - + } + foreach (var r in extCalendarAlertTypes) { if (!Convert.ToBoolean(r[2])) @@ -1644,8 +1794,11 @@ private void UpdateEventNotifications(int eventId, int calendarId, DateTime even if (calendarPublicItems == null) { - calendarPublicItems = new List(dbManager.ExecuteList(new SqlQuery("calendar_calendar_item").Select("item_id", "is_group").Where(Exp.Eq("calendar_id", calendarId))) + using (var db = new DbManager(DBId)) + { + calendarPublicItems = new List(db.ExecuteList(new SqlQuery("calendar_calendar_item").Select("item_id", "is_group").Where(Exp.Eq("calendar_id", calendarId))) .Select(r => new SharingOptions.PublicItem { Id = new Guid(Convert.ToString(r[0])), IsGroup = Convert.ToBoolean(r[1]) })); + } } //calendar users @@ -1660,10 +1813,15 @@ private void UpdateEventNotifications(int eventId, int calendarId, DateTime even calendarUsers.Add(new UserAlertType(calendarOwner, baseEventAlertType, calendarTimeZone, calendarAlertType)); - var users = dbManager.ExecuteList(new SqlQuery(_calendarUserTable).Select("cal_usr.user_id", "cal_usr.alert_type") + List usersList; + + using(var db = new DbManager(DBId)) + { + usersList = db.ExecuteList(new SqlQuery(_calendarUserTable).Select("cal_usr.user_id", "cal_usr.alert_type") .Where(Exp.Eq("cal_usr.calendar_id", calendarId)) - .Where(!Exp.Eq("cal_usr.user_id", calendarOwner))) - .Select(r => new UserAlertType(new Guid(Convert.ToString(r[0])), baseEventAlertType, calendarTimeZone, (EventAlertType)Convert.ToInt32(r[1]))).ToList(); + .Where(!Exp.Eq("cal_usr.user_id", calendarOwner))); + } + var users = usersList.Select(r => new UserAlertType(new Guid(Convert.ToString(r[0])), baseEventAlertType, calendarTimeZone, (EventAlertType)Convert.ToInt32(r[1]))).ToList(); calendarUsers = calendarUsers.Concat(users).ToList(); //remove event's users @@ -1683,9 +1841,14 @@ private void UpdateEventNotifications(int eventId, int calendarId, DateTime even } - var calendarAlertTypes = dbManager.ExecuteList(new SqlQuery("calendar_calendar_user") + List calendarAlertTypes; + + using (var db = new DbManager(DBId)) + { + calendarAlertTypes = db.ExecuteList(new SqlQuery("calendar_calendar_user") .Select("user_id", "alert_type", "is_accepted", "time_zone") .Where(Exp.Eq("calendar_id", calendarId) & Exp.In("user_id", calendarUsers.Select(u => u.UserId).ToArray()))); + } foreach (var r in calendarAlertTypes) { @@ -1716,7 +1879,11 @@ private void UpdateEventNotifications(int eventId, int calendarId, DateTime even //clear notifications - dbManager.ExecuteNonQuery(new SqlDelete("calendar_notifications").Where("event_id", eventId)); + using(var db = new DbManager(DBId)) + { + db.ExecuteNonQuery(new SqlDelete("calendar_notifications").Where("event_id", eventId)); + } + eventUsers.AddRange(calendarUsers); @@ -1726,13 +1893,17 @@ private void UpdateEventNotifications(int eventId, int calendarId, DateTime even var alertDate = GetNextAlertDate(eventUtcStartDate, rrule, u.AlertType, u.TimeZone, isAllDayLong, eventTimeZone ?? u.TimeZone); if (!alertDate.Equals(DateTime.MinValue)) { - dbManager.ExecuteNonQuery(new SqlInsert("calendar_notifications", true).InColumnValue("user_id", u.UserId) - .InColumnValue("event_id", eventId) - .InColumnValue("rrule", rrule.ToString()) - .InColumnValue("alert_type", (int)u.AlertType) - .InColumnValue("tenant", CoreContext.TenantManager.GetCurrentTenant().TenantId) - .InColumnValue("notify_date", alertDate) - .InColumnValue("time_zone", u.TimeZone.Id)); + using (var db = new DbManager(DBId)) + { + db.ExecuteNonQuery(new SqlInsert("calendar_notifications", true).InColumnValue("user_id", u.UserId) + .InColumnValue("event_id", eventId) + .InColumnValue("rrule", rrule.ToString()) + .InColumnValue("alert_type", (int)u.AlertType) + .InColumnValue("tenant", CoreContext.TenantManager.GetCurrentTenant().TenantId) + .InColumnValue("notify_date", alertDate) + .InColumnValue("time_zone", u.TimeZone.Id)); + } + } } } @@ -1740,57 +1911,60 @@ private void UpdateEventNotifications(int eventId, int calendarId, DateTime even public List ExtractAndRecountNotifications(DateTime utcDate) { List data; - using (var tr = db.BeginTransaction()) - { - var cc = new ColumnCollection(); - var userIdCol = cc.RegistryColumn("user_id"); - var tenantCol = cc.RegistryColumn("tenant"); - var eventIdCol = cc.RegistryColumn("event_id"); - var notifyDateCol = cc.RegistryColumn("notify_date"); - var rruleCol = cc.RegistryColumn("rrule"); - var alertTypeCol = cc.RegistryColumn("alert_type"); - var timeZoneCol = cc.RegistryColumn("time_zone"); - - data = new List(db.ExecuteList(new SqlQuery("calendar_notifications").Select(cc.SelectQuery) - .Where(Exp.Le(notifyDateCol.Name, utcDate))) - .Select(r => new EventNotificationData - { - UserId = userIdCol.Parse(r), - TenantId = tenantCol.Parse(r), - EventId = eventIdCol.Parse(r), - NotifyUtcDate = notifyDateCol.Parse(r), - RRule = rruleCol.Parse(r), - AlertType = (EventAlertType)alertTypeCol.Parse(r), - TimeZone = timeZoneCol.Parse(r) - })); - - - var events = GetEventsByIds(data.Select(d => (object)d.EventId).Distinct().ToArray(), Guid.Empty); - data.ForEach(d => d.Event = events.Find(e => String.Equals(e.Id, d.EventId.ToString(CultureInfo.InvariantCulture), StringComparison.InvariantCultureIgnoreCase))); - - foreach (var d in data) + using (var db = new DbManager(DBId)) + { + using (var tr = db.BeginTransaction()) { - if (d.RRule.Freq == Frequency.Never) - db.ExecuteNonQuery(new SqlDelete("calendar_notifications").Where(Exp.Eq("user_id", d.UserId) & Exp.Eq("event_id", d.EventId))); - else + var cc = new ColumnCollection(); + var userIdCol = cc.RegistryColumn("user_id"); + var tenantCol = cc.RegistryColumn("tenant"); + var eventIdCol = cc.RegistryColumn("event_id"); + var notifyDateCol = cc.RegistryColumn("notify_date"); + var rruleCol = cc.RegistryColumn("rrule"); + var alertTypeCol = cc.RegistryColumn("alert_type"); + var timeZoneCol = cc.RegistryColumn("time_zone"); + + data = new List(db.ExecuteList(new SqlQuery("calendar_notifications").Select(cc.SelectQuery) + .Where(Exp.Le(notifyDateCol.Name, utcDate))) + .Select(r => new EventNotificationData + { + UserId = userIdCol.Parse(r), + TenantId = tenantCol.Parse(r), + EventId = eventIdCol.Parse(r), + NotifyUtcDate = notifyDateCol.Parse(r), + RRule = rruleCol.Parse(r), + AlertType = (EventAlertType)alertTypeCol.Parse(r), + TimeZone = timeZoneCol.Parse(r) + })); + + + var events = GetEventsByIds(data.Select(d => (object)d.EventId).Distinct().ToArray(), Guid.Empty); + data.ForEach(d => d.Event = events.Find(e => String.Equals(e.Id, d.EventId.ToString(CultureInfo.InvariantCulture), StringComparison.InvariantCultureIgnoreCase))); + + foreach (var d in data) { - var alertDate = GetNextAlertDate(d.Event.UtcStartDate, d.RRule, d.AlertType, d.TimeZone, d.Event.AllDayLong, d.Event.TimeZone ?? d.TimeZone); - if (!alertDate.Equals(DateTime.MinValue)) + if (d.RRule.Freq == Frequency.Never) + db.ExecuteNonQuery(new SqlDelete("calendar_notifications").Where(Exp.Eq("user_id", d.UserId) & Exp.Eq("event_id", d.EventId))); + else { - db.ExecuteNonQuery(new SqlInsert("calendar_notifications", true).InColumnValue("user_id", d.UserId) - .InColumnValue("event_id", d.EventId) - .InColumnValue("rrule", d.RRule.ToString()) - .InColumnValue("alert_type", (int)d.AlertType) - .InColumnValue("tenant", d.TenantId) - .InColumnValue("notify_date", alertDate) - .InColumnValue("time_zone", d.TimeZone.Id)); + var alertDate = GetNextAlertDate(d.Event.UtcStartDate, d.RRule, d.AlertType, d.TimeZone, d.Event.AllDayLong, d.Event.TimeZone ?? d.TimeZone); + if (!alertDate.Equals(DateTime.MinValue)) + { + db.ExecuteNonQuery(new SqlInsert("calendar_notifications", true).InColumnValue("user_id", d.UserId) + .InColumnValue("event_id", d.EventId) + .InColumnValue("rrule", d.RRule.ToString()) + .InColumnValue("alert_type", (int)d.AlertType) + .InColumnValue("tenant", d.TenantId) + .InColumnValue("notify_date", alertDate) + .InColumnValue("time_zone", d.TimeZone.Id)); + } + else + db.ExecuteNonQuery(new SqlDelete("calendar_notifications").Where(Exp.Eq("user_id", d.UserId) & Exp.Eq("event_id", d.EventId))); } - else - db.ExecuteNonQuery(new SqlDelete("calendar_notifications").Where(Exp.Eq("user_id", d.UserId) & Exp.Eq("event_id", d.EventId))); } - } - tr.Commit(); + tr.Commit(); + } } return data; @@ -1800,10 +1974,7 @@ public List ExtractAndRecountNotifications(DateTime utcDa public void Dispose() { - if (HttpContext.Current == null && _db != null) - { - _db.Dispose(); - } + } } } diff --git a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/Event.cs b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/Event.cs index 2b244a47c..6f9215cb3 100644 --- a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/Event.cs +++ b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/Event.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/EventHistory.cs b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/EventHistory.cs index 63a013187..f056ba739 100644 --- a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/EventHistory.cs +++ b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/EventHistory.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Linq; diff --git a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/EventNotificationData.cs b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/EventNotificationData.cs index 0b2ec82db..f6b4784ab 100644 --- a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/EventNotificationData.cs +++ b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/EventNotificationData.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/Todo.cs b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/Todo.cs index b017ee44c..b315a1606 100644 --- a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/Todo.cs +++ b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/Todo.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; diff --git a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/UserViewSettings.cs b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/UserViewSettings.cs index 6ed33188b..26c1186e8 100644 --- a/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/UserViewSettings.cs +++ b/module/ASC.Api/ASC.Api.Calendar/BusinessObjects/UserViewSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/CalendarApi.cs b/module/ASC.Api/ASC.Api.Calendar/CalendarApi.cs index 7a9c16341..c4dffe40c 100644 --- a/module/ASC.Api/ASC.Api.Calendar/CalendarApi.cs +++ b/module/ASC.Api/ASC.Api.Calendar/CalendarApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,6 +69,7 @@ namespace ASC.Api.Calendar /// /// Access to the calendars. /// + ///calendar public class iCalApiContentResponse : IApiContentResponce { private readonly Stream _stream; @@ -155,6 +156,7 @@ public string Name private static readonly List updatedEvents = new List(); private readonly ApiContext _context; private const int _monthCount = 3; + private const string DBId = "default"; protected DataProvider _dataProvider; private static readonly ILog Logger = LogManager.GetLogger("ASC.Calendar"); @@ -192,10 +194,13 @@ private CalendarApi() /// /// Get event days /// - /// Period start date - /// Period end date + /// Period start date + /// Period end date /// Events /// List of dates + /// GET + /// api/2.0/calendar/eventdays/{startDate}/{endDate} + /// list /// false [Read("eventdays/{startDate}/{endDate}")] public List GetEventDays(ApiDateTime startDate, ApiDateTime endDate) @@ -271,10 +276,12 @@ public List GetEventDays(ApiDateTime startDate, ApiDateTime endDate /// /// Get calendars /// - /// Period start date - /// Period end date + /// Period start date + /// Period end date /// Calendars and subscriptions - /// List of calendars with events + /// GET + /// api/2.0/calendar/calendars/{startDate}/{endDate} + /// List of calendars with events [Read("calendars/{startDate}/{endDate}")] public List LoadCalendars(ApiDateTime startDate, ApiDateTime endDate) { @@ -358,6 +365,61 @@ public List LoadCalendars(ApiDateTime startDate, ApiDateTime en } + /// + /// Returns a calendar with the events for the current user in the selected period. + /// + /// + /// Get calendar events + /// + /// Calendar ID + /// Period start date + /// Period end date + /// Calendars and subscriptions + /// GET + /// api/2.0/calendar/calendar/{calendarId}/{startDate}/{endDate} + /// Calendar with events + [Read("calendar/{calendarId}/{startDate}/{endDate}")] + public CalendarWrapper GetCalendarEvents(string calendarId, ApiDateTime startDate, ApiDateTime endDate) + { + int calId; + CalendarWrapper result= null; + + if (int.TryParse(calendarId, out calId)) + { + var cal = _dataProvider.GetCalendarById(calId); + if (CanRead(cal)) + { + result = new CalendarWrapper(cal); + } + else + { + return null; + } + } + else + { + var extCalendar = CalendarManager.Instance.GetCalendarForUser(SecurityContext.CurrentAccount.ID, calendarId); + if (extCalendar != null) + { + var viewSettings = _dataProvider.GetUserViewSettings(SecurityContext.CurrentAccount.ID, new List { calendarId }); + result = new CalendarWrapper(extCalendar, viewSettings.FirstOrDefault()); + } + else + { + return null; + } + } + + if(result != null) + { + result.Events = result.UserCalendar.GetEventWrappers(SecurityContext.CurrentAccount.ID, startDate, endDate); + result.Todos = result.UserCalendar.GetTodoWrappers(SecurityContext.CurrentAccount.ID, startDate, endDate); + + return result; + } + return null; + } + private List LoadInternalCalendars(List userCalendars = null) { var result = new List(); @@ -406,7 +468,11 @@ private List LoadInternalCalendars(List /// Calendars and subscriptions - /// List of subscriptions + /// Please note that the list of events in the response will be empty. + /// List of subscriptions + /// list + /// api/2.0/calendar/subscriptions + /// GET [Read("subscriptions")] public List LoadSubscriptions() { @@ -446,13 +512,15 @@ public class SubscriptionState } /// - /// Updates the subscription states either subscribing or unsubscribing the user to/from it. + /// Updates the subscription states either subscribing or unsubscribing a user to/from it. /// /// /// Update the subscription states /// - /// New subscription states + /// New subscription states /// Calendars and subscriptions + /// api/2.0/calendar/subscriptions/manage + /// PUT /// false [Update("subscriptions/manage")] public void ManageSubscriptions(IEnumerable states) @@ -484,9 +552,12 @@ public void ManageSubscriptions(IEnumerable states) /// /// Get a calendar by ID /// - /// Calendar ID + /// api/2.0/calendar/{calendarId} + /// GET + /// Calendar ID + /// Please note that the list of events in the response will be empty. /// Calendars and subscriptions - /// Calendar + /// Calendar [Read("{calendarId}")] public CalendarWrapper GetCalendarById(string calendarId) { @@ -529,17 +600,20 @@ public bool isGroup /// /// Create a calendar /// - /// Calendar name - /// Calendar description - /// Event text color - /// Event background color - /// Calendar time zone - /// Event alert type, in case alert type is set by default - /// Calendar sharing options with other users - /// iCal URL - /// Defines if this calendar is for the todo list + /// Calendar name + /// Calendar description + /// Event text color + /// Event background color + /// Calendar time zone + /// Event alert type, in case alert type is set by default + /// Calendar sharing options with other users + /// iCal URL + /// Defines if the to-dos are shown in the calendar + /// Please note that the list of events in the response will be empty. /// Calendars and subscriptions - /// Created calendar + /// POST + /// api/2.0/calendar + /// Created calendar [Create("")] public async Task CreateCalendar(string name, string description, string textColor, string backgroundColor, string timeZone, EventAlertType alertType, List sharingOptions, string iCalUrl, int isTodo = 0) { @@ -702,18 +776,21 @@ public async Task CreateCalendar(string name, string descriptio /// /// Update a calendar /// - /// Calendar ID - /// New calendar name - /// New calendar description - /// New event text color - /// New event background color - /// New calendar time zone - /// New event alert type, in case alert type is set by default - /// Display type: show or hide events in the calendar - /// New calendar sharing options with other users - /// New iCal URL + /// Calendar ID + /// New calendar name + /// New calendar description + /// New event text color + /// New event background color + /// New calendar time zone + /// New event alert type, in case alert type is set by default + /// Display type: show or hide events in the calendar + /// New calendar sharing options with other users + /// New iCal URL + /// Please note that the list of events in the response will be empty. /// Calendars and subscriptions - /// Updated calendar + /// Updated calendar + /// api/2.0/calendar/{calendarId} + /// PUT [Update("{calendarId}")] public async Task UpdateCalendar(string calendarId, string name, string description, string textColor, string backgroundColor, string timeZone, EventAlertType alertType, bool hideEvents, List sharingOptions, string iCalUrl = "") { @@ -895,15 +972,18 @@ await UpdateSharedCalDavCalendarAsync(dataProvider, name, description, backgroun /// /// Update the calendar view /// - /// Calendar ID - /// New calendar name - /// New event text color - /// New event background color - /// New calendar time zone - /// New event alert type, in case alert type is set by default - /// Display type: show or hide events in calendar + /// Calendar ID + /// New calendar name + /// New event text color + /// New event background color + /// New calendar time zone + /// New event alert type, in case alert type is set by default + /// Display type: show or hide events in the calendar + /// Please note that the list of events in the response will be empty. /// Calendars and subscriptions - /// Updated calendar + /// Updated calendar + /// api/2.0/calendar/{calendarId}/view + /// PUT [Update("{calendarId}/view")] public CalendarWrapper UpdateCalendarView(string calendarId, string name, string textColor, string backgroundColor, string timeZone, EventAlertType alertType, bool hideEvents) { @@ -935,7 +1015,10 @@ public CalendarWrapper UpdateCalendarView(string calendarId, string name, string /// /// Delete a calendar /// - /// Calendar ID + /// Calendar ID + /// Task awaiter + /// DELETE + /// api/2.0/calendar/{calendarId} /// Calendars and subscriptions [Delete("{calendarId}")] public async Task RemoveCalendar(int calendarId) @@ -1136,6 +1219,8 @@ private static async Task UpdateCaldavEventTask( { if (sendToRadicale) { + uid = uid.ToLower(); + guid = guid.ToLower(); try { if (guid != null && guid != "") @@ -1251,6 +1336,7 @@ private static async Task UpdateCaldavEventTask( private async Task CreateCaldavSharedEvents(string calendarId, string calendarIcs, Uri myUri, string currentUserEmail, BaseCalendar icalendar, Common.Security.Authentication.IAccount currentUser, int tenantId) { + calendarId = calendarId.ToLower(); var parseCalendar = DDayICalParser.DeserializeCalendar(calendarIcs); var calendar = parseCalendar.FirstOrDefault(); CoreContext.TenantManager.SetCurrentTenant(tenantId); @@ -1261,7 +1347,7 @@ private async Task CreateCaldavSharedEvents(string calendarId, string calendarIc var updateCaldavEventTasks = new List(); var events = new List(); var isFullAccess = false; - if (calendarId != BirthdayReminderCalendar.CalendarId && calendarId != "crm_calendar" && !calendarId.Contains("Project_")) + if (calendarId != BirthdayReminderCalendar.CalendarId && calendarId != "crm_calendar" && !calendarId.Contains("project_")) { foreach (var e in icalendar.LoadEvents(currentUser.ID, DateTime.MinValue, DateTime.MaxValue)) { @@ -1294,12 +1380,12 @@ private async Task CreateCaldavSharedEvents(string calendarId, string calendarIc var evtUid = split[0].Split(new Char[] { '_' }); e.Uid = evtUid[1]; } - else if (calendarId.Contains("Project_")) + else if (calendarId.Contains("project_")) { e.Created = null; e.End = new CalDateTime(e.End.AddDays(1)); } - else if (calendarId == "crm_calendar" || calendarId.Contains("Project_")) + else if (calendarId == "crm_calendar" || calendarId.Contains("project_")) { e.Created = null; e.Status = EventStatus.Confirmed.ToString(); @@ -1509,6 +1595,11 @@ private async Task UpdateCalDavEvent(string change, Uri calDavUrl) { var calendar = _dataProvider.GetCalendarIdByCaldavGuid(caldavGuid); + if (calendar.Count == 0) { + Logger.WarnFormat("Caldav calendar not found. Caldav guid: {0}", caldavGuid); + return; + } + calendarId = Convert.ToInt32(calendar[0][0]); ownerId = Guid.Parse(calendar[0][1].ToString()); CoreContext.TenantManager.SetCurrentTenant(Convert.ToInt32(calendar[0][2])); @@ -1579,7 +1670,35 @@ private async Task UpdateCalDavEvent(string change, Uri calDavUrl) alertType = EventAlertType.Day; } } + if (eventObj.Organizer == null) + { + var apiServer = new ApiServer(); + var apiResponse = apiServer.GetApiResponse(String.Format("{0}mail/accounts.json", SetupInfo.WebApiBaseUrl), "GET"); + var obj = JObject.Parse(Encoding.UTF8.GetString(Convert.FromBase64String(apiResponse))); + if (obj["response"] != null) + { + var accounts = (from account in JArray.Parse(obj["response"].ToString()) + let email = account.Value("email") + let enabled = account.Value("enabled") + let isGroup = account.Value("isGroup") + let isDefault = account.Value("isDefault") + where enabled && isDefault && !isGroup + select email).ToList(); + + if (accounts.Any()) + { + var user = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID); + eventObj.Organizer = new Organizer("mailto:" + accounts.FirstOrDefault()) + { + CommonName = string.IsNullOrEmpty(user.UserName) + ? accounts.FirstOrDefault() + : user.UserName + }; + } + } + + } //var utcStartDate = eventObj.IsAllDay ? eventObj.Start.Value : DDayICalParser.ToUtc(eventObj.Start); //var utcEndDate = eventObj.IsAllDay ? eventObj.End.Value : DDayICalParser.ToUtc(eventObj.End); @@ -1614,6 +1733,9 @@ await UpdateEvent(eventId, calendarId.ToString(), ics, alertType, } else { + var cal = new Ical.Net.Calendar(); + cal.Events.Add(eventObj); + ics = DDayICalParser.SerializeCalendar(cal); await AddEvent(calendarId, ics, alertType, null, eventGuid).ConfigureAwait(false); } } @@ -1654,6 +1776,10 @@ await UpdateEvent(eventId, calendarId.ToString(), ics, alertType, + } + catch(Exception e) + { + var t = e.Message; } finally { @@ -1928,9 +2054,11 @@ private async Task UpdateCaldavTask(string old_ics, string currentEventUid, Busi /// /// Get iCal link /// - /// Calendar ID + /// Calendar ID /// Calendars and subscriptions /// iCal link + /// api/2.0/calendar/{calendarId}/icalurl + /// GET [Read("{calendarId}/icalurl")] public string GetCalendariCalUrl(string calendarId) { @@ -1954,13 +2082,16 @@ public string GetCalendariCalUrl(string calendarId) /// /// Get CalDav link /// - /// Calendar ID - /// Current URI + /// Calendar ID + /// Current URI /// Calendars and subscriptions /// CalDav link + /// api/2.0/calendar/{calendarId}/caldavurl + /// GET [Read("{calendarId}/caldavurl")] public async Task GetCalendarCalDavUrl(string calendarId, Uri uri = null) { + calendarId = calendarId.ToLower(); var myUri = uri != null ? uri : HttpContext.Current.Request.GetUrlRewriter(); var calDavServerUrl = myUri.Scheme + "://" + myUri.Host + "/caldav"; @@ -1991,7 +2122,7 @@ public async Task GetCalendarCalDavUrl(string calendarId, Uri uri = if (todoCal != null) { - using (var db = DbManager.FromHttpContext("calendar")) + using (var db = new DbManager(DBId)) { using (var tr = db.BeginTransaction()) { @@ -2026,11 +2157,15 @@ public async Task GetCalendarCalDavUrl(string calendarId, Uri uri = ).ConfigureAwait(false); } todoCalDavCreateResponse.Data = sharedCalUrl; + tr.Commit(); + return todoCalDavCreateResponse; } catch (Exception exception) { Logger.Error("ERROR: " + exception.Message); + tr.Rollback(); + return new DavResponse() { Completed = false, @@ -2073,7 +2208,7 @@ public async Task GetCalendarCalDavUrl(string calendarId, Uri uri = if (calendarId == BirthdayReminderCalendar.CalendarId || calendarId == SharedEventsCalendar.CalendarId || calendarId == "crm_calendar" || - calendarId.Contains("Project_")) + calendarId.Contains("project_")) { if (SecurityContext.IsAuthenticated) @@ -2127,11 +2262,20 @@ public async Task GetCalendarCalDavUrl(string calendarId, Uri uri = }; } - + var calWrapper = GetCalendarById(calendarId); var cal = _dataProvider.GetCalendarById(Convert.ToInt32(calendarId)); + var ownerId = cal.OwnerId; - var isShared = ownerId != SecurityContext.CurrentAccount.ID; + var isOwner = ownerId == SecurityContext.CurrentAccount.ID; + var isReadOnly = false; + + if (!isOwner) + { + isReadOnly = !SecurityContext.PermissionResolver.Check(CoreContext.Authentication.GetAccountByID(SecurityContext.CurrentAccount.ID), cal, + null, CalendarAccessRights.FullAccessAction); + } + var calDavGuid = cal.calDavGuid; if (calDavGuid == "" || calDavGuid == Guid.Empty.ToString()) { @@ -2139,15 +2283,15 @@ public async Task GetCalendarCalDavUrl(string calendarId, Uri uri = _dataProvider.UpdateCalendarGuid(Convert.ToInt32(cal.Id), Guid.Parse(calDavGuid)); } - var calDavCalendar = new CalDavCalendar(calDavGuid.ToString(), isShared); - var calUrl = calDavCalendar.GetRadicaleUrl(myUri.ToString(), userName, isShared, false, true, calDavGuid.ToString()); + var calDavCalendar = new CalDavCalendar(calDavGuid.ToString(), isReadOnly); + var calUrl = calDavCalendar.GetRadicaleUrl(myUri.ToString(), userName, isReadOnly, false, true, calDavGuid.ToString()); var calDavResponse = calDavCalendar.GetCollection(calUrl, GetUserAuthorization(userName)).Result; if (!calDavResponse.Completed && calDavResponse.StatusCode == 404) { - return SyncCaldavCalendar(calendarId, cal.Name, cal.Description, cal.Context.HtmlBackgroundColor, Guid.Parse(calDavGuid), myUri, curCaldavUserName, userName, isShared, cal.SharingOptions).Result; + return SyncCaldavCalendar(calendarId, cal.Name, cal.Description, cal.Context.HtmlBackgroundColor, Guid.Parse(calDavGuid), myUri, curCaldavUserName, userName, isReadOnly, cal.SharingOptions).Result; } calDavResponse.Data = calUrl; return calDavResponse; @@ -2222,14 +2366,18 @@ private async Task SyncCaldavCalendar(string calendarId, /// - /// Updates a calendar storage with a new one specified in the request. + /// Replaces a calendar storage with a new one specified in the request. /// /// - /// Update a calendar storage + /// Change a calendar storage /// - /// New calendar storage - /// Email key + /// New calendar storage + /// Email key + /// Task awaiter /// Calendars and subscriptions + /// api/2.0/calendar/change_to_storage + /// GET + /// false /// false [Read("change_to_storage", false)] //NOTE: This method doesn't require auth!!! public async Task ChangeOfCalendarStorage(string change, string key) @@ -2257,9 +2405,13 @@ public async Task ChangeOfCalendarStorage(string change, string key) /// /// Delete the CalDav event information /// - /// Event information that will be deleted - /// Email key + /// Event information that will be deleted + /// Email key + /// Task awaiter /// Events + /// api/2.0/calendar/caldav_delete_event + /// GET + /// false /// false [Read("caldav_delete_event", false)] //NOTE: This method doesn't require auth!!! public async Task CaldavDeleteEvent(string eventInfo, string key) @@ -2356,12 +2508,15 @@ private async Task DeleteCalDavEvent(string eventInfo, Uri myUri) /// Returns the iCal feed associated with the calendar by its ID and signagure specified in the request. /// /// Get the iCal feed - /// Calendar ID - /// Signature - /// To get the feed you need to use the method returning the iCal feed link (it will generate the necessary signature). + /// Calendar ID + /// Signature + /// To get the feed, you need to use the method returning the iCal feed link (it will generate the necessary signature). /// Calendars and subscriptions /// Calendar iCal feed - [Read("{calendarId}/ical/{signature}", false)] //NOTE: This method doesn't require auth!!! + /// GET + /// false + /// api/2.0/calendar/{calendarId}/ical/{signature} + [Read("{calendarId}/ical/{signature}", false)] //NOTE: this method doesn't require auth!!! public iCalApiContentResponse GetCalendariCalStream(string calendarId, string signature) { try @@ -2569,14 +2724,16 @@ private string GetCalendariCalString(DataProvider dataProvider, string calendarI } /// - /// Imports the events from the iCal files specified in the request. + /// Imports the events from the iCal files to the default calendar. /// /// - /// Import events from the iCal files + /// Import the iCal events to the default calendar /// - /// iCal formatted files with the events + /// The iCal files with the events /// Events /// The number of imported events + /// POST + /// api/2.0/calendar/import [Create("import")] public int ImportEvents(IEnumerable files) { @@ -2593,12 +2750,14 @@ public int ImportEvents(IEnumerable files) /// Imports the events from the iCal files to the calendar with the ID specified in the request. /// /// - /// Import iCal events to the calendar + /// Import the iCal events to the specified calendar /// - /// Calendar ID - /// iCal formatted files with the events + /// Calendar ID + /// The iCal files with the events /// Events /// The number of imported events + /// api/2.0/calendar/{calendarId}/import + /// POST [Create("{calendarId}/import")] public int ImportEvents(int calendarId, IEnumerable files) { @@ -2621,16 +2780,18 @@ public int ImportEvents(int calendarId, IEnumerable files) } /// - /// Imports the events from the iCal files and attachments specified in the request. + /// Imports the events and attachments from the iCal files specified in the request. /// /// - /// Import events from the iCal files and attachments + /// Import the iCal events and attachments /// - /// Calendar ID - /// iCal formatted files with the events and attachments + /// Calendar ID + /// The iCal files with the events and attachments /// false /// Events /// The number of imported events + /// api/2.0/calendar/importFromAggregator + /// POST [Create("importFromAggregator")] public async Task ImportEventsFromAggregator(int calendarId, IEnumerable files) { @@ -2663,15 +2824,17 @@ public async Task ImportEventsFromAggregator(int calendarId, IEnumerable - /// Imports the events in the iCal format to the calendar with the ID specified in the request. + /// Imports the events from the iCal string to the calendar with the ID specified in the request. /// /// - /// Import ics + /// Import the events from the iCal string /// - /// Calendar ID - /// iCal formatted string with the events to be imported + /// Calendar ID + /// The iCal string with the events to be imported /// Events /// The number of imported events + /// api/2.0/calendar/importIcs + /// POST [Create("importIcs")] public int ImportEvents(int calendarId, string iCalString) { @@ -2929,14 +3092,17 @@ private async Task ImportEvents(int calendarId, IEnumerable /// - /// Create a calendar by iCal URL + /// Create a calendar by the iCal link /// - /// Link to the external iCal feed - /// Calendar name - /// Event text color - /// Event background name + /// Link to the external iCal feed + /// Calendar name + /// Event text color + /// Event background name + /// Please note that the list of events in the response will be empty. /// Calendars and subscriptions - /// Created calendar + /// api/2.0/calendar/calendarUrl + /// POST + /// Created calendar [Create("calendarUrl")] public CalendarWrapper CreateCalendarStream(string iCalUrl, string name, string textColor, string backgroundColor) { @@ -2973,16 +3139,19 @@ public CalendarWrapper CreateCalendarStream(string iCalUrl, string name, string /// /// Create a new event in the default calendar /// - /// Event name - /// Event description - /// Event start date - /// Event end date - /// Event recurrence type (RRULE string in the iCal format) - /// Event notification type - /// Event duration type: all day long or not - /// Event sharing access parameters + /// Event name + /// Event description + /// Event start date + /// Event end date + /// Event repeat type (RRULE string in the iCal format) + /// Event notification type + /// Event duration type: all day long or not + /// Event sharing access parameters /// Events - /// List of events + /// api/2.0/calendar/event + /// POST + /// list + /// Event list [Create("event")] public List AddEvent(string name, string description, ApiDateTime startDate, ApiDateTime endDate, string repeatType, EventAlertType alertType, bool isAllDayLong, List sharingOptions) { @@ -3005,17 +3174,20 @@ public List AddEvent(string name, string description, ApiDateTime /// /// Create a new event in the selected calendar /// - /// Calendar ID - /// Event name - /// Event description - /// Event start date - /// Event end date - /// Event recurrence type (RRULE string in iCal format) - /// Event notification type - /// Event duration type: all day long or not - /// Event sharing access parameters + /// Calendar ID + /// Event name + /// Event description + /// Event start date + /// Event end date + /// Event repeat type (RRULE string in the iCal format) + /// Event notification type + /// Event duration type: all day long or not + /// Event sharing access parameters /// Events - /// List of events + /// api/2.0/calendar/{calendarId}/event + /// POST + /// list + /// List of events [Create("{calendarId}/event")] public List AddEvent(int calendarId, string name, string description, ApiDateTime startDate, ApiDateTime endDate, string repeatType, EventAlertType alertType, bool isAllDayLong, List sharingOptions) { @@ -3098,19 +3270,22 @@ private List CreateEvent(int calendarId, string name, string descr /// /// Update an event /// - /// Calendar ID - /// Event ID - /// New event name - /// New event description - /// New event start date - /// New event end date - /// New event recurrence type (RRULE string in iCal format) - /// New event notification type - /// New event duration type: all day long or not - /// New event sharing access parameters - /// New event status + /// Calendar ID + /// Event ID + /// New event name + /// New event description + /// New event start date + /// New event end date + /// New event repeat type (RRULE string in the iCal format) + /// New event notification type + /// New event duration type: all day long or not + /// New event sharing access parameters + /// New event status /// Events - /// Updated list of events + /// Updated list of events + /// api/2.0/calendar/{calendarId}/{eventId} + /// PUT + /// list [Update("{calendarId}/{eventId}")] public List Update(string calendarId, int eventId, string name, string description, ApiDateTime startDate, ApiDateTime endDate, string repeatType, EventAlertType alertType, bool isAllDayLong, List sharingOptions, EventStatus status) { @@ -3186,10 +3361,13 @@ private List UpdateEvent(string calendarId, int eventId, string na /// /// Create a new task /// - /// Task in the iCal format - /// Task UID + /// Task in the iCal format + /// Task UID /// Tasks - /// Task + /// api/2.0/calendar/icstodo + /// POST + /// Task + /// list [Create("icstodo")] public async Task> AddTodo(string ics, string todoUid = null) { @@ -3293,12 +3471,15 @@ public async Task> AddTodo(string ics, string todoUid = null) /// /// Update a task /// - /// Task ID - /// Calendar ID - /// Task in the iCal format - /// Defines if the request is from the CalDav server or not + /// Task ID + /// Calendar ID + /// Task in the iCal format + /// Defines if the request is from the CalDav server or not /// Tasks - /// Updated task + /// Updated task + /// list + /// api/2.0/calendar/icstodo + /// PUT [Update("icstodo")] public async Task> UpdateTodo(string calendarId, string ics, string todoId, bool fromCalDavServer = false) { @@ -3401,9 +3582,12 @@ public async Task> UpdateTodo(string calendarId, string ics, s /// /// Delete a task /// - /// Task ID - /// Defines if the request is from the CalDav server or not + /// Task ID + /// Defines if the request is from the CalDav server or not + /// Task awaiter /// Tasks + /// DELETE + /// api/2.0/calendar/todos/{todoId} [Delete("todos/{todoId}")] public async Task RemoveTodo(int todoId, bool fromCaldavServer = false) { @@ -3481,16 +3665,18 @@ private List CreateTodo(int calendarId, string name, string descrip return null; } /// - /// Adds an event in the ics format to the calendar specified in the request. + /// Adds the iCal event to the calendar specified in the request. /// /// /// Add the iCal event /// - /// Calendar GUID - /// Event GUID - /// Event in the iCal format + /// Calendar GUID + /// Event GUID + /// Event in the iCal format /// Events - /// Event + /// Task awaiter + /// POST + /// api/2.0/calendar/outsideevent [Create("outsideevent")] public async Task AddEventOutside(string calendarGuid, string eventGuid, string ics) { @@ -3537,9 +3723,12 @@ where publicItem.Id.ToString() != AccessOption.OwnerOption.Id /// /// Delete a project calendar /// - /// Calendar ID - /// Project team + /// Calendar ID + /// Project team + /// Task awaiter /// Calendars and subscriptions + /// DELETE + /// api/2.0/calendar/caldavprojcal [Delete("caldavprojcal")] public async Task DeleteCaldavCalendar(string calendarId, List team = null) { @@ -3579,15 +3768,83 @@ await RemoveCaldavCalendar( } /// - /// Deletes the whole CalDav event from the calendar. + /// Refreshes the caldav calendar with the id specified in the request. + /// + /// + /// Refresh CalDav calendar + /// + /// Calendar ID + /// User list + /// Tasks + /// UPDATE + /// api/2.0/calendar/refreshcaldavcalendar + [Update("refreshcaldavcalendar")] + public async Task RefreshCalDavCalendar(string calendarId, List team = null) + { + try + { + var myUri = HttpContext.Current.Request.GetUrlRewriter(); + var caldavHost = myUri.Host; + var currentUserId = SecurityContext.CurrentAccount.ID; + var currentTenantId = TenantProvider.CurrentTenantID; + try + { + foreach (var teamMember in team) + { + var user = CoreContext.UserManager.GetUsers(Guid.Parse(teamMember)); + try + { + if (CheckUserEmail(user)) + { + SecurityContext.AuthenticateMe(user.ID); + var currentUserName = user.Email.ToLower() + "@" + caldavHost; + + var removeResult = RemoveCaldavCalendar( + user.Email, + calendarId, + myUri, + true); + + if (removeResult != null) + { + await GetCalendarCalDavUrl(calendarId, myUri); + } + } + } + finally + { + SecurityContext.Logout(); + if (currentUserId != Guid.Empty) + { + SecurityContext.AuthenticateMe(currentUserId); + } + } + + } + } + catch (Exception ex) + { + LogManager.GetLogger("ASC.Calendar").Error(ex.Message); + } + } + catch (Exception ex) + { + Logger.Error(String.Format("Refresh caldav calendar: {0}", ex.Message)); + } + } + /// + /// Deletes the CalDav event from the calendar with the ID specified in the request. /// /// /// Delete the CalDav event /// - /// Calendar ID - /// Event UID - /// Task responsibles + /// Calendar ID + /// Event UID + /// Task responsibles + /// Task awaiter /// Events + /// DELETE + /// api/2.0/calendar/caldavevent [Delete("caldavevent")] public async Task DeleteCaldavEvent(string calendarId, string uid, List responsibles = null) { @@ -3619,6 +3876,8 @@ public async Task DeleteCaldavEventTask(List responsibles, Uri myUri, st { try { + uid = uid.ToLower(); + calendarId = calendarId.ToLower(); foreach (var responsibleSid in responsibles) { CoreContext.TenantManager.SetCurrentTenant(currentTenantId); @@ -3649,7 +3908,8 @@ private Ical.Net.Calendar getEventIcs(int alert, CalendarWrapper calendar, Calen var ddayCalendar = DDayICalParser.ConvertCalendar(calendar.UserCalendar); ddayCalendar.Events.Clear(); evt.Created = null; - if (calendarId.Contains("Project_")) + calendarId.ToLower(); + if (calendarId.Contains("project_")) { evt.End = new CalDateTime(evt.End.AddDays(1)); } @@ -3670,16 +3930,18 @@ private Ical.Net.Calendar getEventIcs(int alert, CalendarWrapper calendar, Calen } /// - /// Returns the offset or difference between the time in the specified time zone and Coordinated Universal Time (UTC) for the particular dates. + /// Returns the time offset in the specified time zone compared to Coordinated Universal Time (UTC) for the particular dates. /// /// /// Get the UTC offset /// - /// Time zone ID - /// Start date to determine the offset - /// End date to determine the offset + /// Time zone ID + /// Start date to determine the offset + /// End date to determine the offset /// Calendars and subscriptions /// The UTC offset in minutes + /// api/2.0/calendar/utcoffset + /// POST [Create("utcoffset")] public object GetUtcOffsets(string timeZone, ApiDateTime startDate, ApiDateTime endDate) { @@ -3699,11 +3961,14 @@ public object GetUtcOffsets(string timeZone, ApiDateTime startDate, ApiDateTime /// /// Update the CalDav event /// - /// Calendar ID - /// Event UID - /// Event notification type - /// Task responsibles + /// Calendar ID + /// Event UID + /// Defines how many minutes before the event a reminder will be displayed + /// Task responsibles + /// Task awaiter /// Events + /// api/2.0/calendar/caldavevent + /// PUT [Update("caldavevent")] public async Task UpdateCaldavEvent(string calendarId, string uid, int alert = 0, List responsibles = null) { @@ -3801,13 +4066,16 @@ public async Task UpdateCaldavEvent(string calendarId, string uid, int alert = 0 /// /// Create a new iCal event /// - /// Calendar ID - /// Event in the iCal format - /// Event notification type - /// Event sharing access parameters - /// Event UID + /// Calendar ID + /// Event in the iCal format + /// Event notification type + /// Event sharing access parameters + /// Event UID /// Events - /// Event + /// api/2.0/calendar/icsevent + /// POST + /// list + /// Event [Create("icsevent")] public async Task> AddEvent(int calendarId, string ics, EventAlertType alertType, List sharingOptions, string eventUid = null) { @@ -3952,15 +4220,18 @@ public async Task> AddEvent(int calendarId, string ics, Event /// /// Update the iCal event /// - /// Event ID - /// Calendar ID - /// Event in the iCal format - /// New event notification type - /// New event sharing access parameters - /// Defines if the request is from the CalDav server or not - /// New event owner ID + /// Event ID + /// Calendar ID + /// Event in the iCal format + /// New event notification type + /// New event sharing access parameters + /// Defines if the request is from the CalDav server or not + /// New event owner ID /// Events - /// Updated event + /// Updated event + /// api/2.0/calendar/icsevent + /// PUT + /// list [Update("icsevent")] public async Task> UpdateEvent(int eventId, string calendarId, string ics, EventAlertType alertType, List sharingOptions, bool fromCalDavServer = false, string ownerId = "") { @@ -4401,7 +4672,7 @@ await UpdateCaldavEventTask(oldIcs, eventUid, true, private static async Task updateEvent(string ics, string uid, string calendarId, bool sendToRadicale, DateTime updateDate = default(DateTime), Ical.Net.CalendarComponents.VTimeZone calendarVTimeZone = null, TimeZoneInfo calendarTimeZone = null) { - using (var db = DbManager.FromHttpContext("calendar")) + using (var db = new DbManager(DBId)) { using (var tr = db.BeginTransaction()) { @@ -4503,6 +4774,7 @@ await UpdateCaldavEventTask(oldIcs, eventUid, true, Logger.Error("ERROR: " + ex.Message); } } + tr.Commit(); } } @@ -4521,8 +4793,11 @@ public enum EventRemoveType /// /// Delete the event series /// - /// Event ID + /// Event ID + /// DELETE + /// api/2.0/calendar/events/{eventId} /// Events + /// Task awaiter [Delete("events/{eventId}")] public async Task RemoveEvent(int eventId) { @@ -4530,18 +4805,21 @@ public async Task RemoveEvent(int eventId) } /// - /// Deletes one event from the series of recurrent events. + /// Deletes the specified event(s) from the series of repeating events. /// /// - /// Delete an event from event series + /// Delete the specified event(s) from event series /// - /// Event ID - /// Date to be deleted from the recurrent event - /// Recurrent event deletion type - /// Defines if the request is from the CalDav server or not - /// Current URI + /// Event ID + /// Date to be deleted from the repeating event + /// The event deletion type: 0 - the single event, 1 - all the following events, 2 - all the event series. + /// Defines if the request is from the CalDav server or not + /// Current URI /// Events - /// Updated event series collection + /// api/2.0/calendar/events/{eventId}/custom + /// DELETE + /// Updated event series collection + /// list [Delete("events/{eventId}/custom")] public async Task> RemoveEvent(int eventId, ApiDateTime date, EventRemoveType type, Uri uri = null, bool fromCaldavServer = false) { @@ -4581,7 +4859,7 @@ public async Task> RemoveEvent(int eventId, ApiDateTime date, }).ToList(); var currentTenantId = TenantProvider.CurrentTenantID; - var calendarId = evt.CalendarId; + var calendarId = evt.CalendarId.ToLower(); var myUri = HttpContext.Current != null ? HttpContext.Current.Request.GetUrlRewriter() : uri != null ? uri : new Uri("http://localhost"); var currentUserId = SecurityContext.CurrentAccount.ID; @@ -4661,7 +4939,7 @@ public async Task> RemoveEvent(int eventId, ApiDateTime date, if (calendarId != BirthdayReminderCalendar.CalendarId && calendarId != SharedEventsCalendar.CalendarId && calendarId != "crm_calendar" && - !calendarId.Contains("Project_")) + !calendarId.Contains("project_")) { if (currentUserId == cal.OwnerId) { @@ -4798,7 +5076,7 @@ public async Task> RemoveEvent(int eventId, ApiDateTime date, private static async Task deleteEvent(string uid, string calendarId, string email, Uri myUri, bool isShared = false) { - using (var db = DbManager.FromHttpContext("calendar")) + using (var db = new DbManager(DBId)) { using (var tr = db.BeginTransaction()) { @@ -4808,7 +5086,7 @@ private static async Task deleteEvent(string uid, string calendarId, string emai if (calendarId != BirthdayReminderCalendar.CalendarId && calendarId != SharedEventsCalendar.CalendarId && calendarId != "crm_calendar" && - !calendarId.Contains("Project_")) + !calendarId.Contains("Project_") && !calendarId.Contains("project_")) { var dataCaldavGuid = db.ExecuteList(new SqlQuery("calendar_calendars") .Select("caldav_guid") @@ -4862,6 +5140,7 @@ private static async Task deleteEvent(string uid, string calendarId, string emai { Logger.Error("ERROR: " + ex.Message); } + tr.Commit(); } } } @@ -4872,8 +5151,11 @@ private static async Task deleteEvent(string uid, string calendarId, string emai /// /// Unsubscribe from the event /// - /// Event ID + /// Event ID + /// api/2.0/calendar/events/{eventId}/unsubscribe + /// DELETE /// Events + /// Task awaiter [Delete("events/{eventId}/unsubscribe")] public async Task UnsubscribeEvent(int eventId) { @@ -4893,14 +5175,16 @@ public async Task UnsubscribeEvent(int eventId) } /// - /// Returns an event in the iCal format by its UID from the history. + /// Returns the iCal event by its UID from the history. /// /// - /// Get ics by UID + /// Get the iCal event by UID /// - /// Event UID + /// Event UID /// Events - /// Event history + /// Event history + /// api/2.0/calendar/events/{eventUid}/historybyuid + /// GET [Read("events/{eventUid}/historybyuid")] public EventHistoryWrapper GetEventHistoryByUid(string eventUid) { @@ -4915,14 +5199,16 @@ public EventHistoryWrapper GetEventHistoryByUid(string eventUid) } /// - /// Returns an event in the iCal format by its ID from the history. + /// Returns the iCal event by its ID from the history. /// /// - /// Get ics by ID + /// Get the iCal event by ID /// - /// Event ID + /// Event ID /// Events - /// Event history + /// Event history + /// api/2.0/calendar/events/{eventId}/historybyid + /// GET [Read("events/{eventId}/historybyid")] public EventHistoryWrapper GetEventHistoryById(int eventId) { @@ -5136,14 +5422,16 @@ private bool CanRead(BusinessObjects.Calendar cal, Event evt = null) } /// - /// Returns the sharing access parameters to the calendar with the ID specified in the request. + /// Returns the sharing access parameters of the calendar with the ID specified in the request. /// /// /// Get access parameters /// - /// Calendar ID + /// Calendar ID /// Calendars and subscriptions - /// Sharing access parameters + /// Sharing access parameters + /// GET + /// api/2.0/calendar/{calendarId}/sharing [Read("{calendarId}/sharing")] public PublicItemCollection GetCalendarSharingOptions(int calendarId) { @@ -5166,7 +5454,9 @@ public PublicItemCollection GetCalendarSharingOptions(int calendarId) /// Get default access parameters /// /// Calendars and subscriptions - /// Default sharing access parameters + /// Default sharing access parameters + /// GET + /// api/2.0/calendar/sharing [Read("sharing")] public PublicItemCollection GetDefaultSharingOptions() { @@ -5184,10 +5474,7 @@ private static string GetUserAuthorization(string email) public void Dispose() { - if (_dataProvider != null) - { - _dataProvider.Dispose(); - } + } private static bool CheckUserEmail(ASC.Core.Users.UserInfo user) diff --git a/module/ASC.Api/ASC.Api.Calendar/CalendarBootstrap.cs b/module/ASC.Api/ASC.Api.Calendar/CalendarBootstrap.cs index 2195d86e0..289a2dc84 100644 --- a/module/ASC.Api/ASC.Api.Calendar/CalendarBootstrap.cs +++ b/module/ASC.Api/ASC.Api.Calendar/CalendarBootstrap.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.Api.Calendar.Attachments; using ASC.Api.Interfaces; diff --git a/module/ASC.Api/ASC.Api.Calendar/ExternalCalendars/BirthdayReminderCalendar.cs b/module/ASC.Api/ASC.Api.Calendar/ExternalCalendars/BirthdayReminderCalendar.cs index e783c6078..0bf8eef61 100644 --- a/module/ASC.Api/ASC.Api.Calendar/ExternalCalendars/BirthdayReminderCalendar.cs +++ b/module/ASC.Api/ASC.Api.Calendar/ExternalCalendars/BirthdayReminderCalendar.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/ExternalCalendars/SharedEventsCalendar.cs b/module/ASC.Api/ASC.Api.Calendar/ExternalCalendars/SharedEventsCalendar.cs index 9c3abc03c..091d7531e 100644 --- a/module/ASC.Api/ASC.Api.Calendar/ExternalCalendars/SharedEventsCalendar.cs +++ b/module/ASC.Api/ASC.Api.Calendar/ExternalCalendars/SharedEventsCalendar.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/Notification/CalendarNotifySource.cs b/module/ASC.Api/ASC.Api.Calendar/Notification/CalendarNotifySource.cs index 0e93aac0a..7d99cf74d 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Notification/CalendarNotifySource.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Notification/CalendarNotifySource.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/Wrappers/AccessOption.cs b/module/ASC.Api/ASC.Api.Calendar/Wrappers/AccessOption.cs index c0fa13a07..2ee8da9c5 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Wrappers/AccessOption.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Wrappers/AccessOption.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,15 +23,23 @@ namespace ASC.Api.Calendar.Wrappers [DataContract(Name = "sharingOption", Namespace = "")] public class AccessOption { + ///read + ///10 [DataMember(Name = "id", Order = 10)] public string Id { get; set; } + ///Read only + ///20 [DataMember(Name = "name", Order = 20)] public string Name { get; set; } + ///true + ///30 [DataMember(Name = "defaultAction", Order = 30)] public bool Default { get; set; } + ///read + ///40 [DataMember(Name = "defaultStyle", Order = 40)] public string DefaultStyle { get; set; } diff --git a/module/ASC.Api/ASC.Api.Calendar/Wrappers/CalendarWrapper.cs b/module/ASC.Api/ASC.Api.Calendar/Wrappers/CalendarWrapper.cs index 8fa96eed9..14f083c46 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Wrappers/CalendarWrapper.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Wrappers/CalendarWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -56,7 +56,8 @@ public CalendarWrapper(BaseCalendar calendar, UserViewSettings userViewSettings) _userId = _userViewSettings.UserId; } } - + ///false + ///80 [DataMember(Name = "isSubscription", Order = 80)] public virtual bool IsSubscription { @@ -76,6 +77,8 @@ public virtual bool IsSubscription set { } } + /// + ///230 [DataMember(Name = "iCalUrl", Order = 230)] public virtual string iCalUrl { @@ -89,6 +92,8 @@ public virtual string iCalUrl set { } } + ///false + ///220 [DataMember(Name = "isiCalStream", Order = 220)] public virtual bool IsiCalStream { @@ -102,6 +107,8 @@ public virtual bool IsiCalStream set { } } + ///false + ///50 [DataMember(Name = "isHidden", Order = 50)] public virtual bool IsHidden { @@ -112,6 +119,8 @@ public virtual bool IsHidden set { } } + ///true + ///200 [DataMember(Name = "canAlertModify", Order = 200)] public virtual bool CanAlertModify { @@ -122,7 +131,8 @@ public virtual bool CanAlertModify set { } } - + ///true + ///60 [DataMember(Name = "isShared", Order = 60)] public virtual bool IsShared { @@ -133,6 +143,8 @@ public virtual bool IsShared set { } } + ///ASC.Api.Calendar.Wrappers.CalendarPermissions, ASC.Api.Calendar + ///70 [DataMember(Name = "permissions", Order = 70)] public virtual CalendarPermissions Permissions { @@ -151,6 +163,8 @@ public virtual CalendarPermissions Permissions set { } } + ///true + ///90 [DataMember(Name = "isEditable", Order = 90)] public virtual bool IsEditable { @@ -167,6 +181,8 @@ public virtual bool IsEditable set { } } + ///#ffffff + ///30 [DataMember(Name = "textColor", Order = 30)] public string TextColor { @@ -178,6 +194,8 @@ public string TextColor set { } } + ///#000000 + ///40 [DataMember(Name = "backgroundColor", Order = 40)] public string BackgroundColor { @@ -189,9 +207,13 @@ public string BackgroundColor set { } } + ///Calendar Description + ///20 [DataMember(Name = "description", Order = 20)] public string Description { get { return UserCalendar.Description; } set { } } + ///Calendar Name + ///30 [DataMember(Name = "title", Order = 30)] public string Title { @@ -199,6 +221,8 @@ public string Title set { } } + ///1 + ///0 [DataMember(Name = "objectId", Order = 0)] public string Id { @@ -206,6 +230,8 @@ public string Id set { } } + ///false + ///0 [DataMember(Name = "isTodo", Order = 0)] public int IsTodo { @@ -220,6 +246,8 @@ public int IsTodo set { } } + ///ASC.Api.Calendar.Wrappers.UserParams, ASC.Api.Calendar + ///120 [DataMember(Name = "owner", Order = 120)] public UserParams Owner { @@ -234,6 +262,7 @@ public UserParams Owner set { } } + ///false public bool IsAcceptedSubscription { get @@ -243,12 +272,20 @@ public bool IsAcceptedSubscription set { } } + ///ASC.Api.Calendar.Wrappers.EventWrapper, ASC.Api.Calendar + ///150 + ///list [DataMember(Name = "events", Order = 150)] public List Events { get; set; } + ///ASC.Api.Calendar.Wrappers.TodoWrapper, ASC.Api.Calendar + ///160 + ///list [DataMember(Name = "todos", Order = 160)] public List Todos { get; set; } + ///ASC.Api.Calendar.Wrappers.EventAlertWrapper, ASC.Api.Calendar + ///160 [DataMember(Name = "defaultAlert", Order = 160)] public EventAlertWrapper DefaultAlertType { @@ -259,6 +296,8 @@ public EventAlertWrapper DefaultAlertType set { } } + ///ASC.Api.Calendar.Wrappers.TimeZoneWrapper, ASC.Api.Calendar + ///160 [DataMember(Name = "timeZone", Order = 160)] public TimeZoneWrapper TimeZoneInfo { @@ -269,6 +308,8 @@ public TimeZoneWrapper TimeZoneInfo set { } } + ///false + ///160 [DataMember(Name = "canEditTimeZone", Order = 160)] public bool CanEditTimeZone { diff --git a/module/ASC.Api/ASC.Api.Calendar/Wrappers/EventAlertWrapper.cs b/module/ASC.Api/ASC.Api.Calendar/Wrappers/EventAlertWrapper.cs index a3d476319..6000a7763 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Wrappers/EventAlertWrapper.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Wrappers/EventAlertWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ namespace ASC.Api.Calendar.Wrappers [DataContract(Name = "alert", Namespace = "")] public class EventAlertWrapper { + ///-1 [DataMember(Name = "type")] public int Type { get; set; } diff --git a/module/ASC.Api/ASC.Api.Calendar/Wrappers/EventHistoryWrapper.cs b/module/ASC.Api/ASC.Api.Calendar/Wrappers/EventHistoryWrapper.cs index 603678de5..f5c2522b5 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Wrappers/EventHistoryWrapper.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Wrappers/EventHistoryWrapper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Linq; using System.Runtime.Serialization; @@ -52,30 +52,59 @@ public EventHistoryWrapper(EventHistory eventHistory, bool canEdit, bool canNoti : cal.TimeZone); } + ///1 + ///0 [DataMember(Name = "calendarId", Order = 0)] public int CalendarId { get; set; } + ///uid1@onlyoffice.com + ///10 [DataMember(Name = "eventUid", Order = 10)] public string EventUid { get; set; } + ///1 + ///20 [DataMember(Name = "eventId", Order = 20)] public int EventId { get; set; } + ///BEGIN:VCALENDAR + ///VERSION:2.0 + ///PRODID:onlyoffice.com + ///BEGIN:VEVENT + ///UID:uid1@onlyoffice.com + ///DTSTAMP:19970714T170000Z + ///ORGANIZER;CN=John Doe:MAILTO:john.doe@example.com + ///DTSTART:19970714T170000Z + ///DTEND:19970715T035959Z + ///SUMMARY:Bastille Day Party + ///END:VEVENT + ///END:VCALENDAR + ///30 [DataMember(Name = "mergedIcs", Order = 30)] public string MergedIcs { get; set; } - + // + ///true + ///40 [DataMember(Name = "canEdit", Order = 40)] public bool CanEdit { get; set; } + ///true + ///50 [DataMember(Name = "canNotify", Order = 50)] public bool CanNotify { get; set; } + ///some text + ///60 [DataMember(Name = "ics", Order = 60)] public string Ics { get; set; } + ///ASC.Api.Calendar.Wrappers.TimeZoneWrapper, ASC.Api.Calendar + ///70 [DataMember(Name = "timeZone", Order = 70)] public TimeZoneWrapper TimeZoneInfo { get; set; } + ///Calendar name + ///80 [DataMember(Name = "calendarName", Order = 80)] public string CalendarName { get; set; } diff --git a/module/ASC.Api/ASC.Api.Calendar/Wrappers/EventWrapper.cs b/module/ASC.Api/ASC.Api.Calendar/Wrappers/EventWrapper.cs index ab0064861..20d019649 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Wrappers/EventWrapper.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Wrappers/EventWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -88,28 +88,44 @@ public List GetList(DateTime utcStartDate, DateTime utcEndDate) return list; } + ///1 + ///0 [DataMember(Name = "objectId", Order = 0)] public string Id { get { return _baseEvent.Id; } } + ///1234wda + ///140 [DataMember(Name = "uniqueId", Order = 140)] public string Uid { get { return _baseEvent.Uid; } } + ///1 public int TenantId { get; set; } + ///true public bool Todo { get; set; } + ///calendarID + ///10 [DataMember(Name = "sourceId", Order = 10)] public string CalendarId { get { return _baseEvent.CalendarId; } } + ///Event Name + ///20 [DataMember(Name = "title", Order = 20)] public string Name { get { return _baseEvent.Name; } } + ///Event Description + ///30 [DataMember(Name = "description", Order = 30)] public string Description { get { return _baseEvent.Description; } } + ///false + ///60 [DataMember(Name = "allDay", Order = 60)] public bool AllDayLong { get { return _baseEvent.AllDayLong; } } + ///2020-12-01T06:36:10.8645482Z + ///40 [DataMember(Name = "start", Order = 40)] public ApiDateTime Start { @@ -128,6 +144,8 @@ public ApiDateTime Start } } + ///2020-12-01T06:36:10.8645482Z + ///50 [DataMember(Name = "end", Order = 50)] public ApiDateTime End { @@ -146,6 +164,8 @@ public ApiDateTime End } } + /// + ///70 [DataMember(Name = "repeatRule", Order = 70)] public string RepeatRule { @@ -155,6 +175,8 @@ public string RepeatRule } } + ///ASC.Api.Calendar.Wrappers.EventAlertWrapper, ASC.Api.Calendar + ///110 [DataMember(Name = "alert", Order = 110)] public EventAlertWrapper Alert { @@ -164,6 +186,8 @@ public EventAlertWrapper Alert } } + ///true + ///80 [DataMember(Name = "isShared", Order = 80)] public bool IsShared { @@ -173,6 +197,8 @@ public bool IsShared } } + ///true + ///130 [DataMember(Name = "canUnsubscribe", Order = 130)] public bool CanUnsubscribe { @@ -182,6 +208,8 @@ public bool CanUnsubscribe } } + ///false + ///100 [DataMember(Name = "isEditable", Order = 100)] public virtual bool IsEditable { @@ -194,6 +222,8 @@ public virtual bool IsEditable } } + ///ASC.Api.Calendar.Wrappers.CalendarPermissions, ASC.Api.Calendar + ///90 [DataMember(Name = "permissions", Order = 90)] public Permissions Permissions { @@ -210,7 +240,8 @@ public Permissions Permissions return p; } } - + ///ASC.Api.Calendar.Wrappers.UserParams, ASC.Api.Calendar + ///120 [DataMember(Name = "owner", Order = 120)] public UserParams Owner { @@ -224,6 +255,8 @@ public UserParams Owner } } + ///0 + ///150 [DataMember(Name = "status", Order = 150)] public EventStatus Status { diff --git a/module/ASC.Api/ASC.Api.Calendar/Wrappers/Permissions.cs b/module/ASC.Api/ASC.Api.Calendar/Wrappers/Permissions.cs index 1b749e203..3c43f8f72 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Wrappers/Permissions.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Wrappers/Permissions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,6 +41,7 @@ public static object GetSample() [DataContract(Name = "permissions", Namespace = "")] public class CalendarPermissions : Permissions { + ///ASC.Api.Calendar.Wrappers.PublicItemCollection, ASC.Api.Calendar [DataMember(Name = "data")] public PublicItemCollection Data { get; set; } @@ -53,10 +54,12 @@ public class CalendarPermissions : Permissions [DataContract(Name = "userparams", Namespace = "")] public class UserParams { - [DataMember(Name = "objectId")] + ///2fdfe577-3c26-4736-9df9-b5a683bb8520 + [DataMember(Name="objectId")] public Guid Id { get; set; } - [DataMember(Name = "name")] + ///Valery Zykov + [DataMember(Name="name")] public string Name { get; set; } public static object GetSample() diff --git a/module/ASC.Api/ASC.Api.Calendar/Wrappers/PublicItemCollection.cs b/module/ASC.Api/ASC.Api.Calendar/Wrappers/PublicItemCollection.cs index ea5825326..32566a457 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Wrappers/PublicItemCollection.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Wrappers/PublicItemCollection.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,9 @@ public PublicItemCollection() this.Items = new List(); } + ///ASC.Api.Calendar.Wrappers.AccessOption, ASC.Api.Calendar + ///list + ///10 [DataMember(Name = "actions", Order = 10)] public List AvailableOptions { @@ -38,6 +41,9 @@ public List AvailableOptions set { } } + ///ASC.Api.Calendar.Wrappers.PublicItemWrapper, ASC.Api.Calendar + ///list + ///20 [DataMember(Name = "items", Order = 20)] public List Items { get; set; } diff --git a/module/ASC.Api/ASC.Api.Calendar/Wrappers/PublicItemWrapper.cs b/module/ASC.Api/ASC.Api.Calendar/Wrappers/PublicItemWrapper.cs index c51cdecb2..4a97aa69e 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Wrappers/PublicItemWrapper.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Wrappers/PublicItemWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -54,6 +54,8 @@ public PublicItemWrapper(ASC.Web.Core.Calendars.SharingOptions.PublicItem public _isCalendar = false; } + ///2fdfe577-3c26-4736-9df9-b5a683bb8520 + ///10 [DataMember(Name = "id", Order = 10)] public string ItemId { @@ -64,6 +66,8 @@ public string ItemId set { } } + ///Everyone + ///20 [DataMember(Name = "name", Order = 20)] public string ItemName { @@ -77,6 +81,8 @@ public string ItemName set { } } + ///true + ///30 [DataMember(Name = "isGroup", Order = 30)] public new bool IsGroup { @@ -87,6 +93,8 @@ public string ItemName set { } } + ///true + ///40 [DataMember(Name = "canEdit", Order = 40)] public bool CanEdit { @@ -97,6 +105,8 @@ public bool CanEdit set { } } + ///ASC.Api.Calendar.Wrappers.AccessOption, ASC.Api.Calendar + ///50 [DataMember(Name = "selectedAction", Order = 50)] public AccessOption SharingOption { diff --git a/module/ASC.Api/ASC.Api.Calendar/Wrappers/SubscriptionWrapper.cs b/module/ASC.Api/ASC.Api.Calendar/Wrappers/SubscriptionWrapper.cs index dfe23830f..b3c4adaac 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Wrappers/SubscriptionWrapper.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Wrappers/SubscriptionWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,7 +32,8 @@ public SubscriptionWrapper(BaseCalendar calendar) public SubscriptionWrapper(BaseCalendar calendar, UserViewSettings userViewSettings) : base(calendar, userViewSettings) { } - + ///false + ///100 [DataMember(Name = "isSubscribed", Order = 100)] public bool IsAccepted { @@ -46,7 +47,8 @@ public bool IsAccepted set { } } - + ///true + ///140 [DataMember(Name = "isNew", Order = 140)] public bool IsNew { @@ -57,6 +59,8 @@ public bool IsNew set { } } + ///Personal Calendars + ///130 [DataMember(Name = "group", Order = 130)] public string Group { @@ -71,7 +75,8 @@ public string Group set { } } - [DataMember(IsRequired = false)] + ///ASC.Api.Calendar.Wrappers.CalendarPermissions, ASC.Api.Calendar + [DataMember(IsRequired=false)] public override CalendarPermissions Permissions { get; set; } public new static object GetSample() diff --git a/module/ASC.Api/ASC.Api.Calendar/Wrappers/TimeZoneWrapper.cs b/module/ASC.Api/ASC.Api.Calendar/Wrappers/TimeZoneWrapper.cs index 0e7396d72..cea7a04f5 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Wrappers/TimeZoneWrapper.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Wrappers/TimeZoneWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,8 @@ public TimeZoneWrapper(TimeZoneInfo timeZone) _timeZone = timeZone; } + ///UTC + ///0 [DataMember(Name = "name", Order = 0)] public string Name { @@ -39,6 +41,8 @@ public string Name set { } } + ///UTC + ///0 [DataMember(Name = "id", Order = 0)] public string Id { @@ -49,6 +53,8 @@ public string Id set { } } + ///0 + ///0 [DataMember(Name = "offset", Order = 0)] public int Offset { diff --git a/module/ASC.Api/ASC.Api.Calendar/Wrappers/TodoWrapper.cs b/module/ASC.Api/ASC.Api.Calendar/Wrappers/TodoWrapper.cs index 16a121130..5fdb0c4f8 100644 --- a/module/ASC.Api/ASC.Api.Calendar/Wrappers/TodoWrapper.cs +++ b/module/ASC.Api/ASC.Api.Calendar/Wrappers/TodoWrapper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Runtime.Serialization; @@ -59,24 +59,36 @@ public List GetList() return list; } - + ///1 + ///0 [DataMember(Name = "objectId", Order = 0)] public string Id { get { return _baseTodo.Id; } } + ///123wda + ///140 [DataMember(Name = "uniqueId", Order = 140)] public string Uid { get { return _baseTodo.Uid; } } + ///1 public int TenantId { get; set; } + ///calendarID + ///10 [DataMember(Name = "sourceId", Order = 10)] public string CalendarId { get { return _baseTodo.CalendarId; } } + ///Todo Name + ///20 [DataMember(Name = "title", Order = 20)] public string Name { get { return _baseTodo.Name; } } + ///Todo Description + ///30 [DataMember(Name = "description", Order = 30)] public string Description { get { return _baseTodo.Description; } } + ///2020-12-01T06:36:10.8645482Z + ///40 [DataMember(Name = "start", Order = 40)] public ApiDateTime Start { @@ -89,6 +101,8 @@ public ApiDateTime Start } } + ///2020-12-01T06:36:10.8645482Z + ///110 [DataMember(Name = "completed", Order = 110)] public ApiDateTime Completed { @@ -100,6 +114,8 @@ public ApiDateTime Completed } } + ///ASC.Api.Calendar.Wrappers.UserParams, ASC.Api.Calendar + ///120 [DataMember(Name = "owner", Order = 120)] public UserParams Owner { diff --git a/module/ASC.Api/ASC.Api.Calendar/iCalParser/DDayICalParser.cs b/module/ASC.Api/ASC.Api.Calendar/iCalParser/DDayICalParser.cs index e07e25792..08971c358 100644 --- a/module/ASC.Api/ASC.Api.Calendar/iCalParser/DDayICalParser.cs +++ b/module/ASC.Api/ASC.Api.Calendar/iCalParser/DDayICalParser.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.IO; diff --git a/module/ASC.Api/ASC.Api.Calendar/iCalParser/Emitter.cs b/module/ASC.Api/ASC.Api.Calendar/iCalParser/Emitter.cs index aaec9545c..00e473b88 100644 --- a/module/ASC.Api/ASC.Api.Calendar/iCalParser/Emitter.cs +++ b/module/ASC.Api/ASC.Api.Calendar/iCalParser/Emitter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/iCalParser/Parser.cs b/module/ASC.Api/ASC.Api.Calendar/iCalParser/Parser.cs index badba99a6..ec8e46833 100644 --- a/module/ASC.Api/ASC.Api.Calendar/iCalParser/Parser.cs +++ b/module/ASC.Api/ASC.Api.Calendar/iCalParser/Parser.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/iCalParser/ParserError.cs b/module/ASC.Api/ASC.Api.Calendar/iCalParser/ParserError.cs index bf1f63b0a..236389b3f 100644 --- a/module/ASC.Api/ASC.Api.Calendar/iCalParser/ParserError.cs +++ b/module/ASC.Api/ASC.Api.Calendar/iCalParser/ParserError.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/iCalParser/Scanner.cs b/module/ASC.Api/ASC.Api.Calendar/iCalParser/Scanner.cs index 8b4b58758..62edc3bd7 100644 --- a/module/ASC.Api/ASC.Api.Calendar/iCalParser/Scanner.cs +++ b/module/ASC.Api/ASC.Api.Calendar/iCalParser/Scanner.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/iCalParser/Token.cs b/module/ASC.Api/ASC.Api.Calendar/iCalParser/Token.cs index c48c98145..d3d53ecf4 100644 --- a/module/ASC.Api/ASC.Api.Calendar/iCalParser/Token.cs +++ b/module/ASC.Api/ASC.Api.Calendar/iCalParser/Token.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalEvent.cs b/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalEvent.cs index 89fc63fa6..846a3c5f3 100644 --- a/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalEvent.cs +++ b/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalEvent.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalendar.cs b/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalendar.cs index 8763d80ff..724a447ed 100644 --- a/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalendar.cs +++ b/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalendar.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalendarCache.cs b/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalendarCache.cs index 3e2781516..82a5bd592 100644 --- a/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalendarCache.cs +++ b/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalendarCache.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalendarEmitter.cs b/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalendarEmitter.cs index fb27f003f..7dcc347d0 100644 --- a/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalendarEmitter.cs +++ b/module/ASC.Api/ASC.Api.Calendar/iCalParser/iCalendarEmitter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Client/ASC.Api.Client.csproj b/module/ASC.Api/ASC.Api.Client/ASC.Api.Client.csproj index 3a5a864da..d78a52236 100644 --- a/module/ASC.Api/ASC.Api.Client/ASC.Api.Client.csproj +++ b/module/ASC.Api/ASC.Api.Client/ASC.Api.Client.csproj @@ -23,6 +23,8 @@ 4 false 1591 + ..\..\..\web\studio\ASC.Web.Studio\bin\ASC.Api.Client.xml + CS1591 none diff --git a/module/ASC.Api/ASC.Api.Client/ApiClient.cs b/module/ASC.Api/ASC.Api.Client/ApiClient.cs index 27c736b8d..c1fc974de 100644 --- a/module/ASC.Api/ASC.Api.Client/ApiClient.cs +++ b/module/ASC.Api/ASC.Api.Client/ApiClient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Client/ApiRequest.cs b/module/ASC.Api/ASC.Api.Client/ApiRequest.cs index 9c1549faf..521f8a115 100644 --- a/module/ASC.Api/ASC.Api.Client/ApiRequest.cs +++ b/module/ASC.Api/ASC.Api.Client/ApiRequest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Client/ApiResponse.cs b/module/ASC.Api/ASC.Api.Client/ApiResponse.cs index f4a1f2daf..f2c2e62e1 100644 --- a/module/ASC.Api/ASC.Api.Client/ApiResponse.cs +++ b/module/ASC.Api/ASC.Api.Client/ApiResponse.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Client/Configuration.cs b/module/ASC.Api/ASC.Api.Client/Configuration.cs index d2dff93ea..2b7f51bc0 100644 --- a/module/ASC.Api/ASC.Api.Client/Configuration.cs +++ b/module/ASC.Api/ASC.Api.Client/Configuration.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Client/Enums.cs b/module/ASC.Api/ASC.Api.Client/Enums.cs index 580fdecd4..63cd859b3 100644 --- a/module/ASC.Api/ASC.Api.Client/Enums.cs +++ b/module/ASC.Api/ASC.Api.Client/Enums.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Client/Exceptions.cs b/module/ASC.Api/ASC.Api.Client/Exceptions.cs index 3b79f7c59..864b5e560 100644 --- a/module/ASC.Api/ASC.Api.Client/Exceptions.cs +++ b/module/ASC.Api/ASC.Api.Client/Exceptions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Client/Extensions.cs b/module/ASC.Api/ASC.Api.Client/Extensions.cs index 20b991aa4..f7483c227 100644 --- a/module/ASC.Api/ASC.Api.Client/Extensions.cs +++ b/module/ASC.Api/ASC.Api.Client/Extensions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Client/Parameters.cs b/module/ASC.Api/ASC.Api.Client/Parameters.cs index 4fa8eced4..78de2abbc 100644 --- a/module/ASC.Api/ASC.Api.Client/Parameters.cs +++ b/module/ASC.Api/ASC.Api.Client/Parameters.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Client/ResponseParser.cs b/module/ASC.Api/ASC.Api.Client/ResponseParser.cs index 0653bf532..df76f7662 100644 --- a/module/ASC.Api/ASC.Api.Client/ResponseParser.cs +++ b/module/ASC.Api/ASC.Api.Client/ResponseParser.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Community/Blogs/BlogApi.cs b/module/ASC.Api/ASC.Api.Community/Blogs/BlogApi.cs index 6ec67801c..3c0516240 100644 --- a/module/ASC.Api/ASC.Api.Community/Blogs/BlogApi.cs +++ b/module/ASC.Api/ASC.Api.Community/Blogs/BlogApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,6 +38,7 @@ namespace ASC.Api.Community { + ///community public partial class CommunityApi { private BlogsEngine _blogEngine; @@ -55,11 +56,14 @@ protected internal BlogsEngine BlogEngine /// - /// Returns a list of all the posts from the portal blogs with the post titles, dates of creation and update, post texts, authors. + /// Returns a list of all the posts from the portal blogs with the post titles, dates of creation and update, post texts, and authors. /// ///Get posts - ///List of all posts + ///List of all posts ///Blogs + ///api/2.0/community/blog + ///list + ///GET [Read("blog")] public IEnumerable GetPosts() { @@ -70,11 +74,11 @@ public IEnumerable GetPosts() ///Creates a blog post with the specified title, content, tags and subscription to comments defined in the request body. /// ///Create a post - ///Post title - ///Post text - ///List of tags separated with comma - ///Subscribes to the post comments - ///Newly created post + ///Post title + ///Post text + ///List of tags separated with comma + ///Subscribes to the post comments or not + ///Newly created post /// /// GetPosts() /// /// ///Blogs + /// api/2.0/community/blog + /// POST [Create("blog")] public BlogPostWrapperFull CreatePost(string title, string content, string tags, bool subscribeComments) { @@ -110,11 +116,11 @@ public BlogPostWrapperFull CreatePost(string title, string content, string tags, ///Updates the selected post changing the post title, content or/and tags specified in the request. /// ///Update a post - ///Post ID - ///New title - ///New post text - ///New list of tags separated with comma - ///Updated post + ///Post ID + ///New title + ///New post text + ///New list of tags separated with comma + ///Updated post /// /// /// ///Blogs + ///api/2.0/community/blog/{postid} + ///PUT [Update("blog/{postid}")] public BlogPostWrapperFull UpdatePost(Guid postid, string title, string content, string tags) { @@ -147,9 +155,12 @@ public BlogPostWrapperFull UpdatePost(Guid postid, string title, string content, ///Deletes a post with the ID specified in the request from blogs. /// ///Delete a post - ///Post ID + ///Post ID + ///Deleted post /// ///Blogs + ///api/2.0/community/blog/{postid} + /// DELETE [Delete("blog/{postid}")] public BlogPostWrapperFull DeletePost(Guid postid) { @@ -161,11 +172,14 @@ public BlogPostWrapperFull DeletePost(Guid postid) } /// - ///Returns a list of all the blog posts for the current user with the post titles, dates of creation and update, post texts, authors. + ///Returns a list of all the blog posts for the current user with the post titles, dates of creation and update, post texts, and author. /// ///Blogs ///Get my posts - ///List of my posts + ///List of my posts + ///list + ///api/2.0/community/blog/@self + ///GET [Read("blog/@self")] public IEnumerable GetMyPosts() { @@ -173,14 +187,17 @@ public IEnumerable GetMyPosts() } /// - ///Returns a list of blog posts matching the search query specified in the request with the post titles, dates of creation and update, post texts, authors. + ///Returns a list of blog posts matching the search query specified in the request with the post titles, dates of creation and update, post texts, and authors. /// ///Blogs /// ///Search posts /// - /// Search query - ///List of found posts + /// Search query + ///List of found posts + ///api/2.0/community/blog/@search/{query} + ///GET + /// list [Read("blog/@search/{query}")] public IEnumerable GetSearchPosts(string query) { @@ -192,8 +209,11 @@ public IEnumerable GetSearchPosts(string query) /// ///Get user posts ///Blogs - ///User name - ///List of user posts + ///User name + ///List of user posts + ///api/2.0/community/blog/user/{username} + ///GET + /// list [Read("blog/user/{username}")] public IEnumerable GetUserPosts(string username) { @@ -202,12 +222,15 @@ public IEnumerable GetUserPosts(string username) } /// - ///Returns a list of blog posts containing the tag specified in the request with the post titles, dates of creation and update, post texts, authors. + ///Returns a list of blog posts containing the tag specified in the request with the post titles, dates of creation and update, post texts, and authors. /// ///Get posts by tag ///Blogs - ///Tag name - ///List of posts with the specified tag name + ///Tag name + ///List of posts with the specified tag name + ///list + ///api/2.0/community/blog/tag/{tag} + ///GET [Read("blog/tag/{tag}")] public IEnumerable GetPostsByTag(string tag) { @@ -215,11 +238,14 @@ public IEnumerable GetPostsByTag(string tag) } /// - ///Returns a list of all the tags used with blog posts with the number showing the tag usage. + ///Returns a list of all the tags used in the blog posts with a number specifying the tag usage. /// /// Blogs /// Get tags - ///List of tags + ///List of tags + ///api/2.0/community/blog/tag + ///GET + ///list [Read("blog/tag")] public IEnumerable GetTags() { @@ -235,8 +261,10 @@ public IEnumerable GetTags() /// ///Get a post ///Blogs - ///Post ID - ///Post information + ///Post ID + ///Post information + ///api/2.0/community/blog/{postid} + ///GET [Read("blog/{postid}")] public BlogPostWrapperFull GetPost(Guid postid) { @@ -248,8 +276,11 @@ public BlogPostWrapperFull GetPost(Guid postid) /// ///Blogs /// Get post comments - ///Post ID (GUID) - ///List of post comments + ///Post ID (GUID) + ///List of post comments + ///api/2.0/community/blog/{postid}/comment + ///GET + /// list [Read("blog/{postid}/comment")] public IEnumerable GetComments(Guid postid) { @@ -261,10 +292,10 @@ public IEnumerable GetComments(Guid postid) /// /// Add a post comment /// Blogs - ///Post ID - ///Comment text - ///Parent comment ID - ///List of post comments + ///Post ID + ///Comment text + ///Parent comment ID + ///List of post comments /// /// GetComments(Guid postid) /// /// Send parentId=00000000-0000-0000-0000-000000000000 or don't send it at all if you want your comment to be on the root level. /// + /// api/2.0/community/blog/{postid}/comment + /// POST [Create("blog/{postid}/comment")] public BlogPostCommentWrapper AddComment(Guid postid, string content, Guid parentId) { @@ -306,10 +339,12 @@ public BlogPostCommentWrapper AddComment(Guid postid, string content, Guid paren /// /// Get a comment preview ///
    Comments
    - /// Comment ID - /// Comment text in the HTML format - /// Comment information + /// Comment ID + /// Comment text in the HTML format + /// Comment information /// Blogs + /// api/2.0/community/blog/comment/preview + /// POST [Create("blog/comment/preview")] public CommentInfo GetBlogCommentPreview(string commentid, string htmltext) { @@ -334,9 +369,11 @@ public CommentInfo GetBlogCommentPreview(string commentid, string htmltext) /// /// Remove a comment ///
    Comments
    - /// Comment ID + /// Comment ID /// Comment ID /// Blogs + /// api/2.0/community/blog/comment/{commentid} + /// DELETE [Delete("blog/comment/{commentid}")] public string RemoveBlogComment(string commentid) { @@ -365,18 +402,18 @@ public string RemoveBlogComment(string commentid) return commentid; } - - /// /// Adds a blog comment with the comment text specified in the request. The parent comment ID can be also specified if needed. /// /// Add a blog comment ///
    Comments
    - /// Parent comment ID - /// Entity ID - /// Comment text - /// Comment information + /// Parent comment ID + /// Entity ID where a comment will be added + /// Comment text + /// Comment information /// Blogs + /// api/2.0/community/blog/comment + /// POST [Create("blog/comment")] public CommentInfo AddBlogComment(string parentcommentid, string entityid, string content) { @@ -421,10 +458,12 @@ public CommentInfo AddBlogComment(string parentcommentid, string entityid, strin /// /// Update a blog comment ///
    Comments
    - /// Comment ID - /// New comment text - /// Updated blog comment /// Blogs + /// Comment ID + /// New comment text + /// Updated blog comment + /// api/2.0/community/blog/comment/{commentid} + /// PUT [Update("blog/comment/{commentid}")] public string UpdateBlogComment(string commentid, string content) { diff --git a/module/ASC.Api/ASC.Api.Community/Blogs/BlogPostCommentWrapper.cs b/module/ASC.Api/ASC.Api.Community/Blogs/BlogPostCommentWrapper.cs index c1c4313b3..abcf69be5 100644 --- a/module/ASC.Api/ASC.Api.Community/Blogs/BlogPostCommentWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Blogs/BlogPostCommentWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,23 +42,33 @@ private BlogPostCommentWrapper() { } - + ///comment text + ///10 [DataMember(Order = 10)] public string Text { get; set; } + ///2020-12-03T21:36:13.0325127Z + ///6 [DataMember(Order = 6)] public ApiDateTime Created { get; set; } + ///c2020-12-03T21:36:13.0325127Z + ///6 [DataMember(Order = 6)] public ApiDateTime Updated { get; set; } - + ///c2020-12-03T21:36:13.0325127Z + ///1 [DataMember(Order = 1)] public Guid Id { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///9 [DataMember(Order = 9)] public EmployeeWraper CreatedBy { get; set; } + ///c2020-12-03T21:36:13.0325127Z + ///16 [DataMember(Order = 16)] protected Guid ParentId { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Blogs/BlogPostWrapperFull.cs b/module/ASC.Api/ASC.Api.Community/Blogs/BlogPostWrapperFull.cs index c567b6e32..26f472070 100644 --- a/module/ASC.Api/ASC.Api.Community/Blogs/BlogPostWrapperFull.cs +++ b/module/ASC.Api/ASC.Api.Community/Blogs/BlogPostWrapperFull.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,24 +44,39 @@ private BlogPostWrapperFull() } + ///Post text + ///100 [DataMember(Order = 100)] public string Text { get; set; } + ///Example post + ///5 [DataMember(Order = 5)] public string Title { get; set; } + ///2020-12-06T07:36:14.7981820Z + /// [DataMember(Order = 6)] public ApiDateTime Created { get; set; } + ///2020-12-06T07:36:14.7981820Z + ///6 [DataMember(Order = 6)] public ApiDateTime Updated { get; set; } + ///00000000-0000-0000-0000-000000000000 + ///1 [DataMember(Order = 1)] public Guid Id { get; set; } + ///Tag1,Tag2 + ///11 + ///list [DataMember(Order = 11)] protected List Tags { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///9 [DataMember(Order = 9)] public EmployeeWraper CreatedBy { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Blogs/BlogPostWrapperSummary.cs b/module/ASC.Api/ASC.Api.Community/Blogs/BlogPostWrapperSummary.cs index 5a06b6d68..dd9257fe7 100644 --- a/module/ASC.Api/ASC.Api.Community/Blogs/BlogPostWrapperSummary.cs +++ b/module/ASC.Api/ASC.Api.Community/Blogs/BlogPostWrapperSummary.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,28 +52,45 @@ internal BlogPostWrapperSummary() } + ///Preview post + ///10 [DataMember(Order = 10)] public string Preview { get; set; } + ///Example post + ///5 [DataMember(Order = 5)] public string Title { get; set; } + ///2020-12-03T21:36:12.0774137Z + ///6 [DataMember(Order = 6)] public ApiDateTime Created { get; set; } + ///2020-12-03T21:36:12.0774137Z + ///6 [DataMember(Order = 6)] public ApiDateTime Updated { get; set; } + ///00000000-0000-0000-0000-000000000000 + ///1 [DataMember(Order = 1)] public Guid Id { get; set; } + ///Tag1,Tag1 + ///11 + ///list [DataMember(Order = 11)] public List Tags { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///9 [DataMember(Order = 9)] public EmployeeWraper CreatedBy { get; set; } + ///Blog Title + ///12 [DataMember(Order = 12)] public string BlogTitle { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Blogs/BlogTagWrapper.cs b/module/ASC.Api/ASC.Api.Community/Blogs/BlogTagWrapper.cs index d466ddadd..a51496d12 100644 --- a/module/ASC.Api/ASC.Api.Community/Blogs/BlogTagWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Blogs/BlogTagWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,9 +35,13 @@ private BlogTagWrapper() { } + ///Sample tag + ///1 [DataMember(Order = 1)] public string Name { get; set; } + ///10 + ///10 [DataMember(Order = 10)] public int Count { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Bookmarks/BookmarkApi.cs b/module/ASC.Api/ASC.Api.Community/Bookmarks/BookmarkApi.cs index 15032e5b3..2a597e301 100644 --- a/module/ASC.Api/ASC.Api.Community/Bookmarks/BookmarkApi.cs +++ b/module/ASC.Api/ASC.Api.Community/Bookmarks/BookmarkApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +35,7 @@ namespace ASC.Api.Community { + ///community public partial class CommunityApi { private BookmarkingService _bookmarkingDao; @@ -45,13 +46,16 @@ private BookmarkingService BookmarkingDao } /// - ///Returns a list of all the portal bookmarks with the bookmark titles, dates of creation and update, bookmark texts and authors. + ///Returns a list of all the portal bookmarks with the bookmark titles, dates of creation and update, bookmark texts, and authors. /// /// ///Get bookmarks /// ///Bookmarks - ///List of all bookmarks + ///List of all bookmarks + ///list + ///api/2.0/community/bookmark + ///GET [Read("bookmark")] public IEnumerable GetBookmarks() { @@ -61,13 +65,16 @@ public IEnumerable GetBookmarks() } /// - ///Returns a list of all the bookmarks for the current user with the bookmark titles, dates of creation and update, bookmark texts and author. + ///Returns a list of all the bookmarks for the current user with the bookmark titles, dates of creation and update, bookmark texts, and author. /// /// ///Get my bookmarks /// ///Bookmarks - ///List of bookmarks + ///List of bookmarks + ///api/2.0/community/bookmark/@self + ///GET + /// list [Read("bookmark/@self")] public IEnumerable GetMyBookmarks() { @@ -77,14 +84,17 @@ public IEnumerable GetMyBookmarks() } /// - ///Returns a list of bookmarks matching the search query specified in the request with the bookmark titles, dates of creation and update, bookmark descriptions and author. + ///Returns a list of bookmarks matching the search query specified in the request with the bookmark titles, dates of creation and update, bookmark descriptions, and authors. /// /// ///Search bookmarks /// ///Bookmarks - /// Search query - ///List of bookmarks + /// Search query + ///List of bookmarks + ///api/2.0/community/bookmark/@search/{query} + ///GET + /// list [Read("bookmark/@search/{query}")] public IEnumerable SearchBookmarks(string query) { @@ -94,13 +104,16 @@ public IEnumerable SearchBookmarks(string query) } /// - ///Returns a list of favorite bookmarks for the current user with the bookmark titles, dates of creation and update, bookmark texts and author. + ///Returns a list of favorite bookmarks for the current user with the bookmark titles, dates of creation and update, bookmark texts, and authors. /// /// ///Get my favorite bookmarks /// ///Bookmarks - ///List of bookmarks + ///List of bookmarks + ///api/2.0/community/bookmark/@favs + ///GET + /// list [Read("bookmark/@favs")] public IEnumerable GetFavsBookmarks() { @@ -113,10 +126,13 @@ public IEnumerable GetFavsBookmarks() ///Returns a list of all the bookmark tags with a number specifying the tag usage. /// /// - ///Get all tags + ///Get tags /// ///Bookmarks - ///List of tags + ///List of tags + ///list + ///api/2.0/community/bookmark/tag + ///GET [Read("bookmark/tag")] public IEnumerable GetBookmarksTags() { @@ -125,14 +141,17 @@ public IEnumerable GetBookmarksTags() } /// - ///Returns a list of all the bookmarks marked by the tag specified in the request with the bookmark titles, dates of creation and update, bookmark texts and authors. + ///Returns a list of all the bookmarks marked by the tag specified in the request with the bookmark titles, dates of creation and update, bookmark texts, and authors. /// /// - ///Get a bookmark by a tag + ///Get bookmarks by tag /// ///Bookmarks - ///Tag name - ///List of bookmarks + ///Tag name + ///List of bookmarks + ///list + ///api/2.0/community/bookmark/bytag + ///GET [Read("bookmark/bytag")] public IEnumerable GetBookmarksByTag(string tag) { @@ -142,13 +161,16 @@ public IEnumerable GetBookmarksByTag(string tag) } /// - ///Returns a list of recently added bookmarks with the bookmark titles, dates of creation and update, bookmark texts and authors. + ///Returns a list of recently added bookmarks with the bookmark titles, dates of creation and update, bookmark texts, and authors. /// /// ///Get recent bookmarks /// ///Bookmarks - ///List of bookmarks + ///List of bookmarks + ///api/2.0/community/bookmark/top/recent + ///GET + /// list [Read("bookmark/top/recent")] public IEnumerable GetRecentBookmarks() { @@ -158,13 +180,16 @@ public IEnumerable GetRecentBookmarks() } /// - ///Returns a list of the bookmarks most popular for the current date with the bookmark titles, dates of creation and update, bookmark texts and authors. + ///Returns a list of the most popular bookmarks for the current date with the bookmark titles, dates of creation and update, bookmark texts, and authors. /// /// - ///Get top of day bookmarks + ///Get top of the day bookmarks /// ///Bookmarks - ///List of bookmarks + ///List of bookmarks + ///api/2.0/community/bookmark/top/day + ///GET + /// list [Read("bookmark/top/day")] public IEnumerable GetTopDayBookmarks() { @@ -174,13 +199,16 @@ public IEnumerable GetTopDayBookmarks() } /// - ///Returns a list of the bookmarks most popular for the current month with the bookmark titles, dates of creation and update, bookmark texts and authors. + ///Returns a list of the most popular bookmarks for the current month with the bookmark titles, dates of creation and update, bookmark texts, and authors. /// /// - ///Get top of month bookmarks + ///Get top of the month bookmarks /// ///Bookmarks - ///List of bookmarks + ///List of bookmarks + ///api/2.0/community/bookmark/top/month + ///GET + /// list [Read("bookmark/top/month")] public IEnumerable GetTopMonthBookmarks() { @@ -190,13 +218,16 @@ public IEnumerable GetTopMonthBookmarks() } /// - ///Returns a list of the bookmarks most popular for the current week with the bookmark titles, dates of creation and update, bookmark texts and authors. + ///Returns a list of the most popular bookmarks for the current week with the bookmark titles, dates of creation and update, bookmark texts, and authors. /// /// - ///Get top of week bookmarks + ///Get top of the week bookmarks /// ///Bookmarks - ///List of bookmarks + ///List of bookmarks + ///api/2.0/community/bookmark/top/week + ///GET + /// list [Read("bookmark/top/week")] public IEnumerable GetTopWeekBookmarks() { @@ -206,13 +237,16 @@ public IEnumerable GetTopWeekBookmarks() } /// - ///Returns a list of the bookmarks most popular for the current year with the bookmark titles, dates of creation and update, bookmark texts and authors. + ///Returns a list of the most popular bookmarks for the current year with the bookmark titles, dates of creation and update, bookmark texts, and authors. /// /// - ///Get top of year bookmarks + ///Get top of the year bookmarks /// ///Bookmarks - ///List of bookmarks + ///List of bookmarks + /// api/2.0/community/bookmark/top/year + ///GET + /// list [Read("bookmark/top/year")] public IEnumerable GetTopYearBookmarks() { @@ -228,8 +262,11 @@ public IEnumerable GetTopYearBookmarks() /// Get bookmark comments /// ///Bookmarks - ///Bookmark ID - ///List of bookmark comments + ///Bookmark ID + ///List of bookmark comments + ///api/2.0/community/bookmark/{id}/comment + ///GET + ///list [Read("bookmark/{id}/comment")] public IEnumerable GetBookmarkComments(long id) { @@ -243,10 +280,10 @@ public IEnumerable GetBookmarkComments(long id) /// /// Add a bookmark comment by bookmark ID /// - ///Bookmark ID - ///Comment text - ///Parent comment ID - ///List of bookmark comments + ///Bookmark ID + ///Comment text + ///Parent comment ID + ///List of bookmark comments /// /// GetBookmarkComments(long id) /// Send parentId=00000000-0000-0000-0000-000000000000 or doesn't send it at all if you want your comment to be on the root level. /// /// Bookmarks + /// api/2.0/community/bookmark/{id}/comment + /// POST [Create("bookmark/{id}/comment")] public BookmarkCommentWrapper AddBookmarkComment(long id, string content, Guid parentId) { @@ -287,11 +326,13 @@ public BookmarkCommentWrapper AddBookmarkComment(long id, string content, Guid p /// Returns the detailed information on the bookmark with the ID specified in the request. /// /// - /// Get a bookmark by ID + /// Get a bookmark /// - ///Bookmark ID - ///Bookmark information + ///Bookmark ID + ///Bookmark information ///Bookmarks + ///api/2.0/community/bookmark/{id} + ///GET [Read("bookmark/{id}")] public BookmarkWrapper GetBookmarkById(long id) { @@ -304,11 +345,11 @@ public BookmarkWrapper GetBookmarkById(long id) /// /// Add a bookmark /// - ///Absolute URL to the bookmark page - ///Bookmark title - ///Bookmark description - ///Bookmark tags separated by semicolon - ///Newly added bookmark + ///Absolute URL to the bookmark page + ///Bookmark title + ///Bookmark description + ///Bookmark tags separated with semicolon + ///Newly added bookmark /// /// /// /// Bookmarks + /// api/2.0/community/bookmark + /// POST [Create("bookmark")] public BookmarkWrapper AddBookmark(string url, string title, string description, string tags) { @@ -353,10 +396,12 @@ public BookmarkWrapper AddBookmark(string url, string title, string description, /// /// Get a comment preview ///
    Comments
    - /// Comment ID - /// Comment content - /// Comment information + /// Comment ID + /// Comment content in the HTML format + /// Comment information /// Bookmarks + /// api/2.0/community/bookmark/comment/preview + /// POST [Create("bookmark/comment/preview")] public CommentInfo GetBookmarkCommentPreview(string commentid, string htmltext) { @@ -389,9 +434,11 @@ public CommentInfo GetBookmarkCommentPreview(string commentid, string htmltext) /// /// Remove a comment ///
    Comments
    - /// Comment ID + /// Comment ID /// Comment ID /// Bookmarks + /// api/2.0/community/bookmark/comment/{commentid} + /// DELETE [Delete("bookmark/comment/{commentid}")] public string RemoveBookmarkComment(string commentid) { @@ -410,10 +457,12 @@ public string RemoveBookmarkComment(string commentid) /// /// Add a bookmark comment by entity ID /// - ///Parent comment ID - ///Entity ID - ///Comment text - ///List of bookmark comments + ///Parent comment ID + ///Entity ID + ///Comment text + /// List of bookmark comments + /// api/2.0/community/bookmark/comment + /// POST /// Bookmarks [Create("bookmark/comment")] public CommentInfo AddBookmarkComment(string parentcommentid, long entityid, string content) @@ -450,9 +499,11 @@ public CommentInfo AddBookmarkComment(string parentcommentid, long entityid, str /// Updates the selected bookmark comment with the content specified in the request. /// /// Update a bookmark comment - /// Comment ID - /// New comment text + /// Comment ID + /// New comment text /// Updated bookmark + /// api/2.0/community/bookmark/comment/{commentid} + /// PUT /// Bookmarks [Update("bookmark/comment/{commentid}")] public string UpdateBookmarkComment(string commentid, string content) @@ -465,12 +516,14 @@ public string UpdateBookmarkComment(string commentid, string content) } /// - /// Removes a bookmark from favorites. If after removing user bookmark, its rating is 0, the bookmark will be removed completely. + /// Removes a bookmark from favorites. If after removing the user bookmark, its rating is 0, then the bookmark will be removed completely. /// /// Remove a bookmark from favorites - /// Bookmark ID - /// Bookmark + /// Bookmark ID + /// Bookmark /// Bookmarks + /// api/2.0/community/bookmark/@favs/{id} + /// DELETE [Delete("bookmark/@favs/{id}")] public BookmarkWrapper RemoveBookmarkFromFavourite(long id) { @@ -483,8 +536,11 @@ public BookmarkWrapper RemoveBookmarkFromFavourite(long id) /// Removes a bookmark with the ID specified in the request. /// /// Remove a bookmark - /// Bookmark ID + /// Bookmark ID + /// /// Bookmarks + /// api/2.0/community/bookmark/{id} + /// DELETE [Delete("bookmark/{id}")] public void RemoveBookmark(long id) { diff --git a/module/ASC.Api/ASC.Api.Community/Bookmarks/BookmarkCommentWrapper.cs b/module/ASC.Api/ASC.Api.Community/Bookmarks/BookmarkCommentWrapper.cs index 25ab19a5c..68b0ee003 100644 --- a/module/ASC.Api/ASC.Api.Community/Bookmarks/BookmarkCommentWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Bookmarks/BookmarkCommentWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,21 +41,33 @@ private BookmarkCommentWrapper() { } + ///comment text + ///10 [DataMember(Order = 10)] public string Text { get; set; } + ///2020-12-06T07:36:14.8151911Z + ///6 [DataMember(Order = 6)] public ApiDateTime Created { get; set; } + ///2020-12-06T07:36:14.8151911Z + ///6 [DataMember(Order = 6)] public ApiDateTime Updated { get; set; } + ///00000000-0000-0000-0000-000000000000 + ///1 [DataMember(Order = 1)] public Guid Id { get; set; } + ///00000000-0000-0000-0000-000000000000 + ///2 [DataMember(Order = 2, EmitDefaultValue = false)] public Guid ParentId { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///9 [DataMember(Order = 9)] public EmployeeWraper CreatedBy { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Bookmarks/BookmarkWrapper.cs b/module/ASC.Api/ASC.Api.Community/Bookmarks/BookmarkWrapper.cs index 12e1f9043..01996bd41 100644 --- a/module/ASC.Api/ASC.Api.Community/Bookmarks/BookmarkWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Bookmarks/BookmarkWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,31 +28,46 @@ namespace ASC.Api.Bookmarks [DataContract(Name = "bookmark", Namespace = "")] public class BookmarkWrapper : IApiSortableDate { + ///11 + ///1 [DataMember(Order = 1)] public long Id { get; set; } + ///Google inc. + /// [DataMember(Order = 2)] public string Title { get; set; } + ///http:\/\/www.google.com + ///2 [DataMember(Order = 2)] public string Url { get; set; } + ///Url to thumbnail + ///3 [DataMember(Order = 3)] public string Thumbnail { get; set; } + ///2020-12-06T07:36:14.8181893Z + ///3 [DataMember(Order = 3)] public ApiDateTime Created { get; set; } + ///2020-12-06T07:36:14.8181893Z + ///3 [DataMember(Order = 3)] public ApiDateTime Updated { get; set; } + ///Google + ///4 [DataMember(Order = 4)] public string Description { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///9 [DataMember(Order = 9)] public EmployeeWraper CreatedBy { get; set; } - public BookmarkWrapper(Bookmark bookmark) { Id = bookmark.ID; diff --git a/module/ASC.Api/ASC.Api.Community/Bookmarks/TagWrapper.cs b/module/ASC.Api/ASC.Api.Community/Bookmarks/TagWrapper.cs index 50742294f..39d254b05 100644 --- a/module/ASC.Api/ASC.Api.Community/Bookmarks/TagWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Bookmarks/TagWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,9 +35,13 @@ private TagWrapper() { } + ///Sample tag + ///1 [DataMember(Order = 1)] public string Name { get; set; } + ///10 + ///10 [DataMember(Order = 10)] public long Count { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Bookmarks/UserBookmarkWrapper.cs b/module/ASC.Api/ASC.Api.Community/Bookmarks/UserBookmarkWrapper.cs index e850d69fd..34605db59 100644 --- a/module/ASC.Api/ASC.Api.Community/Bookmarks/UserBookmarkWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Bookmarks/UserBookmarkWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Community/CommunityApi.cs b/module/ASC.Api/ASC.Api.Community/CommunityApi.cs index 225f7c2a4..37e4f2868 100644 --- a/module/ASC.Api/ASC.Api.Community/CommunityApi.cs +++ b/module/ASC.Api/ASC.Api.Community/CommunityApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,7 @@ namespace ASC.Api.Community { /// - ///Provides access to the community data api. + ///Community API. /// public partial class CommunityApi : IApiEntryPoint { diff --git a/module/ASC.Api/ASC.Api.Community/CommunityApiCommon.cs b/module/ASC.Api/ASC.Api.Community/CommunityApiCommon.cs index 52fca8f57..437fdd10e 100644 --- a/module/ASC.Api/ASC.Api.Community/CommunityApiCommon.cs +++ b/module/ASC.Api/ASC.Api.Community/CommunityApiCommon.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web; @@ -25,15 +25,18 @@ namespace ASC.Api.Community { + ///community public partial class CommunityApi { /// /// Returns the preview information about the specified category from the community section. /// /// Get preview - /// Category title - /// Category content + /// Category title + /// Category content /// Preview information + /// api/2.0/community/preview + /// POST [Create("preview")] public object GetPreview(string title, string content) { diff --git a/module/ASC.Api/ASC.Api.Community/Events/EventApi.cs b/module/ASC.Api/ASC.Api.Community/Events/EventApi.cs index 7c6250fa0..70657deba 100644 --- a/module/ASC.Api/ASC.Api.Community/Events/EventApi.cs +++ b/module/ASC.Api/ASC.Api.Community/Events/EventApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -56,13 +56,16 @@ private IFeedStorage FeedStorage } /// - ///Returns a list of all the portal events with the event titles, dates of creation and update, event texts and authors. + ///Returns a list of all the portal events with the event titles, dates of creation and update, event texts, and authors. /// /// ///Get events /// - ///List of events + ///List of events ///Events + ///api/2.0/community/event + ///GET + /// list [Read("event")] public IEnumerable GetEvents() { @@ -78,10 +81,12 @@ public IEnumerable GetEvents() /// ///Create an event /// - /// Event title - /// Event content - /// Event type (News|Order|Advert|Poll) - ///Newly created event + /// Event title + /// Event content + /// Event type + ///Newly created event + ///api/2.0/community/event + ///POST ///Events [Create("event")] public EventWrapperFull CreateEvent(string content, string title, FeedType type) @@ -114,12 +119,14 @@ public EventWrapperFull CreateEvent(string content, string title, FeedType type) /// ///Update an event /// - /// Feed ID - /// New event title - /// New event content - /// New event type (News|Order|Advert|Poll) - ///List of events + /// Feed ID + /// New event title + /// New event content + /// New event type + ///List of events ///Events + ///api/2.0/community/event/{feedid} + ///PUT [Update("event/{feedid}")] public EventWrapperFull UpdateEvent(int feedid, string content, string title, FeedType type) { @@ -146,9 +153,12 @@ public EventWrapperFull UpdateEvent(int feedid, string content, string title, Fe ///Deletes an event with the ID specified in the request. /// ///Delete an event - ///Feed ID + ///Feed ID + ///Deleted event /// ///Events + ///api/2.0/community/event/{feedid} + ///DELETE [Delete("event/{feedid}")] public EventWrapperFull DeleteEvent(int feedid) { @@ -169,13 +179,16 @@ public EventWrapperFull DeleteEvent(int feedid) } /// - ///Returns a list of all the events for the current user with the event titles, dates of creation and update, event texts and author. + ///Returns a list of all the events for the current user with the event titles, dates of creation and update, event texts, and author. /// /// ///Get my events /// - ///List of events + ///List of events ///Events + ///api/2.0/community/event/@self + ///GET + /// list [Read("event/@self")] public IEnumerable GetMyEvents() { @@ -185,14 +198,17 @@ public IEnumerable GetMyEvents() } /// - ///Returns a list of events matching the search query specified in the request with the event titles, dates of creation and update, event types and authors. + ///Returns a list of events matching the search query specified in the request with the event titles, dates of creation and update, event types, and authors. /// /// ///Search events /// - /// Search query - ///List of events + /// Search query + ///List of events ///Events + ///api/2.0/community/event/@search/{query} + ///GET + ///list [Read("event/@search/{query}")] public IEnumerable SearchEvents(string query) { @@ -202,14 +218,16 @@ public IEnumerable SearchEvents(string query) } /// - ///Returns the detailed information about an event with the ID specified in the request. + ///Returns the detailed information on the event with the ID specified in the request. /// /// ///Get an event /// - ///Event ID - ///Event information + ///Event ID + ///Event information ///Events + ///api/2.0/community/event/{feedid} + ///GET [Read("event/{feedid}")] public EventWrapperFull GetEvent(int feedid) { @@ -218,14 +236,17 @@ public EventWrapperFull GetEvent(int feedid) } /// - ///Returns the detailed information about the comments on the event with the ID specified in the request. + ///Returns a list of all the comments on the event with the ID specified in the request. /// /// - ///Get the event comments + ///Get event comments /// - ///Event ID - ///List of comments + ///Event ID + ///List of comments ///Events + ///api/2.0/community/event/{feedid}/comment + ///GET + ///list [Read("event/{feedid}/comment")] public IEnumerable GetEventComments(int feedid) { @@ -240,10 +261,10 @@ public IEnumerable GetEventComments(int feedid) /// ///Add an event comment by feed ID /// - ///Feed ID - ///Comment text - ///Comment parent ID - ///Comment + ///Feed ID + ///Comment text + ///Comment parent ID + ///Comment /// /// GetEventComments(int feedid) /// Send parentId=0 or doesn't send it at all if you want your comment to be on the root level. /// /// Events + /// api/2.0/community/event/{feedid}/comment + /// POST [Create("event/{feedid}/comment")] public EventCommentWrapper AddEventComments(int feedid, string content, long parentId) { @@ -284,14 +307,14 @@ public EventCommentWrapper AddEventComments(int feedid, string content, long par } /// - /// Sends a vote to a certain option in a poll-type event with the ID specified in the request. + /// Sends a vote for a certain option in a poll-type event with the ID specified in the request. /// /// - /// Vote for an event + /// Vote for an option /// - ///Event ID - ///Options - ///Event + ///Event ID + ///Options + ///Event ///Thrown if not a Poll ///General error /// @@ -308,6 +331,8 @@ public EventCommentWrapper AddEventComments(int feedid, string content, long par /// If an event is not a poll, then you'll get an error. /// /// Events + /// api/2.0/community/event/{feedid}/vote + /// POST [Create("event/{feedid}/vote")] public EventWrapperFull VoteForEvent(int feedid, long[] variants) { @@ -332,10 +357,12 @@ public EventWrapperFull VoteForEvent(int feedid, long[] variants) /// /// Comment subscription /// - ///Subscribes to the event comments or unsubscribes from them - ///Feed ID + ///Subscribes to the event comments or unsubscribes from them + ///Feed ID ///Boolean value: true means that the user is subscribed to the event comments ///Events + ///api/2.0/community/event/{feedid}/subscribe + ///POST [Create("event/{feedid}/subscribe")] public bool SubscribeOnComments(bool isSubscribe, string feedid) { @@ -365,10 +392,12 @@ public bool SubscribeOnComments(bool isSubscribe, string feedid) /// /// Get a comment preview ///
    Comments
    - /// Comment ID - /// Comment text in the HTML format - /// Comment information + /// Comment ID + /// Comment text in the HTML format + /// Comment information /// Events + /// api/2.0/community/event/comment/preview + /// POST [Create("event/comment/preview")] public CommentInfo GetEventCommentPreview(string commentid, string htmltext) { @@ -401,9 +430,11 @@ public CommentInfo GetEventCommentPreview(string commentid, string htmltext) /// /// Remove a comment ///
    Comments
    - /// Comment ID + /// Comment ID /// Comment information /// Events + /// api/2.0/community/event/comment/{commentid} + /// DELETE [Delete("event/comment/{commentid}")] public string RemoveEventComment(string commentid) { @@ -421,15 +452,17 @@ public string RemoveEventComment(string commentid) /// - ///Adds an event comment with the content specified in the request. The parent event ID can be also specified if needed. + ///Adds a comment to the entity with the ID specified in the request. The parent event ID can be also specified if needed. /// /// ///Add an event comment by entity ID /// - ///Comment parent ID - ///Entity ID - ///Comment text - ///Comment information + ///Comment parent ID + ///Entity ID + ///Comment text + /// Comment information + /// api/2.0/community/event/comment + /// POST /// Events [Create("event/comment")] public CommentInfo AddEventComment(string parentcommentid, string entityid, string content) @@ -456,10 +489,12 @@ public CommentInfo AddEventComment(string parentcommentid, string entityid, stri /// ///Update a comment /// - ///Comment ID - ///New comment text - ///Updated comment /// Events + /// Comment ID + /// New comment text + /// Updated comment + /// api/2.0/community/event/comment/{commentid} + /// PUT [Update("event/comment/{commentid}")] public string UpdateComment(string commentid, string content) { diff --git a/module/ASC.Api/ASC.Api.Community/Events/EventCommentWrapper.cs b/module/ASC.Api/ASC.Api.Community/Events/EventCommentWrapper.cs index 7dfa76ee6..eb82742da 100644 --- a/module/ASC.Api/ASC.Api.Community/Events/EventCommentWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Events/EventCommentWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,12 +41,18 @@ private EventCommentWrapper() { } + ///comment text + ///10 [DataMember(Order = 10)] public string Text { get; set; } + ///2020-12-07T13:56:02.2899133Z + ///6 [DataMember(Order = 6)] public ApiDateTime Created { get; set; } + ///2020-12-07T13:56:02.2899133Z + ///6 [DataMember(Order = 6)] public ApiDateTime Updated { @@ -54,12 +60,18 @@ public ApiDateTime Updated set; } + ///10 + ///1 [DataMember(Order = 1)] public long Id { get; set; } + ///123 + ///2 [DataMember(Order = 2)] public long ParentId { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///9 [DataMember(Order = 9)] public EmployeeWraper CreatedBy { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Events/EventWrapper.cs b/module/ASC.Api/ASC.Api.Community/Events/EventWrapper.cs index 772f3bd28..2ccf5dccb 100644 --- a/module/ASC.Api/ASC.Api.Community/Events/EventWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Events/EventWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,22 +27,34 @@ namespace ASC.Api.Events [DataContract(Name = "event", Namespace = "")] public class EventWrapper : IApiSortableDate { + ///10 + ///1 [DataMember(Order = 1)] public long Id { get; set; } + ///Manager + ///2 [DataMember(Order = 2)] public string Title { get; set; } + ///2020-12-07T13:56:02.2729203Z + ///3 [DataMember(Order = 3)] public ApiDateTime Created { get; set; } + ///2020-12-07T13:56:02.2729203Z + ///3 [DataMember(Order = 3)] public ApiDateTime Updated { get; set; } + ///1 + ///4 [DataMember(Order = 4)] public FeedType Type { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///9 [DataMember(Order = 9)] public EmployeeWraper CreatedBy { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Events/EventWrapperFull.cs b/module/ASC.Api/ASC.Api.Community/Events/EventWrapperFull.cs index 77d63dd8b..fea5ef6df 100644 --- a/module/ASC.Api/ASC.Api.Community/Events/EventWrapperFull.cs +++ b/module/ASC.Api/ASC.Api.Community/Events/EventWrapperFull.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,14 +23,17 @@ namespace ASC.Api.Events { + ///ASC.Api.Events.EventWrapper, ASC.Api.Community [DataContract(Name = "event", Namespace = "")] public class EventWrapperFull : EventWrapper { + ///Text of feed + ///100 [DataMember(Order = 100)] public string Text { get; set; } - - + ///ASC.Api.Events.PollWrapper, ASC.Api.Community + ///200 [DataMember(Order = 200, EmitDefaultValue = false)] public PollWrapper Poll { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Events/PollWrapper.cs b/module/ASC.Api/ASC.Api.Community/Events/PollWrapper.cs index 826c074e5..e41828e9a 100644 --- a/module/ASC.Api/ASC.Api.Community/Events/PollWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Events/PollWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,18 +46,29 @@ internal PollWrapper() } + ///0 + ///200 [DataMember(Order = 200, EmitDefaultValue = true)] public FeedPollType PollType { get; set; } + ///2020-12-07T13:56:02.2859248Z + ///200 [DataMember(Order = 200, EmitDefaultValue = false)] public ApiDateTime EndDate { get; set; } + ///2020-12-07T13:56:02.2859248Z + ///200 [DataMember(Order = 200, EmitDefaultValue = false)] public ApiDateTime StartDate { get; set; } + ///false + /// [DataMember(Order = 200, EmitDefaultValue = true)] public bool Voted { get; set; } + ///ASC.Api.Events.VoteWrapper, ASC.Api.Community + ///300 + ///list [DataMember(Order = 300)] public IEnumerable Votes { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Events/VoteWrapper.cs b/module/ASC.Api/ASC.Api.Community/Events/VoteWrapper.cs index ae5553059..de82fbbe3 100644 --- a/module/ASC.Api/ASC.Api.Community/Events/VoteWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Events/VoteWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,12 +22,18 @@ namespace ASC.Api.Events [DataContract(Name = "vote", Namespace = "")] public class VoteWrapper { + ///133 + ///1 [DataMember(Order = 1, EmitDefaultValue = true)] public long Id { get; set; } + ///Variant 1 + ///10 [DataMember(Order = 10, EmitDefaultValue = true)] public string Name { get; set; } + ///100 + ///20 [DataMember(Order = 20, EmitDefaultValue = true)] public int Votes { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Forums/ForumApi.cs b/module/ASC.Api/ASC.Api.Community/Forums/ForumApi.cs index c3c5db16e..19efa56ff 100644 --- a/module/ASC.Api/ASC.Api.Community/Forums/ForumApi.cs +++ b/module/ASC.Api/ASC.Api.Community/Forums/ForumApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,7 +32,9 @@ namespace ASC.Api.Community { + //TODO: Add html decoding to some fields!!! + ///community public partial class CommunityApi { private int TenantId @@ -53,13 +55,15 @@ private int Count } /// - ///Returns a list of all the portal forums with the topic/thread titles, dates of creation and update, post texts and authors. + ///Returns a list of all the portal forums with the topic/thread titles, dates of creation and update, post texts, and authors. /// /// ///Get forums /// - ///List of forums + ///List of forums ///Forums + ///api/2.0/community/forum + ///GET [Read("forum")] public ForumWrapper GetForums() { @@ -78,6 +82,8 @@ public ForumWrapper GetForums() ///Number of forums ///false ///Forums + /// api/2.0/community/forum/count + /// GET [Read("forum/count")] public int GetForumsCount() { @@ -85,14 +91,16 @@ public int GetForumsCount() } /// - ///Returns a list of all the thread topics with the topic titles, dates of creation and update, post texts and authors. + ///Returns a list of all the thread topics with the topic titles, dates of creation and update, post texts, and authors. /// /// ///Get thread topics /// - ///Thread ID - ///List of thread topics + ///Thread ID + ///List of thread topics ///Forums + ///api/2.0/community/forum/{threadid} + ///GET [Read("forum/{threadid}")] public ForumThreadWrapperFull GetThreadTopics(int threadid) { @@ -107,13 +115,16 @@ public ForumThreadWrapperFull GetThreadTopics(int threadid) /// - ///Returns a list of all the recently updated topics in the portal forums with the topic titles, dates of creation and update, post texts and authors. + ///Returns a list of all the recently updated topics in the portal forums with the topic titles, dates of creation and update, post texts, and authors. /// /// - ///Get last updated topics + ///Get recently updated topics /// - ///List of last updated topics + ///List of recently updated topics ///Forums + ///api/2.0/community/forum/topic/recent + ///GET + /// list [Read("forum/topic/recent")] public IEnumerable GetLastTopics() { @@ -123,14 +134,16 @@ public IEnumerable GetLastTopics() } /// - ///Returns a list of all the posts of the selected forum topic with the dates of creation and update, post texts and authors. + ///Returns a list of all the posts of the selected forum topic with the dates of creation and update, post texts, and authors. /// /// ///Get topic posts /// - ///Topic ID - ///List of topic posts + ///Topic ID + ///List of topic posts ///Forums + ///api/2.0/community/forum/topic/{topicid} + ///GET [Read("forum/topic/{topicid}")] public ForumTopicWrapperFull GetTopicPosts(int topicid) { @@ -151,12 +164,14 @@ public ForumTopicWrapperFull GetTopicPosts(int topicid) /// /// Add a thread to a category /// - /// Category ID (-1 for new category) - /// Category name - /// Thread name - /// Thread description - ///Added thread + /// Category ID (-1 for a new category) + /// Category name + /// Thread name + /// Thread description + ///Added thread ///Forums + ///api/2.0/community/forum + ///POST [Create("forum")] public ForumThreadWrapper AddThreadToCategory(int categoryId, string categoryName, string threadName, string threadDescription) { @@ -203,12 +218,14 @@ public ForumThreadWrapper AddThreadToCategory(int categoryId, string categoryNam /// /// Add a topic to a thread /// - /// Topic subject - /// Thread ID - /// Topic text - /// Topic type - ///Added topic + /// Thread ID + /// Topic subject + /// Topic text + /// Topic type + ///Added topic ///Forums + ///api/2.0/community/forum/{threadid} + ///POST [Create("forum/{threadid}")] public ForumTopicWrapperFull AddTopic(int threadid, string subject, string content, TopicType topicType) { @@ -219,17 +236,19 @@ public ForumTopicWrapperFull AddTopic(int threadid, string subject, string conte } /// - /// Updates a topic with the ID specified in the request changing a topic subject, making it sticky or closing it. + /// Updates a topic with the ID specified in the request, changing a topic subject, making it sticky, or closing it. /// /// /// Update a topic /// - /// Topic ID - /// New subject - /// Makes a topic sticky - /// Closes a topic - ///Updated topic + /// Topic ID + /// New subject + /// Makes a topic sticky + /// Closes a topic + ///Updated topic ///Forums + ///api/2.0/community/forum/topic/{topicid} + ///PUT [Update("forum/topic/{topicid}")] public ForumTopicWrapperFull UpdateTopic(int topicid, string subject, bool sticky, bool closed) { @@ -242,12 +261,14 @@ public ForumTopicWrapperFull UpdateTopic(int topicid, string subject, bool stick /// /// Add a post to a topic /// - ///Topic ID - ///Parent post ID - ///Post subject (required) - ///Post text - ///New post + ///Topic ID + ///Parent post ID + ///Post subject (required) + ///Post text + ///New post ///Forums + ///api/2.0/community/forum/topic/{topicid} + ///POST [Create("forum/topic/{topicid}")] public ForumTopicPostWrapper AddTopicPosts(int topicid, int parentPostId, string subject, string content) { @@ -262,12 +283,14 @@ public ForumTopicPostWrapper AddTopicPosts(int topicid, int parentPostId, string /// /// Update a topic post /// - ///Topic ID - ///Post ID - ///New post subject (required) - ///New post text - ///Updated post + ///Topic ID + ///Post ID + ///New post subject (required) + ///New post text + ///Updated post ///Forums + ///api/2.0/community/forum/topic/{topicid}/{postid} + ///PUT [Update("forum/topic/{topicid}/{postid}")] public ForumTopicPostWrapper UpdateTopicPosts(int topicid, int postid, string subject, string content) { @@ -276,14 +299,17 @@ public ForumTopicPostWrapper UpdateTopicPosts(int topicid, int postid, string su } /// - ///Returns a list of topics matching the search query with the topic titles, dates of creation and update, post texts and authors. + ///Returns a list of topics matching the search query specified in the request with the topic titles, dates of creation and update, post texts, and authors. /// /// ///Search topics /// - ///Search query - ///List of topics + ///Search query + ///List of topics ///Forums + ///api/2.0/community/forum/@search/{query} + ///GET + /// list [Read("forum/@search/{query}")] public IEnumerable SearchTopics(string query) { @@ -300,9 +326,11 @@ public IEnumerable SearchTopics(string query) /// /// Delete a post /// - ///Post ID + ///Post ID + ///Post ///Forums - ///Post + ///api/2.0/community/forum/post/{postid} + ///DELETE [Delete("forum/post/{postid}")] public ForumTopicPostWrapper DeletePost(int postid) { @@ -327,9 +355,11 @@ public ForumTopicPostWrapper DeletePost(int postid) /// /// Delete a topic /// - ///Topic ID + ///Topic ID + ///Topic ///Forums - ///Topic + ///api/2.0/community/forum/topic/{topicid} + ///DELETE [Delete("forum/topic/{topicid}")] public ForumTopicWrapper DeleteTopic(int topicid) { @@ -351,9 +381,11 @@ public ForumTopicWrapper DeleteTopic(int topicid) /// /// Delete a thread /// - ///Thread ID + ///Thread ID + ///Thread ///Forums - ///Thread + ///api/2.0/community/forum/thread/{threadid} + ///DELETE [Delete("forum/thread/{threadid}")] public ForumThreadWrapper DeleteThread(int threadid) { @@ -375,9 +407,11 @@ public ForumThreadWrapper DeleteThread(int threadid) /// /// Delete a category /// - ///Category ID + ///Category ID + ///Category ///Forums - ///Category + ///api/2.0/community/forum/category/{categoryid} + ///DELETE [Delete("forum/category/{categoryid}")] public ForumCategoryWrapper DeleteThreadCategory(int categoryid) { diff --git a/module/ASC.Api/ASC.Api.Community/Forums/ForumCategoryWrapper.cs b/module/ASC.Api/ASC.Api.Community/Forums/ForumCategoryWrapper.cs index afb9429e3..a25a3b3f4 100644 --- a/module/ASC.Api/ASC.Api.Community/Forums/ForumCategoryWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Forums/ForumCategoryWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,19 +27,28 @@ namespace ASC.Api.Forums [DataContract(Name = "category", Namespace = "")] public class ForumCategoryWrapper : IApiSortableDate { + ///0 + ///0 [DataMember(Order = 0)] public int Id { get; set; } + ///Sample title + ///1 [DataMember(Order = 1)] public string Title { get; set; } + ///2020-12-07T13:56:02.3459179Z + ///2 [DataMember(Order = 2)] public ApiDateTime Created { get; set; } + ///2020-12-07T13:56:02.3459179Z + ///3 [DataMember(Order = 3)] public ApiDateTime Updated { get; set; } - + ///Sample category + ///10 [DataMember(Order = 10)] public string Description { get; set; } @@ -58,6 +67,9 @@ private ForumCategoryWrapper() { } + ///ASC.Api.Forums.ForumThreadWrapper, ASC.Api.Community + ///100 + ///list [DataMember(Order = 100)] public List Threads { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Forums/ForumThreadWrapper.cs b/module/ASC.Api/ASC.Api.Community/Forums/ForumThreadWrapper.cs index 0624d4301..7e68dc561 100644 --- a/module/ASC.Api/ASC.Api.Community/Forums/ForumThreadWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Forums/ForumThreadWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,27 +26,43 @@ namespace ASC.Api.Forums [DataContract(Name = "thread", Namespace = "")] public class ForumThreadWrapper : IApiSortableDate { + ///10 + ///1 [DataMember(Order = 1)] public int Id { get; set; } + ///The Thread + ///2 [DataMember(Order = 2)] public string Title { get; set; } + ///Sample thread + ///10 [DataMember(Order = 10)] public string Description { get; set; } + ///2020-12-07T13:56:02.3249197Z + ///20 [DataMember(Order = 20)] public ApiDateTime Created { get; set; } + ///2020-12-07T13:56:02.3249197Z + ///21 [DataMember(Order = 21)] public ApiDateTime Updated { get; set; } + ///1234 + /// [DataMember(Order = 30)] public int RecentTopicId { get; set; } + ///Sample topic + ///30 [DataMember(Order = 30)] public string RecentTopicTitle { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///9 [DataMember(Order = 9)] public EmployeeWraper UpdatedBy { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Forums/ForumThreadWrapperFull.cs b/module/ASC.Api/ASC.Api.Community/Forums/ForumThreadWrapperFull.cs index c8bee6823..d3a329580 100644 --- a/module/ASC.Api/ASC.Api.Community/Forums/ForumThreadWrapperFull.cs +++ b/module/ASC.Api/ASC.Api.Community/Forums/ForumThreadWrapperFull.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,10 +25,14 @@ namespace ASC.Api.Forums { + ///ASC.Api.Forums.ForumThreadWrapper, ASC.Api.Community [DataContract(Name = "thread", Namespace = "")] public class ForumThreadWrapperFull : ForumThreadWrapper { + ///ASC.Api.Forums.ForumTopicWrapper, ASC.Api.Community + ///100 + ///list [DataMember(Order = 100)] public List Topics { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicPostAttachmentWrapper.cs b/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicPostAttachmentWrapper.cs index 3f62bba45..6e3943cea 100644 --- a/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicPostAttachmentWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicPostAttachmentWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,21 +25,33 @@ namespace ASC.Api.Forums [DataContract(Name = "post", Namespace = "")] public class ForumTopicPostAttachmentWrapper : IApiSortableDate { + ///2020-12-07T13:56:02.3269198Z + ///3 [DataMember(Order = 3)] public ApiDateTime Created { get; set; } + ///2020-12-07T13:56:02.3269198Z + ///3 [DataMember(Order = 3)] public ApiDateTime Updated { get; set; } + ///picture.jpg + ///2 [DataMember(Order = 2)] public string Name { get; set; } + ///image/jpeg + ///2 [DataMember(Order = 2)] public string ContentType { get; set; } + ///122345 + ///3 [DataMember(Order = 3)] public int Size { get; set; } + ///url to file + ///5 [DataMember(Order = 5)] public string Path { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicPostWrapper.cs b/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicPostWrapper.cs index 9a1562378..b0725af5d 100644 --- a/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicPostWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicPostWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,20 +28,30 @@ namespace ASC.Api.Forums [DataContract(Name = "post", Namespace = "")] public class ForumTopicPostWrapper : IApiSortableDate { + ///123 + ///1 [DataMember(Order = 1)] public int Id { get; set; } + ///Sample subject + ///2 [DataMember(Order = 2)] public string Subject { get; set; } + ///Post text + ///2 [DataMember(Order = 2)] public string Text { get; set; } + ///2020-12-07T13:56:02.3269198Z + ///3 [DataMember(Order = 3)] public ApiDateTime Created { get; set; } private ApiDateTime updated; + ///2020-12-07T13:56:02.3269198Z + ///3 [DataMember(Order = 3)] public ApiDateTime Updated { @@ -49,12 +59,19 @@ public ApiDateTime Updated set { updated = value; } } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///9 [DataMember(Order = 9)] public EmployeeWraper CreatedBy { get; set; } + ///Title + ///10 [DataMember(Order = 10)] public string ThreadTitle { get; set; } + ///ASC.Api.Forums.ForumTopicPostAttachmentWrapper, ASC.Api.Community + ///100 + /// [DataMember(Order = 100, EmitDefaultValue = false)] public List Attachments { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicWrapper.cs b/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicWrapper.cs index 4105a0709..1fb7e513a 100644 --- a/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,17 +28,25 @@ namespace ASC.Api.Forums [DataContract(Name = "topic", Namespace = "")] public class ForumTopicWrapper : IApiSortableDate { + ///10 + /// 1 [DataMember(Order = 1)] public int Id { get; set; } + ///Sample topic + /// 2 [DataMember(Order = 2)] public string Title { get; set; } + ///2020-12-07T13:56:02.3259212Z + /// 3 [DataMember(Order = 3)] public ApiDateTime Created { get; set; } private ApiDateTime _updated; + ///2020-12-07T13:56:02.3259212Z + /// 3 [DataMember(Order = 3)] public ApiDateTime Updated { @@ -46,12 +54,18 @@ public ApiDateTime Updated set { _updated = value; } } + ///This is sample post + /// 8 [DataMember(Order = 8)] public string Text { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + /// 9 [DataMember(Order = 9)] public EmployeeWraper UpdatedBy { get; set; } + ///null + /// 10 [DataMember(Order = 10)] public string ThreadTitile { get; set; } @@ -75,11 +89,19 @@ protected ForumTopicWrapper() } + ///0 + /// 30 [DataMember(Order = 30)] public TopicStatus Status { get; set; } + + ///0 + /// 30 [DataMember(Order = 30)] public TopicType Type { get; set; } + ///Tag1,Tag2 + /// 100 + /// 100 [DataMember(Order = 100)] public List Tags { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicWrapperFull.cs b/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicWrapperFull.cs index b10ec93ad..3e303ad74 100644 --- a/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicWrapperFull.cs +++ b/module/ASC.Api/ASC.Api.Community/Forums/ForumTopicWrapperFull.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,9 +25,13 @@ namespace ASC.Api.Forums { + ///ASC.Api.Forums.ForumTopicWrapper, ASC.Api.Community [DataContract(Name = "topic", Namespace = "")] public class ForumTopicWrapperFull : ForumTopicWrapper { + /// ASC.Api.Forums.ForumTopicPostWrapper, ASC.Api.Community + /// 100 + /// list [DataMember(Order = 100)] public List Posts { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Forums/ForumWrapper.cs b/module/ASC.Api/ASC.Api.Community/Forums/ForumWrapper.cs index fe5c8cd13..5ad0df66d 100644 --- a/module/ASC.Api/ASC.Api.Community/Forums/ForumWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Forums/ForumWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,9 @@ namespace ASC.Api.Forums [DataContract(Name = "forum", Namespace = "")] public class ForumWrapper { + ///ASC.Api.Forums.ForumCategoryWrapper, ASC.Api.Community + ///100 + ///list [DataMember(Order = 100)] public List Categories { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Wiki/CommentWrapper.cs b/module/ASC.Api/ASC.Api.Community/Wiki/CommentWrapper.cs index 8543b4350..da0b166f8 100644 --- a/module/ASC.Api/ASC.Api.Community/Wiki/CommentWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Wiki/CommentWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,24 +27,38 @@ namespace ASC.Api.Wiki.Wrappers [DataContract(Name = "comment", Namespace = "")] public class CommentWrapper { + ///00000000-0000-0000-0000-000000000000 + ///0 [DataMember(Order = 0)] public Guid Id { get; set; } + ///00000000-0000-0000-0000-000000000000 + ///1 [DataMember(Order = 1)] public Guid ParentId { get; set; } + ///Some page + ///2 [DataMember(Order = 2)] public string Page { get; set; } + ///Comment content + ///3 [DataMember(Order = 3)] public string Content { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///4 [DataMember(Order = 4)] public EmployeeWraper Author { get; set; } + ///2020-12-08T17:37:03.3304954Z + ///4 [DataMember(Order = 4)] public ApiDateTime LastModified { get; set; } + ///false + ///5 [DataMember(Order = 5)] public bool Inactive { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Wiki/FileWrapper.cs b/module/ASC.Api/ASC.Api.Community/Wiki/FileWrapper.cs index f98a8fb48..f2c4aa45d 100644 --- a/module/ASC.Api/ASC.Api.Community/Wiki/FileWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Wiki/FileWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,18 +27,27 @@ namespace ASC.Api.Wiki.Wrappers [DataContract(Name = "file", Namespace = "")] public class FileWrapper { + ///File name + ///0 [DataMember(Order = 0)] public string Name { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///1 [DataMember(Order = 1)] public EmployeeWraper UpdatedBy { get; set; } + ///2020-12-08T17:37:03.3424957Z + ///2 [DataMember(Order = 2)] public ApiDateTime Updated { get; set; } + ///4\\46\\File name + ///3 [DataMember(Order = 3)] public string Location { get; set; } + public FileWrapper(File file) { Name = file.FileName; diff --git a/module/ASC.Api/ASC.Api.Community/Wiki/PageWrapper.cs b/module/ASC.Api/ASC.Api.Community/Wiki/PageWrapper.cs index 869b004f4..192dfaff4 100644 --- a/module/ASC.Api/ASC.Api.Community/Wiki/PageWrapper.cs +++ b/module/ASC.Api/ASC.Api.Community/Wiki/PageWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,15 +26,23 @@ namespace ASC.Api.Wiki.Wrappers [DataContract(Name = "page", Namespace = "")] public class PageWrapper { + ///Page name + ///0 [DataMember(Order = 0)] public string Name { get; set; } + ///Page content + ///1 [DataMember(Order = 1)] public string Content { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///2 [DataMember(Order = 2)] public EmployeeWraper UpdatedBy { get; set; } + ///2020-12-08T17:37:03.3164965Z + ///3 [DataMember(Order = 3)] public ApiDateTime Updated { get; set; } diff --git a/module/ASC.Api/ASC.Api.Community/Wiki/WikiApi.cs b/module/ASC.Api/ASC.Api.Community/Wiki/WikiApi.cs index 11f84a313..c8364a39b 100644 --- a/module/ASC.Api/ASC.Api.Community/Wiki/WikiApi.cs +++ b/module/ASC.Api/ASC.Api.Community/Wiki/WikiApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,6 +38,7 @@ namespace ASC.Api.Community { + ///community public partial class CommunityApi { private readonly WikiEngine _engine = new WikiEngine(); @@ -46,10 +47,12 @@ public partial class CommunityApi /// Creates a new wiki page with the page name and content specified in the request. /// /// Create a page - /// Page name - /// Page content - /// Page information + /// Page name + /// Page content + /// Page information /// Wiki + /// api/2.0/community/wiki + /// POST [Create("wiki")] public PageWrapper CreatePage(string name, string body) { @@ -57,13 +60,16 @@ public PageWrapper CreatePage(string name, string body) } /// - /// Returns a list of all the pages from wiki or wiki category specified in the request. + /// Returns a list of all the pages from the wiki or wiki category specified in the request. /// /// Get pages ///
    Pages
    - /// Category name - /// Pages + /// Category name + /// Pages /// Wiki + /// api/2.0/community/wiki + /// GET + /// list [Read("wiki")] public IEnumerable GetPages(string category) { @@ -73,14 +79,16 @@ public IEnumerable GetPages(string category) } /// - /// Returns the detailed information about a wiki page with the name and version specified in the request. + /// Returns the detailed information on a wiki page with the name and version specified in the request. /// /// Get a page ///
    Pages
    - /// Page name - /// Page version - /// Page information + /// Page name + /// Page version + /// Page information /// Wiki + /// api/2.0/community/wiki/{name} + /// GET [Read("wiki/{name}")] public PageWrapper GetPage(string name, int? version) { @@ -98,9 +106,12 @@ public PageWrapper GetPage(string name, int? version) /// /// Get the page history ///
    Pages
    - /// Page name - /// List of history changes + /// Page name + /// List of history changes /// Wiki + /// api/2.0/community/wiki/{page}/story + /// GET + /// list [Read("wiki/{page}/story")] public IEnumerable GetHistory(string page) { @@ -112,9 +123,12 @@ public IEnumerable GetHistory(string page) /// /// Search pages by name ///
    Pages
    - /// Search query - /// List of pages + /// Search query + /// List of pages /// Wiki + /// api/2.0/community/wiki/search/byname/{name} + /// GET + /// list [Read("wiki/search/byname/{name}")] public IEnumerable SearchPages(string name) { @@ -126,9 +140,12 @@ public IEnumerable SearchPages(string name) /// /// Search pages by content ///
    Pages
    - /// Search query - /// List of pages + /// Search query + /// List of pages /// Wiki + /// api/2.0/community/wiki/search/bycontent/{content} + /// GET + /// list [Read("wiki/search/bycontent/{content}")] public IEnumerable SearchPagesByContent(string content) { @@ -140,10 +157,12 @@ public IEnumerable SearchPagesByContent(string content) /// /// Update a page ///
    Pages
    - /// New page name - /// New page content - /// Page information + /// New page name + /// New page content + /// Page information /// Wiki + /// api/2.0/community/wiki/{name} + /// PUT [Update("wiki/{name}")] public PageWrapper UpdatePage(string name, string body) { @@ -155,8 +174,11 @@ public PageWrapper UpdatePage(string name, string body) /// /// Delete a page ///
    Pages
    - /// Page name + /// Page name + /// /// Wiki + /// api/2.0/community/wiki/{name} + /// DELETE [Delete("wiki/{name}")] public void DeletePage(string name) { @@ -166,13 +188,15 @@ public void DeletePage(string name) /// /// Creates a comment on the selected wiki page with the content specified in the request. /// - /// Create a wiki comment + /// Create a page comment ///
    Comments
    - /// Page name - /// Comment text - /// Comment parent ID - /// Comment information + /// Page name + /// Comment text + /// Comment parent ID + /// Comment information /// Wiki + /// api/2.0/community/wiki/{page}/comment + /// POST [Create("wiki/{page}/comment")] public CommentWrapper CreateComment(string page, string content, string parentId) { @@ -181,13 +205,16 @@ public CommentWrapper CreateComment(string page, string content, string parentId } /// - /// Returns a list of all the comments to the wiki page with the name specified in the request. + /// Returns a list of all the comments on the wiki page with the name specified in the request. /// - /// Get the page comments + /// Get page comments ///
    Comments
    - /// Page name - /// List of comments + /// Page name + /// List of comments /// Wiki + /// api/2.0/community/wiki/{page}/comment + /// GET + /// list [Read("wiki/{page}/comment")] public List GetComments(string page) { @@ -195,12 +222,15 @@ public List GetComments(string page) } /// - /// Uploads the selected files to the wiki 'Files' section. + /// Uploads the selected files to the wiki page 'Files' section. /// /// Upload files - /// List of files - /// List of files + /// List of files to upload + /// List of files /// Wiki + /// api/2.0/community/wiki/file + /// POST + /// list [Create("wiki/file")] public IEnumerable UploadFiles(IEnumerable files) { @@ -210,13 +240,15 @@ public IEnumerable UploadFiles(IEnumerable - /// Returns the detailed information about a file with the name specified in the request from the wiki 'Files' section. + /// Returns the detailed information about a file with the name specified in the request from the wiki page 'Files' section. /// /// Get a file ///
    Files
    - /// File name - /// File information + /// File name + /// File information /// Wiki + /// api/2.0/community/wiki/file/{name} + /// GET [Read("wiki/file/{name}")] public FileWrapper GetFile(string name) { @@ -224,11 +256,14 @@ public FileWrapper GetFile(string name) } /// - /// Deletes a file with the name specified in the request from the wiki 'Files' section. + /// Deletes a file with the name specified in the request from the wiki page 'Files' section. /// /// Delete a file - /// File name + /// File name + /// /// Wiki + /// api/2.0/community/wiki/file/{name} + /// DELETE [Delete("wiki/file/{name}")] public void DeleteFile(string name) { @@ -240,10 +275,12 @@ public void DeleteFile(string name) /// /// Get a comment preview ///
    Comments
    - /// Comment ID - /// Comment text in the HTML format - /// Comment information + /// Comment ID + /// Comment text in the HTML format + /// Comment information /// Wiki + /// api/2.0/community/wiki/comment/preview + /// POST [Create("wiki/comment/preview")] public CommentInfo GetWikiCommentPreview(string commentid, string htmltext) { @@ -263,9 +300,11 @@ public CommentInfo GetWikiCommentPreview(string commentid, string htmltext) /// /// Remove a comment ///
    Comments
    - /// Comment ID + /// Comment ID /// Comment ID /// Wiki + /// api/2.0/community/wiki/comment/{commentid} + /// DELETE [Delete("wiki/comment/{commentid}")] public string RemoveWikiComment(string commentid) { @@ -280,11 +319,13 @@ public string RemoveWikiComment(string commentid) /// /// Add an entity comment ///
    Comments
    - /// Comment parent ID - /// Entity ID - /// Comment text - /// Comment information /// Wiki + /// Comment parent ID + /// Entity ID + /// Comment text + /// api/2.0/community/wiki/comment + /// POST + /// Comment information [Create("wiki/comment")] public CommentInfo AddWikiComment(string parentcommentid, string entityid, string content) { @@ -302,10 +343,12 @@ public CommentInfo AddWikiComment(string parentcommentid, string entityid, strin /// /// Update a comment ///
    Comments
    - /// Comment ID - /// New comment text + /// Comment ID + /// New comment text /// Updated comment /// Wiki + /// api/2.0/community/wiki/comment/{commentid} + /// PUT [Update("wiki/comment/{commentid}")] public string UpdateWikiComment(string commentid, string content) { diff --git a/module/ASC.Api/ASC.Api.Documents/ASC.Api.Documents.csproj b/module/ASC.Api/ASC.Api.Documents/ASC.Api.Documents.csproj index fbd63f246..cac65b8b1 100644 --- a/module/ASC.Api/ASC.Api.Documents/ASC.Api.Documents.csproj +++ b/module/ASC.Api/ASC.Api.Documents/ASC.Api.Documents.csproj @@ -107,5 +107,8 @@ 13.0.1 + + + \ No newline at end of file diff --git a/module/ASC.Api/ASC.Api.Documents/DocumentsApi.cs b/module/ASC.Api/ASC.Api.Documents/DocumentsApi.cs index a6224af75..b83e64af6 100644 --- a/module/ASC.Api/ASC.Api.Documents/DocumentsApi.cs +++ b/module/ASC.Api/ASC.Api.Documents/DocumentsApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,18 +32,23 @@ using ASC.Api.Exceptions; using ASC.Api.Impl; using ASC.Api.Utils; +using ASC.Common.Caching; using ASC.Core; using ASC.Core.Users; using ASC.FederatedLogin.Helpers; using ASC.FederatedLogin.LoginProviders; using ASC.Files.Core; using ASC.MessagingSystem; +using ASC.Security.Cryptography; +using ASC.Specific.AuthorizationApi; +using ASC.Web.Core; using ASC.Web.Core.Files; using ASC.Web.Files.Classes; using ASC.Web.Files.Core.Compress; using ASC.Web.Files.Core.Entries; using ASC.Web.Files.Helpers; using ASC.Web.Files.HttpHandlers; +using ASC.Web.Files.Resources; using ASC.Web.Files.Services.DocumentService; using ASC.Web.Files.Services.WCFService; using ASC.Web.Files.Services.WCFService.FileOperations; @@ -63,12 +68,15 @@ namespace ASC.Api.Documents /// /// Provides access to documents. /// + /// files public class DocumentsApi : Interfaces.IApiEntryPoint { + private static readonly ICache _cache = AscCache.Memory; private readonly ApiContext _context; private readonly IFileStorageService _fileStorageService; /// + /// Api name entry /// public string Name { @@ -76,6 +84,7 @@ public string Name } /// + /// Constructor /// /// /// @@ -89,15 +98,18 @@ public DocumentsApi(ApiContext context, IFileStorageService fileStorageService) /// /// Returns all the sections matching the parameters specified in the request. /// - /// Get sections - /// User or group ID - /// Filter type - /// Search in content files - /// Root folders with or without subfolders - /// Root folders with or without trash - /// Root folders with or without additional folders + /// Get filtered sections + /// User or group ID + /// Filter type + /// Specifies whether to search within the section contents or not + /// Specifies whether to return sections with or without subfolders + /// Specifies whether to return sections with or without trash folder + /// Specifies whether to return sections with or without additional folders /// Folders - /// Sections + /// Contents of the sections + /// api/2.0/files/@root + /// GET + /// list [Read("@root")] public IEnumerable GetRootFolders(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders, bool withoutTrash, bool withoutAdditionalFolder) { @@ -168,13 +180,15 @@ public IEnumerable GetRootFolders(Guid userIdOrGroupId, Fi /// /// Returns the detailed list of files and folders located in the "My documents" section. /// - /// Get my section + /// Get the "My documents" section /// Folders - /// User or group ID - /// Filter type - /// Search in content files - /// Root folders with or without subfolders - /// My documents section contents + /// User or group ID + /// Filter type + /// Specifies whether to search within the section contents or not + /// Specifies whether to return sections with or without subfolders + /// The "My documents" section contents + /// api/2.0/files/@my + /// GET [Read("@my")] public FolderContentWrapper GetMyFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) { @@ -182,15 +196,17 @@ public FolderContentWrapper GetMyFolder(Guid userIdOrGroupId, FilterType filterT } /// - /// Returns the detailed list of files and folders located in the "Projects" section. + /// Returns the detailed list of files and folders located in the "In projects" section. /// - /// Get project section + /// Get the "In projects" section /// Folders - /// User or group ID - /// Filter type - /// Search in content files - /// Root folders with or without subfolders - /// Project section contents + /// User or group ID + /// Filter type + /// Specifies whether to search within the section contents or not + /// Specifies whether to return sections with or without subfolders + /// The "In projects" section contents + /// api/2.0/files/@projects + /// GET [Read("@projects")] public FolderContentWrapper GetProjectsFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) { @@ -201,13 +217,15 @@ public FolderContentWrapper GetProjectsFolder(Guid userIdOrGroupId, FilterType f /// /// Returns the detailed list of files and folders located in the "Common" section. /// - /// Get common section + /// Get the "Common" section /// Folders - /// User or group ID - /// Filter type - /// Search in content files - /// Root folders with or without subfolders - /// Common section contents + /// User or group ID + /// Filter type + /// Specifies whether to search within the section contents or not + /// Specifies whether to return sections with or without subfolders + /// The "Common" section contents + /// api/2.0/files/@common + /// GET [Read("@common")] public FolderContentWrapper GetCommonFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) { @@ -215,15 +233,17 @@ public FolderContentWrapper GetCommonFolder(Guid userIdOrGroupId, FilterType fil } /// - /// Returns the detailed list of files and folders located in the "Shared with Me" section. + /// Returns the detailed list of files and folders located in the "Shared with me" section. /// - /// Get shared section + /// Get the "Shared with me" section /// Folders - /// User or group ID - /// Filter type - /// Search in content files - /// Root folders with or without subfolders - /// Shared section contents + /// User or group ID + /// Filter type + /// Specifies whether to search within the section contents or not + /// Specifies whether to return sections with or without subfolders + /// The "Shared with me" section contents + /// api/2.0/files/@share + /// GET [Read("@share")] public FolderContentWrapper GetShareFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) { @@ -233,13 +253,15 @@ public FolderContentWrapper GetShareFolder(Guid userIdOrGroupId, FilterType filt /// /// Returns the detailed list of files located in the "Recent" section. /// - /// Get recent section + /// Get the "Recent" section /// Folders - /// User or group ID - /// Filter type - /// Search in content files - /// Root folders with or without subfolders - /// Recent section contents + /// User or group ID + /// Filter type + /// Specifies whether to search within the section contents or not + /// Specifies whether to return sections with or without subfolders + /// The "Recent" section contents + /// api/2.0/files/@recent + /// GET [Read("@recent")] public FolderContentWrapper GetRecentFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) { @@ -247,15 +269,17 @@ public FolderContentWrapper GetRecentFolder(Guid userIdOrGroupId, FilterType fil } /// - /// Returns the detailed list of files located in the "Favorites" section. + /// Returns the detailed list of files and folders located in the "Favorites" section. /// - /// Get favorite section + /// Get the "Favorites" section /// Folders - /// User or group ID - /// Filter type - /// Search in content files - /// Root folders with or without subfolders - /// Favorite section contents + /// User or group ID + /// Filter type + /// Specifies whether to search within the section contents or not + /// Specifies whether to return sections with or without subfolders + /// The "Favorites" section contents + /// api/2.0/files/@favorites + /// GET [Read("@favorites")] public FolderContentWrapper GetFavoritesFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) { @@ -265,13 +289,15 @@ public FolderContentWrapper GetFavoritesFolder(Guid userIdOrGroupId, FilterType /// /// Returns the detailed list of files located in the "Templates" section. /// - /// Get template section + /// Get the "Templates" section /// Folders - /// User or group ID - /// Filter type - /// Search in content files - /// Root folders with or without subfolders - /// Template section contents + /// User or group ID + /// Filter type + /// Specifies whether to search within the section contents or not + /// Specifies whether to return sections with or without subfolders + /// The "Templates" section contents + /// api/2.0/files/@templates + /// GET [Read("@templates")] public FolderContentWrapper GetTemplatesFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) { @@ -281,13 +307,15 @@ public FolderContentWrapper GetTemplatesFolder(Guid userIdOrGroupId, FilterType /// /// Returns the detailed list of files and folders located in the "Trash" section. /// - /// Get trash section + /// Get the "Trash" section /// Folders - /// User or group ID - /// Filter type - /// Search in content files - /// Root folders with or without subfolders - /// Trash section contents + /// User or group ID + /// Filter type + /// Specifies whether to search within the section contents or not + /// Specifies whether to return sections with or without subfolders + /// The "Trash" section contents + /// api/2.0/files/@trash + /// GET [Read("@trash")] public FolderContentWrapper GetTrashFolder(Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) { @@ -301,12 +329,14 @@ public FolderContentWrapper GetTrashFolder(Guid userIdOrGroupId, FilterType filt /// Get a folder by ID /// /// Folders - /// Folder ID - /// User or group ID - /// Filter type - /// Search in content files - /// Root folders with or without subfolders - /// Folder contents + /// Folder ID + /// User or group ID + /// Filter type + /// Specifies whether to search within the section contents or not + /// Specifies whether to return sections with or without subfolders + /// Folder contents + /// api/2.0/files/{folderId} + /// GET [Read("{folderId}")] public FolderContentWrapper GetFolder(String folderId, Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) { @@ -317,21 +347,23 @@ public FolderContentWrapper GetFolder(String folderId, Guid userIdOrGroupId, Fil /// /// Uploads a file specified in the request to the "My documents" section by single file uploading or standart multipart/form-data method. /// - /// Upload a file to my section - /// Uploads - /// Request input stream - /// Content-Type header - /// Content-Disposition header - /// List of files when posted as multipart/form-data + /// Upload a file to the "My documents" section + /// Folders + /// Request input stream + /// Content-Type header + /// Content-Disposition header + /// List of files when specified as multipart/form-data /// /// - ///
  • Using single file upload. You should set the Content-Type & Content-Disposition headers to specify the file name and content type, and send the file to the request body.
  • + ///
  • Using single file upload. You should set the Content-Type and Content-Disposition headers to specify a file name and content type, and send the file to the request body.
  • ///
  • Using standart multipart/form-data method.
  • /// ]]> ///
    - /// Uploaded file + /// Uploaded file(s) + /// api/2.0/files/@my/upload + /// POST [Create("@my/upload")] public object UploadFileToMy(Stream file, ContentType contentType, ContentDisposition contentDisposition, IEnumerable files) { @@ -341,21 +373,23 @@ public object UploadFileToMy(Stream file, ContentType contentType, ContentDispos /// /// Uploads a file specified in the request to the "Common" section by single file uploading or standart multipart/form-data method. /// - /// Upload a file to the common section - /// Uploads - /// Request input stream - /// Content-Type header - /// Content-Disposition header - /// List of files when posted as multipart/form-data + /// Upload a file to the "Common" section + /// Folders + /// Request input stream + /// Content-Type header + /// Content-Disposition header + /// List of files when specified as multipart/form-data /// /// - ///
  • Using single file upload. You should set the Content-Type & Content-Disposition headers to specify the file name and content type, and send the file to the request body.
  • + ///
  • Using single file upload. You should set the Content-Type and Content-Disposition headers to specify a file name and content type, and send the file to the request body.
  • ///
  • Using standart multipart/form-data method.
  • /// ]]> ///
    - /// Uploaded file + /// Uploaded file(s) + /// api/2.0/files/@common/upload + /// POST [Create("@common/upload")] public object UploadFileToCommon(Stream file, ContentType contentType, ContentDisposition contentDisposition, IEnumerable files) { @@ -367,24 +401,26 @@ public object UploadFileToCommon(Stream file, ContentType contentType, ContentDi /// Uploads a file specified in the request to the selected folder by single file uploading or standart multipart/form-data method. /// /// Upload a file - /// Uploads + /// Folders /// /// - ///
  • Using single file upload. You should set the Content-Type & Content-Disposition headers to specify the file name and content type, and send the file to the request body.
  • + ///
  • Using single file upload. You should set the Content-Type and Content-Disposition headers to specify a file name and content type, and send the file to the request body.
  • ///
  • Using standart multipart/form-data method.
  • /// ]]> ///
    - /// Folder ID - /// Request input stream - /// Content-Type header - /// Content-Disposition header - /// List of files when posted as multipart/form-data - /// Creates a new file if it already exists or not - /// If true, uploads documents in the original formats as well - /// Keeps converting status after finishing or not - /// Uploaded file + /// Folder ID + /// Request input stream + /// Content-Type header + /// Content-Disposition header + /// List of files when specified as multipart/form-data + /// Specifies whether to create a new file if it already exists or not + /// Specifies whether to upload documents in the original formats as well or not + /// Specifies whether to keep the file converting status or not + /// Uploaded file(s) + /// api/2.0/files/{folderId}/upload + /// POST [Create("{folderId}/upload")] public object UploadFile(string folderId, Stream file, ContentType contentType, ContentDisposition contentDisposition, IEnumerable files, bool? createNewIfExist, bool? storeOriginalFileFlag, bool keepConvertStatus = false) { @@ -420,13 +456,15 @@ public object UploadFile(string folderId, Stream file, ContentType contentType, /// /// Inserts a file specified in the request to the "My documents" section by single file uploading. /// - /// Insert a file to my section - /// Request input stream - /// File name - /// Creates a new file if it already exists or not - /// Keeps converting status after finishing or not - /// Uploads - /// Inserted file + /// Insert a file to the "My documents" section + /// Request input stream + /// File name + /// Specifies whether to create a new file if it already exists or not + /// Specifies whether to keep the file converting status or not + /// Folders + /// Inserted file + /// api/2.0/files/@my/insert + /// POST [Create("@my/insert")] public FileWrapper InsertFileToMy(Stream file, string title, bool? createNewIfExist, bool keepConvertStatus = false) { @@ -436,13 +474,15 @@ public FileWrapper InsertFileToMy(Stream file, string title, bool? createNewIfEx /// /// Inserts a file specified in the request to the "Common" section by single file uploading. /// - /// Insert a file to the common section - /// Request input stream - /// File name - /// Creates a new file if it already exists or not - /// Keeps converting status after finishing or not - /// Uploads - /// Inserted file + /// Insert a file to the "Common" section + /// Request input stream + /// File name + /// Specifies whether to create a new file if it already exists or not + /// Specifies whether to keep the file converting status or not + /// Folders + /// Inserted file + /// api/2.0/files/@common/insert + /// POST [Create("@common/insert")] public FileWrapper InsertFileToCommon(Stream file, string title, bool? createNewIfExist, bool keepConvertStatus = false) { @@ -453,13 +493,15 @@ public FileWrapper InsertFileToCommon(Stream file, string title, bool? createNew /// Inserts a file specified in the request to the selected folder by single file uploading. /// /// Insert a file - /// Folder ID - /// Request input stream - /// File name - /// Creates a new file if it already exists or not - /// Keeps converting status after finishing or not - /// Uploads - /// Inserted file + /// Folder ID + /// Request input stream + /// File name + /// Specifies whether to create a new file if it already exists or not + /// Specifies whether to keep the file converting status or not + /// Folders + /// Inserted file + /// api/2.0/files/{folderId}/insert + /// POST [Create("{folderId}/insert")] public FileWrapper InsertFile(string folderId, Stream file, string title, bool? createNewIfExist, bool keepConvertStatus = false) { @@ -483,12 +525,14 @@ public FileWrapper InsertFile(string folderId, Stream file, string title, bool? /// /// Update file content /// Files - /// File stream - /// File ID - /// File extension - /// Encrypts a file or not - /// Forcibly saves a file or not - /// Updated file + /// Request input stream + /// File ID + /// File extension + /// Specifies whether to encrypt a file or not + /// Specifies whether to force save a file or not + /// api/2.0/files/{fileId}/update + /// PUT + /// Updated file [Update("{fileId}/update")] public FileWrapper UpdateFileStream(Stream file, string fileId, string fileExtension, bool encrypted = false, bool forcesave = false) { @@ -505,17 +549,19 @@ public FileWrapper UpdateFileStream(Stream file, string fileId, string fileExten /// - /// Saves editing of a file with the ID specified in the request. + /// Saves edits to a file with the ID specified in the request. /// - /// Save editing - /// File ID - /// File extension - /// URI for downloading - /// File stream - /// Shared token - /// Forcibly saves a file or not + /// Save file edits + /// File ID + /// File extension + /// URI to download a file + /// Request file stream + /// Shared token + /// Specifies whether to force save a file or not /// Files - /// Saved file + /// Saved file + /// api/2.0/files/file/{fileId}/saveediting + /// PUT [Update("file/{fileId}/saveediting")] public FileWrapper SaveEditing(String fileId, string fileExtension, string downloadUri, Stream stream, String doc, bool forcesave) { @@ -523,14 +569,16 @@ public FileWrapper SaveEditing(String fileId, string fileExtension, string downl } /// - /// Informs about opening a file with the ID specified in the request for editing locking it from deletion or movement (this method is called by the mobile editors). + /// Informs about opening a file with the ID specified in the request for editing, locking it from being deleted or moved (this method is called by the mobile editors). /// - /// Start editing - /// File ID - /// Shares a file with other users for editing or not - /// Shared token + /// Start file editing + /// File ID + /// Specifies whether to share a file with other users for editing or not + /// Shared token /// Files /// File key for Document Service + /// api/2.0/files/file/{fileId}/startedit + /// POST [Create("file/{fileId}/startedit")] public string StartEdit(String fileId, bool editingAlone, String doc) { @@ -540,14 +588,16 @@ public string StartEdit(String fileId, bool editingAlone, String doc) /// /// Tracks file changes when editing. /// - /// Track editing - /// File ID - /// Tab ID - /// Document key for tracking - /// Shared token - /// Finishes file editing or not + /// Track file editing + /// File ID + /// Tab ID + /// Document key for tracking + /// Shared token + /// Specifies whether to finish file tracking or not /// Files /// File changes + /// api/2.0/files/file/{fileId}/trackeditfile + /// GET [Read("file/{fileId}/trackeditfile")] public KeyValuePair TrackEditFile(String fileId, Guid tabId, String docKeyForTrack, String doc, bool isFinish) { @@ -555,14 +605,17 @@ public KeyValuePair TrackEditFile(String fileId, Guid tabId, Strin } /// - /// Returns the initialization configuration to open the editor. + /// Returns the initialization configuration of a file to open it in the editor. /// - /// Open the editor - /// File ID - /// File version - /// Shared token + /// Open a file + /// File ID + /// File version + /// Shared token /// Files - /// Configuration + /// Configuration + /// api/2.0/files/file/{fileId}/openedit + /// false + /// GET [Read("file/{fileId}/openedit", false)] // NOTE: This method doesn't require auth!!! public Configuration OpenEdit(String fileId, int version, String doc) { @@ -600,12 +653,12 @@ public Configuration OpenEdit(String fileId, int version, String doc) /// Creates a session to upload large files in multiple chunks to the folder with the ID specified in the request. /// /// Chunked upload - /// Uploads - /// Folder ID - /// File name - /// File length in bytes - /// Folder which is relative to the selected folder - /// Encrypts a file or not + /// Operations + /// Folder ID + /// File name + /// File length in bytes + /// Relative path to the folder + /// Specifies whether to encrypt a file or not /// /// 512 and greater or equal to 10 mb. Last chunk can have any size. @@ -628,12 +681,29 @@ public Configuration OpenEdit(String fileId, int version, String doc) /// /// ]]> /// - [Create("{folderId}/upload/create_session")] + /// api/2.0/files/{folderId}/upload/create_session + /// POST + /// false + [Create("{folderId}/upload/create_session", false)] // NOTE: This method doesn't require auth!!! public object CreateUploadSession(string folderId, string fileName, long fileSize, string relativePath, bool encrypted) { + string link = null; + + if (!SecurityContext.IsAuthenticated) + { + if (Web.Files.Utils.FileShareLink.TryGetCurrentLinkId(out var linkId)) + { + link = linkId.ToString(); + } + else + { + throw new System.Security.SecurityException(FilesCommonResource.ErrorMassage_SecurityException); + } + } + var file = FileUploader.VerifyChunkedUpload(folderId, fileName, fileSize, FilesSettings.UpdateIfExist, relativePath); - return CreateUploadSession(file, encrypted); + return CreateUploadSession(file, encrypted, link); } /// @@ -641,23 +711,25 @@ public object CreateUploadSession(string folderId, string fileName, long fileSiz /// /// Create the editing session /// Files - /// File ID - /// File size in bytes + /// File ID + /// File size in bytes /// Upload session + /// api/2.0/files/file/{fileId}/edit_session + /// POST /// false [Create("file/{fileId}/edit_session")] public object CreateEditSession(object fileId, long fileSize) { var file = FileUploader.VerifyChunkedUploadForEditing(fileId, fileSize); - return CreateUploadSession(file, false, true); + return CreateUploadSession(file, false, null, true); } - private object CreateUploadSession(Files.Core.File file, bool encrypted, bool keepVersion = false) + private object CreateUploadSession(Files.Core.File file, bool encrypted, string linkId, bool keepVersion = false) { if (FilesLinkUtility.IsLocalFileUploader) { - var session = FileUploader.InitiateUpload(file.FolderID.ToString(), (file.ID ?? "").ToString(), file.Title, file.ContentLength, encrypted, keepVersion); + var session = FileUploader.InitiateUpload(file.FolderID.ToString(), (file.ID ?? "").ToString(), file.Title, file.ContentLength, encrypted, linkId, keepVersion); var response = ChunkedUploaderHandler.ToResponseObject(session, true); return new @@ -667,7 +739,7 @@ private object CreateUploadSession(Files.Core.File file, bool encrypted, bool ke }; } - var createSessionUrl = FilesLinkUtility.GetInitiateUploadSessionUrl(file.FolderID, file.ID, file.Title, file.ContentLength, encrypted); + var createSessionUrl = FilesLinkUtility.GetInitiateUploadSessionUrl(file.FolderID, file.ID, file.Title, file.ContentLength, encrypted, linkId); var request = (HttpWebRequest)WebRequest.Create(createSessionUrl); request.Method = "POST"; request.ContentLength = 0; @@ -685,6 +757,16 @@ private object CreateUploadSession(Files.Core.File file, bool encrypted, bool ke ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true; } + if (!string.IsNullOrEmpty(linkId)) + { + var cookies = CookiesManager.GetCookies(CookiesType.ShareLink, linkId); + if (!string.IsNullOrEmpty(cookies)) + { + var name = CookiesManager.GetCookiesName(CookiesType.ShareLink, linkId); + request.Headers[name] = cookies; + } + } + using (var response = request.GetResponse()) using (var responseStream = response.GetResponseStream()) { @@ -695,11 +777,13 @@ private object CreateUploadSession(Files.Core.File file, bool encrypted, bool ke /// /// Creates a text (.txt) file in the "My documents" section with the title and contents specified in the request. /// - /// Create a txt file in my section + /// Create a txt file in the "My documents" section /// Files - /// File title - /// File contents - /// Folder contents + /// File title + /// File contents + /// File contents + /// api/2.0/files/@my/text + /// POST /// false [Create("@my/text")] public FileWrapper CreateTextFileInMy(string title, string content) @@ -710,11 +794,13 @@ public FileWrapper CreateTextFileInMy(string title, string content) /// /// Creates a text (.txt) file in the "Common" section with the title and contents specified in the request. /// - /// Create a txt file in the common section + /// Create a txt file in the "Common" section /// Files - /// File title - /// File contents - /// Folder contents + /// File title + /// File contents + /// File contents + /// api/2.0/files/@common/text + /// POST /// false [Create("@common/text")] public FileWrapper CreateTextFileInCommon(string title, string content) @@ -727,10 +813,12 @@ public FileWrapper CreateTextFileInCommon(string title, string content) /// /// Create a txt file /// Files - /// Folder ID - /// File title - /// File contents - /// Folder contents + /// Folder ID + /// File title + /// File contents + /// File contents + /// api/2.0/files/{folderId}/text + /// POST /// false [Create("{folderId}/text")] public FileWrapper CreateTextFile(string folderId, string title, string content) @@ -760,14 +848,16 @@ private static FileWrapper CreateFile(string folderId, string title, string cont } /// - /// Creates an html (.html) file in the selected folder with the title and contents specified in the request. + /// Creates an HTML (.html) file in the selected folder with the title and contents specified in the request. /// - /// Create an html file + /// Create an HTML file /// Files - /// Folder ID - /// File title - /// File contents - /// Folder contents + /// Folder ID + /// File title + /// File contents + /// File contents + /// api/2.0/files/{folderId}/html + /// POST /// false [Create("{folderId}/html")] public FileWrapper CreateHtmlFile(string folderId, string title, string content) @@ -777,13 +867,15 @@ public FileWrapper CreateHtmlFile(string folderId, string title, string content) } /// - /// Creates an html (.html) file in the "My documents" section with the title and contents specified in the request. + /// Creates an HTML (.html) file in the "My documents" section with the title and contents specified in the request. /// - /// Create an html file in my section + /// Create an HTML file in the "My documents" section /// Files - /// File title - /// File contents - /// Folder contents + /// File title + /// File contents + /// File contents + /// api/2.0/files/@my/html + /// POST /// false [Create("@my/html")] public FileWrapper CreateHtmlFileInMy(string title, string content) @@ -793,13 +885,15 @@ public FileWrapper CreateHtmlFileInMy(string title, string content) /// - /// Creates an html (.html) file in the common section with the title and contents specified in the request. + /// Creates an HTML (.html) file in the "Common" section with the title and contents specified in the request. /// - /// Create an html file in the common section + /// Create an HTML file in the "Common" section /// Files - /// File title - /// File contents - /// Folder contents + /// File title + /// File contents + /// File contents + /// api/2.0/files/@common/html + /// POST /// false [Create("@common/html")] public FileWrapper CreateHtmlFileInCommon(string title, string content) @@ -815,9 +909,11 @@ public FileWrapper CreateHtmlFileInCommon(string title, string content) /// Create a folder /// /// Folders - /// Parent folder ID - /// Folder title - /// New folder contents + /// Parent folder ID + /// Folder title + /// New folder contents + /// api/2.0/files/folder/{folderId} + /// POST [Create("folder/{folderId}")] public FolderWrapper CreateFolder(string folderId, string title) { @@ -825,14 +921,37 @@ public FolderWrapper CreateFolder(string folderId, string title) return new FolderWrapper(folder); } + + /// + /// Creates a new folder structure specified in the request in a folder with a specific ID. + /// + /// + /// Create a folder structure + /// + /// Folders + /// Parent folder ID + /// Relative paths to create a folder structure + /// Main folder contents + /// api/2.0/files/folders/{folderId} + /// POST + [Create("folders/{folderId}", false)] // NOTE: This method doesn't require auth!!! + public Folder CreateFolders(string folderId, IEnumerable relativePaths) + { + var folder = _fileStorageService.CreateNewFolders(folderId, relativePaths); + return folder; + } + + /// /// Creates a new file in the "My documents" section with the title specified in the request. /// - /// Create a file in my section + /// Create a file in the "My documents" section /// Files - /// File title - /// In case an extension for the file title differs from DOCX/XLSX/PPTX and belongs to one of the known text, spreadsheet or presentation formats, it will be changed to DOCX/XLSX/PPTX accordingly. If the file extension is not set or is unknown, the DOCX extension will be added to the file title. - /// New file information + /// File title + /// If a file extension is different from DOCX/XLSX/PPTX and refers to one of the known text, spreadsheet or presentation formats, it will be changed to DOCX/XLSX/PPTX accordingly. If the file extension is not specified or is unknown, the DOCX extension will be added to the file title. + /// New file information + /// api/2.0/files/@my/file + /// POST [Create("@my/file")] public FileWrapper CreateFile(string title) { @@ -844,12 +963,14 @@ public FileWrapper CreateFile(string title) /// /// Create a file /// Files - /// Folder ID - /// File title - /// Template file ID - /// The ability to create files of any extension - /// In case an extension for the file title differs from DOCX/XLSX/PPTX and belongs to one of the known text, spreadsheet or presentation formats, it will be changed to DOCX/XLSX/PPTX accordingly. If the file extension is not set or is unknown, the DOCX extension will be added to the file title. - /// New file information + /// Folder ID + /// File title + /// Template file ID + /// Specifies whether to allow the creation of external extension files or not + /// If a file extension is different from DOCX/XLSX/PPTX and refers to one of the known text, spreadsheet or presentation formats, it will be changed to DOCX/XLSX/PPTX accordingly. If the file extension is not specified or is unknown, the DOCX extension will be added to the file title. + /// New file information + /// api/2.0/files/{folderId}/file + /// POST [Create("{folderId}/file")] public FileWrapper CreateFile(string folderId, string title, string templateId, bool enableExternalExt) { @@ -864,9 +985,11 @@ public FileWrapper CreateFile(string folderId, string title, string templateId, /// Rename a folder /// /// Folders - /// Folder ID - /// New title - /// Folder contents + /// Folder ID + /// New folder title + /// Folder contents + /// api/2.0/files/folder/{folderId} + /// PUT [Update("folder/{folderId}")] public FolderWrapper RenameFolder(string folderId, string title) { @@ -878,9 +1001,11 @@ public FolderWrapper RenameFolder(string folderId, string title) /// Returns the detailed information about a folder with the ID specified in the request. /// /// Get the folder information - /// Folder ID + /// Folder ID /// Folders - /// Folder information + /// Folder information + /// api/2.0/files/folder/{folderId} + /// GET [Read("folder/{folderId}")] public FolderWrapper GetFolderInfo(string folderId) { @@ -893,9 +1018,12 @@ public FolderWrapper GetFolderInfo(string folderId) /// Returns a path to the folder with the ID specified in the request. /// /// Get the folder path - /// Folder ID + /// Folder ID /// Folders - /// Folder path + /// Folder path + /// api/2.0/files/folder/{folderId}/path + /// GET + /// list [Read("folder/{folderId}/path")] public IEnumerable GetFolderPath(string folderId) { @@ -906,10 +1034,12 @@ public IEnumerable GetFolderPath(string folderId) /// Returns the detailed information about a file with the ID specified in the request. /// /// Get the file information - /// File ID - /// File version + /// File ID + /// File version /// Files - /// File information + /// File information + /// api/2.0/files/file/{fileId} + /// GET [Read("file/{fileId}")] public FileWrapper GetFileInfo(string fileId, int version = -1) { @@ -918,15 +1048,18 @@ public FileWrapper GetFileInfo(string fileId, int version = -1) } /// - /// Copies (and converts, if possible) an existing file to a new file. + /// Copies (and converts if possible) an existing file to the specified folder. /// - /// Copy file + /// Copy a file /// Files - /// File ID - /// Destination folder ID - /// Destination file Title - /// - [Create("file/{fileId}/copyas")] + /// File ID + /// Destination folder ID + /// Destination file title + /// Copied file + /// api/2.0/files/file/{fileId}/copyas + /// POST + /// false + [Create("file/{fileId}/copyas", false)] // NOTE: This method doesn't require auth!!! public FileWrapper CopyFileAs(string fileId, string destFolderId, string destTitle) { var file = _fileStorageService.GetFile(fileId, -1); @@ -949,10 +1082,12 @@ public FileWrapper CopyFileAs(string fileId, string destFolderId, string destTit /// /// Update a file /// Files - /// File ID - /// New file title - /// File last version number - /// File information + /// File ID + /// New file title + /// Number of the latest file version + /// File information + /// api/2.0/files/file/{fileId} + /// PUT [Update("file/{fileId}")] public FileWrapper UpdateFile(String fileId, String title, int lastVersion) { @@ -969,11 +1104,14 @@ public FileWrapper UpdateFile(String fileId, String title, int lastVersion) /// Deletes a file with the ID specified in the request. /// /// Delete a file - /// Operations - /// File ID - /// Deletes after finished - /// Doesn't move a file to the recycle bin - /// Operation result + /// Files + /// File ID + /// Specifies whether to delete a file after the editing session is finished or not + /// Specifies whether to move a file to the "Trash" folder or delete it immediately + /// List of file operations + /// api/2.0/files/file/{fileId} + /// DELETE + /// list [Delete("file/{fileId}")] public IEnumerable DeleteFile(String fileId, bool deleteAfter, bool immediately) { @@ -983,10 +1121,13 @@ public IEnumerable DeleteFile(String fileId, bool deleteAft /// /// Starts a conversion operation of a file with the ID specified in the request. /// - /// Start file converting + /// Start file conversion /// Operations - /// File ID - /// Operation result + /// File ID + /// Operation result + /// api/2.0/files/file/{fileId}/checkconversion + /// PUT + /// list [Update("file/{fileId}/checkconversion")] public IEnumerable StartConversion(String fileId) { @@ -994,13 +1135,16 @@ public IEnumerable StartConversion(String fileId) } /// - /// Checks a status of converting a file with the ID specified in the request. + /// Checks the conversion status of a file with the ID specified in the request. /// - /// Get converting status + /// Get conversion status /// Operations - /// File ID - /// Starts a conversion operation or not - /// Operation result + /// File ID + /// Specifies if a conversion operation is started or not + /// Operation result + /// api/2.0/files/file/{fileId}/checkconversion + /// GET + /// list [Read("file/{fileId}/checkconversion")] public IEnumerable CheckConversion(String fileId, bool start) { @@ -1033,8 +1177,10 @@ public IEnumerable CheckConversion(String fileId, bool start /// /// Get file download link /// Files - /// File ID + /// File ID /// File download link + /// api/2.0/files/file/{fileId}/presigneduri + /// GET [Read("file/{fileId}/presigneduri")] public string GetPresignedUri(String fileId) { @@ -1046,11 +1192,14 @@ public string GetPresignedUri(String fileId) /// Deletes a folder with the ID specified in the request. /// /// Delete a folder - /// Operations - /// Folder ID - /// Deletes after finished - /// Doesn't move a folder to the recycle bin - /// Operation result + /// Folders + /// Folder ID + /// Specifies whether to delete a folder after the editing session is finished or not + /// Specifies whether to move a folder to the "Trash" folder or delete it immediately + /// List of file operations + /// api/2.0/files/folder/{folderId} + /// DELETE + /// list [Delete("folder/{folderId}")] public IEnumerable DeleteFolder(String folderId, bool deleteAfter, bool immediately) { @@ -1062,10 +1211,13 @@ public IEnumerable DeleteFolder(String folderId, bool delet /// /// Check files and folders for conflicts /// Operations - /// Destination folder ID - /// List of folder IDs - /// List of file IDs - /// Conflict file IDs + /// Destination folder ID + /// List of folder IDs + /// List of file IDs + /// IDs of files with conflicts + /// api/2.0/files/fileops/move + /// GET + /// list [Read("fileops/move")] public IEnumerable MoveOrCopyBatchCheck(String destFolderId, IEnumerable folderIds, IEnumerable fileIds) { @@ -1085,12 +1237,15 @@ public IEnumerable MoveOrCopyBatchCheck(String destFolderId, IEnume /// /// Move to a folder /// Operations - /// Destination folder ID - /// List of folder IDs - /// List of file IDs - /// Overwriting behavior: skip (0), overwrite (1) or duplicate (2) - /// Deletes after finished - /// Operation result + /// Destination folder ID + /// List of folder IDs + /// List of file IDs + /// Overwriting behavior: skip (0), overwrite (1) or duplicate (2) + /// Specifies whether to delete a folder after the editing session is finished or not + /// List of file operations + /// api/2.0/files/fileops/move + /// PUT + /// list [Update("fileops/move")] public IEnumerable MoveBatchItems(String destFolderId, IEnumerable folderIds, IEnumerable fileIds, FileConflictResolveType conflictResolveType, bool deleteAfter) { @@ -1107,12 +1262,15 @@ public IEnumerable MoveBatchItems(String destFolderId, IEnu /// /// Copy to a folder /// Operations - /// Destination folder ID - /// List of folder IDs - /// List of file IDs - /// Overwriting behavior: skip (0), overwrite (1) or duplicate (2) - /// Deletes after finished - /// Operation result + /// Destination folder ID + /// List of folder IDs + /// List of file IDs + /// Overwriting behavior: skip (0), overwrite (1) or duplicate (2) + /// Specifies whether to delete a folder after the editing session is finished or not + /// List of file operations + /// api/2.0/files/fileops/copy + /// PUT + /// list [Update("fileops/copy")] public IEnumerable CopyBatchItems(String destFolderId, IEnumerable folderIds, IEnumerable fileIds, FileConflictResolveType conflictResolveType, bool deleteAfter) { @@ -1129,9 +1287,12 @@ public IEnumerable CopyBatchItems(String destFolderId, IEnu /// /// Mark as read /// Operations - /// List of folder IDs - /// List of file IDs - /// Operation result + /// List of folder IDs + /// List of file IDs + /// List of file operations + /// api/2.0/files/fileops/markasread + /// PUT + /// list [Update("fileops/markasread")] public IEnumerable MarkAsRead(IEnumerable folderIds, IEnumerable fileIds) { @@ -1146,9 +1307,12 @@ public IEnumerable MarkAsRead(IEnumerable folderIds /// /// Finishes all the active operations. /// - /// Finish all operations + /// Finish active operations /// Operations - /// Operation result + /// List of file operations + /// api/2.0/files/fileops/terminate + /// PUT + /// list [Update("fileops/terminate")] public IEnumerable TerminateTasks() { @@ -1159,9 +1323,12 @@ public IEnumerable TerminateTasks() /// /// Returns a list of all the active operations. /// - /// Get operations + /// Get active operations /// Operations - /// Operation result + /// List of file operations + /// api/2.0/files/fileops + /// GET + /// list [Read("fileops")] public IEnumerable GetOperationStatuses() { @@ -1172,11 +1339,14 @@ public IEnumerable GetOperationStatuses() /// Starts the download process of files and folders with the IDs specified in the request. /// /// Bulk download - /// List of file IDs which will be converted - /// List of file IDs - /// List of folder IDs + /// List of file IDs which will be converted + /// List of file IDs + /// List of folder IDs /// Operations - /// Operation result + /// List of file operations + /// api/2.0/files/fileops/bulkdownload + /// PUT + /// list [Update("fileops/bulkdownload")] public IEnumerable BulkDownload( IEnumerable> fileConvertIds, @@ -1206,13 +1376,16 @@ public IEnumerable BulkDownload( /// /// Deletes the files and folders with the IDs specified in the request. /// - /// List of folder IDs - /// List of file IDs - /// Deletes after finished - /// Doesn't move the files and folders to the recycle bin + /// List of folder IDs + /// List of file IDs + /// Specifies whether to delete a file after the editing session is finished or not + /// Specifies whether to move a file to the "Trash" folder or delete it immediately /// Delete files and folders /// Operations - /// Operation result + /// List of file operations + /// api/2.0/files/fileops/delete + /// PUT + /// list [Update("fileops/delete")] public IEnumerable DeleteBatchItems(IEnumerable folderIds, IEnumerable fileIds, bool deleteAfter, bool immediately) { @@ -1225,11 +1398,14 @@ public IEnumerable DeleteBatchItems(IEnumerable fol } /// - /// Deletes all the files and folders from the recycle bin. + /// Deletes all the files and folders from the "Trash" folder. /// - /// Clear recycle bin + /// Empty the "Trash" folder /// Operations - /// Operation result + /// List of file operations + /// api/2.0/files/fileops/emptytrash + /// PUT + /// list [Update("fileops/emptytrash")] public IEnumerable EmptyTrash() { @@ -1241,8 +1417,11 @@ public IEnumerable EmptyTrash() /// /// Get file versions /// Files - /// File ID - /// File information + /// File ID + /// File information + /// api/2.0/files/file/{fileId}/history + /// GET + /// list [Read("file/{fileId}/history")] public IEnumerable GetFileVersionInfo(string fileId) { @@ -1253,12 +1432,15 @@ public IEnumerable GetFileVersionInfo(string fileId) /// /// Changes version history of a file with the ID specified in the request. /// - /// Change history - /// File ID - /// History version - /// Marks as version or revision + /// Change version history + /// File ID + /// History version + /// Specifies whether to continue the current version and mark it as a revision or create a new one /// Files - /// File history + /// File history + /// api/2.0/files/file/{fileId}/history + /// PUT + /// list [Update("file/{fileId}/history")] public IEnumerable ChangeHistory(string fileId, int version, bool continueVersion) { @@ -1271,8 +1453,11 @@ public IEnumerable ChangeHistory(string fileId, int version, bool c /// /// Get the shared file information /// Sharing - /// File ID - /// Shared file information + /// File ID + /// Shared file information + /// api/2.0/files/file/{fileId}/share + /// GET + /// list [Read("file/{fileId}/share")] public IEnumerable GetFileSecurityInfo(string fileId) { @@ -1284,9 +1469,12 @@ public IEnumerable GetFileSecurityInfo(string fileId) /// Returns the detailed information about the shared folder with the ID specified in the request. /// /// Get the shared folder information - /// Folder ID + /// Folder ID /// Sharing - /// Shared folder information + /// Shared folder information + /// api/2.0/files/folder/{folderId}/share + /// GET + /// list [Read("folder/{folderId}/share")] public IEnumerable GetFolderSecurityInfo(string folderId) { @@ -1297,18 +1485,22 @@ public IEnumerable GetFolderSecurityInfo(string folderId) /// /// Sets the sharing settings to a file with the ID specified in the request. /// - /// File ID - /// Collection of sharing parameters - /// Notifies users about the shared file - /// Message to send when notifying about the shared file + /// File ID + /// Collection of sharing parameters + /// Notifies users about the shared file or not + /// Message to send when notifying about the shared file + /// Advanced settings which prohibit printing, downloading, copying the file, and changing sharing settings /// Share a file /// Sharing /// - /// Each of the "share" parameters must contain two values: 'ShareTo' - ID of the user with whom we want to share the file and 'Access' - access type which we want to grant to the user (Read, ReadWrite, etc). + /// Each of the sharing parameters must contain two values: "ShareTo" - ID of the user with whom we want to share a file, "Access" - access type which we want to give to the user (Read, ReadWrite, etc). /// - /// Shared file information + /// Shared file information + /// api/2.0/files/file/{fileId}/share + /// PUT + /// list [Update("file/{fileId}/share")] - public IEnumerable SetFileSecurityInfo(string fileId, IEnumerable share, bool notify, string sharingMessage) + public IEnumerable SetFileSecurityInfo(string fileId, IEnumerable share, bool notify, string sharingMessage, AceAdvancedSettingsWrapper advancedSettings) { if (share != null && share.Any()) { @@ -1317,7 +1509,8 @@ public IEnumerable SetFileSecurityInfo(string fileId, IEnumera { Entries = new Web.Files.Services.WCFService.ItemList { "file_" + fileId }, Aces = list, - Message = sharingMessage + Message = sharingMessage, + AdvancedSettings = advancedSettings }; _fileStorageService.SetAceObject(aceCollection, notify); } @@ -1328,15 +1521,18 @@ public IEnumerable SetFileSecurityInfo(string fileId, IEnumera /// Sets the sharing settings to a folder with the ID specified in the request. /// /// Share a folder - /// Folder ID - /// Collection of sharing parameters - /// Notifies users about the shared file - /// Message to send when notifying about the shared file + /// Folder ID + /// Collection of sharing parameters + /// Notifies users about the shared folder or not + /// Message to send when notifying about the shared folder /// - /// Each of the "share" parameters must contain two values: 'ShareTo' - ID of the user with whom we want to share the folder and 'Access' - access type which we want to grant to the user (Read, ReadWrite, etc). + /// Each of the sharing parameters must contain two values: "ShareTo" - ID of the user with whom we want to share a folder, "Access" - access type which we want to give to the user (Read, ReadWrite, etc). /// /// Sharing - /// Shared folder information + /// Shared folder information + /// api/2.0/files/folder/{folderId}/share + /// PUT + /// list [Update("folder/{folderId}/share")] public IEnumerable SetFolderSecurityInfo(string folderId, IEnumerable share, bool notify, string sharingMessage) { @@ -1356,13 +1552,15 @@ public IEnumerable SetFolderSecurityInfo(string folderId, IEnu } /// - /// Removes the sharing rights for the group with the ID specified in the request. + /// Removes the sharing rights for the group of folders and files with the IDs specified in the request. /// - /// List of folder IDs - /// List of file IDs - /// Remove group sharing rights + /// List of folder IDs + /// List of file IDs + /// Remove sharing rights /// Sharing - /// Shared file information + /// Bool value: true if the operation is successful + /// api/2.0/files/share + /// DELETE [Delete("share")] public bool RemoveSecurityInfo(IEnumerable folderIds, IEnumerable fileIds) { @@ -1380,10 +1578,12 @@ public bool RemoveSecurityInfo(IEnumerable folderIds, IEnumerable /// Get the shared link - /// File ID - /// Sharing rights + /// File ID + /// Sharing rights /// Sharing /// Shared file link + /// api/2.0/files/{fileId}/sharedlink + /// PUT [Update("{fileId}/sharedlink")] public string GenerateSharedLink(string fileId, FileShare share) { @@ -1414,13 +1614,172 @@ public string GenerateSharedLink(string fileId, FileShare share) return sharedInfo.Link; } + /// + /// Sets a cookie after verifying the password for a password-protected external link and returns a link to the shared file. + /// + /// Set a cookie for a password-protected external link + /// Link signature + /// Password hash + /// Specifies if a link is to the shared folder or not + /// Sharing + /// Shared file link + /// api/2.0/files/sharedlink/password + /// POST + /// false + [Create("sharedlink/password", false)] // NOTE: This method doesn't require auth!!! + public string ApplyShareLinkPassword(string key, string passwordHash, bool isFolder) + { + Tuple fileData = null; + Tuple folderData = null; + + if (!isFolder) + { + fileData = _fileStorageService.ParseFileShareLinkKey(key); + } + else + { + folderData = _fileStorageService.ParseFolderShareLinkKey(key); + } + + var record = !isFolder ? fileData.Item2 : folderData.Item2; + + if (fileData != null && Web.Files.Utils.FileShareLink.CheckCookieOrPasswordKey(record, null, out string _)) + { + return Web.Files.Utils.FileShareLink.GetLink(fileData.Item1, true, record.Subject); + } + else if (folderData != null && Web.Files.Utils.FileShareLink.CheckCookieOrPasswordKey(record, null, out _)) + { + return Web.Files.Utils.FileShareLink.GetLink(folderData.Item1, record.Subject); + } + + var requestIp = MessageSettings.GetFullIPAddress(HttpContext.Current.Request); + + var bruteForceLoginManager = new BruteForceLoginManager(_cache, record.Subject.ToString(), requestIp); + + if (!bruteForceLoginManager.Increment(out bool _)) + { + throw new Exception(Web.Files.Resources.FilesCommonResource.ErrorMassage_ShareLinkPasswordBruteForce); + } + + if (PasswordHasher.GetClientPassword(record.Options.Password) != passwordHash) + { + throw new ArgumentException(Web.Files.Resources.FilesCommonResource.ErrorMassage_ShareLinkPassword); + } + + Web.Files.Utils.FileShareLink.SetCookieKey(record); + + bruteForceLoginManager.Decrement(); + + return !isFolder ? Web.Files.Utils.FileShareLink.GetLink(fileData.Item1, true, record.Subject) : + Web.Files.Utils.FileShareLink.GetLink(folderData.Item1, record.Subject); + } + + /// + /// Returns a token after verifying the password or password hash for a password-protected external link. + /// + /// Get a token for a password-protected external link + /// File ID + /// Link ID + /// Password + /// Password hash + /// Sharing + /// Token for a password-protected external link + /// The token is used in the cookies with the 'sharelink[linkId]' name when calling API methods. + /// api/2.0/files/{fileId}/sharedlink/{linkId}/password + /// POST + [Create("{fileId}/sharedlink/{linkId}/password")] + public AuthenticationTokenData GetTokenForSharedLink(string fileId, Guid linkId, string password, string passwordHash) + { + if (string.IsNullOrEmpty(fileId) || + linkId == FileConstant.ShareLinkId || linkId == Guid.Empty || + (string.IsNullOrEmpty(password) && string.IsNullOrEmpty(passwordHash))) + { + throw new ArgumentException(); + } + + var record = _fileStorageService.GetFileShareLink(fileId, linkId).Item2; + + if (record.Options == null || string.IsNullOrEmpty(record.Options.Password)) + { + return new AuthenticationTokenData(); + } + + var requestIp = MessageSettings.GetFullIPAddress(HttpContext.Current.Request); + + var bruteForceLoginManager = new BruteForceLoginManager(_cache, record.Subject.ToString(), requestIp); + + if (!bruteForceLoginManager.Increment(out bool _)) + { + throw new Exception(Web.Files.Resources.FilesCommonResource.ErrorMassage_ShareLinkPasswordBruteForce); + } + + if (string.IsNullOrEmpty(password)) + { + var hash = PasswordHasher.GetClientPassword(record.Options.Password); + if (hash != passwordHash) + { + throw new ArgumentException(Web.Files.Resources.FilesCommonResource.ErrorMassage_ShareLinkPassword); + } + } + else + { + if (record.Options.Password != password) + { + throw new ArgumentException(Web.Files.Resources.FilesCommonResource.ErrorMassage_ShareLinkPassword); + } + } + + bruteForceLoginManager.Decrement(); + + return new AuthenticationTokenData() + { + Token = record.Options.GetPasswordKey() + }; + } + + /// + /// Returns a new unsaved link object to the file with the ID specified in the request. + /// + /// Get the shared link template + /// File ID + /// Specifies if a link is to the shared folder or not + /// Sharing + /// Shared link template + /// api/2.0/files/{fileId}/sharedlink/template + /// GET + [Read("{fileId}/sharedlink/template")] + public AceWrapper GetShareLinkTemplate(string fileId, bool isFolder) + { + Files.Core.File file = null; + Folder folder = null; + + if (!isFolder) file = _fileStorageService.GetFile(fileId, -1).NotFoundIfNull("File not found"); + else folder = _fileStorageService.GetFolder(fileId).NotFoundIfNull("File not found"); + + var subject = Guid.NewGuid(); + + var aceWrapper = new AceWrapper() + { + SubjectId = subject, + SubjectGroup = true, + SubjectName = Web.Files.Resources.FilesJSResource.TitleNewSharedLink, + Link = !isFolder ? Web.Files.Utils.FileShareLink.GetLink(file, true, subject) : Web.Files.Utils.FileShareLink.GetLink(folder, subject), + LinkSettings = new LinkSettingsWrapper(), + EntryType = !isFolder ? FileEntryType.File : FileEntryType.Folder, + }; + + return aceWrapper; + } + /// /// Returns file properties of the specified file. /// /// Get file properties - /// File ID + /// File ID /// Files /// File properties + /// api/2.0/files/{fileId}/properties + /// GET [Read("{fileId}/properties")] public EntryProperties GetProperties(string fileId) { @@ -1431,10 +1790,12 @@ public EntryProperties GetProperties(string fileId) /// Saves file properties to the specified file. /// /// Save file properties to a file - /// File ID - /// File properties + /// File ID + /// File properties /// Files /// File properties + /// api/2.0/files/{fileId}/properties + /// PUT [Update("{fileId}/properties")] public EntryProperties SetProperties(string fileId, EntryProperties fileProperties) { @@ -1445,11 +1806,14 @@ public EntryProperties SetProperties(string fileId, EntryProperties fileProperti /// Saves file properties to the specified files. /// /// Save file properties to files - /// IDs of files - /// Creates a subfolder or not - /// File properties + /// IDs of files + /// Creates a subfolder or not + /// File properties /// Files /// List of file properties + /// api/2.0/files/batch/properties + /// PUT + /// list [Update("batch/properties")] public List SetProperties(string[] filesId, bool createSubfolder, EntryProperties fileProperties) { @@ -1474,8 +1838,10 @@ public List SetProperties(string[] filesId, bool createSubfolde /// Get providers /// Third-party integration /// List of provider keys - /// List of provider keys: DropboxV2, Box, WebDav, Yandex, OneDrive, SharePoint, GoogleDrive. - /// List of the available providers + /// List of provider keys: DropboxV2, Box, WebDav, Yandex, OneDrive, SharePoint, GoogleDrive, kDrive. + /// api/2.0/files/thirdparty/capabilities + /// GET + /// list [Read("thirdparty/capabilities")] public List> Capabilities() { @@ -1527,21 +1893,23 @@ public List> Capabilities() } /// - /// Saves the storage service account of the third-party file. + /// Saves the third-party storage service account. For WebDav, Yandex, kDrive and SharePoint, the login and password are used for authentication. For other providers, the authentication is performed using a token received via OAuth 2.0. /// /// Save a third-party account - /// Connection URL for the share point - /// Login - /// Password - /// Authentication token - /// Corporate account or not - /// Customer title - /// Provider key - /// Provider ID + /// Connection URL for the sharepoint + /// Login + /// Password + /// Authentication token + /// Specifies if this is a corporate account or not + /// Customer title + /// Provider key + /// Provider ID /// Third-party integration - /// Folder contents - /// List of provider keys: DropboxV2, Box, WebDav, Yandex, OneDrive, SharePoint, GoogleDrive. + /// Folder contents + /// List of provider keys: DropboxV2, Box, WebDav, Yandex, OneDrive, SharePoint, GoogleDrive, kDrive. /// + /// api/2.0/files/thirdparty + /// POST [Create("thirdparty")] public FolderWrapper SaveThirdParty( String url, @@ -1572,7 +1940,10 @@ public FolderWrapper SaveThirdParty( /// /// Third-party integration /// Get third-party services - /// Connected providers + /// Connected providers + /// api/2.0/files/thirdparty + /// GET + /// list [Read("thirdparty")] public IEnumerable GetThirdPartyAccounts() { @@ -1580,11 +1951,14 @@ public IEnumerable GetThirdPartyAccounts() } /// - /// Returns a list of the third-party services connected to the common section. + /// Returns a list of the third-party services connected to the "Common" section. /// /// Third-party integration /// Get common third-party services - /// Common third-party folders + /// Common third-party folders + /// api/2.0/files/thirdparty/common + /// GET + /// list [Read("thirdparty/common")] public IEnumerable GetCommonThirdPartyFolders() { @@ -1593,13 +1967,15 @@ public IEnumerable GetCommonThirdPartyFolders() } /// - /// Removes the storage service account of the third-party file with the ID specified in the request. + /// Removes the third-party storage service account with the ID specified in the request. /// - /// Provider ID. It is a part of the folder ID. Example: folder ID is "sbox-123", then provider ID is "123". + /// Provider ID. It is a part of the folder ID. Example: folder ID is "sbox-123", then provider ID is "123". /// Remove a third-party account /// Third-party integration - /// Folder ID + /// Deleted third-party account /// + ///api/2.0/files/thirdparty/{providerId} + ///DELETE [Delete("thirdparty/{providerId:[0-9]+}")] public object DeleteThirdParty(int providerId) { @@ -1610,10 +1986,13 @@ public object DeleteThirdParty(int providerId) /// /// Searches for files and folders by the query specified in the request. /// - /// Search files and folders + /// Search for files and folders /// Operations - /// Query string - /// Files and folders + /// Query string + /// Files and folders + /// api/2.0/files/@search/{query} + /// GET + /// list [Read(@"@search/{query}")] public IEnumerable Search(string query) { @@ -1628,10 +2007,12 @@ public IEnumerable Search(string query) /// Adds files and folders with the IDs specified in the request to the favorite list. /// /// Add favorite files and folders - /// Files - /// List of folder IDs - /// List of file IDs + /// Operations + /// List of folder IDs + /// List of file IDs /// Bool value: true if the operation is successful + /// api/2.0/files/favorites + /// POST [Create("favorites")] public bool AddFavorites(IEnumerable folderIds, IEnumerable fileIds) { @@ -1643,10 +2024,12 @@ public bool AddFavorites(IEnumerable folderIds, IEnumerable file /// Removes files and folders with the IDs specified in the request from the favorite list. /// /// Delete favorite files and folders - /// Files - /// List of folder IDs - /// List of file IDs + /// Operations + /// List of folder IDs + /// List of file IDs /// Bool value: true if the operation is successful + /// api/2.0/files/favorites + /// DELETE [Delete("favorites")] public bool DeleteFavorites(IEnumerable folderIds, IEnumerable fileIds) { @@ -1659,8 +2042,10 @@ public bool DeleteFavorites(IEnumerable folderIds, IEnumerable f /// /// Add template files /// Files - /// List of file IDs + /// List of file IDs /// Bool value: true if the operation is successful + /// api/2.0/files/templates + /// POST [Create("templates")] public bool AddTemplates(IEnumerable fileIds) { @@ -1673,8 +2058,10 @@ public bool AddTemplates(IEnumerable fileIds) /// /// Delete template files /// Files - /// List of file IDs + /// List of file IDs /// Bool value: true if the operation is successful + /// api/2.0/files/templates + /// DELETE [Delete("templates")] public bool DeleteTemplates(IEnumerable fileIds) { @@ -1684,12 +2071,14 @@ public bool DeleteTemplates(IEnumerable fileIds) /// - /// Stores files in the original formats when uploading and converting. + /// Stores files in the original formats as well when uploading and converting. /// /// Store original formats - /// Sets the parameter on or off + /// Turns the parameter on or off /// Settings /// Bool value: true if the parameter is enabled + /// api/2.0/files/storeoriginal + /// PUT [Update(@"storeoriginal")] public bool StoreOriginal(bool set) { @@ -1697,13 +2086,15 @@ public bool StoreOriginal(bool set) } /// - /// Hides the confirmation dialog. + /// Hides the confirmation dialog for saving the file copy in the original format when converting a file. /// - /// Hide the confirmation dialog - /// Defines if it is for saving or not + /// Hide the confirmation dialog when converting + /// Specifies whether to save the file in the original format or not /// Settings /// false /// Bool value: true if the parameter is enabled + /// api/2.0/files/hideconfirmconvert + /// PUT [Update(@"hideconfirmconvert")] public bool HideConfirmConvert(bool save) { @@ -1713,10 +2104,12 @@ public bool HideConfirmConvert(bool save) /// /// Updates a file version if a file with such a name already exists. /// - /// Update a file version if exists - /// Sets the parameter on or off + /// Update a file version if it exists + /// Turns the parameter on or off /// Settings /// Bool value: true if the parameter is enabled + /// api/2.0/files/updateifexist + /// PUT [Update(@"updateifexist")] public bool UpdateIfExist(bool set) { @@ -1724,12 +2117,14 @@ public bool UpdateIfExist(bool set) } /// - /// Displays the recent folder. + /// Displays the "Recent" folder. /// - /// Display recent folder - /// Sets the parameter on or off + /// Display the "Recent" folder + /// Turns the parameter on or off /// Settings /// Bool value: true if the parameter is enabled + /// api/2.0/files/displayRecent + /// PUT [Update(@"displayRecent")] public bool DisplayRecent(bool set) { @@ -1737,12 +2132,14 @@ public bool DisplayRecent(bool set) } /// - /// Displays the favorite folder. + /// Displays the "Favorites" folder. /// - /// Display favorite folder - /// Sets the parameter on or off + /// Display the "Favorites" folder + /// Turns the parameter on or off /// Settings /// Bool value: true if the parameter is enabled + /// api/2.0/files/settings/favorites + /// PUT [Update(@"settings/favorites")] public bool DisplayFavorite(bool set) { @@ -1750,12 +2147,14 @@ public bool DisplayFavorite(bool set) } /// - /// Displays the template folder. + /// Displays the "Templates" folder. /// - /// Display template folder - /// Sets the parameter on or off + /// Display the "Templates" folder + /// Turns the parameter on or off /// Settings /// Bool value: true if the parameter is enabled + /// api/2.0/files/settings/templates + /// PUT [Update(@"settings/templates")] public bool DisplayTemplates(bool set) { @@ -1763,13 +2162,15 @@ public bool DisplayTemplates(bool set) } /// - /// Updates the auto cleanup setting. + /// Updates the trash bin auto-clearing setting. /// - /// Update the auto cleanup setting - /// Enables the auto cleanup or not - /// A time interval when the auto cleanup will be performed (one week, two weeks, one month, two months, three months) + /// Update the trash bin auto-clearing setting + /// Enables the auto-clearing or not + /// A time interval when the auto-clearing will be performed (one week, two weeks, one month, two months, three months) /// Settings - /// The auto cleanup setting properties + /// The auto-clearing setting properties + /// api/2.0/files/settings/autocleanup + /// PUT [Update(@"settings/autocleanup")] public AutoCleanUpData ChangeAutomaticallyCleanUp(bool set, DateToAutoCleanUp gap) { @@ -1777,11 +2178,13 @@ public AutoCleanUpData ChangeAutomaticallyCleanUp(bool set, DateToAutoCleanUp ga } /// - /// Returns the auto cleanup setting properties. + /// Returns the auto-clearing setting properties. /// - /// Get the auto cleanup setting properties + /// Get the auto-clearing setting properties /// Settings - /// The auto cleanup setting properties + /// The auto-clearing setting properties + /// api/2.0/files/settings/autocleanup + /// GET [Read(@"settings/autocleanup")] public AutoCleanUpData GetSettingsAutomaticallyCleanUp() { @@ -1789,12 +2192,15 @@ public AutoCleanUpData GetSettingsAutomaticallyCleanUp() } /// - /// Changes the default access rights in sharing settings + /// Changes the default access rights in the sharing settings. /// /// Change the default access rights - /// Default access rights + /// Default access rights /// Settings /// Default access rights + /// api/2.0/files/settings/dafaultaccessrights + /// PUT + /// list [Update(@"settings/dafaultaccessrights")] public List ChangeDafaultAccessRights(List value) { @@ -1802,12 +2208,14 @@ public List ChangeDafaultAccessRights(List value) } /// - /// Changes the archive format for downloading from zip to tar.gz. + /// Changes the format of the downloaded archive from .zip to .tar.gz. /// /// Change the archive format - /// Sets the parameter on or off + /// Turns the parameter on or off /// Settings /// Archive + /// api/2.0/files/settings/downloadtargz + /// PUT [Update(@"settings/downloadtargz")] public ICompress ChangeDownloadZip(bool set) { @@ -1818,11 +2226,14 @@ public ICompress ChangeDownloadZip(bool set) /// Checks the document service location. /// /// Check the document service URL - /// Document editing service domain - /// Document command service domain - /// Community Server address + /// The address of Document Server + /// The address of Document Server in the local private network + /// The address of Community Server /// Settings /// Document service information + /// api/2.0/files/docservice + /// PUT + /// list [Update("docservice")] public IEnumerable CheckDocServiceUrl(string docServiceUrl, string docServiceUrlInternal, string docServiceUrlPortal) { @@ -1855,8 +2266,10 @@ public IEnumerable CheckDocServiceUrl(string docServiceUrl, string docSe /// /// Get the document service URL /// Settings - /// Specifies version or not + /// Specifies the editor version or not /// Address + /// api/2.0/files/docservice + /// GET [Read("docservice")] public object GetDocServiceUrl(bool version) { @@ -1880,14 +2293,26 @@ public object GetDocServiceUrl(bool version) /// /// Create thumbnails /// Files - /// List of file IDs + /// List of file IDs /// false /// List of file IDs - [Create("thumbnails")] + /// api/2.0/files/thumbnails + /// POST + /// list + [Create("thumbnails", false)] // NOTE: This method doesn't require auth!!! public IEnumerable CreateThumbnails(IEnumerable fileIds) { try { + var files = _fileStorageService.GetFilterReadFiles(fileIds); + + fileIds = files.Select(f => f.ID.ToString()); + + if (!fileIds.Any()) + { + return fileIds; + } + using (var thumbnailBuilderServiceClient = new ThumbnailBuilderServiceClient()) { thumbnailBuilderServiceClient.BuildThumbnails(CoreContext.TenantManager.GetCurrentTenant().TenantId, fileIds); @@ -1903,6 +2328,11 @@ public IEnumerable CreateThumbnails(IEnumerable fileIds) private FolderContentWrapper ToFolderContentWrapper(object folderId, Guid userIdOrGroupId, FilterType filterType, bool searchInContent, bool withSubfolders) { + if (folderId == null) + { + throw new ItemNotFoundException(Web.Files.Resources.FilesCommonResource.ErrorMassage_FolderNotFound); + } + OrderBy orderBy = null; SortedByType sortBy; if (Enum.TryParse(_context.SortBy, true, out sortBy)) @@ -1931,6 +2361,8 @@ private FolderContentWrapper ToFolderContentWrapper(object folderId, Guid userId /// Get the WordPress information /// WordPress /// WordPress information + /// api/2.0/files/wordpress-info + /// GET /// false [Read("wordpress-info")] public object GetWordpressInfo() @@ -1965,6 +2397,8 @@ public object GetWordpressInfo() /// Delete the WordPress information /// WordPress /// Object with the bool value: true if the operation is successful + /// api/2.0/files/wordpress-delete + /// GET /// false [Read("wordpress-delete")] public object DeleteWordpressInfo() @@ -1985,12 +2419,14 @@ public object DeleteWordpressInfo() } /// - /// Saves the user WordPress information at login. + /// Saves the user WordPress information when logging in. /// /// Save the user WordPress information - /// Authorization code + /// Authorization code /// WordPress /// User WordPress information + /// api/2.0/files/wordpress-save + /// POST /// false [Create("wordpress-save")] public object WordpressSave(string code) @@ -2035,12 +2471,14 @@ public object WordpressSave(string code) /// Creates a WordPress post with the parameters specified in the request. /// /// Create a WordPress post - /// Authorization code - /// Post title - /// Post content - /// Operation status + /// Authorization code + /// Post title + /// Post content + /// Operation status /// WordPress - /// WordPress post + /// Boolean value: true if the operation is successful + /// api/2.0/files/wordpress + /// POST /// false [Create("wordpress")] public bool CreateWordpressPost(string code, string title, string content, int status) @@ -2074,10 +2512,12 @@ public bool CreateWordpressPost(string code, string title, string content, int s /// Returns the EasyBib citation list. /// /// Get the EasyBib citation list - /// Citation source: book (0), journal (1) or website (2) - /// Citation data + /// Citation source: book (0), journal (1) or website (2) + /// Citation data /// EasyBib /// EasyBib citation list + /// api/2.0/files/easybib-citation-list + /// GET /// false [Read("easybib-citation-list")] public object GetEasybibCitationList(int source, string data) @@ -2107,6 +2547,8 @@ public object GetEasybibCitationList(int source, string data) /// Get the EasyBib styles /// EasyBib /// List of EasyBib styles + /// api/2.0/files/easybib-styles + /// GET /// false [Read("easybib-styles")] public object GetEasybibStyles() @@ -2132,10 +2574,12 @@ public object GetEasybibStyles() /// /// Returns the EasyBib citation book. /// - /// Get the EasyBib citation - /// Citation data + /// Get the EasyBib citation book + /// Citation data /// EasyBib /// EasyBib citation + /// api/2.0/files/easybib-citation + /// POST /// false [Create("easybib-citation")] public object EasyBibCitationBook(string citationData) @@ -2180,42 +2624,49 @@ public class ConversationResult /// /// Operation ID. /// + /// d5490cba-a5e6-40db-acb2-94203dba12d6 [DataMember(Name = "id")] public string Id { get; set; } /// /// Operation type. /// + /// 6 [DataMember(Name = "operation")] public FileOperationType OperationType { get; set; } /// /// Operation progress. /// + /// 30 [DataMember(Name = "progress")] public int Progress { get; set; } /// /// Source files for operation. /// + /// source [DataMember(Name = "source")] public string Source { get; set; } /// /// Result file of operation. /// + /// ASC.Api.Documents.FileWrapper, ASC.Api.Documents [DataMember(Name = "result")] public FileWrapper File { get; set; } /// /// Error during conversion. /// + /// [DataMember(Name = "error")] public string Error { get; set; } /// /// Is operation processed. /// + /// 1 [DataMember(Name = "processed")] public string Processed { get; set; } } diff --git a/module/ASC.Api/ASC.Api.Documents/FileEntryWrapper.cs b/module/ASC.Api/ASC.Api.Documents/FileEntryWrapper.cs index ffee0430d..047adad7a 100644 --- a/module/ASC.Api/ASC.Api.Documents/FileEntryWrapper.cs +++ b/module/ASC.Api/ASC.Api.Documents/FileEntryWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,31 +31,39 @@ public abstract class FileEntryWrapper { /// /// + /// 857864274 [DataMember] public object Id { get; set; } /// /// + /// Some titile.txt [DataMember(IsRequired = true)] public string Title { get; set; } /// /// + /// 1 [DataMember] public FileShare Access { get; set; } /// /// + /// false [DataMember] public bool Shared { get; set; } /// /// + /// 2020-12-13T17:13:31.5902727Z + /// 50 [DataMember(Order = 50)] public ApiDateTime Created { get; set; } /// /// + /// ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + /// 51 [DataMember(Order = 51, EmitDefaultValue = false)] public EmployeeWraper CreatedBy { get; set; } @@ -63,6 +71,8 @@ public abstract class FileEntryWrapper /// /// + /// 2020-12-13T17:13:31.5902727Z + /// 52 [DataMember(Order = 52, EmitDefaultValue = false)] public ApiDateTime Updated { @@ -75,26 +85,36 @@ public ApiDateTime Updated /// /// + /// 2 + /// 41 [DataMember(Order = 41, EmitDefaultValue = false)] public FolderType RootFolderType { get; set; } /// /// + /// ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + /// 41 [DataMember(Order = 41, EmitDefaultValue = false)] public EmployeeWraper UpdatedBy { get; set; } /// /// + /// true + /// 55 [DataMember(Order = 55, EmitDefaultValue = false)] public bool ProviderItem { get; set; } /// /// + /// 1234d + /// 56 [DataMember(Order = 56, EmitDefaultValue = false)] public string ProviderKey { get; set; } /// /// + /// 1234 + /// 57 [DataMember(Order = 57, EmitDefaultValue = false)] public int ProviderId { get; set; } diff --git a/module/ASC.Api/ASC.Api.Documents/FileOperationWraper.cs b/module/ASC.Api/ASC.Api.Documents/FileOperationWraper.cs index 5d0af8906..d6d68aba9 100644 --- a/module/ASC.Api/ASC.Api.Documents/FileOperationWraper.cs +++ b/module/ASC.Api/ASC.Api.Documents/FileOperationWraper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,46 +34,57 @@ public class FileOperationWraper { /// /// + /// d5490cba-a5e6-40db-acb2-94203dba12d6 [DataMember(Name = "id", IsRequired = false)] public string Id { get; set; } /// /// + /// 1 [DataMember(Name = "operation", IsRequired = false)] public FileOperationType OperationType { get; set; } /// /// + /// 100 [DataMember(Name = "progress", IsRequired = false)] public int Progress { get; set; } /// /// + /// [DataMember(Name = "error", IsRequired = false)] public string Error { get; set; } /// /// + /// 1 [DataMember(Name = "processed", IsRequired = false)] public string Processed { get; set; } /// /// + /// false [DataMember(Name = "finished", IsRequired = false)] public bool Finished { get; set; } /// /// + /// null [DataMember(Name = "url", IsRequired = false)] public string Url { get; set; } /// /// + /// ASC.Api.Documents.FileWrapper, ASC.Api.Documents + /// list [DataMember(Name = "files", IsRequired = true, EmitDefaultValue = true)] public List Files { get; set; } /// /// + /// ASC.Api.Documents.FolderWrapper, ASC.Api.Documents + /// list [DataMember(Name = "folders", IsRequired = true, EmitDefaultValue = true)] public List Folders { get; set; } diff --git a/module/ASC.Api/ASC.Api.Documents/FileShareParams.cs b/module/ASC.Api/ASC.Api.Documents/FileShareParams.cs index bb4012926..12b41fa40 100644 --- a/module/ASC.Api/ASC.Api.Documents/FileShareParams.cs +++ b/module/ASC.Api/ASC.Api.Documents/FileShareParams.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,11 +30,15 @@ public class FileShareParams { /// /// + /// 2fdfe577-3c26-4736-9df9-b5a683bb8520 + /// 0 [DataMember(Name = "shareTo", Order = 0)] public Guid ShareTo { get; set; } /// /// + /// 0 + /// 1 [DataMember(Name = "access", Order = 1)] public FileShare Access { get; set; } diff --git a/module/ASC.Api/ASC.Api.Documents/FileShareWrapper.cs b/module/ASC.Api/ASC.Api.Documents/FileShareWrapper.cs index 8e22c8a63..af7874c37 100644 --- a/module/ASC.Api/ASC.Api.Documents/FileShareWrapper.cs +++ b/module/ASC.Api/ASC.Api.Documents/FileShareWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,7 +42,7 @@ public FileShareWrapper(AceWrapper aceWrapper) IsLocked = aceWrapper.LockedRights; if (aceWrapper.SubjectGroup) { - if (aceWrapper.SubjectId == FileConstant.ShareLinkId) + if (aceWrapper.IsLink) { SharedTo = new FileShareLink { @@ -65,18 +65,38 @@ public FileShareWrapper(AceWrapper aceWrapper) /// /// + /// 1 public FileShare Access { get; set; } /// /// + /// + /// + /// 00000000-0000-0000-0000-000000000000 + /// + /// + /// Mike Zanyatski + /// + /// + /// Manager + /// + /// + /// url to small avatar + /// + /// + /// + /// + /// public object SharedTo { get; set; } /// /// + /// false public bool IsLocked { get; set; } /// /// + /// true public bool IsOwner { get; set; } /// diff --git a/module/ASC.Api/ASC.Api.Documents/FileWrapper.cs b/module/ASC.Api/ASC.Api.Documents/FileWrapper.cs index 9768a21a7..fca537b81 100644 --- a/module/ASC.Api/ASC.Api.Documents/FileWrapper.cs +++ b/module/ASC.Api/ASC.Api.Documents/FileWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,68 +33,81 @@ namespace ASC.Api.Documents { /// /// + /// ASC.Api.Documents.FileEntryWrapper, ASC.Api.Documents [DataContract(Name = "file", Namespace = "")] public class FileWrapper : FileEntryWrapper { /// /// + /// 12334 [DataMember(EmitDefaultValue = false, IsRequired = false)] public object FolderId { get; set; } /// /// + /// 3 [DataMember(EmitDefaultValue = true, IsRequired = false)] public int Version { get; set; } /// /// + /// 1 [DataMember(EmitDefaultValue = true, IsRequired = false)] public int VersionGroup { get; set; } /// /// + /// 12.06 KB [DataMember(EmitDefaultValue = false, IsRequired = true)] public String ContentLength { get; set; } /// /// + /// 12345 [DataMember(EmitDefaultValue = false, IsRequired = true)] public long PureContentLength { get; set; } /// /// + /// 2 [DataMember(EmitDefaultValue = true, IsRequired = false)] public FileStatus FileStatus { get; set; } /// /// + /// http:\/\/www.onlyoffice.com\/viewfile?fileid=2221 [DataMember(EmitDefaultValue = false, IsRequired = false)] public String ViewUrl { get; set; } /// /// + /// http:\/\/www.onlyoffice.com\/viewfile?fileid=2221 [DataMember(EmitDefaultValue = false, IsRequired = false)] public String WebUrl { get; set; } /// /// /// + /// 7 [DataMember(EmitDefaultValue = false, IsRequired = false)] public FileType FileType { get; set; } /// /// /// + /// .txt [DataMember(EmitDefaultValue = false, IsRequired = false)] public String FileExst { get; set; } /// /// + /// null [DataMember(EmitDefaultValue = true, IsRequired = false)] public String Comment { get; set; } /// /// + /// true [DataMember(EmitDefaultValue = false)] public bool Encrypted { get; set; } diff --git a/module/ASC.Api/ASC.Api.Documents/FolderContentWrapper.cs b/module/ASC.Api/ASC.Api.Documents/FolderContentWrapper.cs index 486968cb7..d05ec6ab2 100644 --- a/module/ASC.Api/ASC.Api.Documents/FolderContentWrapper.cs +++ b/module/ASC.Api/ASC.Api.Documents/FolderContentWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,16 +31,21 @@ public class FolderContentWrapper { /// /// + /// ASC.Api.Documents.FileWrapper, ASC.Api.Documents + /// list [DataMember(IsRequired = false, EmitDefaultValue = false)] public List Files { get; set; } /// /// + /// ASC.Api.Documents.FolderWrapper, ASC.Api.Documents + /// list [DataMember(IsRequired = false, EmitDefaultValue = false)] public List Folders { get; set; } /// /// + /// ASC.Api.Documents.FolderWrapper, ASC.Api.Documents [DataMember(IsRequired = false, EmitDefaultValue = true)] public FolderWrapper Current { get; set; } @@ -51,19 +56,27 @@ public class FolderContentWrapper /// /// + /// 0 [DataMember(IsRequired = false, EmitDefaultValue = true)] public int StartIndex { get; set; } /// /// + /// 4 [DataMember(IsRequired = false, EmitDefaultValue = true)] public int Count { get; set; } /// /// + /// 4 [DataMember(IsRequired = false, EmitDefaultValue = true)] public int Total { get; set; } + /// + /// + [DataMember(IsRequired = false, EmitDefaultValue = true)] + public int New { get; set; } + /// /// /// @@ -74,7 +87,7 @@ public FolderContentWrapper(DataWrapper folderItems, int startIndex) Folders = folderItems.Entries.OfType().Select(x => new FolderWrapper(x)).ToList(); Current = new FolderWrapper(folderItems.FolderInfo); PathParts = folderItems.FolderPathParts; - + New = folderItems.RootFoldersIdMarkedAsNew.SingleOrDefault(q => q.Key.ToString() == Current.Id.ToString()).Value; StartIndex = startIndex; Count = Files.Count + Folders.Count; Total = folderItems.Total; diff --git a/module/ASC.Api/ASC.Api.Documents/FolderWrapper.cs b/module/ASC.Api/ASC.Api.Documents/FolderWrapper.cs index fa01d8b5a..43d110ca4 100644 --- a/module/ASC.Api/ASC.Api.Documents/FolderWrapper.cs +++ b/module/ASC.Api/ASC.Api.Documents/FolderWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,26 +29,31 @@ namespace ASC.Api.Documents { /// /// + /// ASC.Api.Documents.FileEntryWrapper, ASC.Api.Documents [DataContract(Name = "folder", Namespace = "")] public class FolderWrapper : FileEntryWrapper { /// /// + /// 1840746475 [DataMember(IsRequired = true, EmitDefaultValue = true)] public object ParentId { get; set; } /// /// + /// 1840746475 [DataMember(EmitDefaultValue = true, IsRequired = false)] public int FilesCount { get; set; } /// /// + /// 1840746475 [DataMember(EmitDefaultValue = true, IsRequired = false)] public int FoldersCount { get; set; } /// /// + /// true [DataMember(EmitDefaultValue = false, IsRequired = false)] public bool IsShareable { get; set; } diff --git a/module/ASC.Api/ASC.Api.Documents/PrivacyRoomApi.cs b/module/ASC.Api/ASC.Api.Documents/PrivacyRoomApi.cs index bcf3e8f6b..72f50ec47 100644 --- a/module/ASC.Api/ASC.Api.Documents/PrivacyRoomApi.cs +++ b/module/ASC.Api/ASC.Api.Documents/PrivacyRoomApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,8 +40,13 @@ public string Name /// - /// + /// Sets the user's public and private keys when the user enters the login and password on the Desktop Editors authorization page. /// + /// Set public and private keys + /// The user's public key + /// The user's encrypted private key + /// Specifies whether to update the key pair or not + /// Bool value: true if the operation is successful /// false [Update("keys")] public object SetKeys(string publicKey, string privateKeyEnc, bool update = false) @@ -71,8 +76,11 @@ public object SetKeys(string publicKey, string privateKeyEnc, bool update = fals } /// - /// + /// Get the pairs of the encrypted document passwords and public keys of all users who have access to the specified file. /// + /// Get public keys + /// File ID + /// The pairs of the encrypted document passwords and public keys /// false [Read("access/{fileId}")] public IEnumerable GetPublicKeysWithAccess(string fileId) @@ -85,9 +93,10 @@ public IEnumerable GetPublicKeysWithAccess(string fileId) /// - /// + /// Checks if the Private Room settings is enabled or not for the current portal. /// - /// + /// Check the Private Room settings + /// Bool value: true if the Private Room settings is enabled /// false [Read("")] public bool PrivacyRoom() @@ -98,10 +107,11 @@ public bool PrivacyRoom() } /// - /// + /// Sets the Private Room settings for the current portal. /// - /// - /// + /// Set the Private Room settings + /// Enables or disables the Private Room settings for the current portal + /// Bool value: true if the Private Room settings is enabled /// false [Update("")] public bool SetPrivacyRoom(bool enable) diff --git a/module/ASC.Api/ASC.Api.Feed/FeedApi.cs b/module/ASC.Api/ASC.Api.Feed/FeedApi.cs index e7ac90980..97aa987e1 100644 --- a/module/ASC.Api/ASC.Api.Feed/FeedApi.cs +++ b/module/ASC.Api/ASC.Api.Feed/FeedApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,8 +31,9 @@ namespace ASC.Api.Feed { /// - /// Feed access. + /// Feed API. /// + /// feed public class FeedApi : IApiEntryPoint { private const string newFeedsCountCacheKey = "newfeedscount"; @@ -61,6 +62,9 @@ public FeedApi(ApiContext context) /// ///Read feeds /// + /// api/2.0/feed/read + /// PUT + /// [Update("/read")] public void Read() { @@ -74,13 +78,15 @@ public void Read() /// ///Get feeds /// - /// Product which feeds you want to read - /// Time from which the feeds should be displayed - /// Time until which the feeds should be displayed - /// Author whose feeds you want to read - /// Displays only fresh feeds - /// Time when the feeds were read - ///List of filtered feeds + /// Product which feeds you want to read + /// Time from which the feeds should be displayed + /// Time until which the feeds should be displayed + /// Author whose feeds you want to read + /// Displays only fresh feeds + /// Time when the feeds were read + /// List of filtered feeds + /// api/2.0/feed/filter + /// GET [Read("/filter")] public object GetFeed( string product, @@ -153,6 +159,8 @@ public object GetFeed( ///Count fresh feeds /// ///Number of fresh feeds + /// api/2.0/feed/newfeedscount + /// GET [Read("/newfeedscount")] public object GetFreshNewsCount() { diff --git a/module/ASC.Api/ASC.Api.Feed/FeedWrapper.cs b/module/ASC.Api/ASC.Api.Feed/FeedWrapper.cs index 245c533cb..44c556e21 100644 --- a/module/ASC.Api/ASC.Api.Feed/FeedWrapper.cs +++ b/module/ASC.Api/ASC.Api.Feed/FeedWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.Accounts.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.Accounts.cs index c7323fe03..bdafc17dd 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.Accounts.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.Accounts.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,15 +39,19 @@ namespace ASC.Api.Mail { + ///mail public partial class MailApi { /// - /// Returns a list of all the user mailboxes, aliases and groups. + /// Returns a list of all the user mailboxes, aliases, and groups. /// - /// User name - /// List of user mailboxes, aliases and groups + /// User name + /// List of user mailboxes, aliases and groups /// Get user accounts /// Accounts + /// api/2.0/mail/accounts + /// GET + /// list [Read(@"accounts")] public IEnumerable GetAccounts(string username = "") { @@ -58,12 +62,14 @@ public IEnumerable GetAccounts(string username = "") /// /// Returns the account information by the email address specified in the request. /// - /// Account email address - /// Account information - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. - /// Exception happens when mailbox wasn't found by email. + /// Account email address + /// Account information + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. + /// An exception occurs when the mailbox wasn't found by email. /// Get an account by email /// Accounts + /// api/2.0/mail/accounts/single + /// GET [Read(@"accounts/single")] public MailBoxData GetAccount(string email) { @@ -106,13 +112,15 @@ public MailBoxData GetAccount(string email) /// /// Creates an account based on the email address and password specified in the request. /// - /// Account email address in the name@domain format - /// Email password - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. - /// Exception contains text description of happened error. - /// Created account + /// Account email address in the name@domain format + /// Email password + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. + /// The exception contains a textual description of the error that occurred. + /// Created account /// Create an account by email and password /// Accounts + /// api/2.0/mail/accounts/simple + /// POST [Create(@"accounts/simple")] public MailAccountData CreateAccountSimple(string email, string password) { @@ -164,27 +172,29 @@ public MailAccountData CreateAccountSimple(string email, string password) /// /// Creates an account using full information about mail servers specified in the request. /// - /// Account name in Teamlab - /// Account email address in the name@domain format - /// IMAP or POP server login - /// IMAP or POP server password - /// IMAP or POP server port - /// IMAP or POP server address or IP - /// SMTP server login - /// SMTP server password - /// SMTP server port - /// SMTP server address or IP - /// Specifies if the authentication is needed for the SMTP server or not - /// Specifies if the IMAP server is used for incoming mails or not - /// Specifies if all the mails should be downloaded from the account (false) or not (true). If true, then messages from last 30 days only will be downloaded - /// Encryption type for the IMAP or POP server: 0 - None, 1 - SSL, 2 - StartTLS - /// Encryption type for the SMTP server: 0 - None, 1 - SSL, 2 - StartTLS - /// Authentication type for the IMAP or POP server: 1 - Login, 4 - CremdMd5, 5 - OAuth2 - /// Authentication type for the SMTP server: 0 - None, 1 - Login, 4 - CremdMd5, 5 - OAuth2 - /// Created account - /// Exception contains text description of happened error. + /// Account name + /// Account email address in the name@domain format + /// IMAP or POP server login + /// IMAP or POP server password + /// IMAP or POP server port + /// IMAP or POP server address or IP + /// SMTP server login + /// SMTP server password + /// SMTP server port + /// SMTP server address or IP + /// Specifies if the authentication is needed for the SMTP server or not + /// Specifies if the IMAP server is used for incoming mails or not + /// Specifies if all the mails should be downloaded from the account (false) or not (true). If true, then messages for the last 30 days only will be imported + /// Encryption type for the IMAP or POP server: 0 - None, 1 - SSL, 2 - StartTLS + /// Encryption type for the SMTP server: 0 - None, 1 - SSL, 2 - StartTLS + /// Authentication type for the IMAP or POP server: 0 - None, 1 - Login, 4 - CramMd5, 5 - OAuth2 + /// Authentication type for the SMTP server: 0 - None, 1 - Login, 4 - CramMd5, 5 - OAuth2 + /// Created account + /// The exception contains a textual description of the error that occurred. /// Create an account by custom mail servers /// Accounts + /// api/2.0/mail/accounts + /// POST [Create(@"accounts")] public MailAccountData CreateAccount(string name, string email, @@ -268,14 +278,16 @@ public MailAccountData CreateAccount(string name, } /// - /// Creates a mail account with OAuth authentication (only Google OAuth is supported). + /// Creates a mail account with OAuth (only Google OAuth is supported). /// - /// OAuth code - /// OAuth service type: 0 - Unknown, 1 - Google - /// Exception contains text description of an error occurred. - /// Created account - /// Create the OAuth account + /// OAuth code + /// OAuth service type: 0 - Unknown, 1 - Google + /// The exception contains a textual description of the error that occurred. + /// Created account + /// Create an OAuth account /// Accounts + /// api/2.0/mail/accounts/oauth + /// POST [Create(@"accounts/oauth")] public MailAccountData CreateAccountOAuth(string code, byte type) { @@ -295,15 +307,17 @@ public MailAccountData CreateAccountOAuth(string code, byte type) } /// - /// Updates a mail account with OAuth authentication (only Google OAuth is supported). + /// Updates a mail account with OAuth (only Google OAuth is supported). /// - /// New OAuth code - /// New OAuth service type: 0 - Unknown, 1 - Google - /// Mailbox ID - /// Exception contains text description of an error occurred. - /// Updated OAuth account - /// Update the OAuth account + /// New OAuth code + /// New OAuth service type: 0 - Unknown, 1 - Google + /// Mailbox ID + /// The exception contains a textual description of the error that occurred. + /// Updated OAuth account + /// Update an OAuth account /// Accounts + /// api/2.0/mail/accounts/oauth + /// PUT [Update(@"accounts/oauth")] public MailAccountData UpdateAccountOAuth(string code, byte type, int mailboxId) { @@ -330,26 +344,28 @@ public MailAccountData UpdateAccountOAuth(string code, byte type, int mailboxId) /// /// Updates an account with the name specified in the request. /// - /// Account name in Teamlab - /// New account email in the name@domain format - /// New IMAP or POP server login - /// New IMAP or POP server password - /// New IMAP or POP server port - /// New IMAP or POP server address or IP - /// New SMTP server login - /// New SMTP server password - /// New SMTP server port - /// New SMTP server address or IP - /// Specifies if the authentication is needed for the SMTP server or not - /// Specifies if all the mails should be downloaded from the account (false) or not (true). If true, then messages from last 30 days only will be downloaded - /// New encryption type for the IMAP or POP server: 0 - None, 1 - SSL, 2 - StartTLS - /// New encryption type for the SMTP server: 0 - None, 1 - SSL, 2 - StartTLS - /// New authentication type for the IMAP or POP server: 1 - Login, 4 - CremdMd5, 5 - OAuth2 - /// New authentication type for the SMTP server: 0 - None, 1 - Login, 4 - CremdMd5, 5 - OAuth2 - /// Updated account - /// Exception contains text description of an error occurred. + /// Account name + /// New account email in the name@domain format + /// New IMAP or POP server login + /// New IMAP or POP server password + /// New IMAP or POP server port + /// New IMAP or POP server address or IP + /// New SMTP server login + /// New SMTP server password + /// New SMTP server port + /// New SMTP server address or IP + /// Specifies if the authentication is needed for the SMTP server or not + /// Specifies if all the mails should be downloaded from the account (false) or not (true). If true, then messages for the last 30 days only will be imported + /// New encryption type for the IMAP or POP server: 0 - None, 1 - SSL, 2 - StartTLS + /// New encryption type for the SMTP server: 0 - None, 1 - SSL, 2 - StartTLS + /// New authentication type for the IMAP or POP server: 0 - None, 1 - Login, 4 - CramMd5, 5 - OAuth2 + /// New authentication type for the SMTP server: 0 - None, 1 - Login, 4 - CramMd5, 5 - OAuth2 + /// Updated account + /// The exception contains a textual description of the error that occurred. /// Update an account /// Accounts + /// api/2.0/mail/accounts + /// PUT [Update(@"accounts")] public MailAccountData UpdateAccount(string name, string email, @@ -434,12 +450,14 @@ public MailAccountData UpdateAccount(string name, /// /// Deletes an account by email address specified in the request. /// - /// Account email address - /// Operation status - /// Exception happens when some parameters are invalid. Text description contains parameter name and text description. - /// Exception happens when mailbox wasn't found. + /// Account email address + /// Operation status + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. + /// An exception occurs when the mailbox wasn't found by email. /// Delete an account /// Accounts + /// api/2.0/mail/accounts + /// DELETE [Delete(@"accounts")] public MailOperationStatus DeleteAccount(string email) { @@ -460,15 +478,17 @@ public MailOperationStatus DeleteAccount(string email) } /// - /// Sets a state of an account with email address specified in the request. + /// Sets the status of an account with the email address specified in the request. /// - /// Account email address - /// Account activity state: true - enabled, false - disabled + /// Account email address + /// Account activity status: true - enabled, false - disabled /// Account mailbox ID /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. /// Exception happens when update operation failed. - /// Set an account state + /// Set the account status /// Accounts + /// api/2.0/mail/accounts/state + /// PUT [Update(@"accounts/state")] public int SetAccountEnable(string email, bool state) { @@ -509,15 +529,17 @@ public int SetAccountEnable(string email, bool state) } /// - /// Sets the default account with email address specified in the request. + /// Sets the default account with the email address specified in the request. /// - /// Account email address - /// Set or reset account as default + /// Account email address + /// Specifies if this account is default or not /// Account email address - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. - /// Exception happens when update operation failed. + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. + /// The exception occurs when the update operation fails. /// Set the default account /// Accounts + /// api/2.0/mail/accounts/default + /// PUT [Update(@"accounts/default")] public string SetDefaultAccount(string email, bool isDefault) { @@ -555,18 +577,20 @@ public string SetDefaultAccount(string email, bool isDefault) } /// - /// Returns the default settings for an account based on its email domain. + /// Returns the default settings for an account with the email address specified in the request. /// - /// Account email address - /// Action for default settings: - /// "get_imap_pop_settings" - get IMAP or POP settings (IMAP settings are prior), - /// "get_imap_server" | "get_imap_server_full" - get IMAP settings, - /// "get_pop_server" | "get_pop_server_full" - get POP settings. - /// By default returns default IMAP settings + /// Account email address + /// The default settings type: + /// "get_imap_pop_settings" - get the IMAP or POP settings (IMAP settings are prior), + /// "get_imap_server" | "get_imap_server_full" - get the IMAP server settings, + /// "get_pop_server" | "get_pop_server_full" - get the POP server settings. + /// The default IMAP settings are returned by default. /// - /// Account with default settings + /// Account with default settings /// Get the default account settings /// Accounts + /// api/2.0/mail/accounts/setups + /// GET [Read(@"accounts/setups")] public MailBoxData GetAccountDefaults(string email, string action) { @@ -593,15 +617,17 @@ public MailBoxData GetAccountDefaults(string email, string action) } /// - /// Sets the account email in a folder with the ID specified in the request. + /// Sets an account email in a folder with the ID specified in the request. /// - /// Mailbox ID - /// Document folder ID + /// Mailbox ID + /// Document folder ID /// Account email address - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. - /// Exception happens when update operation failed. - /// Set the account email in a folder + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. + /// The exception occurs when the update operation fails. + /// Set a folder account email /// Accounts + /// api/2.0/mail/accounts/emailinfolder + /// PUT [Update(@"accounts/emailinfolder")] public void SetAccountEMailInFolder(int mailbox_id, string email_in_folder) { @@ -612,11 +638,14 @@ public void SetAccountEMailInFolder(int mailbox_id, string email_in_folder) } /// - /// Updates the user activity state. + /// Updates the user activity status. /// - /// Update the user activity state - /// Specifies if the user is online or not + /// Update the user activity status + /// Specifies if the user is online or not /// Accounts + /// api/2.0/mail/accounts/updateuseractivity + /// PUT + /// [Update(@"accounts/updateuseractivity")] public void UpdateUserActivity(bool userOnline) { diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.Alerts.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.Alerts.cs index 24b7c9bd6..3f55907fe 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.Alerts.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.Alerts.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,9 +28,12 @@ public partial class MailApi /// /// Returns a list of all the alerts for the authenticated user. /// - /// List of alerts + /// List of alerts /// Get alerts /// Alerts + /// api/2.0/mail/alert + /// GET + /// list [Read(@"alert")] public IList GetAlerts() { @@ -40,10 +43,12 @@ public IList GetAlerts() /// /// Deletes an alert with the ID specified in the request. /// - /// Alert ID + /// Alert ID /// Deleted alert ID. Same as the request parameter - /// Delete an alert by ID + /// Delete an alert /// Alerts + /// api/2.0/mail/alert/{id} + /// DELETE [Delete(@"alert/{id}")] public long DeleteAlert(long id) { diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.Attachments.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.Attachments.cs index fecdace1f..573db568b 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.Attachments.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.Attachments.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,10 +36,12 @@ public partial class MailApi /// Exports all the message attachments to the folder with documents. /// /// Export message attachments - /// Message ID - /// Folder ID (if empty, the "My documents" folder is used) - /// Count of exported attachments - /// Messages + /// Message ID + /// Folder ID (if this parameter is empty, the "My documents" folder is used) + /// Number of attachments exported + /// Attachments + /// api/2.0/mail/messages/attachments/export + /// PUT [Update(@"messages/attachments/export")] public int ExportAttachmentsToDocuments(int id_message, string id_folder = null) { @@ -60,10 +62,12 @@ public int ExportAttachmentsToDocuments(int id_message, string id_folder = null) /// Exports an attachment with the ID specified in the request to the folder with documents. /// /// Export an attachment - /// Attachment ID - /// Folder ID (if empty, the "My documents" folder is used) + /// Attachment ID + /// Folder ID (if this parameter is empty, the "My documents" folder is used) /// Document ID in the folder with documents - /// Messages + /// Attachments + /// api/2.0/mail/messages/attachment/export + /// PUT [Update(@"messages/attachment/export")] public object ExportAttachmentToDocuments(int id_attachment, string id_folder = null) { @@ -84,12 +88,14 @@ public object ExportAttachmentToDocuments(int id_attachment, string id_folder = /// Adds an attachment to the draft with the ID specified in the request. /// /// Add an attachment - /// Message ID - /// File name - /// File stream - /// File content type - /// Mail attachment - /// Messages + /// Message ID + /// File name + /// File stream + /// File content type + /// Mail attachment + /// Attachments + /// api/2.0/mail/messages/attachment/add + /// POST [Create(@"messages/attachment/add")] public MailAttachmentData AddAttachment(int id_message, string name, Stream file, string content_type) { @@ -103,10 +109,12 @@ public MailAttachmentData AddAttachment(int id_message, string name, Stream file /// Adds an iCal body to the draft with the ID specified in the request. /// /// Add a calendar - /// Message ID - /// iCal body - /// Mail attachment - /// Messages + /// Message ID + /// iCal body + /// Mail attachment + /// Attachments + /// api/2.0/mail/messages/calendarbody/add + /// POST [Create(@"messages/calendarbody/add")] public MailAttachmentData AddCalendarBody(int id_message, string ical_body) { @@ -141,9 +149,11 @@ public MailAttachmentData AddCalendarBody(int id_message, string ical_body) /// /// Download attachments /// - /// Messages - /// Message ID - /// Attachment archive + /// Attachments + /// Message ID + /// Attachment archive + /// api/2.0/mail/messages/attachment/downloadall/{messageId} + /// PUT [Update(@"messages/attachment/downloadall/{messageId}")] public MailOperationStatus DownloadAllAttachments(int messageId) { diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.Autoreply.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.Autoreply.cs index 8aca577d8..f8d2b7ea0 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.Autoreply.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.Autoreply.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Api.Attributes; @@ -30,15 +30,17 @@ public partial class MailApi /// /// Update an autoreply /// Autoreply - /// Mailbox ID - /// New autoreply status - /// If true, then send autoreply only to contacts - /// If true, then the "toDate" field is active - /// New start date of autoreply sending - /// New end date of autoreply sending - /// New autoreply subject - /// New autoreply value in the HTML format - /// Updated autoreply information + /// Mailbox ID + /// New autoreply status + /// Specifies whether to send an autoreply only to the contacts or not + /// Specifies whether to send an autoreply till the specified date or not + /// New start date of autoreply sending + /// New end date of autoreply sending + /// New autoreply subject + /// New autoreply contents in the HTML format + /// api/2.0/mail/autoreply/update/{mailboxId} + /// POST + /// Updated autoreply information [Create(@"autoreply/update/{mailboxId:[0-9]+}")] public MailAutoreplyData UpdateAutoreply(int mailboxId, bool turnOn, bool onlyContacts, bool turnOnToDate, DateTime fromDate, DateTime toDate, string subject, string html) diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.Contacts.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.Contacts.cs index f4c43db34..61bc212ac 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.Contacts.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.Contacts.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,12 +35,15 @@ namespace ASC.Api.Mail public partial class MailApi { /// - /// Searches for contacts by their emails. + /// Searches for contacts by their names, last names, or emails. /// - /// String part of contact name, lastname or email - /// List of strings in the following format: "Name Lastname" email - /// Search contacts by email + /// The string part of the contact name, last name, or email address + /// List of strings in the following format: "Name Last name" email + /// Search contacts /// Contacts + /// api/2.0/mail/emails/search + /// GET + /// list /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. [Read(@"emails/search")] public IEnumerable SearchEmails(string term) @@ -59,14 +62,17 @@ public IEnumerable SearchEmails(string term) /// /// Returns a list of filtered mail contacts by the search query specified in the request. /// - /// Text to search in contact names or emails - /// Contact type - /// Count of contacts on page - /// Page number - /// Sort order by name. String parameter: "ascending" - ascended, "descending" - descended - /// List of filtered contacts + /// Text to search in contact names or emails + /// Contact type + /// Number of contacts on the page + /// Page number + /// Sort order by name. String parameter: "ascending" or "descending" + /// List of filtered contacts /// Get contacts by search query /// Contacts + /// api/2.0/mail/contacts + /// GET + /// list [Read(@"contacts")] public IEnumerable GetContacts(string search, int? contactType, int? pageSize, int fromIndex, string sortorder) @@ -98,12 +104,15 @@ public IEnumerable GetContacts(string search, int? contactType, /// /// Returns a list of mail contacts with the contact information specified in the request. /// - /// Information type - /// Contact data - /// Primary contact or not - /// List of filtered contacts + /// Information type + /// Contact data + /// Contact importance: primary or not + /// List of filtered contacts /// Get contacts by contact information /// Contacts + /// api/2.0/mail/contacts/bycontactinfo + /// GET + /// list [Read(@"contacts/bycontactinfo")] public IEnumerable GetContactsByContactInfo(ContactInfoType infoType, String data, bool? isPrimary) { @@ -117,13 +126,15 @@ public IEnumerable GetContactsByContactInfo(ContactInfoType inf /// /// Creates a mail contact with the parameters specified in the request. /// - /// Contact name - /// Contact description - /// List of emails - /// List of phone numbers - /// Information about created contact + /// Contact name + /// Contact description + /// List of contact emails + /// List of contact phone numbers + /// Information about created contact /// Create a mail contact /// Contacts + /// api/2.0/mail/contact/add + /// POST [Create(@"contact/add")] public MailContactData CreateContact(string name, string description, List emails, List phoneNumbers) { @@ -141,10 +152,13 @@ public MailContactData CreateContact(string name, string description, List /// Removes the mail contacts with the IDs specified in the request. /// - /// List of mail contact IDs + /// List of mail contact IDs /// List of removed mail contact IDs /// Remove mail contacts /// Contacts + /// api/2.0/mail/contacts/remove + /// PUT + /// list [Update(@"contacts/remove")] public IEnumerable RemoveContacts(List ids) { @@ -159,14 +173,16 @@ public IEnumerable RemoveContacts(List ids) /// /// Updates a mail contact with the ID specified in the request. /// - /// Mail contact ID - /// New contact name - /// New contact description - /// New list of emails - /// New list of phone numbers - /// Information about updated contact + /// Mail contact ID + /// New contact name + /// New contact description + /// New list of contact emails + /// New list of contact phone numbers + /// Information about updated contact /// Update a mail contact /// Contacts + /// api/2.0/mail/contact/update + /// PUT [Update(@"contact/update")] public MailContactData UpdateContact(int id, string name, string description, List emails, List phoneNumbers) { @@ -184,13 +200,16 @@ public MailContactData UpdateContact(int id, string name, string description, Li } /// - /// Returns a list of the CRM entities (contact, case or opportunity) linked with a chain. + /// Returns a list of the CRM entities (contact, case, or opportunity) linked with a conversation. /// - /// Message ID. It may be ID of any message included in the chain - /// List of entity information: {entity_id, entity_type, avatar_link, title} + /// Message ID. It may be ID of any message included in the conversation + /// List of entity information: {entity_id, entity_type, avatar_link, title} /// Get the linked CRM entities /// Contacts - ///Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/crm/linked/entities + /// GET + /// list + ///An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Read(@"crm/linked/entities")] public IEnumerable GetLinkedCrmEntitiesInfo(int message_id) { diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.Conversations.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.Conversations.cs index b8eeb8836..658248aaa 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.Conversations.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.Conversations.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,29 +36,32 @@ namespace ASC.Api.Mail public partial class MailApi { /// - /// Returns the conversations with the parameters specified in the request if there were changes since last check date. + /// Returns the conversations with the parameters specified in the request. /// - /// Folder type: 1 - inbox, 2 - sent, 3 - drafts, 4 - trash, 5 - spam - /// Conversation status: unread (true), read (false) or all (null) messages - /// Defines if a conversation has attachments or not: with attachments (true), without attachments (false) or all (null) messages - /// Start search period date - /// End search period date - /// Important conversation or not - /// Mail address from which a letter came - /// Mail address to which a letter came - /// Recipient mailbox ID - /// IDs of tags linked to the target conversation - /// Text to search in conversation body and subject - /// Count of conversations on page - /// Sort order by date: "ascending" - ascended, "descending" - descended - /// Date from which conversation search performed - /// Message from which conversation search performed - /// Conversation has a calendar or not - /// User folder ID - /// Sorting direction of conversation list (previous or next) - /// List of filtered conversations + /// Folder type: 1 - inbox, 2 - sent, 3 - drafts, 4 - trash, 5 - spam + /// Conversation status: unread (true), read (false), or all (null) messages + /// Defines if a conversation has attachments or not: with attachments (true), without attachments (false), or all (null) messages + /// Start search period date + /// End search period date + /// Specifies if only important conversations will be displayed or not + /// Mail address from which the conversation messages were received + /// Mail address to which the conversation messages were sent + /// Recipient mailbox ID + /// IDs of tags linked to the target conversation + /// Text to search in the conversation bodies and subjects + /// Number of conversations on the page + /// Sort order by date: "ascending" or "descending" + /// Start date of conversation search + /// Message from which the conversations are searched + /// Specifies if the conversations have a calendar or not + /// User folder ID + /// Direction sort of the conversation list: true for previous, false for next + /// List of filtered conversations /// Get filtered conversations /// Conversations + /// api/2.0/mail/conversations + /// GET + /// list [Read(@"conversations")] public IEnumerable GetFilteredConversations(int? folder, bool? unread, @@ -128,13 +131,16 @@ public IEnumerable GetFilteredConversations(int? folder, /// Returns a list of messages linked in one chain (conversation). /// /// Get a conversation - /// ID of any message from the chain - /// Loads content of all messages - /// Marks a conversation as read - /// Specifies that HTML for the FCK editor needs to be prepared - /// List of messages linked in one chain + /// ID of any message from the conversation + /// Loads the content of all messages + /// Specifies if a conversation will be marked as read or not + /// Specifies if HTML needs to be prepared for the FCK editor or not + /// List of messages linked in one chain /// Conversations - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. + /// api/2.0/mail/conversation/{id} + /// GET + /// list [Read(@"conversation/{id:[0-9]+}")] public IEnumerable GetConversation(int id, bool? loadAll, bool? markRead, bool? needSanitize) { @@ -178,25 +184,27 @@ public IEnumerable GetConversation(int id, bool? loadAll, bool? /// Returns the previous or next conversation ID filtered with the parameters specified in the request. /// /// Get the previous or next conversation ID - /// Head message ID of the current conversation - /// Defines if the previous or next conversation is needed: "prev" for previous, "next" for next - /// Folder type: 1 - inbox, 2 - sent, 5 - spam - /// Message status: unread (true), read (false) or all (null) messages - /// Defines if a message has attachments or not: with attachments (true), without attachments (false) or all (null) messages - /// Start search period date - /// End search period date - /// Important message or not - /// Mail address from which a letter came - /// Mail address to which a letter came - /// Recipient mailbox ID - /// IDs of tags linked to the target message - /// Text to search in message body and subject - /// Count of messages on page - /// Sort order by date: "ascending" - ascended, "descending" - descended - /// Message has a calendar or not - /// User folder ID + /// Head message ID of the current conversation + /// Defines if the previous or next conversation is needed: "prev" for previous, "next" for next + /// Folder type: 1 - inbox, 2 - sent, 5 - spam + /// Conversation status: unread (true), read (false), or all (null) conversations + /// Defines if a conversation has attachments or not: with attachments (true), without attachments (false) or all (null) messages + /// Start search period date + /// End search period date + /// Specifies if only important conversations will be displayed or not + /// Mail address from which the conversation messages were received + /// Mail address to which the conversation messages were sent + /// Recipient mailbox ID + /// IDs of tags linked to the target conversation + /// Text to search in the conversation bodies and subjects + /// Number of conversations on the page + /// Sort order by date: "ascending" or "descending" + /// Specifies if the conversations have a calendar or not + /// User folder ID /// Head message ID of the previous or next conversation /// Conversations + /// api/2.0/mail/conversation/{id}/{direction} + /// GET [Read(@"conversation/{id:[0-9]+}/{direction:(next|prev)}")] public long GetPrevNextConversationId(int id, string direction, @@ -248,12 +256,15 @@ public long GetPrevNextConversationId(int id, /// /// Moves conversations with the IDs specified in the request to the selected folder. /// - /// List of message IDs from conversations - /// Folder type: 1 - inbox, 2 - sent, 3 - drafts, 4 - trash, 5 - spam - /// User folder ID - /// List of message IDs from conversations - /// Move conversations to the folder + /// List of message IDs from the conversations + /// Folder type: 1 - inbox, 2 - sent, 3 - drafts, 4 - trash, 5 - spam + /// User folder ID + /// List of message IDs from the conversations + /// Move conversations /// Conversations + /// api/2.0/mail/conversations/move + /// PUT + /// list [Update(@"conversations/move")] public IEnumerable MoveConversations(List ids, int folder, uint? userFolderId = null) { @@ -282,13 +293,16 @@ public IEnumerable MoveConversations(List ids, int folder, uint? userF } /// - /// Restores all the conversations previously moved to the specific folders to their original folders. + /// Restores the conversations with the IDs specified in the request to their original folders. /// - /// List of conversation IDs - /// Sends messages to the spam training or not + /// List of conversation IDs + /// Specifies whether to send messages to the spam training or not /// List of restored conversation IDs /// Restore conversations /// Conversations + /// api/2.0/mail/conversations/restore + /// PUT + /// list [Update(@"conversations/restore")] public IEnumerable RestoreConversations(List ids, bool learnSpamTrainer = false) { @@ -311,10 +325,13 @@ public IEnumerable RestoreConversations(List ids, bool learnSpamTraine /// /// Removes conversations with the IDs specified in the request from the folders. /// - /// List of conversation IDs + /// List of conversation IDs /// List of removed conversation IDs /// Remove conversations /// Conversations + /// api/2.0/mail/conversations/remove + /// PUT + /// list [Update(@"conversations/remove")] public IEnumerable RemoveConversations(List ids) { @@ -331,11 +348,14 @@ public IEnumerable RemoveConversations(List ids) /// /// Sets a status to the conversations with the IDs specified in the request. /// - /// List of conversation IDs - /// New status ("read", "unread", "important" or "normal") - /// List of conversations with changed status + /// List of conversation IDs + /// New status ("read", "unread", "important", or "normal") + /// List of conversations with the changed status /// Set a conversation status /// Conversations + /// api/2.0/mail/conversations/mark + /// PUT + /// list [Update(@"conversations/mark")] public IEnumerable MarkConversations(List ids, string status) { @@ -374,14 +394,16 @@ public IEnumerable MarkConversations(List ids, string status) } /// - /// Adds a tag specified in the request to the conversations. + /// Adds a tag specified in the request to the selected conversations. /// - /// Tag ID - /// List of conversation IDs + /// Tag ID + /// List of conversation IDs /// Tag ID /// Add a tag to the conversations /// Conversations - ///Exception happens when the parameters are invalid. Text description contains parameter name and text description. + ///An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. + ///api/2.0/mail/conversations/tag/{tag_id}/set + ///PUT [Update(@"conversations/tag/{tag_id}/set")] public int SetConversationsTag(int tag_id, List messages) { @@ -396,12 +418,14 @@ public int SetConversationsTag(int tag_id, List messages) /// /// Removes a tag specified in the request from the conversations. /// - /// Tag ID - /// List of conversation IDs + /// Tag ID + /// List of conversation IDs /// Tag ID /// Remove a tag from the conversations /// Conversations - ///Exception happens when in parameters is invalid. Text description contains parameter name and text description. + /// api/2.0/mail/conversations/tag/{tag_id}/unset + /// PUT + ///An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Update(@"conversations/tag/{tag_id}/unset")] public int UnsetConversationsTag(int tag_id, List messages) { @@ -414,15 +438,18 @@ public int UnsetConversationsTag(int tag_id, List messages) } /// - /// Links a conversation to CRM. All the new mails will be added to the CRM history. + /// Links a conversation to the CRM entities. All the new mails will be added to the CRM history. /// /// Link a conversation to CRM - /// ID of any message from the chain - /// List of CRM contact entities in the following format: {entity_id: 0, entity_type: 0}. + /// ID of any message from the conversation + /// List of CRM entities in the following format: {entity_id: 0, entity_type: 0}. /// Entity types: 1 - Contact, 2 - Case, 3 - Opportunity /// + /// /// Conversations - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/conversations/crm/link + /// PUT + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Update(@"conversations/crm/link")] public void LinkConversationToCrm(int id_message, IEnumerable crm_contact_ids) { @@ -442,12 +469,15 @@ public void LinkConversationToCrm(int id_message, IEnumerable cr /// Marks a conversation as CRM linked. All the new mails will be added to the CRM history. /// /// Mark a conversation as CRM linked - /// ID of any messages from the chain - /// List of CRM contact entities in the following format: {entity_id: 0, entity_type: 0}. + /// ID of any messages from the conversation + /// List of CRM entities in the following format: {entity_id: 0, entity_type: 0}. /// Entity types: 1 - Contact, 2 - Case, 3 - Opportunity /// + /// /// Conversations - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/conversations/crm/mark + /// PUT + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Update(@"conversations/crm/mark")] public void MarkConversationAsCrmLinked(int id_message, IEnumerable crm_contact_ids) { @@ -463,12 +493,15 @@ public void MarkConversationAsCrmLinked(int id_message, IEnumerable /// Unmark a conversation as CRM linked - /// ID of any message from the chain - /// List of CRM contact entities in the following format: {entity_id: 0, entity_type: 0}. + /// ID of any messages from the conversation + /// List of CRM entities in the following format: {entity_id: 0, entity_type: 0}. /// Entity types: 1 - Contact, 2 - Case, 3 - Opportunity /// + /// /// Conversations - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/conversations/crm/unmark + /// PUT + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Update(@"conversations/crm/unmark")] public void UnmarkConversationAsCrmLinked(int id_message, IEnumerable crm_contact_ids) { @@ -484,10 +517,12 @@ public void UnmarkConversationAsCrmLinked(int id_message, IEnumerable /// Check a conversation CRM status - /// ID of any message from the chain - /// Conversation CRM status + /// ID of any messages from the conversation + /// Conversation CRM status /// Conversations - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/conversations/link/crm/status + /// GET + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Read(@"conversations/link/crm/status")] public MailCrmStatus IsConversationLinkedWithCrm(int message_id) { diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.Filters.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.Filters.cs index 89041b041..058894cc6 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.Filters.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.Filters.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Threading; @@ -31,9 +31,12 @@ public partial class MailApi /// /// Returns a list of filters used in all the mails. /// - /// List of filters which is represented as JSON + /// List of filters which is represented as JSON /// Get filters /// Filters + /// api/2.0/mail/filters + /// GET + /// list [Read(@"filters")] public IEnumerable GetFilters() { @@ -44,11 +47,13 @@ public IEnumerable GetFilters() /// /// Creates a new filter with the parameters specified in the request. /// - /// Filter parameters: ID, name, position, enabled, conditions, actions, options - /// Filter + /// Filter parameters: ID, name, position, enabled, conditions, actions, options + /// Filter /// Create a filter /// Filters - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/filters + /// POST + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Create(@"filters")] public MailSieveFilterData CreateFilter(MailSieveFilterData filter) { @@ -60,11 +65,13 @@ public MailSieveFilterData CreateFilter(MailSieveFilterData filter) /// /// Updates the selected filter with the parameters specified in the request. /// - /// New filter parameters: ID, name, position, enabled, conditions, actions, options - /// Updated filter + /// New filter parameters: ID, name, position, enabled, conditions, actions, options + /// Updated filter /// Update a filter /// Filters - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/filters + /// PUT + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Update(@"filters")] public MailSieveFilterData UpdateFilter(MailSieveFilterData filter) { @@ -76,11 +83,13 @@ public MailSieveFilterData UpdateFilter(MailSieveFilterData filter) /// /// Deletes a filter with the ID specified in the request. /// - /// Filter ID + /// Filter ID /// Filter ID /// Delete a filter /// Filters - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/filters/{id} + /// DELETE + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Delete(@"filters/{id}")] public int DeleteFilter(int id) { @@ -91,14 +100,17 @@ public int DeleteFilter(int id) /// /// Checks the results of a filter specified in the request. /// - /// Filter parameters: ID, name, position, enabled, conditions, actions, options - /// Page number - /// Number of messages on the page - /// List of messages + /// Filter parameters: ID, name, position, enabled, conditions, actions, options + /// Page number + /// Number of messages on the page + /// List of messages /// Check filter results /// Filters - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. - [Read(@"filters/check")] + /// api/2.0/mail/filters/check + /// POST + /// list + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. + [Create(@"filters/check")] public List CheckFilter(MailSieveFilterData filter, int? page, int? pageSize) { if (!page.HasValue) @@ -118,11 +130,13 @@ public List CheckFilter(MailSieveFilterData filter, int? page, /// /// Applies a filter to the existing messages. /// - /// Filter ID - /// Mail operation status + /// Filter ID + /// Mail operation status /// Apply a filter /// Filters - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/filters/{id}/apply + /// GET + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Read(@"filters/{id}/apply")] public MailOperationStatus ApplyFilter(int id) { diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.Folders.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.Folders.cs index feeaf50fb..2353db2b9 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.Folders.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.Folders.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ using ASC.Api.Attributes; using ASC.Mail; using ASC.Mail.Core.Engine.Operations.Base; +using ASC.Mail.Core.Entities; using ASC.Mail.Data.Contracts; using ASC.Mail.Enums; using ASC.Mail.Exceptions; @@ -36,16 +37,19 @@ public partial class MailApi /// /// Returns a list of default folders. /// - /// List of default folders + /// List of default folders /// Get the default folders /// Folders + /// api/2.0/mail/folders + /// GET + /// list [Read(@"folders")] public IEnumerable GetFolders() { if (!Defines.IsSignalRAvailable) MailEngineFactory.AccountEngine.SetAccountsActivity(); - ActionEngine.SendUserActivity(new List()); + ActionEngine.SendUserAlive(-1, null); return MailEngineFactory.FolderEngine.GetFolders() .Where(f => f.id != FolderType.Sending) @@ -56,10 +60,12 @@ public IEnumerable GetFolders() /// /// Removes all the messages from the trash or spam folder. /// - /// Folder ID: 4 - Trash, 5 - Spam + /// Folder ID: 4 - Trash, 5 - Spam /// Remove folder messages /// Folders /// Folder ID + /// api/2.0/mail/folders/{folderid}/messages + /// DELETE [Delete(@"folders/{folderid:[0-9]+}/messages")] public int RemoveFolderMessages(int folderid) { @@ -67,7 +73,9 @@ public int RemoveFolderMessages(int folderid) if (folderType == FolderType.Trash || folderType == FolderType.Spam) { - MailEngineFactory.MessageEngine.SetRemoved(folderType); + var idsToImapSync = MailEngineFactory.MessageEngine.SetRemoved(folderType); + + ActionEngine.SendUserActivity(idsToImapSync, MailUserAction.SetAsDeleted); } return folderid; @@ -80,6 +88,8 @@ public int RemoveFolderMessages(int folderid) /// Operation status /// Recalculate folders /// Folders + /// api/2.0/mail/folders/recalculate + /// GET /// false [Read(@"folders/recalculate")] public MailOperationStatus RecalculateFolders() @@ -90,11 +100,14 @@ public MailOperationStatus RecalculateFolders() /// /// Returns a list of user folders with the IDs specified in the request. /// - /// List of folder IDs - /// Parent folder ID (root level equals to 0) - /// List of folders + /// List of folder IDs + /// Parent folder ID (root level is equal to 0) + /// List of folders /// Get the user folders /// Folders + /// api/2.0/mail/userfolders + /// GET + /// list [Read(@"userfolders")] public IEnumerable GetUserFolders(List ids, uint? parentId) { @@ -105,12 +118,14 @@ public IEnumerable GetUserFolders(List ids, uint? pare /// /// Creates a user folder with the name specified in the request. /// - /// Folder name - /// Parent folder ID (default = 0) - /// List of folders + /// Folder name + /// Parent folder ID (root level is equal to 0) + /// Folder information /// Create a folder /// Folders - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/userfolders + /// POST + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Create(@"userfolders")] public MailUserFolderData CreateUserFolder(string name, uint parentId = 0) { @@ -121,7 +136,7 @@ public MailUserFolderData CreateUserFolder(string name, uint parentId = 0) { var userFolder = MailEngineFactory.UserFolderEngine.Create(name, parentId); - ActionEngine.SendUserActivity(name, ASC.Mail.Core.Entities.MailUserAction.CreateFolder); + ActionEngine.SendUserActivity(new List() { (int)userFolder.Id }, MailUserAction.CreateFolder); return userFolder; } @@ -143,13 +158,15 @@ public MailUserFolderData CreateUserFolder(string name, uint parentId = 0) /// /// Updates a user folder with the parameters specified in the request. /// - /// Folder ID - /// New folder name - /// New parent folder ID (default = 0) - /// List of folders + /// Folder ID + /// New folder name + /// New parent folder ID (root level is equal to 0) + /// Folder information /// Update a folder /// Folders - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/userfolders/{id} + /// PUT + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Update(@"userfolders/{id}")] public MailUserFolderData UpdateUserFolder(uint id, string name, uint? parentId = null) { @@ -159,6 +176,9 @@ public MailUserFolderData UpdateUserFolder(uint id, string name, uint? parentId try { var userFolder = MailEngineFactory.UserFolderEngine.Update(id, name, parentId); + + ActionEngine.SendActivityUserFolderUpdate(id, name, parentId); + return userFolder; } catch (AlreadyExistsFolderException) @@ -179,11 +199,13 @@ public MailUserFolderData UpdateUserFolder(uint id, string name, uint? parentId /// /// Deletes a user folder with the ID specified in the request. /// - /// Folder ID + /// Folder ID /// Delete a folder /// Folders - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. - /// Operation status + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. + /// Operation status + /// api/2.0/mail/userfolders/{id} + /// DELETE [Delete(@"userfolders/{id}")] public MailOperationStatus DeleteUserFolder(uint id) { @@ -192,6 +214,8 @@ public MailOperationStatus DeleteUserFolder(uint id) try { + ActionEngine.SendUserActivity(new List(), MailUserAction.DeleteUserFolder, userFolderId: id); + return MailEngineFactory.OperationEngine.RemoveUserFolder(id, TranslateMailOperationStatus); } catch (Exception) @@ -203,10 +227,12 @@ public MailOperationStatus DeleteUserFolder(uint id) /// /// Returns a user folder by the mail ID specified in the request. /// - /// Mail ID - /// User folder + /// Mail ID + /// User folder /// Get a folder by mail ID /// Folders + /// api/2.0/mail/userfolders/bymail + /// GET [Read(@"userfolders/bymail")] public MailUserFolderData GetUserFolderByMailId(uint mailId) { diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.HelpCenter.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.HelpCenter.cs index 20cc21dc5..5cfe5ba85 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.HelpCenter.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.HelpCenter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,11 +25,13 @@ namespace ASC.Api.Mail public partial class MailApi { /// - /// Returns the help center page HTML. + /// Returns the Help Center page HTML. /// - /// String with the help center page HTML - /// Get help center page HTML - /// Help center + /// String with the Help Center page HTML + /// Get the Help Center page HTML + /// Help Center + /// api/2.0/mail/helpcenter + /// GET [Read(@"helpcenter")] public string GetHelpCenterHtml() { diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.Images.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.Images.cs index dfd629d15..e1ba5ca33 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.Images.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.Images.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,6 +30,9 @@ public partial class MailApi /// List of addresses. Email adresses are represented as strings in the name@domain format /// Get trusted image addresses /// Images + /// api/2.0/mail/display_images/addresses + /// GET + /// list [Read(@"display_images/addresses")] public IEnumerable GetDisplayImagesAddresses() { @@ -37,13 +40,15 @@ public IEnumerable GetDisplayImagesAddresses() } /// - /// Adds the image address specified in the request to the list of trusted image addresses. + /// Adds an image address specified in the request to the list of trusted image addresses. /// - /// Image address + /// Image address /// Added image address /// Add the trusted image address - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. /// Images + /// api/2.0/mail/display_images/address + /// POST [Create(@"display_images/address")] public string AddDisplayImagesAddress(string address) { @@ -53,13 +58,15 @@ public string AddDisplayImagesAddress(string address) } /// - /// Removes the image address specified in the request from the list of trusted image addresses. + /// Removes an image address specified in the request from the list of trusted image addresses. /// - /// Image address + /// Image address /// Removed image address /// Remove the trusted image address - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. /// Images + /// api/2.0/mail/display_images/address + /// DELETE [Delete(@"display_images/address")] public string RemovevDisplayImagesAddress(string address) { diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.MailService.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.MailService.cs index 59f7a0019..581164d67 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.MailService.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.MailService.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Linq; using System.Net.Sockets; @@ -36,6 +36,8 @@ public partial class MailApi /// Mail server information /// Get the mail server information /// Mail service + /// api/2.0/mail/mailservice/get + /// GET /// false [Read("mailservice/get")] public object GetMailServerInfo() @@ -46,14 +48,16 @@ public object GetMailServerInfo() /// /// Connects the mail server to the portal. /// - /// Mail server IP - /// Mail server SQL IP - /// Mail server database - /// User - /// Password + /// Mail server IP + /// Mail server SQL IP + /// Mail server database + /// User + /// Password /// Mail server information /// Connect the mail server /// Mail service + /// api/2.0/mail/mailservice/connect + /// POST /// false [Create("mailservice/connect")] public object ConnectMailServer(string ip, string sqlip, string database, string user, string password) @@ -115,16 +119,18 @@ public object ConnectMailServer(string ip, string sqlip, string database, string /// /// Saves the mail server information specified in the request. /// - /// Mail server IP - /// Mail server SQL IP - /// Mail server database - /// User - /// Password - /// Token - /// Mail server host + /// Mail server IP + /// Mail server SQL IP + /// Mail server database + /// User + /// Password + /// Token + /// Mail server host /// Operation result /// Save the mail server information /// Mail service + /// api/2.0/mail/mailservice/save + /// POST /// false [Create("mailservice/save")] public object SaveMailServerInfo(string ip, string sqlip, string database, string user, string password, string token, string host) @@ -177,13 +183,15 @@ public object SaveMailServerInfo(string ip, string sqlip, string database, strin /// /// Connects the mail server and saves its information. /// - /// Mail server host - /// Mail server database - /// User - /// Password + /// Mail server host + /// Mail server database + /// User + /// Password /// Operation result /// Connect the mail server and save its information /// Mail service + /// api/2.0/mail/mailservice/connectandsave + /// POST /// false [Create("mailservice/connectandsave")] public object ConnectAndSaveMailServerInfo(string host, string database, string user, string password) @@ -242,14 +250,16 @@ public object ConnectAndSaveMailServerInfo(string host, string database, string /// /// Connects the mail server and saves its partitional information. /// - /// Mail server host - /// MySQL host - /// MySQL database - /// MySQL user - /// MySQL password + /// Mail server host + /// MySQL host + /// MySQL database + /// MySQL user + /// MySQL password /// Operation result /// Connect the mail server and save its partitional information /// Mail service + /// api/2.0/mail/mailservice/connectandsavepartitional + /// POST /// false [Create("mailservice/connectandsavepartitional")] public object ConnectAndSavePartitionalMailServerInfo(string mailHost, string mysqlHost, string mysqlDatabase, string mysqlUser, string mysqlPassword) diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.Messages.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.Messages.cs index c0b6f8cf4..ab1aa97f6 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.Messages.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.Messages.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,27 +43,30 @@ namespace ASC.Api.Mail public partial class MailApi { /// - /// Returns the messages with the parameters specified in the request if there were changes since last check date. + /// Returns the messages with the parameters specified in the request. /// - /// Folder ID - /// Message status: unread (true), read (false) or all (null) messages - /// Defines if a message has attachments or not: with attachments (true), without attachments (false) or all (null) messages - /// Start search period date - /// End search period date - /// Important message or not - /// Mail address from which a letter came - /// Mail address to which a letter came - /// Recipient mailbox ID - /// IDs of tags linked to the target message - /// Text to search in message body and subject - /// Page number - /// Message has a calendar or not - /// Count of messages on page - /// User folder ID - /// Sort order by date: "ascending" - ascended, "descending" - descended - /// List of filtered messages + /// Folder ID + /// Message status: unread (true), read (false), or all (null) messages + /// Defines if a message has attachments or not: with attachments (true), without attachments (false), or all (null) messages + /// Start search period date + /// End search period date + /// Specifies if only important messages will be displayed or not + /// Mail address from which a letter was received + /// Mail address to which a letter was sent + /// Recipient mailbox ID + /// IDs of tags linked to the target messages + /// Text to search in the message bodies and subjects + /// Page number + /// Specifies if the messages have a calendar or not + /// Number of messages on the page + /// User folder ID + /// Sort order by date: "ascending" or "descending" + /// List of filtered messages /// Get filtered messages /// Messages + /// api/2.0/mail/messages + /// GET + /// list [Read(@"messages")] public IEnumerable GetFilteredMessages(int? folder, bool? unread, @@ -121,15 +124,17 @@ public IEnumerable GetFilteredMessages(int? folder, /// /// Returns the detailed information about a message with the ID specified in the request. /// - /// Message ID - /// Unblocks suspicious content or not - /// Specifies if HTML for the FCK editor needs to be prepared or not - /// Marks a message as read or not - /// Message information + /// Message ID + /// Specifies whether to display images sent in a message or not + /// Specifies if HTML needs to be prepared for the FCK editor or not + /// Specifies if a message will be marked as read or not + /// Message information /// Get a message /// Messages - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. - /// Exception happens when message with the specified ID wasn't found. + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. + /// The exception occurs when a message with the specified ID wasn't found. + /// api/2.0/mail/messages/{id} + /// GET [Read(@"messages/{id:[0-9]+}")] public MailMessage GetMessage(int id, bool? loadImages, bool? needSanitize, bool? markRead) { @@ -195,10 +200,13 @@ public MailMessage GetMessage(int id, bool? loadImages, bool? needSanitize, bool /// /// Reassigns drafts/templates to the selected email. /// - /// Folder ID - /// Email to which messages will be reassigned + /// Folder ID + /// Email to which messages will be reassigned /// Reassign drafts/templates /// Messages + /// api/2.0/mail/messages/reassign + /// PUT + /// [Update(@"messages/reassign")] public void ReassignMailMessages(int folder, string email) { @@ -243,31 +251,35 @@ public void ReassignMailMessages(int folder, string email) message.TagIds, message.HtmlBody, message.Attachments, message.CalendarEventIcs); } } + + if (messages.Any()) ActionEngine.SendUserActivity(messages.Select(x => x.Id).ToList(), MailUserAction.UpdateDrafts); } /// - /// Returns the previous or next message ID filtered with the parameters specified in the request.. + /// Returns the previous or next message ID filtered with the parameters specified in the request. /// - /// Head message ID of current conversation - /// Defines if the previous or next conversation is needed: "prev" for previous, "next" for next - /// Folder type: 1 - inbox, 2 - sent, 5 - spam - /// Message status: unread (true), read (false) or all (null) messages - /// Defines if a conversation has attachments or not: with attachments (true), without attachments (false) or all (null) messages - /// Start search period date - /// End search period date - /// Important message or not - /// Mail address from which a letter came - /// Mail address to which a letter came - /// Recipient mailbox ID - /// IDs of tags linked to the target message - /// Text to search in message body and subject - /// Count of messages on page - /// Sort order by date: "ascending" - ascended, "descending" - descended - /// Message has a calendar or not - /// User folder ID + /// Head message ID of the current conversation + /// Defines if the previous or next message is needed: "prev" for previous, "next" for next + /// Folder type: 1 - inbox, 2 - sent, 5 - spam + /// Message status: unread (true), read (false), or all (null) messages + /// Defines if a message has attachments or not: with attachments (true), without attachments (false), or all (null) messages + /// Start search period date + /// End search period date + /// Specifies if only important messages will be displayed or not + /// Mail address from which a letter was received + /// Mail address to which a letter was sent + /// Recipient mailbox ID + /// IDs of tags linked to the target message + /// Text to search in the message bodies and subjects + /// Number of messages on the page + /// Sort order by date: "ascending" or "descending" + /// Specifies if the messages have a calendar or not + /// User folder ID /// Previous or next message ID /// Get the previous or next message ID /// Messages + /// GET + /// api/2.0/mail/messages/{id}/{direction} [Read(@"messages/{id:[0-9]+}/{direction:(next|prev)}")] public long GetPrevNextMessageId(int id, string direction, @@ -322,12 +334,14 @@ public long GetPrevNextMessageId(int id, /// /// Deletes the selected attachment from the message with the ID specified in the request. /// - /// Message ID - /// Attachment ID + /// Message ID + /// Attachment ID /// The message ID which attachment was removed - /// Delete an attachment from the message - /// Messages - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// Delete an attachment + /// Attachments + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. + /// api/2.0/mail/messages/{messageid}/attachments/{attachmentid} + /// DELETE [Delete(@"messages/{messageid:[0-9]+}/attachments/{attachmentid:[0-9]+}")] public int DeleteMessageAttachment(int messageid, int attachmentid) { @@ -346,11 +360,14 @@ public int DeleteMessageAttachment(int messageid, int attachmentid) /// /// Sets a status to the messages with the IDs specified in the request. /// - /// List of message IDs - /// Message status: "read", "unread", "important" and "normal" + /// List of message IDs + /// Message status: "read", "unread", "important", or "normal" /// List of messages with changed status /// Set a message status /// Messages + /// api/2.0/mail/messages/mark + /// PUT + /// list [Update(@"messages/mark")] public IEnumerable MarkMessages(List ids, string status) { @@ -395,10 +412,13 @@ public IEnumerable MarkMessages(List ids, string status) /// /// Restores the messages with the IDs specified in the request to their original folders. /// - /// List of message IDs + /// List of message IDs /// List of restored message IDs /// Restore messages /// Messages + /// api/2.0/mail/messages/restore + /// PUT + /// list [Update(@"messages/restore")] public IEnumerable RestoreMessages(List ids) { @@ -409,18 +429,23 @@ public IEnumerable RestoreMessages(List ids) MailEngineFactory.OperationEngine.ApplyFilters(ids); + ActionEngine.SendUserActivity(ids, MailUserAction.Restore); + return ids; } /// /// Moves the messages to a folder with the ID specified in the request. /// - /// List of message IDs - /// Folder type: 1 - inbox, 2 - sent, 3 - drafts, 4 - trash, 5 - spam - /// User folder ID + /// List of message IDs + /// Folder type: 1 - inbox, 2 - sent, 3 - drafts, 4 - trash, 5 - spam + /// User folder ID /// List of moved message IDs /// Move messages to the folder /// Messages + /// api/2.0/mail/messages/move + /// PUT + /// list [Update(@"messages/move")] public IEnumerable MoveMessages(List ids, int folder, uint? userFolderId = null) { @@ -445,25 +470,27 @@ public IEnumerable MoveMessages(List ids, int folder, uint? userFolder /// /// Sends a message with the ID specified in the request. /// - /// Message ID which will be sent or 0 - /// Mail address from which a letter will be sent. - /// List of mail addresses to which a letter will be sent. - /// List of "cc" mail addresses. - /// List of "bcc" mail addresses. - /// Message ID to which this message replies - /// Important message or not: true - important, false - not important - /// Message subject - /// List of tag IDs added to the message - /// Message body as HTML string - /// List of message attachments - /// Share mode for the links of attached files - /// Calendar event in the iCal format for sending - /// Specifies that this message is autoreply or not - /// Adds a request with the Return-Receipt-To header - /// Adds a request with the Disposition-Notification-To header + /// Message ID which will be sent or 0 + /// Mail address from which a letter will be sent. + /// List of mail addresses to which a letter will be sent. + /// List of Cc (carbon copy) mail addresses. + /// List of Bcc (blind carbon copy) mail addresses. + /// Message ID to which this message is replying to + /// Specifies if this message is important or not: true - important, false - not important + /// Message subject + /// List of tag IDs added to the message + /// Message body as the HTML string + /// List of message attachments + /// Sharing mode for the links of the attached files + /// Calendar event in the iCal format for sending + /// Specifies if this message is autoreply or not + /// Specifies whether to add a request with the Return-Receipt-To header or not + /// Specifies whether to add a request with the Disposition-Notification-To header or not /// Message ID /// Send a message /// Messages + /// api/2.0/mail/messages/send + /// PUT [Update(@"messages/send")] public long SendMessage(int id, string from, @@ -499,8 +526,12 @@ public long SendMessage(int id, MailApiResource.DeliveryFailureFAQInformation, MailApiResource.DeliveryFailureReason); - return MailEngineFactory.DraftEngine.Send(id, from, to, cc, bcc, mimeReplyToId, importance, subject, tags, body, + long result = MailEngineFactory.DraftEngine.Send(id, from, to, cc, bcc, mimeReplyToId, importance, subject, tags, body, attachments, fileLinksShareMode, calendarIcs, isAutoreply, requestReceipt, requestRead, daemonLabels); + + ActionEngine.SendUserActivity(new List() { id }, MailUserAction.SendDraft); + + return result; } catch (DraftException ex) { @@ -536,6 +567,19 @@ public long SendMessage(int id, } } + /// + /// Sends a message quickly specifying the sender, recipients, message subject, and message body. + /// + /// Mail address from which a letter will be sent. + /// List of mail addresses to which a letter will be sent. + /// Message subject + /// Message body as the HTML string + /// Specifies if the receipt is returned to the sender or not + /// Boolean value: true if a message was sent successfully + /// Send a message quickly + /// Messages + /// api/2.0/mail/messages/simpleSend + /// PUT [Update(@"messages/simpleSend")] public bool SimpleSend( string from, @@ -571,21 +615,23 @@ public bool SimpleSend( /// /// Saves a message with the ID specified in the request. /// - /// Message ID which will be saved or 0 - /// Mail address from which a letter will be sent. - /// List of mail addresses to which the letter will be sent. - /// List of "cc" mail addresses. - /// List of "bcc" mail addresses. - /// Message ID to which this message replies - /// Important message or not: true - important, false - not important - /// Message subject - /// List of tag IDs added to the message - /// Message body as HTML string - /// List of message attachments - /// Calendar event in the iCal format for sending - /// Saved message ID + /// Message ID which will be saved or 0 + /// Mail address from which a letter will be sent. + /// List of mail addresses to which a letter will be sent. + /// List of Cc (carbon copy) mail addresses. + /// List of Bcc (blind carbon copy) mail addresses. + /// Message ID to which this message is replying to + /// Specifies if this message is important or not: true - important, false - not important + /// Message subject + /// List of tag IDs added to the message + /// Message body as the HTML string + /// List of message attachments + /// Calendar event in the iCal format for sending + /// Saved message /// Save a message /// Messages + /// api/2.0/mail/messages/save + /// PUT /// false [Obsolete] [Update(@"messages/save")] @@ -619,21 +665,23 @@ public MailMessage SaveMessageOld(int id, /// /// Saves a message with the ID specified in the request as a draft. /// - /// Message ID which will be saved or 0 - /// Mail address from which a letter will be sent. - /// List of mail addresses to which a letter will be sent. - /// List of "cc" mail addresses. - /// List of "bcc" mail addresses. - /// Message ID to which this message replies - /// Important message or not: true - important, false - not important - /// Message subject - /// List of tag IDs added to the message - /// Message body as HTML string - /// List of message attachments - /// Calendar event in the iCal format for sending - /// Saved message ID - /// Save a message as a draft + /// Message ID which will be saved or 0 + /// Mail address from which a letter will be sent. + /// List of mail addresses to which a letter will be sent. + /// List of Cc (carbon copy) mail addresses. + /// List of Bcc (blind carbon copy) mail addresses. + /// Message ID to which this message is replying to + /// Specifies if this message is important or not: true - important, false - not important + /// Message subject + /// List of tag IDs added to the message + /// Message body as the HTML string + /// List of message attachments + /// Calendar event in the iCal format for sending + /// Saved message + /// Save a draft message /// Messages + /// api/2.0/mail/drafts/save + /// PUT [Update(@"drafts/save")] public MailMessage SaveMessage(int id, string from, @@ -659,8 +707,15 @@ public MailMessage SaveMessage(int id, try { - return MailEngineFactory.DraftEngine.Save(id, from, to, cc, bcc, mimeReplyToId, importance, subject, tags, + var MailMessage = MailEngineFactory.DraftEngine.Save(id, from, to, cc, bcc, mimeReplyToId, importance, subject, tags, body, attachments, calendarIcs); + + if (MailMessage != null) + { + ActionEngine.SendUserActivity(new List() { MailMessage.Id }, MailUserAction.UpdateDrafts); + } + + return MailMessage; } catch (DraftException ex) { @@ -690,23 +745,25 @@ public MailMessage SaveMessage(int id, } /// - /// Saves a template with the ID specified in the request. + /// Saves a template message with the ID specified in the request. /// - /// Template ID which will be saved - /// Mail address from which a letter will be sent. - /// List of mail addresses to which a letter will be sent. - /// List of "cc" mail addresses. - /// List of "bcc" mail addresses. - /// Message ID to which this message replies - /// Important message or not: true - important, false - not important - /// Message subject - /// List of tag IDs added to the message - /// Message body as HTML string - /// List of message attachments - /// Calendar event in the iCal format for sending - /// Saved template ID - /// Save a message as a template - /// Templates + /// Template ID which will be saved + /// Mail address from which a letter will be sent. + /// List of mail addresses to which a letter will be sent. + /// List of Cc (carbon copy) mail addresses. + /// List of Bcc (blind carbon copy) mail addresses. + /// Message ID to which this message is replying to + /// Specifies if this message is important or not: true - important, false - not important + /// Message subject + /// List of tag IDs added to the message + /// Message body as the HTML string + /// List of message attachments + /// Calendar event in the iCal format for sending + /// Saved template message + /// Save a template message + /// Messages + /// api/2.0/mail/templates/save + /// PUT [Update(@"templates/save")] public MailMessage SaveTemplate(int id, string from, List to, List cc, List bcc, string mimeReplyToId, bool importance, string subject, List tags, string body, List attachments, string calendarIcs) @@ -752,10 +809,13 @@ public MailMessage SaveTemplate(int id, string from, List to, List /// Removes messages with the IDs specified in the request. /// - /// List of message IDs + /// List of message IDs /// List of removed message IDs /// Remove messages /// Messages + /// api/2.0/mail/messages/remove + /// PUT + /// list [Update(@"messages/remove")] public IEnumerable RemoveMessages(List ids) { @@ -772,9 +832,11 @@ public IEnumerable RemoveMessages(List ids) /// /// Returns a message template - empty message in the JSON format. /// - /// Empty message in the JSON format + /// Empty message in the JSON format /// Get a message template /// Messages + /// api/2.0/mail/messages/template + /// GET [Read(@"messages/template")] public MailMessage GetMessageTemplate() { @@ -782,16 +844,18 @@ public MailMessage GetMessageTemplate() } /// - /// Attaches the Teamlab document to the message with the ID specified in the request. + /// Attaches a document to the message with the ID specified in the request. /// - /// Message ID - /// Teamlab document ID - /// Teamlab document version - /// Specifies if this message needs to be saved as a template or not - /// Attached document - /// Attach the Teamlab document - /// Messages - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// Message ID + /// Document ID + /// Document version + /// Specifies if this document needs to be saved to a template message or not + /// Attached document + /// Attach a document + /// Attachments + /// api/2.0/mail/messages/{id}/document + /// POST + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Create(@"messages/{id:[0-9]+}/document")] public MailAttachmentData AttachDocument(int id, string fileId, string version, bool needSaveToTemp) { @@ -843,12 +907,15 @@ public MailAttachmentData AttachDocument(int id, string fileId, string version, /// /// Exports a mail to the CRM relation history for some entities. /// - /// ID of any message from the chain - /// List of CRM contact entity IDs in the following format: {entity_id: 0, entity_type: 0}. + /// ID of any message from the chain + /// List of CRM contact entity IDs in the following format: {entity_id: 0, entity_type: 0}. /// Entity types: 1 - Contact, 2 - Case, 3 - Opportunity /// /// Export a message to CRM /// Messages + /// api/2.0/mail/messages/crm/export + /// PUT + /// [Update(@"messages/crm/export")] public void ExportMessageToCrm(int id_message, IEnumerable crm_contact_ids) { diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.Settings.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.Settings.cs index ff3bf1dd0..c76b33385 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.Settings.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.Settings.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.Api.Attributes; using ASC.Mail.Data.Contracts; @@ -23,11 +23,13 @@ namespace ASC.Api.Mail public partial class MailApi { /// - /// Returns the common settings. + /// Returns the mail common settings. /// - /// Common settings - /// Get common settings + /// Mail common settings + /// Get the mail common settings /// Settings + /// api/2.0/mail/settings + /// GET [Read(@"settings")] public MailCommonSettings GetCommonSettings() { @@ -36,11 +38,13 @@ public MailCommonSettings GetCommonSettings() } /// - /// Returns the "Enable conversations" flag. + /// Returns a flag that specifies whether to group messages into conversations or not. /// - /// Boolean value: True - the flag is enabled, False - the flag is disabled - /// Get the "Enable conversations" flag + /// Boolean value: true - the flag is enabled, false - the flag is disabled + /// Get the "Enable Conversations" flag /// Settings + /// api/2.0/mail/settings/conversationsEnabled + /// GET [Read(@"settings/conversationsEnabled")] public bool GetEnableConversationFlag() { @@ -49,11 +53,14 @@ public bool GetEnableConversationFlag() } /// - /// Sets the "Enable Conversations" flag. + /// Sets a flag that specifies whether to group messages into conversations or not. /// - /// Specifies if the "Enable Conversations" flag is enabled or not + /// Specifies whether to group messages into conversations or not /// Set the "Enable Conversations" flag /// Settings + /// api/2.0/mail/settings/conversationsEnabled + /// PUT + /// [Update(@"settings/conversationsEnabled")] public void SetEnableConversationFlag(bool enabled) { @@ -61,11 +68,13 @@ public void SetEnableConversationFlag(bool enabled) } /// - /// Returns the "Always display images" flag. + /// Returns a flag that specifies whether to display external images in the messages or not. /// - /// Boolean value: True - the flag is enabled, False - the flag is disabled - /// Get the "Always display images" flag + /// Boolean value: true - the flag is enabled, false - the flag is disabled + /// Get the "Always display external images" flag /// Settings + /// api/2.0/mail/settings/alwaysDisplayImages + /// GET [Read(@"settings/alwaysDisplayImages")] public bool GetAlwaysDisplayImagesFlag() { @@ -74,11 +83,14 @@ public bool GetAlwaysDisplayImagesFlag() } /// - /// Sets the "Always display images" flag. + /// Sets a flag that specifies whether to display external images in the messages or not. /// - /// Specifies if the "Always display images" flag is enabled or not - /// Set the "Always display images" flag + /// Specifies whether to display external images in the messages or not + /// Set the "Always display external images" flag /// Settings + /// api/2.0/mail/settings/alwaysDisplayImages + /// PUT + /// [Update(@"settings/alwaysDisplayImages")] public void SetAlwaysDisplayImagesFlag(bool enabled) { @@ -86,11 +98,13 @@ public void SetAlwaysDisplayImagesFlag(bool enabled) } /// - /// Returns the "Cache unread messages" flag. + /// Returns a flag that specifies whether to cache unread messages or not. /// - /// Boolean value: True - the flag is enabled, False - the flag is disabled + /// Boolean value: true - the flag is enabled, false - the flag is disabled /// Get the "Cache unread messages" flag /// Settings + /// api/2.0/mail/settings/cacheMessagesEnabled + /// GET [Read(@"settings/cacheMessagesEnabled")] public bool GetCacheUnreadMessagesFlag() { @@ -103,11 +117,14 @@ public bool GetCacheUnreadMessagesFlag() } /// - /// Sets the "Cache unread messages" flag. + /// Sets a flag that specifies whether to cache unread messages or not. /// - /// Specifies if the "Cache unread messages" flag is enabled or not + /// Specifies whether to cache unread messages or not /// Set the "Cache unread messages" flag /// Settings + /// api/2.0/mail/settings/cacheMessagesEnabled + /// PUT + /// [Update(@"settings/cacheMessagesEnabled")] public void SetCacheUnreadMessagesFlag(bool enabled) { @@ -115,11 +132,13 @@ public void SetCacheUnreadMessagesFlag(bool enabled) } /// - /// Returns the "Go next after move" flag. + /// Returns a flag that specifies whether to go to the next message after moving/deleting the currently viewed or return to the current folder. /// - /// Boolean value: True - the flag is enabled, False - the flag is disabled + /// Boolean value: true - the flag is enabled, false - the flag is disabled /// Get the "Go next after move" flag /// Settings + /// api/2.0/mail/settings/goNextAfterMoveEnabled + /// GET [Read(@"settings/goNextAfterMoveEnabled")] public bool GetEnableGoNextAfterMoveFlag() { @@ -128,11 +147,14 @@ public bool GetEnableGoNextAfterMoveFlag() } /// - /// Sets the "Go next after move" flag. + /// Sets a flag that specifies whether to go to the next message after moving/deleting the currently viewed or return to the current folder. /// - /// Specifies if the "Go next after move" flag is enabled or not + /// Specifies whether to go to the next message after moving/deleting the currently viewed or return to the current folder /// Set the "Go next after move" flag /// Settings + /// api/2.0/mail/settings/goNextAfterMoveEnabled + /// PUT + /// [Update(@"settings/goNextAfterMoveEnabled")] public void SetEnableGoNextAfterMoveFlag(bool enabled) { @@ -140,11 +162,13 @@ public void SetEnableGoNextAfterMoveFlag(bool enabled) } /// - /// Returns the "Replace message body" flag. + /// Returns a flag that specifies whether to completely replace text of the email when inserting a template or not. /// - /// Boolean value: True - the flag is enabled, False - the flag is disabled + /// Boolean value: true - the flag is enabled, false - the flag is disabled /// Get the "Replace message body" flag /// Settings + /// api/2.0/mail/settings/replaceMessageBody + /// GET [Read(@"settings/replaceMessageBody")] public bool GetEnableReplaceMessageBodyFlag() { @@ -153,11 +177,14 @@ public bool GetEnableReplaceMessageBodyFlag() } /// - /// Sets the "Replace message body" flag. + /// Sets a flag that specifies whether to completely replace text of the email when inserting a template or not. /// - /// Specifies if the "Replace message body" flag is enabled or not + /// Specifies whether to completely replace text of the email when inserting a template or not /// Set the "Replace message body" flag /// Settings + /// api/2.0/mail/settings/replaceMessageBody + /// PUT + /// [Update(@"settings/replaceMessageBody")] public void SetEnableReplaceMessageBodyFlag(bool enabled) { diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.Signature.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.Signature.cs index 6996a299a..b9d955e8a 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.Signature.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.Signature.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,8 +32,10 @@ public partial class MailApi /// /// Get a signature /// Signature - /// Mailbox ID - /// Signature object + /// Mailbox ID + /// Signature object + /// api/2.0/mail/signature/{mailbox_id} + /// GET [Read(@"signature/{mailbox_id:[0-9]+}")] public MailSignatureData GetSignature(int mailbox_id) { @@ -48,14 +50,16 @@ public MailSignatureData GetSignature(int mailbox_id) } /// - /// Updates or creates a signature of a mailbox with the ID specified in the request. + /// Updates a signature of a mailbox with the ID specified in the request. /// /// Update a signature /// Signature - /// Mailbox ID - /// New signature value - /// New signature status (active or not) - /// Updated signature object + /// Mailbox ID + /// New signature value in the HTML format + /// New signature status (active or not) + /// POST + /// api/2.0/mail/signature/update/{mailbox_id} + /// Updated signature object [Create(@"signature/update/{mailbox_id:[0-9]+}")] public MailSignatureData UpdateSignature(int mailbox_id, string html, bool is_active) { diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.Tags.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.Tags.cs index 7c7dbda5c..2b0a752a9 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.Tags.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.Tags.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,9 +32,12 @@ public partial class MailApi /// /// Returns a list of all the tags used in the Mail module. /// - /// List of tags represented as JSON + /// List of tags represented as JSON /// Get tags /// Tags + /// api/2.0/mail/tags + /// GET + /// list [Read(@"tags")] public IEnumerable GetTags() { @@ -42,15 +45,17 @@ public IEnumerable GetTags() } /// - /// Creates a new tag with the parameters specified in the request. + /// Creates a new tag with the parameters specified in the request. /// - /// Tag name - /// Style identificator: a postfix which represents the css style (tag color) - /// List of addresses which tag is associated with - /// Mail tag + /// Tag name + /// Style identifier: a postfix which represents the CSS style (tag color) + /// List of addresses associated with a tag + /// Mail tag /// Create a tag /// Tags - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/tags + /// POST + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Create(@"tags")] public MailTagData CreateTag(string name, string style, IEnumerable addresses) { @@ -71,14 +76,16 @@ public MailTagData CreateTag(string name, string style, IEnumerable addr /// /// Updates a tag with the ID specified in the request. /// - /// Tag ID - /// New tag name - /// New style identificator: a postfix which represents the css style (tag color) - /// New list of addresses which tag is associated with + /// Tag ID + /// New tag name + /// New style identifier: a postfix which represents the CSS style (tag color) + /// New list of addresses associated with a tag /// Updated mail tag /// Update a tag /// Tags - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/tags/{id} + /// PUT + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Update(@"tags/{id}")] public MailTagData UpdateTag(int id, string name, string style, IEnumerable addresses) { @@ -109,13 +116,15 @@ public MailTagData UpdateTag(int id, string name, string style, IEnumerable - /// Deletes a tag with the ID specified in the request from TLMail. + /// Deletes a tag with the ID specified in the request. /// - /// Tag ID + /// Tag ID /// Deleted mail tag /// Delete a tag /// Tags - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/tags/{id} + /// DELETE + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Delete(@"tags/{id}")] public int DeleteTag(int id) { @@ -131,12 +140,14 @@ public int DeleteTag(int id) /// /// Adds a tag with the ID specified in the request to the messages. /// - /// Tag ID - /// List of message IDs - /// Added mail tag + /// Tag ID + /// List of message IDs + /// Added mail tag ID /// Set a tag to the messages /// Tags - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/tags/{id}/set + /// PUT + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Update(@"tags/{id}/set")] public int SetTag(int id, List messages) { @@ -151,12 +162,14 @@ public int SetTag(int id, List messages) /// /// Removes a tag with the ID specified in the request from the messages. /// - /// Tag ID - /// List of message IDs - /// Removed mail tag + /// Tag ID + /// List of message IDs + /// Removed mail tag ID /// Remove a tag from the messages /// Tags - /// Exception happens when the parameters are invalid. Text description contains parameter name and text description. + /// api/2.0/mail/tags/{id}/unset + /// PUT + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. [Update(@"tags/{id}/unset")] public int UnsetTag(int id, List messages) { diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.Tests.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.Tests.cs index f13007a41..cb0d764a1 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.Tests.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.Tests.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; using System.IO; @@ -29,17 +29,19 @@ public partial class MailApi /// Creates a sample message with the parameters specified in the request. [Tests] /// /// Create a sample message - /// Folder ID - /// Mailbox ID - /// List of mail addresses to which the letter came. ]]> - /// List of "cc" mail addresses. ]]> - /// List of "bcc" mail addresses. ]]> - /// Important message or not: true - important, false - not important - /// Message status: unread (true), read (false) or all (null) messages - /// Message subject - /// Message body as HTML string + /// Folder ID + /// Mailbox ID + /// List of mail addresses to which a letter will be sent. ]]> + /// List of Cc (carbon copy) mail addresses. ]]> + /// List of Bcc (blind carbon copy) mail addresses. ]]> + /// Specifies if this message is important or not: true - important, false - not important + /// Message status: unread (true), read (false), or all (null) messages + /// Message subject + /// Message body as the HTML string /// Message ID /// Tests + /// api/2.0/mail/messages/sample/create + /// POST /// false [Create(@"messages/sample/create")] public int CreateSampleMessage( @@ -62,13 +64,15 @@ public int CreateSampleMessage( /// /// Appends an attachment to the sample message with the ID specified in the request. [Tests] /// - /// Append attachments to a sample message - /// Message ID - /// File name - /// File stream - /// File content type - /// Message ID + /// Append an attachment to a sample message + /// Message ID + /// File name + /// File stream + /// File content type + /// Message attachment /// Tests + /// api/2.0/mail/messages/sample/attachments/append + /// POST /// false [Create(@"messages/sample/attachments/append")] public MailAttachmentData AppendAttachmentsToSampleMessage( @@ -81,16 +85,18 @@ public MailAttachmentData AppendAttachmentsToSampleMessage( } /// - /// Loads a sample message with the parameters specified in the request from EML. [Tests] + /// Loads a sample message with the parameters specified in the request as EML. [Tests] /// /// Load a sample message - /// Folder ID - /// User folder ID - /// Mailbox ID - /// Message status: unread (true), read (false) or all (null) messages - /// EML stream + /// Folder ID + /// User folder ID + /// Mailbox ID + /// Message status: unread (true), read (false), or all (null) messages + /// EML stream /// Message ID /// Tests + /// api/2.0/mail/messages/sample/eml/load + /// POST /// false [Create(@"messages/sample/eml/load")] public int LoadSampleMessage( diff --git a/module/ASC.Api/ASC.Api.Mail/MailApi.cs b/module/ASC.Api/ASC.Api.Mail/MailApi.cs index a232ee19b..f082ee418 100644 --- a/module/ASC.Api/ASC.Api.Mail/MailApi.cs +++ b/module/ASC.Api/ASC.Api.Mail/MailApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,6 +37,10 @@ namespace ASC.Api.Mail { + /// + /// Mail API. + /// + ///mail public partial class MailApi : IApiEntryPoint { private readonly ApiContext _context; @@ -49,9 +53,6 @@ public partial class MailApi : IApiEntryPoint public const int DEFAULT_PAGE_SIZE = 25; - /// - /// Api name entry - /// public string Name { get { return "mail"; } @@ -138,13 +139,16 @@ public MailApi(ApiContext context) } /// - /// Returns all the running complex mail operations. + /// Returns all the running mail operations. /// + /// api/2.0/mail/operations + /// GET + /// list /// - /// Get running complex mail operations + /// Get running mail operations /// /// Operations - /// List of running mail operations + /// List of running mail operations [Read("operations")] public List GetMailOperations() { @@ -153,14 +157,16 @@ public List GetMailOperations() } /// - /// Returns a status of complex mail operation with the ID specified in the request. + /// Returns a status of the mail operation with the ID specified in the request. /// /// - /// Get a status of complex mail operation + /// Get a mail operation status /// /// Operations - /// Operation ID - /// Status of complex mail operation + /// Operation ID + /// Mail operation status + /// api/2.0/mail/operations/{operationId} + /// GET [Read("operations/{operationId}")] public MailOperationStatus GetMailOperation(string operationId) { @@ -172,7 +178,7 @@ public MailOperationStatus GetMailOperation(string operationId) /// /// Translate a mail operation status /// Operations - /// Instance of distributed task + /// Distributed task instance /// Translated status private static string TranslateMailOperationStatus(DistributedTask op) { diff --git a/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Account.cs b/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Account.cs index a658b5103..624be8120 100644 --- a/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Account.cs +++ b/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Account.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.MailServer/MailServerApi.MailGroup.cs b/module/ASC.Api/ASC.Api.MailServer/MailServerApi.MailGroup.cs index c94599a84..f5dd1812b 100644 --- a/module/ASC.Api/ASC.Api.MailServer/MailServerApi.MailGroup.cs +++ b/module/ASC.Api/ASC.Api.MailServer/MailServerApi.MailGroup.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,12 +32,14 @@ public partial class MailServerApi /// /// Creates a mail group with the parameters specified in the request. /// - /// Sender name - /// Domain ID - /// List of address IDs - /// Mail group data associated with the tenant + /// Sender name + /// Domain ID + /// List of address IDs + /// Mail group data associated with the tenant /// Create a mail group /// Mail groups + /// api/2.0/mailserver/groupaddress/add + /// POST [Create(@"groupaddress/add")] public ServerDomainGroupData CreateMailGroup(string name, int domain_id, List address_ids) { @@ -49,11 +51,13 @@ public ServerDomainGroupData CreateMailGroup(string name, int domain_id, List /// Adds an address with the ID specified in the request to the mail group. /// - /// Mail group ID - /// Address ID - /// Mail group data associated with the tenant + /// Mail group ID + /// Address ID + /// Mail group data associated with the tenant /// Add an address to the mail group /// Mail groups + /// api/2.0/mailserver/groupaddress/address/add + /// PUT [Update(@"groupaddress/address/add")] public ServerDomainGroupData AddMailGroupAddress(int mailgroup_id, int address_id) { @@ -63,13 +67,15 @@ public ServerDomainGroupData AddMailGroupAddress(int mailgroup_id, int address_i } /// - /// Remove an address with the ID specified in the request from the mail group. + /// Removes an address with the ID specified in the request from the mail group. /// - /// Mail group ID - /// Address ID + /// Mail group ID + /// Address ID /// Mail group ID /// Remove an address from the mail group /// Mail groups + /// api/2.0/mailserver/groupaddress/addresses/remove + /// DELETE [Delete(@"groupaddress/addresses/remove")] public int RemoveMailGroupAddress(int mailgroup_id, int address_id) { @@ -81,9 +87,12 @@ public int RemoveMailGroupAddress(int mailgroup_id, int address_id) /// /// Returns a list of mail groups associated with the tenant. /// - /// List of mail group data for the current tenant + /// List of mail group data for the current tenant /// Get mail groups /// Mail groups + /// api/2.0/mailserver/groupaddress/get + /// GET + /// list [Read(@"groupaddress/get")] public List GetMailGroups() { @@ -95,10 +104,12 @@ public List GetMailGroups() /// /// Deletes a mail group with the ID specified in the request. /// - /// Mail group ID + /// Mail group ID /// Mail group ID /// Remove a mail group /// Mail groups + /// api/2.0/mailserver/groupaddress/remove/{id} + /// DELETE [Delete(@"groupaddress/remove/{id}")] public int RemoveMailGroup(int id) { diff --git a/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Mailbox.cs b/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Mailbox.cs index a3a73c33e..dfa5f0f8b 100644 --- a/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Mailbox.cs +++ b/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Mailbox.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,15 +40,17 @@ public partial class MailServerApi /// /// Creates a mailbox with the parameters specified in the request. /// - /// Mailbox name - /// Mailbox local part - /// Mailbox domain ID - /// User ID - /// Specifies if the notifications will be sent to the email address from which this mailbox was created or not - /// Specifies if the notifications will be sent to the email address from the current user's profile or not - /// Mailbox data associated with the tenant + /// Mailbox name + /// Mailbox local part + /// Mailbox domain ID + /// User ID + /// Specifies whether to notify the current user's email when a mailbox is created or not + /// Specifies whether to notify the current user's profile when a mailbox is created or not + /// Mailbox data associated with the tenant /// Create a mailbox /// Mailboxes + /// api/2.0/mailserver/mailboxes/add + /// POST [Create(@"mailboxes/add")] public ServerMailboxData CreateMailbox(string name, string local_part, int domain_id, string user_id, bool notifyCurrent = false, bool notifyProfile = false) @@ -63,12 +65,14 @@ public ServerMailboxData CreateMailbox(string name, string local_part, int domai } /// - /// Create my common domain mailbox with the name specified in the request. + /// Creates a mailbox with your own domain name. /// - /// Sender name - /// Mailbox data associated with the tenant - /// Create my mailbox + /// Mailbox name + /// Mailbox data associated with the tenant + /// Create a mailbox with your own domain /// Mailboxes + /// api/2.0/mailserver/mailboxes/addmy + /// POST [Create(@"mailboxes/addmy")] public ServerMailboxData CreateMyMailbox(string name) { @@ -80,9 +84,12 @@ public ServerMailboxData CreateMyMailbox(string name) /// /// Returns a list of all the mailboxes associated with the tenant. /// - /// List of mailbox data for the current tenant + /// List of mailbox data for the current tenant /// Get mailboxes /// Mailboxes + /// api/2.0/mailserver/mailboxes/get + /// GET + /// list [Read(@"mailboxes/get")] public List GetMailboxes() { @@ -94,12 +101,14 @@ public List GetMailboxes() /// /// Deletes a mailbox with the ID specified in the request. /// - /// Mailbox ID - /// Operation status - /// Exception happens when some parameters are invalid. Text description contains parameter name and text description. - /// Exception happens when mailbox wasn't found. - /// Remove a mailbox from the mail server + /// Mailbox ID + /// Operation status + /// An exception occurs when the parameters are invalid. The text description contains the parameter name and the text description. + /// The exception occurs when a mailbox with the specified ID wasn't found. + /// Remove a mailbox /// Mailboxes + /// api/2.0/mailserver/mailboxes/remove/{id} + /// DELETE [Delete(@"mailboxes/remove/{id}")] public MailOperationStatus RemoveMailbox(int id) { @@ -111,11 +120,13 @@ public MailOperationStatus RemoveMailbox(int id) /// /// Updates a mailbox with the ID specified in the request. /// - /// Mailbox ID - /// New sender name - /// Updated mailbox data + /// Mailbox ID + /// New sender name + /// Updated mailbox data /// Update a mailbox /// Mailboxes + /// api/2.0/mailserver/mailboxes/update + /// PUT [Update(@"mailboxes/update")] public ServerMailboxData UpdateMailbox(int mailbox_id, string name) { @@ -127,11 +138,13 @@ public ServerMailboxData UpdateMailbox(int mailbox_id, string name) /// /// Adds an alias to the mailbox with the ID specified in the request. /// - /// Mailbox ID - /// Mailbox alias - /// Mailbox data associated with the tenant + /// Mailbox ID + /// Mailbox alias + /// Mailbox data associated with the tenant /// Add a mailbox alias - /// Address data + /// Mailboxes + /// api/2.0/mailserver/mailboxes/alias/add + /// PUT [Update(@"mailboxes/alias/add")] public ServerDomainAddressData AddMailboxAlias(int mailbox_id, string alias_name) { @@ -143,11 +156,13 @@ public ServerDomainAddressData AddMailboxAlias(int mailbox_id, string alias_name /// /// Removes an alias from the mailbox with the ID specified in the request. /// - /// Mailbox ID - /// Mailbox address ID + /// Mailbox ID + /// Mailbox address ID /// Mailbox ID /// Remove a mailbox alias /// Mailboxes + /// api/2.0/mailserver/mailboxes/alias/remove + /// PUT [Update(@"mailboxes/alias/remove")] public int RemoveMailboxAlias(int mailbox_id, int address_id) { @@ -157,12 +172,15 @@ public int RemoveMailboxAlias(int mailbox_id, int address_id) } /// - /// Changes a password of the mailbox with the ID specified in the request. + /// Changes a password of a mailbox with the ID specified in the request. /// - /// Mailbox ID - /// New password + /// Mailbox ID + /// New password /// Change a mailbox password /// Mailboxes + /// api/2.0/mailserver/mailboxes/changepwd + /// PUT + /// [Update(@"mailboxes/changepwd")] public void ChangeMailboxPassword(int mailbox_id, string password) { @@ -175,11 +193,13 @@ public void ChangeMailboxPassword(int mailbox_id, string password) /// /// Checks if the mailbox address is already registered or not. /// - /// Mailbox local part - /// Mailbox domain ID + /// Mailbox local part + /// Mailbox domain ID /// Check the mailbox address existence - /// Boolean value: True - address exists, False - address does not exist + /// Boolean value: true - address exists, false - address does not exist /// Mailboxes + /// api/2.0/mailserver/mailboxes/alias/exists + /// GET [Read(@"mailboxes/alias/exists")] public bool IsAddressAlreadyRegistered(string local_part, int domain_id) { @@ -190,11 +210,13 @@ public bool IsAddressAlreadyRegistered(string local_part, int domain_id) /// /// Checks if the mailbox address is valid or not. /// - /// Mailbox local part - /// Mailbox domain ID - /// Validate the mailbox address - /// Boolean value: True - address is valid, False - address is not valid + /// Mailbox local part + /// Mailbox domain ID + /// Check the mailbox address correctness + /// Boolean value: true - address is valid, false - address is not valid /// Mailboxes + /// api/2.0/mailserver/mailboxes/alias/valid + /// GET [Read(@"mailboxes/alias/valid")] public bool IsAddressValid(string local_part, int domain_id) { diff --git a/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Notification.cs b/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Notification.cs index f18cbb2f5..1300f57b3 100644 --- a/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Notification.cs +++ b/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Notification.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Api.Attributes; @@ -31,12 +31,14 @@ public partial class MailServerApi /// /// Creates an address for the tenant notifications with the parameters specified in the request. /// - /// Address name - /// Address password - /// Domain ID - /// Notification address data associated with the tenant - /// Create the notification address + /// Address name + /// Address password + /// Domain ID + /// Notification address data associated with the tenant + /// Create a notification address /// Notifications + /// api/2.0/mailserver/notification/address/add + /// POST [Create(@"notification/address/add")] public ServerNotificationAddressData CreateNotificationAddress(string name, string password, int domain_id) { @@ -46,11 +48,14 @@ public ServerNotificationAddressData CreateNotificationAddress(string name, stri } /// - /// Deletes an address for the tenant notification specified in the request. + /// Deletes an address for the tenant notifications specified in the request. /// - /// Address name - /// Remove the notification address + /// Address name + /// Remove a notification address /// Notifications + /// api/2.0/mailserver/notification/address/remove + /// DELETE + /// [Delete(@"notification/address/remove")] public void RemoveNotificationAddress(string address) { diff --git a/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Server.cs b/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Server.cs index e5237ec07..a598b6b0b 100644 --- a/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Server.cs +++ b/module/ASC.Api/ASC.Api.MailServer/MailServerApi.Server.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,9 +31,11 @@ public partial class MailServerApi /// /// Returns the mail server associated with the current tenant. /// - /// Mail server data for the current tenant + /// Mail server data for the current tenant /// Get the mail server /// Servers + /// api/2.0/mailserver/server + /// GET [Read(@"server")] public ServerData GetMailServer() { @@ -44,9 +46,11 @@ public ServerData GetMailServer() /// /// Returns full information on the mail server associated with the current tenant. /// - /// Full mail server information for the current tenant + /// Full mail server information for the current tenant /// Get the mail server information /// Servers + /// api/2.0/mailserver/serverinfo/get + /// GET [Read(@"serverinfo/get")] public ServerFullData GetMailServerFullInfo() { @@ -70,9 +74,11 @@ public ServerFullData GetMailServerFullInfo() /// /// Returns or generates free DNS records. /// - /// DNS records for the current tenant and user + /// DNS records for the current tenant and user /// Get or create free DNS records - /// DNS records + /// Servers + /// api/2.0/mailserver/freedns/get + /// GET [Read(@"freedns/get")] public ServerDomainDnsData GetUnusedDnsRecords() { diff --git a/module/ASC.Api/ASC.Api.MailServer/MailServerApi.WebDomain.cs b/module/ASC.Api/ASC.Api.MailServer/MailServerApi.WebDomain.cs index 199c9a35c..ef3e63e4d 100644 --- a/module/ASC.Api/ASC.Api.MailServer/MailServerApi.WebDomain.cs +++ b/module/ASC.Api/ASC.Api.MailServer/MailServerApi.WebDomain.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,14 +30,18 @@ namespace ASC.Api.MailServer { + ///mailserver public partial class MailServerApi { /// /// Returns a list of all the web domains associated with the current tenant. /// - /// List of web domains for the current tenant + /// List of web domains for the current tenant /// Get web domains /// Domains + /// api/2.0/mailserver/domains/get + /// GET + /// list [Read(@"domains/get")] public List GetDomains() { @@ -56,9 +60,11 @@ public List GetDomains() /// /// Returns the common web domain. /// - /// Common web domain + /// Common web domain /// Get common web domain /// Domains + /// api/2.0/mailserver/domains/common + /// GET [Read(@"domains/common")] public ServerDomainData GetCommonDomain() { @@ -69,11 +75,13 @@ public ServerDomainData GetCommonDomain() /// /// Adds a web domain to the current tenant. /// - /// Web domain name - /// DNS ID - /// Web domain data associated with the tenant + /// Web domain name + /// DNS ID + /// Web domain data associated with the tenant /// Add a domain to the mail server /// Domains + /// api/2.0/mailserver/domains/add + /// POST [Create(@"domains/add")] public ServerDomainData AddDomain(string name, int id_dns) { @@ -85,10 +93,12 @@ public ServerDomainData AddDomain(string name, int id_dns) /// /// Deletes a web domain with the ID specified in the request from the mail server. /// - /// Web domain ID - /// Operation status + /// Web domain ID + /// Operation status /// Remove a domain from the mail server /// Domains + /// api/2.0/mailserver/domains/remove/{id} + /// DELETE [Delete(@"domains/remove/{id}")] public MailOperationStatus RemoveDomain(int id) { @@ -100,10 +110,12 @@ public MailOperationStatus RemoveDomain(int id) /// /// Returns DNS records related to the domain with the ID specified in the request. /// - /// Domain ID - /// DNS records associated with the domain + /// Domain ID + /// DNS records associated with the domain /// Get DNS records by domain ID - /// DNS records + /// Domains + /// api/2.0/mailserver/domains/dns/get + /// GET [Read(@"domains/dns/get")] public ServerDomainDnsData GetDnsRecords(int id) { @@ -113,12 +125,14 @@ public ServerDomainDnsData GetDnsRecords(int id) } /// - /// Checks if the web domain name specified in the request already exists or not. + /// Checks if a web domain name specified in the request already exists or not. /// - /// Web domain name - /// Boolean value: True - domain name exists, False - domain name does not exist + /// Web domain name + /// Boolean value: true - domain name exists, false - domain name does not exist /// Check the domain name existence /// Domains + /// api/2.0/mailserver/domains/exists + /// GET [Read(@"domains/exists")] public bool IsDomainExists(string name) { @@ -128,12 +142,14 @@ public bool IsDomainExists(string name) } /// - /// Checks if the web domain specified in the request belongs to the current user or not. + /// Checks if a web domain specified in the request belongs to the current user or not. /// - /// Web domain name - /// Boolean value: True - current user is the domain owner, False - current user is not the domain owner + /// Web domain name + /// Boolean value: true - current user is the domain owner, false - current user is not the domain owner /// Check the domain ownership /// Domains + /// api/2.0/mailserver/domains/ownership/check + /// GET [Read(@"domains/ownership/check")] public bool CheckDomainOwnership(string name) { diff --git a/module/ASC.Api/ASC.Api.MailServer/MailServerApi.cs b/module/ASC.Api/ASC.Api.MailServer/MailServerApi.cs index 14dd7a0fb..73aad8756 100644 --- a/module/ASC.Api/ASC.Api.MailServer/MailServerApi.cs +++ b/module/ASC.Api/ASC.Api.MailServer/MailServerApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Migration/ASC.Api.Migration.csproj b/module/ASC.Api/ASC.Api.Migration/ASC.Api.Migration.csproj index 9e3167259..2e01acdb0 100644 --- a/module/ASC.Api/ASC.Api.Migration/ASC.Api.Migration.csproj +++ b/module/ASC.Api/ASC.Api.Migration/ASC.Api.Migration.csproj @@ -46,6 +46,7 @@ + diff --git a/module/ASC.Api/ASC.Api.Migration/MigrationApi.cs b/module/ASC.Api/ASC.Api.Migration/MigrationApi.cs index 728044bd7..eeb5619e4 100644 --- a/module/ASC.Api/ASC.Api.Migration/MigrationApi.cs +++ b/module/ASC.Api/ASC.Api.Migration/MigrationApi.cs @@ -1,16 +1,33 @@ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; +using System.Collections.Generic; using System.IO; using System.Reflection; using System.Runtime.Caching; using System.Threading; -using System.Threading.Tasks; using ASC.Api.Attributes; using ASC.Api.Exceptions; using ASC.Api.Impl; using ASC.Core; using ASC.Core.Users; +using ASC.Migration; using ASC.Migration.Core; using ASC.Migration.Core.Models.Api; using ASC.Web.Studio.Core.Notify; @@ -19,18 +36,19 @@ namespace ASC.Api.Migration { /// - /// + /// Migration API. /// public class MigrationApi : Interfaces.IApiEntryPoint { /// - /// + /// Api name entry /// public string Name => "migration"; private readonly ApiContext _context; /// + /// Constructor /// /// public MigrationApi(ApiContext context) @@ -39,9 +57,14 @@ public MigrationApi(ApiContext context) } /// - /// + /// Returns the temporary folder where all the created backups are stored. /// - /// + /// + /// Get backup folder + /// + /// Path to the backup folder + /// api/2.0/migration/backuptmp + /// GET [Read("backuptmp")] public string GetTmpFolder() { @@ -57,9 +80,15 @@ public string GetTmpFolder() } /// - /// + /// Returns all the available migrations. /// - /// + /// + /// Get migrations + /// + /// List of migrations + /// list + /// api/2.0/migration/list + /// GET [Read("list")] public string[] List() { @@ -68,10 +97,47 @@ public string[] List() } /// - /// + /// Returns the information about the migrators with the names specified in the request. /// - /// - /// + /// + /// Get migrator information + /// + /// List of migrator names + /// List of migrator information + /// list + /// api/2.0/migration/migratorsInfo + /// POST + /// list + [Create("migratorsInfo")] + public List MigratorsInfo(string[] migratorsName) + { + var result = new List(); + foreach (var migratorName in migratorsName) + { + var migratorMeta = MigrationCore.GetMigrator(migratorName); + if (migratorMeta != null) + { + result.Add(new MigratorInfo() + { + MigratorName = migratorMeta.MigratorInfo.Name, + NumberOfSteps = migratorMeta.MigratorInfo.NumberOfSteps, + ArchivesIsMultiple = migratorMeta.MigratorInfo.ArchivesIsMultiple + }); + } + } + return result; + } + + /// + /// Uploads a backup of a migrator specified in the request and initializes the import. + /// + /// + /// Initialize migration + /// + /// Migrator name + /// Path to the backup file + /// api/2.0/migration/init/{migratorName} + /// POST [Create("init/{migratorName}")] public void UploadAndInit(string migratorName, string path) { @@ -80,63 +146,60 @@ public void UploadAndInit(string migratorName, string path) { throw new Exception("Migration is already in progress"); } - + var cts = new CancellationTokenSource(); var migratorMeta = MigrationCore.GetMigrator(migratorName); if (migratorMeta == null) { throw new ItemNotFoundException("No such migration provider"); } - var cts = new CancellationTokenSource(); var migrator = (IMigration)Activator.CreateInstance(migratorMeta.MigratorType); - try - { - migrator.Init(path, cts.Token); - } - catch (Exception ex) - { - throw new Exception($"Error while initializing {migratorMeta.MigratorInfo.Name} migrator", ex); - } var ongoingMigration = new OngoingMigration { Migration = migrator, CancelTokenSource = cts }; StoreOngoingMigration(ongoingMigration); - - ongoingMigration.ParseTask = Task.Run(migrator.Parse); + ongoingMigration.ParseTask = QueueWorker.StartParsing(migrator, path, cts.Token); } /// - /// + /// Returns a status of the running migration process. /// - /// + /// + /// Get migration status + /// + /// Object with the information about migration status + /// api/2.0/migration/status + /// GET [Read("status")] public object Status() { if (!CoreContext.Configuration.Standalone || !CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsAdmin()) throw new System.Security.SecurityException(); var ongoingMigration = GetOngoingMigration(); - if (ongoingMigration == null) - { - return null; - } + if (ongoingMigration == null) return null; - if(ongoingMigration.CancelTokenSource.IsCancellationRequested == true) - { - var migratorName = ongoingMigration.Migration.GetType().GetCustomAttribute().Name; - return migratorName; - } + var migratorName = ongoingMigration.Migration.GetType().GetCustomAttribute().Name; + + if (ongoingMigration.IsCancel == true) return migratorName; var result = new MigrationStatus() { - ParseResult = ongoingMigration.ParseTask.IsCompleted ? ongoingMigration.ParseTask.Result : null, + ParseResult = ongoingMigration.ParseTask != null ? ongoingMigration.ParseTask.migrationInfo : null, + ParsingEnded = ongoingMigration.ParseTask.IsCompleted, MigrationEnded = ongoingMigration.MigrationEnded, Progress = ongoingMigration.Migration.GetProgress(), - ProgressStatus = ongoingMigration.Migration.GetProgressStatus() + ProgressStatus = ongoingMigration.Migration.GetProgressStatus(), + MigratorName = migratorName }; return result; } /// - /// + /// Cancels the running migration process. /// + /// + /// Cancel migration + /// + /// api/2.0/migration/cancel + /// POST [Create("cancel")] public void Cancel() { @@ -147,12 +210,19 @@ public void Cancel() throw new Exception("No migration is in progress"); } ongoingMigration.CancelTokenSource.Cancel(); + QueueWorker.Terminate(); + ongoingMigration.IsCancel = true; } /// - /// + /// Starts the migration process specifying the migration information to be imported (users, modules, groups, etc.). /// - /// + /// + /// Start migration + /// + /// Migration information + /// api/2.0/migration/migrate + /// POST [Create("migrate")] public void Migrate(MigrationApiInfo info) { @@ -167,13 +237,18 @@ public void Migrate(MigrationApiInfo info) throw new Exception("Parsing is still in progress"); } - ongoingMigration.MigrationTask = ongoingMigration.Migration.Migrate(info); + ongoingMigration.MigrationTask = QueueWorker.StartMigration(ongoingMigration.Migration, info); } /// - /// + /// Returns the logs of the migration process. /// - /// + /// + /// Get migration logs + /// + /// Migration logs + /// api/2.0/migration/logs + /// GET [Read("logs")] public MigrationLogApiContentResponce Logs() { @@ -187,14 +262,19 @@ public MigrationLogApiContentResponce Logs() } /// - /// + /// Completes the migration process. /// - /// + /// + /// Complete migration + /// + /// Specifies whether to send a welcome letter to the imported users or not + /// api/2.0/migration/finish + /// POST [Create("finish")] public void Finish(bool isSendWelcomeEmail) { if (!CoreContext.Configuration.Standalone || !CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsAdmin()) throw new System.Security.SecurityException(); - if(isSendWelcomeEmail) + if (isSendWelcomeEmail) { var ongoingMigration = GetOngoingMigration(); if (ongoingMigration == null) diff --git a/module/ASC.Api/ASC.Api.Migration/MigrationStatus.cs b/module/ASC.Api/ASC.Api.Migration/MigrationStatus.cs index 0722ad6de..c7471b79b 100644 --- a/module/ASC.Api/ASC.Api.Migration/MigrationStatus.cs +++ b/module/ASC.Api/ASC.Api.Migration/MigrationStatus.cs @@ -1,4 +1,21 @@ -using ASC.Migration.Core.Models.Api; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using ASC.Migration.Core.Models.Api; namespace ASC.Api.Migration { @@ -26,5 +43,15 @@ public class MigrationStatus /// /// public bool MigrationEnded { get; set; } + + /// + /// + /// + public string MigratorName { get;set; } + + /// + /// + /// + public bool ParsingEnded { get; set; } } } diff --git a/module/ASC.Api/ASC.Api.Migration/MigratorInfo.cs b/module/ASC.Api/ASC.Api.Migration/MigratorInfo.cs new file mode 100644 index 000000000..73bb14923 --- /dev/null +++ b/module/ASC.Api/ASC.Api.Migration/MigratorInfo.cs @@ -0,0 +1,40 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +namespace ASC.Api.Migration +{ + /// + /// + /// + public class MigratorInfo + { + /// + /// + /// + public string MigratorName { get; set; } + + /// + /// + /// + public int NumberOfSteps { get; set; } + + /// + /// + /// + public bool ArchivesIsMultiple { get; set; } + } +} diff --git a/module/ASC.Api/ASC.Api.Migration/OngoingMigration.cs b/module/ASC.Api/ASC.Api.Migration/OngoingMigration.cs index e80a236e3..368577804 100644 --- a/module/ASC.Api/ASC.Api.Migration/OngoingMigration.cs +++ b/module/ASC.Api/ASC.Api.Migration/OngoingMigration.cs @@ -1,8 +1,24 @@ -using System.Threading; -using System.Threading.Tasks; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System.Threading; +using ASC.Migration; using ASC.Migration.Core; -using ASC.Migration.Core.Models.Api; namespace ASC.Api.Migration { @@ -11,6 +27,11 @@ namespace ASC.Api.Migration /// public class OngoingMigration { + /// + /// + /// + public bool IsCancel { get; set; } + /// /// /// @@ -24,12 +45,12 @@ public class OngoingMigration /// /// /// - public Task ParseTask { get; set; } + public ParseProgressItem ParseTask { get; set; } /// /// /// - public Task MigrationTask { get; set; } + public MigrateProgressItem MigrationTask { get; set; } /// /// diff --git a/module/ASC.Api/ASC.Api.Portal/ASC.Api.Portal.csproj b/module/ASC.Api/ASC.Api.Portal/ASC.Api.Portal.csproj index d3db09b24..43c38a58a 100644 --- a/module/ASC.Api/ASC.Api.Portal/ASC.Api.Portal.csproj +++ b/module/ASC.Api/ASC.Api.Portal/ASC.Api.Portal.csproj @@ -110,6 +110,7 @@ + diff --git a/module/ASC.Api/ASC.Api.Portal/PortalApi.cs b/module/ASC.Api/ASC.Api.Portal/PortalApi.cs index 7abda8785..dffafde49 100644 --- a/module/ASC.Api/ASC.Api.Portal/PortalApi.cs +++ b/module/ASC.Api/ASC.Api.Portal/PortalApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,8 +21,10 @@ using System.Globalization; using System.Linq; using System.Net; +using System.Net.Http; using System.Security; using System.Threading; +using System.Threading.Tasks; using System.Web; using ASC.Api.Attributes; @@ -30,6 +32,7 @@ using ASC.Api.Impl; using ASC.Api.Interfaces; using ASC.Common.Logging; +using ASC.Common.Web; using ASC.Core; using ASC.Core.Billing; using ASC.Core.Common.Contracts; @@ -65,12 +68,14 @@ namespace ASC.Api.Portal /// /// Portal information access. /// + ///portal public class PortalApi : IApiEntryPoint { private readonly IMobileAppInstallRegistrator mobileAppRegistrator; private readonly BackupAjaxHandler backupHandler = new BackupAjaxHandler(); private ILog Log = LogManager.GetLogger("ASC"); private ILog LogWeb = LogManager.GetLogger("ASC.Web"); + private static HttpClient httpClient = HttpClientFactory.CreateClient(nameof(PortalApi)); /// @@ -91,27 +96,33 @@ public PortalApi(ApiContext context) mobileAppRegistrator = new CachedMobileAppInstallRegistrator(new MobileAppInstallRegistrator()); } - /// - ///Returns the current portal. - /// - /// - ///Get the current portal - /// - ///Portal + /// + /// Returns the current portal. + /// + /// + /// Get the current portal + /// + /// Settings + /// Portal + /// api/2.0/portal + /// GET [Read("")] public Tenant Get() { return CoreContext.TenantManager.GetCurrentTenant(); } - /// - ///Returns a user with the ID specified in the request from the current portal. - /// - /// - ///Get a user by ID - /// + /// + /// Returns a user with the ID specified in the request from the current portal. + /// + /// + /// Get a user by ID + /// /// Users - ///User + /// User ID + /// User + /// api/2.0/portal/users/{userID} + /// GET [Read("users/{userID}")] public UserInfo GetUser(Guid userID) { @@ -119,19 +130,21 @@ public UserInfo GetUser(Guid userID) } - /// + /// /// Returns an invitation link for joining the portal. - /// - /// + /// + /// /// Get an invitation link - /// - /// + /// + /// /// Employee type (User or Visitor) /// - ///Users - /// + /// Users + /// /// Invitation link - /// + /// + /// api/2.0/portal/users/invite/{employeeType} + /// GET [Read("users/invite/{employeeType}")] public string GeInviteLink(EmployeeType employeeType) { @@ -144,13 +157,15 @@ public string GeInviteLink(EmployeeType employeeType) } /// - /// Returns a shortened invitation link for joining the portal. + /// Returns a link specified in the request in the shortened format. /// - /// Get a shortened invitation link - /// Invitation link - /// Users - ///Shortened invitation link - ///false + /// Get a shortened link + /// Link + /// Settings + /// Shortened link + /// api/2.0/portal/getshortenlink + /// PUT + /// false [Update("getshortenlink")] public String GetShortenLink(string link) { @@ -166,14 +181,16 @@ public String GetShortenLink(string link) } - /// - ///Returns the used space of the current portal. - /// - /// - ///Get the used portal space - /// + /// + /// Returns the used space of the current portal. + /// + /// + /// Get the used portal space + /// /// Quota - ///Used space + /// Used space + /// api/2.0/portal/usedspace + /// GET [Read("usedspace")] public double GetUsedSpace() { @@ -183,30 +200,34 @@ public double GetUsedSpace() .Sum(q => q.Counter) / 1024f / 1024f / 1024f, 2); } - /// - ///Returns a number of portal users. - /// - /// - ///Get a number of portal users - /// + /// + /// Returns a number of portal users. + /// + /// + /// Get a number of portal users + /// /// Users - ///User count + /// User count + /// api/2.0/portal/userscount + /// GET [Read("userscount")] public long GetUsersCount() { return CoreContext.Configuration.Personal ? 1 : CoreContext.UserManager.GetUserNames(EmployeeStatus.Active).Count(); } - /// - ///Uploads a portal license specified in the request. - /// - /// - ///Upload a license - /// - ///License attachments + /// + /// Uploads a portal license specified in the request. + /// + /// + /// Upload a license + /// + /// License attachments /// Quota - ///License - ///false + /// License + /// api/2.0/portal/uploadlicense + /// POST + /// false [Create("uploadlicense")] public FileUploadResult UploadLicense(IEnumerable attachments) { @@ -254,15 +275,17 @@ public FileUploadResult UploadLicense(IEnumerable attachment return result; } - /// - ///Activates a license for the portal. - /// - /// - ///Activate a license - /// + /// + /// Activates a license for the portal. + /// + /// + /// Activate a license + /// /// Quota - ///License - ///false + /// License + /// api/2.0/portal/activatelicense + /// POST + /// false [Create("activatelicense")] public FileUploadResult ActivateLicense() { @@ -302,15 +325,17 @@ public FileUploadResult ActivateLicense() } - /// - ///Activates a trial license for the portal. - /// - /// - ///Activate a trial license - /// + /// + /// Activates a trial license for the portal. + /// + /// + /// Activate a trial license + /// /// Quota - ///Trial license - ///false + /// Trial license + /// api/2.0/portal/activatetrial + /// POST + /// false [Create("activatetrial")] public bool ActivateTrial() { @@ -351,15 +376,17 @@ public bool ActivateTrial() return true; } - /// - ///Returns an extra tenant license for the portal. - /// - /// - ///Get an extra tenant license - /// + /// + /// Returns an extra tenant license for the portal. + /// + /// + /// Get an extra tenant license + /// /// Quota - ///Extra tenant license information - ///false + /// Extra tenant license information + /// api/2.0/portal/tenantextra + /// GET + /// false [Read("tenantextra")] public object GetTenantExtra() { @@ -381,42 +408,48 @@ public object GetTenantExtra() }; } - /// - ///Returns the current portal tariff. - /// - /// - ///Get a portal tariff - /// + /// + /// Returns the current portal tariff. + /// + /// + /// Get a portal tariff + /// /// Quota - ///Tariff + /// Tariff + /// api/2.0/portal/tariff + /// GET [Read("tariff")] public Tariff GetTariff() { return CoreContext.PaymentManager.GetTariff(CoreContext.TenantManager.GetCurrentTenant().TenantId); } - /// - ///Returns the current portal quota. - /// - /// - ///Get a portal quota - /// + /// + /// Returns the current portal quota. + /// + /// + /// Get a portal quota + /// /// Quota - ///Quota + /// Quota + /// api/2.0/portal/quota + /// GET [Read("quota")] public TenantQuota GetQuota() { return CoreContext.TenantManager.GetTenantQuota(CoreContext.TenantManager.GetCurrentTenant().TenantId); } - /// - ///Returns the recommended quota for the current portal. - /// - /// - ///Get the recommended quota - /// + /// + /// Returns the recommended quota for the current portal. + /// + /// + /// Get the recommended quota + /// /// Quota - ///Quota + /// Quota + /// api/2.0/portal/quota/right + /// GET [Read("quota/right")] public TenantQuota GetRightQuota() { @@ -430,30 +463,34 @@ public TenantQuota GetRightQuota() && !quota.Year); } - /// - ///Returns the full absolute path to the current portal. - /// - /// - ///Get a path to the portal - /// - ///Portal virtual path - ///Portal path - ///false + /// + /// Returns the full absolute path to the current portal. + /// + /// + /// Get a path to the portal + /// + /// Portal virtual path + /// Portal path + /// api/2.0/portal/path + /// GET + /// false [Read("path")] public string GetFullAbsolutePath(string virtualPath) { return CommonLinkUtility.GetFullAbsolutePath(virtualPath); } - /// - ///Returns a number of unread messages from the portal. - /// - /// - ///Get a number of unread messages - /// - ///Talk - ///Number of unread messages - ///false + /// + /// Returns a number of unread messages from the portal. + /// + /// + /// Get a number of unread messages + /// + /// Talk + /// Number of unread messages + /// api/2.0/portal/talk/unreadmessages + /// GET + /// false [Read("talk/unreadmessages")] public int GetMessageCount() { @@ -467,16 +504,18 @@ public int GetMessageCount() return 0; } - /// - ///Removes the XMPP connection specified in the request from the inner channel. - /// - /// - ///Talk - ///Removes the XMPP connection - /// - ///Connection ID - ///XMPP connection ID - ///false + /// + /// Removes the XMPP connection specified in the request from the inner channel. + /// + /// + /// Remove the XMPP connection + /// + /// Talk + /// Connection ID + /// XMPP connection ID + /// api/2.0/portal/talk/connection + /// DELETE + /// false [Delete("talk/connection")] public int RemoveXmppConnection(string connectionId) { @@ -490,17 +529,19 @@ public int RemoveXmppConnection(string connectionId) return 0; } - /// - ///Adds the XMPP connection to the inner channel. - /// - /// - ///Add the XMPP connection - /// - ///Talk - ///Connection ID - ///Service state - ///Updated inner channel - ///false + /// + /// Adds the XMPP connection to the inner channel. + /// + /// + /// Add the XMPP connection + /// + /// Talk + /// Connection ID + /// Service state + /// Updated inner channel + /// api/2.0/portal/talk/connection + /// POST + /// false [Create("talk/connection")] public byte AddXmppConnection(string connectionId, byte state) { @@ -514,16 +555,18 @@ public byte AddXmppConnection(string connectionId, byte state) return 0; } - /// - ///Returns the service state for the user with the name specified in the request. - /// - /// - ///Get a service state - /// - ///Talk - ///User name - ///State - ///false + /// + /// Returns the service state for the user with the name specified in the request. + /// + /// + /// Get the service state + /// + /// Talk + /// User name + /// State + /// api/2.0/portal/talk/state + /// GET + /// false [Read("talk/state")] public int GetState(string userName) { @@ -537,16 +580,18 @@ public int GetState(string userName) return 0; } - /// - ///Sends a service state specified in the request. - /// - /// - ///Send a service state - /// - ///Talk - ///Service state - ///State - ///false + /// + /// Sends the service state specified in the request. + /// + /// + /// Send the service state + /// + /// Talk + /// Service state + /// State + /// api/2.0/portal/talk/state + /// POST + /// false [Create("talk/state")] public byte SendState(byte state) { @@ -560,17 +605,19 @@ public byte SendState(byte state) return 4; } - /// - ///Sends a message to the user specified in the request. - /// - /// - ///Send a message - /// - ///Talk - ///User to whom a message will be sent - ///Message text - ///Message subject - ///false + /// + /// Sends a message to the user specified in the request. + /// + /// + /// Send a message + /// + /// Talk + /// User to whom a message will be sent + /// Message text + /// Message subject + /// api/2.0/portal/talk/message + /// POST + /// false [Create("talk/message")] public void SendMessage(string to, string text, string subject) { @@ -584,15 +631,17 @@ public void SendMessage(string to, string text, string subject) } } - /// - ///Returns a dictionary of all the service states. - /// - /// - ///Get service states - /// - ///Talk - ///Dictionary of all the service states - ///false + /// + /// Returns a dictionary of all the service states. + /// + /// + /// Get service states + /// + /// Talk + /// Dictionary of all the service states + /// api/2.0/portal/talk/states + /// GET + /// false [Read("talk/states")] public Dictionary GetAllStates() { @@ -607,17 +656,19 @@ public Dictionary GetAllStates() return new Dictionary(); } - /// - ///Returns all the recent messages. - /// - /// - ///Get recent messages - /// - ///Talk - ///Callee user name - ///ID - ///Recent messages - ///false + /// + /// Returns all the recent messages. + /// + /// + /// Get recent messages + /// + /// Talk + /// Callee user name + /// ID + /// Recent messages + /// api/2.0/portal/talk/recentMessages + /// GET + /// false [Read("talk/recentMessages")] public MessageClass[] GetRecentMessages(string calleeUserName, int id) { @@ -649,15 +700,17 @@ public MessageClass[] GetRecentMessages(string calleeUserName, int id) return new MessageClass[0]; } - /// - ///Pings when a message is received. - /// - /// - ///Ping - /// - ///Talk - ///Service state - ///false + /// + /// Pings when a message is received. + /// + /// + /// Ping + /// + /// Talk + /// Service state + /// api/2.0/portal/talk/ping + /// POST + /// false [Create("talk/ping")] public void Ping(byte state) { @@ -670,15 +723,17 @@ public void Ping(byte state) } } - /// - ///Registers the mobile app installation. - /// - /// - ///Register the mobile app installation - /// - ///Mobile - ///Mobile app type - ///false + /// + /// Registers the mobile app installation. + /// + /// + /// Register the mobile app installation + /// + /// Mobile + /// Mobile app type ("IosProjects", "AndroidProjects", "IosDocuments", "AndroidDocuments", or "DesktopEditor") + /// api/2.0/portal/mobile/registration + /// POST + /// false [Create("mobile/registration")] public void RegisterMobileAppInstall(MobileAppType type) { @@ -688,11 +743,13 @@ public void RegisterMobileAppInstall(MobileAppType type) /// - /// Returns the backup schedule of the current portal. + /// Returns the backup schedule for the current portal. /// /// Get the backup schedule /// Backup - /// Backup schedule + /// Backup schedule + /// api/2.0/portal/getbackupschedule + /// GET [Read("getbackupschedule")] public BackupAjaxHandler.Schedule GetBackupSchedule() { @@ -705,15 +762,18 @@ public BackupAjaxHandler.Schedule GetBackupSchedule() } /// - /// Creates the backup schedule of the current portal with the parameters specified in the request. + /// Creates the backup schedule for the current portal with the parameters specified in the request. /// /// Create the backup schedule - /// Storage type - /// Storage parameters - /// Maximum number of backup stored copies - /// Cron parameters - /// Specifies if the mails will be included into the backup or not + /// Storage type ("Documents", "ThridpartyDocuments", "CustomCloud", "Local", "DataStore", or "ThirdPartyConsumer") + /// Storage parameters + /// Maximum number of backup stored copies + /// Cron parameters + /// Specifies if the mails will be included into the backup or not /// Backup + /// api/2.0/portal/createbackupschedule + /// POST + /// [Create("createbackupschedule")] public void CreateBackupSchedule(BackupStorageType storageType, IEnumerable> storageParams, int backupsStored, BackupAjaxHandler.CronParams cronParams, bool backupMail) { @@ -733,10 +793,13 @@ public void CreateBackupSchedule(BackupStorageType storageType, IEnumerable - /// Deletes the backup schedule of the current portal. + /// Deletes the backup schedule for the current portal. /// /// Delete the backup schedule /// Backup + /// api/2.0/portal/deletebackupschedule + /// DELETE + /// [Delete("deletebackupschedule")] public void DeleteBackupSchedule() { @@ -759,11 +822,13 @@ public void DeleteBackupSchedule() /// Starts the backup of the current portal with the parameters specified in the request. /// /// Start the backup - /// Storage type - /// Storage parameters - /// Specifies if the mails will be included into the backup or not + /// Storage type ("Documents", "ThridpartyDocuments", "CustomCloud", "Local", "DataStore", or "ThirdPartyConsumer") + /// Storage parameters + /// Specifies if the mails will be included into the backup or not /// Backup - /// Backup progress + /// Backup progress + /// api/2.0/portal/startbackup + /// POST [Create("startbackup")] public BackupProgress StartBackup(BackupStorageType storageType, IEnumerable> storageParams, bool backupMail) { @@ -780,7 +845,9 @@ public BackupProgress StartBackup(BackupStorageType storageType, IEnumerable /// Get the backup progress /// Backup - /// Backup progress + /// Backup progress + /// api/2.0/portal/getbackupprogress + /// GET [Read("getbackupprogress")] public BackupProgress GetBackupProgress() { @@ -797,7 +864,10 @@ public BackupProgress GetBackupProgress() /// /// Get the backup history /// Backup - /// Backup history + /// Backup history + /// api/2.0/portal/getbackuphistory + /// GET + /// list [Read("getbackuphistory")] public List GetBackupHistory() { @@ -813,8 +883,11 @@ public List GetBackupHistory() /// Deletes the backup with the ID specified in the request. /// /// Delete the backup - /// Backup ID + /// Backup ID /// Backup + /// api/2.0/portal/deletebackup/{id} + /// DELETE + /// [Delete("deletebackup/{id}")] public void DeleteBackup(Guid id) { @@ -831,7 +904,9 @@ public void DeleteBackup(Guid id) /// /// Delete the backup history /// Backup - /// Backup history + /// api/2.0/portal/deletebackuphistory + /// DELETE + /// [Delete("deletebackuphistory")] public void DeleteBackupHistory() { @@ -844,15 +919,17 @@ public void DeleteBackupHistory() } /// - /// Starts the data restoring process of the current portal with the parameters specified in the request. + /// Starts the data restoring process for the current portal with the parameters specified in the request. /// /// Start the restoring process - /// Backup ID - /// Storage type - /// Storage parameters - /// Notifies users about backup or not + /// Backup ID + /// Storage type ("Documents", "ThridpartyDocuments", "CustomCloud", "Local", "DataStore", or "ThirdPartyConsumer") + /// Storage parameters + /// Specifies whether to notify the users about the backup or not /// Backup - /// Restoring progress + /// Restoring progress + /// api/2.0/portal/startrestore + /// POST [Create("startrestore")] public BackupProgress StartBackupRestore(string backupId, BackupStorageType storageType, IEnumerable> storageParams, bool notify) { @@ -869,7 +946,9 @@ public BackupProgress StartBackupRestore(string backupId, BackupStorageType stor /// /// Get the restoring progress /// Backup - /// Restoring progress + /// Restoring progress + /// api/2.0/portal/getrestoreprogress + /// GET [Read("getrestoreprogress", true, false)] //NOTE: this method doesn't check payment!!! public BackupProgress GetRestoreProgress() { @@ -884,9 +963,12 @@ public BackupProgress GetRestoreProgress() /// /// Returns the path to the backup temporary directory. /// - /// Get the backup temporary path + /// Get the path to the backup temporary directory /// Backup - /// Backup temporary path + /// Alias + /// The path to the backup temporary directory + /// api/2.0/portal/backuptmp + /// GET ///false [Read("backuptmp")] public string GetTempPath(string alias) @@ -900,10 +982,11 @@ public string GetTempPath(string alias) } /// - /// Deletes the current portal immediately + /// Deletes the current portal immediately. /// /// Delete the current portal - /// + /// api/2.0/portal/deleteportalimmediately + /// DELETE ///false [Delete("deleteportalimmediately")] public void DeletePortalImmediately() @@ -940,8 +1023,10 @@ public void DeletePortalImmediately() /// Updates a portal name with a new one specified in the request. /// /// Update a portal name - /// New portal name + /// New portal name /// Message about renaming a portal + /// api/2.0/portal/portalrename + /// PUT ///false [Update("portalrename")] public object UpdatePortalName(string alias) @@ -1029,9 +1114,12 @@ private static string CreateReference(HttpRequest request, string tenantDomain, /// Sends congratulations to the user after registering the portal. /// /// Send congratulations - /// User ID - /// Email key + /// User ID + /// Email key + /// api/2.0/portal/sendcongratulations + /// POST ///false + /// false [Create("sendcongratulations", false)] //NOTE: this method doesn't require auth!!! public void SendCongratulations(Guid userid, string key) { @@ -1069,9 +1157,11 @@ public void SendCongratulations(Guid userid, string key) /// /// Remove a comment /// Comments - /// Comment ID - /// Domain name + /// Comment ID + /// Domain name /// Operation status + /// api/2.0/portal/fcke/comment/removecomplete + /// PUT ///false [Update("fcke/comment/removecomplete")] public object RemoveCommentComplete(string commentid, string domain) @@ -1092,10 +1182,12 @@ public object RemoveCommentComplete(string commentid, string domain) /// /// Cancel comment editing /// Comments - /// Comment ID - /// Domain name - /// Specifies if a comment was edited or not + /// Comment ID + /// Domain name + /// Specifies if a comment was edited or not /// Operation status + /// api/2.0/portal/fcke/comment/cancelcomplete + /// PUT ///false [Update("fcke/comment/cancelcomplete")] public object CancelCommentComplete(string commentid, string domain, bool isedit) @@ -1120,11 +1212,13 @@ public object CancelCommentComplete(string commentid, string domain, bool isedit /// /// Edit a comment /// Comments - /// Comment ID - /// Domain name - /// New comment in the HTML format - /// Specifies if a comment was edited or not + /// Comment ID + /// Domain name + /// New comment in the HTML format + /// Specifies if a comment was edited or not /// Operation status + /// api/2.0/portal/fcke/comment/editcomplete + /// PUT ///false [Update("fcke/comment/editcomplete")] public object EditCommentComplete(string commentid, string domain, string html, bool isedit) @@ -1146,13 +1240,15 @@ public object EditCommentComplete(string commentid, string domain, string html, /// /// Get the promotion bar /// Promotions - /// Domain name - /// Page - /// Specifies if the bar will be displayed in the desktop app or not + /// Domain name + /// Page + /// Specifies if the bar will be displayed in the desktop app or not /// Promotion bar + /// api/2.0/portal/bar/promotions + /// GET ///false [Read("bar/promotions")] - public string GetBarPromotions(string domain, string page, bool desktop) + public async Task GetBarPromotions(string domain, string page, bool desktop) { try { @@ -1192,11 +1288,13 @@ public string GetBarPromotions(string domain, string page, bool desktop) uriBuilder.Query = query.ToString(); - using (var client = new WebClient()) + Func> requestFunc = async () => { - client.Encoding = System.Text.Encoding.UTF8; - return client.DownloadString(uriBuilder.Uri); - } + return await httpClient.GetStringAsync(uriBuilder.Uri); + }; + + return await ResiliencePolicyManager.GetStringWithPoliciesAsync("promotions", requestFunc); + } catch (Exception ex) { @@ -1210,7 +1308,9 @@ public string GetBarPromotions(string domain, string page, bool desktop) /// /// Mark the promotion bar as read /// Promotions - /// ID + /// ID + /// api/2.0/portal/bar/promotions/mark/{id} + /// POST ///false [Create("bar/promotions/mark/{id}")] public void MarkBarPromotion(string id) @@ -1239,14 +1339,16 @@ public void MarkBarPromotion(string id) /// /// Get the promotion bar tips /// Promotions - /// Domain name - /// Page - /// Product administator - /// Specifies if the bar will be displayed in the desktop app or not + /// Domain name + /// Page + /// Specifies if the current user is a product administrator or not + /// Specifies if the bar will be displayed in the desktop app or not /// Promotion bar tips + /// api/2.0/portal/bar/tips + /// GET ///false [Read("bar/tips")] - public string GetBarTips(string domain, string page, bool productAdmin, bool desktop) + public async Task GetBarTips(string domain, string page, bool productAdmin, bool desktop) { try { @@ -1277,11 +1379,12 @@ public string GetBarTips(string domain, string page, bool productAdmin, bool des uriBuilder.Query = query.ToString(); - using (var client = new WebClient()) + Func> requestFunc = async () => { - client.Encoding = System.Text.Encoding.UTF8; - return client.DownloadString(uriBuilder.Uri); - } + return await httpClient.GetStringAsync(uriBuilder.Uri); + }; + + return await ResiliencePolicyManager.GetStringWithPoliciesAsync("tips", requestFunc); } catch (Exception ex) { @@ -1295,7 +1398,9 @@ public string GetBarTips(string domain, string page, bool productAdmin, bool des /// /// Mark the promotion bar tips as read /// Promotions - /// ID + /// ID + /// api/2.0/portal/bar/tips/mark/{id} + /// POST ///false [Create("bar/tips/mark/{id}")] public void MarkBarTip(string id) @@ -1326,6 +1431,8 @@ public void MarkBarTip(string id) /// /// Delete the promotion bar tips /// Promotions + /// api/2.0/portal/bar/tips + /// DELETE ///false [Delete("bar/tips")] public void DeleteBarTips() @@ -1356,6 +1463,9 @@ public void DeleteBarTips() /// Get the search settings /// Search /// Search settings + ///api/2.0/portal/search + ///GET + /// list [Read("search")] public IEnumerable GetSearchSettings() { @@ -1370,11 +1480,13 @@ public IEnumerable GetSearchSettings() } /// - /// Checks if the searching process is available or not. + /// Checks if the search process is available or not. /// /// Check the search availability /// Search /// Search information + ///api/2.0/portal/search/state + ///GET [Read("search/state")] public object CheckSearchAvailable() { @@ -1388,8 +1500,10 @@ public object CheckSearchAvailable() /// /// Reindex a page /// Search - /// Index name + /// Index name /// Search information + /// api/2.0/portal/search/reindex + /// POST [Create("search/reindex")] public object Reindex(string name) { @@ -1404,7 +1518,10 @@ public object Reindex(string name) /// /// Set the search settings /// Search - /// Search settings + /// Search settings + /// api/2.0/portal/search + /// POST + /// [Create("search")] public void SetSearchSettings(List items) { @@ -1418,6 +1535,8 @@ public void SetSearchSettings(List items) /// /// Get a random password /// Random password + /// api/2.0/portal/randompwd + /// GET ///false [Read(@"randompwd")] public string GetRandomPassword() @@ -1426,7 +1545,7 @@ public string GetRandomPassword() var ps = PasswordSettings.Load(); - var maxLength = PasswordSettings.MaxLength + var maxLength = ps.MaxLength - (ps.Digits ? 1 : 0) - (ps.UpperCase ? 1 : 0) - (ps.SpecSymbols ? 1 : 0); @@ -1459,8 +1578,10 @@ private static string GeneratePassword(int minLength, int maxLength, string nois /// Returns the information about the IP address specified in the request. /// /// Get the IP information - /// IP address + /// IP address /// IP information + /// api/2.0/portal/ip/{ipAddress} + /// GET ///false [Read("ip/{ipAddress}")] public object GetIPInformation(string ipAddress) @@ -1474,6 +1595,8 @@ public object GetIPInformation(string ipAddress) /// Marks a gift message as read. /// /// Mark a gift message as read + /// api/2.0/portal/gift/mark + /// POST ///false [Create("gift/mark")] public void MarkGiftAsReaded() diff --git a/module/ASC.Api/ASC.Api.Projects/Calendars/ProjectCalendar.cs b/module/ASC.Api/ASC.Api.Projects/Calendars/ProjectCalendar.cs index 612390835..bed742472 100644 --- a/module/ASC.Api/ASC.Api.Projects/Calendars/ProjectCalendar.cs +++ b/module/ASC.Api/ASC.Api.Projects/Calendars/ProjectCalendar.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Comments.cs b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Comments.cs index ec9d60864..fc3b386a4 100644 --- a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Comments.cs +++ b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Comments.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,16 +39,18 @@ public partial class ProjectApi { #region comments - /// - ///Returns the information about a comment with the ID specified in the request. - /// - /// - ///Get a comment - /// - ///Comments - ///Comment ID - ///Comment - /// + /// + /// Returns the information about a comment with the ID specified in the request. + /// + /// + /// Get a comment + /// + /// Comments + /// Comment ID + /// Comment + /// + /// api/2.0/project/comment/{commentid} + /// GET [Read(@"comment/{commentid}")] public CommentWrapper GetComment(Guid commentid) { @@ -65,8 +67,8 @@ public CommentWrapper GetComment(Guid commentid) /////Update a comment ///// /////Comments - /////Comment ID - /////Comment text + /////Comment ID + /////Comment text /////Updated comment ///// ///// @@ -94,16 +96,18 @@ public CommentWrapper GetComment(Guid commentid) // return new CommentWrapper(comment); //} - /// - ///Get a preview of a project comment with the ID specified in the request. - /// - /// - ///Get a comment preview - /// - ///Comments - ///Comment text in the HTML format - ///Comment ID or empty string if a comment is new - ///Comment information + /// + /// Returns a preview of a project comment with the ID specified in the request. + /// + /// + /// Get a comment preview + /// + /// Comments + /// Comment text in the HTML format + /// Comment ID, or empty string if a comment is new + /// Comment information + /// api/2.0/project/comment/preview + /// POST [Create(@"comment/preview")] public CommentInfo GetProjectCommentPreview(string htmltext, string commentid) { @@ -145,14 +149,15 @@ public CommentInfo GetProjectCommentPreview(string htmltext, string commentid) return info; } - /// - ///Removes a comment with the ID specified in the request. - /// - ///Remove a comment - ///
    Comments
    - ///Comment ID - ///Comment ID - ///Comments + /// + /// Removes a comment with the ID specified in the request. + /// + /// Remove a comment + /// Comment ID + /// Comment ID + /// Comments + /// api/2.0/project/comment/{commentid} + /// DELETE [Delete("comment/{commentid}")] public string RemoveProjectComment(string commentid) { @@ -176,12 +181,14 @@ public string RemoveProjectComment(string commentid) /// Adds a project comment with the parameters specified in the request. The parent comment ID can also be selected. /// /// Add a project comment - /// Parent comment ID - /// Entity ID - /// Comment text - /// Comment type (message or task) - /// Comments - /// Comment information + /// Parent comment ID + /// Entity ID + /// Comment text + /// Comment type (message or task) + /// Projects + /// Comment information + /// api/2.0/project/comment + /// POST [Create("comment")] public CommentInfo AddProjectComment(string parentcommentid, int entityid, string content, string type) { @@ -211,10 +218,12 @@ public CommentInfo AddProjectComment(string parentcommentid, int entityid, strin /// Updates the seleted comment using the comment text specified in the request. /// /// Update a comment - /// Comment ID - /// New comment text - ///Comments + /// Comment ID + /// New comment text + /// Comments /// Updated comment + /// api/2.0/project/comment/{commentid} + /// PUT [Update("comment/{commentid}")] public string UpdateComment(string commentid, string content) { diff --git a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Messages.cs b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Messages.cs index a974cf9ea..2a7fa7df4 100644 --- a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Messages.cs +++ b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Messages.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,25 +35,28 @@ namespace ASC.Api.Projects { public partial class ProjectApi { - /// - ///Returns a list with the detailed information about all the messages matching the filter parameters specified in the request. - /// - /// - /// Get messages by filter - /// - ///Discussions - /// Project ID - ///Project tag - ///Departament GUID - ///Participant GUID - ///Minimum value of message creation date - ///Maximum value of message creation date - ///Last message ID - ///Messages only from my projects or not - ///Messages only from followed discussions or not - ///Message status - ///List of messages - /// + /// + /// Returns a list with the detailed information about all the messages matching the filter parameters specified in the request. + /// + /// + /// Get filtered messages + /// + /// Discussions + /// Project ID + /// Project tag + /// Departament GUID + /// Participant GUID + /// Minimum value of message creation date + /// Maximum value of message creation date + /// Last message ID + /// Specifies whether to return messages only from my projects or not + /// Specifies whether to return messages only from followed discussions or not + /// Message status ("Open" or "Archived") + /// List of messages + /// + /// api/2.0/project/message/filter + /// GET + /// list [Read(@"message/filter")] public IEnumerable GetMessageByFilter(int projectid, int tag, Guid departament, Guid participant, ApiDateTime createdStart, ApiDateTime createdStop, int lastId, @@ -80,16 +83,19 @@ public IEnumerable GetMessageByFilter(int projectid, int tag, Gu return messageEngine.GetByFilter(filter).NotFoundIfNull().Select(MessageWrapperSelector).ToList(); } - /// - ///Returns a list of all the messages in the discussions within a project with the ID specified in the request. - /// - /// - ///Get messages - /// - ///Discussions - ///Project ID - ///List of messages - /// + /// + /// Returns a list of all the discussion messages within a project with the ID specified in the request. + /// + /// + /// Get messages + /// + /// Discussions + /// Project ID + /// List of messages + /// + /// api/2.0/project/{projectid}/message + /// GET + /// list [Read(@"{projectid:[0-9]+}/message")] public IEnumerable GetProjectMessages(int projectid) { @@ -100,21 +106,23 @@ public IEnumerable GetProjectMessages(int projectid) return EngineFactory.MessageEngine.GetByProject(projectid).Select(MessageWrapperSelector).ToList(); } - /// - ///Adds a message to the selected discussion within a project with the ID specified in the request. - /// - /// - ///Add a message - /// - ///Discussions - ///Project ID - ///Discussion title - ///Message text - ///User IDs (GUIDs) separated with ',' - ///Notifies participants about a message or not - ///Message - /// - /// + /// + /// Adds a message to the selected discussion within a project with the ID specified in the request. + /// + /// + /// Add a message + /// + /// Discussions + /// Project ID + /// Discussion title + /// Message text + /// User IDs (GUIDs) separated with ',' + /// Specifies whether to notify participants about a message or not + /// Message + /// + /// + /// api/2.0/project/{projectid}/message + /// POST [Create(@"{projectid:[0-9]+}/message")] public MessageWrapper AddProjectMessage(int projectid, string title, string content, string participants, bool? notify) { @@ -138,22 +146,24 @@ public MessageWrapper AddProjectMessage(int projectid, string title, string cont return MessageWrapperSelector(discussion); } - /// - ///Updates the selected message in the discussion within a project with the ID specified in the request. - /// - /// - ///Update a message - /// - ///Discussions - ///Message ID - ///Project ID - ///Discussion title - ///New message text - ///New user IDs (GUIDs) separated with ',' - ///Notifies participants about a message or not - ///Updated message - /// - /// + /// + /// Updates the selected discussion message from a project with the ID specified in the request. + /// + /// + /// Update a message + /// + /// Discussions + /// Message ID + /// Project ID + /// Discussion title + /// New message text + /// New user IDs (GUIDs) separated with ',' + /// Specifies whether to notify participants about a message or not + /// Updated message + /// + /// + /// api/2.0/project/message/{messageid} + /// PUT [Update(@"message/{messageid:[0-9]+}")] public MessageWrapperFull UpdateProjectMessage(int messageid, int projectid, string title, string content, string participants, bool? notify) { @@ -173,18 +183,20 @@ public MessageWrapperFull UpdateProjectMessage(int messageid, int projectid, str return new MessageWrapperFull(this, discussion, new ProjectWrapperFull(this, discussion.Project, EngineFactory.FileEngine.GetRoot(discussion.Project.ID)), GetProjectMessageSubscribers(messageid)); } - /// - ///Updates the selected message status. - /// - /// - ///Update a message status - /// - ///Discussions - ///Message ID - ///New message status - ///Updated message - /// - /// + /// + /// Updates the selected message status. + /// + /// + /// Update a message status + /// + /// Discussions + /// Message ID + /// New message status ("Open" or "Archived") + /// Updated message + /// + /// + /// api/2.0/project/message/{messageid}/status + /// PUT [Update(@"message/{messageid:[0-9]+}/status")] public MessageWrapper UpdateProjectMessage(int messageid, MessageStatus status) { @@ -199,16 +211,18 @@ public MessageWrapper UpdateProjectMessage(int messageid, MessageStatus status) return MessageWrapperSelector(discussion); } - /// - ///Deletes a message with the ID specified in the request from a project discussion. - /// - /// - ///Delete a message - /// - ///Discussions - ///Message ID - ///Message - /// + /// + /// Deletes a message with the ID specified in the request from a project discussion. + /// + /// + /// Delete a message + /// + /// Discussions + /// Message ID + /// Message + /// + /// api/2.0/project/message/{messageid} + /// DELETE [Delete(@"message/{messageid:[0-9]+}")] public MessageWrapper DeleteProjectMessage(int messageid) { @@ -230,16 +244,18 @@ private static IEnumerable ToGuidList(string participants) : null; } - /// - ///Returns the detailed information about a message with the ID specified in the request. - /// - /// - ///Get a message - /// - ///Discussions - ///Message ID - ///Message - /// + /// + /// Returns the detailed information about a discussion message with the ID specified in the request. + /// + /// + /// Get a message + /// + /// Discussions + /// Message ID + /// Message + /// + /// api/2.0/project/message/{messageid} + /// GET [Read(@"message/{messageid:[0-9]+}")] public MessageWrapperFull GetProjectMessage(int messageid) { @@ -251,16 +267,19 @@ public MessageWrapperFull GetProjectMessage(int messageid) return new MessageWrapperFull(this, discussion, project, subscribers, files, comments.Where(r => r.Parent.Equals(Guid.Empty)).Select(x => GetCommentInfo(comments, x, discussion)).ToList()); } - /// - ///Returns the detailed information about files attached to the message with the ID specified in the request. - /// - /// - ///Get message files - /// - ///Files - ///Message ID - ///List of message files - /// + /// + /// Returns the detailed information about files attached to the discussion message with the ID specified in the request. + /// + /// + /// Get message files + /// + /// Files + /// Message ID + /// List of message files + /// + /// api/2.0/project/message/{messageid}/files + /// GET + /// list [Read(@"message/{messageid:[0-9]+}/files")] public IEnumerable GetMessageFiles(int messageid) { @@ -272,17 +291,19 @@ public IEnumerable GetMessageFiles(int messageid) return messageEngine.GetFiles(message).Select(FileWrapperSelector); } - /// - ///Uploads files specified in the request to the selected message. - /// - /// - ///Upload files to the message - /// - ///Files - ///Message ID - ///File IDs - ///Message - /// + /// + /// Uploads files specified in the request to the selected discussion message. + /// + /// + /// Upload files to the message + /// + /// Files + /// Message ID + /// File IDs + /// Message + /// + /// api/2.0/project/message/{messageid}/files + /// POST [Create(@"message/{messageid:[0-9]+}/files")] public MessageWrapper UploadFilesToMessage(int messageid, IEnumerable files) { @@ -307,16 +328,18 @@ public MessageWrapper UploadFilesToMessage(int messageid, IEnumerable files } /// - ///Detaches the selected file from a message with the ID specified in the request. + ///Detaches the selected file from the discussion message with the ID specified in the request. /// /// ///Detach a file from a message /// ///Files - ///Message ID - ///File ID - ///Message + ///Message ID + ///File ID + ///Message /// + ///api/2.0/project/message/{messageid}/files + ///DELETE [Delete(@"message/{messageid:[0-9]+}/files")] public MessageWrapper DetachFileFromMessage(int messageid, int fileid) { @@ -334,16 +357,18 @@ public MessageWrapper DetachFileFromMessage(int messageid, int fileid) } /// - ///Detaches the selected files from a message with the ID specified in the request. + ///Detaches the selected files from the discussion message with the ID specified in the request. /// /// ///Detach files from a message /// - ///Files - ///Message ID - ///File ID + ///Discussions + ///Message ID + ///File IDs ///Message /// + ///api/2.0/project/message/{messageid}/filesmany + /// DELETE ///false [Delete(@"message/{messageid:[0-9]+}/filesmany")] public MessageWrapper DetachFileFromMessage(int messageid, IEnumerable files) @@ -368,31 +393,37 @@ public MessageWrapper DetachFileFromMessage(int messageid, IEnumerable file return MessageWrapperSelector(discussion); } - /// - ///Returns a list of the recent messages in the discussions within a project with the ID specified in the request. - /// - /// - ///Get recent messages - /// - ///Discussions - ///List of recent messages - /// + /// + /// Returns a list of the recent discussion messages from a project with the ID specified in the request. + /// + /// + /// Get recent messages + /// + /// Discussions + /// List of recent messages + /// + /// api/2.0/project/message + /// GET + /// list [Read(@"message")] public IEnumerable GetProjectRecentMessages() { return EngineFactory.MessageEngine.GetMessages((int)StartIndex, (int)Count).Select(MessageWrapperSelector); } - /// - ///Returns a list of comments for the discussion message within a project with the ID specified in the request. - /// - /// - ///Get message comments - /// - ///Comments - ///Message ID - ///Message comments - /// + /// + /// Returns a list of the discussion message comments from a project with the ID specified in the request. + /// + /// + /// Get message comments + /// + /// Discussions + /// Message ID + /// Message comments + /// + /// api/2.0/project/message/{messageid}/comment + /// GET + /// list [Read(@"message/{messageid:[0-9]+}/comment")] public IEnumerable GetProjectMessagesComments(int messageid) { @@ -402,18 +433,20 @@ public IEnumerable GetProjectMessagesComments(int messageid) return EngineFactory.CommentEngine.GetComments(message).Select(x => new CommentWrapper(this, x, message)); } - /// - ///Adds a comment to the selected message with the text specified in the request. The parent comment ID can be also selected. - /// - /// - ///Add a message comment - /// - ///Comments - ///Message ID - ///Comment text - ///Parent comment ID - ///Comment - /// + /// + /// Adds a comment to the selected discussion message with the text specified in the request. The parent comment ID can be also selected. + /// + /// + /// Add a message comment + /// + /// Discussions + /// Message ID + /// Comment text + /// Parent comment ID + /// Comment + /// + /// api/2.0/project/message/{messageid}/comment + /// POST [Create(@"message/{messageid:[0-9]+}/comment")] public CommentWrapper AddProjectMessagesComment(int messageid, string content, Guid parentId) { @@ -442,16 +475,18 @@ public CommentWrapper AddProjectMessagesComment(int messageid, string content, G return new CommentWrapper(this, comment, message); } - /// - ///Subscribes to the notifications about the actions performed in the discussion with the selected message. - /// - /// - ///Subscribe to discussion - /// - ///Discussions - ///Discussion - ///Message ID - /// + /// + /// Subscribes to the notifications about the actions performed in the discussion with the selected message. + /// + /// + /// Subscribe to discussion + /// + /// Discussions + /// Discussion + /// Message ID + /// + /// api/2.0/project/message/{messageid}/subscribe + /// PUT [Update(@"message/{messageid:[0-9]+}/subscribe")] public MessageWrapper SubscribeToMessage(int messageid) { @@ -466,16 +501,18 @@ public MessageWrapper SubscribeToMessage(int messageid) return new MessageWrapperFull(this, discussion, ProjectWrapperFullSelector(discussion.Project, EngineFactory.FileEngine.GetRoot(discussion.Project.ID)), GetProjectMessageSubscribers(messageid)); } - /// - ///Checks subscription to the notifications about the actions performed in the discussion with the selected message. - /// - /// - ///Check subscription to discussion - /// - ///Discussions - ///Message ID - ///Boolean value: True - subscibed, False - unsubscribed - /// + /// + /// Checks subscription to the notifications about the actions performed in the discussion with the selected message. + /// + /// + /// Check the discussion subscription + /// + /// Discussions + /// Message ID + /// Boolean value: true - subscibed, false - unsubscribed + /// + /// api/2.0/project/message/{messageid}/subscribe + /// GET [Read(@"message/{messageid:[0-9]+}/subscribe")] public bool IsSubscribedToMessage(int messageid) { @@ -488,16 +525,20 @@ public bool IsSubscribedToMessage(int messageid) return messageEngine.IsSubscribed(message); } - /// - ///Returns a list of all the subscribers of the discussion with the selected message. - /// - /// - ///Get subscribers - /// - ///Discussions - ///Message ID - ///List of subscibers - /// + /// + /// Returns a list of all the subscribers to the discussion with the selected message. + /// + /// + /// Get discussion subscribers + /// + /// Discussions + /// Message ID + /// List of subscibers + /// + /// api/2.0/project/message/{messageid}/subscribes + /// GET + /// list + /// [Read(@"message/{messageid:[0-9]+}/subscribes")] public IEnumerable GetProjectMessageSubscribers(int messageid) { @@ -511,15 +552,17 @@ public IEnumerable GetProjectMessageSubscribers(int messagei .OrderBy(r => r.DisplayName).ToList(); } - /// - ///Returns a preview of the discussion message. - /// - /// - ///Get a message preview - /// - ///Discussions - ///Message text in the HTML format - ///Message preview + /// + /// Returns a preview of the discussion message. + /// + /// + /// Get a message preview + /// + /// Discussions + /// Message text in the HTML format + /// Message preview + /// api/2.0/project/message/discussion/preview + /// POST [Create(@"message/discussion/preview")] public string GetPreview(string htmltext) { diff --git a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Milestones.cs b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Milestones.cs index 94706e5ff..f9958b854 100644 --- a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Milestones.cs +++ b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Milestones.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,52 +34,61 @@ public partial class ProjectApi { #region milestone - /// - ///Returns a list of the recent milestones within all the portal projects. - /// - /// - ///Get recent milestones - /// - ///Milestones - ///List of milestones + /// + /// Returns a list of the recent milestones within all the portal projects. + /// + /// + /// Get recent milestones + /// + /// Milestones + /// List of milestones + /// api/2.0/project/milestone + /// GET + /// list [Read(@"milestone")] public IEnumerable GetRecentMilestones() { return EngineFactory.MilestoneEngine.GetRecentMilestones((int)Count).Select(MilestoneWrapperSelector).ToList(); } - /// - ///Returns a list of all the upcoming milestones within all the portal projects. - /// - /// - ///Get milestones - /// - ///Milestones - ///List of milestones + /// + /// Returns a list of all the upcoming milestones within all the portal projects. + /// + /// + /// Get upcoming milestones + /// + /// Milestones + /// List of milestones + /// api/2.0/project/milestone/upcoming + /// GET + /// list [Read(@"milestone/upcoming")] public IEnumerable GetUpcomingMilestones() { return EngineFactory.MilestoneEngine.GetUpcomingMilestones((int)Count).Select(MilestoneWrapperSelector).ToList(); } - /// - ///Returns a list of all the milestones matching the parameters specified in the request. - /// - /// - ///Get milestones by filter - /// - ///Milestones - ///Project ID - ///Project tag - ///Milestone status (Open or Closed) - ///Minimum value of task deadline - ///Maximum value of task deadline - ///Task responsible GUID - ///Last milestone ID - ///Returns milestones only from my projects - ///Milestone responsible GUID - ///List of milestones - /// + /// + /// Returns a list of all the milestones matching the parameters specified in the request. + /// + /// + /// Get filtered milestones + /// + /// Milestones + /// Project ID + /// Milestone tag + /// Milestone status ("Open" or "Closed") + /// Minimum value of milestone deadline + /// Maximum value of milestone deadline + /// Milestone responsible GUID + /// Last milestone ID + /// Specifies whether to return milestones only from my projects or not + /// Milestone responsible GUID + /// List of milestones + /// + /// api/2.0/project/milestone/filter + /// GET + /// list [Read(@"milestone/filter")] public IEnumerable GetMilestonesByFilter( int projectid, @@ -117,31 +126,37 @@ public IEnumerable GetMilestonesByFilter( return milestoneEngine.GetByFilter(filter).NotFoundIfNull().Select(MilestoneWrapperSelector).ToList(); } - /// - ///Returns a list of all the overdue milestones in the portal projects. - /// - /// - ///Get overdue milestones - /// - ///Milestones - ///List of milestones + /// + /// Returns a list of all the overdue milestones in the portal projects. + /// + /// + /// Get overdue milestones + /// + /// Milestones + /// List of milestones + /// api/2.0/project/milestone/late + /// GET + /// list [Read(@"milestone/late")] public IEnumerable GetLateMilestones() { return EngineFactory.MilestoneEngine.GetLateMilestones((int)Count).Select(MilestoneWrapperSelector).ToList(); } - /// - ///Returns a list of all the milestones with the deadline specified in the request. - /// - /// - ///Get milestones by deadline - /// - ///Milestones - ///Deadline year - ///Deadline month - ///Deadline day - ///List of milestones + /// + /// Returns a list of all the milestones with the deadline specified in the request. + /// + /// + /// Get milestones by deadline + /// + /// Milestones + /// Deadline year + /// Deadline month + /// Deadline day + /// List of milestones + /// api/2.0/project/milestone/{year}/{month}/{day} + /// GET + /// list [Read(@"milestone/{year}/{month}/{day}")] public IEnumerable GetMilestonesByDeadLineFull(int year, int month, int day) { @@ -149,16 +164,19 @@ public IEnumerable GetMilestonesByDeadLineFull(int year, int m return milestones.Select(MilestoneWrapperSelector).ToList(); } - /// - ///Returns a list of all the milestones with the deadline month specified in the request. - /// - /// - ///Get milestones by deadline month - /// - ///Milestones - ///Deadline year - ///Deadline month - ///List of milestones + /// + /// Returns a list of all the milestones with the deadline month specified in the request. + /// + /// + /// Get milestones by deadline month + /// + /// Milestones + /// Deadline year + /// Deadline month + /// List of milestones + /// api/2.0/project/milestone/{year}/{month} + /// GET + /// list [Read(@"milestone/{year}/{month}")] public IEnumerable GetMilestonesByDeadLineMonth(int year, int month) { @@ -166,16 +184,18 @@ public IEnumerable GetMilestonesByDeadLineMonth(int year, int return milestones.Select(MilestoneWrapperSelector).ToList(); } - /// - ///Returns a list with the detailed information about a milestone with the ID specified in the request. - /// - /// - ///Get a milestone - /// - ///Milestones - ///Milestone ID - ///Milestone - /// + /// + /// Returns the detailed information about a milestone with the ID specified in the request. + /// + /// + /// Get a milestone + /// + /// Milestones + /// Milestone ID + /// Milestone + /// + /// api/2.0/project/milestone/{id} + /// GET [Read(@"milestone/{id:[0-9]+}")] public MilestoneWrapper GetMilestoneById(int id) { @@ -184,16 +204,19 @@ public MilestoneWrapper GetMilestoneById(int id) return MilestoneWrapperSelector(milestoneEngine.GetByID(id)); } - /// - ///Returns a list of all the tasks within a milestone with the ID specified in the request. - /// - /// - ///Get milestone tasks - /// - ///Milestones - ///Milestone ID - ///List of tasks - /// + /// + /// Returns a list of all the tasks from a milestone with the ID specified in the request. + /// + /// + /// Get milestone tasks + /// + /// Milestones + /// Milestone ID + /// List of tasks + /// + /// api/2.0/project/milestone/{id}/task + /// GET + /// list [Read(@"milestone/{id:[0-9]+}/task")] public IEnumerable GetMilestoneTasks(int id) { @@ -201,38 +224,40 @@ public IEnumerable GetMilestoneTasks(int id) return EngineFactory.TaskEngine.GetMilestoneTasks(id).Select(TaskWrapperSelector).ToList(); } - /// - ///Updates the selected milestone changing the milestone parameters (title, deadline, status, etc.) specified in the request. - /// - /// - ///Update a milestone - /// - ///Milestones - ///Milestone ID - ///New milestone title - ///New milestone deadline - ///Specifies if this is a key milestone or not - ///New milestone status - ///Reminds me 48 hours before the milestone due date - ///New milestone description - ///New project ID - ///New milestone responsible - ///Notifies responsible about the milestone actions or not - ///Updated milestone - /// - /// - /// - /// + /// Updates the selected milestone changing the milestone parameters (title, deadline, status, etc.) specified in the request. + /// + /// + /// Update a milestone + /// + /// Milestones + /// Milestone ID + /// New milestone title + /// New milestone deadline + /// Specifies if this is a key milestone or not + /// New milestone status ("Open" or "Closed") + /// Specifies whether to remind me 48 hours before the milestone due date or not + /// New milestone description + /// New project ID + /// New milestone responsible + /// Specifies whether to notify responsible about the milestone actions or not + /// Updated milestone + /// + /// + /// + /// - /// + /// { + /// title:"New title", + /// deadline:"2011-03-23T14:27:14", + /// isKey:false, + /// status:"Open" + /// } + /// ]]> + /// + /// api/2.0/project/milestone/{id} + /// PUT [Update(@"milestone/{id:[0-9]+}")] public MilestoneWrapper UpdateMilestone(int id, string title, ApiDateTime deadline, bool? isKey, MilestoneStatus status, bool? isNotify, string description, int projectID, Guid responsible, bool notifyResponsible) { @@ -264,27 +289,29 @@ public MilestoneWrapper UpdateMilestone(int id, string title, ApiDateTime deadli return MilestoneWrapperSelector(milestone); } - /// - ///Updates a status of a milestone with the ID specified in the request. - /// - /// - ///Update a milestone status - /// - ///Milestones - ///Milestone ID - ///New milestone status (Open or Closed) - ///Updated milestone - /// - /// - /// - /// + /// Updates a status of a milestone with the ID specified in the request. + /// + /// + /// Update a milestone status + /// + /// Milestones + /// Milestone ID + /// New milestone status ("Open" or "Closed") + /// Updated milestone + /// + /// + /// + /// - /// + /// { + /// status:"Open" + /// } + /// ]]> + /// + /// api/2.0/project/milestone/{id}/status + /// PUT [Update(@"milestone/{id:[0-9]+}/status")] public MilestoneWrapper UpdateMilestone(int id, MilestoneStatus status) { @@ -298,16 +325,18 @@ public MilestoneWrapper UpdateMilestone(int id, MilestoneStatus status) return MilestoneWrapperSelector(milestone); } - /// - ///Deletes a milestone with the ID specified in the request. - /// - /// - ///Delete a milestone - /// - ///Milestones - ///Milestone ID - ///Deleted milestone - /// + /// + /// Deletes a milestone with the ID specified in the request. + /// + /// + /// Delete a milestone + /// + /// Milestones + /// Milestone ID + /// Deleted milestone + /// + /// api/2.0/project/milestone/{id} + /// DELETE [Delete(@"milestone/{id:[0-9]+}")] public MilestoneWrapper DeleteMilestone(int id) { @@ -321,16 +350,19 @@ public MilestoneWrapper DeleteMilestone(int id) return MilestoneWrapperSelector(milestone); } - /// - ///Deletes the milestones with the IDs specified in the request. - /// - /// - ///Delete milestones - /// - ///Milestones - ///Milestone IDs - ///Deleted milestones - /// + /// + /// Deletes the milestones with the IDs specified in the request. + /// + /// + /// Delete milestones + /// + /// Milestones + /// Milestone IDs + /// Deleted milestones + /// + /// api/2.0/project/milestone + /// DELETE + /// list [Delete(@"milestone")] public IEnumerable DeleteMilestones(int[] ids) { diff --git a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Projects.cs b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Projects.cs index d40f34d00..185fad681 100644 --- a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Projects.cs +++ b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Projects.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,28 +52,34 @@ public partial class ProjectApi #region Read - /// - ///Returns a list of all the portal projects with the base information about them. - /// - /// - ///Get projects - /// - ///Projects - ///List of projects + /// + /// Returns a list of all the portal projects with the base information about them. + /// + /// + /// Get projects + /// + /// Projects + /// List of projects + /// api/2.0/project + /// GET + /// list [Read("")] public IEnumerable GetAllProjects() { return EngineFactory.ProjectEngine.GetAll().Select(ProjectWrapperSelector).ToList(); } - /// - ///Returns a list of all the projects in which the current user participates. - /// - /// - ///Get my projects - /// - ///Projects - ///List of projects + /// + /// Returns a list of all the projects in which the current user participates. + /// + /// + /// Get my projects + /// + /// Projects + /// List of projects + /// api/2.0/project/@self + /// GET + /// list [Read(@"@self")] public IEnumerable GetMyProjects() { @@ -84,14 +90,17 @@ public IEnumerable GetMyProjects() .ToList(); } - /// - ///Returns a list of all the projects which the current user follows. - /// - /// - ///Get my followed projects - /// - ///Projects - ///List of projects + /// + /// Returns a list of all the projects which the current user is following. + /// + /// + /// Get followed projects + /// + /// Projects + /// List of projects + /// api/2.0/project/@follow + /// GET + /// list [Read(@"@follow")] public IEnumerable GetFollowProjects() { @@ -102,31 +111,36 @@ public IEnumerable GetFollowProjects() .ToList(); } - /// - ///Returns a list of all the projects with a status specified in the request. - /// - /// - ///Get projects by status - /// - ///Projects - ///Project status: "open"|"paused"|"closed" - ///List of projects + /// + /// Returns a list of all the projects with a status specified in the request. + /// + /// + /// Get projects by status + /// + /// Projects + /// Project status ("Open", "Paused", or "Closed") + /// List of projects + /// api/2.0/project/{status} + /// GET + /// list [Read("{status:(open|paused|closed)}")] public IEnumerable GetProjects(ProjectStatus status) { return EngineFactory.ProjectEngine.GetAll(status, 0).Select(ProjectWrapperSelector).ToList(); } - /// - ///Returns the detailed information about a project with ID specified in the request. - /// - /// - ///Get a project by ID - /// - ///Projects - ///Project ID - ///Project - /// + /// + /// Returns the detailed information about a project with the ID specified in the request. + /// + /// + /// Get a project by ID + /// + /// Projects + /// Project ID + /// Project + /// + /// api/2.0/project/{id} + /// GET [Read(@"{id:[0-9]+}")] public ProjectWrapperFull GetProject(int id) { @@ -135,20 +149,23 @@ public ProjectWrapperFull GetProject(int id) return new ProjectWrapperFull(this, EngineFactory.ProjectEngine.GetFullProjectByID(id).NotFoundIfNull(), EngineFactory.FileEngine.GetRoot(id), isFollow, tags); } - /// - ///Returns a list of all the portal projects filtered by project title, status, participant ID and other parameters specified in the request. - /// - /// - ///Get filtered projects - /// - ///Projects - ///Project tag - ///Project status: "open"|"paused"|"closed" - ///Project participant GUID - ///Project manager GUID - ///Project department - ///Specifies if the current user follows this project or not - ///List of projects + /// + /// Returns a list of all the portal projects filtered by project title, status, participant ID, and other parameters specified in the request. + /// + /// + /// Get filtered projects + /// + /// Projects + /// Project tag + /// Project status ("Open", "Paused", or "Closed") + /// Project participant GUID + /// Project manager GUID + /// Project department + /// Specifies if the current user is following this project or not + /// List of projects + /// api/2.0/project/filter + /// GET + /// list [Read(@"filter")] public IEnumerable GetProjectsByFilter(int tag, ProjectStatus? status, Guid participant, Guid manager, Guid departament, bool follow) @@ -175,17 +192,20 @@ public IEnumerable GetProjectsByFilter(int tag, ProjectStatu return projects.Select((t, i) => ProjectWrapperFullSelector(t, projectRoots[i])).ToList(); } - /// - ///Returns the search results for a project containing the words/phrases matching the query specified in the request. - /// - /// - ///Search in a project - /// - ///Projects - ///Project ID - ///Search query - ///List of results - /// + /// + /// Returns the search results for a project containing the words/phrases matching the query specified in the request. + /// + /// + /// Search in a project + /// + /// Projects + /// Project ID + /// Search query + /// List of results + /// + /// api/2.0/project/{id}/@search/{query} + /// GET + /// list [Read(@"{id:[0-9]+}/@search/{query}")] public IEnumerable SearchProject(int id, string query) { @@ -193,16 +213,19 @@ public IEnumerable SearchProject(int id, string query) return EngineFactory.SearchEngine.Search(query, id).Select(x => new SearchWrapper(x)); } - /// - ///Returns a list of all the projects matching the query specified in the request. - /// - /// - ///Search projects - /// - ///Projects - ///Search query - ///List of results - /// + /// + /// Returns a list of all the projects matching the query specified in the request. + /// + /// + /// Search projects + /// + /// Projects + /// Search query + /// List of results + /// + /// api/2.0/project/@search/{query} + /// GET + /// list [Read(@"@search/{query}")] public IEnumerable SearchProjects(string query) { @@ -220,18 +243,20 @@ public IEnumerable SearchProjects(string query) /// Create a project /// /// Projects - /// Project title - /// Project description - /// Project responsible ID - /// Project tags - /// Private project or not - /// Project participants - /// Notifies a project manager about the project actions or not - /// Project tasks - /// Project milestones - /// Notifies responsibles about the project actions or not - /// Newly created project + /// Project title + /// Project description + /// Project responsible ID + /// Project tags + /// Specifies if this project is private or not + /// Project participants + /// Specifies whether to notify a project manager about the project actions or not + /// Project tasks + /// Project milestones + /// Specifies whether to notify responsibles about the project actions or not + /// Newly created project /// + /// api/2.0/project + /// POST [Create("")] public ProjectWrapperFull CreateProject(string title, string description, @@ -332,17 +357,19 @@ public ProjectWrapperFull CreateProject(string title, /// Create a project with team security /// /// Projects - /// Project title - /// Project description - /// Project responsible ID - /// Project tags - /// Private project or not - /// Project participants - /// Notifies a project manager about the project actions or not - /// Project tasks - /// Project milestones - /// Notifies responsibles about the project actions or not - /// Newly created project + /// Project title + /// Project description + /// Project responsible ID + /// Project tags + /// Specifies if this project is private or not + /// Project participants with the information about their security rights + /// Specifies whether to notify a project manager about the project actions or not + /// Project tasks + /// Project milestones + /// Specifies whether to notify responsibles about the project actions or not + /// Newly created project + /// api/2.0/project/withSecurity + /// POST [Create("withSecurity")] public ProjectWrapperFull CreateProject(string title, string description, @@ -370,25 +397,27 @@ public ProjectWrapperFull CreateProject(string title, #region Update - /// - ///Updates the existing project using all the parameters (project ID, title, description, responsible ID, etc) specified in the request. - /// - /// - ///Update a project - /// - ///Projects - ///Project ID - ///New project title - ///New project description - ///New project responsible ID - ///New project tags - ///New project participants - ///New project status: Open, Paused or Closed - ///Private project or not - ///Notifies a project manager about the project actions or not - ///Updated project - /// - /// + /// + /// Updates the existing project using all the parameters (project ID, title, description, responsible ID, etc) specified in the request. + /// + /// + /// Update a project + /// + /// Projects + /// Project ID + /// New project title + /// New project description + /// New project responsible ID + /// New project tags + /// New project participants + /// New project status ("Open", "Paused", or "Closed") + /// Specifies if this project is private or not + /// Specifies whether to notify a project manager about the project actions or not + /// Updated project + /// + /// + /// api/2.0/project/{id} + /// PUT [Update(@"{id:[0-9]+}")] public ProjectWrapperFull UpdateProject(int id, string title, string description, Guid responsibleId, string tags, IEnumerable participants, ProjectStatus? status, bool? @private, bool notify) { @@ -436,23 +465,25 @@ public ProjectWrapperFull UpdateProject(int id, string title, string description return ProjectWrapperFullSelector(project, EngineFactory.FileEngine.GetRoot(id)); } - /// - ///Updates the existing project with team security using all the parameters (project ID, title, description, responsible ID, etc) specified in the request. - /// - /// - ///Update a project with team security - /// - ///Projects - ///Project ID - ///New project title - ///New project description - ///New project responsible ID - ///New project tags - ///New project participants - ///New project status: Open, Paused or Closed - ///Private project or not - ///Notifies a project manager about the project actions or not - ///Updated project + /// + /// Updates the existing project with team security using all the parameters (project ID, title, description, responsible ID, etc) specified in the request. + /// + /// + /// Update a project with team security + /// + /// Projects + /// Project ID + /// New project title + /// New project description + /// New project responsible ID + /// New project tags + /// New project participants with the information about their security rights + /// New project status ("Open", "Paused", or "Closed") + /// Specifies if this project is private or not + /// Specifies whether to notify a project manager about the project actions or not + /// Updated project + /// api/2.0/project/{id}/withSecurityInfo + /// PUT [Update(@"{id:[0-9]+}/withSecurityInfo")] public ProjectWrapperFull UpdateProject(int id, string title, string description, Guid responsibleId, string tags, IEnumerable participants, ProjectStatus? status, bool? @private, bool notify) @@ -471,17 +502,19 @@ public ProjectWrapperFull UpdateProject(int id, string title, string description return project; } - /// - ///Updates a status of a project with the ID specified in the request. - /// - /// - ///Update a project status - /// - ///Projects - ///Project ID - ///New project status: Open, Paused or Closed - ///Updated project - /// + /// + /// Updates a status of a project with the ID specified in the request. + /// + /// + /// Update a project status + /// + /// Projects + /// Project ID + /// New project status ("Open", "Paused", or "Closed") + /// Updated project + /// + /// api/2.0/project/{id}/status + /// PUT [Update(@"{id:[0-9]+}/status")] public ProjectWrapperFull UpdateProject(int id, ProjectStatus status) { @@ -498,16 +531,18 @@ public ProjectWrapperFull UpdateProject(int id, ProjectStatus status) #region Delete - /// - ///Deletes a project with the ID specified in the request from the portal. - /// - /// - ///Delete a project - /// - ///Projects - ///Project ID - ///Deleted project - /// + /// + /// Deletes a project with the ID specified in the request from the portal. + /// + /// + /// Delete a project + /// + /// Projects + /// Project ID + /// Deleted project + /// + /// api/2.0/project/{id} + /// DELETE [Delete(@"{id:[0-9]+}")] public ProjectWrapperFull DeleteProject(int id) { @@ -523,16 +558,19 @@ public ProjectWrapperFull DeleteProject(int id) return ProjectWrapperFullSelector(project, folderId); } - /// - ///Deletes the projects with the IDs specified in the request from the portal. - /// - /// - ///Delete projects - /// - ///Projects - ///List of project IDs - ///Deleted projects - /// + /// + /// Deletes the projects with the IDs specified in the request from the portal. + /// + /// + /// Delete projects + /// + /// Projects + /// List of project IDs + /// Deleted projects + /// + /// api/2.0/project + /// DELETE + /// list [Delete(@"")] public IEnumerable DeleteProjects(int[] projectids) { @@ -557,16 +595,18 @@ public IEnumerable DeleteProjects(int[] projectids) #region Follow, Tags, Time - /// - ///Subscribes to or unsubscribes from the notifications about the actions performed in the project with the ID specified in the request. - /// - /// - ///Project subscription - /// - ///Projects - ///Project ID - ///Project - /// + /// + /// Subscribes to or unsubscribes from the notifications about the actions performed in the project with the ID specified in the request. + /// + /// + /// Project subscription + /// + /// Projects + /// Project ID + /// Project + /// + /// api/2.0/project/{projectid}/follow + /// PUT [Update(@"{projectid:[0-9]+}/follow")] public ProjectWrapper FollowToProject(int projectId) { @@ -590,17 +630,19 @@ public ProjectWrapper FollowToProject(int projectId) return ProjectWrapperSelector(project); } - /// - ///Updates a tag for the selected project with a tag specified in the request. - /// - /// - ///Update a project tag - /// - ///Tags - ///Project ID - ///New project tag - ///Project - /// + /// + /// Updates a tag from the selected project with a new tag specified in the request. + /// + /// + /// Update a project tag + /// + /// Tags + /// Project ID + /// New project tag + /// Project + /// + /// api/2.0/project/{id}/tag + /// PUT [Update(@"{id:[0-9]+}/tag")] public ProjectWrapperFull UpdateProjectTags(int id, string tags) { @@ -612,17 +654,19 @@ public ProjectWrapperFull UpdateProjectTags(int id, string tags) return ProjectWrapperFullSelector(project, EngineFactory.FileEngine.GetRoot(id)); } - /// - ///Updates the tags for the selected project with the tags specified in the request. - /// - /// - ///Update project tags - /// - ///Tags - ///Project ID - ///New project tags - ///Project - /// + /// + /// Updates the tags from the selected project with the new tags specified in the request. + /// + /// + /// Update project tags + /// + /// Tags + /// Project ID + /// New project tags + /// Project + /// + /// api/2.0/project/{id}/tags + /// PUT [Update(@"{id:[0-9]+}/tags")] public ProjectWrapperFull UpdateProjectTags(int id, IEnumerable tags) { @@ -634,16 +678,19 @@ public ProjectWrapperFull UpdateProjectTags(int id, IEnumerable tags) return ProjectWrapperFullSelector(project, EngineFactory.FileEngine.GetRoot(id)); } - /// - ///Returns the detailed information about the time spent on the project with the ID specified in the request. - /// - /// - ///Get project time - /// - ///Time - ///Project ID - ///List of project time - /// + /// + /// Returns the detailed information about the time spent on the project with the ID specified in the request. + /// + /// + /// Get project time + /// + /// Time + /// Project ID + /// List of project time + /// + /// GET + /// api/2.0/project/{id}/time + /// list [Read(@"{id:[0-9]+}/time")] public IEnumerable GetProjectTime(int id) { @@ -651,14 +698,16 @@ public IEnumerable GetProjectTime(int id) return EngineFactory.TimeTrackingEngine.GetByProject(id).Select(TimeWrapperSelector); } - /// - ///Returns the total time spent on the project with the ID specified in the request. - /// - ///Get total project time - ///Time - ///Project ID - ///Project time - /// + /// + /// Returns the total time spent on the project with the ID specified in the request. + /// + /// Get total project time + /// Time + /// Project ID + /// Project time + /// + /// api/2.0/project/{id}/time/total + /// GET [Read(@"{id:[0-9]+}/time/total")] public string GetTotalProjectTime(int id) { @@ -670,24 +719,26 @@ public string GetTotalProjectTime(int id) #region Milestones - /// - ///Adds a new milestone using the parameters (project ID, milestone title, deadline, etc) specified in the request. - /// - /// - ///Add a milestone - /// - ///Milestones - ///Project ID - ///Milestone title - ///Milestone deadline - ///Specifies if this is a key milestone or not - ///Reminds me 48 hours before the milestone due date - ///Milestone description - ///Milestone responsible - ///Notifies the responsible about the milestone actions or not - ///Added milestone - /// - /// + /// + /// Adds a new milestone using the parameters (project ID, milestone title, deadline, etc) specified in the request. + /// + /// + /// Add a milestone + /// + /// Milestones + /// Project ID + /// Milestone title + /// Milestone deadline + /// Specifies if this is a key milestone or not + /// Specifies whether to remind me 48 hours before the milestone due date or not + /// Milestone description + /// Milestone responsible + /// Specifies whether to notify responsible about the milestone actions or not + /// Added milestone + /// + /// + /// api/2.0/project/{id}/milestone + /// POST [Create(@"{id:[0-9]+}/milestone")] public MilestoneWrapper AddProjectMilestone(int id, string title, ApiDateTime deadline, bool isKey, bool isNotify, string description, Guid responsible, bool notifyResponsible) { @@ -714,16 +765,19 @@ public MilestoneWrapper AddProjectMilestone(int id, string title, ApiDateTime de return MilestoneWrapperSelector(milestone); } - /// - ///Returns a list of all the milestones within a project with the ID specified in the request. - /// - /// - ///Get milestones by project ID - /// - ///Milestones - ///Project ID - ///List of milestones - /// + /// + /// Returns a list of all the milestones from a project with the ID specified in the request. + /// + /// + /// Get milestones by project ID + /// + /// Milestones + /// Project ID + /// List of milestones + /// + /// api/2.0/project/{id}/milestone + /// GET + /// list [Read(@"{id:[0-9]+}/milestone")] public IEnumerable GetProjectMilestones(int id) { @@ -737,17 +791,20 @@ public IEnumerable GetProjectMilestones(int id) return milestones.Select(MilestoneWrapperSelector); } - /// - ///Returns a list of all the milestones with the selected status within a project with the ID specified in the request. - /// - /// - ///Get milestones by project ID and milestone status - /// - ///Milestones - ///Project ID - ///Milestone status - ///List of milestones - /// + /// + /// Returns a list of all the milestones with the selected status from a project with the ID specified in the request. + /// + /// + /// Get milestones by milestone status + /// + /// Milestones + /// Project ID + /// Milestone status ("Open" or "Closed") + /// List of milestones + /// + /// api/2.0/project/{id}/milestone/{status} + /// GET + /// list [Read(@"{id:[0-9]+}/milestone/{status:(open|closed|late|disable)}")] public IEnumerable GetProjectMilestones(int id, MilestoneStatus status) { @@ -764,15 +821,18 @@ public IEnumerable GetProjectMilestones(int id, MilestoneStatu #region Team - /// - ///Returns a list of all the users participating in the project with the ID specified in the request. - /// - /// - ///Get a project team - /// - ///Teams - ///Project ID - ///List of team members + /// + /// Returns a list of all the users participating in the project with the ID specified in the request. + /// + /// + /// Get a project team + /// + /// Teams + /// Project ID + /// List of team members + /// api/2.0/project/{projectid}/team + /// GET + /// list [Read(@"{projectid:[0-9]+}/team")] public IEnumerable GetProjectTeam(int projectid) { @@ -784,15 +844,18 @@ public IEnumerable GetProjectTeam(int projectid) .OrderBy(r => r.DisplayName).ToList(); } - /// - ///Returns a list of all the current and excluded project team members. - /// - /// - ///Get a project team with excluded members - /// - ///Teams - ///Project ID - ///List of team members + /// + /// Returns a list of all the current and excluded project team members. + /// + /// + /// Get current and excluded team members + /// + /// Teams + /// Project ID + /// List of team members + /// api/2.0/project/{projectid}/teamExcluded + /// GET + /// list [Read(@"{projectid:[0-9]+}/teamExcluded")] public IEnumerable GetProjectTeamExcluded(int projectid) { @@ -804,15 +867,18 @@ public IEnumerable GetProjectTeamExcluded(int projectid) .OrderBy(r => r.DisplayName).ToList(); } - /// - ///Returns a list of all the users participating in the projects with the ID specified in the request. - /// - /// - ///Get team members of projects - /// - ///Teams - ///List of project IDs - ///List of team members + /// + /// Returns a list of all the users participating in the projects with the ID specified in the request. + /// + /// + /// Get team members of projects + /// + /// Teams + /// List of project IDs + /// List of team members + /// api/2.0/project/team + /// POST + /// list [Create(@"team")] public IEnumerable GetProjectTeam(List ids) { @@ -821,17 +887,20 @@ public IEnumerable GetProjectTeam(List ids) .OrderBy(r => r.DisplayName).ToList(); } - /// - ///Adds a user with the ID specified in the request to the selected project team. - /// - /// - ///Add a user to the team - /// - ///Teams - ///Project ID - ///User ID - ///List of team members - /// + /// + /// Adds a user with the ID specified in the request to the selected project team. + /// + /// + /// Add a user to the team + /// + /// Teams + /// Project ID + /// User ID + /// List of team members + /// + /// api/2.0/project/{projectid}/team + /// POST + /// list [Create(@"{projectid:[0-9]+}/team")] public IEnumerable AddToProjectTeam(int projectid, Guid userId) { @@ -845,19 +914,22 @@ public IEnumerable AddToProjectTeam(int projectid, Guid user return GetProjectTeam(projectid); } - /// - ///Sets the security rights to the user with the ID specified in the request within the selected project. - /// - /// - ///Set team security - /// - ///Teams - ///Project ID - ///User ID - ///Security rights - ///Specifies if the security rights for the user will be visible or not - ///List of team members - /// + /// + /// Sets the security rights to the user with the ID specified in the request from the selected project. + /// + /// + /// Set team security + /// + /// Teams + /// Project ID + /// User ID + /// Security rights + /// Specifies if the user security rights will be visible or not + /// List of team members + /// + /// api/2.0/project/{projectid}/team/security + /// PUT + /// list [Update(@"{projectid:[0-9]+}/team/security")] public IEnumerable SetProjectTeamSecurity(int projectid, Guid userId, ProjectTeamSecurity security, bool visible) { @@ -883,17 +955,20 @@ public IEnumerable SetProjectTeamSecurity(int projectid, Gui return team; } - /// - ///Removes a user with the ID specified in the request from the selected project team. - /// - /// - ///Remove a user from the team - /// - ///Teams - ///Project ID - ///User ID - ///List of team members - /// + /// + /// Removes a user with the ID specified in the request from the selected project team. + /// + /// + /// Remove a user from the team + /// + /// Teams + /// Project ID + /// User ID + /// List of team members + /// + /// api/2.0/project/{projectid}/team + /// DELETE + /// list [Delete(@"{projectid:[0-9]+}/team")] public IEnumerable DeleteFromProjectTeam(int projectid, Guid userId) { @@ -910,18 +985,21 @@ public IEnumerable DeleteFromProjectTeam(int projectid, Guid return GetProjectTeam(projectid); } - /// - ///Updates a project team with the user IDs specified in the request. - /// - /// - ///Update a project team - /// - ///Teams - ///Project ID - ///List of user IDs - ///Notifies a project team about the updated project or not - ///Number of project participants - /// + /// + /// Updates a project team with the user IDs specified in the request. + /// + /// + /// Update a project team + /// + /// Teams + /// Project ID + /// List of user IDs + /// Specifies whether to notify a project team members that they are added to the project or not + /// Number of project participants + /// + /// api/2.0/project/{projectid}/team + /// PUT + /// list [Update(@"{projectid:[0-9]+}/team")] public IEnumerable UpdateProjectTeam(int projectId, IEnumerable participants, bool notify) { @@ -943,16 +1021,19 @@ public IEnumerable UpdateProjectTeam(int projectId, IEnumera #region Task - /// - ///Returns a list of all the tasks within a project with the ID specified in the request. - /// - /// - ///Get tasks - /// - ///Tasks - ///Project ID - ///List of tasks - ///List of tasks + /// + /// Returns a list of all the tasks from a project with the ID specified in the request. + /// + /// + /// Get tasks + /// + /// Tasks + /// Project ID + /// List of tasks + /// List of tasks + /// api/2.0/project/{projectid}/task + /// GET + /// list [Read(@"{projectid:[0-9]+}/task")] public IEnumerable GetProjectTasks(int projectid) { @@ -964,24 +1045,26 @@ public IEnumerable GetProjectTasks(int projectid) .ToList(); } - /// - ///Adds a task to the selected project with the parameters (responsible user ID, task description, deadline time, etc) specified in the request. - /// - /// - ///Add a task - /// - ///Tasks - ///Project ID - ///Task description - ///Task deadline time - ///Task priority: Low|Normal|High - ///Task title - ///Task milestone ID - ///List of responsibles - ///Notifies the responsibles about the task actions or not - ///Task start date - ///Added task - /// + /// + /// Adds a task to the selected project with the parameters (responsible user ID, task description, deadline time, etc) specified in the request. + /// + /// + /// Add a task + /// + /// Tasks + /// Project ID + /// Task description + /// Task deadline time + /// Task priority ("Low", "Normal", or "High") + /// Task title + /// Task milestone ID + /// List of responsibles + /// Specifies whether to notify the responsibles about the task actions or not + /// Task start date + /// Added task + /// + /// api/2.0/project/{projectid}/task + /// POST [Create(@"{projectid:[0-9]+}/task")] public TaskWrapper AddProjectTask(int projectid, string description, ApiDateTime deadline, TaskPriority priority, string title, int milestoneid, @@ -1020,17 +1103,19 @@ public TaskWrapper AddProjectTask(int projectid, string description, ApiDateTime return GetTask(task); } - /// - ///Adds a task to the selected project by message ID specified in the request. - /// - /// - ///Add a task by message ID - /// - ///Tasks - ///Project ID - ///Message ID - ///Added task - /// + /// + /// Adds a task to the selected project by the message ID specified in the request. + /// + /// + /// Add a task by message ID + /// + /// Tasks + /// Project ID + /// Message ID + /// Added task + /// + /// api/2.0/project/{projectid}/task/{messageid} + /// POST [Create(@"{projectid:[0-9]+}/task/{messageid:[0-9]+}")] public TaskWrapper AddProjectTaskByMessage(int projectid, int messageid) { @@ -1104,17 +1189,20 @@ public TaskWrapper AddProjectTaskByMessage(int projectid, int messageid) return TaskWrapperSelector(task); } - /// - ///Returns a list of all the tasks with the selected status in the project with the ID specified in the request. - /// - /// - ///Get tasks by status - /// - ///Tasks - ///Project ID - ///Task status: not accept|open|closed|disable|unclassified|not in milestone - ///List of tasks - /// + /// + /// Returns a list of all the tasks with the selected status in the project with the ID specified in the request. + /// + /// + /// Get tasks by status + /// + /// Tasks + /// Project ID + /// Task status + /// List of tasks + /// + /// api/2.0/project/{projectid}/task/{status} + /// GET + /// list [Read(@"{projectid:[0-9]+}/task/{status:(notaccept|open|closed|disable|unclassified|notinmilestone)}")] public IEnumerable GetProjectTasks(int projectid, TaskStatus status) { @@ -1124,17 +1212,20 @@ public IEnumerable GetProjectTasks(int projectid, TaskStatus status .Select(TaskWrapperSelector).ToList(); } - /// - ///Returns a list of all the tasks for the current user with the selected status in the project with the ID specified in the request. - /// - /// - ///Get my tasks by status and project ID - /// - ///Tasks - ///Project ID - ///Task status: not accept|open|closed|disable|unclassified|not in milestone - ///List of tasks - /// + /// + /// Returns a list of all the tasks for the current user with the selected status in the project with the ID specified in the request. + /// + /// + /// Get my tasks by status + /// + /// Tasks + /// Project ID + /// Task status + /// List of tasks + /// + /// api/2.0/project/{projectid}/task/@self/{status} + /// GET + /// list [Read(@"{projectid:[0-9]+}/task/@self/{status:(notaccept|open|closed|disable|unclassified|notinmilestone)}")] public IEnumerable GetProjectMyTasks(int projectid, TaskStatus status) { @@ -1150,16 +1241,18 @@ public IEnumerable GetProjectMyTasks(int projectid, TaskStatus stat #region Files - /// - ///Returns the detailed list of all the files and folders for the project with the ID specified in the request. - /// - /// - ///Get project files by project ID - /// - ///Files - ///Project ID - ///Project files - /// + /// + /// Returns the detailed list of all the files and folders for the project with the ID specified in the request. + /// + /// + /// Get project files + /// + /// Files + /// Project ID + /// Project files + /// + /// GET + /// api/2.0/project/{id}/files [Read(@"{id:[0-9]+}/files")] public FolderContentWrapper GetProjectFiles(int id) { @@ -1171,17 +1264,20 @@ public FolderContentWrapper GetProjectFiles(int id) throw new SecurityException("Access to files is denied"); } - /// - ///Returns a list of all the files within the entity (message or task) with the type and ID specified in the request. - /// - /// - ///Get entity files - /// - ///Files - ///Entity type - ///Entity ID - ///Files - /// + /// + /// Returns a list of all the files for the entity with the type and ID specified in the request. + /// + /// + /// Get entity files + /// + /// Files + /// Entity type + /// Entity ID + /// List of files + /// + /// api/2.0/project/{entityID}/entityfiles + /// GET + /// list [Read(@"{entityID:[0-9]+}/entityfiles")] public IEnumerable GetEntityFiles(EntityType entityType, int entityID) { @@ -1197,19 +1293,22 @@ public IEnumerable GetEntityFiles(EntityType entityType, int entity return new List(); } - /// - ///Uploads the selected files to the entity (project, milestone, task) with the type and ID specified in the request. - /// - /// - ///Upload files to the entity - /// - ///Files - ///Entity type - ///Entity ID - ///List of file IDs - ///Uploaded files - /// - ///false + /// + /// Uploads the selected files to the entity with the type and ID specified in the request. + /// + /// + /// Upload files to the entity + /// + /// Projects + /// Entity type + /// Entity ID + /// List of file IDs + /// Uploaded files + /// + /// api/2.0/project/{entityID}/entityfiles + /// POST + /// list + /// false [Create(@"{entityID:[0-9]+}/entityfiles")] public IEnumerable UploadFilesToEntity(EntityType entityType, int entityID, IEnumerable files) { @@ -1232,19 +1331,21 @@ public IEnumerable UploadFilesToEntity(EntityType entityType, int e return listFiles.Select(FileWrapperSelector); } - /// - ///Detaches the selected file from the entity (project, milestone, task) with the type and ID specified in the request. - /// - /// - ///Detach a file from the entity - /// - ///Files - ///Entity type - ///Entity ID - ///File ID - ///Detached file - /// - ///false + /// + /// Detaches the selected file from the entity with the type and ID specified in the request. + /// + /// + /// Detach a file from the entity + /// + /// Files + /// Entity type + /// Entity ID + /// File ID + /// Detached file + /// + /// api/2.0/project/{entityID}/entityfiles + /// DELETE + /// false [Delete(@"{entityID:[0-9]+}/entityfiles")] public FileWrapper DetachFileFromEntity(EntityType entityType, int entityID, int fileid) { @@ -1264,17 +1365,20 @@ public FileWrapper DetachFileFromEntity(EntityType entityType, int entityID, int } /// - ///Detaches the selected files from the entity (project, milestone, task) with the type and ID specified in the request. + ///Detaches the selected files from the entity with the type and ID specified in the request. /// /// ///Detach files from the entity /// ///Files - ///Entity type - ///Entity ID - ///List of file IDs + ///Entity type + ///Entity ID + ///List of file IDs ///Detached files /// + ///api/2.0/project/{entityID}/entityfilesmany + /// DELETE + /// list ///false [Delete(@"{entityID:[0-9]+}/entityfilesmany")] public IEnumerable DetachFileFromEntity(EntityType entityType, int entityID, IEnumerable files) @@ -1298,25 +1402,27 @@ public IEnumerable DetachFileFromEntity(EntityType entityType, int return listFiles.Select(FileWrapperSelector); } - /// - ///Uploads the selected files to the entity (project, milestone, task) with the type and ID specified in the request. - /// - /// - ///Upload files to the entity - /// - ///Files - ///Entity type - ///Entity ID - ///Folder ID - ///Request input stream - ///Content-Type header - ///Content-Disposition header - ///List of files when posted as multipart/form-data - ///Creates a new file if it already exists - ///If true, then upload files in the original formats as well - ///Uploaded files - /// - ///false + /// + /// Uploads the selected files to the entity with the type and ID specified in the request. + /// + /// + /// Upload files to the entity + /// + /// Files + /// Entity type + /// Entity ID + /// Folder ID + /// Request input stream + /// Content-Type header + /// Content-Disposition header + /// List of files when posted as multipart/form-data + /// Specifies whether to create a new file if it already exists or not + /// Specifies whether to upload files in the original formats as well or not + /// Uploaded files + /// + /// api/2.0/project/{entityID}/entityfiles/upload + /// POST + /// false [Create(@"{entityID:[0-9]+}/entityfiles/upload")] public object UploadFilesToEntity(EntityType entityType, int entityID, string folderid, Stream file, ContentType contentType, ContentDisposition contentDisposition, IEnumerable files, bool createNewIfExist, bool storeOriginalFileFlag) { @@ -1359,16 +1465,19 @@ public object UploadFilesToEntity(EntityType entityType, int entityID, string fo #region contacts - /// + /// /// Returns a list of all the projects linked with a contact with the ID specified in the request. - /// - ///Contact ID - ///Contacts - ///Get contact projects - /// - ///List of projects - /// - /// + /// + /// Contact ID + /// Projects + /// Get contact projects + /// + /// List of projects + /// + /// + /// api/2.0/project/contact/{contactid} + /// GET + /// list [Read("contact/{contactid:[0-9]+}")] public IEnumerable GetProjectsByContactID(int contactid) { @@ -1378,15 +1487,17 @@ public IEnumerable GetProjectsByContactID(int contactid) .Select(x => ProjectWrapperFullSelector(x, EngineFactory.FileEngine.GetRoot(x.ID))).ToList(); } - /// + /// /// Adds the selected contact to the project with the ID specified in the request. - /// - ///Project ID - ///Contact ID - ///Contacts - ///Add a project contact - ///Project - /// + /// + /// Project ID + /// Contact ID + /// Projects + /// Add a project contact + /// Project + /// + /// api/2.0/project/{projectid}/contact + /// POST [Create(@"{projectid:[0-9]+}/contact")] public ProjectWrapperFull AddProjectContact(int projectid, int contactid) { @@ -1406,15 +1517,17 @@ public ProjectWrapperFull AddProjectContact(int projectid, int contactid) return ProjectWrapperFullSelector(project, null); } - /// + /// /// Deletes the selected contact from the project with the ID specified in the request. - /// - ///Project ID - ///Contact ID - ///Contacts - ///Delete a project contact - ///Project - /// + /// + /// Project ID + /// Contact ID + /// Projects + /// Delete a project contact + /// Project + /// + /// api/2.0/project/{projectid}/contact + /// DELETE [Delete("{projectid:[0-9]+}/contact")] public ProjectWrapperFull DeleteProjectContact(int projectid, int contactid) { @@ -1438,30 +1551,35 @@ public ProjectWrapperFull DeleteProjectContact(int projectid, int contactid) #region templates - /// - ///Returns a list of all the templates with the base information about them. - /// - /// - ///Get templates - /// - ///Templates - ///List of templates + /// + /// Returns a list of all the templates with the base information about them. + /// + /// + /// Get templates + /// + /// Templates + /// List of templates + /// api/2.0/project/template + /// GET + /// list [Read("template")] public IEnumerable GetAllTemplates() { return EngineFactory.TemplateEngine.GetAll().Select(x => new { x.Id, x.Title, x.Description, CanEdit = ProjectSecurity.CanEditTemplate(x) }); } - /// - ///Returns the detailed information about a template with ID specified in the request. - /// - /// - ///Get a template by ID - /// - ///Templates - ///Template ID - ///Template - /// + /// + /// Returns the detailed information about a template with the ID specified in the request. + /// + /// + /// Get a template + /// + /// Templates + /// Template ID + /// Template + /// + /// api/2.0/project/template/{id} + /// GET [Read(@"template/{id:[0-9]+}")] public ObjectWrapperBase GetTemplate(int id) { @@ -1469,17 +1587,19 @@ public ObjectWrapperBase GetTemplate(int id) return new ObjectWrapperBase { Id = template.Id, Title = template.Title, Description = template.Description }; } - /// - ///Creates a new template with the title and description specified in the request. - /// - /// - ///Create a template - /// - ///Templates - ///Template title - ///JSON template structure in the following format: {"tasks":[{"title":"Task without milestone"}],"milestones":[{"title":"milestone title","duration":0.5,"tasks":[{"title":"milestone task"}]}]} - ///Newly created template - /// + /// + /// Creates a new template with the title and description specified in the request. + /// + /// + /// Create a template + /// + /// Templates + /// Template title + /// JSON template structure in the following format: {"tasks": [{"title": "Task without milestone"}], "milestones":[{"title": "milestone title", "duration":0.5, "tasks":[{"title": "milestone task"}]}]} + /// Newly created template + /// + /// api/2.0/project/template + /// POST [Create("template")] public ObjectWrapperBase CreateTemplate(string title, string description) { @@ -1499,19 +1619,21 @@ public ObjectWrapperBase CreateTemplate(string title, string description) return new ObjectWrapperBase { Id = template.Id, Title = template.Title, Description = template.Description }; } - /// - ///Updates the existing template information with the parameters specified in the request. - /// - /// - ///Update a template - /// - ///Templates - ///Template ID - ///New template title - ///New JSON template structure in the following format: {"tasks":[{"title":"Task without milestone"}],"milestones":[{"title":"milestone title","duration":0.5,"tasks":[{"title":"milestone task"}]}]} - ///Updated template - /// - /// + /// + /// Updates the existing template information with the parameters specified in the request. + /// + /// + /// Update a template + /// + /// Templates + /// Template ID + /// New template title + /// New JSON template structure in the following format: {"tasks": [{"title": "Task without milestone"}], "milestones":[{"title": "milestone title", "duration": 0.5, "tasks": [{"title": "milestone task"}]}]} + /// Updated template + /// + /// + /// api/2.0/project/template/{id} + /// PUT [Update(@"template/{id:[0-9]+}")] public ObjectWrapperBase UpdateTemplate(int id, string title, string description) { @@ -1530,16 +1652,18 @@ public ObjectWrapperBase UpdateTemplate(int id, string title, string description return new ObjectWrapperBase { Id = template.Id, Title = template.Title, Description = template.Description }; } - /// - ///Deletes a template with the ID specified in the request from the portal. - /// - /// - ///Delete a template - /// - ///Templates - ///Template ID - ///Deleted template - /// + /// + /// Deletes a template with the ID specified in the request from the portal. + /// + /// + /// Delete a template + /// + /// Templates + /// Template ID + /// Deleted template + /// + /// api/2.0/project/template/{id} + /// DELETE [Delete(@"template/{id:[0-9]+}")] public ObjectWrapperBase DeleteTemplate(int id) { @@ -1556,30 +1680,34 @@ public ObjectWrapperBase DeleteTemplate(int id) #region HACK: Hidden api methods - /// - /// Returns the basic information about the access rights. - /// - /// + /// + /// Returns the basic information about the security rights. + /// + /// /// Get security information - /// - ///Projects - ///Basic information about the access rights - ///false + /// + /// Projects + /// Basic information about the security rights + /// api/2.0/project/securityinfo + /// GET + /// false [Read("securityinfo")] public CommonSecurityInfo GetProjectSecurityInfo() { return new CommonSecurityInfo(); } - /// + /// /// Returns the last modified project. - /// - /// + /// + /// /// Get the last modified project - /// - ///Projects - ///Last modified project - ///false + /// + /// Projects + /// Last modified project + /// api/2.0/project/maxlastmodified + /// GET + /// false [Read("maxlastmodified")] public string GetProjectMaxLastModified() { @@ -1589,16 +1717,18 @@ public string GetProjectMaxLastModified() return result + EngineFactory.ProjectEngine.Count().ToString(); } - /// + /// /// Returns the current task order in the project with the ID specified in the request. - /// - /// + /// + /// /// Get the task order - /// - ///Tasks - ///Project ID - ///Task order - ///false + /// + /// Tasks + /// Project ID + /// Task order + /// api/2.0/project/{id}/order + /// GET + /// false [Read(@"{id:[0-9]+}/order")] public string GetTaskOrder(int id) { @@ -1608,17 +1738,18 @@ public string GetTaskOrder(int id) return projectEngine.GetTaskOrder(project); } - /// + /// /// Sets the task order to the project with the ID specified in the request. - /// - /// + /// + /// /// Set the task order - /// - ///Tasks - ///Project ID - ///Task order - ///Task order - ///false + /// + /// Tasks + /// Project ID + /// Task order + /// api/2.0/project/{id}/order + /// PUT + /// false [Update(@"{id:[0-9]+}/order")] public void SetTaskOrder(int id, string order) { diff --git a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Reports.cs b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Reports.cs index 84d700d92..4051d8eb9 100644 --- a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Reports.cs +++ b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Reports.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,15 +37,17 @@ namespace ASC.Api.Projects { public partial class ProjectApi { - /// - ///Checks the report data by the URI specified in the request. - /// - /// - ///Check the report data - /// - ///Report - ///Report URI - ///Report state + /// + /// Checks the report data by the URI specified in the request. + /// + /// + /// Check the report data + /// + /// Report URI + /// Report status + /// api/2.0/project/report/create + /// Reports + /// POST [Create(@"report/create")] public ReportState CheckReportData(string uri) { @@ -58,14 +60,16 @@ public ReportState CheckReportData(string uri) return state; } - /// - ///Returns a report status. - /// - /// - ///Get a report status - /// - ///Report - ///Report status + /// + /// Returns a report status. + /// + /// + /// Get a report status + /// + /// Reports + /// Report status + /// api/2.0/project/report/status + /// GET [Read(@"report/status")] public ReportState GetReportStatus() { @@ -74,13 +78,16 @@ public ReportState GetReportStatus() return DocbuilderReportsUtility.Status(ReportOrigin.Projects); } - /// - ///Terminates the reporting process. - /// - /// - ///Terminate the reporting process - /// - ///Report + /// + /// Terminates the reporting process. + /// + /// + /// Terminate the reporting process + /// + /// Reports + /// api/2.0/project/report/terminate + /// GET + /// [Read(@"report/terminate")] public void TerminateReport() { @@ -89,33 +96,35 @@ public void TerminateReport() DocbuilderReportsUtility.Terminate(ReportOrigin.Projects); } - /// - ///Creates a project report template with the parameters specified in the request. Most of the parameters are optional and depend on the report type selected. - /// - /// - ///Create a report template - /// - ///Report - ///Report name - ///Report template generation period: Day/Week/Month - ///Period item: weekday name (for weekly report, starting with Sunday), day of the month (for monthly report) - ///Report sending time (in hours) - ///Specifies if a report will be automatically generated or not - ///Report type - ///Report tag - ///Report project - ///Task status - ///Department/Group - ///User GUID - ///Report time interval - ///Report period start date - ///Report period end date - ///Report view type: by group or by project - ///Specifies if the tasks without responsibles will be shown or hidden - ///Specifies if the average time will be shown or not - ///Average time type (All, ClosingProjects, CompletingTasks) - ///Specifies if the average time of closing projects will be shown or not - ///Project report template + /// + /// Creates a project report template with the parameters specified in the request. Most of the parameters are optional and depend on the report type selected. + /// + /// + /// Create a report template + /// + /// Reports + /// Report name + /// Report generation period: Day/Week/Month + /// Period item: day of the week (for a weekly report, starting with Sunday), day of the month (for a monthly report) + /// Report sending time (in hours) + /// Specifies if a report will be automatically generated or not + /// Report type + /// Report tag + /// Report project + /// Task status + /// Department/Group GUID + /// User GUID + /// Report time interval + /// Report period start date + /// Report period end date + /// Report view type: by group or by project + /// Specifies if the tasks without responsibles will be shown or hidden + /// Specifies if the average time will be shown or not + /// Average time type (All, ClosingProjects, CompletingTasks) + /// Specifies if the average time of completing tasks will be shown or not + /// Project report template + /// api/2.0/project/report + /// POST [Create(@"report")] public ReportTemplateWrapper SaveReportTemplate( string name, @@ -180,31 +189,33 @@ bool projectAverageCompletingTasks return new ReportTemplateWrapper(template); } - /// - ///Updates the selected project report template with the parameters specified in the request. - /// - /// - ///Update a report template - /// - ///Report - ///Report template ID - ///New report name - ///New report template generation period: Day/Week/Month - ///New period item: weekday name (for weekly report, starting with Sunday), day of the month (for monthly report) - ///New report sending time (in hours) - ///Specifies if the report will be automatically generated or not - ///New report type - ///New report tag - ///New report project - ///New task status - ///New department/group - ///New user GUID - ///New report time interval - ///New report period start date - ///New report period end date - ///New view type: by group or by project - ///Specifies if the tasks without responsibles will be shown or hidden - ///Updated project report template + /// + /// Updates the selected project report template with the parameters specified in the request. + /// + /// + /// Update a report template + /// + /// Reports + /// Report template ID + /// New report name + /// New report generation period: Day/Week/Month + /// New period item: day of the week (for a weekly report, starting with Sunday), day of the month (for a monthly report) + /// New report sending time (in hours) + /// Specifies if a report will be automatically generated or not + /// New report type + /// New report tag + /// New report project + /// New task status + /// New department/group GUID + /// New user GUID + /// New report time interval + /// New report period start date + /// New report period end date + /// New view type: by group or by project + /// Specifies if the tasks without responsibles will be shown or hidden + /// Updated project report template + /// api/2.0/project/report/{reportid} + ///PUT [Update(@"report/{reportid:[0-9]+}")] public ReportTemplateWrapper UpdateReportTemplate( int reportid, @@ -258,15 +269,17 @@ public ReportTemplateWrapper UpdateReportTemplate( return new ReportTemplateWrapper(template); } - /// - ///Returns a project report template with the ID specified in the request. - /// - /// - ///Get a report template - /// - ///Report - ///Report template ID - ///Project report template + /// + /// Returns a project report template with the ID specified in the request. + /// + /// + /// Get a report template + /// + /// Reports + /// Report template ID + /// Project report template + /// api/2.0/project/report/{reportid} + /// GET [Read(@"report/{reportid:[0-9]+}")] public ReportTemplateWrapper GetReportTemplate(int reportid) { @@ -274,15 +287,17 @@ public ReportTemplateWrapper GetReportTemplate(int reportid) return new ReportTemplateWrapper(EngineFactory.ReportEngine.GetTemplate(reportid).NotFoundIfNull()); } - /// - ///Deletes a project report template with the ID specified in the request. - /// - /// - ///Delete a report template - /// - ///Report - ///Report template ID - ///Project report template + /// + /// Deletes a project report template with the ID specified in the request. + /// + /// + /// Delete a report template + /// + /// Reports + /// Report template ID + /// Project report template + /// api/2.0/project/report/{reportid} + /// DELETE [Delete(@"report/{reportid:[0-9]+}")] public ReportTemplateWrapper DeleteReportTemplate(int reportid) { @@ -298,14 +313,17 @@ public ReportTemplateWrapper DeleteReportTemplate(int reportid) return new ReportTemplateWrapper(reportTemplate); } - /// - ///Returns the generated report files. - /// - /// - ///Get generated reports - /// - ///Report - ///Generated report files + /// + /// Returns the generated report files. + /// + /// + /// Get generated reports + /// + /// Reports + /// Generated report files + /// api/2.0/project/report/files + /// GET + /// list [Read(@"report/files")] public IEnumerable GetGeneratedReports() { @@ -318,15 +336,17 @@ public IEnumerable GetGeneratedReports() return EngineFactory.FileEngine.GetFiles(fileIds).Select(r => new FileWrapper(r)).OrderByDescending(r => r.Id).ToList(); } - /// - ///Removes the generated report file with the ID specified in the request. - /// - /// - ///Remove the generated report - /// - ///Report - ///Report file ID - ///Generated report file + /// + /// Removes the generated report file with the ID specified in the request. + /// + /// + /// Remove the generated report + /// + /// Reports + /// Report file ID + /// Generated report file + /// api/2.0/project/report/files/{fileid} + /// DELETE [Delete(@"report/files/{fileid:[0-9]+}")] public ReportFile RemoveGeneratedReport(int fileid) { diff --git a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Tags.cs b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Tags.cs index 407190cac..9c80f5325 100644 --- a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Tags.cs +++ b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Tags.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,29 +28,34 @@ namespace ASC.Api.Projects { public partial class ProjectApi { - /// - ///Returns a list of all the available project tags. - /// - /// - ///Get project tags - /// - ///Tags - ///List of tags + /// + /// Returns a list of all the available project tags. + /// + /// + /// Get project tags + /// + /// Tags + /// List of tags + /// api/2.0/project/tag + /// GET + /// list [Read(@"tag")] public IEnumerable GetAllTags() { return EngineFactory.TagEngine.GetTags().Select(x => new ObjectWrapperBase { Id = x.Key, Title = x.Value }); } - /// - ///Creates a new tag with the data specified in the request. - /// - /// - ///Create a tag - /// - ///Tags - ///Tag data - ///Created tag + /// + /// Creates a new tag with the data specified in the request. + /// + /// + /// Create a tag + /// + /// Tags + /// Created tag + /// api/2.0/project/tag + /// POST + /// Tag data [Create(@"tag")] public ObjectWrapperBase CreateNewTag(string data) { @@ -62,15 +67,18 @@ public ObjectWrapperBase CreateNewTag(string data) return new ObjectWrapperBase { Id = result.Key, Title = result.Value }; } - /// - ///Returns the detailed list of all the projects with a tag specified in the request. - /// - /// - ///Get projects by a tag - /// - ///Tags - ///Tag name - ///List of projects + /// + /// Returns the detailed list of all the projects with a tag specified in the request. + /// + /// + /// Get projects by a tag + /// + /// Tags + /// Tag name + /// List of projects + /// api/2.0/project/tag/{tag} + /// GET + /// list [Read(@"tag/{tag}")] public IEnumerable GetProjectsByTags(string tag) { @@ -79,15 +87,18 @@ public IEnumerable GetProjectsByTags(string tag) } - /// - ///Returns a list of all the tags by the tag name specified in the request. - /// - /// - ///Get tags by a tag name - /// - ///Tags - ///Tag name - ///List of tags + /// + /// Returns a list of all the tags by the tag name specified in the request. + /// + /// + /// Get tags by a tag name + /// + /// Tags + /// Tag name + /// List of tags + /// api/2.0/project/tag/search + /// GET + /// list [Read(@"tag/search")] public IEnumerable GetTagsByName(string tagName) { diff --git a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Tasks.cs b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Tasks.cs index db114bca3..eed45a5b3 100644 --- a/module/ASC.Api/ASC.Api.Projects/ProjectApi.Tasks.cs +++ b/module/ASC.Api/ASC.Api.Projects/ProjectApi.Tasks.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,18 +34,22 @@ namespace ASC.Api.Projects { + ///project public partial class ProjectApi { #region tasks - /// - ///Returns a list with the detailed information about all the tasks for the current user. - /// - /// - ///Get my tasks - /// - ///Tasks - ///List of tasks + /// + /// Returns a list with the detailed information about all the tasks for the current user. + /// + /// + /// Get my tasks + /// + /// Tasks + /// List of tasks + /// api/2.0/project/task/@self + /// GET + /// list [Read(@"task/@self")] public IEnumerable GetMyTasks() { @@ -55,15 +59,18 @@ public IEnumerable GetMyTasks() .ToList(); } - /// - ///Returns a list with the detailed information about the tasks for the current user with a status specified in the request. - /// - /// - ///Get my tasks by status - /// - ///Tasks - ///Task status: not accept|open|closed|disable|unclassified|not in milestone - ///List of tasks + /// + /// Returns a list with the detailed information about the tasks for the current user with a status specified in the request. + /// + /// + /// Get my tasks by status + /// + /// Tasks + /// Task status + /// List of tasks + /// api/2.0/project/task/@self/{status} + /// GET + /// list [Read(@"task/@self/{status:(notaccept|open|closed|disable|unclassified|notinmilestone)}")] public IEnumerable GetMyTasks(TaskStatus status) { @@ -73,16 +80,18 @@ public IEnumerable GetMyTasks(TaskStatus status) .ToList(); } - /// - ///Returns the detailed information about a task with the ID specified in the request. - /// - /// - ///Get a task - /// - ///Tasks - ///Task ID - ///Task - /// + /// + /// Returns the detailed information about a task with the ID specified in the request. + /// + /// + /// Get a task + /// + /// Tasks + /// Task ID + /// Task + /// + /// api/2.0/project/task/{taskid} + /// GET [Read(@"task/{taskid:[0-9]+}")] public TaskWrapperFull GetTask(int taskid) { @@ -106,16 +115,19 @@ public TaskWrapper GetTask(Task task) return new TaskWrapper(this, task, milestone); } - /// - ///Returns the detailed information about the tasks with the IDs specified in the request. - /// - /// - ///Get tasks - /// - ///Tasks - ///Task IDs - ///Task - ///false + /// + /// Returns the detailed information about the tasks with the IDs specified in the request. + /// + /// + /// Get tasks + /// + /// Tasks + /// Task IDs + /// List of tasks + /// api/2.0/project/task + /// GET + /// list + /// false [Read(@"task")] public IEnumerable GetTask(IEnumerable taskid) { @@ -123,30 +135,33 @@ public IEnumerable GetTask(IEnumerable taskid) return tasks.Select(TaskWrapperSelector).ToList(); } - /// - ///Returns a list with the detailed information about all the tasks matching the filter parameters specified in the request. - /// - /// - ///Get tasks by filter - /// - ///Tasks - /// Project ID - ///Returns tasks only from my projects - ///Milestone ID - ///Returns tasks only from my milestones - ///Returns tasks only without milestones - ///Project tag - ///Task status - ///Custom task status - ///Messages only from followed tasks or not - ///Departament GUID - ///Participant GUID - ///Creator GUID - ///Minimum value of task deadline - ///Maximum value of task deadline - ///Last task ID - ///List of tasks - /// + /// + /// Returns a list with the detailed information about all the tasks matching the parameters specified in the request. + /// + /// + /// Get filtered tasks + /// + /// Tasks + /// Project ID + /// Specifies whether to return tasks only from my projects or not + /// Milestone ID + /// Specifies whether to return tasks only from my milestones or not + /// Specifies whether to return tasks only without milestones or not + /// Project tag + /// Task status + /// Custom task status + /// Specifies whether to return only followed tasks or not + /// Departament GUID + /// Participant GUID + /// Creator GUID + /// Minimum value of task deadline + /// Maximum value of task deadline + /// Last task ID + /// List of tasks + /// + /// api/2.0/project/task/filter + /// GET + /// list [Read(@"task/filter")] public IEnumerable GetTaskByFilter(int projectid, bool myProjects, int? milestone, bool myMilestones, bool nomilestone, int tag, @@ -182,29 +197,32 @@ public IEnumerable GetTaskByFilter(int projectid, bool myProjects, return filterResult.FilterResult.Select(TaskWrapperSelector).ToList(); } - /// - ///Returns a list of all the tasks matching the filter parameters specified in the request. - /// - /// - ///Get tasks without detailed information by filter - /// - ///Tasks - /// Project ID - ///Returns tasks only from my projects - ///Milestone ID - ///Returns tasks only from my milestones - ///Project Tag - ///Task Status - ///Messages only from followed tasks or not - ///Departament GUID - ///Participant GUID - ///Creator GUID - ///Minimum value of task deadline - ///Maximum value of task deadline - ///Last task ID - ///false - ///List of tasks - /// + /// + /// Returns a list of all the tasks matching the filter parameters specified in the request. + /// + /// + /// Get filtered tasks without detailed information + /// + /// Tasks + /// Project ID + /// Specifies whether to return tasks only from my projects or not + /// Milestone ID + /// Specifies whether to return tasks only from my milestones or not + /// Project tag + /// Task status + /// Specifies whether to return only followed tasks or not + /// Departament GUID + /// Participant GUID + /// Creator GUID + /// Minimum value of task deadline + /// Maximum value of task deadline + /// Last task ID + /// false + /// List of tasks + /// + /// api/2.0/project/task/filter/simple + /// GET + /// list [Read(@"task/filter/simple")] public IEnumerable GetSimpleTaskByFilter(int projectid, bool myProjects, int? milestone, bool myMilestones, int tag, @@ -237,16 +255,19 @@ public IEnumerable GetSimpleTaskByFilter(int projectid, bool return filterResult.FilterResult.Select(r => new SimpleTaskWrapper(this, r)); } - /// - ///Returns a list of all the files attached to the task with the ID specified in the request. - /// - /// - ///Get task files - /// - ///Files - ///Task ID - ///List of files - /// + /// + /// Returns a list of all the files attached to the task with the ID specified in the request. + /// + /// + /// Get task files + /// + /// Files + /// Task ID + /// List of files + /// + /// api/2.0/project/task/{taskid}/files + /// GET + /// list [Read(@"task/{taskid:[0-9]+}/files")] public IEnumerable GetTaskFiles(int taskid) { @@ -259,17 +280,19 @@ public IEnumerable GetTaskFiles(int taskid) return taskEngine.GetFiles(task).Select(FileWrapperSelector); } - /// - ///Uploads the files specified in the request to the selected task. - /// - /// - ///Upload files to the task - /// - ///Files - ///Task ID - ///File IDs - ///Task - /// + /// + /// Uploads the files specified in the request to the selected task. + /// + /// + /// Upload files to the task + /// + /// Files + /// Task ID + /// File IDs + /// Task + /// + /// api/2.0/project/task/{taskid}/files + /// POST [Create(@"task/{taskid:[0-9]+}/files")] public TaskWrapper UploadFilesToTask(int taskid, IEnumerable files) { @@ -294,17 +317,19 @@ public TaskWrapper UploadFilesToTask(int taskid, IEnumerable files) return TaskWrapperSelector(task); } - /// - ///Detaches the selected file from a task with the ID specified in the request. - /// - /// - ///Detach a file from a task - /// - ///Files - ///Task ID - ///File ID - ///Task - /// + /// + /// Detaches the selected file from a task with the ID specified in the request. + /// + /// + /// Detach a file from a task + /// + /// Files + /// Task ID + /// File ID + /// Task + /// + /// api/2.0/project/task/{taskid}/files + /// DELETE [Delete(@"task/{taskid:[0-9]+}/files")] public TaskWrapper DetachFileFromTask(int taskid, int fileid) { @@ -322,18 +347,20 @@ public TaskWrapper DetachFileFromTask(int taskid, int fileid) return TaskWrapperSelector(task); } - /// - ///Detaches the selected files from a task with the ID specified in the request. - /// - /// - ///Detach files from a task - /// - ///Files - ///Task ID - ///File IDs - ///Task - /// - ///false + /// + /// Detaches the selected files from a task with the ID specified in the request. + /// + /// + /// Detach files from a task + /// + /// Files + /// Task ID + /// File IDs + /// Task + /// + /// api/2.0/project/task/{taskid}/filesmany + /// DELETE + /// false [Delete(@"task/{taskid:[0-9]+}/filesmany")] public TaskWrapper DetachFileFromTask(int taskid, List files) { @@ -365,11 +392,13 @@ public TaskWrapper DetachFileFromTask(int taskid, List files) /// Update a task status by task ID /// /// Tasks - /// Task ID - /// New task status: Open or Closed - /// Custom status ID - /// Updated task + /// Task ID + /// New task status + /// Custom status ID + /// Updated task /// + /// api/2.0/project/task/{taskid}/status + /// PUT [Update(@"task/{taskid:[0-9]+}/status")] public TaskWrapperFull UpdateTask(int taskid, TaskStatus status, int statusId = 0) { @@ -384,17 +413,21 @@ public TaskWrapperFull UpdateTask(int taskid, TaskStatus status, int statusId = return GetTask(taskid); } - /// - ///Updates a status of the tasks with the IDs specified in the request. - /// - /// - ///Update a status of tasks - /// - ///Tasks - ///Task IDs - ///New task status: Open or Closed - ///New custom status ID - ///Updated tasks + /// + /// Updates a status of the tasks with the IDs specified in the request. + /// + /// + /// Update a status of tasks + /// + /// Tasks + /// Task IDs + /// New task status + /// New custom status ID + /// Updated tasks + /// api/2.0/project/task/status + /// PUT + /// list + /// Updated tasks [Update(@"task/status")] public IEnumerable UpdateTasks(int[] taskids, TaskStatus status, int statusId = 0) { @@ -415,17 +448,19 @@ public IEnumerable UpdateTasks(int[] taskids, TaskStatus status return result; } - /// - ///Updates a milestone of a task with the ID specified in the request. - /// - /// - ///Update a task milestone - /// - ///Tasks - ///Task ID - ///Milestone ID - ///Updated task - /// + /// + /// Updates a milestone of a task with the ID specified in the request. + /// + /// + /// Update a task milestone + /// + /// Tasks + /// Task ID + /// Milestone ID + /// Updated task + /// + /// api/2.0/project/task/{taskid}/milestone + /// PUT [Update(@"task/{taskid:[0-9]+}/milestone")] public TaskWrapperFull UpdateTask(int taskid, int milestoneid) { @@ -450,17 +485,20 @@ public TaskWrapperFull UpdateTask(int taskid, int milestoneid) return GetTask(taskid); } - /// - ///Updates a milestone of the tasks with the IDs specified in the request. - /// - /// - ///Update a milestone of tasks - /// - ///Tasks - ///Task IDs - ///Milestone ID - ///Updated tasks - /// + /// + /// Updates a milestone of the tasks with the IDs specified in the request. + /// + /// + /// Update a milestone of tasks + /// + /// Tasks + /// Task IDs + /// Milestone ID + /// Updated tasks + /// + /// api/2.0/project/task/milestone + /// PUT + /// list [Update(@"task/milestone")] public IEnumerable UpdateTasks(int[] taskids, int milestoneid) { @@ -483,28 +521,30 @@ public IEnumerable UpdateTasks(int[] taskids, int milestoneid) return result; } - /// - ///Copies a task with the parameters specified in the request. - /// - /// - ///Copy a task - /// - ///Tasks - ///Project ID - ///Task description - ///Task deadline - ///Task priority: Low|Normal|High - ///Task title - ///Task milestone ID - ///List of task responsibles - ///Notifies responsibles about the task actions or not - ///Task start date - ///Task ID from which the information is copied - ///Specifies if the subtasks will be copied or not - ///Specifies if the files will be copied or not - ///Specifies if the original task will be removed or not - ///Copied task - /// + /// + /// Copies a task with the parameters specified in the request. + /// + /// + /// Copy a task + /// + /// Tasks + /// Project ID + /// Task description + /// Task deadline + /// Task priority: Low|Normal|High + /// Task title + /// Task milestone ID + /// List of task responsibles + /// Specifies whether to notify responsibles about the task actions or not + /// Task start date + /// Task ID from which the information is copied + /// Specifies if the subtasks will be copied or not + /// Specifies if the attached files will be copied or not + /// Specifies if the original task will be removed or not + /// Copied task + /// api/2.0/project/task/{copyFrom}/copy + /// POST + /// [Create(@"task/{copyFrom:[0-9]+}/copy")] public TaskWrapper CopyTask(int projectid, string description, ApiDateTime deadline, TaskPriority priority, string title, int milestoneid, @@ -569,27 +609,29 @@ public TaskWrapper CopyTask(int projectid, string description, ApiDateTime deadl return GetTask(task); } - /// - ///Updates the selected task with the parameters (responsible user ID, task description, deadline time, etc) specified in the request. - /// - /// - ///Update a task - /// - ///Tasks - ///Task ID - ///New task description - ///New task deadline time - ///New task start date - ///New task priority - ///New task title - ///New task milestone ID - ///New list of task responsibles - ///New task project ID - ///Notifies responsibles about the task actions or not - ///New task status - ///New task progress - ///Updated task - /// + /// + /// Updates the selected task with the parameters (responsible user ID, task description, deadline time, etc) specified in the request. + /// + /// + /// Update a task + /// + /// Tasks + /// Task ID + /// New task description + /// New task deadline time + /// New task start date + /// New task priority + /// New task title + /// New task milestone ID + /// New list of task responsibles + /// New task project ID + /// Specifies whether to notify responsibles about the task actions or not + /// New task status + /// New task progress + /// Updated task + /// + /// api/2.0/project/task/{taskid} + /// PUT [Update(@"task/{taskid:[0-9]+}")] public TaskWrapperFull UpdateProjectTask( int taskid, @@ -683,16 +725,18 @@ public TaskWrapperFull UpdateProjectTask( return GetTask(taskid); } - /// - ///Deletes a task with the ID specified in the request from the project. - /// - /// - ///Delete a task - /// - ///Tasks - ///Task ID - ///Deleted task - /// + /// + /// Deletes a task with the ID specified in the request from the project. + /// + /// + /// Delete a task + /// + /// Tasks + /// Task ID + /// Deleted task + /// + /// api/2.0/project/task/{taskid} + /// DELETE [Delete(@"task/{taskid:[0-9]+}")] public TaskWrapper DeleteTask(int taskid) { @@ -706,16 +750,19 @@ public TaskWrapper DeleteTask(int taskid) return TaskWrapperSelector(task); } - /// - ///Deletes the tasks with the IDs specified in the request from the project. - /// - /// - ///Delete tasks - /// - ///Tasks - ///Task IDs - ///Deleted tasks - /// + /// + /// Deletes the tasks with the IDs specified in the request from the project. + /// + /// + /// Delete tasks + /// + /// Tasks + /// Task IDs + /// Deleted tasks + /// + /// api/2.0/project/task + /// DELETE + /// list [Delete(@"task")] public IEnumerable DeleteTasks(int[] taskids) { @@ -736,16 +783,19 @@ public IEnumerable DeleteTasks(int[] taskids) return result; } - /// - ///Returns a list of the comments for the task with the ID specified in the request. - /// - /// - ///Get task comments - /// - ///Comments - ///Task ID - ///List of comments - /// + /// + /// Returns a list of the comments for the task with the ID specified in the request. + /// + /// + /// Get task comments + /// + /// Tasks + /// Task ID + /// List of comments + /// + /// api/2.0/project/task/{taskid}/comment + /// GET + /// list [Read(@"task/{taskid:[0-9]+}/comment")] public IEnumerable GetTaskComments(int taskid) { @@ -754,18 +804,20 @@ public IEnumerable GetTaskComments(int taskid) } - /// - ///Adds a comment to the selected task with the comment text and parent comment ID specified in the request. - /// - /// - ///Add a task comment - /// - ///Comments - ///Task ID - ///Comment text - ///Parent comment ID - ///List of comments - /// + /// + /// Adds a comment to the selected task with the comment text and parent comment ID specified in the request. + /// + /// + /// Add a task comment + /// + /// Tasks + /// Task ID + /// Comment text + /// Parent comment ID + /// List of comments + /// + /// api/2.0/project/task/{taskid}/comment + /// POST [Create(@"task/{taskid:[0-9]+}/comment")] public CommentWrapper AddTaskComments(int taskid, string content, Guid parentid) { @@ -794,16 +846,18 @@ public CommentWrapper AddTaskComments(int taskid, string content, Guid parentid) return new CommentWrapper(this, comment, task); } - /// - ///Notifies the responsible for the task with the ID specified in the request about the task. - /// - /// - ///Notify the task responsible - /// - ///Tasks - ///Task - ///Task ID - /// + /// + /// Notifies the responsible for the task with the ID specified in the request about the task. + /// + /// + /// Notify the task responsible + /// + /// Tasks + /// Task + /// Task ID + /// + /// api/2.0/project/task/{taskid}/notify + /// GET [Read(@"task/{taskid:[0-9]+}/notify")] public TaskWrapper NotifyTaskResponsible(int taskid) { @@ -816,16 +870,18 @@ public TaskWrapper NotifyTaskResponsible(int taskid) return TaskWrapperSelector(task); } - /// - ///Subscribes to the notifications about the actions performed with the selected task. - /// - /// - ///Subscribe to task actions - /// - ///Tasks - ///Task - ///Task ID - /// + /// + /// Subscribes to the notifications about the actions performed with the selected task. + /// + /// + /// Subscribe to a task + /// + /// Tasks + /// Task + /// Task ID + /// + /// api/2.0/project/task/{taskid}/subscribe + /// PUT [Update(@"task/{taskid:[0-9]+}/subscribe")] public TaskWrapper SubscribeToTask(int taskid) { @@ -840,16 +896,18 @@ public TaskWrapper SubscribeToTask(int taskid) return TaskWrapperSelector(task); } - /// - ///Checks the subscription to the notifications about the actions performed with the selected task. - /// - /// - ///Check the subscription to task actions - /// - ///Tasks - ///Task ID - ///Boolean value: True - subscribed, False - unsubscribed - /// + /// + /// Checks the subscription to the notifications about the actions performed with the selected task. + /// + /// + /// Check the task subscription + /// + /// Tasks + /// Task ID + /// Boolean value: true - subscribed, false - unsubscribed + /// + /// api/2.0/project/task/{taskid}/subscribe + /// GET [Read(@"task/{taskid:[0-9]+}/subscribe")] public bool IsSubscribeToTask(int taskid) { @@ -862,18 +920,20 @@ public bool IsSubscribeToTask(int taskid) return taskEngine.IsSubscribed(task); } - /// - ///Adds a link between the dependent and parent tasks specified in the request. - /// - /// - ///Add a link between tasks - /// - ///Tasks - ///Parent task ID - ///Dependent task ID - ///Link type - ///Dependent task - /// + /// + /// Adds a link between the dependent and parent tasks specified in the request. + /// + /// + /// Add a link between tasks + /// + /// Tasks + /// Parent task ID + /// Dependent task ID + /// Link type + /// Dependent task + /// + /// api/2.0/project/task/{parentTaskId}/link + /// POST [Create(@"task/{parentTaskId:[0-9]+}/link")] public TaskWrapper AddLink(int parentTaskId, int dependenceTaskId, TaskLinkType linkType) { @@ -888,17 +948,19 @@ public TaskWrapper AddLink(int parentTaskId, int dependenceTaskId, TaskLinkType return TaskWrapperSelector(dependentTask); } - /// - ///Removes a link between the dependent and parent tasks specified in the request. - /// - /// - ///Remove a link between tasks - /// - ///Tasks - ///Dependent task ID - ///Parent task ID - ///Dependent task - /// + /// + /// Removes a link between the dependent and parent tasks specified in the request. + /// + /// + /// Remove a link between tasks + /// + /// Tasks + /// Dependent task ID + /// Parent task ID + /// Dependent task + /// + /// api/2.0/project/task/{taskid}/link + /// DELETE [Delete(@"task/{taskid:[0-9]+}/link")] public TaskWrapper RemoveLink(int dependenceTaskId, int parentTaskId) { @@ -917,18 +979,20 @@ public TaskWrapper RemoveLink(int dependenceTaskId, int parentTaskId) #region subtasks - /// - ///Creates a subtask with the title and responsible within the parent task specified in the request. - /// - /// - ///Create a subtask - /// - ///Tasks - ///Parent task ID - ///Subtask responsible - ///Subtask title - ///Task - /// + /// + /// Creates a subtask with the title and responsible within the parent task specified in the request. + /// + /// + /// Create a subtask + /// + /// Tasks + /// Parent task ID + /// Subtask responsible + /// Subtask title + /// Subtask + /// + /// api/2.0/project/task/{taskid} + /// POST [Create(@"task/{taskid:[0-9]+}")] public SubtaskWrapper AddSubtask(int taskid, Guid responsible, string title) { @@ -951,17 +1015,19 @@ public SubtaskWrapper AddSubtask(int taskid, Guid responsible, string title) return new SubtaskWrapper(this, subtask, task); } - /// - ///Copies a subtask with the ID specified in the request. - /// - /// - ///Copy a subtask - /// - ///Tasks - ///Task ID - ///Subtask ID - ///New subtask - /// + /// + /// Copies a subtask with the ID specified in the request. + /// + /// + /// Copy a subtask + /// + /// Tasks + /// Task ID + /// Subtask ID + /// New subtask + /// + /// api/2.0/project/task/{taskid}/{subtaskid}/copy + /// POST [Create(@"task/{taskid:[0-9]+}/{subtaskid:[0-9]+}/copy")] public SubtaskWrapper CopySubtask(int taskid, int subtaskid) { @@ -978,17 +1044,19 @@ public SubtaskWrapper CopySubtask(int taskid, int subtaskid) return new SubtaskWrapper(this, newSubtask, task); } - /// - ///Moves a subtask with the ID specified in the request to another task. - /// - /// - ///Move a subtask - /// - ///Tasks - ///Task ID - ///Subtask ID - ///Updated subtask - /// + /// + /// Moves a subtask with the ID specified in the request to another task. + /// + /// + /// Move a subtask + /// + /// Tasks + /// Task ID + /// Subtask ID + /// Updated subtask + /// + /// api/2.0/project/task/{taskid}/{subtaskid}/move + /// PUT [Update(@"task/{taskid:[0-9]+}/{subtaskid:[0-9]+}/move")] public SubtaskWrapper MoveSubtask(int taskid, int subtaskid) { @@ -1014,19 +1082,21 @@ public SubtaskWrapper MoveSubtask(int taskid, int subtaskid) return new SubtaskWrapper(this, subtask, toTask); } - /// - ///Updates the selected subtask with the title and responsible specified in the request. - /// - /// - ///Update a subtask - /// - ///Tasks - ///Task ID - ///Subtask ID - ///New subtask responsible - ///New subtask title - ///Updated subtask - /// + /// + /// Updates the selected subtask with the title and responsible specified in the request. + /// + /// + /// Update a subtask + /// + /// Tasks + /// Task ID + /// Subtask ID + /// New subtask responsible + /// New subtask title + /// Updated subtask + /// + /// api/2.0/project/task/{taskid}/{subtaskid} + /// PUT [Update(@"task/{taskid:[0-9]+}/{subtaskid:[0-9]+}")] public SubtaskWrapper UpdateSubtask(int taskid, int subtaskid, Guid responsible, string title) { @@ -1059,17 +1129,19 @@ public SubtaskWrapper UpdateSubtask(int taskid, int subtaskid, Guid responsible, return new SubtaskWrapper(this, subtask, task); } - /// - ///Deletes the selected subtask from the parent task with the ID specified in the request. - /// - /// - ///Delete a subtask - /// - ///Tasks - ///Task ID - ///Subtask ID - ///Subtask - /// + /// + /// Deletes the selected subtask from the parent task with the ID specified in the request. + /// + /// + /// Delete a subtask + /// + /// Tasks + /// Task ID + /// Subtask ID + /// Subtask + /// + /// api/2.0/project/task/{taskid}/{subtaskid} + /// DELETE [Delete(@"task/{taskid:[0-9]+}/{subtaskid:[0-9]+}")] public SubtaskWrapper DeleteSubtask(int taskid, int subtaskid) { @@ -1082,18 +1154,20 @@ public SubtaskWrapper DeleteSubtask(int taskid, int subtaskid) return new SubtaskWrapper(this, subtask, task); } - /// - ///Updates the selected subtask status of the parent task with the ID specified in the request. - /// - /// - ///Update a subtask status - /// - ///Tasks - ///Task ID - ///Subtask ID - ///New subtask status: open|closed|disable|unclassified - ///Updated subtask - /// + /// + /// Updates the selected subtask status of the parent task with the ID specified in the request. + /// + /// + /// Update a subtask status + /// + /// Tasks + /// Task ID + /// Subtask ID + /// New subtask status + /// Updated subtask + /// + /// api/2.0/project/task/{taskid}/{subtaskid}/status + /// PUT [Update(@"task/{taskid:[0-9]+}/{subtaskid:[0-9]+}/status")] public SubtaskWrapper UpdateSubtask(int taskid, int subtaskid, TaskStatus status) { diff --git a/module/ASC.Api/ASC.Api.Projects/ProjectApi.TimeSpend.cs b/module/ASC.Api/ASC.Api.Projects/ProjectApi.TimeSpend.cs index 843e25437..c1aa35b76 100644 --- a/module/ASC.Api/ASC.Api.Projects/ProjectApi.TimeSpend.cs +++ b/module/ASC.Api/ASC.Api.Projects/ProjectApi.TimeSpend.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,26 +32,29 @@ namespace ASC.Api.Projects { public partial class ProjectApi { - /// - ///Returns a list with the detailed information about all the task time spent matching the filter parameters specified in the request. - /// - /// - ///Get task time by filter - /// - ///Time - /// Project ID - ///Returns task time only for my projects - ///Milestone ID - ///Returns task time only for my milestones - ///Project tag - ///Departament GUID - ///Participant GUID - ///Starting task creation - ///Finishing task creation - ///Last spent time ID - ///Payment status - ///List of spent time - /// + /// + /// Returns a list with the detailed information about all the task time spent matching the filter parameters specified in the request. + /// + /// + /// Get filtered task time + /// + /// Time + /// Project ID + /// Specifies whether to return task time only for my projects or not + /// Milestone ID + /// Specifies whether to return task time only for my milestones or not + /// Project tag + /// Departament GUID + /// Participant GUID + /// The earliest date of task creation + /// The latest date of task creation + /// Last spent time ID + /// Payment status ("NotChargeable", "NotBilled", or "Billed") + /// List of spent time + /// + /// api/2.0/project/time/filter + /// GET + /// list [Read(@"time/filter")] public IEnumerable GetTaskTimeByFilter( int projectid, @@ -88,26 +91,28 @@ public IEnumerable GetTaskTimeByFilter( return EngineFactory.TimeTrackingEngine.GetByFilter(filter).NotFoundIfNull().Select(TimeWrapperSelector); } - /// - ///Returns the total time spent matching the filter parameters specified in the request. - /// - /// - ///Get total task time by filter - /// - ///Time - /// Project ID - ///Returns task time only for my projects - ///Milestone ID - ///Returns task time only for my milestones - ///Project tag - ///Departament GUID - ///Participant GUID - ///Starting task creation - ///Finishing task creation - ///Last spent time ID - ///Payment status - ///Total spent time - /// + /// + /// Returns the total time spent matching the filter parameters specified in the request. + /// + /// + /// Get filtered total task time + /// + /// Time + /// Project ID + /// Specifies whether to return task time only for my projects or not + /// Milestone ID + /// Specifies whether to return task time only for my milestones or not + /// Project tag + /// Departament GUID + /// Participant GUID + /// The earliest date of task creation + /// The latest date of task creation + /// Last spent time ID + /// Payment status ("NotChargeable", "NotBilled", or "Billed") + /// Total spent time + /// + /// api/2.0/project/time/filter/total + /// GET [Read(@"time/filter/total")] public float GetTotalTaskTimeByFilter( int projectid, @@ -146,16 +151,19 @@ public float GetTotalTaskTimeByFilter( return EngineFactory.TimeTrackingEngine.GetByFilterTotal(filter); } - /// - ///Returns the time spent on the task with the ID specified in the request. - /// - /// - ///Get task time - /// - ///Time - ///Task ID - ///Task time - /// + /// + /// Returns the time spent on the task with the ID specified in the request. + /// + /// + /// Get task time + /// + /// Time + /// Task ID + /// Task time + /// + /// api/2.0/project/task/{taskid}/time + /// GET + /// list [Read(@"task/{taskid:[0-9]+}/time")] public IEnumerable GetTaskTime(int taskid) { @@ -165,22 +173,24 @@ public IEnumerable GetTaskTime(int taskid) return times.Select(TimeWrapperSelector); } - /// - ///Adds the time to the selected task with the time parameters specified in the request. - /// - /// - ///Add task time - /// - ///Time - ///Task ID - ///Time note - ///Date - ///Person ID - ///Spent hours - ///Project ID - ///Created time - /// - /// + /// + /// Adds the time to the selected task with the time parameters specified in the request. + /// + /// + /// Add task time + /// + /// Time + /// Task ID + /// Time note + /// Date + /// Person ID + /// Spent hours + /// Project ID + /// Created time + /// + /// + /// api/2.0/project/task/{taskid}/time + /// POST [Create(@"task/{taskid:[0-9]+}/time")] public TimeWrapper AddTaskTime(int taskid, string note, DateTime date, Guid personId, float hours, int projectId) { @@ -209,21 +219,23 @@ public TimeWrapper AddTaskTime(int taskid, string note, DateTime date, Guid pers return TimeWrapperSelector(ts); } - /// - ///Updates the time for the selected task with the time parameters specified in the request. - /// - /// - ///Update task time - /// - ///Time - ///Time ID - ///New time note - ///New date - ///New person ID - ///New spent hours - ///Updated time - /// - /// + /// + /// Updates the time for the selected task with the time parameters specified in the request. + /// + /// + /// Update task time + /// + /// Time + /// Time ID + /// New time note + /// New date + /// New person ID + /// New spent hours + /// Updated time + /// + /// + /// api/2.0/project/time/{timeid} + /// PUT [Update(@"time/{timeid:[0-9]+}")] public TimeWrapper UpdateTime(int timeid, string note, DateTime date, Guid personId, float hours) { @@ -245,17 +257,20 @@ public TimeWrapper UpdateTime(int timeid, string note, DateTime date, Guid perso return TimeWrapperSelector(time); } - /// - ///Updates a time status of payment with the parameters specified in the request. - /// - /// - ///Update a time status of payment - /// - ///Time - ///Spent time IDs - ///New payment status - ///Updated times - /// + /// + /// Updates the time payment status with the parameters specified in the request. + /// + /// + /// Update the time payment status + /// + /// Time + /// Spent time IDs + /// New payment status ("NotChargeable", "NotBilled", or "Billed") + /// Updated time + /// + /// api/2.0/project/time/times/status + /// PUT + /// list [Update(@"time/times/status")] public List UpdateTimes(int[] timeids, PaymentStatus status) { @@ -274,16 +289,19 @@ public List UpdateTimes(int[] timeids, PaymentStatus status) return times; } - /// - ///Deletes time from the tasks with the IDs specified in the request. - /// - /// - ///Delete task time - /// - ///Time - ///Spent time IDs - ///Deleted time - /// + /// + /// Deletes the time from the tasks with the IDs specified in the request. + /// + /// + /// Delete task time + /// + /// Time + /// Spent time IDs + /// Deleted time + /// + /// api/2.0/project/time/times/remove + /// DELETE + /// list [Delete(@"time/times/remove")] public List DeleteTaskTimes(int[] timeids) { diff --git a/module/ASC.Api/ASC.Api.Projects/ProjectApi.cs b/module/ASC.Api/ASC.Api.Projects/ProjectApi.cs index 3dcdd5304..baebff70b 100644 --- a/module/ASC.Api/ASC.Api.Projects/ProjectApi.cs +++ b/module/ASC.Api/ASC.Api.Projects/ProjectApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,6 +39,7 @@ namespace ASC.Api.Projects /// ///Project information access. /// + ///project public partial class ProjectApi : ProjectApiBase, IApiEntryPoint { private readonly DocumentsApi documentsApi; @@ -179,18 +180,20 @@ internal static List GetUserCalendars(Guid userId) } } - /// - ///Updates the project settings with the parameters specified in the request. - /// - /// - ///Update settings - /// - ///Settings - ///Specifies if all the portal users can create projects or not - ///Specifies if the entities will be hidden in the paused projects or not - ///Module type: Projects, Tasks, Discussions, TimeTracking - ///Folder ID - ///Updated settings + /// + /// Updates the project settings with the parameters specified in the request. + /// + /// + /// Update the project settings + /// + /// Settings + /// Specifies if all the portal users can create projects or not + /// Specifies if the entities will be hidden in the paused projects or not + /// Module type: Projects, Tasks, Discussions, TimeTracking + /// Folder ID + /// Updated project settings + /// api/2.0/project/settings + /// PUT [Update(@"settings")] public ProjectsCommonSettings UpdateSettings(bool? everebodyCanCreate, bool? hideEntitiesInPausedProjects, @@ -238,14 +241,16 @@ public ProjectsCommonSettings UpdateSettings(bool? everebodyCanCreate, return null; } - /// - ///Returns the common project settings. - /// - /// - ///Get settings - /// - ///Settings - ///Project common settings + /// + /// Returns the common project settings. + /// + /// + /// Get the project settings + /// + /// Settings + /// Project common settings + /// api/2.0/project/settings + /// GET [Read(@"settings")] public ProjectsCommonSettings GetSettings() { @@ -262,30 +267,34 @@ public ProjectsCommonSettings GetSettings() } - /// - ///Creates a task status specified in the request. - /// - /// - ///Create a task status - /// - ///Task status + /// + /// Creates a task status specified in the request. + /// + /// + /// Create a task status + /// + /// Task status + /// Task status + /// api/2.0/project/status + /// POST ///Tasks - ///Task status [Create(@"status")] public CustomTaskStatus CreateStatus(CustomTaskStatus status) { return EngineFactory.StatusEngine.Create(status); } - /// - ///Updates a task status with a value specified in the request. - /// - /// - ///Update a task status - /// - ///New task status + /// + /// Updates a task status with a value specified in the request. + /// + /// + /// Update a task status + /// + /// New task status + /// Updated task status + /// api/2.0/project/status + /// PUT ///Tasks - ///Updated task status [Update(@"status")] public CustomTaskStatus UpdateStatus(CustomTaskStatus newStatus) { @@ -309,16 +318,18 @@ public CustomTaskStatus UpdateStatus(CustomTaskStatus newStatus) return status; } - - /// - ///Updates the task statuses with the values specified in the request. - /// - /// - ///Update task statuses - /// - ///New task statuses - ///Tasks - ///Updated task statuses + /// + /// Updates the task statuses with the values specified in the request. + /// + /// + /// Update task statuses + /// + /// Tasks + /// New task statuses + /// Updated task statuses + /// api/2.0/project/statuses + /// PUT + /// list [Update(@"statuses")] public List UpdateStatuses(List statuses) { @@ -330,29 +341,34 @@ public List UpdateStatuses(List statuses) return statuses; } - /// - ///Returns all the task statuses. - /// - /// - ///Get task statuses - /// + /// + /// Returns all the task statuses. + /// + /// + /// Get task statuses + /// + /// Task statuses + /// api/2.0/project/status + /// GET ///Tasks - ///Task statuses + /// list [Read(@"status")] public List GetStatuses() { return EngineFactory.StatusEngine.GetWithDefaults(); } - /// - ///Deletes a task status with the ID specified in the request. - /// - /// - ///Delete a task status - /// - ///Task status ID + /// + /// Deletes a task status with the ID specified in the request. + /// + /// + /// Delete a task status + /// + /// Task status ID + /// Task status + /// api/2.0/project/status/{id} + /// DELETE ///Tasks - ///Task status [Delete(@"status/{id}")] public CustomTaskStatus DeleteStatus(int id) { diff --git a/module/ASC.Api/ASC.Api.Projects/ProjectApiBase.cs b/module/ASC.Api/ASC.Api.Projects/ProjectApiBase.cs index 3c06cfcd2..cbc230716 100644 --- a/module/ASC.Api/ASC.Api.Projects/ProjectApiBase.cs +++ b/module/ASC.Api/ASC.Api.Projects/ProjectApiBase.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Projects/ProjectBootstrap.cs b/module/ASC.Api/ASC.Api.Projects/ProjectBootstrap.cs index 1b7254450..9bc8c400d 100644 --- a/module/ASC.Api/ASC.Api.Projects/ProjectBootstrap.cs +++ b/module/ASC.Api/ASC.Api.Projects/ProjectBootstrap.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/CommentWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/CommentWrapper.cs index 74614c5dd..7963e3af0 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/CommentWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/CommentWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,27 +27,43 @@ namespace ASC.Api.Projects.Wrappers [DataContract(Name = "comment", Namespace = "")] public class CommentWrapper : IApiSortableDate { + ///00000000-0000-0000-0000-000000000000 + ///1 [DataMember(Order = 1)] public Guid Id { get; set; } + ///00000000-0000-0000-0000-000000000000 + ///12 [DataMember(Order = 12)] public Guid ParentId { get; set; } + ///comment text + ///10 [DataMember(Order = 10)] public string Text { get; set; } + ///2020-12-22T04:11:56.5008512Z + ///50 [DataMember(Order = 50)] public ApiDateTime Created { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///9 [DataMember(Order = 9)] public EmployeeWraper CreatedBy { get; set; } + ///2020-12-22T04:11:56.5008512Z + ///50 [DataMember(Order = 50, EmitDefaultValue = false)] public ApiDateTime Updated { get; set; } + ///false + ///13 [DataMember(Order = 13)] public bool Inactive { get; set; } + ///false + ///14 [DataMember(Order = 14)] public bool CanEdit { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/MessageWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/MessageWrapper.cs index c31693c62..95680178d 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/MessageWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/MessageWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,21 +23,30 @@ namespace ASC.Api.Projects.Wrappers { + ///ASC.Api.Projects.Wrappers.ObjectWrapperFullBase, ASC.Api.Projects [DataContract(Name = "message", Namespace = "")] public class MessageWrapper : ObjectWrapperFullBase { + ///ASC.Api.Projects.Wrappers.SimpleProjectWrapper, ASC.Api.Projects + ///14 [DataMember(Order = 14)] public SimpleProjectWrapper ProjectOwner { get; set; } + ///Hello, this is sample message + ///20 [DataMember(Order = 20)] public string Text { get; set; } + ///false [DataMember] public bool CanCreateComment { get; set; } + ///true [DataMember] public bool CanEdit { get; set; } + ///5 + ///15 [DataMember(Order = 15)] public int CommentsCount { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/MessageWrapperFull.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/MessageWrapperFull.cs index e87c25033..834aa7cd3 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/MessageWrapperFull.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/MessageWrapperFull.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Linq; @@ -30,24 +30,34 @@ namespace ASC.Api.Projects.Wrappers { + ///ASC.Api.Projects.Wrappers.MessageWrapper, ASC.Api.Projects [DataContract(Name = "message", Namespace = "")] public class MessageWrapperFull : MessageWrapper { + ///true [DataMember] public bool CanEditFiles { get; set; } + ///true [DataMember] public bool CanReadFiles { get; set; } + ///ASC.Api.Employee.EmployeeWraperFull, ASC.Api.Employee + ///list [DataMember] public List Subscribers { get; set; } + ///ASC.Api.Documents.FileWrapper, ASC.Api.Documents + ///list [DataMember] public List Files { get; set; } + ///ASC.Web.Studio.UserControls.Common.Comments.CommentInfo, ASC.Web.Studio + ///list [DataMember] public List Comments { get; set; } + ///ASC.Api.Projects.Wrappers.ProjectWrapperFull, ASC.Api.Projects [DataMember] public ProjectWrapperFull Project { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/MilestoneWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/MilestoneWrapper.cs index f8c6b3c75..1dfc12934 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/MilestoneWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/MilestoneWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,27 +27,41 @@ namespace ASC.Api.Projects.Wrappers [DataContract(Name = "milestone", Namespace = "")] public class MilestoneWrapper : ObjectWrapperFullBase { + ///ASC.Api.Projects.Wrappers.SimpleProjectWrapper, ASC.Api.Projects + ///14 [DataMember(Order = 14)] public SimpleProjectWrapper ProjectOwner { get; set; } + ///2020-12-22T04:11:56.4458522Z + ///20 [DataMember(Order = 20)] public ApiDateTime Deadline { get; set; } + ///false + ///20 [DataMember(Order = 20)] public bool IsKey { get; set; } + ///false + ///20 [DataMember(Order = 20)] public bool IsNotify { get; set; } + ///false [DataMember] public bool CanEdit { get; set; } + ///false [DataMember] public bool CanDelete { get; set; } + ///15 + ///20 [DataMember(Order = 20)] public int ActiveTaskCount { get; set; } + ///5 + ///20 [DataMember(Order = 20)] public int ClosedTaskCount { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/ObjectWrapperBase.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/ObjectWrapperBase.cs index 6baac6a4e..0a180fde1 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/ObjectWrapperBase.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/ObjectWrapperBase.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,21 +25,33 @@ namespace ASC.Api.Projects.Wrappers [DataContract(Namespace = "")] public class ObjectWrapperBase { + ///10 + ///1 [DataMember(Order = 1)] public int Id { get; set; } + ///Sample Title + ///10 [DataMember(Order = 10)] public string Title { get; set; } + ///Sample description + ///11 [DataMember(Order = 11)] public string Description { get; set; } + ///0 + ///20 [DataMember(Order = 20)] public int Status { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///30 [DataMember(Order = 30, EmitDefaultValue = false)] public EmployeeWraper Responsible { get; set; } + ///00000000-0000-0000-0000-000000000000 + ///30 [DataMember(Order = 30, EmitDefaultValue = false)] public Guid ResponsibleId { get; set; } } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/ObjectWrapperFullBase.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/ObjectWrapperFullBase.cs index 6af1e9c78..257e08767 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/ObjectWrapperFullBase.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/ObjectWrapperFullBase.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,20 +23,29 @@ namespace ASC.Api.Projects.Wrappers { + ///ASC.Api.Projects.Wrappers.ObjectWrapperBase, ASC.Api.Projects [DataContract(Namespace = "")] public class ObjectWrapperFullBase : ObjectWrapperBase, IApiSortableDate { + ///2020-12-22T04:11:56.5658524Z + ///50 [DataMember(Order = 50)] public ApiDateTime Created { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///51 [DataMember(Order = 51, EmitDefaultValue = false)] public EmployeeWraper CreatedBy { get; set; } + ///00000000-0000-0000-0000-000000000000 + ///51 [DataMember(Order = 51, EmitDefaultValue = false)] public Guid CreatedById { get; set; } private ApiDateTime updated; + ///2020-12-22T04:11:56.5658524Z + ///52 [DataMember(Order = 52, EmitDefaultValue = false)] public ApiDateTime Updated { @@ -44,9 +53,13 @@ public ApiDateTime Updated set { updated = value; } } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///41 [DataMember(Order = 41, EmitDefaultValue = false)] public EmployeeWraper UpdatedBy { get; set; } + ///00000000-0000-0000-0000-000000000000 + ///41 [DataMember(Order = 41, EmitDefaultValue = false)] public Guid UpdatedById { get; set; } } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/ParticipantFullWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/ParticipantFullWrapper.cs index aab152ae7..ab4d0cbb4 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/ParticipantFullWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/ParticipantFullWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/ParticipantWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/ParticipantWrapper.cs index d19243e39..5272bfb37 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/ParticipantWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/ParticipantWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,27 +22,35 @@ namespace ASC.Api.Projects.Wrappers { + ///ASC.Api.Employee.EmployeeWraperFull, ASC.Api.Employee [DataContract(Name = "participant", Namespace = "")] public class ParticipantWrapper : EmployeeWraperFull { + ///true [DataMember] public bool CanReadFiles { get; set; } + ///true [DataMember] public bool CanReadMilestones { get; set; } + ///true [DataMember] public bool CanReadMessages { get; set; } + ///true [DataMember] public bool CanReadTasks { get; set; } + ///true [DataMember] public bool CanReadContacts { get; set; } + ///true [DataMember] public bool IsAdministrator { get; set; } + ///true [DataMember] public bool IsRemovedFromTeam { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/ProjectWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/ProjectWrapper.cs index 9047b7801..34ae0ca0e 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/ProjectWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/ProjectWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,12 +22,17 @@ namespace ASC.Api.Projects.Wrappers { + ///ASC.Api.Projects.Wrappers.ObjectWrapperBase, ASC.Api.Projects [DataContract(Name = "project", Namespace = "")] public class ProjectWrapper : ObjectWrapperBase { + ///false + ///31 [DataMember(Order = 31)] public bool CanEdit { get; set; } + ///false + ///32 [DataMember(Order = 32)] public bool IsPrivate { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/ProjectWrapperFull.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/ProjectWrapperFull.cs index aa8f8c560..e0c372fce 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/ProjectWrapperFull.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/ProjectWrapperFull.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,48 +25,74 @@ namespace ASC.Api.Projects.Wrappers { + ///ASC.Api.Projects.Wrappers.ObjectWrapperFullBase, ASC.Api.Projects [DataContract(Name = "project", Namespace = "")] public class ProjectWrapperFull : ObjectWrapperFullBase { + ///false [DataMember] public bool CanEdit { get; set; } + ///false [DataMember] public bool CanDelete { get; set; } + ///ASC.Web.Projects.Classes.ProjectSecurityInfo, ASC.Web.Projects [DataMember] public ProjectSecurityInfo Security { get; set; } + ///13234 [DataMember(EmitDefaultValue = false)] public object ProjectFolder { get; set; } + ///false + ///32 [DataMember(Order = 32)] public bool IsPrivate { get; set; } + ///0 + ///33 [DataMember(Order = 33)] public int TaskCount { get; set; } + ///0 + ///33 [DataMember(Order = 33)] public int TaskCountTotal { get; set; } + ///0 + ///34 [DataMember(Order = 34)] public int MilestoneCount { get; set; } + ///0 + ///34 [DataMember(Order = 34)] public int DiscussionCount { get; set; } + ///0 + ///35 [DataMember(Order = 35)] public int ParticipantCount { get; set; } + ///TimeTrackingTotal + ///35 [DataMember(Order = 35)] public string TimeTrackingTotal { get; set; } + ///0 + ///35 [DataMember(Order = 35)] public int DocumentsCount { get; set; } + ///0 + ///36 [DataMember(Order = 36)] public bool IsFollow { get; set; } + ///Tags1,Tags2 + ///37 + ///list [DataMember(Order = 37, EmitDefaultValue = false)] public IEnumerable Tags { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/ReportTemplateWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/ReportTemplateWrapper.cs index 4540e477b..45a443063 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/ReportTemplateWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/ReportTemplateWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,18 +23,23 @@ namespace ASC.Api.Projects.Wrappers { + ///ASC.Api.Projects.Wrappers.ObjectWrapperFullBase, ASC.Api.Projects [DataContract(Name = "reportTemplate", Namespace = "")] public class ReportTemplateWrapper : ObjectWrapperFullBase { + ///true [DataMember] public bool AutoGenerated { get; set; } + ///Cron [DataMember] public string Cron { get; set; } + ///0 [DataMember] public ReportType ReportType { get; set; } + ///Filter [DataMember] public string Filter { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/SearchItemWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/SearchItemWrapper.cs index af5e2dc14..77c24f43f 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/SearchItemWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/SearchItemWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,18 +26,28 @@ namespace ASC.Api.Projects.Wrappers [DataContract(Name = "search_item", Namespace = "")] public class SearchItemWrapper { + ///345 + ///1 [DataMember(Order = 1)] public string Id { get; set; } + ///0 + ///3 [DataMember(Order = 3)] public EntityType EntityType { get; set; } + ///Sample title + ///5 [DataMember(Order = 5)] public string Title { get; set; } + ///Sample desription + ///10 [DataMember(Order = 10)] public string Description { get; set; } + ///2020-12-22T04:11:56.5308514Z + ///20 [DataMember(Order = 20)] public ApiDateTime Created { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/SearchWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/SearchWrapper.cs index b8454cbee..cf4092755 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/SearchWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/SearchWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,9 +24,13 @@ namespace ASC.Api.Projects.Wrappers [DataContract(Name = "search", Namespace = "")] public class SearchWrapper { + ///ASC.Api.Projects.Wrappers.SearchItemWrapper, ASC.Api.Projects + ///10 [DataMember(Order = 10)] public SearchItemWrapper Item { get; set; } + ///ASC.Api.Projects.Wrappers.SearchItemWrapper, ASC.Api.Projects + ///14 [DataMember(Order = 14)] public SearchItemWrapper Owner { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/SimpleMilestoneWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/SimpleMilestoneWrapper.cs index 99a1baed9..f89dc4cc1 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/SimpleMilestoneWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/SimpleMilestoneWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,12 +26,18 @@ namespace ASC.Api.Projects.Wrappers [DataContract(Name = "milestone", Namespace = "")] public class SimpleMilestoneWrapper { + ///123 + ///60 [DataMember(Order = 60)] public int Id { get; set; } + ///Title + ///61 [DataMember(Order = 61)] public string Title { get; set; } + ///2020-12-22T04:11:56.5768573Z + ///62 [DataMember(Order = 62)] public ApiDateTime Deadline { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/SimpleProjectWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/SimpleProjectWrapper.cs index ba4e816ec..e8659c673 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/SimpleProjectWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/SimpleProjectWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,15 +24,23 @@ namespace ASC.Api.Projects.Wrappers [DataContract(Name = "project", Namespace = "")] public class SimpleProjectWrapper { + ///123 + /// 60 [DataMember(Order = 60)] public int Id { get; set; } + ///Sample project + ///61 [DataMember(Order = 61)] public string Title { get; set; } + ///0 + ///62 [DataMember(Order = 62)] public int Status { get; set; } + ///false + ///63 [DataMember(Order = 63)] public bool IsPrivate { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/SimpleTaskWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/SimpleTaskWrapper.cs index ead70e18f..55ebfa818 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/SimpleTaskWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/SimpleTaskWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/SubtaskWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/SubtaskWrapper.cs index f78bdadfe..a649f5357 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/SubtaskWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/SubtaskWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,12 +24,15 @@ namespace ASC.Api.Projects.Wrappers { + ///ASC.Api.Projects.Wrappers.ObjectWrapperFullBase, ASC.Api.Projects [DataContract(Name = "subtask", Namespace = "")] public class SubtaskWrapper : ObjectWrapperFullBase { + ///false [DataMember] public bool CanEdit { get; set; } - + + ///1234 [DataMember] public int TaskId { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/SubtaskWrapperFull.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/SubtaskWrapperFull.cs index 55a61b271..ab03b677c 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/SubtaskWrapperFull.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/SubtaskWrapperFull.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/TaskLinkWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/TaskLinkWrapper.cs index 4cd7675bb..41822028e 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/TaskLinkWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/TaskLinkWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,12 +23,15 @@ namespace ASC.Api.Projects.Wrappers { public class TaskLinkWrapper { + ///123 [DataMember] public int DependenceTaskId { get; set; } + ///44 [DataMember] public int ParentTaskId { get; set; } + ///1 [DataMember] public TaskLinkType LinkType { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/TaskWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/TaskWrapper.cs index bc6357371..356ba5b50 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/TaskWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/TaskWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,57 +26,90 @@ namespace ASC.Api.Projects.Wrappers { + ///ASC.Api.Projects.Wrappers.ObjectWrapperFullBase, ASC.Api.Projects [DataContract(Name = "task", Namespace = "")] public class TaskWrapper : ObjectWrapperFullBase { + ///false [DataMember] public bool CanEdit { get; set; } + ///false [DataMember] public bool CanCreateSubtask { get; set; } + ///false [DataMember] public bool CanCreateTimeSpend { get; set; } + ///false [DataMember] public bool CanDelete { get; set; } + ///false [DataMember] public bool CanReadFiles { get; set; } + ///2020-12-22T04:11:56.5768573Z + ///12 [DataMember(Order = 12, EmitDefaultValue = false)] public ApiDateTime Deadline { get; set; } + ///2020-12-22T04:11:56.5768573Z [DataMember(EmitDefaultValue = false)] public ApiDateTime StartDate { get; set; } + /// 123 + /// 13 [DataMember(Order = 13, EmitDefaultValue = false)] public int MilestoneId { get; set; } + /// 1 + /// 12 [DataMember(Order = 12)] public TaskPriority Priority { get; set; } + ///ASC.Api.Projects.Wrappers.SimpleProjectWrapper, ASC.Api.Projects + ///14 [DataMember(Order = 14)] public SimpleProjectWrapper ProjectOwner { get; set; } + /// 55 + /// 15 [DataMember(Order = 15, EmitDefaultValue = false)] public int Progress { get; set; } + ///ASC.Api.Projects.Wrappers.SubtaskWrapper, ASC.Api.Projects + ///20 + ///list [DataMember(Order = 20, EmitDefaultValue = false)] public List Subtasks { get; set; } + ///ASC.Api.Projects.Wrappers.TaskLinkWrapper, ASC.Api.Projects + ///21 + ///list [DataMember(Order = 21, EmitDefaultValue = false)] public IEnumerable Links { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///53 + ///list [DataMember(Order = 53)] public List Responsibles { get; set; } + ///00000000-0000-0000-0000-000000000000 + ///53 + ///list [DataMember(Order = 53, EmitDefaultValue = false)] public List ResponsibleIds { get; set; } + ///ASC.Api.Projects.Wrappers.SimpleMilestoneWrapper, ASC.Api.Projects + ///54 [DataMember(Order = 54, EmitDefaultValue = false)] public SimpleMilestoneWrapper Milestone { get; set; } + ///1 + ///55 [DataMember(Order = 55, EmitDefaultValue = false)] public int? CustomTaskStatus { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/TaskWrapperFull.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/TaskWrapperFull.cs index 3abd98663..f99fdf748 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/TaskWrapperFull.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/TaskWrapperFull.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; @@ -25,30 +25,41 @@ namespace ASC.Api.Projects.Wrappers { + ///ASC.Api.Projects.Wrappers.TaskWrapper, ASC.Api.Projects [DataContract(Name = "task", Namespace = "")] public class TaskWrapperFull : TaskWrapper { + ///ASC.Api.Documents.FileWrapper, ASC.Api.Documents + ///list [DataMember] public List Files { get; set; } + ///ASC.Web.Studio.UserControls.Common.Comments.CommentInfo, ASC.Web.Studio + ///list [DataMember] public List Comments { get; set; } + ///1 [DataMember] public int CommentsCount { get; set; } + ///false [DataMember] public bool IsSubscribed { get; set; } + ///false [DataMember] public bool CanEditFiles { get; set; } + ///false [DataMember] public bool CanCreateComment { get; set; } + ///ASC.Api.Projects.Wrappers.ProjectWrapperFull, ASC.Api.Projects [DataMember] public ProjectWrapperFull Project { get; set; } - + + ///3.5 [DataMember] public float TimeSpend { get; set; } diff --git a/module/ASC.Api/ASC.Api.Projects/Wrappers/TimeWrapper.cs b/module/ASC.Api/ASC.Api.Projects/Wrappers/TimeWrapper.cs index f83dff8a7..80e5c3b80 100644 --- a/module/ASC.Api/ASC.Api.Projects/Wrappers/TimeWrapper.cs +++ b/module/ASC.Api/ASC.Api.Projects/Wrappers/TimeWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,48 +26,76 @@ namespace ASC.Api.Projects.Wrappers [DataContract(Name = "time", Namespace = "")] public class TimeWrapper { + ///1 + ///10 [DataMember(Order = 1)] public int Id { get; set; } + ///5 + ///2020-12-22T04:11:56.5438537Z [DataMember(Order = 5)] public ApiDateTime Date { get; set; } + ///6 + ///3.5 [DataMember(Order = 6)] public float Hours { get; set; } + ///6 + ///Sample note [DataMember(Order = 6)] public string Note { get; set; } + ///7 + ///123 [DataMember(Order = 7)] public int RelatedProject { get; set; } + ///7 + ///ASC.Api.Projects.Wrappers.TaskWrapper, ASC.Api.Projects [DataMember(Order = 7)] public TaskWrapper Task { get; set; } + ///7 + ///13456 [DataMember(Order = 7)] public int RelatedTask { get; set; } + ///7 + ///Sample task [DataMember(Order = 7)] public string RelatedTaskTitle { get; set; } + ///51 + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee [DataMember(Order = 51)] public EmployeeWraper CreatedBy { get; set; } + ///51 + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee [DataMember(Order = 52)] public EmployeeWraper Person { get; set; } + ///true [DataMember] public bool CanEdit { get; set; } + ///2 [DataMember(Order = 53)] public PaymentStatus PaymentStatus { get; set; } + ///54 + ///2020-12-22T04:11:56.5438537Z [DataMember(Order = 54)] public ApiDateTime StatusChanged { get; set; } + ///true + ///55 [DataMember(Order = 55)] public bool CanEditPaymentStatus { get; set; } + ///56 + ///2020-12-22T04:11:56.5438537Z [DataMember(Order = 56)] public ApiDateTime CreateOn { get; set; } diff --git a/module/ASC.Api/ASC.Api.Sample/SampleApi.cs b/module/ASC.Api/ASC.Api.Sample/SampleApi.cs index 262746858..6c58bd01b 100644 --- a/module/ASC.Api/ASC.Api.Sample/SampleApi.cs +++ b/module/ASC.Api/ASC.Api.Sample/SampleApi.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; using ASC.Api.Attributes; @@ -24,7 +24,7 @@ namespace ASC.Api.Sample { /// - /// Sample CRUD Api + /// Sample CRUD API. /// public class SampleApi : IApiEntryPoint { @@ -37,10 +37,16 @@ public string Name } /// - /// Create item + /// Creates a new module for the current portal. /// - /// item value - /// SampleClass item + /// + /// Create a module + /// + /// Module name + /// Newly created module + /// api/2.0/sample/create + /// POST + /// false [Create("create", false)] public SampleClass Create(string value) { @@ -48,10 +54,16 @@ public SampleClass Create(string value) } /// - /// Read item by id + /// Returns a module with the ID specified in the request. /// - /// item id - /// SampleClass item + /// + /// Get a module + /// + /// Module ID + /// Module + /// api/2.0/sample/read/{id} + /// false + /// GET [Read(@"read/{id:[0-9]+}", false)] public SampleClass Read(int id) { @@ -59,9 +71,17 @@ public SampleClass Read(int id) } /// - /// Read all items + /// Returns all the portal modules. /// - /// SampleClass items list + /// + /// Get modules + /// + /// List of portal modules + /// list + /// api/2.0/sample/read + /// GET + /// false + /// list [Read("read", false)] public List Read() { @@ -69,10 +89,16 @@ public List Read() } /// - /// Update item + /// Updates the selected module with a name specified in the request. /// - /// item id - /// new item value + /// + /// Update a module + /// + /// Module ID + /// New module name + /// api/2.0/sample/update + /// false + /// PUT [Update("update", false)] public void Update(int id, string value) { @@ -80,9 +106,15 @@ public void Update(int id, string value) } /// - /// Update item by id + /// Deletes a module with the ID specified in the request. /// - /// item id + /// + /// Delete a module + /// + /// Module ID + /// api/2.0/sample/delete/{id} + /// false + /// DELETE [Delete("delete/{id:[0-9]+}", false)] public void Delete(int id) { diff --git a/module/ASC.Api/ASC.Api.Security/ASC.Api.Security.csproj b/module/ASC.Api/ASC.Api.Security/ASC.Api.Security.csproj index acc964b02..f13351bf3 100644 --- a/module/ASC.Api/ASC.Api.Security/ASC.Api.Security.csproj +++ b/module/ASC.Api/ASC.Api.Security/ASC.Api.Security.csproj @@ -21,6 +21,8 @@ prompt 4 1591 + ..\..\..\web\studio\ASC.Web.Studio\bin\ASC.Api.Security.xml + CS1591 none diff --git a/module/ASC.Api/ASC.Api.Security/AuditEventWrapper.cs b/module/ASC.Api/ASC.Api.Security/AuditEventWrapper.cs index f3ecf14b9..a04fbd24e 100644 --- a/module/ASC.Api/ASC.Api.Security/AuditEventWrapper.cs +++ b/module/ASC.Api/ASC.Api.Security/AuditEventWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Security/AuditReportCreator.cs b/module/ASC.Api/ASC.Api.Security/AuditReportCreator.cs index be87f54d4..3480774a1 100644 --- a/module/ASC.Api/ASC.Api.Security/AuditReportCreator.cs +++ b/module/ASC.Api/ASC.Api.Security/AuditReportCreator.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Globalization; diff --git a/module/ASC.Api/ASC.Api.Security/LoginEventWrapper.cs b/module/ASC.Api/ASC.Api.Security/LoginEventWrapper.cs index 562ef9b98..aea8e7bf0 100644 --- a/module/ASC.Api/ASC.Api.Security/LoginEventWrapper.cs +++ b/module/ASC.Api/ASC.Api.Security/LoginEventWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Security/ModelTypes.cs b/module/ASC.Api/ASC.Api.Security/ModelTypes.cs index 295498604..70bd6e52e 100644 --- a/module/ASC.Api/ASC.Api.Security/ModelTypes.cs +++ b/module/ASC.Api/ASC.Api.Security/ModelTypes.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System.Collections.Generic; namespace ASC.Api.Security { diff --git a/module/ASC.Api/ASC.Api.Security/SecurityApi.cs b/module/ASC.Api/ASC.Api.Security/SecurityApi.cs index 7662165eb..da2087ab7 100644 --- a/module/ASC.Api/ASC.Api.Security/SecurityApi.cs +++ b/module/ASC.Api/ASC.Api.Security/SecurityApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,6 +40,7 @@ using ASC.MessagingSystem; using ASC.Specific; using ASC.Web.Core; +using ASC.Web.Core.Utility; using ASC.Web.Studio; using ASC.Web.Studio.Core; using ASC.Web.Studio.PublicResources; @@ -49,6 +50,10 @@ namespace ASC.Api.Security { + /// + /// Security API. + /// + /// security public class SecurityApi : IApiEntryPoint { ILog Log = LogManager.GetLogger("ASC.Api"); @@ -70,6 +75,17 @@ public SecurityApi(ApiContext apiContext) Context = apiContext; } + /// + /// Returns all the latest user login activity including successful logins and failed attempts with an indication of reasons. + /// + /// + /// Get login history + /// + /// Login history + /// List of login events + /// list + /// api/2.0/security/audit/login/last + /// GET [Read("/audit/login/last")] public IEnumerable GetLastLoginEvents() { @@ -80,6 +96,17 @@ public IEnumerable GetLastLoginEvents() return LoginEventsRepository.GetByFilter(startIndex: 0, limit: 20).Select(x => new LoginEventWrapper(x)); } + /// + /// Returns a list of the latest changes (creation, modification, deletion, etc.) made by users to the entities (tasks, opportunities, files, etc.) on the portal. + /// + /// + /// Get audit trail data + /// + /// Audit trail data + /// List of audit trail data + /// list + /// api/2.0/security/audit/events/last + /// GET [Read("/audit/events/last")] public IEnumerable GetLastAuditEvents() { @@ -91,13 +118,20 @@ public IEnumerable GetLastAuditEvents() } /// - /// Returns a list of login events by filter + /// Returns a list of the login events by the parameters specified in the request. /// - /// User ID - /// Action - /// From date - /// To date - /// Events + /// + /// Get filtered login events + /// + /// Login history + /// User ID + /// Action + /// Start date + /// End date + /// List of filtered login events + /// list + /// api/2.0/security/audit/login/filter + /// GET [Read("/audit/login/filter")] public IEnumerable GetLoginEventsByFilter(Guid userId, MessageAction action, @@ -124,18 +158,25 @@ public IEnumerable GetLoginEventsByFilter(Guid userId, } } /// - /// Returns a list of audit events by filter + /// Returns a list of the audit events by the parameters specified in the request. /// - /// User id - /// Product - /// Module - /// Action type - /// Action - /// Entry - /// Target - /// From date - /// To date - /// Actions + /// + /// Get filtered audit trail data + /// + /// Audit trail data + /// User ID + /// Product + /// Module + /// Action type + /// Action + /// Entry + /// Target + /// Start date + /// End date + /// List of filtered audit trail data + /// list + /// api/2.0/security/audit/events/filter + /// GET [Read("/audit/events/filter")] public IEnumerable GetAuditEventsByFilter(Guid userId, ProductType productType, @@ -167,6 +208,17 @@ public IEnumerable GetAuditEventsByFilter(Guid userId, } } + /// + /// Returns all the available audit trail types. + /// + /// + /// Get audit trail types + /// + /// Audit trail data + /// Audit trail types + /// api/2.0/security/audit/types + /// false + /// GET [Read("/audit/types", false)] public ModelTypes GetTypes() { @@ -180,6 +232,19 @@ public ModelTypes GetTypes() }; } + /// + /// Returns the mappers for the audit trail types. + /// + /// + /// Get audit trail mappers + /// + /// Audit trail data + /// Product + /// Module + /// Audit trail mappers + /// api/2.0/security/audit/mappers + /// false + /// GET [Read("/audit/mappers", false)] public object GetMappers(ProductType? productType, ModuleType? moduleType) { @@ -203,6 +268,16 @@ public object GetMappers(ProductType? productType, ModuleType? moduleType) }); } + /// + /// Generates the login history report. + /// + /// + /// Generate the login history report + /// + /// Login history + /// URL to the xlsx report file + /// api/2.0/security/audit/login/report + /// POST [Create("/audit/login/report")] public string CreateLoginHistoryReport() { @@ -225,6 +300,16 @@ public string CreateLoginHistoryReport() return result; } + /// + /// Generates the audit trail report. + /// + /// + /// Generate the audit trail report + /// + /// Audit trail data + /// URL to the xlsx report file + /// api/2.0/security/audit/events/report + /// POST [Create("/audit/events/report")] public string CreateAuditTrailReport() { @@ -248,6 +333,16 @@ public string CreateAuditTrailReport() return result; } + /// + /// Returns the audit trail settings. + /// + /// + /// Get the audit trail settings + /// + /// Audit trail data + /// Audit settings + /// api/2.0/security/audit/settings/lifetime + /// GET [Read("/audit/settings/lifetime")] public TenantAuditSettings GetAuditSettings() { @@ -258,6 +353,17 @@ public TenantAuditSettings GetAuditSettings() return TenantAuditSettings.LoadForTenant(TenantProvider.CurrentTenantID); } + /// + /// Sets the audit trail settings for the current portal. + /// + /// + /// Set the audit trail settings + /// + /// Audit trail data + /// Audit trail settings + /// Audit trail settings + /// api/2.0/security/audit/settings/lifetime + /// POST [Create("/audit/settings/lifetime")] public TenantAuditSettings SetAuditSettings(TenantAuditSettings settings) { @@ -297,6 +403,16 @@ private static void DemandBaseAuditPermission() } } + /// + /// Returns all the active connections to the portal. + /// + /// + /// Get active connections + /// + /// Active connections + /// Active portal connections + /// api/2.0/security/activeconnections + /// GET [Read("/activeconnections")] public object GetAllActiveConnections() { @@ -322,7 +438,7 @@ public object GetAllActiveConnections() var clientInfo = MessageSettings.GetClientInfo(uaHeader); var platformAndDevice = MessageSettings.GetPlatformAndDevice(clientInfo); var browser = MessageSettings.GetBrowser(clientInfo); - var ip = MessageSettings.GetIP(request); + var ip = MessageSettings.GetFullIPAddress(request); var baseEvent = new CustomEvent { @@ -336,7 +452,7 @@ public object GetAllActiveConnections() listLoginEvents.Add(Convert(baseEvent)); } } - + var result = new { Items = listLoginEvents, @@ -345,6 +461,16 @@ public object GetAllActiveConnections() return result; } + /// + /// Logs out from all the active connections for the current user and changes their password. + /// + /// + /// Log out and change password + /// + /// Active connections + /// URL to the confirmation message for changing a password + /// api/2.0/security/activeconnections/logoutallchangepassword + /// PUT [Update("/activeconnections/logoutallchangepassword")] public string LogOutAllActiveConnectionsChangePassword() { @@ -371,6 +497,17 @@ public string LogOutAllActiveConnectionsChangePassword() } } + /// + /// Logs out from all the active connections for the user with the ID specified in the request. + /// + /// + /// Log out for the user by ID + /// + /// Active connections + /// User ID + /// api/2.0/security/activeconnections/logoutall/{userId} + /// PUT + /// [Update("/activeconnections/logoutall/{userId}")] public void LogOutAllActiveConnectionsForUser(Guid userId) { @@ -381,6 +518,16 @@ public void LogOutAllActiveConnectionsForUser(Guid userId) LogOutAllActiveConnections(userId); } + /// + /// Logs out from all the active connections except the current connection. + /// + /// + /// Log out from all connections + /// + /// Active connections + /// Current user name + /// api/2.0/security/activeconnections/logoutallexceptthis + /// PUT [Update("/activeconnections/logoutallexceptthis")] public string LogOutAllExceptThisConnection() { @@ -402,6 +549,17 @@ public string LogOutAllExceptThisConnection() } } + /// + /// Logs out from the connection with the ID specified in the request. + /// + /// + /// Log out from the connection + /// + /// Active connections + /// Login event ID + /// Boolean value: true if the operation is successful + /// api/2.0/security/activeconnections/logout/{loginEventId} + /// PUT [Update("/activeconnections/logout/{loginEventId}")] public bool LogOutActiveConnection(int loginEventId) { @@ -422,6 +580,203 @@ public bool LogOutActiveConnection(int loginEventId) } } + /// + /// Updates the login settings with the parameters specified in the request. + /// + /// + /// Update login settings + /// + /// Login history + /// Maximum number of the user attempts to log in + /// The time for which the user will be blocked after unsuccessful login attempts + /// The time to wait for a response from the server + /// Updated login settings + /// api/2.0/security/loginsettings + /// PUT + [Update("/loginsettings")] + public LoginSettings UpdateLoginSettings(int attemptsCount, int blockTime, int checkPeriod) + { + SecurityContext.DemandPermissions(SecutiryConstants.EditPortalSettings); + + if (attemptsCount < 1) + { + throw new ArgumentOutOfRangeException("attemptsCount"); + } + if (checkPeriod < 1) + { + throw new ArgumentOutOfRangeException("checkPeriod"); + } + if (blockTime < 0) + { + throw new ArgumentOutOfRangeException("blockTime"); + } + + + var settings = new LoginSettings { CheckPeriod = checkPeriod, AttemptCount = attemptsCount, BlockTime = blockTime }; + settings.Save(); + + return settings; + } + + /// + /// Returns the impersonation settings for the current portal. + /// + /// + /// Get impersonation settings + /// + /// Impersonation + /// Impersonation settings + /// api/2.0/security/impersonate/settings + /// GET + [Read("/impersonate/settings")] + public ImpersonationSettings GetImpersonateSettings() + { + CheckImpersonateSettingsPermissions(); + + var settings = ImpersonationSettings.LoadAndRefresh(); + return settings; + } + + /// + /// Uppdates the impersonation settings with the parameters specified in the request. + /// + /// + /// Update impersonation settings + /// + /// Impersonation + /// Specifies whether impersonation is enabled or not + /// Specifies for whom impersonation is enabled (DisableForAdmins, EnableForAllFullAdmins, or EnableWithLimits) + /// Specifies if impersonation is enabled only for the current user groups or not + /// List of admins who can be impersonated + /// List of users who cannot be impersonated + /// List of groups who cannot be impersonated + /// Updated impersonation settings + /// api/2.0/security/impersonate/settings + /// PUT + [Update("/impersonate/settings")] + public ImpersonationSettings UpdateImpersonateSettings(bool enable, ImpersonateEnableType enableType, bool onlyForOwnGroups, List allowedAdmins, List restrictionUsers, List restrictionGroups) + { + CheckImpersonateSettingsPermissions(); + + var settings = !enable ? + new ImpersonationSettings() : + new ImpersonationSettings + { + Enabled = enable, + EnableType = enableType, + OnlyForOwnGroups = onlyForOwnGroups, + AllowedAdmins = allowedAdmins, + RestrictionUsers = restrictionUsers, + RestrictionGroups = restrictionGroups + }; + + settings.Save(); + + return settings; + } + + /// + /// Checks if a user with the ID specified in the request can be impersonated or not. + /// + /// + /// Check user impersonation + /// + /// Impersonation + /// User ID + /// Boolean value: true - the user can be impersonated, false - the user cannot be impersonated + /// api/2.0/security/impersonate/{userId} + /// GET + [Read("/impersonate/{userId}")] + public bool CanImpersonateUser(Guid userId) + { + return ImpersonationSettings.CanImpersonateUser(userId); + } + + /// + /// Impersonates a user with the ID specified in the request. + /// + /// + /// Impersonate a user + /// + /// Impersonation + /// User ID + /// Cookies + /// api/2.0/security/impersonate/{userId} + /// POST + [Create("/impersonate/{userId}")] + public string ImpersonateUser(Guid userId) + { + if (!ImpersonationSettings.CanImpersonateUser(userId)) + { + throw new SecurityException("Impossible to impersonate this user"); + } + + var currentTenantId = TenantProvider.CurrentTenantID; + + var currentUserId = SecurityContext.CurrentAccount.ID; + var currentUser = CoreContext.UserManager.GetUsers(currentUserId); + var currentUserName = currentUser.DisplayUserName(false); + + var targetUser = CoreContext.UserManager.GetUsers(userId); + var targetUserName = targetUser.DisplayUserName(false); + + if (!ImpersonationSettings.IsImpersonator()) + { + var currentAuthCookies = CookiesManager.GetCookies(CookiesType.AuthKey); + CookiesManager.SetCookies(CookiesType.ComebackAuthKey, currentAuthCookies); + } + + var cookies = CookiesManager.AuthenticateMeAndSetCookies(currentTenantId, userId, MessageAction.LoginSuccess); + + var userData = new MessageUserData(currentTenantId, currentUser.ID); + + var httpHeaders = HttpContext.Current.Request.Headers.AllKeys.ToDictionary(key => key, key => HttpContext.Current.Request.Headers[key]); + + MessageService.Send(userData, httpHeaders, MessageAction.ImpersonateUserLogin, MessageTarget.Create(userId), currentUserName, targetUserName); + + return cookies; + } + + /// + /// Log out from the account of the impersonated user. + /// + /// + /// Log out impersonated user + /// + /// Impersonation + /// api/2.0/security/impersonate/logout + /// PUT + [Update("/impersonate/logout")] + public void ImpersonateLogout() + { + var targetUserId = SecurityContext.CurrentAccount.ID; + var targetUser = CoreContext.UserManager.GetUsers(targetUserId); + var targetUserName = targetUser.DisplayUserName(false); + + var currentAuthCookies = CookiesManager.GetCookies(CookiesType.AuthKey); + var comebackAuthCookies = CookiesManager.GetCookies(CookiesType.ComebackAuthKey); + + var loginEventId = CookieStorage.GetLoginEventIdFromCookie(currentAuthCookies); + DbLoginEventsManager.LogOutEvent(loginEventId); + + MessageService.Send(HttpContext.Current.Request, targetUserName, MessageAction.Logout); + + CookiesManager.ClearCookies(CookiesType.ComebackAuthKey); + + Auth.ProcessLogout(); + + if (SecurityContext.AuthenticateMe(comebackAuthCookies)) + { + CookiesManager.SetCookies(CookiesType.AuthKey, comebackAuthCookies); + + var currentUserId = SecurityContext.CurrentAccount.ID; + var currentUser = CoreContext.UserManager.GetUsers(currentUserId); + var currentUserName = currentUser.DisplayUserName(false); + + MessageService.Send(HttpContext.Current.Request, currentUserName, MessageAction.ImpersonateUserLogout, MessageTarget.Create(targetUserId), targetUserName); + } + } + public void LogOutAllActiveConnections(Guid? userId = null) { var currentUserId = SecurityContext.CurrentAccount.ID; @@ -442,6 +797,21 @@ public int GetLoginEventIdFromCookie() return loginEventId; } + private void CheckImpersonateSettingsPermissions() + { + if (!ImpersonationSettings.Available) + { + throw new SecurityException("Setting is not available"); + } + + var currentUser = CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID); + + if (!currentUser.IsOwner()) + { + throw new SecurityException("Setting available only for the owner"); + } + } + private CustomEvent Convert(BaseEvent baseEvent) { var location = GetGeolocation(baseEvent.IP); diff --git a/module/ASC.Api/ASC.Api.Settings/ASC.Api.Settings.csproj b/module/ASC.Api/ASC.Api.Settings/ASC.Api.Settings.csproj index 4bfdd373c..5e2ba2151 100644 --- a/module/ASC.Api/ASC.Api.Settings/ASC.Api.Settings.csproj +++ b/module/ASC.Api/ASC.Api.Settings/ASC.Api.Settings.csproj @@ -62,6 +62,7 @@ + @@ -156,6 +157,7 @@ + \ No newline at end of file diff --git a/module/ASC.Api/ASC.Api.Settings/BuildVersion.cs b/module/ASC.Api/ASC.Api.Settings/BuildVersion.cs index 196935c5b..1c5515053 100644 --- a/module/ASC.Api/ASC.Api.Settings/BuildVersion.cs +++ b/module/ASC.Api/ASC.Api.Settings/BuildVersion.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -58,7 +58,7 @@ public static BuildVersion GetCurrentBuildVersion() private static string GetCommunityVersion() { - return ConfigurationManagerExtension.AppSettings["version.number"] ?? "11.5.0"; + return ConfigurationManagerExtension.AppSettings["version.number"] ?? "12.5.0"; } private static string GetDocumentVersion() diff --git a/module/ASC.Api/ASC.Api.Settings/LdapSettingsApi.cs b/module/ASC.Api/ASC.Api.Settings/LdapSettingsApi.cs index 4076711be..1a02ae344 100644 --- a/module/ASC.Api/ASC.Api.Settings/LdapSettingsApi.cs +++ b/module/ASC.Api/ASC.Api.Settings/LdapSettingsApi.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Diagnostics; using System.Linq; @@ -51,7 +51,9 @@ public partial class SettingsApi /// Get the LDAP settings /// /// LDAP - /// LDAP settings + /// LDAP settings + /// api/2.0/settings/ldap + /// GET [Read("ldap")] public LdapSettings GetLdapSettings() { @@ -79,13 +81,15 @@ public LdapSettings GetLdapSettings() } /// - /// Returns the LDAP autosynchronous cron expression of the current portal if it exists. + /// Returns the LDAP autosynchronous cron expression for the current portal if it exists. /// /// /// Get the LDAP cron expression /// /// LDAP /// Cron expression or null + /// api/2.0/settings/ldap/cron + /// GET [Read("ldap/cron")] public string GetLdapCronSettings() { @@ -103,13 +107,16 @@ public string GetLdapCronSettings() } /// - /// Sets the LDAP autosynchronous cron expression of the current portal. + /// Sets the LDAP autosynchronous cron expression to the current portal. /// /// /// Set the LDAP cron expression /// /// LDAP - /// Cron expression + /// api/2.0/settings/ldap/cron + /// Cron expression + /// POST + /// [Create("ldap/cron")] public void SetLdapCronSettings(string cron) { @@ -146,13 +153,15 @@ public void SetLdapCronSettings(string cron) } /// - /// Starts synchronizing users and groups by LDAP. + /// Synchronizes the portal data with the new information from the LDAP server. /// /// - /// Synchronize by LDAP + /// Synchronize with LDAP server /// /// LDAP - /// Operation status + /// api/2.0/settings/ldap/sync + /// GET + /// Operation status [Read("ldap/sync")] public LdapOperationStatus SyncLdap() { @@ -200,7 +209,9 @@ public LdapOperationStatus SyncLdap() /// Test the LDAP synchronization /// /// LDAP - /// Operation status + /// api/2.0/settings/ldap/sync/test + /// GET + /// Operation status [Read("ldap/sync/test")] public LdapOperationStatus TestLdapSync() { @@ -248,9 +259,11 @@ public LdapOperationStatus TestLdapSync() /// Save the LDAP settings /// /// LDAP - /// LDAP settings in the serialized string format - /// Specifies if the errors of checking certificates are allowed (true) or not (false) - /// Operation status + /// LDAP settings in the serialized string format + /// Specifies if a certificate will be accepted (true) or not (false) + /// Operation status + /// api/2.0/settings/ldap + /// POST [Create("ldap")] public LdapOperationStatus SaveLdapSettings(string settings, bool acceptCertificate) { @@ -293,15 +306,17 @@ public LdapOperationStatus SaveLdapSettings(string settings, bool acceptCertific } /// - /// Starts the process of collecting preliminary changes on the portal during the saving process according to the LDAP settings. + /// Starts the process of saving LDAP settings and collecting preliminary changes on the portal according to them. /// /// /// Test the LDAP saving process /// /// LDAP - /// LDAP settings in the serialized string format - /// Specifies if the errors of checking certificates are allowed (true) or not (false) - /// Operation status + /// LDAP settings in the serialized string format + /// Specifies if a certificate will be accepted (true) or not (false) + /// api/2.0/settings/ldap/save/test + /// POST + /// Operation status [Create("ldap/save/test")] public LdapOperationStatus TestLdapSave(string settings, bool acceptCertificate) { @@ -351,7 +366,9 @@ public LdapOperationStatus TestLdapSave(string settings, bool acceptCertificate) /// Get the LDAP synchronization process status /// /// LDAP - /// Operation status + /// Operation status + /// api/2.0/settings/ldap/status + /// GET [Read("ldap/status")] public LdapOperationStatus GetLdapOperationStatus() { @@ -367,7 +384,9 @@ public LdapOperationStatus GetLdapOperationStatus() /// Get the LDAP default settings /// /// LDAP - /// LDAP default settings + /// LDAP default settings + /// api/2.0/settings/ldap/default + /// GET [Read("ldap/default")] public LdapSettings GetDefaultLdapSettings() { diff --git a/module/ASC.Api/ASC.Api.Settings/RadicaleSettingsAPI.cs b/module/ASC.Api/ASC.Api.Settings/RadicaleSettingsAPI.cs index f9db14091..3b190f633 100644 --- a/module/ASC.Api/ASC.Api.Settings/RadicaleSettingsAPI.cs +++ b/module/ASC.Api/ASC.Api.Settings/RadicaleSettingsAPI.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.Text; using System.Threading.Tasks; using System.Web; @@ -23,7 +40,9 @@ public partial class SettingsApi /// /// Get a link to the CardDav address book /// - /// CardDav address book + /// CardDav address book + /// api/2.0/settings/carddavurl + /// GET /// false [Read("carddavurl")] public async Task GetCardDavUrl() @@ -96,7 +115,9 @@ public async Task GetCardDavUrl() /// /// Delete a CardDav address book /// - /// CardDav address book + /// CardDav address book + /// api/2.0/settings/deletebook + /// DELETE /// false [Delete("deletebook")] public async Task DeleteCardDavAddressBook() diff --git a/module/ASC.Api/ASC.Api.Settings/SecurityWrapper.cs b/module/ASC.Api/ASC.Api.Settings/SecurityWrapper.cs index ef21eba87..e8ee931a2 100644 --- a/module/ASC.Api/ASC.Api.Settings/SecurityWrapper.cs +++ b/module/ASC.Api/ASC.Api.Settings/SecurityWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,18 +26,25 @@ namespace ASC.Api.Settings [DataContract(Name = "security", Namespace = "")] public class SecurityWrapper { + ///00000000-0000-0000-0000-000000000000 [DataMember] public string WebItemId { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///list [DataMember] public IEnumerable Users { get; set; } + ///ASC.Api.Employee.GroupWrapperSummary, ASC.Api.Employee + ///list [DataMember] public IEnumerable Groups { get; set; } + ///true [DataMember] public bool Enabled { get; set; } + ///false [DataMember] public bool IsSubItem { get; set; } diff --git a/module/ASC.Api/ASC.Api.Settings/SettingsApi.cs b/module/ASC.Api/ASC.Api.Settings/SettingsApi.cs index cd0121b77..13a939452 100644 --- a/module/ASC.Api/ASC.Api.Settings/SettingsApi.cs +++ b/module/ASC.Api/ASC.Api.Settings/SettingsApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,6 +30,7 @@ using ASC.Api.Attributes; using ASC.Api.Collections; using ASC.Api.Employee; +using ASC.Api.Impl; using ASC.Api.Interfaces; using ASC.Api.Utils; using ASC.Common.Logging; @@ -73,16 +74,24 @@ namespace ASC.Api.Settings { /// - /// Portal settings. + /// Portal settings API. /// + ///settings public partial class SettingsApi : IApiEntryPoint { private const int ONE_THREAD = 1; private ILog Log = LogManager.GetLogger("ASC"); + private static readonly DistributedTaskQueue userQuotaTasks = new DistributedTaskQueue("userQuotaOperations", ONE_THREAD); private static readonly DistributedTaskQueue ldapTasks = new DistributedTaskQueue("ldapOperations"); private static readonly DistributedTaskQueue quotaTasks = new DistributedTaskQueue("quotaOperations", ONE_THREAD); private static readonly DistributedTaskQueue smtpTasks = new DistributedTaskQueue("smtpOperations"); + private readonly ApiContext _context; + + public SettingsApi(ApiContext context) + { + _context = context; + } public string Name { get { return "settings"; } @@ -113,14 +122,16 @@ private static DistributedTaskQueue SMTPTasks get { return smtpTasks; } } - /// + /// /// Returns a list of all the available portal settings with the current values for each parameter. - /// - /// + /// + /// /// Get the portal settings - /// - ///Common settings - ///Settings + /// + /// Common settings + /// Settings + /// api/2.0/settings + /// GET [Read("")] public SettingsWrapper GetSettings() { @@ -135,27 +146,84 @@ public SettingsWrapper GetSettings() return settings; } - /// - /// Returns the space usage quota for the portal with the space usage of each module. - /// - /// + /// + /// Returns the space usage quota for the portal with the specified space usage for each module. + /// + /// /// Get the space usage - /// - ///Quota - ///Space usage and limits for upload + /// + /// Quota + /// Space usage and limits for upload + /// api/2.0/settings/quota + /// GET [Read("quota")] public QuotaWrapper GetQuotaUsed() { return QuotaWrapper.GetCurrent(); } + /// + /// Save user quota limit + /// + /// + /// Save user quota limit + /// + ///User quota + ///Operation result + [Create("userquotasettings")] + public TenantUserQuotaSettings SaveUserQuotaSettings(bool enableUserQuota, long defaultUserQuota) + { + SecurityContext.DemandPermissions(SecutiryConstants.EditPortalSettings); + + var tenanSpaceQuota = TenantExtra.GetTenantQuota(false).MaxTotalSize; + if (tenanSpaceQuota < defaultUserQuota) + { + throw new Exception(Resource.QuotaGreaterPortalError); + } + + var tenantUserQuotaSetting = TenantUserQuotaSettings.Load(); + + var newTenantUserQuotaSetting = new TenantUserQuotaSettings { EnableUserQuota = enableUserQuota, DefaultUserQuota = defaultUserQuota, LastRecalculateDate = tenantUserQuotaSetting.LastRecalculateDate }; + + newTenantUserQuotaSetting.Save(); + + return tenantUserQuotaSetting; + } + /// - /// Starts the process of recalculating quota. + /// Set tenant quota settings /// /// - /// Recalculates quota + /// Set tenant quota settings /// - ///Quota + ///Tenant quota + ///Operation result + [Update("tenantquotasettings")] + public TenantQuotaSettings SetTenantQuotaSettings(int tenantId, bool disableQuota) + { + SecurityContext.DemandPermissions(SecutiryConstants.EditPortalSettings); + + if (!CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsAdmin() || !CoreContext.Configuration.Standalone) + throw new NotSupportedException("Not available."); + + var tenantQuotaSetting = new TenantQuotaSettings { DisableQuota = disableQuota }; + tenantQuotaSetting.SaveForTenant(tenantId); + + return tenantQuotaSetting; + } + + + + /// + /// Starts the process of recalculating quota. + /// + /// + /// Recalculate quota + /// + /// Quota + /// api/2.0/settings/recalculatequota + /// GET + /// [Read("recalculatequota")] public void RecalculateQuota() { @@ -174,14 +242,16 @@ public void RecalculateQuota() quotaTasks.QueueTask(op.RunJob, op.GetDistributedTask()); } - /// + /// /// Checks the process of recalculating quota. - /// - /// - /// Check quota recalculating - /// - ///Quota - ///Boolean value: True - quota recalculating process is enabled, False - quota recalculating process is disabled + /// + /// + /// Check quota recalculation + /// + /// Quota + /// Boolean value: true - quota recalculation process is enabled, false - quota recalculation process is disabled + /// api/2.0/settings/checkrecalculatequota + /// GET [Read("checkrecalculatequota")] public bool CheckRecalculateQuota() { @@ -198,13 +268,121 @@ public bool CheckRecalculateQuota() return task != null; } + /// + /// Changes a quota limit for the users with the IDs specified in the request. + /// + /// + /// Change a user quota limit + /// + /// User quota + /// List of user IDs + /// User quota + /// List of users + [Update("userquota")] + public IEnumerable UpdateUserQuota(IEnumerable userIds, long quota) + { + SecurityContext.DemandPermissions(SecutiryConstants.EditPortalSettings); + + var tenanSpaceQuota = TenantExtra.GetTenantQuota(false).MaxTotalSize; + if (tenanSpaceQuota < quota) + { + throw new Exception(Resource.QuotaGreaterPortalError); + } + + var users = userIds + .Select(userId => CoreContext.UserManager.GetUsers(userId)) + .Where(userInfo => !CoreContext.UserManager.IsSystemUser(userInfo.ID)) + .ToList(); + + foreach (var user in users) + { + if (quota >= 0) + { + var usedSpace = Math.Max(0, + CoreContext.TenantManager.FindUserQuotaRows(CoreContext.TenantManager.GetCurrentTenant().TenantId, user.ID) + .Where(r => !string.IsNullOrEmpty(r.Tag)).Where(r => r.Tag != Guid.Empty.ToString()).Sum(r => r.Counter) + ); + + if (usedSpace > quota) + { + if (users.Count > 1) + { + throw new Exception(Resource.QuotaGroupError); + } + else + { + throw new Exception(Resource.QuotaLessUsedMemoryError); + } + } + } + + var userQuotaSettings = new UserQuotaSettings { UserQuota = quota }; + userQuotaSettings.SaveForUser(user.ID); + } + + return users.Select(user => new EmployeeWraperFull(user, _context)); + + } + + /// + /// Starts the process of recalculating users quota. + /// + /// + /// Recalculates quota + /// + ///Quota + [Read("recalculateuserquota")] + public void RecalculateUserQuota() + { + SecurityContext.DemandPermissions(SecutiryConstants.EditPortalSettings); + + var operations = userQuotaTasks.GetTasks() + .Where(t => t.GetProperty(UserQuotaSync.TenantIdKey) == TenantProvider.CurrentTenantID); + + if (operations.Any(o => o.Status <= DistributedTaskStatus.Running)) + { + throw new InvalidOperationException(Resource.QuotaSettingsTooManyOperations); + } + + var op = new UserQuotaSync(TenantProvider.CurrentTenantID); + + userQuotaTasks.QueueTask(op.RunJob, op.GetDistributedTask()); + } + + /// + /// Checks the process of recalculating users quota. + /// + /// + /// Check users quota recalculating + /// + ///Quota + ///Boolean value: True - quota recalculating process is running, False - quota recalculating process is stopped + [Read("checkrecalculateuserquota")] + public bool CheckRecalculateUserQuota() + { + SecurityContext.DemandPermissions(SecutiryConstants.EditPortalSettings); + + var task = userQuotaTasks.GetTasks().FirstOrDefault(t => t.GetProperty(UserQuotaSync.TenantIdKey) == TenantProvider.CurrentTenantID); + + if (task != null && task.Status != DistributedTaskStatus.Created && task.Status != DistributedTaskStatus.Running) + { + userQuotaTasks.RemoveTask(task.Id); + return false; + } + + return task != null; + } + /// /// Returns the current build version. /// /// Get the current build version /// Versions + /// api/2.0/settings/version/build + /// GET /// false - /// Current onlyoffice, editor, mailserver versions + /// false + /// Current ONLYOFFICE, editor, mailserver versions [Read("version/build", false, false)] //NOTE: this method doesn't require auth!!! //NOTE: this method doesn't check payment!!! public BuildVersion GetBuildVersions() { @@ -218,6 +396,8 @@ public BuildVersion GetBuildVersions() /// Get the portal versions /// /// Versions + /// api/2.0/settings/version + /// GET /// false /// List of availibe portal versions including the current version [Read("version")] @@ -227,13 +407,15 @@ public TenantVersionWrapper GetVersions() } /// - /// Sets the current portal version to the one with the ID specified in the request. + /// Sets a version with the ID specified in the request to the current tenant. /// /// /// Change the portal version /// /// Versions - /// Version ID + /// Version ID + /// api/2.0/settings/version + /// PUT /// false /// List of availibe portal versions including the current version [Update("version")] @@ -248,14 +430,17 @@ public TenantVersionWrapper SetVersion(int versionId) } /// - /// Returns the security settings for the product, module or add-ons specified in the request. + /// Returns the security settings for the modules specified in the request. /// /// /// Get the security settings /// /// Security - /// List of module IDs - /// Security settings + /// List of module IDs + /// Security settings + /// api/2.0/settings/security + /// GET + /// list [Read("security")] public IEnumerable GetWebItemSecurityInfo(IEnumerable ids) { @@ -284,8 +469,10 @@ public IEnumerable GetWebItemSecurityInfo(IEnumerable i /// Get the module availability /// /// Security - /// Module ID - /// Boolean value: True - module is enabled, False - module is disabled + /// Module ID + /// Boolean value: true - module is enabled, false - module is disabled + /// api/2.0/settings/security/{id} + /// GET [Read("security/{id}")] public bool GetWebItemSecurityInfo(Guid id) { @@ -302,6 +489,8 @@ public bool GetWebItemSecurityInfo(Guid id) /// /// Security /// List of enabled modules + /// api/2.0/settings/security/modules + /// GET /// false [Read("security/modules")] public object GetEnabledModules() @@ -326,25 +515,69 @@ public object GetEnabledModules() /// /// Security /// Password settings + /// api/2.0/settings/security/password + /// GET [Read("security/password")] - public object GetPasswordSettings() + public PasswordSettings GetPasswordSettings() + { + return PasswordSettings.Load(); + } + + /// + /// Sets the portal password settings. + /// + /// + /// Set the password settings + /// + /// Security + /// Maximum length + /// Minimum length + /// Specifies whether to include uppercase letters or not + /// Specifies whether to include digits or not + /// Specifies whether to include special symbols or not + /// Password settings + /// api/2.0/settings/security/password + /// PUT + [Update("security/password")] + public PasswordSettings SetPasswordSettings(int maxLength, int minLength, bool upperCase, bool digits, bool specSymbols) { - var UserPasswordSettings = PasswordSettings.Load(); + SecurityContext.DemandPermissions(SecutiryConstants.EditPortalSettings); + + if (maxLength < minLength) + { + throw new ArgumentException(Resource.ErrorArgumentException); + } + + var settings = new PasswordSettings() + { + MaxLength = maxLength, + MinLength = minLength, + UpperCase = upperCase, + Digits = digits, + SpecSymbols = specSymbols + }; - return UserPasswordSettings; + settings.Save(); + + MessageService.Send(HttpContext.Current.Request, MessageAction.PasswordStrengthSettingsUpdated); + + return settings; } /// - /// Sets the security settings to the product, module or add-ons. + /// Sets the security settings to the module with the ID specified in the request. /// /// - /// Set the security settings + /// Set the module security settings /// /// Security - /// Module ID - /// Specifies if the module is enabled or not - /// List of user/group IDs - /// Security settings + /// Module ID + /// Specifies if the selected module is enabled or not + /// List of user/group IDs + /// api/2.0/settings/security + /// PUT + /// list + /// Security settings [Update("security")] public IEnumerable SetWebItemSecurity(string id, bool enabled, IEnumerable subjects) { @@ -380,14 +613,17 @@ public IEnumerable SetWebItemSecurity(string id, bool enabled, } /// - /// Sets access to the products, modules or add-ons specified in the request. + /// Sets the security settings to the modules with the IDs specified in the request. /// /// - /// Set access to web items + /// Set the security settings to modules /// /// Security - /// Modules, products or add-ons with security information - /// Security settings + /// Modules with security information + /// api/2.0/settings/security/access + /// PUT + /// list + /// Security settings [Update("security/access")] public IEnumerable SetAccessToWebItems(IEnumerable> items) { @@ -443,8 +679,11 @@ public IEnumerable SetAccessToWebItems(IEnumerable /// Security - /// Product ID - /// List of product administrators + /// Product ID + /// List of product administrators + /// api/2.0/settings/security/administrator/{productid} + /// GET + /// list [Read("security/administrator/{productid}")] public IEnumerable GetProductAdministrators(Guid productid) { @@ -460,9 +699,11 @@ public IEnumerable GetProductAdministrators(Guid productid) /// Check the product administrator /// /// Security - /// Product ID - /// User ID - /// Object with user security information + /// Product ID + /// User ID + /// Object with the user security information + /// api/2.0/settings/security/administrator + /// GET [Read("security/administrator")] public object IsProductAdministrator(Guid productid, Guid userid) { @@ -477,10 +718,12 @@ public object IsProductAdministrator(Guid productid, Guid userid) /// Set the product administrator /// /// Security - /// Product ID - /// User ID - /// Specifies if the user will be added to the product as an administrator or deleted from it - /// Object with user security information + /// Product ID + /// User ID + /// Specifies if a user will be a product administrator or not + /// Object with the user security information + /// api/2.0/settings/security/administrator + /// PUT [Update("security/administrator")] public object SetProductAdministrator(Guid productid, Guid userid, bool administrator) { @@ -517,11 +760,14 @@ public object SetProductAdministrator(Guid productid, Guid userid, bool administ /// Get a portal logo /// /// Common settings + /// Specifies if the portal logo will be used for the dark theme or not /// Portal logo image URL + /// api/2.0/settings/logo + /// GET [Read("logo")] - public string GetLogo() + public string GetLogo(bool dark) { - return TenantInfoSettings.Load().GetAbsoluteCompanyLogoPath(); + return TenantInfoSettings.Load().GetAbsoluteCompanyLogoPath(dark); } @@ -532,10 +778,12 @@ public string GetLogo() /// Save the white label settings /// /// Rebranding - /// Logo text - /// Tenant IDs with their logos - /// Specifies if the default settings will be saved or not - ///false + /// Logo text + /// Tenant IDs with their logos + /// Specifies if the default settings will be saved or not + /// api/2.0/settings/whitelabel/save + /// POST + /// false [Create("whitelabel/save")] public void SaveWhiteLabelSettings(string logoText, IEnumerable> logo, bool isDefault) { @@ -591,9 +839,11 @@ private static void SaveWhiteLabelSettingsForTenant(TenantWhiteLabelSettings set /// Save the white label settings from files /// /// Rebranding - /// Files with white label settings - /// Specifies if the default settings will be saved or not - ///false + /// Files with the white label settings + /// Specifies if the default settings will be saved or not + /// api/2.0/settings/whitelabel/savefromfiles + /// POST + /// false [Create("whitelabel/savefromfiles")] public void SaveWhiteLabelSettingsFromFiles(IEnumerable attachments, bool isDefault) { @@ -654,7 +904,9 @@ public void SaveWhiteLabelSettingsFromFilesForTenant(TenantWhiteLabelSettings se /// /// Rebranding /// White label sizes - ///false + /// api/2.0/settings/whitelabel/sizes + /// GET + /// false [Read("whitelabel/sizes")] public object GetWhiteLabelSizes() { @@ -669,7 +921,10 @@ public object GetWhiteLabelSizes() new {type = (int)WhiteLabelLogoTypeEnum.Dark, name = WhiteLabelLogoTypeEnum.Dark.ToString(), height = TenantWhiteLabelSettings.logoDarkSize.Height, width = TenantWhiteLabelSettings.logoDarkSize.Width}, new {type = (int)WhiteLabelLogoTypeEnum.Favicon, name = WhiteLabelLogoTypeEnum.Favicon.ToString(), height = TenantWhiteLabelSettings.logoFaviconSize.Height, width = TenantWhiteLabelSettings.logoFaviconSize.Width}, new {type = (int)WhiteLabelLogoTypeEnum.DocsEditor, name = WhiteLabelLogoTypeEnum.DocsEditor.ToString(), height = TenantWhiteLabelSettings.logoDocsEditorSize.Height, width = TenantWhiteLabelSettings.logoDocsEditorSize.Width}, - new {type = (int)WhiteLabelLogoTypeEnum.DocsEditorEmbed, name = WhiteLabelLogoTypeEnum.DocsEditorEmbed.ToString(), height = TenantWhiteLabelSettings.logoDocsEditorEmbedSize.Height, width = TenantWhiteLabelSettings.logoDocsEditorEmbedSize.Width} + new {type = (int)WhiteLabelLogoTypeEnum.DocsEditorEmbed, name = WhiteLabelLogoTypeEnum.DocsEditorEmbed.ToString(), height = TenantWhiteLabelSettings.logoDocsEditorEmbedSize.Height, width = TenantWhiteLabelSettings.logoDocsEditorEmbedSize.Width}, + new {type = (int)WhiteLabelLogoTypeEnum.Light, name = WhiteLabelLogoTypeEnum.Light.ToString(), height = TenantWhiteLabelSettings.logoLightSize.Height, width = TenantWhiteLabelSettings.logoLightSize.Width}, + new {type = (int)WhiteLabelLogoTypeEnum.AboutDark, name = WhiteLabelLogoTypeEnum.AboutDark.ToString(), height = TenantWhiteLabelSettings.logoAboutDarkSize.Height, width = TenantWhiteLabelSettings.logoAboutDarkSize.Width}, + new {type = (int)WhiteLabelLogoTypeEnum.AboutLight, name = WhiteLabelLogoTypeEnum.AboutLight.ToString(), height = TenantWhiteLabelSettings.logoAboutLightSize.Height, width = TenantWhiteLabelSettings.logoAboutLightSize.Width} }; } @@ -682,10 +937,12 @@ public object GetWhiteLabelSizes() /// Get the white label logos /// /// Rebranding - /// Specifies if the logos will be for the retina screens or not - /// Specifies if the default settings will be saved or not + /// Specifies if the logos will be for the retina screens or not + /// Specifies if the default settings will be saved or not /// White label logos - ///false + /// api/2.0/settings/whitelabel/logos + /// GET + /// false [Read("whitelabel/logos")] public Dictionary GetWhiteLabelLogos(bool retina, bool isDefault) { @@ -702,6 +959,9 @@ public Dictionary GetWhiteLabelLogos(bool retina, bool isDefault) result.Add((int)WhiteLabelLogoTypeEnum.Favicon, CommonLinkUtility.GetFullAbsolutePath(TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.Favicon, !retina))); result.Add((int)WhiteLabelLogoTypeEnum.DocsEditor, CommonLinkUtility.GetFullAbsolutePath(TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.DocsEditor, !retina))); result.Add((int)WhiteLabelLogoTypeEnum.DocsEditorEmbed, CommonLinkUtility.GetFullAbsolutePath(TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.DocsEditorEmbed, !retina))); + result.Add((int)WhiteLabelLogoTypeEnum.Light, CommonLinkUtility.GetFullAbsolutePath(TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.Light, !retina))); + result.Add((int)WhiteLabelLogoTypeEnum.AboutDark, CommonLinkUtility.GetFullAbsolutePath(TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.AboutDark, !retina))); + result.Add((int)WhiteLabelLogoTypeEnum.AboutLight, CommonLinkUtility.GetFullAbsolutePath(TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.AboutLight, !retina))); } else { @@ -712,6 +972,9 @@ public Dictionary GetWhiteLabelLogos(bool retina, bool isDefault) result.Add((int)WhiteLabelLogoTypeEnum.Favicon, CommonLinkUtility.GetFullAbsolutePath(settings.GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.Favicon, !retina))); result.Add((int)WhiteLabelLogoTypeEnum.DocsEditor, CommonLinkUtility.GetFullAbsolutePath(settings.GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.DocsEditor, !retina))); result.Add((int)WhiteLabelLogoTypeEnum.DocsEditorEmbed, CommonLinkUtility.GetFullAbsolutePath(settings.GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.DocsEditorEmbed, !retina))); + result.Add((int)WhiteLabelLogoTypeEnum.Light, CommonLinkUtility.GetFullAbsolutePath(settings.GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.Light, !retina))); + result.Add((int)WhiteLabelLogoTypeEnum.AboutDark, CommonLinkUtility.GetFullAbsolutePath(settings.GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.AboutDark, !retina))); + result.Add((int)WhiteLabelLogoTypeEnum.AboutLight, CommonLinkUtility.GetFullAbsolutePath(settings.GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.AboutLight, !retina))); } return result; @@ -724,9 +987,11 @@ public Dictionary GetWhiteLabelLogos(bool retina, bool isDefault) /// Get the white label logo text /// /// Rebranding - /// Specifies if the default settings will be saved or not + /// Specifies if the default settings will be saved or not /// Logo text - ///false + /// api/2.0/settings/whitelabel/logotext + /// GET + /// false [Read("whitelabel/logotext")] public string GetWhiteLabelLogoText(bool isDefault) { @@ -747,8 +1012,10 @@ public string GetWhiteLabelLogoText(bool isDefault) /// Restore the white label options /// /// Rebranding - /// Specifies if the default settings will be saved or not - ///false + /// Specifies if the default settings will be saved or not + /// api/2.0/settings/whitelabel/restore + /// PUT + /// false [Update("whitelabel/restore")] public void RestoreWhiteLabelOptions(bool isDefault) { @@ -767,7 +1034,7 @@ public void RestoreWhiteLabelOptions(bool isDefault) } } - public void RestoreWhiteLabelOptionsForCurrentTenant() + private void RestoreWhiteLabelOptionsForCurrentTenant() { var settings = TenantWhiteLabelSettings.Load(); @@ -778,7 +1045,7 @@ public void RestoreWhiteLabelOptionsForCurrentTenant() tenantInfoSettings.Save(); } - public void RestoreWhiteLabelOptionsForDefaultTenant() + private void RestoreWhiteLabelOptionsForDefaultTenant() { var settings = TenantWhiteLabelSettings.LoadForDefaultTenant(); var storage = StorageFactory.GetStorage(string.Empty, "static_partnerdata"); @@ -786,17 +1053,86 @@ public void RestoreWhiteLabelOptionsForDefaultTenant() RestoreWhiteLabelOptionsForTenant(settings, storage, Tenant.DEFAULT_TENANT); } - public void RestoreWhiteLabelOptionsForTenant(TenantWhiteLabelSettings settings, IDataStore storage, int tenantId) + private void RestoreWhiteLabelOptionsForTenant(TenantWhiteLabelSettings settings, IDataStore storage, int tenantId) { settings.RestoreDefault(tenantId, storage); } + /// + /// Restores the white label logos. + /// + /// + /// Restore the white label logos + /// + /// Rebranding + /// Logo types + /// Specifies if the logo text will be saved or not + /// Specifies if the default settings will be saved or not + /// api/2.0/settings/whitelabel/restorelogos + /// PUT + /// false + [Update("whitelabel/restorelogos")] + public void RestoreWhiteLabelLogos(List logoTypes, bool restoreLogoText, bool isDefault) + { + SecurityContext.DemandPermissions(SecutiryConstants.EditPortalSettings); + + DemandWhiteLabelPermission(); + + if (isDefault) + { + DemandRebrandingPermission(); + RestoreWhiteLabelLogosForDefaultTenant(logoTypes, restoreLogoText); + } + else + { + RestoreWhiteLabelLogosForCurrentTenant(logoTypes, restoreLogoText); + } + } + + private void RestoreWhiteLabelLogosForCurrentTenant(List logoTypes, bool restoreLogoText) + { + var settings = TenantWhiteLabelSettings.Load(); + + if (restoreLogoText) + { + settings.LogoText = null; + } + + RestoreWhiteLabelLogosForTenant(settings, null, TenantProvider.CurrentTenantID, logoTypes); + } + + private void RestoreWhiteLabelLogosForDefaultTenant(List logoTypes, bool restoreLogoText) + { + var settings = TenantWhiteLabelSettings.LoadForDefaultTenant(); + var storage = StorageFactory.GetStorage(string.Empty, "static_partnerdata"); + + if (restoreLogoText) + { + settings.LogoText = null; + } + + RestoreWhiteLabelLogosForTenant(settings, storage, Tenant.DEFAULT_TENANT, logoTypes); + } + + private void RestoreWhiteLabelLogosForTenant(TenantWhiteLabelSettings settings, IDataStore storage, int tenantId, List logoTypes) + { + foreach(var type in logoTypes) + { + settings.RestoreDefaultLogo(type, tenantId, storage); + } + + settings.SaveForTenant(tenantId); + } + /// /// Returns the IP portal restrictions. /// /// Get the IP portal restrictions /// IP restrictions - /// IP restrictions + /// IP restrictions + /// api/2.0/settings/iprestrictions + /// GET + /// list [Read("/iprestrictions")] public IEnumerable GetIpRestrictions() { @@ -809,10 +1145,13 @@ public IEnumerable GetIpRestrictions() /// /// Save the IP restrictions /// IP restrictions - /// New IP restrictions + /// New IP restrictions /// New IP restrictions + /// api/2.0/settings/iprestrictions + /// PUT + /// list [Update("iprestrictions")] - public IEnumerable SaveIpRestrictions(IEnumerable ips) + public IEnumerable SaveIpRestrictions(IEnumerable ips) { SecurityContext.DemandPermissions(SecutiryConstants.EditPortalSettings); return IPRestrictionsService.Save(ips, CurrentTenant); @@ -821,10 +1160,12 @@ public IEnumerable SaveIpRestrictions(IEnumerable ips) /// /// Updates the IP restriction settings with a parameter specified in the request. /// - /// Update the IP restriction settings + /// Update the IP restrictions /// IP restrictions - /// Enables IP restrictions - /// Updated IP restriction settings + /// Specifies whether to enable IP restrictions or not + /// Updated IP restriction settings + /// api/2.0/settings/iprestrictions/settings + /// PUT [Update("iprestrictions/settings")] public IPRestrictionsSettings UpdateIpRestrictionsSettings(bool enable) { @@ -841,8 +1182,10 @@ public IPRestrictionsSettings UpdateIpRestrictionsSettings(bool enable) /// /// Update the tip settings /// Tips - /// Shows tips for the user - /// Updated tip settings + /// Specifies whether to show tips for the user or not + /// Updated tip settings + /// api/2.0/settings/tips + /// PUT [Update("tips")] public TipsSettings UpdateTipsSettings(bool show) { @@ -876,7 +1219,9 @@ public TipsSettings UpdateTipsSettings(bool show) /// /// Update the tip subscription /// Tips - /// Updated tip subscription + /// Boolean value: true if the user is subscribed to the tips + /// api/2.0/settings/tips/change/subscription + /// PUT [Update("tips/change/subscription")] public bool UpdateTipsSubscription() { @@ -889,6 +1234,8 @@ public bool UpdateTipsSubscription() /// Complete the Wizard settings /// Wizard /// Wizard settings + /// api/2.0/settings/wizard/complete + /// PUT /// false [Update("wizard/complete")] public WizardSettings CompleteWizard() @@ -911,10 +1258,15 @@ public WizardSettings CompleteWizard() /// /// Update the TFA settings /// TFA settings - /// TFA type: sms, app or none + /// TFA type (None, Sms, or App) + /// List of trusted IP addresses + /// List of users required for the TFA verification + /// List of groups required for the TFA verification /// True if an operation is successful + ///api/2.0/settings/tfaapp + ///PUT [Update("tfaapp")] - public bool TfaSettings(string type) + public bool TfaSettings(TfaSettingsType type, List trustedIps, List mandatoryUsers, List mandatoryGroups) { SecurityContext.DemandPermissions(SecutiryConstants.EditPortalSettings); @@ -923,14 +1275,17 @@ public bool TfaSettings(string type) MessageAction action; switch (type) { - case "sms": + case TfaSettingsType.Sms: if (!StudioSmsNotificationSettings.IsVisibleAndAvailableSettings) throw new Exception(Resource.SmsNotAvailable); if (!SmsProviderManager.Enabled()) throw new MethodAccessException(); - StudioSmsNotificationSettings.Enable = true; + var smsSettings = StudioSmsNotificationSettings.Load(); + SetProperties(smsSettings); + smsSettings.Save(); + action = MessageAction.TwoFactorAuthenticationEnabledBySms; if (TfaAppAuthSettings.Enable) @@ -942,13 +1297,16 @@ public bool TfaSettings(string type) break; - case "app": + case TfaSettingsType.App: if (!TfaAppAuthSettings.IsVisibleSettings) { throw new Exception(Resource.TfaAppNotAvailable); } - TfaAppAuthSettings.Enable = true; + var appSettings = TfaAppAuthSettings.Load(); + SetProperties(appSettings); + appSettings.Save(); + action = MessageAction.TwoFactorAuthenticationEnabledByTfaApp; if (StudioSmsNotificationSettings.IsVisibleAndAvailableSettings && StudioSmsNotificationSettings.Enable) @@ -983,6 +1341,14 @@ public bool TfaSettings(string type) MessageService.Send(Request, action); return result; + + void SetProperties(ITfaSettings settings) + { + settings.EnableSetting = true; + settings.TrustedIps = trustedIps; + settings.MandatoryUsers = mandatoryUsers; + settings.MandatoryGroups = mandatoryGroups; + } } /// @@ -991,7 +1357,10 @@ public bool TfaSettings(string type) /// Get the TFA codes /// TFA settings /// List of TFA application codes - ///false + /// api/2.0/settings/tfaappcodes + /// GET + /// list + /// false [Read("tfaappcodes")] public IEnumerable TfaAppGetCodes() { @@ -1000,7 +1369,7 @@ public IEnumerable TfaAppGetCodes() if (!TfaAppAuthSettings.IsVisibleSettings || !TfaAppUserSettings.EnableForUser(currentUser.ID)) throw new Exception(Resource.TfaAppNotAvailable); - if (currentUser.IsVisitor() || currentUser.IsOutsider()) + if (currentUser.IsOutsider()) throw new NotSupportedException("Not available."); return TfaAppUserSettings.LoadForCurrentUser().CodesSetting.Select(r => new { r.IsUsed, r.Code }).ToList(); @@ -1009,9 +1378,12 @@ public IEnumerable TfaAppGetCodes() /// /// Requests the new backup codes for the two-factor authentication application. /// - /// Request the new TFA codes + /// Request the TFA codes /// TFA settings /// New backup codes + /// api/2.0/settings/tfaappnewcodes + /// PUT + /// list [Update("tfaappnewcodes")] public IEnumerable TfaAppRequestNewCodes() { @@ -1020,7 +1392,7 @@ public IEnumerable TfaAppRequestNewCodes() if (!TfaAppAuthSettings.IsVisibleSettings || !TfaAppUserSettings.EnableForUser(currentUser.ID)) throw new Exception(Resource.TfaAppNotAvailable); - if (currentUser.IsVisitor() || currentUser.IsOutsider()) + if (currentUser.IsOutsider()) throw new NotSupportedException("Not available."); var codes = currentUser.GenerateBackupCodes().Select(r => new { r.IsUsed, r.Code }).ToList(); @@ -1033,8 +1405,10 @@ public IEnumerable TfaAppRequestNewCodes() /// /// Unlink the TFA application /// TFA settings - /// User ID + /// User ID /// Login URL + /// api/2.0/settings/tfaappnewapp + /// PUT [Update("tfaappnewapp")] public string TfaAppNewApp(Guid id) { @@ -1047,7 +1421,7 @@ public string TfaAppNewApp(Guid id) if (!TfaAppAuthSettings.IsVisibleSettings || !TfaAppUserSettings.EnableForUser(user.ID)) throw new Exception(Resource.TfaAppNotAvailable); - if (user.IsVisitor() || user.IsOutsider()) + if (user.IsOutsider()) throw new NotSupportedException("Not available."); TfaAppUserSettings.DisableForUser(user.ID); @@ -1063,11 +1437,55 @@ public string TfaAppNewApp(Guid id) } /// - /// Saves a documents firebase device token specified in the request. + /// Returns the current two-factor authentication settings. /// - /// Saves a firebase device token - /// firebase device token + /// Get TFA settings + /// TFA settings + /// TFA settings + /// api/2.0/settings/tfaapp + /// GET + [Read("tfaapp")] + public TfaSettingsWrapper GetTfaSettings() + { + SecurityContext.DemandPermissions(SecutiryConstants.EditPortalSettings); + + var studioSmsNotificationSettings = StudioSmsNotificationSettings.Load(); + + if (studioSmsNotificationSettings.EnableSetting) + { + return new TfaSettingsWrapper + { + TfaSettings = studioSmsNotificationSettings, + TfaSettingsType = TfaSettingsType.Sms + }; + } + + var tfaAppAuthSettings = TfaAppAuthSettings.Load(); + + if (tfaAppAuthSettings.EnableSetting) + { + return new TfaSettingsWrapper + { + TfaSettings = tfaAppAuthSettings, + TfaSettingsType = TfaSettingsType.App + }; + } + + return new TfaSettingsWrapper + { + TfaSettingsType = TfaSettingsType.None + }; + } + + /// + /// Saves the Firebase device token specified in the request for the Documents application. + /// + /// Saves the Documents Firebase device token + /// Firebase + /// Firebase device token /// FireBase user + /// api/2.0/settings/push/docregisterdevice + /// POST [Create("push/docregisterdevice")] public FireBaseUser DocRegisterPusnNotificationDevice(string firebaseDeviceToken) { @@ -1076,11 +1494,14 @@ public FireBaseUser DocRegisterPusnNotificationDevice(string firebaseDeviceToken } /// - /// Saves a projects firebase device token specified in the request. + /// Saves the Firebase device token specified in the request for the Projects application. /// - /// Saves a firebase device token - /// firebase device token - /// FireBase user + /// Saves the Projects Firebase device token + /// Firebase + /// Firebase device token + /// Firebase user + /// api/2.0/settings/push/projregisterdevice + /// POST [Create("push/projregisterdevice")] public FireBaseUser ProjRegisterPusnNotificationDevice(string firebaseDeviceToken) { @@ -1089,12 +1510,15 @@ public FireBaseUser ProjRegisterPusnNotificationDevice(string firebaseDeviceToke } /// - /// Subscribe to documents push notification. + /// Subscribes to the Documents push notification. /// - /// Subscribe to push notification - /// firebase device token - /// is subscribed - /// FireBase user + /// Subscribe to Documents push notification + /// Firebase + /// Firebase device token + /// Specifies whether the current user is subscribed to the Documents push notification or not + /// Firebase user + /// api/2.0/settings/push/docsubscribe + /// PUT /// false [Update("push/docsubscribe")] public FireBaseUser SubscribeDocumentsPushNotification(string firebaseDeviceToken, bool isSubscribed) @@ -1104,12 +1528,15 @@ public FireBaseUser SubscribeDocumentsPushNotification(string firebaseDeviceToke } /// - /// Subscribe to projects push notification. + /// Subscribes to the Projects push notification. /// - /// Subscribe to push notification - /// firebase device token - /// is subscribed - /// FireBase user + /// Subscribe to Projects push notification + /// Firebase + /// Firebase device token + /// Specifies whether the current user is subscribed to the Projects push notification or not + /// Firebase user + /// api/2.0/settings/push/projsubscribe + /// PUT /// false [Update("push/projsubscribe")] public FireBaseUser SubscribeProjectsPushNotification(string firebaseDeviceToken, bool isSubscribed) @@ -1119,11 +1546,13 @@ public FireBaseUser SubscribeProjectsPushNotification(string firebaseDeviceToken } /// - /// Returns a link that will connect Telegram Bot to your account. + /// Returns a link that will connect the Telegram Bot to your account. /// /// Get the Telegram link /// Telegram /// Telegram link + /// api/2.0/settings/telegramlink + /// GET /// false [Read("telegramlink")] public string TelegramLink() @@ -1141,11 +1570,13 @@ public string TelegramLink() } /// - /// Checks if the current user is connected to Telegram Bot or not. + /// Checks if the current user is connected to the Telegram Bot or not. /// /// Check the Telegram connection /// Telegram /// Integer value: 0 - not connected, 1 - connected, 2 - awaiting confirmation + /// api/2.0/settings/telegramisconnected + /// GET [Read("telegramisconnected")] public int TelegramIsConnected() { @@ -1153,10 +1584,13 @@ public int TelegramIsConnected() } /// - /// Unlinks Telegram Bot from your account. + /// Unlinks the Telegram Bot from your account. /// - /// Unlink Telegram Bot + /// Unlink Telegram /// Telegram + /// api/2.0/settings/telegramdisconnect + /// DELETE + /// [Delete("telegramdisconnect")] public void TelegramDisconnect() { @@ -1168,6 +1602,8 @@ public void TelegramDisconnect() /// /// Close the welcome pop-up notification /// Common settings + /// api/2.0/settings/welcome/close + /// PUT [Update("welcome/close")] public void CloseWelcomePopup() { @@ -1182,11 +1618,13 @@ public void CloseWelcomePopup() collaboratorPopupSettings.SaveForCurrentUser(); } - /// - /// Close the admin helper notification. + /// + /// Closes the admin helper notification. /// /// Close the admin helper notification /// Common settings + /// api/2.0/settings/closeadminhelper + /// PUT [Update("closeadminhelper")] public void CloseAdminHelper() { @@ -1200,12 +1638,14 @@ public void CloseAdminHelper() /// - /// Saves a portal color theme specified in the request. + /// Saves the portal color theme specified in the request. /// - /// Save a color theme + /// Save color theme /// Common settings - /// Portal theme - ///false + /// Portal theme + /// api/2.0/settings/colortheme + /// PUT + /// false [Update("colortheme")] public void SaveColorTheme(string theme) { @@ -1214,15 +1654,33 @@ public void SaveColorTheme(string theme) MessageService.Send(HttpContext.Current.Request, MessageAction.ColorThemeChanged); } + /// + /// Saves a portal mode theme specified in the request. + /// + /// Save a mode theme + /// Common settings + /// Portal mode theme (light or dark) + /// Specifies whether the interface theme will be detected automatically or not + /// api/2.0/settings/modetheme + /// PUT + /// false + [Update("modetheme")] + public void SaveModeTheme(ModeTheme theme, bool auto_mode) + { + ModeThemeSettings.SaveModeTheme(theme, auto_mode); + } + /// /// Sets the portal time zone and language specified in the request. /// /// Set time zone and language /// Common settings - /// Language - /// Time zone ID - /// Operation result - ///false + /// Language + /// Time zone ID + /// Message about the operation result + /// api/2.0/settings/timeandlanguage + /// PUT + /// false [Update("timeandlanguage")] public string TimaAndLanguage(string lng, string timeZoneID) { @@ -1271,8 +1729,10 @@ public string TimaAndLanguage(string lng, string timeZoneID) /// /// Set the default product page /// Common settings - /// Default product ID - /// Operation result + /// Default product ID + /// Message about the operation result + /// api/2.0/settings/defaultpage + /// PUT ///false [Update("defaultpage")] public string SaveDefaultPageSettings(string defaultProductID) @@ -1298,7 +1758,9 @@ private static string GetProductName(Guid productId) /// /// Refresh the license /// Common settings - /// Boolean value: True - an operation is successful, False - an operation is unsuccessful + /// Boolean value: true - an operation is successful, false - an operation is unsuccessful + /// api/2.0/settings/license/refresh + /// GET /// false [Read("license/refresh")] public bool RefreshLicense() @@ -1314,7 +1776,10 @@ public bool RefreshLicense() /// /// Get the custom navigation items /// Custom navigation - /// List of the custom navigation items + /// List of the custom navigation items + /// api/2.0/settings/customnavigation/getall + /// GET + /// list [Read("customnavigation/getall")] public List GetCustomNavigationItems() { @@ -1326,7 +1791,9 @@ public List GetCustomNavigationItems() /// /// Get a custom navigation item sample /// Custom navigation - /// Custom navigation item + /// Custom navigation item + /// api/2.0/settings/customnavigation/getsample + /// GET [Read("customnavigation/getsample")] public CustomNavigationItem GetCustomNavigationItemSample() { @@ -1338,8 +1805,10 @@ public CustomNavigationItem GetCustomNavigationItemSample() /// /// Get a custom navigation item by ID /// Custom navigation - /// Item ID - /// Custom navigation item + /// Item ID + /// Custom navigation item + /// api/2.0/settings/customnavigation/get/{id} + /// GET [Read("customnavigation/get/{id}")] public CustomNavigationItem GetCustomNavigationItem(Guid id) { @@ -1351,8 +1820,10 @@ public CustomNavigationItem GetCustomNavigationItem(Guid id) /// /// Add a custom navigation item /// Custom navigation - /// Item parameters - /// Custom navigation item + /// Item parameters + /// Custom navigation item + /// api/2.0/settings/customnavigation/create + /// POST [Create("customnavigation/create")] public CustomNavigationItem CreateCustomNavigationItem(CustomNavigationItem item) { @@ -1404,11 +1875,14 @@ public CustomNavigationItem CreateCustomNavigationItem(CustomNavigationItem item } /// - /// Deletes a custom navigation item by the ID specified in the request. + /// Deletes a custom navigation item with the ID specified in the request. /// /// Delete a custom navigation item /// Custom navigation - /// Item ID + /// Item ID + /// api/2.0/settings/customnavigation/delete/{id} + /// DELETE + /// [Delete("customnavigation/delete/{id}")] public void DeleteCustomNavigationItem(Guid id) { @@ -1434,8 +1908,10 @@ public void DeleteCustomNavigationItem(Guid id) /// /// Update the email activation settings /// Common settings - /// Shows the email activation panel for the user - /// Updated email activation settings + /// Specifies whether to show the email activation panel to the user or not + /// Updated email activation settings + /// api/2.0/settings/emailactivation + /// PUT [Update("emailactivation")] public EmailActivationSettings UpdateEmailActivationSettings(bool show) { @@ -1452,6 +1928,9 @@ public EmailActivationSettings UpdateEmailActivationSettings(bool show) /// Get the licensor data /// Common settings /// List of company white label settings + /// api/2.0/settings/companywhitelabel + /// GET + /// list ///false [Read("companywhitelabel")] public List GetLicensorData() @@ -1471,12 +1950,15 @@ public List GetLicensorData() } /// - /// Returns the space usage statistics of the web item with the ID specified in the request. + /// Returns the space usage statistics of the module with the ID specified in the request. /// /// Statistics /// Get the space usage statistics - /// Web item ID - /// Space usage statistics of the web item + /// Module ID + /// Module space usage statistics + /// api/2.0/settings/statistics/spaceusage/{id} + /// GET + /// list [Read("statistics/spaceusage/{id}")] public List GetSpaceUsageStatistics(Guid id) { @@ -1507,9 +1989,12 @@ public List GetSpaceUsageStatistics(Guid id) /// /// Statistics /// Get the visit statistics - /// Start period date - /// End period date - /// List of point charts + /// Start period date + /// End period date + /// List of point charts + /// api/2.0/settings/statistics/visit + /// GET + /// list [Read("statistics/visit")] public List GetVisitStatistics(ApiDateTime fromDate, ApiDateTime toDate) { @@ -1563,7 +2048,10 @@ public List GetVisitStatistics(ApiDateTime fromDate, ApiDateT /// /// Storage /// Get storages - /// List of storages + /// List of storages + /// api/2.0/settings/storage + /// GET + /// list [Read("storage")] public List GetAllStorages() { @@ -1582,6 +2070,8 @@ public List GetAllStorages() /// Storage /// Get the storage progress /// Storage progress + /// api/2.0/settings/storage/progress + /// GET [Read("storage/progress", checkPayment: false)] public double GetStorageProgress() { @@ -1600,15 +2090,20 @@ public double GetStorageProgress() /// /// Storage /// Update a storage - /// Storage name - /// New storage properties - /// Updated storage + /// Storage name + /// New storage properties + /// Updated storage + /// api/2.0/settings/storage + /// PUT [Update("storage")] public StorageSettings UpdateStorage(string module, IEnumerable> props) { try { + LogManager.GetLogger("ASC").Debug("UpdateStorage"); + SecurityContext.DemandPermissions(SecutiryConstants.EditPortalSettings); + if (!CoreContext.Configuration.Standalone) return null; Log.Debug("UpdateStorage"); SecurityContext.DemandPermissions(SecutiryConstants.EditPortalSettings); if (!CoreContext.Configuration.Standalone) return null; @@ -1640,6 +2135,9 @@ public StorageSettings UpdateStorage(string module, IEnumerable /// Storage /// Reset the storage settings + /// api/2.0/settings/storage + /// DELETE + /// [Delete("storage")] public void ResetStorageToDefault() { @@ -1671,7 +2169,10 @@ public void ResetStorageToDefault() /// /// Storage /// Get the CDN storages - /// List of the CDN storages + /// List of the CDN storages + /// api/2.0/settings/storage/cdn + /// GET + /// list [Read("storage/cdn")] public List GetAllCdnStorages() { @@ -1690,9 +2191,11 @@ public List GetAllCdnStorages() /// /// Storage /// Update the CDN storage - /// CDN storage name - /// New CDN storage properties - /// Updated CDN storage + /// Updated CDN storage + /// CDN storage name + /// New CDN storage properties + /// api/2.0/settings/storage/cdn + /// PUT [Update("storage/cdn")] public CdnStorageSettings UpdateCdn(string module, IEnumerable> props) { @@ -1734,6 +2237,9 @@ public CdnStorageSettings UpdateCdn(string module, IEnumerable /// Storage /// Reset the CDN storage settings + /// api/2.0/settings/storage/cdn + /// DELETE + /// [Delete("storage/cdn")] public void ResetCdnToDefault() { @@ -1750,7 +2256,10 @@ public void ResetCdnToDefault() /// /// Storage /// Get the backup storages - /// List of the backup storages + /// List of the backup storages + /// api/2.0/settings/storage/backup + /// GET + /// list [Read("storage/backup")] public List GetAllBackupStorages() { @@ -1789,12 +2298,28 @@ private void StartMigrate(StorageSettings settings) CoreContext.TenantManager.SaveTenant(tenant); } + /// + /// Returns a list of all Amazon regions. + /// + /// Storage + /// Get Amazon regions + /// List of the Amazon regions + /// api/2.0/settings/storage/s3/regions + /// GET + [Read("storage/s3/regions")] + public object GetAmazonS3Regions() + { + return Amazon.RegionEndpoint.EnumerableAllRegions; + } + /// /// Returns the socket settings. /// /// Common settings /// Get the socket settings + /// api/2.0/settings/socket + /// GET /// Socket settings [Read("socket")] public object GetSocketSettings() @@ -1812,11 +2337,13 @@ public object GetSocketSettings() } /// - /// Returns the tenant control panel settings. + /// Returns the tenant Control Panel settings. /// /// Common settings - /// Get the tenant control panel settings - /// Tenant control panel settings + /// Get the tenant Control Panel settings + /// Tenant Control Panel settings + /// api/2.0/settings/controlpanel + /// GET ///false [Read("controlpanel")] public TenantControlPanelSettings GetTenantControlPanelSettings() @@ -1829,7 +2356,9 @@ public TenantControlPanelSettings GetTenantControlPanelSettings() /// /// Rebranding /// Save the white label settings - /// White label settings + /// White label settings + /// api/2.0/settings/rebranding/company + /// POST ///false [Create("rebranding/company")] public void SaveCompanyWhiteLabelSettings(CompanyWhiteLabelSettings settings) @@ -1849,6 +2378,8 @@ public void SaveCompanyWhiteLabelSettings(CompanyWhiteLabelSettings settings) /// Rebranding /// Get the white label settings /// Company white label settings + /// api/2.0/settings/rebranding/company + /// GET ///false [Read("rebranding/company")] public CompanyWhiteLabelSettings GetCompanyWhiteLabelSettings() @@ -1864,6 +2395,8 @@ public CompanyWhiteLabelSettings GetCompanyWhiteLabelSettings() /// Rebranding /// Delete the white label settings /// Default company white label settings + /// api/2.0/settings/rebranding/company + /// DELETE ///false [Delete("rebranding/company")] public CompanyWhiteLabelSettings DeleteCompanyWhiteLabelSettings() @@ -1882,8 +2415,10 @@ public CompanyWhiteLabelSettings DeleteCompanyWhiteLabelSettings() /// /// Rebranding /// Save the additional white label settings - /// Additional white label settings - ///false + /// Additional white label settings + /// api/2.0/settings/rebranding/additional + /// POST + /// false [Create("rebranding/additional")] public void SaveAdditionalWhiteLabelSettings(AdditionalWhiteLabelSettings settings) { @@ -1900,6 +2435,8 @@ public void SaveAdditionalWhiteLabelSettings(AdditionalWhiteLabelSettings settin /// Rebranding /// Get the additional white label settings /// Additional white label settings + /// api/2.0/settings/rebranding/additional + /// GET ///false [Read("rebranding/additional")] public AdditionalWhiteLabelSettings GetAdditionalWhiteLabelSettings() @@ -1914,7 +2451,9 @@ public AdditionalWhiteLabelSettings GetAdditionalWhiteLabelSettings() /// /// Rebranding /// Delete the additional white label settings - /// Default white label settings + /// Default additional white label settings + /// api/2.0/settings/rebranding/additional + /// DELETE ///false [Delete("rebranding/additional")] public AdditionalWhiteLabelSettings DeleteAdditionalWhiteLabelSettings() @@ -1933,7 +2472,9 @@ public AdditionalWhiteLabelSettings DeleteAdditionalWhiteLabelSettings() /// /// Rebranding /// Save the mail white label settings - /// Mail white label settings + /// Mail white label settings + /// api/2.0/settings/rebranding/mail + /// POST ///false [Create("rebranding/mail")] public void SaveMailWhiteLabelSettings(MailWhiteLabelSettings settings) @@ -1950,7 +2491,9 @@ public void SaveMailWhiteLabelSettings(MailWhiteLabelSettings settings) /// /// Rebranding /// Update the mail white label settings - /// Specified if the footer will be enabled or not + /// Specifies if a footer will be enabled or not + /// api/2.0/settings/rebranding/mail + /// PUT ///false [Update("rebranding/mail")] public void UpdateMailWhiteLabelSettings(bool footerEnabled) @@ -1970,6 +2513,8 @@ public void UpdateMailWhiteLabelSettings(bool footerEnabled) /// Rebranding /// Get the mail white label settings /// Mail white label settings + /// api/2.0/settings/rebranding/mail + /// GET ///false [Read("rebranding/mail")] public MailWhiteLabelSettings GetMailWhiteLabelSettings() @@ -1985,6 +2530,8 @@ public MailWhiteLabelSettings GetMailWhiteLabelSettings() /// Rebranding /// Delete the mail white label settings /// Default mail white label settings + /// api/2.0/settings/rebranding/mail + /// DELETE ///false [Delete("rebranding/mail")] public MailWhiteLabelSettings DeleteMailWhiteLabelSettings() @@ -2024,6 +2571,8 @@ private static void DemandRebrandingPermission() /// Get the storage encryption settings /// Encryption /// Storage encryption settings + /// api/2.0/settings/encryption/settings + /// GET /// false [Read("encryption/settings")] public EncryptionSettings GetStorageEncryptionSettings() @@ -2068,6 +2617,8 @@ public EncryptionSettings GetStorageEncryptionSettings() /// Get the storage encryption progress /// Encryption /// Storage encryption progress + /// api/2.0/settings/encryption/progress + /// GET /// false [Read("encryption/progress", checkPayment: false)] public double GetStorageEncryptionProgress() @@ -2100,7 +2651,9 @@ public double GetStorageEncryptionProgress() /// /// Start the storage encryption process /// Encryption - /// Specifies if the users will be notified about the encryption process or not + /// Specifies if the users will be notified about the encryption process or not + /// api/2.0/settings/encryption/start + /// POST /// false [Create("encryption/start")] public void StartStorageEncryption(bool notifyUsers) diff --git a/module/ASC.Api/ASC.Api.Settings/SettingsWrapper.cs b/module/ASC.Api/ASC.Api.Settings/SettingsWrapper.cs index fefa25dce..579d3ee6d 100644 --- a/module/ASC.Api/ASC.Api.Settings/SettingsWrapper.cs +++ b/module/ASC.Api/ASC.Api.Settings/SettingsWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,22 +26,28 @@ namespace ASC.Api.Settings [DataContract(Name = "settings", Namespace = "")] public class SettingsWrapper { + ///UTC [DataMember] public string Timezone { get; set; } + ///mydomain.com + ///list [DataMember] public List TrustedDomains { get; set; } + ///0 [DataMember] public TenantTrustedDomainsType TrustedDomainsType { get; set; } + ///en-US [DataMember] public string Culture { get; set; } + ///-08:30:00 [DataMember] public TimeSpan UtcOffset { get; set; } - + ///-8.5 [DataMember] public double UtcHoursOffset { get; set; } diff --git a/module/ASC.Api/ASC.Api.Settings/Smtp/SmtpOperation.cs b/module/ASC.Api/ASC.Api.Settings/Smtp/SmtpOperation.cs index 055097c13..48865f3d3 100644 --- a/module/ASC.Api/ASC.Api.Settings/Smtp/SmtpOperation.cs +++ b/module/ASC.Api/ASC.Api.Settings/Smtp/SmtpOperation.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -143,8 +143,16 @@ public void RunJob(DistributedTask _, CancellationToken cancellationToken) { SetProgress(60, "Authenticate"); - client.Authenticate(SmtpSettings.CredentialsUserName, - SmtpSettings.CredentialsUserPassword, cancellationToken); + if (SmtpSettings.UseNtlm) + { + var saslMechanism = new SaslMechanismNtlm(SmtpSettings.CredentialsUserName, SmtpSettings.CredentialsUserPassword); + client.Authenticate(saslMechanism, cancellationToken); + } + else + { + client.Authenticate(SmtpSettings.CredentialsUserName, + SmtpSettings.CredentialsUserPassword, cancellationToken); + } } SetProgress(80, "Send test message"); diff --git a/module/ASC.Api/ASC.Api.Settings/Smtp/SmtpOperationStatus.cs b/module/ASC.Api/ASC.Api.Settings/Smtp/SmtpOperationStatus.cs index 853bc79f8..2fb6dd766 100644 --- a/module/ASC.Api/ASC.Api.Settings/Smtp/SmtpOperationStatus.cs +++ b/module/ASC.Api/ASC.Api.Settings/Smtp/SmtpOperationStatus.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Runtime.Serialization; namespace ASC.Api.Settings.Smtp @@ -22,21 +22,27 @@ namespace ASC.Api.Settings.Smtp [DataContract] public class SmtpOperationStatus { + ///true [DataMember] public bool Completed { get; set; } + ///{some-random-guid} [DataMember] public string Id { get; set; } + /// [DataMember] public string Status { get; set; } + /// [DataMember] public string Error { get; set; } + ///0 [DataMember] public int Percents { get; set; } + /// [DataMember] public string Source { get; set; } diff --git a/module/ASC.Api/ASC.Api.Settings/Smtp/SmtpSettingsWrapper.cs b/module/ASC.Api/ASC.Api.Settings/Smtp/SmtpSettingsWrapper.cs index 8e5ff6c5c..14790c447 100644 --- a/module/ASC.Api/ASC.Api.Settings/Smtp/SmtpSettingsWrapper.cs +++ b/module/ASC.Api/ASC.Api.Settings/Smtp/SmtpSettingsWrapper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Runtime.Serialization; namespace ASC.Api.Settings.Smtp @@ -22,30 +22,41 @@ namespace ASC.Api.Settings.Smtp [DataContract(Name = "quota", Namespace = "")] public class SmtpSettingsWrapper { + ///mail.example.com [DataMember] public string Host { get; set; } + ///25 [DataMember] public int? Port { get; set; } + ///notify@example.com [DataMember] public string SenderAddress { get; set; } + ///Postman [DataMember] public string SenderDisplayName { get; set; } + ///notify@example.com [DataMember] public string CredentialsUserName { get; set; } + ///{password} [DataMember] public string CredentialsUserPassword { get; set; } + ///false [DataMember] public bool EnableSSL { get; set; } + ///true [DataMember] public bool EnableAuth { get; set; } + [DataMember] + public bool UseNtlm { get; set; } + public static SmtpSettingsWrapper GetSample() { return new SmtpSettingsWrapper @@ -56,6 +67,7 @@ public static SmtpSettingsWrapper GetSample() CredentialsUserPassword = "{password}", EnableAuth = true, EnableSSL = false, + UseNtlm = false, SenderAddress = "notify@example.com", SenderDisplayName = "Postman" }; diff --git a/module/ASC.Api/ASC.Api.Settings/SmtpSettingsApi.cs b/module/ASC.Api/ASC.Api.Settings/SmtpSettingsApi.cs index 7510078b7..e43273c7b 100644 --- a/module/ASC.Api/ASC.Api.Settings/SmtpSettingsApi.cs +++ b/module/ASC.Api/ASC.Api.Settings/SmtpSettingsApi.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Diagnostics; using System.Linq; @@ -40,7 +40,9 @@ public partial class SettingsApi /// Get the SMTP settings /// /// SMTP - /// SMTP settings + /// SMTP settings + /// api/2.0/settings/smtp + /// GET [Read("smtp")] public SmtpSettingsWrapper GetSmtpSettings() { @@ -58,8 +60,10 @@ public SmtpSettingsWrapper GetSmtpSettings() /// Save the SMTP settings /// /// SMTP - /// SMTP settings - /// SMTP settings + /// SMTP settings + /// SMTP settings + /// api/2.0/settings/smtp + /// POST [Create("smtp")] public SmtpSettingsWrapper SaveSmtpSettings(SmtpSettingsWrapper smtpSettings) { @@ -86,7 +90,9 @@ public SmtpSettingsWrapper SaveSmtpSettings(SmtpSettingsWrapper smtpSettings) /// Reset the SMTP settings /// /// SMTP - /// Default SMTP settings + /// Default SMTP settings + /// api/2.0/settings/smtp + /// DELETE [Delete("smtp")] public SmtpSettingsWrapper ResetSmtpSettings() { @@ -109,7 +115,9 @@ public SmtpSettingsWrapper ResetSmtpSettings() /// Test the SMTP settings /// /// SMTP - /// SMTP operation status + /// SMTP operation status + /// api/2.0/settings/smtp/test + /// GET [Read("smtp/test")] public SmtpOperationStatus TestSmtpSettings() { @@ -131,7 +139,9 @@ public SmtpOperationStatus TestSmtpSettings() /// Get the SMTP test process status /// /// SMTP - /// SMTP operation status + /// SMTP operation status + /// api/2.0/settings/smtp/test/status + /// GET [Read("smtp/test/status")] public SmtpOperationStatus GetSmtpOperationStatus() { @@ -197,6 +207,7 @@ public static SmtpSettings ToSmtpSettingsConfig(SmtpSettingsWrapper settingsWrap if (settingsWrapper.EnableAuth) { settingsConfig.SetCredentials(settingsWrapper.CredentialsUserName, settingsWrapper.CredentialsUserPassword); + settingsConfig.UseNtlm = settingsWrapper.UseNtlm; } return settingsConfig; @@ -213,7 +224,8 @@ private static SmtpSettingsWrapper ToSmtpSettings(SmtpSettings settingsConfig, b CredentialsUserName = settingsConfig.CredentialsUserName, CredentialsUserPassword = hidePassword ? "" : settingsConfig.CredentialsUserPassword, EnableSSL = settingsConfig.EnableSSL, - EnableAuth = settingsConfig.EnableAuth + EnableAuth = settingsConfig.EnableAuth, + UseNtlm = settingsConfig.UseNtlm }; } diff --git a/module/ASC.Api/ASC.Api.Settings/SsoSettingsV2Api.cs b/module/ASC.Api/ASC.Api.Settings/SsoSettingsV2Api.cs index afe20569f..1ef4c9f0a 100644 --- a/module/ASC.Api/ASC.Api.Settings/SsoSettingsV2Api.cs +++ b/module/ASC.Api/ASC.Api.Settings/SsoSettingsV2Api.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Linq; using System.Web; @@ -42,7 +42,9 @@ public partial class SettingsApi /// Get the SSO settings /// /// SSO - /// SSO settings + /// SSO settings + /// api/2.0/settings/ssov2 + /// GET [Read("ssov2")] public SsoSettingsV2 GetSsoSettingsV2() { @@ -63,7 +65,9 @@ public SsoSettingsV2 GetSsoSettingsV2() /// Get the default SSO settings /// /// SSO - /// Default SSO settings + /// Default SSO settings + /// api/2.0/settings/ssov2/default + /// GET [Read("ssov2/default")] public SsoSettingsV2 GetDefaultSsoSettingsV2() { @@ -73,13 +77,15 @@ public SsoSettingsV2 GetDefaultSsoSettingsV2() } /// - /// Returns the constants of the SSO settings. + /// Returns the SSO settings constants. /// /// - /// Get the constants of the SSO settings + /// Get the SSO settings constants /// /// SSO - /// Constants of the SSO settings + /// The SSO settings constants + /// api/2.0/settings/ssov2/constants + /// GET [Read("ssov2/constants")] public object GetSsoSettingsV2Constants() { @@ -101,8 +107,10 @@ public object GetSsoSettingsV2Constants() /// Save the SSO settings /// /// SSO - /// Serialized SSO settings + /// Serialized SSO settings /// SSO settings + /// api/2.0/settings/ssov2 + /// POST [Create("ssov2")] public SsoSettingsV2 SaveSsoSettingsV2(string serializeSettings) { @@ -161,7 +169,9 @@ public SsoSettingsV2 SaveSsoSettingsV2(string serializeSettings) /// Reset the SSO settings /// /// SSO - /// Default SSO settings + /// Default SSO settings + /// api/2.0/settings/ssov2 + /// DELETE [Delete("ssov2")] public SsoSettingsV2 ResetSsoSettingsV2() { diff --git a/module/ASC.Api/ASC.Api.Settings/StatisticsWrapper.cs b/module/ASC.Api/ASC.Api.Settings/StatisticsWrapper.cs index 5bb624ded..7191ee413 100644 --- a/module/ASC.Api/ASC.Api.Settings/StatisticsWrapper.cs +++ b/module/ASC.Api/ASC.Api.Settings/StatisticsWrapper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Runtime.Serialization; @@ -23,18 +23,23 @@ namespace ASC.Api.Settings [DataContract(Name = "statistics", Namespace = "")] public class UsageSpaceStatItemWrapper { + ///Item name [DataMember] public string Name { get; set; } + ///Item icon path [DataMember] public string Icon { get; set; } + ///false [DataMember] public bool Disabled { get; set; } + ///0 Byte [DataMember] public string Size { get; set; } + ///Item url [DataMember] public string Url { get; set; } @@ -54,15 +59,19 @@ public static UsageSpaceStatItemWrapper GetSample() [DataContract(Name = "statistics", Namespace = "")] public class ChartPointWrapper { + ///12/22/2020 [DataMember] public string DisplayDate { get; set; } + ///2020-12-22T04:11:57.0469085+00:00 [DataMember] public DateTime Date { get; set; } + ///0 [DataMember] public int Hosts { get; set; } + ///0 [DataMember] public int Hits { get; set; } diff --git a/module/ASC.Api/ASC.Api.Settings/StorageWrapper.cs b/module/ASC.Api/ASC.Api.Settings/StorageWrapper.cs index cf9144a36..95836fedf 100644 --- a/module/ASC.Api/ASC.Api.Settings/StorageWrapper.cs +++ b/module/ASC.Api/ASC.Api.Settings/StorageWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,14 +27,20 @@ namespace ASC.Api.Settings { public class StorageWrapper { + ///Id public string Id { get; set; } + ///Title public string Title { get; set; } + ///ASC.Web.Studio.UserControls.Management.AuthKey, ASC.Web.Studio + ///list public List Properties { get; set; } + ///true public bool Current { get; set; } + ///true public bool IsSet { get; set; } public StorageWrapper(DataStoreConsumer consumer, StorageSettings current) @@ -65,6 +71,7 @@ public StorageWrapper(DataStoreConsumer consumer, CdnStorageSettings current) Value = r.Value, Title = consumer.GetResourceString(consumer.Name + r.Key) ?? r.Key, Description = consumer.GetResourceString(consumer.Name + r.Key + "Description"), + IsOptional = consumer.IsOptional(r.Key) }).ToList(); } } diff --git a/module/ASC.Api/ASC.Api.Settings/TenantVersionWrapper.cs b/module/ASC.Api/ASC.Api.Settings/TenantVersionWrapper.cs index f4d221391..79ba3dc2d 100644 --- a/module/ASC.Api/ASC.Api.Settings/TenantVersionWrapper.cs +++ b/module/ASC.Api/ASC.Api.Settings/TenantVersionWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api.Settings/TfaSettingsWrapper.cs b/module/ASC.Api/ASC.Api.Settings/TfaSettingsWrapper.cs new file mode 100644 index 000000000..93ccc3ac7 --- /dev/null +++ b/module/ASC.Api/ASC.Api.Settings/TfaSettingsWrapper.cs @@ -0,0 +1,57 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +using ASC.Web.Studio.Core.TFA; + +namespace ASC.Api.Settings +{ + [DataContract(Name = "tfaSettings", Namespace = "")] + public class TfaSettingsWrapper + { + [DataMember] + public ITfaSettings TfaSettings; + + [DataMember] + public TfaSettingsType TfaSettingsType; + + public static TfaSettingsWrapper GetSample() + { + return new TfaSettingsWrapper + { + TfaSettings = new TfaAppAuthSettings + { + EnableSetting = true, + MandatoryUsers = new List(), + MandatoryGroups = new List(), + TrustedIps = new List() + }, + TfaSettingsType = TfaSettingsType.App + }; + } + } + + public enum TfaSettingsType + { + None, + Sms, + App + } +} diff --git a/module/ASC.Api/ASC.Api/ASC.Api.Core.csproj b/module/ASC.Api/ASC.Api/ASC.Api.Core.csproj index 65ab4e90a..8c79a7530 100644 --- a/module/ASC.Api/ASC.Api/ASC.Api.Core.csproj +++ b/module/ASC.Api/ASC.Api/ASC.Api.Core.csproj @@ -45,6 +45,8 @@ true 1591 false + ..\..\..\web\studio\ASC.Web.Studio\bin\ASC.Api.xml + CS1591 none @@ -183,6 +185,7 @@ + diff --git a/module/ASC.Api/ASC.Api/ApiServer.cs b/module/ASC.Api/ASC.Api/ApiServer.cs index 9b52fb62c..30e5f7930 100644 --- a/module/ASC.Api/ASC.Api/ApiServer.cs +++ b/module/ASC.Api/ASC.Api/ApiServer.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,7 +44,7 @@ public static bool Available { if (!available.HasValue) { - available = ApiSetup.Builder.IsRegistered(); + available = ApiSetup.Builder != null && ApiSetup.Builder.IsRegistered(); } return available.Value; } diff --git a/module/ASC.Api/ASC.Api/ApiSetup.cs b/module/ASC.Api/ASC.Api/ApiSetup.cs index 3c886b74e..5aee28bdb 100644 --- a/module/ASC.Api/ASC.Api/ApiSetup.cs +++ b/module/ASC.Api/ASC.Api/ApiSetup.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,7 +50,7 @@ public static void Init() { var container = AutofacConfigLoader.Load("api"); - container.Register(c => LogManager.GetLogger("ASC.Api")) + container.Register(c => BaseLogManager.GetLogger("ASC.Api.ApiSetup")) .As() .SingleInstance(); diff --git a/module/ASC.Api/ASC.Api/ApiSetupHttpModule.cs b/module/ASC.Api/ASC.Api/ApiSetupHttpModule.cs index c76f8dfae..ddee2c270 100644 --- a/module/ASC.Api/ASC.Api/ApiSetupHttpModule.cs +++ b/module/ASC.Api/ASC.Api/ApiSetupHttpModule.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Attributes/ApiAttribute.cs b/module/ASC.Api/ASC.Api/Attributes/ApiAttribute.cs index 69b8c79d4..21ef49d0d 100644 --- a/module/ASC.Api/ASC.Api/Attributes/ApiAttribute.cs +++ b/module/ASC.Api/ASC.Api/Attributes/ApiAttribute.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Attributes/ApiCallFilter.cs b/module/ASC.Api/ASC.Api/Attributes/ApiCallFilter.cs index 88257cb6d..e4fc424a8 100644 --- a/module/ASC.Api/ASC.Api/Attributes/ApiCallFilter.cs +++ b/module/ASC.Api/ASC.Api/Attributes/ApiCallFilter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Attributes/CacheAttribute.cs b/module/ASC.Api/ASC.Api/Attributes/CacheAttribute.cs index 1dfa960a3..1e2edb932 100644 --- a/module/ASC.Api/ASC.Api/Attributes/CacheAttribute.cs +++ b/module/ASC.Api/ASC.Api/Attributes/CacheAttribute.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Attributes/NoAutoRegistrationAttribute.cs b/module/ASC.Api/ASC.Api/Attributes/NoAutoRegistrationAttribute.cs index 0acd96d80..a52713910 100644 --- a/module/ASC.Api/ASC.Api/Attributes/NoAutoRegistrationAttribute.cs +++ b/module/ASC.Api/ASC.Api/Attributes/NoAutoRegistrationAttribute.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Batch/ApiBatchHttpHandler.cs b/module/ASC.Api/ASC.Api/Batch/ApiBatchHttpHandler.cs index 6335d0f08..6215515c3 100644 --- a/module/ASC.Api/ASC.Api/Batch/ApiBatchHttpHandler.cs +++ b/module/ASC.Api/ASC.Api/Batch/ApiBatchHttpHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Batch/ApiBatchRequest.cs b/module/ASC.Api/ASC.Api/Batch/ApiBatchRequest.cs index 35095dab9..bc6ed5db3 100644 --- a/module/ASC.Api/ASC.Api/Batch/ApiBatchRequest.cs +++ b/module/ASC.Api/ASC.Api/Batch/ApiBatchRequest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Batch/ApiBatchResponse.cs b/module/ASC.Api/ASC.Api/Batch/ApiBatchResponse.cs index 689769774..63597ce5f 100644 --- a/module/ASC.Api/ASC.Api/Batch/ApiBatchResponse.cs +++ b/module/ASC.Api/ASC.Api/Batch/ApiBatchResponse.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Batch/ApiBatchRouteHandler.cs b/module/ASC.Api/ASC.Api/Batch/ApiBatchRouteHandler.cs index 9c4e99ec3..73bcaa8a1 100644 --- a/module/ASC.Api/ASC.Api/Batch/ApiBatchRouteHandler.cs +++ b/module/ASC.Api/ASC.Api/Batch/ApiBatchRouteHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Batch/ApiWorkerRequest.cs b/module/ASC.Api/ASC.Api/Batch/ApiWorkerRequest.cs index b7f267639..ad48b6198 100644 --- a/module/ASC.Api/ASC.Api/Batch/ApiWorkerRequest.cs +++ b/module/ASC.Api/ASC.Api/Batch/ApiWorkerRequest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Collections/CompiledSmartList.cs b/module/ASC.Api/ASC.Api/Collections/CompiledSmartList.cs index 96a682426..2786062a8 100644 --- a/module/ASC.Api/ASC.Api/Collections/CompiledSmartList.cs +++ b/module/ASC.Api/ASC.Api/Collections/CompiledSmartList.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Collections/Extensions.cs b/module/ASC.Api/ASC.Api/Collections/Extensions.cs index 846b6ed0a..ea9a8b70b 100644 --- a/module/ASC.Api/ASC.Api/Collections/Extensions.cs +++ b/module/ASC.Api/ASC.Api/Collections/Extensions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Collections/ItemDictionary.cs b/module/ASC.Api/ASC.Api/Collections/ItemDictionary.cs index 4a768789a..368e1703c 100644 --- a/module/ASC.Api/ASC.Api/Collections/ItemDictionary.cs +++ b/module/ASC.Api/ASC.Api/Collections/ItemDictionary.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Collections/ItemKeyValuePair.cs b/module/ASC.Api/ASC.Api/Collections/ItemKeyValuePair.cs index 8cf16799e..ddc3ee772 100644 --- a/module/ASC.Api/ASC.Api/Collections/ItemKeyValuePair.cs +++ b/module/ASC.Api/ASC.Api/Collections/ItemKeyValuePair.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Collections/ItemList.cs b/module/ASC.Api/ASC.Api/Collections/ItemList.cs index e12b816c1..9a0d34083 100644 --- a/module/ASC.Api/ASC.Api/Collections/ItemList.cs +++ b/module/ASC.Api/ASC.Api/Collections/ItemList.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Collections/SmartList.cs b/module/ASC.Api/ASC.Api/Collections/SmartList.cs index c9a735814..e7cca3046 100644 --- a/module/ASC.Api/ASC.Api/Collections/SmartList.cs +++ b/module/ASC.Api/ASC.Api/Collections/SmartList.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Collections/SmartListFactory.cs b/module/ASC.Api/ASC.Api/Collections/SmartListFactory.cs index c707867b2..21ea84b29 100644 --- a/module/ASC.Api/ASC.Api/Collections/SmartListFactory.cs +++ b/module/ASC.Api/ASC.Api/Collections/SmartListFactory.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Constants.cs b/module/ASC.Api/ASC.Api/Constants.cs index 40abb204b..e33ffdba0 100644 --- a/module/ASC.Api/ASC.Api/Constants.cs +++ b/module/ASC.Api/ASC.Api/Constants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Enums/ApiStatus.cs b/module/ASC.Api/ASC.Api/Enums/ApiStatus.cs index 66c43294a..2af6ec732 100644 --- a/module/ASC.Api/ASC.Api/Enums/ApiStatus.cs +++ b/module/ASC.Api/ASC.Api/Enums/ApiStatus.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Exceptions/ApiArgumentMismatchException.cs b/module/ASC.Api/ASC.Api/Exceptions/ApiArgumentMismatchException.cs index ed025eda7..6a0f1023a 100644 --- a/module/ASC.Api/ASC.Api/Exceptions/ApiArgumentMismatchException.cs +++ b/module/ASC.Api/ASC.Api/Exceptions/ApiArgumentMismatchException.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Exceptions/ApiBadHttpMethodException.cs b/module/ASC.Api/ASC.Api/Exceptions/ApiBadHttpMethodException.cs index 9c441bf81..948b95f92 100644 --- a/module/ASC.Api/ASC.Api/Exceptions/ApiBadHttpMethodException.cs +++ b/module/ASC.Api/ASC.Api/Exceptions/ApiBadHttpMethodException.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Exceptions/ApiDuplicateRouteException.cs b/module/ASC.Api/ASC.Api/Exceptions/ApiDuplicateRouteException.cs index 3b5d13a67..379af4a2d 100644 --- a/module/ASC.Api/ASC.Api/Exceptions/ApiDuplicateRouteException.cs +++ b/module/ASC.Api/ASC.Api/Exceptions/ApiDuplicateRouteException.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Exceptions/ItemNotFound.cs b/module/ASC.Api/ASC.Api/Exceptions/ItemNotFound.cs index 77f5d223f..a7e4d5162 100644 --- a/module/ASC.Api/ASC.Api/Exceptions/ItemNotFound.cs +++ b/module/ASC.Api/ASC.Api/Exceptions/ItemNotFound.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Global.asax.cs b/module/ASC.Api/ASC.Api/Global.asax.cs index a1b0d432a..406aac328 100644 --- a/module/ASC.Api/ASC.Api/Global.asax.cs +++ b/module/ASC.Api/ASC.Api/Global.asax.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/ApiAllowAllAuthorization.cs b/module/ASC.Api/ASC.Api/Impl/ApiAllowAllAuthorization.cs index 67f530956..ec2edc7e0 100644 --- a/module/ASC.Api/ASC.Api/Impl/ApiAllowAllAuthorization.cs +++ b/module/ASC.Api/ASC.Api/Impl/ApiAllowAllAuthorization.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/ApiArgumentBuilder.cs b/module/ASC.Api/ASC.Api/Impl/ApiArgumentBuilder.cs index f78d47e78..4d7e4ac28 100644 --- a/module/ASC.Api/ASC.Api/Impl/ApiArgumentBuilder.cs +++ b/module/ASC.Api/ASC.Api/Impl/ApiArgumentBuilder.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/ApiContext.cs b/module/ASC.Api/ASC.Api/Impl/ApiContext.cs index d21959dc9..113dc6cf1 100644 --- a/module/ASC.Api/ASC.Api/Impl/ApiContext.cs +++ b/module/ASC.Api/ASC.Api/Impl/ApiContext.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -135,7 +135,7 @@ public string GetRequestValue(string key) /// Gets count to get item from collection. Request parameter "count" /// /// - /// Don't forget to call _context.SetDataPaginated() to prevent SmartList from filtering response if you fetch data from DB with TOP & COUNT + /// Don't forget to call _context.SetDataPaginated() to prevent SmartList from filtering response if you fetch data from DB with TOP & COUNT /// public long Count { get; set; } @@ -143,7 +143,7 @@ public string GetRequestValue(string key) /// Gets start index to get item from collection. Request parameter "startIndex" /// /// - /// Don't forget to call _context.SetDataPaginated() to prevent SmartList from filtering response if you fetch data from DB with TOP & COUNT + /// Don't forget to call _context.SetDataPaginated() to prevent SmartList from filtering response if you fetch data from DB with TOP & COUNT /// public long StartIndex { get; set; } @@ -172,7 +172,7 @@ public string GetRequestValue(string key) /// /// Sort direction. From request parameter "sortOrder" can be "descending" or "ascending" - /// Like ...&sortOrder=descending&... + /// Like ...&sortOrder=descending&... /// public bool SortDescending { get; set; } diff --git a/module/ASC.Api/ASC.Api/Impl/ApiHttpHandler.cs b/module/ASC.Api/ASC.Api/Impl/ApiHttpHandler.cs index 61b6b7103..ff9b8d4a2 100644 --- a/module/ASC.Api/ASC.Api/Impl/ApiHttpHandler.cs +++ b/module/ASC.Api/ASC.Api/Impl/ApiHttpHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/ApiHttpHandlerBase.cs b/module/ASC.Api/ASC.Api/Impl/ApiHttpHandlerBase.cs index 9c43ecd60..5ec1fcd05 100644 --- a/module/ASC.Api/ASC.Api/Impl/ApiHttpHandlerBase.cs +++ b/module/ASC.Api/ASC.Api/Impl/ApiHttpHandlerBase.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/ApiKeyValueInMemoryStorage.cs b/module/ASC.Api/ASC.Api/Impl/ApiKeyValueInMemoryStorage.cs index b49857e23..05219fb73 100644 --- a/module/ASC.Api/ASC.Api/Impl/ApiKeyValueInMemoryStorage.cs +++ b/module/ASC.Api/ASC.Api/Impl/ApiKeyValueInMemoryStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/ApiManager.cs b/module/ASC.Api/ASC.Api/Impl/ApiManager.cs index d132e076a..6bd84487d 100644 --- a/module/ASC.Api/ASC.Api/Impl/ApiManager.cs +++ b/module/ASC.Api/ASC.Api/Impl/ApiManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/ApiMethodCall.cs b/module/ASC.Api/ASC.Api/Impl/ApiMethodCall.cs index 18aec75b1..0fe548c5e 100644 --- a/module/ASC.Api/ASC.Api/Impl/ApiMethodCall.cs +++ b/module/ASC.Api/ASC.Api/Impl/ApiMethodCall.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/ApiRouteConfigurator.cs b/module/ASC.Api/ASC.Api/Impl/ApiRouteConfigurator.cs index 9f4c246f9..58932323f 100644 --- a/module/ASC.Api/ASC.Api/Impl/ApiRouteConfigurator.cs +++ b/module/ASC.Api/ASC.Api/Impl/ApiRouteConfigurator.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/ApiRouteHandler.cs b/module/ASC.Api/ASC.Api/Impl/ApiRouteHandler.cs index a9455cb6e..621efa51c 100644 --- a/module/ASC.Api/ASC.Api/Impl/ApiRouteHandler.cs +++ b/module/ASC.Api/ASC.Api/Impl/ApiRouteHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/ApiSmartListResponceFilter.cs b/module/ASC.Api/ASC.Api/Impl/ApiSmartListResponceFilter.cs index 1c00e51ed..50755617b 100644 --- a/module/ASC.Api/ASC.Api/Impl/ApiSmartListResponceFilter.cs +++ b/module/ASC.Api/ASC.Api/Impl/ApiSmartListResponceFilter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/ApiStandartResponce.cs b/module/ASC.Api/ASC.Api/Impl/ApiStandartResponce.cs index f97c337bc..af25df53f 100644 --- a/module/ASC.Api/ASC.Api/Impl/ApiStandartResponce.cs +++ b/module/ASC.Api/ASC.Api/Impl/ApiStandartResponce.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/ApiStoragePath.cs b/module/ASC.Api/ASC.Api/Impl/ApiStoragePath.cs index 62520980e..302843ba7 100644 --- a/module/ASC.Api/ASC.Api/Impl/ApiStoragePath.cs +++ b/module/ASC.Api/ASC.Api/Impl/ApiStoragePath.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/Constraints/ApiHttpMethodConstraint.cs b/module/ASC.Api/ASC.Api/Impl/Constraints/ApiHttpMethodConstraint.cs index e0098a6ee..6569bbb77 100644 --- a/module/ASC.Api/ASC.Api/Impl/Constraints/ApiHttpMethodConstraint.cs +++ b/module/ASC.Api/ASC.Api/Impl/Constraints/ApiHttpMethodConstraint.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/Invokers/ApiSimpleMethodInvoker.cs b/module/ASC.Api/ASC.Api/Impl/Invokers/ApiSimpleMethodInvoker.cs index ee72293a8..ca415c629 100644 --- a/module/ASC.Api/ASC.Api/Impl/Invokers/ApiSimpleMethodInvoker.cs +++ b/module/ASC.Api/ASC.Api/Impl/Invokers/ApiSimpleMethodInvoker.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/Responders/ContentResponder.cs b/module/ASC.Api/ASC.Api/Impl/Responders/ContentResponder.cs index 76cd41be6..cfecdc8e4 100644 --- a/module/ASC.Api/ASC.Api/Impl/Responders/ContentResponder.cs +++ b/module/ASC.Api/ASC.Api/Impl/Responders/ContentResponder.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/Responders/DirectResponder.cs b/module/ASC.Api/ASC.Api/Impl/Responders/DirectResponder.cs index af42f47ed..497c5e4a2 100644 --- a/module/ASC.Api/ASC.Api/Impl/Responders/DirectResponder.cs +++ b/module/ASC.Api/ASC.Api/Impl/Responders/DirectResponder.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/Routing/ApiAccessControlRouteRegistrator.cs b/module/ASC.Api/ASC.Api/Impl/Routing/ApiAccessControlRouteRegistrator.cs index 3252ab983..bc40e7066 100644 --- a/module/ASC.Api/ASC.Api/Impl/Routing/ApiAccessControlRouteRegistrator.cs +++ b/module/ASC.Api/ASC.Api/Impl/Routing/ApiAccessControlRouteRegistrator.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/Routing/ApiBatchRouteRegitrator.cs b/module/ASC.Api/ASC.Api/Impl/Routing/ApiBatchRouteRegitrator.cs index 2d263ac78..10d82840c 100644 --- a/module/ASC.Api/ASC.Api/Impl/Routing/ApiBatchRouteRegitrator.cs +++ b/module/ASC.Api/ASC.Api/Impl/Routing/ApiBatchRouteRegitrator.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/Routing/ApiRouteRegistrator.cs b/module/ASC.Api/ASC.Api/Impl/Routing/ApiRouteRegistrator.cs index 2fe570c7b..b3f3a4c72 100644 --- a/module/ASC.Api/ASC.Api/Impl/Routing/ApiRouteRegistrator.cs +++ b/module/ASC.Api/ASC.Api/Impl/Routing/ApiRouteRegistrator.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/Routing/ApiRouteRegistratorBase.cs b/module/ASC.Api/ASC.Api/Impl/Routing/ApiRouteRegistratorBase.cs index a6a02d8fb..f7e612b54 100644 --- a/module/ASC.Api/ASC.Api/Impl/Routing/ApiRouteRegistratorBase.cs +++ b/module/ASC.Api/ASC.Api/Impl/Routing/ApiRouteRegistratorBase.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/Serializers/JsonNetSerializer.cs b/module/ASC.Api/ASC.Api/Impl/Serializers/JsonNetSerializer.cs index 745f0c4a1..8f76af126 100644 --- a/module/ASC.Api/ASC.Api/Impl/Serializers/JsonNetSerializer.cs +++ b/module/ASC.Api/ASC.Api/Impl/Serializers/JsonNetSerializer.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/Serializers/JsonStringConverter.cs b/module/ASC.Api/ASC.Api/Impl/Serializers/JsonStringConverter.cs index 7ae5e386e..a60d31ba6 100644 --- a/module/ASC.Api/ASC.Api/Impl/Serializers/JsonStringConverter.cs +++ b/module/ASC.Api/ASC.Api/Impl/Serializers/JsonStringConverter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/Serializers/SerializerContractResolver.cs b/module/ASC.Api/ASC.Api/Impl/Serializers/SerializerContractResolver.cs index 39c701f40..6a21e4704 100644 --- a/module/ASC.Api/ASC.Api/Impl/Serializers/SerializerContractResolver.cs +++ b/module/ASC.Api/ASC.Api/Impl/Serializers/SerializerContractResolver.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/Serializers/SerializerResponder.cs b/module/ASC.Api/ASC.Api/Impl/Serializers/SerializerResponder.cs index 4cb98ea98..6b28526aa 100644 --- a/module/ASC.Api/ASC.Api/Impl/Serializers/SerializerResponder.cs +++ b/module/ASC.Api/ASC.Api/Impl/Serializers/SerializerResponder.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Impl/SimpleApiParamInspector.cs b/module/ASC.Api/ASC.Api/Impl/SimpleApiParamInspector.cs index c3d613788..c92866141 100644 --- a/module/ASC.Api/ASC.Api/Impl/SimpleApiParamInspector.cs +++ b/module/ASC.Api/ASC.Api/Impl/SimpleApiParamInspector.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/ApiHttpAsyncHandler.cs b/module/ASC.Api/ASC.Api/Interfaces/ApiHttpAsyncHandler.cs index 4a84c83b1..d70dfa23d 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/ApiHttpAsyncHandler.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/ApiHttpAsyncHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiArgumentBuilder.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiArgumentBuilder.cs index beeb64114..498a04667 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiArgumentBuilder.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiArgumentBuilder.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiAuthorization.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiAuthorization.cs index e1e53e0c5..65e06a2c7 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiAuthorization.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiAuthorization.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiBootstrapper.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiBootstrapper.cs index bdf51c4f5..8f925dcf4 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiBootstrapper.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiBootstrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiConfiguration.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiConfiguration.cs index 5f39460c6..949ea0ac3 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiConfiguration.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiConfiguration.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiDateTime.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiDateTime.cs index ef927f11b..cb3fe93f7 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiDateTime.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiDateTime.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiEntryPoint.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiEntryPoint.cs index 20391a1a7..4c24c936a 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiEntryPoint.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiEntryPoint.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiManager.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiManager.cs index fad981e13..ce523e613 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiManager.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiMethodCall.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiMethodCall.cs index 97d222d7f..14cade239 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiMethodCall.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiMethodCall.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiMethodInvoker.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiMethodInvoker.cs index f94822956..b077dd207 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiMethodInvoker.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiMethodInvoker.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiParamInspector.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiParamInspector.cs index a57f4a1c8..14203e8cb 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiParamInspector.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiParamInspector.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiResponceFilter.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiResponceFilter.cs index 36140cf44..0a524566f 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiResponceFilter.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiResponceFilter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiResponder.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiResponder.cs index 595e7e743..205997ec9 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiResponder.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiResponder.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiRouteConfigurator.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiRouteConfigurator.cs index d78b00398..16d879249 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiRouteConfigurator.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiRouteConfigurator.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiRouteHandler.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiRouteHandler.cs index e63fc50ef..0a86d91b7 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiRouteHandler.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiRouteHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiRouteRegistrator.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiRouteRegistrator.cs index 15ba43095..94a92bbd1 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiRouteRegistrator.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiRouteRegistrator.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiSerializer.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiSerializer.cs index f1f9c44c9..2e1ee7c89 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiSerializer.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiSerializer.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiStandartResponce.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiStandartResponce.cs index f6f0a2b41..f212ed238 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiStandartResponce.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiStandartResponce.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/IApiStoragePath.cs b/module/ASC.Api/ASC.Api/Interfaces/IApiStoragePath.cs index 2b21b29a3..a91e879e9 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/IApiStoragePath.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/IApiStoragePath.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/ResponseTypes/IApiContentResponce.cs b/module/ASC.Api/ASC.Api/Interfaces/ResponseTypes/IApiContentResponce.cs index 1ff440095..0fd7f4c87 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/ResponseTypes/IApiContentResponce.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/ResponseTypes/IApiContentResponce.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/ResponseTypes/IApiDirectResponce.cs b/module/ASC.Api/ASC.Api/Interfaces/ResponseTypes/IApiDirectResponce.cs index d0504f905..a03d44ec4 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/ResponseTypes/IApiDirectResponce.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/ResponseTypes/IApiDirectResponce.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Interfaces/Storage/IApiKeyValueStorage.cs b/module/ASC.Api/ASC.Api/Interfaces/Storage/IApiKeyValueStorage.cs index a42ad750f..24930f8be 100644 --- a/module/ASC.Api/ASC.Api/Interfaces/Storage/IApiKeyValueStorage.cs +++ b/module/ASC.Api/ASC.Api/Interfaces/Storage/IApiKeyValueStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Routing/RouteCallInfo.cs b/module/ASC.Api/ASC.Api/Routing/RouteCallInfo.cs index 9a278ad23..6f99d74da 100644 --- a/module/ASC.Api/ASC.Api/Routing/RouteCallInfo.cs +++ b/module/ASC.Api/ASC.Api/Routing/RouteCallInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Routing/UrlPath.cs b/module/ASC.Api/ASC.Api/Routing/UrlPath.cs index 9ceba381a..b8d84f81c 100644 --- a/module/ASC.Api/ASC.Api/Routing/UrlPath.cs +++ b/module/ASC.Api/ASC.Api/Routing/UrlPath.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Utils/Binder.cs b/module/ASC.Api/ASC.Api/Utils/Binder.cs index b08789436..ef5a96317 100644 --- a/module/ASC.Api/ASC.Api/Utils/Binder.cs +++ b/module/ASC.Api/ASC.Api/Utils/Binder.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Utils/ConvertUtils.cs b/module/ASC.Api/ASC.Api/Utils/ConvertUtils.cs index 8fac7e1da..6925bf9f1 100644 --- a/module/ASC.Api/ASC.Api/Utils/ConvertUtils.cs +++ b/module/ASC.Api/ASC.Api/Utils/ConvertUtils.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Utils/ErrorHttpHandler.cs b/module/ASC.Api/ASC.Api/Utils/ErrorHttpHandler.cs index 3ac6cca59..0b9a4d186 100644 --- a/module/ASC.Api/ASC.Api/Utils/ErrorHttpHandler.cs +++ b/module/ASC.Api/ASC.Api/Utils/ErrorHttpHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Utils/HttpUtils.cs b/module/ASC.Api/ASC.Api/Utils/HttpUtils.cs index 14eed5db5..161b6a256 100644 --- a/module/ASC.Api/ASC.Api/Utils/HttpUtils.cs +++ b/module/ASC.Api/ASC.Api/Utils/HttpUtils.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Utils/PathUtils.cs b/module/ASC.Api/ASC.Api/Utils/PathUtils.cs index 1363462ac..3b18bd12c 100644 --- a/module/ASC.Api/ASC.Api/Utils/PathUtils.cs +++ b/module/ASC.Api/ASC.Api/Utils/PathUtils.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Utils/StringIgnoreCaseComparer.cs b/module/ASC.Api/ASC.Api/Utils/StringIgnoreCaseComparer.cs index 1159b92b1..6a8dbc552 100644 --- a/module/ASC.Api/ASC.Api/Utils/StringIgnoreCaseComparer.cs +++ b/module/ASC.Api/ASC.Api/Utils/StringIgnoreCaseComparer.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Utils/StringUtils.cs b/module/ASC.Api/ASC.Api/Utils/StringUtils.cs index a30d1b16d..053d21e07 100644 --- a/module/ASC.Api/ASC.Api/Utils/StringUtils.cs +++ b/module/ASC.Api/ASC.Api/Utils/StringUtils.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Utils/Update.cs b/module/ASC.Api/ASC.Api/Utils/Update.cs index 3173fb93b..af48b5236 100644 --- a/module/ASC.Api/ASC.Api/Utils/Update.cs +++ b/module/ASC.Api/ASC.Api/Utils/Update.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Api/Utils/Validate.cs b/module/ASC.Api/ASC.Api/Utils/Validate.cs index d561d0d86..020544ef7 100644 --- a/module/ASC.Api/ASC.Api/Utils/Validate.cs +++ b/module/ASC.Api/ASC.Api/Utils/Validate.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Employee/Contact.cs b/module/ASC.Api/ASC.Employee/Contact.cs index 253371be0..ab8585a44 100644 --- a/module/ASC.Api/ASC.Employee/Contact.cs +++ b/module/ASC.Api/ASC.Employee/Contact.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,9 +22,13 @@ namespace ASC.Api.Employee [DataContract(Name = "contact", Namespace = "")] public class Contact { + ///GTalk + ///1 [DataMember(Order = 1)] public string Type { get; set; } + ///my@gmail.com + ///2 [DataMember(Order = 2)] public string Value { get; set; } diff --git a/module/ASC.Api/ASC.Employee/EmployeeApi.cs b/module/ASC.Api/ASC.Employee/EmployeeApi.cs index c59f5a95a..7e015859d 100644 --- a/module/ASC.Api/ASC.Employee/EmployeeApi.cs +++ b/module/ASC.Api/ASC.Employee/EmployeeApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,14 +17,11 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Net.Mail; using System.Security; -using System.Text; -using System.Threading.Tasks; using System.Web; using ASC.Api.Attributes; @@ -32,7 +29,7 @@ using ASC.Api.Impl; using ASC.Common.Caching; using ASC.Common.Logging; -using ASC.Common.Radicale; +using ASC.Common.Threading; using ASC.Common.Threading.Progress; using ASC.Core; using ASC.Core.Tenants; @@ -47,7 +44,9 @@ using ASC.Web.Core.Users; using ASC.Web.People; using ASC.Web.People.Core.Import; +using ASC.Web.Studio.Core; using ASC.Web.Studio.Core.Notify; +using ASC.Web.Studio.Core.Quota; using ASC.Web.Studio.Core.Users; using ASC.Web.Studio.PublicResources; using ASC.Web.Studio.UserControls.Statistics; @@ -60,9 +59,11 @@ namespace ASC.Api.Employee /// ///Access to user profiles /// + ///people public class EmployeeApi : Interfaces.IApiEntryPoint { private static readonly ProgressQueue progressQueue = new ProgressQueue(1, TimeSpan.FromMinutes(5), true); + private ILog Log = LogManager.GetLogger("ASC.Api"); public static readonly ICache Cache = AscCache.Default; @@ -92,44 +93,51 @@ private static HttpRequest Request get { return HttpContext.Current.Request; } } - /// - ///Returns the detailed information about the current user profile. - /// - /// - ///Get my profile - /// - ///Profiles - ///Detailed information about my profile + /// + /// Returns the detailed information about the current user profile. + /// + /// + /// Get my profile + /// + /// Profiles + /// Detailed information about my profile + /// api/2.0/people/@self + /// GET [Read("@self")] public EmployeeWraperFull GetMe() { return new EmployeeWraperFull(CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID)); } - /// - ///Returns a list of profiles for all the portal users. - /// - /// - ///Get all profiles - /// - ///Profiles - ///List of profiles - /// This method returns the partial profiles. Use more specific method to get full profiles. + /// + /// Returns a list of profiles for all the portal users. + /// + /// + /// Get profiles + /// + /// Profiles + /// List of profiles + /// api/2.0/people + /// GET + /// list [Read("")] public IEnumerable GetAll() { return GetByStatus(EmployeeStatus.Active); } - /// - ///Returns a list of profiles filtered by user status. - /// - /// - ///Get profiles by status - /// - ///User status - ///User status - ///List of profiles + /// + /// Returns a list of profiles filtered by user status. + /// + /// + /// Get profiles by status + /// + /// User status ("Active", "Terminated", "LeaveOfAbsence", "All", or "Default") + /// List of profiles + /// User status + /// api/2.0/people/status/{status} + /// GET + /// list [Read("status/{status}")] public IEnumerable GetByStatus(EmployeeStatus status) { @@ -145,15 +153,17 @@ public IEnumerable GetByStatus(EmployeeStatus status) return query.Select(x => new EmployeeWraperFull(x)); } - /// - ///Returns the detailed information about a profile of the user with the name specified in the request. - /// - /// - ///Get a profile by user name - /// - ///Profiles - ///User name - ///User profile + /// + /// Returns the detailed information about a profile of the user with the name specified in the request. + /// + /// + /// Get a profile by user name + /// + /// Profiles + /// User name + /// User profile + /// api/2.0/people/{username} + /// GET [Read("{username}")] public EmployeeWraperFull GetById(string username) { @@ -189,8 +199,10 @@ public EmployeeWraperFull GetById(string username) ///Get a profile by user email /// ///Profiles - ///User email - ///User profile + ///User email + ///User profile + ///api/2.0/people/email + ///GET [Read("email")] public EmployeeWraperFull GetByEmail(string email) { @@ -211,8 +223,11 @@ public EmployeeWraperFull GetByEmail(string email) ///Search user profiles /// ///Search - ///Search query - ///List of user profiles + ///Query + ///List of user profiles + ///api/2.0/people/@search/{query} + ///GET + ///list [Read("@search/{query}")] public IEnumerable GetSearch(string query) { @@ -242,8 +257,11 @@ public IEnumerable GetSearch(string query) ///Search users /// ///Search - ///Search query - ///List of users + ///Search text + ///List of users + ///api/2.0/people/search + ///GET + ///list [Read("search")] public IEnumerable GetPeopleSearch(string query) { @@ -257,9 +275,12 @@ public IEnumerable GetPeopleSearch(string query) ///Search users by status filter /// ///Search - ///User status - ///Search query - ///List of users + ///User status ("Active", "Terminated", "LeaveOfAbsence", "All", or "Default") + ///Search query + ///List of users + ///api/2.0/people/status/{status}/search + ///GET + /// list [Read("status/{status}/search")] public IEnumerable GetAdvanced(EmployeeStatus status, string query) { @@ -289,15 +310,17 @@ public IEnumerable GetAdvanced(EmployeeStatus status, string } /// - /// Imports the new portal users with the first name, last name and email address. + /// Imports the new portal users with the first name, last name, and email address. /// /// /// Import users /// /// Profiles - /// List of users - /// Imports users as guests (true) or not (false) + /// List of users + /// Specifies whether to import users as guests (true) or not (false) /// Newly added users + /// api/2.0/people/import/save + /// POST [Create("import/save")] public void SaveUsers(string userList, bool importUsersAsCollaborators) { @@ -330,8 +353,10 @@ public void SaveUsers(string userList, bool importUsersAsCollaborators) /// /// Get a user status /// - /// User status /// Current user information + /// User status + /// api/2.0/people/import/status + /// GET [Read("import/status")] public object GetStatus() { @@ -360,14 +385,17 @@ public object GetStatus() /// Search users and their information by extended filter /// /// Search - /// User status - /// Group ID - /// Activation status - /// User type - /// Specifies if the user is administrator or not - /// - /// List of users with their information + /// User status ("Active", "Terminated", "LeaveOfAbsence", "All", or "Default") + /// Group ID + /// Activation status ("NotActivated", "Activated", "Pending", or "AutoGenerated") + /// User type ("All", "User", or "Visitor") + /// Specifies if the user is an administrator or not + /// + /// List of users with their information /// + /// api/2.0/people/filter + /// GET + /// list [Read("filter")] public IEnumerable GetFullByFilter(EmployeeStatus? employeeStatus, Guid? groupId, EmployeeActivationStatus? activationStatus, EmployeeType? employeeType, bool? isAdministrator) { @@ -383,14 +411,17 @@ public IEnumerable GetFullByFilter(EmployeeStatus? employeeS /// Search users by extended filter /// /// Search - /// User status - /// Group ID - /// Activation status - /// User type - /// Specifies if the user is administrator or not - /// - /// List of users + /// User status ("Active", "Terminated", "LeaveOfAbsence", "All", or "Default") + /// Group ID + /// Activation status ("NotActivated", "Activated", "Pending", or "AutoGenerated") + /// User type ("All", "User", or "Visitor") + /// Specifies if the user is an administrator or not + /// + /// List of users /// + /// api/2.0/people/simple/filter + /// GET + /// list [Read("simple/filter")] public IEnumerable GetSimpleByFilter(EmployeeStatus? employeeStatus, Guid? groupId, EmployeeActivationStatus? activationStatus, EmployeeType? employeeType, bool? isAdministrator) { @@ -478,30 +509,33 @@ private IEnumerable GetByFilter(EmployeeStatus? employeeStatus, Guid? } /// - /// Adds a new portal user with the first name, last name, email address and several optional parameters specified in the request. + /// Adds a new portal user with the first name, last name, email address, and several optional parameters specified in the request. /// /// /// Add a user /// /// Profiles - /// Specifies if this is a guest (true) or user (false) - /// User email - /// User first name - /// User last name - /// User department - /// User title - /// User location - /// User sex (male or female) - /// User birthday - /// User registration date. If it is not specified, then the current date will be set - /// User comments - /// Contact list - /// Avatar photo URL - /// User password - /// Password hash - /// Newly added user + /// Specifies if this is a guest (true) or user (false) + /// User email + /// User first name + /// User last name + /// User department + /// User title + /// User location + /// User sex (male or female) + /// User birthday + /// User registration date. If it is not specified, then the current date will be set + /// User comment + /// Contact list + /// Avatar photo URL + /// User password + /// Password hash + /// User lead + /// Newly added user + /// api/2.0/people + /// POST [Create("")] - public EmployeeWraperFull AddMember(bool isVisitor, string email, string firstname, string lastname, Guid[] department, string title, string location, string sex, ApiDateTime birthday, ApiDateTime worksfrom, string comment, IEnumerable contacts, string files, string password, string passwordHash) + public EmployeeWraperFull AddMember(bool isVisitor, string email, string firstname, string lastname, Guid[] department, string title, string location, string sex, ApiDateTime birthday, ApiDateTime worksfrom, string comment, IEnumerable contacts, string files, string password, string passwordHash, Guid? lead) { SecurityContext.DemandPermissions(Core.Users.Constants.Action_AddRemoveUser); @@ -539,6 +573,7 @@ public EmployeeWraperFull AddMember(bool isVisitor, string email, string firstna user.BirthDate = birthday != null ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(birthday)) : (DateTime?)null; user.WorkFromDate = worksfrom != null ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(worksfrom)) : DateTime.UtcNow.Date; + user.Lead = lead; UpdateContacts(contacts, user); @@ -555,99 +590,17 @@ public EmployeeWraperFull AddMember(bool isVisitor, string email, string firstna UpdatePhotoUrl(files, user); } - //this eject - - return new EmployeeWraperFull(user); - } - - - - /// - /// Adds a new activated portal user with the first name, last name, email address and several optional parameters specified in the request. - /// - /// - /// Add an activated user - /// - /// Profiles - /// Specifies if this is a guest (true) or user (false) - /// User email - /// User first name - /// User last name - /// User department - /// User title - /// User location - /// User sex (male or female) - /// User birthday - /// User registration date. If it is not specified, then the current date will be set - /// User comments - /// Contact list - /// Avatar photo URL - /// User password - /// Newly added user - /// false - [Create("active")] - public EmployeeWraperFull AddMemberAsActivated( - bool isVisitor, - String email, - String firstname, - String lastname, - Guid[] department, - String title, - String location, - String sex, - ApiDateTime birthday, - ApiDateTime worksfrom, - String comment, - IEnumerable contacts, - String files, - String password) - { - SecurityContext.DemandPermissions(Core.Users.Constants.Action_AddRemoveUser); - - var user = new UserInfo(); - - password = (password ?? "").Trim(); + var quotaSettings = TenantUserQuotaSettings.Load(); - if (String.IsNullOrEmpty(password)) - { - password = UserManagerWrapper.GeneratePassword(); - } - else + if (quotaSettings.EnableUserQuota) { - UserManagerWrapper.CheckPasswordPolicy(password); - } - - var passwordHash = PasswordHasher.GetClientPassword(password); - - //Validate email - var address = new MailAddress(email); - user.Email = address.Address; - //Set common fields - user.FirstName = firstname; - user.LastName = lastname; - user.Title = title; - user.Location = location; - user.Notes = comment; - user.Sex = "male".Equals(sex, StringComparison.OrdinalIgnoreCase) - ? true - : ("female".Equals(sex, StringComparison.OrdinalIgnoreCase) ? (bool?)false : null); - - user.BirthDate = birthday != null ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(birthday)) : (DateTime?)null; - user.WorkFromDate = worksfrom != null ? TenantUtil.DateTimeFromUtc(Convert.ToDateTime(worksfrom)) : DateTime.UtcNow.Date; - - UpdateContacts(contacts, user); - Cache.Insert("REWRITE_URL" + CoreContext.TenantManager.GetCurrentTenant().TenantId, HttpContext.Current.Request.GetUrlRewriter().ToString(), TimeSpan.FromMinutes(5)); - user = UserManagerWrapper.AddUser(user, passwordHash, false, false, isVisitor, false, true, true); - - user.ActivationStatus = EmployeeActivationStatus.Activated; - - UpdateDepartments(department, user); + var newserQuotaSettings = new UserQuotaSettings { UserQuota = quotaSettings.DefaultUserQuota }; - if (files != UserPhotoManager.GetDefaultPhotoAbsoluteWebPath()) - { - UpdatePhotoUrl(files, user); + newserQuotaSettings.SaveForUser(user.ID); } + //this eject + return new EmployeeWraperFull(user); } @@ -744,29 +697,32 @@ private void UpdatePhotoUrl(string files, UserInfo user) } /// - /// Updates the data for the selected portal user with the first name, last name, email address and/or optional parameters specified in the request. + /// Updates the data for the selected portal user with the first name, last name, email address, and/or optional parameters specified in the request. /// /// /// Update a user /// /// Profiles - /// Specifies if this is a guest (true) or user (false) - /// User ID - /// New user first name - /// New user last name - /// New user comments - /// New user department - /// New user title - /// New user location - /// New user sex (male or female) - /// New user birthday - /// New user registration date. If it is not specified, then the current date will be set - /// New contact list - /// New avatar photo URL - /// Disable user - /// Updated user + /// Specifies if this is a guest (true) or user (false) + /// User ID + /// New user first name + /// New user last name + /// New user comment + /// New user department + /// New user title + /// New user location + /// New user sex (male or female) + /// New user birthday + /// New user registration date. If it is not specified, then the current date will be set + /// New contact list + /// New avatar photo URL + /// Specifies whether to disable a user on the portal or not + /// User lead + /// Updated user + /// api/2.0/people/{userid} + /// PUT [Update("{userid}")] - public EmployeeWraperFull UpdateMember(bool isVisitor, string userid, string firstname, string lastname, string comment, Guid[] department, string title, string location, string sex, ApiDateTime birthday, ApiDateTime worksfrom, IEnumerable contacts, string files, bool? disable) + public EmployeeWraperFull UpdateMember(bool isVisitor, string userid, string firstname, string lastname, string comment, Guid[] department, string title, string location, string sex, ApiDateTime birthday, ApiDateTime worksfrom, IEnumerable contacts, string files, bool? disable, Guid? lead) { SecurityContext.DemandPermissions(new UserSecurityProvider(new Guid(userid)), Core.Users.Constants.Action_EditUser); @@ -820,6 +776,10 @@ public EmployeeWraperFull UpdateMember(bool isVisitor, string userid, string fir user.WorkFromDate = null; } + if (isAdmin) + { + user.Lead = lead; + } //Update contacts UpdateContacts(contacts, user); UpdateDepartments(department, user); @@ -881,8 +841,10 @@ public EmployeeWraperFull UpdateMember(bool isVisitor, string userid, string fir /// Delete a user /// /// Profiles - /// User ID - /// Deleted user + /// User ID + /// Deleted user + /// api/2.0/people/{userid} + /// DELETE [Delete("{userid}")] public EmployeeWraperFull DeleteMember(string userid) { @@ -910,15 +872,17 @@ public EmployeeWraperFull DeleteMember(string userid) } /// - /// Updates the contact information of the user with the ID specified in the request merging new data with the present portal data. + /// Updates the contact information of the user with the ID specified in the request merging the new data into the current portal data. /// /// /// Update user contacts /// /// Contacts - /// User ID - /// List of new contacts - /// Updated user profile + /// User ID + /// List of new contacts + /// Updated user profile + /// api/2.0/people/{userid}/contacts + /// PUT [Update("{userid}/contacts")] public EmployeeWraperFull UpdateMemberContacts(string userid, IEnumerable contacts) { @@ -933,15 +897,17 @@ public EmployeeWraperFull UpdateMemberContacts(string userid, IEnumerable - /// Sets the contacts of the user with the ID specified in the request replacing the present portal data with the new data. + /// Sets the contacts of the user with the ID specified in the request replacing the current portal data with the new data. /// /// /// Set user contacts /// /// Contacts - /// User ID - /// List of new contacts - /// Updated user profile + /// User ID + /// List of new contacts + /// Updated user profile + /// api/2.0/people/{userid}/contacts + /// POST [Create("{userid}/contacts")] public EmployeeWraperFull SetMemberContacts(string userid, IEnumerable contacts) { @@ -963,9 +929,11 @@ public EmployeeWraperFull SetMemberContacts(string userid, IEnumerable /// Delete user contacts /// /// Contacts - /// User ID - /// List of contacts - /// Updated user profile + /// User ID + /// List of contacts + /// Updated user profile + /// api/2.0/people/{userid}/contacts + /// DELETE [Delete("{userid}/contacts")] public EmployeeWraperFull DeleteMemberContacts(string userid, IEnumerable contacts) { @@ -986,8 +954,10 @@ public EmployeeWraperFull DeleteMemberContacts(string userid, IEnumerable /// Photos - /// User ID - /// User photo + /// User ID + /// User photo + /// api/2.0/people/{userid}/photo + /// GET [Read("{userid}/photo")] public ThumbnailsDataWrapper GetMemberPhoto(string userid) { @@ -1006,9 +976,11 @@ public ThumbnailsDataWrapper GetMemberPhoto(string userid) /// Update a user photo /// /// Photos - /// User ID - /// New avatar photo URL - /// Updated user photo + /// User ID + /// New avatar photo URL + /// Updated user photo + /// api/2.0/people/{userid}/photo + /// PUT [Update("{userid}/photo")] public ThumbnailsDataWrapper UpdateMemberPhoto(string userid, string files) { @@ -1035,8 +1007,10 @@ public ThumbnailsDataWrapper UpdateMemberPhoto(string userid, string files) /// Delete a user photo /// /// Photos - /// User ID - /// Deleted user photo + /// User ID + /// Deleted user photo + /// api/2.0/people/{userid}/photo + /// DELETE [Delete("{userid}/photo")] public ThumbnailsDataWrapper DeleteMemberPhoto(string userid) { @@ -1062,13 +1036,15 @@ public ThumbnailsDataWrapper DeleteMemberPhoto(string userid) /// Create a photo thumbnail /// /// Photos - /// User ID - /// Path to the temporary file - /// Horizontal coordinate - /// Vertical coordinate - /// Thumbnail width - /// Thumbnail height - /// Thumbnail + /// User ID + /// Path to the temporary file + /// Horizontal coordinate + /// Vertical coordinate + /// Thumbnail width + /// Thumbnail height + /// api/2.0/people/{userid}/photo/thumbnails + /// POST + /// Thumbnail [Create("{userid}/photo/thumbnails")] public ThumbnailsDataWrapper CreateMemberPhotoThumbnails(string userid, string tmpFile, int x, int y, int width, int height) { @@ -1106,9 +1082,11 @@ public ThumbnailsDataWrapper CreateMemberPhotoThumbnails(string userid, string t /// /// Change a user email /// Email - /// User ID - /// New email + /// User ID + /// New email /// Detailed user information + /// api/2.0/people/{userid}/email + /// PUT [Update("{userid}/email")] public EmployeeWraperFull ChangeUserEmail(Guid userid, string email) { @@ -1162,14 +1140,17 @@ public EmployeeWraperFull ChangeUserEmail(Guid userid, string email) } /// - /// Reminds a password to the user using the email specified in the request. + /// Reminds a password to the user using the email address specified in the request. /// /// /// Remind a user password /// /// Password - /// User email + /// User email /// Email with the password + /// api/2.0/people/password + /// POST + /// false /// false [Create("password", false, false)] //NOTE: this method doesn't require auth!!! //NOTE: this method doesn't check payment!!! public string SendUserPassword(string email) @@ -1188,9 +1169,11 @@ public string SendUserPassword(string email) /// /// Change a user password /// Password - /// User ID - /// New password + /// User ID + /// New password /// Detailed user information + /// api/2.0/people/{userid}/password + /// PUT [Update("{userid}/password")] public EmployeeWraperFull ChangeUserPassword(Guid userid, string password) { @@ -1246,11 +1229,13 @@ private static UserInfo GetUserInfo(string userNameOrId) /// /// Sets the required activation status to the user with the ID specified in the request. /// - /// Set an activation status + /// Set an activation status to the user /// Activation status - /// User ID - /// Required activation status + /// User ID + /// Activation status ("NotActivated", "Activated", "Pending", or "AutoGenerated") /// Detailed user information + /// api/2.0/people/{userid}/activationstatus + /// PUT /// false [Update("{userid}/activationstatus")] public EmployeeWraperFull UpdateEmployeeActivationStatus(Guid userid, EmployeeActivationStatus activationstatus) @@ -1265,12 +1250,15 @@ public EmployeeWraperFull UpdateEmployeeActivationStatus(Guid userid, EmployeeAc /// Sets the required activation status to the list of users with the IDs specified in the request. /// /// - /// Set an activation status + /// Set an activation status to the users /// /// Activation status - /// List of user IDs - /// Required activation status + /// List of user IDs + /// Activation status ("NotActivated", "Activated", "Pending", or "AutoGenerated") /// List of users + /// api/2.0/people/activationstatus/{activationstatus} + /// PUT + /// list /// false [Update("activationstatus/{activationstatus}")] public IEnumerable UpdateEmployeeActivationStatus(EmployeeActivationStatus activationstatus, IEnumerable userIds) @@ -1322,9 +1310,12 @@ private UserInfo ChangeEmployeeActivationStatus(Guid userid, EmployeeActivationS /// Change a user type /// /// User type - /// New user type - /// List of user IDs - /// List of users + /// New user type ("All", "User", or "Visitor") + /// List of user IDs + /// User list + /// api/2.0/people/type/{type} + /// PUT + /// list [Update("type/{type}")] public IEnumerable UpdateUserType(EmployeeType type, IEnumerable userIds) { @@ -1365,6 +1356,8 @@ public IEnumerable UpdateUserType(EmployeeType type, IEnumer return users.Select(user => new EmployeeWraperFull(user)); } + + /// /// Changes a status for the users with the IDs specified in the request. /// @@ -1372,9 +1365,12 @@ public IEnumerable UpdateUserType(EmployeeType type, IEnumer /// Change a user status /// /// User status - /// New user status - /// List of user IDs - /// List of users + /// New user status ("Active", "Terminated", "LeaveOfAbsence", "All", or "Default" + /// List of user IDs + /// User list + /// api/2.0/people/status/{status} + /// PUT + /// list [Update("status/{status}")] public IEnumerable UpdateUserStatus(EmployeeStatus status, IEnumerable userIds) { @@ -1423,8 +1419,11 @@ public IEnumerable UpdateUserStatus(EmployeeStatus status, I /// Resend an activation email /// /// Profiles - /// List of user IDs - /// List of users + /// List of user IDs + /// List of users + /// api/2.0/people/invite + /// PUT + /// list [Update("invite")] public IEnumerable ResendUserInvites(IEnumerable userIds) { @@ -1466,8 +1465,11 @@ public IEnumerable ResendUserInvites(IEnumerable userI /// Delete users /// /// Profiles - /// List of user IDs - /// List of users + /// List of user IDs + /// List of users + /// api/2.0/people/delete + /// PUT + /// list [Update("delete")] public IEnumerable RemoveUsers(IEnumerable userIds) { @@ -1501,10 +1503,12 @@ public IEnumerable RemoveUsers(IEnumerable userIds) /// Sends instructions for deleting a user profile. /// /// - /// Send the delete instructions + /// Send the deletion instructions /// /// Profiles /// Information message + /// api/2.0/people/self/delete + /// PUT [Update("self/delete")] public string SendInstructionsToDelete() { @@ -1521,13 +1525,15 @@ public string SendInstructionsToDelete() /// - /// Subscribes to or unsubscribes from the birthday of a user with the ID specified. + /// Subscribes to or unsubscribes from the birthday of the user with the ID specified in the request. /// /// Birthday subscription - /// User ID - /// Defines if the user will be notified about other user's birthday or not - /// Bool value: true means that the user will get the notification + /// User ID + /// Defines if the user will be notified about another user's birthday or not + /// Bool value: true means that the user will get a notification /// Birthday + /// api/2.0/people/birthdays/reminder + /// POST [Create("birthdays/reminder")] public bool RemindAboutBirthday(Guid userid, bool onRemind) { @@ -1544,7 +1550,9 @@ public bool RemindAboutBirthday(Guid userid, bool onRemind) /// Link a third-pary account /// /// Third-party accounts - /// Third-party profile in the serialized format + /// Third-party profile in the serialized format + /// api/2.0/people/thirdparty/linkaccount + /// PUT ///false [Update("thirdparty/linkaccount")] public void LinkAccount(string serializedProfile) @@ -1578,7 +1586,9 @@ public void LinkAccount(string serializedProfile) /// Unlink a third-pary account /// /// Third-party accounts - /// Provider name + /// Provider name + /// api/2.0/people/thirdparty/unlinkaccount + /// DELETE ///false [Delete("thirdparty/unlinkaccount")] public void UnlinkAccount(string provider) @@ -1616,12 +1626,14 @@ private static string GetMeaningfulProviderName(string providerName) #region Reassign user data /// - /// Returns the progress of the started reassigning process for the user with the ID specified in the request. + /// Returns the progress of the started data reassignment for the user with the ID specified in the request. /// - /// Get the reassigning progress - /// User ID whose data is reassigned - /// Reassign user data - /// Reassigning progress + /// Get the reassignment progress + /// User ID whose data is reassigned + /// User data + /// Reassignment progress + /// api/2.0/people/reassign/progress + /// GET [Read(@"reassign/progress")] public ReassignProgressItem GetReassignProgress(Guid userId) { @@ -1631,11 +1643,14 @@ public ReassignProgressItem GetReassignProgress(Guid userId) } /// - /// Terminates the reassigning process for the user with the ID specified in the request. + /// Terminates the data reassignment for the user with the ID specified in the request. /// - /// Terminate the reassigning process - /// User ID whose data is reassigned - /// Reassign user data + /// Terminate the data reassignment + /// User ID whose data is reassigned + /// User data + /// api/2.0/people/reassign/terminate + /// PUT + /// [Update(@"reassign/terminate")] public void TerminateReassign(Guid userId) { @@ -1645,14 +1660,16 @@ public void TerminateReassign(Guid userId) } /// - /// Starts the reassigning process for the user with the ID specified in the request. + /// Starts the data reassignment for the user with the ID specified in the request. /// - /// Start the reassigning process - /// User ID whose data will be reassigned to another user - /// User ID to whom all the data will be reassigned - /// Deletes a profile when reassignment will be finished or not - /// Reassign user data - /// Reassigning progress + /// Start the data reassignment + /// User ID whose data will be reassigned to another user + /// User ID to whom all the data will be reassigned + /// Specifies whether to delete a profile when the data reassignment will be finished or not + /// User data + /// Reassignment progress + /// api/2.0/people/reassign/start + /// POST [Create(@"reassign/start")] public ReassignProgressItem StartReassign(Guid fromUserId, Guid toUserId, bool deleteProfile) { @@ -1696,12 +1713,14 @@ private void CheckReassignProccess(IEnumerable userIds) #region Remove user data /// - /// Returns the progress of the started removing process for the user with the ID specified in the request. + /// Returns the progress of the started data deletion for the user with the ID specified in the request. /// - /// Get the removing progress - /// User ID - /// Remove user data - /// Removing progress + /// Get the deletion progress + /// User ID + /// User data + /// Deletion progress + /// api/2.0/people/remove/progress + /// GET [Read(@"remove/progress")] public RemoveProgressItem GetRemoveProgress(Guid userId) { @@ -1711,11 +1730,14 @@ public RemoveProgressItem GetRemoveProgress(Guid userId) } /// - /// Terminates the removing process for the user with the ID specified in the request. + /// Terminates the data deletion for the user with the ID specified in the request. /// - /// Terminate the removing process - /// User ID - /// Remove user data + /// Terminate the data deletion + /// User ID + /// User data + /// api/2.0/people/remove/terminate + /// PUT + /// [Update(@"remove/terminate")] public void TerminateRemove(Guid userId) { @@ -1725,12 +1747,14 @@ public void TerminateRemove(Guid userId) } /// - /// Starts the removing process for the user with the ID specified in the request. + /// Starts the data deletion for the user with the ID specified in the request. /// - /// Start the removing process - /// User ID - /// Remove user data - /// Removing progress + /// Start the data deletion + /// User ID + /// User data + /// Deletion progress + /// api/2.0/people/remove/start + /// POST [Create(@"remove/start")] public RemoveProgressItem StartRemove(Guid userId) { diff --git a/module/ASC.Api/ASC.Employee/EmployeeWraper.cs b/module/ASC.Api/ASC.Employee/EmployeeWraper.cs index 6a0e6b43e..254e5a52f 100644 --- a/module/ASC.Api/ASC.Employee/EmployeeWraper.cs +++ b/module/ASC.Api/ASC.Employee/EmployeeWraper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -49,22 +49,44 @@ public EmployeeWraper(UserInfo userInfo, ApiContext context) if (EmployeeWraperFull.CheckContext(context, "avatarSmall")) { - AvatarSmall = UserPhotoManager.GetSmallPhotoURL(userInfo.ID) + "?_=" + userInfo.LastModified.GetHashCode(); + var smallPhotoUrl = UserPhotoManager.GetSmallPhotoURL(userInfo.ID); + + AvatarSmall = GetParametrizedPhotoUrl(smallPhotoUrl, userInfo); } } + internal string GetParametrizedPhotoUrl(string photoUrl, UserInfo userInfo) + { + if (!UserPhotoManager.IsDeafaultPhoto(photoUrl)) + { + photoUrl += "?_=" + userInfo.LastModified.GetHashCode(); + } + + return photoUrl; + } + + ///00000000-0000-0000-0000-000000000000 + ///1 [DataMember(Order = 1)] public Guid Id { get; set; } + ///Mike Zanyatski + ///10 [DataMember(Order = 10)] public string DisplayName { get; set; } + ///Manager + ///11 [DataMember(Order = 11, EmitDefaultValue = false)] public string Title { get; set; } + ///url to small avatar + ///20 [DataMember(Order = 20)] public string AvatarSmall { get; set; } + ///\/Products\/People\/Profile.aspx?user=administrator + ///30 [DataMember(Order = 30)] public string ProfileUrl { diff --git a/module/ASC.Api/ASC.Employee/EmployeeWraperFull.cs b/module/ASC.Api/ASC.Employee/EmployeeWraperFull.cs index 0c46a25cb..b4b36156b 100644 --- a/module/ASC.Api/ASC.Employee/EmployeeWraperFull.cs +++ b/module/ASC.Api/ASC.Employee/EmployeeWraperFull.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,94 +22,169 @@ using ASC.Api.Impl; using ASC.Core; +using ASC.Core.Tenants; using ASC.Core.Users; using ASC.Specific; +using ASC.Web.Core; using ASC.Web.Core.Users; namespace ASC.Api.Employee { + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee [DataContract(Name = "person", Namespace = "")] public class EmployeeWraperFull : EmployeeWraper { + ///Mike + ///10 [DataMember(Order = 10)] public string FirstName { get; set; } + ///Zanyatski + ///10 [DataMember(Order = 10)] public string LastName { get; set; } + ///Mike.Zanyatski + ///2 [DataMember(Order = 2)] public string UserName { get; set; } + ///my@domain.com + ///10 [DataMember(Order = 10)] public string Email { get; set; } + ///ASC.Api.Employee.Contact, ASC.Api.Employee + ///12 [DataMember(Order = 12, EmitDefaultValue = false)] protected List Contacts { get; set; } + ///2008-04-10T06-30-00.000Z + ///10 [DataMember(Order = 10, EmitDefaultValue = false)] public ApiDateTime Birthday { get; set; } + ///male + ///10 [DataMember(Order = 10, EmitDefaultValue = false)] public string Sex { get; set; } + ///1 + ///10 [DataMember(Order = 10)] public EmployeeStatus Status { get; set; } + ///0 + ///10 [DataMember(Order = 10)] public EmployeeActivationStatus ActivationStatus { get; set; } + ///2008-04-10T06-30-00.000Z + ///10 [DataMember(Order = 10)] public ApiDateTime Terminated { get; set; } + ///Marketing + ///10 [DataMember(Order = 10, EmitDefaultValue = false)] public string Department { get; set; } + ///2008-04-10T06-30-00.000Z + ///10 [DataMember(Order = 10, EmitDefaultValue = false)] public ApiDateTime WorkFrom { get; set; } + ///ASC.Api.Employee.GroupWrapperSummary, ASC.Api.Employee + ///20 [DataMember(Order = 20, EmitDefaultValue = false)] public List Groups { get; set; } + ///Palo Alto + ///10 [DataMember(Order = 10, EmitDefaultValue = false)] public string Location { get; set; } + ///Notes to worker + ///10 [DataMember(Order = 10, EmitDefaultValue = false)] public string Notes { get; set; } + ///055312F1-1D71-4786-BB5B-D5910316E53C + ///20 + [DataMember(Order = 10, EmitDefaultValue = false)] + public Guid Lead { get; set; } + + ///url to medium avatar + ///20 [DataMember(Order = 20)] public string AvatarMedium { get; set; } + ///url to big avatar + ///20 [DataMember(Order = 20)] public string Avatar { get; set; } + ///false + ///20 [DataMember(Order = 20)] public bool IsAdmin { get; set; } + ///false + ///20 [DataMember(Order = 20)] public bool IsLDAP { get; set; } + ///projects,crm + ///20 + ///list [DataMember(Order = 20, EmitDefaultValue = false)] public List ListAdminModules { get; set; } + ///false + ///20 [DataMember(Order = 20)] public bool IsOwner { get; set; } + ///false + ///2 [DataMember(Order = 2)] public bool IsVisitor { get; set; } + ///en-EN + ///20 [DataMember(Order = 20, EmitDefaultValue = false)] public string CultureName { get; set; } - + ///MobilePhone + ///11 [DataMember(Order = 11, EmitDefaultValue = false)] protected String MobilePhone { get; set; } + ///1 + ///11 [DataMember(Order = 11, EmitDefaultValue = false)] protected MobilePhoneActivationStatus MobilePhoneActivationStatus { get; set; } + ///false + ///20 [DataMember(Order = 20)] public bool IsSSO { get; set; } + [DataMember(Order = 21)] + public long QuotaLimit { get; set; } + + [DataMember(Order = 22)] + public long UsedSpace { get; set; } + + [DataMember(Order = 22)] + public long DocsSpace { get; set; } + + [DataMember(Order = 22)] + public long MailSpace { get; set; } + + [DataMember(Order = 22)] + public long TalkSpace { get; set; } + public EmployeeWraperFull() { } @@ -147,6 +222,11 @@ public EmployeeWraperFull(UserInfo userInfo, ApiContext context) Notes = userInfo.Notes; } + if (userInfo.Lead.HasValue) + { + Lead = userInfo.Lead.Value; + } + MobilePhoneActivationStatus = userInfo.MobilePhoneActivationStatus; if (!string.IsNullOrEmpty(userInfo.CultureName)) @@ -183,12 +263,16 @@ public EmployeeWraperFull(UserInfo userInfo, ApiContext context) if (CheckContext(context, "avatarMedium")) { - AvatarMedium = UserPhotoManager.GetMediumPhotoURL(userInfo.ID) + "?_=" + userInfo.LastModified.GetHashCode(); + var mediumPhotUrl = UserPhotoManager.GetMediumPhotoURL(userInfo.ID); + + AvatarMedium = GetParametrizedPhotoUrl(mediumPhotUrl, userInfo); } if (CheckContext(context, "avatar")) { - Avatar = UserPhotoManager.GetBigPhotoURL(userInfo.ID) + "?_=" + userInfo.LastModified.GetHashCode(); + var bigPhotUrl = UserPhotoManager.GetBigPhotoURL(userInfo.ID); + + Avatar = GetParametrizedPhotoUrl(bigPhotUrl, userInfo); } IsAdmin = userInfo.IsAdmin(); @@ -205,6 +289,51 @@ public EmployeeWraperFull(UserInfo userInfo, ApiContext context) IsLDAP = userInfo.IsLDAP(); IsSSO = userInfo.IsSSO(); + + IEnumerable userQuotaRows; + var useCache = !CheckContext(context, "doNotUseCache"); + if (context != null && CheckContext(context, "usedSpace")) + { + userQuotaRows = CoreContext.TenantManager.FindUserQuotaRows(CoreContext.TenantManager.GetCurrentTenant().TenantId, userInfo.ID, useCache).Where(r => !string.IsNullOrEmpty(r.Tag)).Where(r => r.Tag != Guid.Empty.ToString()); + UsedSpace = Math.Max(0, userQuotaRows.Sum(r => r.Counter)); + + if (userQuotaRows != null) + { + var MAIL_QUOTA_TAG = "666ceac1-4532-4f8c-9cba-8f510eca2fd1"; + foreach (var userQuotaRow in userQuotaRows) + { + if (userQuotaRow.Tag == WebItemManager.DocumentsProductID.ToString()) + { + DocsSpace = userQuotaRow.Counter; + } + + if (userQuotaRow.Tag == MAIL_QUOTA_TAG) + { + MailSpace = userQuotaRow.Counter; + } + + if (userQuotaRow.Tag == WebItemManager.TalkProductID.ToString()) + { + TalkSpace= userQuotaRow.Counter; + } + } + } + } + + if (context != null && CheckContext(context, "quotaLimit")) + { + var quotaSettings = TenantUserQuotaSettings.Load(); + if (quotaSettings.EnableUserQuota) + { + var userQuotaSettings = UserQuotaSettings.LoadForUser(userInfo.ID); + QuotaLimit = userQuotaSettings != null ? userQuotaSettings.UserQuota : quotaSettings.DefaultUserQuota; + } + else + { + QuotaLimit = -1; + } + } + } private void FillConacts(UserInfo userInfo) @@ -269,6 +398,7 @@ public static EmployeeWraperFull GetFull(UserInfo userInfo) Department = "Marketing", Location = "Palo Alto", Notes = "Notes to worker", + Lead = Guid.Empty, Sex = "male", Status = EmployeeStatus.Active, WorkFrom = ApiDateTime.GetSample(), diff --git a/module/ASC.Api/ASC.Employee/GroupWrapperFull.cs b/module/ASC.Api/ASC.Employee/GroupWrapperFull.cs index ad8b7fa65..f541e0043 100644 --- a/module/ASC.Api/ASC.Employee/GroupWrapperFull.cs +++ b/module/ASC.Api/ASC.Employee/GroupWrapperFull.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,25 +44,39 @@ public GroupWrapperFull(GroupInfo group, bool includeMembers) private GroupWrapperFull() { } - + ///Description + ///5 [DataMember(Order = 5)] public string Description { get; set; } + ///Sample group + ///2 [DataMember(Order = 2)] public string Name { get; set; } + ///852d4b63-997a-4bae-aa7b-89bb87d85dbf + ///4 [DataMember(Order = 4, EmitDefaultValue = true)] public Guid? Parent { get; set; } + ///74f31a85-991b-4e9b-b9e8-ae8e80d468f5 + ///3 [DataMember(Order = 3)] public Guid Category { get; set; } + ///fadd9f49-2431-4610-a518-3ca9b3843c88 + ///1 [DataMember(Order = 1)] public Guid Id { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///9 [DataMember(Order = 9, EmitDefaultValue = true)] public EmployeeWraper Manager { get; set; } + ///ASC.Api.Employee.EmployeeWraper, ASC.Api.Employee + ///10 + ///list [DataMember(Order = 10, EmitDefaultValue = false)] public List Members { get; set; } diff --git a/module/ASC.Api/ASC.Employee/GroupWrapperSummary.cs b/module/ASC.Api/ASC.Employee/GroupWrapperSummary.cs index 382a5416a..2d57423ac 100644 --- a/module/ASC.Api/ASC.Employee/GroupWrapperSummary.cs +++ b/module/ASC.Api/ASC.Employee/GroupWrapperSummary.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,13 +37,18 @@ protected GroupWrapperSummary() { } - + ///Group Name + ///2 [DataMember(Order = 2)] public string Name { get; set; } + ///00000000-0000-0000-0000-000000000000 + ///1 [DataMember(Order = 1)] public Guid Id { get; set; } + ///Jake.Zazhitski + ///9 [DataMember(Order = 9, EmitDefaultValue = true)] public string Manager { get; set; } diff --git a/module/ASC.Api/ASC.Employee/GroupsApi.cs b/module/ASC.Api/ASC.Employee/GroupsApi.cs index 877d25e5a..13412f020 100644 --- a/module/ASC.Api/ASC.Employee/GroupsApi.cs +++ b/module/ASC.Api/ASC.Employee/GroupsApi.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,8 +32,9 @@ namespace ASC.Api.Employee { /// - /// Access to the groups. + /// Groups API. /// + ///group public class GroupsApi : IApiEntryPoint { public string Name @@ -54,12 +55,15 @@ private static HttpRequest Request ///Returns the general information about all the groups, such as group ID and group manager. /// /// - ///Get all groups + ///Get groups /// - ///List of groups + ///List of groups /// /// This method returns partial group information. /// + /// api/2.0/group + /// GET + /// list [Read("")] public IEnumerable GetAll() { @@ -72,8 +76,11 @@ public IEnumerable GetAll() /// ///Get groups by a group name /// - ///Group name + ///Group name ///List of groups + ///api/2.0/group/search + /// GET + /// list [Read("search")] public IEnumerable GetTagsByName(string groupName) { @@ -87,16 +94,18 @@ public IEnumerable GetTagsByName(string groupName) } /// - ///Returns the detailed information about the selected group: group name, category, description, manager, members and parent group if it exists. + ///Returns the detailed information about the selected group: group name, category, description, manager, members, and parent group if it exists. /// /// ///Get a group /// - ///Group ID - ///Group + ///Group ID + ///Group /// - /// That method returns full group information. + /// This method returns full group information. /// + /// api/2.0/group/{groupid} + /// GET [Read("{groupid}")] public GroupWrapperFull GetById(Guid groupid) { @@ -109,8 +118,11 @@ public GroupWrapperFull GetById(Guid groupid) /// ///Get user groups /// - ///User ID - ///Group + ///User ID + ///Group + /// api/2.0/group/user/{userid} + /// GET + /// list [Read("user/{userid}")] public IEnumerable GetByUserId(Guid userid) { @@ -118,15 +130,17 @@ public IEnumerable GetByUserId(Guid userid) } /// - /// Adds a new group with the group manager, name and members specified in the request. + /// Adds a new group with the group manager, name, and members specified in the request. /// /// /// Add a new group /// - /// Group manager - /// Group name - /// List of group members - /// Newly created group + /// Group manager + /// Group name + /// List of group members + /// Newly created group + /// api/2.0/group + /// POST [Create("")] public GroupWrapperFull AddGroup(Guid groupManager, string groupName, IEnumerable members) { @@ -149,16 +163,18 @@ public GroupWrapperFull AddGroup(Guid groupManager, string groupName, IEnumerabl } /// - /// Updates the existing group changing the group manager, name and/or members. + /// Updates the existing group changing the group manager, name, and/or members. /// /// /// Update a group /// - /// Group ID - /// New group manager - /// New group name - /// New list of group members - /// Updated group + /// Group ID + /// New group manager + /// New group name + /// New list of group members + /// Updated group + /// api/2.0/group/{groupid} + /// PUT [Update("{groupid}")] public GroupWrapperFull UpdateGroup(Guid groupid, Guid groupManager, string groupName, IEnumerable members) { @@ -194,8 +210,10 @@ public GroupWrapperFull UpdateGroup(Guid groupid, Guid groupManager, string grou /// /// Delete a group /// - /// Group ID - /// Group + /// Group ID + /// Group + /// api/2.0/group/{groupid} + /// DELETE [Delete("{groupid}")] public GroupWrapperFull DeleteGroup(Guid groupid) { @@ -226,9 +244,11 @@ private static GroupInfo GetGroupInfo(Guid groupid) /// /// Move group members /// - /// Group ID to move from - /// Group ID to move to - /// New group information + /// Group ID to move from + /// Group ID to move to + /// New group information + /// api/2.0/group/{groupid}/members/{newgroupid} + /// PUT [Update("{groupid}/members/{newgroupid}")] public GroupWrapperFull TransferMembersTo(Guid groupid, Guid newgroupid) { @@ -246,14 +266,16 @@ public GroupWrapperFull TransferMembersTo(Guid groupid, Guid newgroupid) } /// - /// Manages the group members deleting the current members and setting new ones specified in the request instead. + /// Replaces the group members with those specified in the request. /// /// - /// Set group members + /// Replace group members /// - /// Group ID - /// List of new members - /// Group information + /// Group ID + /// List of new members + /// Group information + /// api/2.0/group/{groupid}/members + /// POST [Create("{groupid}/members")] public GroupWrapperFull SetMembersTo(Guid groupid, IEnumerable members) { @@ -263,14 +285,16 @@ public GroupWrapperFull SetMembersTo(Guid groupid, IEnumerable members) } /// - /// Manages the group members keeping the current members and adding new ones specified in the request instead. + /// Adds new group members to the group with the ID specified in the request. /// /// /// Add group members /// - /// Group ID - /// List of new members - /// Group information + /// Group ID + /// List of new members + /// Group information + /// api/2.0/group/{groupid}/members + /// PUT [Update("{groupid}/members")] public GroupWrapperFull AddMembersTo(Guid groupid, IEnumerable members) { @@ -285,14 +309,16 @@ public GroupWrapperFull AddMembersTo(Guid groupid, IEnumerable members) } /// - /// Sets a user with the ID specified in the request as a manager. + /// Sets a user with the ID specified in the request as a group manager. /// /// /// Set a group manager /// - /// Group ID - /// User ID - /// Group information + /// Group ID + /// User ID + /// Group information + /// api/2.0/group/{groupid}/manager + /// PUT /// [Update("{groupid}/manager")] public GroupWrapperFull SetManager(Guid groupid, Guid userid) @@ -315,9 +341,11 @@ public GroupWrapperFull SetManager(Guid groupid, Guid userid) /// /// Remove group members /// - /// Group ID - /// List of members - /// Group information + /// Group ID + /// List of group members + /// api/2.0/group/{groupid}/members + /// DELETE + /// Group information [Delete("{groupid}/members")] public GroupWrapperFull RemoveMembersFrom(Guid groupid, IEnumerable members) { diff --git a/module/ASC.Api/ASC.Employee/ThumbnailsDataWrapper.cs b/module/ASC.Api/ASC.Employee/ThumbnailsDataWrapper.cs index 598f0cfc8..becef1f1d 100644 --- a/module/ASC.Api/ASC.Employee/ThumbnailsDataWrapper.cs +++ b/module/ASC.Api/ASC.Employee/ThumbnailsDataWrapper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Runtime.Serialization; @@ -38,22 +38,27 @@ public ThumbnailsDataWrapper(Guid userId) private ThumbnailsDataWrapper() { } - + ///default_user_photo_size_1280-1280.png [DataMember] public string Original { get; set; } + ///default_user_photo_size_360-360.png [DataMember] public string Retina { get; set; } + ///default_user_photo_size_200-200.png [DataMember] public string Max { get; set; } + ///default_user_photo_size_82-82.png [DataMember] public string Big { get; set; } + ///"default_user_photo_size_48-48.png [DataMember] public string Medium { get; set; } + ///default_user_photo_size_32-32.png [DataMember] public string Small { get; set; } diff --git a/module/ASC.Api/ASC.Specific/ASC.Specific.csproj b/module/ASC.Api/ASC.Specific/ASC.Specific.csproj index 739770cb1..5f35e47d8 100644 --- a/module/ASC.Api/ASC.Specific/ASC.Specific.csproj +++ b/module/ASC.Api/ASC.Specific/ASC.Specific.csproj @@ -122,6 +122,7 @@ + diff --git a/module/ASC.Api/ASC.Specific/ASCBasicAuthorization.cs b/module/ASC.Api/ASC.Specific/ASCBasicAuthorization.cs index def954ae3..48d1296b7 100644 --- a/module/ASC.Api/ASC.Specific/ASCBasicAuthorization.cs +++ b/module/ASC.Api/ASC.Specific/ASCBasicAuthorization.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Specific/ASCBearerAuthorization.cs b/module/ASC.Api/ASC.Specific/ASCBearerAuthorization.cs index 1eea9ffe1..72de59d71 100644 --- a/module/ASC.Api/ASC.Specific/ASCBearerAuthorization.cs +++ b/module/ASC.Api/ASC.Specific/ASCBearerAuthorization.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Net; using System.Web; diff --git a/module/ASC.Api/ASC.Specific/ASCCookieAuthorization.cs b/module/ASC.Api/ASC.Specific/ASCCookieAuthorization.cs index 3e50287a0..3172f9a03 100644 --- a/module/ASC.Api/ASC.Specific/ASCCookieAuthorization.cs +++ b/module/ASC.Api/ASC.Specific/ASCCookieAuthorization.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Specific/AntiXssParamInspector.cs b/module/ASC.Api/ASC.Specific/AntiXssParamInspector.cs index 71b1d41a3..5aac3f2f2 100644 --- a/module/ASC.Api/ASC.Specific/AntiXssParamInspector.cs +++ b/module/ASC.Api/ASC.Specific/AntiXssParamInspector.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Specific/ApiDateTime.cs b/module/ASC.Api/ASC.Specific/ApiDateTime.cs index 6a30696de..f71321f26 100644 --- a/module/ASC.Api/ASC.Specific/ApiDateTime.cs +++ b/module/ASC.Api/ASC.Specific/ApiDateTime.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Specific/AscApiConfiguration.cs b/module/ASC.Api/ASC.Specific/AscApiConfiguration.cs index 101a94be9..605d71ec9 100644 --- a/module/ASC.Api/ASC.Specific/AscApiConfiguration.cs +++ b/module/ASC.Api/ASC.Specific/AscApiConfiguration.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Specific/AuthorizationApi/AuthenticationEntryPoint.cs b/module/ASC.Api/ASC.Specific/AuthorizationApi/AuthenticationEntryPoint.cs index 317e34278..3c493ee60 100644 --- a/module/ASC.Api/ASC.Specific/AuthorizationApi/AuthenticationEntryPoint.cs +++ b/module/ASC.Api/ASC.Specific/AuthorizationApi/AuthenticationEntryPoint.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ using System; -using System.Globalization; using System.Security; using System.Security.Authentication; using System.Threading; @@ -35,7 +34,6 @@ using ASC.Core; using ASC.Core.Tenants; using ASC.Core.Users; -using ASC.FederatedLogin.Helpers; using ASC.FederatedLogin.LoginProviders; using ASC.IPSecurity; using ASC.MessagingSystem; @@ -57,8 +55,9 @@ namespace ASC.Specific.AuthorizationApi { /// - /// Authorization for api. + /// Authorization API. /// + /// authentication public class AuthenticationEntryPoint : IApiEntryPoint { private static readonly ICache Cache = AscCache.Memory; @@ -79,25 +78,26 @@ private static HttpRequest Request } /// - /// Returns the authentication token for use in api authorization. + /// Authenticates the current user by SMS, authenticator app, or without two-factor authentication. /// - /// - /// Get the authentication token - /// - /// User name or email - /// Password - /// Social media provider type - /// Provider token - /// Code for take token - /// Authentication token to use in the 'Authorization' header when calling API methods - /// Thrown when not authenticated. - [Create(@"", false, false)] //NOTE: This method doesn't require auth!!! //NOTE: This method doesn't check payment!!! + /// Authenticate a user + /// User name or email + /// Password + /// Social media provider type + /// Provider token + /// Code for getting a token + /// POST + /// api/2.0/authentication + /// Authentication token to use in the 'Authorization' header when calling API methods + /// Thrown when not authenticated + /// false + [Create(@"", false, false)] //NOTE: this method doesn't require auth!!! //NOTE: this method doesn't check payment!!! public AuthenticationTokenData AuthenticateMe(string userName, string password, string provider, string accessToken, string codeOAuth) { bool viaEmail; var user = GetUser(userName, password, provider, accessToken, out viaEmail, codeOAuth); - if (StudioSmsNotificationSettings.IsVisibleAndAvailableSettings && StudioSmsNotificationSettings.Enable) + if (StudioSmsNotificationSettings.IsVisibleAndAvailableSettings && StudioSmsNotificationSettings.TfaEnabledForUser(user.ID)) { if (string.IsNullOrEmpty(user.MobilePhone) || user.MobilePhoneActivationStatus == MobilePhoneActivationStatus.NotActivated) return new AuthenticationTokenData @@ -115,7 +115,7 @@ public AuthenticationTokenData AuthenticateMe(string userName, string password, }; } - if (TfaAppAuthSettings.IsVisibleSettings && TfaAppAuthSettings.Enable) + if (TfaAppAuthSettings.IsVisibleSettings && TfaAppAuthSettings.TfaEnabledForUser(user.ID)) { if (!TfaAppUserSettings.EnableForUser(user.ID)) return new AuthenticationTokenData @@ -159,12 +159,15 @@ public AuthenticationTokenData AuthenticateMe(string userName, string password, /// Sets a mobile phone for the user with the name specified in the request. /// /// Set a mobile phone - /// User name or email - /// Password - /// Social media provider type - /// Provider token - /// New mobile phone - /// Mobile phone + /// User name or email + /// Password + /// Social media provider type + /// Provider token + /// New mobile phone + /// POST + /// api/2.0/authentication/setphone + /// Authentication data: authentication by SMS or not, phone number, SMS expiration time + /// false [Create(@"setphone", false, false)] //NOTE: This method doesn't require auth!!! //NOTE: This method doesn't check payment!!! public AuthenticationTokenData SaveMobilePhone(string userName, string password, string provider, string accessToken, string mobilePhone) { @@ -182,14 +185,17 @@ public AuthenticationTokenData SaveMobilePhone(string userName, string password, } /// - /// Sends sms with the authentication code. + /// Sends SMS with an authentication code. /// - /// Send sms code - /// User name or email - /// Password - /// Social media provider type - /// Provider token - /// Mobile phone + /// Send SMS code + /// User name or email + /// Password + /// Social media provider type + /// Provider token + /// POST + /// api/2.0/authentication/sendsms + /// Authentication data: authentication by SMS or not, phone number, SMS expiration time + /// false [Create(@"sendsms", false, false)] //NOTE: This method doesn't require auth!!! //NOTE: This method doesn't check payment!!! public AuthenticationTokenData SendSmsCode(string userName, string password, string provider, string accessToken) { @@ -206,18 +212,21 @@ public AuthenticationTokenData SendSmsCode(string userName, string password, str } /// - /// Returns the two-factor authentication token for use in api authorization. + /// Authenticates the current user by SMS or two-factor authentication code. /// /// - /// Get the two-factor authentication token + /// Authenticate a user by code /// - /// User name or email - /// Password - /// Social media provider type - /// Provider token - /// Two-factor authentication code - /// Code for take token - /// Two-factor authentication token to use in 'Authorization' header when calling API methods + /// User name or email + /// Password + /// Social media provider type + /// Provider token + /// Two-factor authentication code + /// Code for getting a token + /// POST + /// api/2.0/authentication/{code} + /// false + /// Two-factor authentication token to use in the 'Authorization' header when calling API methods [Create(@"{code}", false, false)] //NOTE: This method doesn't require auth!!! //NOTE: This method doesn't check payment!!! public AuthenticationTokenData AuthenticateMe(string userName, string password, string provider, string accessToken, string code, string codeOAuth) { @@ -227,12 +236,12 @@ public AuthenticationTokenData AuthenticateMe(string userName, string password, var sms = false; try { - if (StudioSmsNotificationSettings.IsVisibleAndAvailableSettings && StudioSmsNotificationSettings.Enable) + if (StudioSmsNotificationSettings.IsVisibleAndAvailableSettings && StudioSmsNotificationSettings.TfaEnabledForUser(user.ID)) { sms = true; SmsManager.ValidateSmsCode(user, code, true); } - else if (TfaAppAuthSettings.IsVisibleSettings && TfaAppAuthSettings.Enable) + else if (TfaAppAuthSettings.IsVisibleSettings && TfaAppAuthSettings.TfaEnabledForUser(user.ID)) { if (user.ValidateAuthCode(code, true, true)) { @@ -281,13 +290,16 @@ public AuthenticationTokenData AuthenticateMe(string userName, string password, } /// - /// Requests an invitation by email on personal.onlyoffice.com. + /// Requests an email invitation from personal.onlyoffice.com. /// /// Register a user on the Personal portal - /// Email address - /// Culture - /// User consent to subscribe to the ONLYOFFICE newsletter - /// ReCAPTCHA token + /// Email address + /// Culture + /// User consent to subscribe to the ONLYOFFICE newsletter + /// ReCAPTCHA token + /// POST + /// api/2.0/authentication/register + /// false /// false [Create(@"register", false)] //NOTE: This method doesn't require auth!!! public string RegisterUserOnPersonal(string email, string lang, bool spam, string recaptchaResponse) @@ -345,7 +357,7 @@ public string RegisterUserOnPersonal(string email, string lang, bool spam, strin try { const string _databaseID = "com"; - using (var db = DbManager.FromHttpContext(_databaseID)) + using (var db = new DbManager(_databaseID)) { db.ExecuteNonQuery(new SqlInsert("template_unsubscribe", false) .InColumnValue("email", email.ToLowerInvariant()) @@ -369,13 +381,16 @@ public string RegisterUserOnPersonal(string email, string lang, bool spam, strin } /// - /// Checks user name and password when logging. + /// Checks the username and password when logging in. /// /// Log in - /// User name or email - /// Password - /// Email key + /// Username or email + /// Password + /// Email key /// Thrown when not authenticated. + /// POST + /// api/2.0/authentication/login + /// false /// false [Create(@"login", false, false)] //NOTE: This method doesn't require auth!!! //NOTE: This method doesn't check payment!!! public bool AuthenticateMe(string userName, string password, string key) @@ -394,6 +409,7 @@ private static UserInfo GetUser(string userName, string password, string provide viaEmail = true; var action = MessageAction.LoginFailViaApi; UserInfo user = null; + try { if (string.IsNullOrEmpty(provider) || provider == "email") @@ -401,13 +417,15 @@ private static UserInfo GetUser(string userName, string password, string provide userName.ThrowIfNull(new ArgumentException(@"userName empty", "userName")); password.ThrowIfNull(new ArgumentException(@"password empty", "password")); - int counter; - int.TryParse(Cache.Get("loginsec/" + userName), out counter); - if (++counter > SetupInfo.LoginThreshold && !SetupInfo.IsSecretEmail(userName)) + var secretEmail = SetupInfo.IsSecretEmail(userName); + var requestIp = MessageSettings.GetFullIPAddress(Request); + var bruteForceLoginManager = new BruteForceLoginManager(Cache, userName, requestIp); + var bruteForceSuccessAttempt = bruteForceLoginManager.Increment(out bool _); + + if (!secretEmail && !bruteForceSuccessAttempt) { throw new Authorize.BruteForceCredentialException(); } - Cache.Insert("loginsec/" + userName, counter.ToString(CultureInfo.InvariantCulture), DateTime.UtcNow.Add(TimeSpan.FromMinutes(1))); if (EnableLdap) { @@ -431,7 +449,10 @@ private static UserInfo GetUser(string userName, string password, string provide throw new Exception("user not found"); } - Cache.Insert("loginsec/" + userName, (--counter).ToString(CultureInfo.InvariantCulture), DateTime.UtcNow.Add(TimeSpan.FromMinutes(1))); + if (!secretEmail) + { + bruteForceLoginManager.Decrement(); + } } else { @@ -462,7 +483,7 @@ private static UserInfo GetUser(string userName, string password, string provide var tenant = CoreContext.TenantManager.GetCurrentTenant(); var settings = IPRestrictionsSettings.Load(); - if (settings.Enable && user.ID != tenant.OwnerId && !IPSecurity.IPSecurity.Verify(tenant)) + if (settings.Enable && user.ID != tenant.OwnerId && !IPSecurity.IPSecurity.Verify(tenant, user.Email)) { throw new IPSecurityException(); } diff --git a/module/ASC.Api/ASC.Specific/AuthorizationApi/AuthenticationTokenData.cs b/module/ASC.Api/ASC.Specific/AuthorizationApi/AuthenticationTokenData.cs index d43fd5055..b2401006b 100644 --- a/module/ASC.Api/ASC.Specific/AuthorizationApi/AuthenticationTokenData.cs +++ b/module/ASC.Api/ASC.Specific/AuthorizationApi/AuthenticationTokenData.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,21 +22,33 @@ namespace ASC.Specific.AuthorizationApi [DataContract(Name = "token", Namespace = "")] public class AuthenticationTokenData { + /// abcde12345 + /// 1 [DataMember(Order = 1)] public string Token { get; set; } + /// 2020-11-24T05:36:20.4206897Z + /// 2 [DataMember(Order = 2, EmitDefaultValue = false)] public ApiDateTime Expires { get; set; } + /// true + /// 3 [DataMember(Order = 3, EmitDefaultValue = false)] public bool Sms { get; set; } + /// 8(999)999-99-99 + /// 4 [DataMember(Order = 4, EmitDefaultValue = false)] public string PhoneNoise { get; set; } + /// true + /// 5 [DataMember(Order = 5, EmitDefaultValue = false)] public bool Tfa { get; set; } + /// 123dwa + /// 6 [DataMember(Order = 6, EmitDefaultValue = false)] public string TfaKey { get; set; } diff --git a/module/ASC.Api/ASC.Specific/CapabilitiesApi/CapabilitiesData.cs b/module/ASC.Api/ASC.Specific/CapabilitiesApi/CapabilitiesData.cs index 4966d3b4b..79d89a254 100644 --- a/module/ASC.Api/ASC.Specific/CapabilitiesApi/CapabilitiesData.cs +++ b/module/ASC.Api/ASC.Specific/CapabilitiesApi/CapabilitiesData.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,21 +25,27 @@ namespace ASC.Specific.CapabilitiesApi [DataContract(Name = "capabilities", Namespace = "")] public class CapabilitiesData { + /// false + /// list [DataMember] public bool LdapEnabled { get; set; } + /// google,facebook,twitter,linkedin,mailru,vk,yandex,gosuslugi + /// list [DataMember] public bool OauthEnabled { get; set; } [DataMember] public List Providers { get; set; } + /// [DataMember] public string SsoLabel { get; set; } /// /// if empty sso is disabled /// + /// [DataMember] public string SsoUrl { get; set; } @@ -54,4 +60,5 @@ public static CapabilitiesData GetSample() }; } } -} \ No newline at end of file +} + diff --git a/module/ASC.Api/ASC.Specific/CapabilitiesApi/CapabilitiesEntryPoint.cs b/module/ASC.Api/ASC.Specific/CapabilitiesApi/CapabilitiesEntryPoint.cs index 1a57d03fb..cb3c20051 100644 --- a/module/ASC.Api/ASC.Specific/CapabilitiesApi/CapabilitiesEntryPoint.cs +++ b/module/ASC.Api/ASC.Specific/CapabilitiesApi/CapabilitiesEntryPoint.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,8 +37,9 @@ namespace ASC.Specific.CapabilitiesApi { /// - /// Portal capabilities for api. + /// Portal capabilities API. /// + /// capabilities public class CapabilitiesEntryPoint : IApiEntryPoint { @@ -66,8 +67,11 @@ public CapabilitiesEntryPoint(ApiContext context) /// ///Get portal capabilities /// - ///Portal capabilities - [Read("", false, false)] //NOTE: This method doesn't require auth!!! //NOTE: This method doesn't check payment!!! + ///Portal capabilities + ///api/2.0/capabilities + /// false + ///GET + [Read("", false, false)] //NOTE: this method doesn't require auth!!! //NOTE: this method doesn't check payment!!! public CapabilitiesData GetPortalCapabilities() { var result = new CapabilitiesData diff --git a/module/ASC.Api/ASC.Specific/GlobalFilters/ProductSecurityFilter.cs b/module/ASC.Api/ASC.Specific/GlobalFilters/ProductSecurityFilter.cs index d05a61ecb..74a6d45b1 100644 --- a/module/ASC.Api/ASC.Specific/GlobalFilters/ProductSecurityFilter.cs +++ b/module/ASC.Api/ASC.Specific/GlobalFilters/ProductSecurityFilter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Specific/IApiSortableDate.cs b/module/ASC.Api/ASC.Specific/IApiSortableDate.cs index 36a811ecc..83dd43053 100644 --- a/module/ASC.Api/ASC.Specific/IApiSortableDate.cs +++ b/module/ASC.Api/ASC.Specific/IApiSortableDate.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Specific/SerializationFilters/CustomSerializer.cs b/module/ASC.Api/ASC.Specific/SerializationFilters/CustomSerializer.cs index 1f38aa9b8..3507527d0 100644 --- a/module/ASC.Api/ASC.Specific/SerializationFilters/CustomSerializer.cs +++ b/module/ASC.Api/ASC.Specific/SerializationFilters/CustomSerializer.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Api/ASC.Specific/WarmupApi/WarmUpEntryPoint.cs b/module/ASC.Api/ASC.Specific/WarmupApi/WarmUpEntryPoint.cs index aa3e46894..d3c06b189 100644 --- a/module/ASC.Api/ASC.Specific/WarmupApi/WarmUpEntryPoint.cs +++ b/module/ASC.Api/ASC.Specific/WarmupApi/WarmUpEntryPoint.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,8 +27,9 @@ namespace ASC.Specific.WarmupApi public class WarmUpEntryPoint : IApiEntryPoint { /// - /// Entry point name + /// Warmup API. /// + /// warmup public string Name { get { return "warmup"; } @@ -43,8 +44,15 @@ public WarmUpEntryPoint(ApiContext context) } /// - /// Request of warmup progress + /// Returns the warmup progress. /// + /// + /// Get warmup progress + /// + /// Warmup progress + /// api/2.0/warmup/progress + /// GET + /// false /// false [Read(@"progress", false, false)] //NOTE: this method doesn't requires auth!!! public string GetWarmupProgress() @@ -59,6 +67,16 @@ public string GetWarmupProgress() } } + /// + /// Restarts the warmup process. + /// + /// + /// Restart warmup + /// + /// The "Ok" message if the operation is successful + /// api/2.0/warmup/restart + /// GET + /// false /// false [Read(@"restart", false, false)] //NOTE: this method doesn't requires auth!!! public string Restart() diff --git a/module/ASC.AuditTrail/ASC.AuditTrail.csproj b/module/ASC.AuditTrail/ASC.AuditTrail.csproj index b581cf7e5..9bab10afa 100644 --- a/module/ASC.AuditTrail/ASC.AuditTrail.csproj +++ b/module/ASC.AuditTrail/ASC.AuditTrail.csproj @@ -20,6 +20,8 @@ DEBUG;TRACE prompt 4 + ..\..\web\studio\ASC.Web.Studio\bin\ASC.AuditTrail.xml + CS1591 none diff --git a/module/ASC.AuditTrail/AuditEvent.cs b/module/ASC.AuditTrail/AuditEvent.cs index 1aab3da52..a7761d7bd 100644 --- a/module/ASC.AuditTrail/AuditEvent.cs +++ b/module/ASC.AuditTrail/AuditEvent.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.MessagingSystem; namespace ASC.AuditTrail diff --git a/module/ASC.AuditTrail/AuditEventsRepository.cs b/module/ASC.AuditTrail/AuditEventsRepository.cs index 4d46782cd..0947523e6 100644 --- a/module/ASC.AuditTrail/AuditEventsRepository.cs +++ b/module/ASC.AuditTrail/AuditEventsRepository.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,7 +36,7 @@ namespace ASC.AuditTrail { public class AuditEventsRepository { - private const string dbid = "core"; + private const string dbid = "default"; private static readonly string[] auditColumns = new[] { "id", @@ -168,7 +168,7 @@ public static IEnumerable GetByFilter( } } - using (var db = DbManager.FromHttpContext(dbid)) + using (var db = new DbManager(dbid)) { return db .ExecuteList(q) @@ -208,7 +208,7 @@ public static int GetCount(int tenant, DateTime? from = null, DateTime? to = nul q.Where(Exp.Between("a.date", from.Value, to.Value)); } - using (var db = DbManager.FromHttpContext(dbid)) + using (var db = new DbManager(dbid)) { return db.ExecuteScalar(q); } diff --git a/module/ASC.AuditTrail/AuditReportResource.Designer.cs b/module/ASC.AuditTrail/AuditReportResource.Designer.cs index d610ddeca..2880eebbe 100644 --- a/module/ASC.AuditTrail/AuditReportResource.Designer.cs +++ b/module/ASC.AuditTrail/AuditReportResource.Designer.cs @@ -2022,6 +2022,24 @@ public static string HistoryEventCategoryUpdatedIcon { } } + /// + /// Looks up a localized string similar to User Impersonation, Login: {0}. + /// + public static string ImpersonateUserLogin { + get { + return ResourceManager.GetString("ImpersonateUserLogin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User Impersonation, Logout: {0}. + /// + public static string ImpersonateUserLogout { + get { + return ResourceManager.GetString("ImpersonateUserLogout", resourceCulture); + } + } + /// /// Looks up a localized string similar to Import. /// diff --git a/module/ASC.AuditTrail/AuditReportResource.resx b/module/ASC.AuditTrail/AuditReportResource.resx index 716436fa9..7857bf0b1 100644 --- a/module/ASC.AuditTrail/AuditReportResource.resx +++ b/module/ASC.AuditTrail/AuditReportResource.resx @@ -1545,4 +1545,10 @@ Website Contact Form Key Updated + + User Impersonation, Login: {0} + + + User Impersonation, Logout: {0} + \ No newline at end of file diff --git a/module/ASC.AuditTrail/LoginEvent.cs b/module/ASC.AuditTrail/LoginEvent.cs index e6d091841..2aced58ae 100644 --- a/module/ASC.AuditTrail/LoginEvent.cs +++ b/module/ASC.AuditTrail/LoginEvent.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.AuditTrail { public class LoginEvent : BaseEvent diff --git a/module/ASC.AuditTrail/LoginEventsRepository.cs b/module/ASC.AuditTrail/LoginEventsRepository.cs index 59df6407e..4168d7b3a 100644 --- a/module/ASC.AuditTrail/LoginEventsRepository.cs +++ b/module/ASC.AuditTrail/LoginEventsRepository.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,7 +34,7 @@ namespace ASC.AuditTrail.Data { public class LoginEventsRepository { - private const string auditDbId = "core"; + private const string auditDbId = "default"; private static readonly List auditColumns = new List { @@ -53,7 +53,7 @@ public class LoginEventsRepository private static IDbManager GetDbManager() { - return DbManager.FromHttpContext(auditDbId); + return new DbManager(auditDbId); } public static int GetCount(int tenant, DateTime? from = null, DateTime? to = null) diff --git a/module/ASC.AuditTrail/Mappers/AuditActionMapper.cs b/module/ASC.AuditTrail/Mappers/AuditActionMapper.cs index 0c90ffe3f..a931bc9f5 100644 --- a/module/ASC.AuditTrail/Mappers/AuditActionMapper.cs +++ b/module/ASC.AuditTrail/Mappers/AuditActionMapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.AuditTrail/Mappers/CrmActionMapper.cs b/module/ASC.AuditTrail/Mappers/CrmActionMapper.cs index d7f87694b..60f7b69ec 100644 --- a/module/ASC.AuditTrail/Mappers/CrmActionMapper.cs +++ b/module/ASC.AuditTrail/Mappers/CrmActionMapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.AuditTrail/Mappers/DocumentsActionMapper.cs b/module/ASC.AuditTrail/Mappers/DocumentsActionMapper.cs index 47b77f679..551d6a341 100644 --- a/module/ASC.AuditTrail/Mappers/DocumentsActionMapper.cs +++ b/module/ASC.AuditTrail/Mappers/DocumentsActionMapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.AuditTrail/Mappers/IModuleActionMapper.cs b/module/ASC.AuditTrail/Mappers/IModuleActionMapper.cs index 15bced03b..1e60157f4 100644 --- a/module/ASC.AuditTrail/Mappers/IModuleActionMapper.cs +++ b/module/ASC.AuditTrail/Mappers/IModuleActionMapper.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System.Collections.Generic; using ASC.AuditTrail.Types; using ASC.MessagingSystem; diff --git a/module/ASC.AuditTrail/Mappers/IProductActionMapper.cs b/module/ASC.AuditTrail/Mappers/IProductActionMapper.cs index 55c89628a..7317fcdd4 100644 --- a/module/ASC.AuditTrail/Mappers/IProductActionMapper.cs +++ b/module/ASC.AuditTrail/Mappers/IProductActionMapper.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System.Collections.Generic; using ASC.AuditTrail.Types; diff --git a/module/ASC.AuditTrail/Mappers/LoginActionMapper.cs b/module/ASC.AuditTrail/Mappers/LoginActionMapper.cs index cc8b262f0..eb9e81b88 100644 --- a/module/ASC.AuditTrail/Mappers/LoginActionMapper.cs +++ b/module/ASC.AuditTrail/Mappers/LoginActionMapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.AuditTrail/Mappers/MessageMaps.cs b/module/ASC.AuditTrail/Mappers/MessageMaps.cs index ad175e4f8..31f7f4a22 100644 --- a/module/ASC.AuditTrail/Mappers/MessageMaps.cs +++ b/module/ASC.AuditTrail/Mappers/MessageMaps.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.AuditTrail/Mappers/OthersActionMapper.cs b/module/ASC.AuditTrail/Mappers/OthersActionMapper.cs index 569fb1de9..562c28cfe 100644 --- a/module/ASC.AuditTrail/Mappers/OthersActionMapper.cs +++ b/module/ASC.AuditTrail/Mappers/OthersActionMapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,7 +48,9 @@ public OthersNoneModuleActionMapper() Actions = new MessageMapsDictionary() { - { ActionType.Send, new[] { MessageAction.ContactAdminMailSent } } + { ActionType.Send, new[] { MessageAction.ContactAdminMailSent } }, + + MessageAction.ImpersonateUserLogin, MessageAction.ImpersonateUserLogout }; } } diff --git a/module/ASC.AuditTrail/Mappers/PeopleActionMapper.cs b/module/ASC.AuditTrail/Mappers/PeopleActionMapper.cs index a40d6cb24..a6205e4e0 100644 --- a/module/ASC.AuditTrail/Mappers/PeopleActionMapper.cs +++ b/module/ASC.AuditTrail/Mappers/PeopleActionMapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.AuditTrail/Mappers/ProjectsActionMapper.cs b/module/ASC.AuditTrail/Mappers/ProjectsActionMapper.cs index 1eeea5a6b..0ddeb849a 100644 --- a/module/ASC.AuditTrail/Mappers/ProjectsActionMapper.cs +++ b/module/ASC.AuditTrail/Mappers/ProjectsActionMapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.AuditTrail/Mappers/SettingsActionMapper.cs b/module/ASC.AuditTrail/Mappers/SettingsActionMapper.cs index fed825d41..3c00cfe1f 100644 --- a/module/ASC.AuditTrail/Mappers/SettingsActionMapper.cs +++ b/module/ASC.AuditTrail/Mappers/SettingsActionMapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.AuditTrail/Types/ActionType.cs b/module/ASC.AuditTrail/Types/ActionType.cs index 20c21b9a3..fce8e8746 100644 --- a/module/ASC.AuditTrail/Types/ActionType.cs +++ b/module/ASC.AuditTrail/Types/ActionType.cs @@ -1,4 +1,21 @@ -namespace ASC.AuditTrail.Types +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +namespace ASC.AuditTrail.Types { public enum ActionType { diff --git a/module/ASC.AuditTrail/Types/EntryType.cs b/module/ASC.AuditTrail/Types/EntryType.cs index 78e97930a..dc306bc83 100644 --- a/module/ASC.AuditTrail/Types/EntryType.cs +++ b/module/ASC.AuditTrail/Types/EntryType.cs @@ -1,4 +1,21 @@ -namespace ASC.AuditTrail.Types +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +namespace ASC.AuditTrail.Types { public enum EntryType { diff --git a/module/ASC.AuditTrail/Types/ModuleType.cs b/module/ASC.AuditTrail/Types/ModuleType.cs index 4316c08e2..a007adaa6 100644 --- a/module/ASC.AuditTrail/Types/ModuleType.cs +++ b/module/ASC.AuditTrail/Types/ModuleType.cs @@ -1,4 +1,21 @@ -namespace ASC.AuditTrail.Types +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +namespace ASC.AuditTrail.Types { public enum ModuleType { diff --git a/module/ASC.AuditTrail/Types/ProductType.cs b/module/ASC.AuditTrail/Types/ProductType.cs index 6104a9b90..6b7e3db8d 100644 --- a/module/ASC.AuditTrail/Types/ProductType.cs +++ b/module/ASC.AuditTrail/Types/ProductType.cs @@ -1,4 +1,21 @@ -namespace ASC.AuditTrail.Types +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +namespace ASC.AuditTrail.Types { public enum ProductType { diff --git a/module/ASC.CdnCheck/400.js b/module/ASC.CdnCheck/400.js index 64fc6ac04..a4e22e11f 100644 --- a/module/ASC.CdnCheck/400.js +++ b/module/ASC.CdnCheck/400.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.CdnCheck/403.js b/module/ASC.CdnCheck/403.js index a7915cbc3..0c2c27e36 100644 --- a/module/ASC.CdnCheck/403.js +++ b/module/ASC.CdnCheck/403.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.CdnCheck/404.js b/module/ASC.CdnCheck/404.js index 2961e240d..18b543b7b 100644 --- a/module/ASC.CdnCheck/404.js +++ b/module/ASC.CdnCheck/404.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.CdnCheck/500.js b/module/ASC.CdnCheck/500.js index bcda69aab..ad3b6a5e4 100644 --- a/module/ASC.CdnCheck/500.js +++ b/module/ASC.CdnCheck/500.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.CdnCheck/501.js b/module/ASC.CdnCheck/501.js index 5147ba373..ae02d1243 100644 --- a/module/ASC.CdnCheck/501.js +++ b/module/ASC.CdnCheck/501.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.CdnCheck/502.js b/module/ASC.CdnCheck/502.js index 83ec5a376..643518757 100644 --- a/module/ASC.CdnCheck/502.js +++ b/module/ASC.CdnCheck/502.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.CdnCheck/503.js b/module/ASC.CdnCheck/503.js index f4428badf..afae1ca76 100644 --- a/module/ASC.CdnCheck/503.js +++ b/module/ASC.CdnCheck/503.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.CdnCheck/504.js b/module/ASC.CdnCheck/504.js index a1ce199ea..4b5cb4ada 100644 --- a/module/ASC.CdnCheck/504.js +++ b/module/ASC.CdnCheck/504.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.CdnCheck/App_Start/FilterConfig.cs b/module/ASC.CdnCheck/App_Start/FilterConfig.cs index c885bef5e..a04b37959 100644 --- a/module/ASC.CdnCheck/App_Start/FilterConfig.cs +++ b/module/ASC.CdnCheck/App_Start/FilterConfig.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.CdnCheck/App_Start/RouteConfig.cs b/module/ASC.CdnCheck/App_Start/RouteConfig.cs index f0afa605b..b2ca9cc31 100644 --- a/module/ASC.CdnCheck/App_Start/RouteConfig.cs +++ b/module/ASC.CdnCheck/App_Start/RouteConfig.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.CdnCheck/App_Start/WebApiConfig.cs b/module/ASC.CdnCheck/App_Start/WebApiConfig.cs index daf701a36..1fc23a300 100644 --- a/module/ASC.CdnCheck/App_Start/WebApiConfig.cs +++ b/module/ASC.CdnCheck/App_Start/WebApiConfig.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.CdnCheck/Controllers/CdnController.cs b/module/ASC.CdnCheck/Controllers/CdnController.cs index bea9ef4ff..e6117db42 100644 --- a/module/ASC.CdnCheck/Controllers/CdnController.cs +++ b/module/ASC.CdnCheck/Controllers/CdnController.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.CdnCheck/CorsHandler.cs b/module/ASC.CdnCheck/CorsHandler.cs index 76bc54186..d01bcb944 100644 --- a/module/ASC.CdnCheck/CorsHandler.cs +++ b/module/ASC.CdnCheck/CorsHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.CdnCheck/Global.asax.cs b/module/ASC.CdnCheck/Global.asax.cs index b44bd2674..d6f1ac85d 100644 --- a/module/ASC.CdnCheck/Global.asax.cs +++ b/module/ASC.CdnCheck/Global.asax.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Data.Reassigns/ASC.Data.Reassigns.csproj b/module/ASC.Data.Reassigns/ASC.Data.Reassigns.csproj index 9fa749497..24f9ff765 100644 --- a/module/ASC.Data.Reassigns/ASC.Data.Reassigns.csproj +++ b/module/ASC.Data.Reassigns/ASC.Data.Reassigns.csproj @@ -22,6 +22,8 @@ prompt 4 false + ..\..\web\studio\ASC.Web.Studio\bin\ASC.Data.Reassigns.xml + CS1591 none diff --git a/module/ASC.Data.Reassigns/ProgressStatus.cs b/module/ASC.Data.Reassigns/ProgressStatus.cs index dbde43c71..b0288678d 100644 --- a/module/ASC.Data.Reassigns/ProgressStatus.cs +++ b/module/ASC.Data.Reassigns/ProgressStatus.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.Data.Reassigns { public enum ProgressStatus diff --git a/module/ASC.Data.Reassigns/QueueWorker.cs b/module/ASC.Data.Reassigns/QueueWorker.cs index 84ef59197..ebdc8f22b 100644 --- a/module/ASC.Data.Reassigns/QueueWorker.cs +++ b/module/ASC.Data.Reassigns/QueueWorker.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Linq; diff --git a/module/ASC.Data.Reassigns/ReassignProgressItem.cs b/module/ASC.Data.Reassigns/ReassignProgressItem.cs index 1b90f5ee4..f98728755 100644 --- a/module/ASC.Data.Reassigns/ReassignProgressItem.cs +++ b/module/ASC.Data.Reassigns/ReassignProgressItem.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Web; @@ -49,12 +49,25 @@ public class ReassignProgressItem : IProgressItem private readonly IFileStorageService _docService; private readonly ProjectsReassign _projectsReassign; + ///123124 public object Id { get; set; } + + ///1 public object Status { get; set; } + + ///error public object Error { get; set; } + + ///55.5 public double Percentage { get; set; } + + ///false public bool IsCompleted { get; set; } + + ///f528a377-b268-4cdb-8209-91d0fa1417c2 public Guid FromUser { get { return _fromUserId; } } + + ///f528a377-b268-4cdb-8209-91d0fa1417ca public Guid ToUser { get { return _toUserId; } } public ReassignProgressItem(HttpContext context, int tenantId, Guid fromUserId, Guid toUserId, Guid currentUserId, bool deleteProfile) diff --git a/module/ASC.Data.Reassigns/RemoveProgressItem.cs b/module/ASC.Data.Reassigns/RemoveProgressItem.cs index 4c6a4f6fc..e937a468c 100644 --- a/module/ASC.Data.Reassigns/RemoveProgressItem.cs +++ b/module/ASC.Data.Reassigns/RemoveProgressItem.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Globalization; @@ -54,11 +54,23 @@ public class RemoveProgressItem : IProgressItem private readonly IFileStorageService _docService; private readonly MailGarbageEngine _mailEraser; + + ///123124 public object Id { get; set; } + + ///1 public object Status { get; set; } + + ///error public object Error { get; set; } + + ///55.5 public double Percentage { get; set; } + + ///false public bool IsCompleted { get; set; } + + ///f528a377-b268-4cdb-8209-91d0fa1417c2 public Guid FromUser { get { return _userId; } } public RemoveProgressItem(HttpContext context, int tenantId, UserInfo user, Guid currentUserId, bool notify) @@ -102,7 +114,7 @@ public void RunJob() logger.Info("deleting of data from documents"); Percentage = 25; - _docService.DeleteStorage(_userId); + _docService.DeleteStorage(_userId, _currentUserId); logger.Info("deleting of data from crm"); @@ -199,7 +211,7 @@ private void DeleteTalkStorage() if (storage != null && storage.IsDirectory(md5Hash)) { - storage.DeleteDirectory(md5Hash); + storage.DeleteDirectory(_userId, md5Hash); } } diff --git a/module/ASC.ElasticSearch/ASC.ElasticSearch.csproj b/module/ASC.ElasticSearch/ASC.ElasticSearch.csproj index 4e53f290d..13712d56b 100644 --- a/module/ASC.ElasticSearch/ASC.ElasticSearch.csproj +++ b/module/ASC.ElasticSearch/ASC.ElasticSearch.csproj @@ -20,6 +20,8 @@ DEBUG;TRACE prompt 4 + ..\..\web\studio\ASC.Web.Studio\bin\ASC.ElasticSearch.xml + CS1591 none @@ -73,6 +75,10 @@ 13.0.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module/ASC.Socket.IO.Svc/ASC.Socket.IO.Svc.csproj b/module/ASC.Socket.IO.Svc/ASC.Socket.IO.Svc.csproj index 852e49c1e..2622bbaae 100644 --- a/module/ASC.Socket.IO.Svc/ASC.Socket.IO.Svc.csproj +++ b/module/ASC.Socket.IO.Svc/ASC.Socket.IO.Svc.csproj @@ -20,6 +20,8 @@ DEBUG;TRACE prompt 4 + bin\Debug\ASC.Socket.IO.Svc.xml + CS1591 none diff --git a/module/ASC.Socket.IO.Svc/Launcher.cs b/module/ASC.Socket.IO.Svc/Launcher.cs index 375ab51d8..167a3f18c 100644 --- a/module/ASC.Socket.IO.Svc/Launcher.cs +++ b/module/ASC.Socket.IO.Svc/Launcher.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Socket.IO.Svc/SocketIOCfgSectionHandler.cs b/module/ASC.Socket.IO.Svc/SocketIOCfgSectionHandler.cs index c9cf57363..03e309f21 100644 --- a/module/ASC.Socket.IO.Svc/SocketIOCfgSectionHandler.cs +++ b/module/ASC.Socket.IO.Svc/SocketIOCfgSectionHandler.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Configuration; namespace ASC.Socket.IO.Svc diff --git a/module/ASC.Socket.IO/app/apiRequestManager.js b/module/ASC.Socket.IO/app/apiRequestManager.js index 2b5a5df97..a165d2d7a 100644 --- a/module/ASC.Socket.IO/app/apiRequestManager.js +++ b/module/ASC.Socket.IO/app/apiRequestManager.js @@ -51,6 +51,10 @@ function makeRequest(apiMethod, req, options, onSuccess){ }); } +function deleteTrailingSlash(str) { + return str.endsWith('/') ? str.slice(0, -1) : str; +} + function makeHeaders(req, options) { options.gzip = true; options.headers = {}; @@ -64,7 +68,7 @@ function makeHeaders(req, options) { xForwardedForHeader = 'x-forwarded-for'; if (req.headers[xRewriterUrlHeader]) { - options.headers[xRewriterUrlHeader] = req.headers[xRewriterUrlHeader]; + options.headers[xRewriterUrlHeader] = deleteTrailingSlash(req.headers[xRewriterUrlHeader]) + "/"; } if (req.headers[xForwardedForHeader]) { options.headers[xForwardedForHeader] = req.headers[xForwardedForHeader]; diff --git a/module/ASC.Socket.IO/app/hubs/counters.js b/module/ASC.Socket.IO/app/hubs/counters.js index 9a85c3c8b..81d2d3be2 100644 --- a/module/ASC.Socket.IO/app/hubs/counters.js +++ b/module/ASC.Socket.IO/app/hubs/counters.js @@ -165,6 +165,9 @@ module.exports = (io) => { }; function getCleanIP (ipAddress) { + if(typeof(ipAddress) == "undefined"){ + return "127.0.0.1"; + } const indexOfColon = ipAddress.indexOf(':'); if (indexOfColon === -1){ return ipAddress; diff --git a/module/ASC.Socket.IO/app/portalManager.js b/module/ASC.Socket.IO/app/portalManager.js index e9748fe3e..4edc1da8b 100644 --- a/module/ASC.Socket.IO/app/portalManager.js +++ b/module/ASC.Socket.IO/app/portalManager.js @@ -15,14 +15,7 @@ */ -const portalInternalUrl = require('../config').get("portal.internal.url") module.exports = (req) => { - if(portalInternalUrl) return portalInternalUrl; - - const xRewriterUrlInternalHeader = 'x-rewriter-url-internal'; - if (req.headers && req.headers[xRewriterUrlInternalHeader]) { - return req.headers[xRewriterUrlInternalHeader]; - } const xRewriterUrlHeader = 'x-rewriter-url'; if (req.headers && req.headers[xRewriterUrlHeader]) { diff --git a/module/ASC.Socket.IO/config/index.js b/module/ASC.Socket.IO/config/index.js index 5f289037b..148b48455 100644 --- a/module/ASC.Socket.IO/config/index.js +++ b/module/ASC.Socket.IO/config/index.js @@ -20,6 +20,8 @@ const path = require('path'); nconf.argv() .env() - .file({ file: path.join(__dirname, 'config.json') }); + .file({ file: path.join(__dirname, `config.${process.argv[2]}.json`) }); + +nconf.file("default", path.join(__dirname, "config.json")); module.exports = nconf; diff --git a/module/ASC.SsoAuth.Svc/ASC.SsoAuth.Svc.csproj b/module/ASC.SsoAuth.Svc/ASC.SsoAuth.Svc.csproj index 21153bdf3..2d51ee330 100644 --- a/module/ASC.SsoAuth.Svc/ASC.SsoAuth.Svc.csproj +++ b/module/ASC.SsoAuth.Svc/ASC.SsoAuth.Svc.csproj @@ -53,7 +53,7 @@ - 4.7.11 + 5.1.2 diff --git a/module/ASC.SsoAuth.Svc/ConfigHandler.cs b/module/ASC.SsoAuth.Svc/ConfigHandler.cs index c8ddf85fb..b63759638 100644 --- a/module/ASC.SsoAuth.Svc/ConfigHandler.cs +++ b/module/ASC.SsoAuth.Svc/ConfigHandler.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Configuration; namespace ASC.SsoAuth.Svc diff --git a/module/ASC.SsoAuth.Svc/Launcher.cs b/module/ASC.SsoAuth.Svc/Launcher.cs index dbc91c75f..f8efc7eba 100644 --- a/module/ASC.SsoAuth.Svc/Launcher.cs +++ b/module/ASC.SsoAuth.Svc/Launcher.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Configuration; using System.Diagnostics; @@ -55,7 +55,14 @@ public void Start() WorkingDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) }; - var appSettings = ConfigurationManagerExtension.AppSettings; + var appSettings = ConfigurationManagerExtension.AppSettings; + + var selfSignedCertPath = appSettings["core.self-signed-cert-path"] ?? ""; + + if (!string.IsNullOrEmpty(selfSignedCertPath)) + { + startInfo.EnvironmentVariables.Add("NODE_EXTRA_CA_CERTS", selfSignedCertPath); + } startInfo.EnvironmentVariables.Add("core.machinekey", appSettings["core.machinekey"]); startInfo.EnvironmentVariables.Add("port", cfg.Port); diff --git a/module/ASC.SsoAuth/app.js b/module/ASC.SsoAuth/app.js index 51c6eda5b..624f2ec82 100644 --- a/module/ASC.SsoAuth/app.js +++ b/module/ASC.SsoAuth/app.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + "use strict"; process.env.NODE_ENV = process.env.NODE_ENV || "development"; diff --git a/module/ASC.SsoAuth/app/fileManager.js b/module/ASC.SsoAuth/app/fileManager.js index 411473317..38307217d 100644 --- a/module/ASC.SsoAuth/app/fileManager.js +++ b/module/ASC.SsoAuth/app/fileManager.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + "use strict"; const fs = require('fs'), diff --git a/module/ASC.SsoAuth/app/middleware/saml.js b/module/ASC.SsoAuth/app/middleware/saml.js index 08e2b3665..30356730b 100644 --- a/module/ASC.SsoAuth/app/middleware/saml.js +++ b/module/ASC.SsoAuth/app/middleware/saml.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + "use strict"; module.exports = (app, config, logger) => { diff --git a/module/ASC.SsoAuth/app/model/logout.js b/module/ASC.SsoAuth/app/model/logout.js index 84330a5a7..959d0f69a 100644 --- a/module/ASC.SsoAuth/app/model/logout.js +++ b/module/ASC.SsoAuth/app/model/logout.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + "use strict"; class LogoutModel { diff --git a/module/ASC.SsoAuth/app/model/user.js b/module/ASC.SsoAuth/app/model/user.js index 2806bee67..2e8ca4744 100644 --- a/module/ASC.SsoAuth/app/model/user.js +++ b/module/ASC.SsoAuth/app/model/user.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + "use strict"; class UserModel { diff --git a/module/ASC.SsoAuth/app/routes.js b/module/ASC.SsoAuth/app/routes.js index a745fc92b..622aa724b 100644 --- a/module/ASC.SsoAuth/app/routes.js +++ b/module/ASC.SsoAuth/app/routes.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + "use strict"; module.exports = function (app, config, logger) { diff --git a/module/ASC.SsoAuth/app/utils/coder.js b/module/ASC.SsoAuth/app/utils/coder.js index 35d4bf32d..b73f47bdb 100644 --- a/module/ASC.SsoAuth/app/utils/coder.js +++ b/module/ASC.SsoAuth/app/utils/coder.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + "use strict"; const config = require("../../config").get(), diff --git a/module/ASC.SsoAuth/app/utils/converter.js b/module/ASC.SsoAuth/app/utils/converter.js index 25ac8d50e..d3fe710e8 100644 --- a/module/ASC.SsoAuth/app/utils/converter.js +++ b/module/ASC.SsoAuth/app/utils/converter.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + "use strict"; const config = require("../../config").get(); diff --git a/module/ASC.SsoAuth/app/utils/hash.js b/module/ASC.SsoAuth/app/utils/hash.js index d532dae1b..91f6e9563 100644 --- a/module/ASC.SsoAuth/app/utils/hash.js +++ b/module/ASC.SsoAuth/app/utils/hash.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + "use strict"; var Hash = function () { diff --git a/module/ASC.SsoAuth/app/utils/resolver.js b/module/ASC.SsoAuth/app/utils/resolver.js index c88a2cdff..f4462d956 100644 --- a/module/ASC.SsoAuth/app/utils/resolver.js +++ b/module/ASC.SsoAuth/app/utils/resolver.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + "use strict"; const config = require("../../config").get(), diff --git a/module/ASC.SsoAuth/config/index.js b/module/ASC.SsoAuth/config/index.js index 9e29d4125..bc4460700 100644 --- a/module/ASC.SsoAuth/config/index.js +++ b/module/ASC.SsoAuth/config/index.js @@ -1,30 +1,28 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const nconf = require("nconf"), path = require("path"), fs = require("fs"); nconf.argv() .env() - .file({ file: path.join(__dirname, "config.json") }); + .file({ file: path.join(__dirname, `config.${process.argv[2]}.json`) }); -if (nconf.get("NODE_ENV") !== "development" && fs.existsSync(path.join(__dirname, nconf.get("NODE_ENV") + ".json"))) { - nconf.file({ file: path.join(__dirname, nconf.get("NODE_ENV") + ".json") }); -} +nconf.file("default", path.join(__dirname, "config.json")); module.exports = nconf; diff --git a/module/ASC.TeamLabSvc/ASC.TeamLabSvc/ASC.TeamLabSvc.csproj b/module/ASC.TeamLabSvc/ASC.TeamLabSvc/ASC.TeamLabSvc.csproj index 0fbc1eef2..6c1a28115 100644 --- a/module/ASC.TeamLabSvc/ASC.TeamLabSvc/ASC.TeamLabSvc.csproj +++ b/module/ASC.TeamLabSvc/ASC.TeamLabSvc/ASC.TeamLabSvc.csproj @@ -44,6 +44,8 @@ prompt 4 true + bin\Debug\TeamLabSvc.xml + CS1591 none diff --git a/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Configuration/TeamLabSvcConfigurationCollection.cs b/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Configuration/TeamLabSvcConfigurationCollection.cs index 2cde6d60c..1ac25cf19 100644 --- a/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Configuration/TeamLabSvcConfigurationCollection.cs +++ b/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Configuration/TeamLabSvcConfigurationCollection.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Configuration/TeamLabSvcConfigurationElement.cs b/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Configuration/TeamLabSvcConfigurationElement.cs index daa27d240..cfc4b2c84 100644 --- a/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Configuration/TeamLabSvcConfigurationElement.cs +++ b/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Configuration/TeamLabSvcConfigurationElement.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Configuration/TeamLabSvcConfigurationSection.cs b/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Configuration/TeamLabSvcConfigurationSection.cs index 838fb93b7..4f644cca1 100644 --- a/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Configuration/TeamLabSvcConfigurationSection.cs +++ b/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Configuration/TeamLabSvcConfigurationSection.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Program.cs b/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Program.cs index 8fd36b1ce..ff6219f59 100644 --- a/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Program.cs +++ b/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Program.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Tests/TestService1.cs b/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Tests/TestService1.cs index 74d8551be..7d27c929b 100644 --- a/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Tests/TestService1.cs +++ b/module/ASC.TeamLabSvc/ASC.TeamLabSvc/Tests/TestService1.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.TelegramService/ASC.TelegramService.csproj b/module/ASC.TelegramService/ASC.TelegramService.csproj index a6c8329d0..43ba8b296 100644 --- a/module/ASC.TelegramService/ASC.TelegramService.csproj +++ b/module/ASC.TelegramService/ASC.TelegramService.csproj @@ -20,6 +20,8 @@ DEBUG;TRACE prompt 4 + bin\Debug\ASC.TelegramService.xml + CS1591 none @@ -62,14 +64,15 @@ 13.0.1 - 16.0.2 + 17.0.0 - 0.2.0 + 1.0.2 + \ No newline at end of file diff --git a/module/ASC.TelegramService/Commands/UserCommands.cs b/module/ASC.TelegramService/Commands/UserCommands.cs index d8551688f..4607eb37b 100644 --- a/module/ASC.TelegramService/Commands/UserCommands.cs +++ b/module/ASC.TelegramService/Commands/UserCommands.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Runtime.Caching; using System.Threading.Tasks; diff --git a/module/ASC.TelegramService/Core/Attributes.cs b/module/ASC.TelegramService/Core/Attributes.cs index 88b515b51..8e180c351 100644 --- a/module/ASC.TelegramService/Core/Attributes.cs +++ b/module/ASC.TelegramService/Core/Attributes.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; namespace ASC.TelegramService.Core diff --git a/module/ASC.TelegramService/Core/Core.cs b/module/ASC.TelegramService/Core/Core.cs index b29fde2dd..dec8b88dd 100644 --- a/module/ASC.TelegramService/Core/Core.cs +++ b/module/ASC.TelegramService/Core/Core.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Linq; diff --git a/module/ASC.TelegramService/Core/Parsers/GenericParsers.cs b/module/ASC.TelegramService/Core/Parsers/GenericParsers.cs index 0085792b2..f8166d362 100644 --- a/module/ASC.TelegramService/Core/Parsers/GenericParsers.cs +++ b/module/ASC.TelegramService/Core/Parsers/GenericParsers.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.TelegramService.Core.Parsers { [ParamParser(typeof(int))] diff --git a/module/ASC.TelegramService/Core/TenantTgClient.cs b/module/ASC.TelegramService/Core/TenantTgClient.cs index e89ab9aee..8c2bb5c9f 100644 --- a/module/ASC.TelegramService/Core/TenantTgClient.cs +++ b/module/ASC.TelegramService/Core/TenantTgClient.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Threading; using Telegram.Bot; diff --git a/module/ASC.TelegramService/Launcher.cs b/module/ASC.TelegramService/Launcher.cs index db6f74165..5c1a08089 100644 --- a/module/ASC.TelegramService/Launcher.cs +++ b/module/ASC.TelegramService/Launcher.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.ServiceModel; using System.Threading.Tasks; diff --git a/module/ASC.TelegramService/TelegramHandler.cs b/module/ASC.TelegramService/TelegramHandler.cs index 50f1b7593..9fae52f52 100644 --- a/module/ASC.TelegramService/TelegramHandler.cs +++ b/module/ASC.TelegramService/TelegramHandler.cs @@ -1,39 +1,35 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Runtime.Caching; -using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using ASC.Common.Logging; using ASC.Core.Common.Notify.Telegram; -using ASC.Core.Tenants; using ASC.Notify.Messages; using ASC.TelegramService.Core; using Telegram.Bot; -using Telegram.Bot.Args; using Telegram.Bot.Exceptions; -using Telegram.Bot.Extensions.Polling; using Telegram.Bot.Types; using Telegram.Bot.Types.Enums; @@ -122,7 +118,7 @@ public bool CreateOrUpdateClientForTenant(int tenantId, string token, int tokenL client.CancellationTokenSource.Cancel(); client.CancellationTokenSource.Dispose(); client.CancellationTokenSource = null; - } + } BindClient(newClient, tenantId); @@ -148,8 +144,6 @@ public bool CreateOrUpdateClientForTenant(int tenantId, string token, int tokenL } } - BindClient(client, tenantId); - clients.Add(tenantId, new TenantTgClient() { Token = token, @@ -157,7 +151,9 @@ public bool CreateOrUpdateClientForTenant(int tenantId, string token, int tokenL Proxy = proxy, TenantId = tenantId, TokenLifeSpan = tokenLifespan - }); + }); + + BindClient(client, tenantId); } return true; @@ -193,8 +189,11 @@ private void BindClient(TelegramBotClient client, int tenantId) { var cts = new CancellationTokenSource(); - client.StartReceiving(new DefaultUpdateHandler((botClient, exception, cancellationToken) => HandleUpdateAsync(botClient, exception, cancellationToken, tenantId), HandleErrorAsync), - cts.Token); + clients[tenantId].CancellationTokenSource = cts; + + client.StartReceiving(updateHandler: (botClient, exception, cancellationToken) => HandleUpdateAsync(botClient, exception, cancellationToken, tenantId), + errorHandler: HandleErrorAsync, + cancellationToken: cts.Token); } async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken, int tenantId) diff --git a/module/ASC.TelegramService/TelegramService.cs b/module/ASC.TelegramService/TelegramService.cs index 353e9cbab..e18c578ad 100644 --- a/module/ASC.TelegramService/TelegramService.cs +++ b/module/ASC.TelegramService/TelegramService.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.Core.Common.Contracts; using ASC.Core.Common.Notify; using ASC.Notify.Messages; diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/ASC.FederatedLogin.csproj b/module/ASC.Thrdparty/ASC.FederatedLogin/ASC.FederatedLogin.csproj index 02f62f3e9..0eab25f1a 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/ASC.FederatedLogin.csproj +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/ASC.FederatedLogin.csproj @@ -43,6 +43,8 @@ prompt 4 false + ..\..\..\web\studio\ASC.Web.Studio\bin\ASC.FederatedLogin.xml + CS1591 none @@ -58,6 +60,7 @@ 3.5 + 3.5 diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/AccountLinker.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/AccountLinker.cs index 915f588c6..fdfd584bf 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/AccountLinker.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/AccountLinker.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -57,7 +57,7 @@ public IEnumerable GetLinkedObjects(LoginProfile profile) public IEnumerable GetLinkedObjectsByHashId(string hashid) { - using (var db = DbManager.FromHttpContext(dbid)) + using (var db = new DbManager(dbid)) { var query = new SqlQuery("account_links") .Select("id").Where("uid", hashid).Where(!Exp.Eq("provider", string.Empty)); @@ -83,7 +83,7 @@ public IEnumerable GetLinkedProfiles(string obj) private List GetLinkedProfilesFromDB(string obj) { //Retrieve by uinque id - using (var db = DbManager.FromHttpContext(dbid)) + using (var db = new DbManager(dbid)) { var query = new SqlQuery("account_links") .Select("profile").Where("id", obj); @@ -93,7 +93,7 @@ private List GetLinkedProfilesFromDB(string obj) public void AddLink(string obj, LoginProfile profile) { - using (var db = DbManager.FromHttpContext(dbid)) + using (var db = new DbManager(dbid)) { db.ExecuteScalar( new SqlInsert("account_links", true) @@ -129,7 +129,7 @@ public void RemoveProvider(string obj, string provider = null, string hashId = n if (!string.IsNullOrEmpty(provider)) sql.Where("provider", provider); if (!string.IsNullOrEmpty(hashId)) sql.Where("uid", hashId); - using (var db = DbManager.FromHttpContext(dbid)) + using (var db = new DbManager(dbid)) { db.ExecuteScalar(sql); } diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/DictionaryExtensions.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/DictionaryExtensions.cs index 200433ea2..1105281d4 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/DictionaryExtensions.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/DictionaryExtensions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/HashHelper.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/HashHelper.cs index 7caac1e3a..770fd19de 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/HashHelper.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/HashHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/JsCallbackHelper.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/JsCallbackHelper.cs index 14cbe2223..df28a44c4 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/JsCallbackHelper.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/JsCallbackHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/OAuth20TokenHelper.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/OAuth20TokenHelper.cs index 0b42a9690..dcd9bb879 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/OAuth20TokenHelper.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/OAuth20TokenHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/RequestHelper.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/RequestHelper.cs index dc04339f0..0acdc7d7b 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/RequestHelper.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/RequestHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/XmlExtensions.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/XmlExtensions.cs index 60ea9ef45..ff654f902 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/XmlExtensions.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/XmlExtensions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/XrdsHelper.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/XrdsHelper.cs index 8faf6315d..fe1afbb48 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/XrdsHelper.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/Helpers/XrdsHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/Login.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/Login.cs index f6bf73761..a0297ed4c 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/Login.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/Login.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginMode.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginMode.cs index 44ca18b17..c78e9bc83 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginMode.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginMode.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/AppleIdLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/AppleIdLoginProvider.cs index 701767511..7bc813c47 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/AppleIdLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/AppleIdLoginProvider.cs @@ -1,20 +1,21 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using ASC.Core.Common.Configuration; using ASC.FederatedLogin.Helpers; using ASC.FederatedLogin.Profile; using Microsoft.IdentityModel.Tokens; @@ -43,7 +44,7 @@ public class AppleIdLoginProvider : BaseLoginProvider public string PrivateKey { get { return this["appleIdPrivateKey"]; } } public AppleIdLoginProvider() { } - public AppleIdLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } + public AppleIdLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } public override LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params) { diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/BaseLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/BaseLoginProvider.cs index f6a4edecd..a2f062fe1 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/BaseLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/BaseLoginProvider.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Threading; @@ -58,7 +58,7 @@ protected BaseLoginProvider() } - protected BaseLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) + protected BaseLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/BitlyLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/BitlyLoginProvider.cs index 380e04bc2..03f2e921d 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/BitlyLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/BitlyLoginProvider.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; @@ -41,7 +41,7 @@ private static BitlyLoginProvider Instance public BitlyLoginProvider() { } - public BitlyLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) + public BitlyLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/BoxLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/BoxLoginProvider.cs index 38cd913b9..18fa92a17 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/BoxLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/BoxLoginProvider.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; using ASC.Core.Common.Configuration; @@ -50,7 +50,7 @@ public bool IsEnabled public BoxLoginProvider() { } - public BoxLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) + public BoxLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/DocuSignLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/DocuSignLoginProvider.cs index b51c3c899..929d94583 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/DocuSignLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/DocuSignLoginProvider.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Text; @@ -51,7 +51,7 @@ public bool IsEnabled public DocuSignLoginProvider() { } - public DocuSignLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) + public DocuSignLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/DropboxLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/DropboxLoginProvider.cs index f4bee1b19..462bb8576 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/DropboxLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/DropboxLoginProvider.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; using ASC.Core.Common.Configuration; @@ -47,7 +47,7 @@ public bool IsEnabled public DropboxLoginProvider() { } - public DropboxLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) + public DropboxLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/EncryptionLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/EncryptionLoginProvider.cs index 4c2ec6c41..905597009 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/EncryptionLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/EncryptionLoginProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/FacebookLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/FacebookLoginProvider.cs index 42104bd95..e026735c6 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/FacebookLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/FacebookLoginProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ using System; using System.Collections.Generic; +using ASC.Core.Common.Configuration; using ASC.FederatedLogin.Helpers; using ASC.FederatedLogin.Profile; @@ -37,7 +38,7 @@ public class FacebookLoginProvider : BaseLoginProvider public override string Scopes { get { return "email,public_profile"; } } public FacebookLoginProvider() { } - public FacebookLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } + public FacebookLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } public override LoginProfile GetLoginProfile(string accessToken) { diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/GoogleLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/GoogleLoginProvider.cs index a3be6e2fb..01a8a0c14 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/GoogleLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/GoogleLoginProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ using System.Collections.Generic; using System.Web; +using ASC.Core.Common.Configuration; using ASC.FederatedLogin.Helpers; using ASC.FederatedLogin.Profile; @@ -51,7 +52,7 @@ public class GoogleLoginProvider : BaseLoginProvider public override string Scopes { get { return "https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email"; } } public GoogleLoginProvider() { } - public GoogleLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } + public GoogleLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } public override LoginProfile GetLoginProfile(string accessToken) { diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/GosUslugiLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/GosUslugiLoginProvider.cs index 8e631cb27..c25a62c99 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/GosUslugiLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/GosUslugiLoginProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ using System.Threading; using System.Web; +using ASC.Core.Common.Configuration; using ASC.FederatedLogin.Helpers; using ASC.FederatedLogin.Profile; @@ -82,7 +83,7 @@ public GosUslugiLoginProvider() { } - public GosUslugiLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) + public GosUslugiLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/ILoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/ILoginProvider.cs index 15c9bf360..834ca992a 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/ILoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/ILoginProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/IValidateKeysProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/IValidateKeysProvider.cs index 489430196..ce3af31df 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/IValidateKeysProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/IValidateKeysProvider.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.FederatedLogin.LoginProviders { public interface IValidateKeysProvider diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/LinkedInLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/LinkedInLoginProvider.cs index af262ecec..c88d368f4 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/LinkedInLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/LinkedInLoginProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ using System; using System.Collections.Generic; +using ASC.Core.Common.Configuration; using ASC.FederatedLogin.Helpers; using ASC.FederatedLogin.Profile; @@ -61,7 +62,7 @@ public override string Scopes } public LinkedInLoginProvider() { } - public LinkedInLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } + public LinkedInLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } public override LoginProfile GetLoginProfile(string accessToken) { diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/MailRuLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/MailRuLoginProvider.cs index 9d34cb88c..b813c9247 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/MailRuLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/MailRuLoginProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ using System.Threading; using System.Web; +using ASC.Core.Common.Configuration; using ASC.FederatedLogin.Helpers; using ASC.FederatedLogin.Profile; @@ -63,7 +64,7 @@ public MailRuLoginProvider() { } - public MailRuLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) + public MailRuLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/MicrosoftLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/MicrosoftLoginProvider.cs index 00e39d826..ff3879638 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/MicrosoftLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/MicrosoftLoginProvider.cs @@ -1,22 +1,24 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; + +using ASC.Core.Common.Configuration; using ASC.FederatedLogin.Helpers; using ASC.FederatedLogin.Profile; using Newtonsoft.Json.Linq; @@ -35,7 +37,7 @@ public class MicrosoftLoginProvider : BaseLoginProvider public override string Scopes { get { return "openid,email,profile"; } } public MicrosoftLoginProvider() { } - public MicrosoftLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) {} + public MicrosoftLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) {} public override LoginProfile GetLoginProfile(string accessToken) { diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/OneDriveLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/OneDriveLoginProvider.cs index 051b0f62f..71786b432 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/OneDriveLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/OneDriveLoginProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,7 +50,7 @@ public bool IsEnabled public OneDriveLoginProvider() { } - public OneDriveLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) + public OneDriveLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/ProviderManager.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/ProviderManager.cs index 65477a333..63ccc2815 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/ProviderManager.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/ProviderManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/TelegramLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/TelegramLoginProvider.cs index e0c736ae2..ca58baa89 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/TelegramLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/TelegramLoginProvider.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; using ASC.Core; @@ -58,7 +58,7 @@ public bool IsEnabled() public TelegramLoginProvider() { } - public TelegramLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) + public TelegramLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/TwitterLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/TwitterLoginProvider.cs index f490424dc..ab55a3bed 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/TwitterLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/TwitterLoginProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ using System.Globalization; using System.Web; +using ASC.Core.Common.Configuration; using ASC.FederatedLogin.Profile; using Newtonsoft.Json.Linq; @@ -55,7 +56,7 @@ public override bool IsEnabled } public TwitterLoginProvider() { } - public TwitterLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } + public TwitterLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } public override LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params) { diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/VKLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/VKLoginProvider.cs index ee7f37b07..3a528f816 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/VKLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/VKLoginProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ using System.Threading; using System.Web; +using ASC.Core.Common.Configuration; using ASC.FederatedLogin.Helpers; using ASC.FederatedLogin.Profile; @@ -67,7 +68,7 @@ public VKLoginProvider() { } - public VKLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) + public VKLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/WordpressLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/WordpressLoginProvider.cs index fd13af280..dedb2a70d 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/WordpressLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/WordpressLoginProvider.cs @@ -1,24 +1,25 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Web; +using ASC.Core.Common.Configuration; using ASC.FederatedLogin.Helpers; using ASC.FederatedLogin.Profile; @@ -33,7 +34,7 @@ public WordpressLoginProvider() { } - public WordpressLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) + public WordpressLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/YandexLoginProvider.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/YandexLoginProvider.cs index 715adf452..13d7edf1c 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/YandexLoginProvider.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/LoginProviders/YandexLoginProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ using System.Threading; using System.Web; +using ASC.Core.Common.Configuration; using ASC.FederatedLogin.Helpers; using ASC.FederatedLogin.Profile; @@ -61,7 +62,7 @@ public YandexLoginProvider() { } - public YandexLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) + public YandexLoginProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/MultiRegionAccountLinker.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/MultiRegionAccountLinker.cs index d9aa63b82..ce0f177f0 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/MultiRegionAccountLinker.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/MultiRegionAccountLinker.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/OAuth20Token.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/OAuth20Token.cs index 62e2e2499..4b521abd5 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/OAuth20Token.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/OAuth20Token.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/Profile/LoginProfile.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/Profile/LoginProfile.cs index e92bb0ac4..dee07f8ee 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/Profile/LoginProfile.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/Profile/LoginProfile.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/Profile/LoginProfileExtensions.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/Profile/LoginProfileExtensions.cs index 93783f13e..71168119a 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/Profile/LoginProfileExtensions.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/Profile/LoginProfileExtensions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/Profile/WellKnownFields.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/Profile/WellKnownFields.cs index edc3b427e..98aba3f2f 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/Profile/WellKnownFields.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/Profile/WellKnownFields.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.FederatedLogin/ProviderConstants.cs b/module/ASC.Thrdparty/ASC.FederatedLogin/ProviderConstants.cs index 18287f1bd..ac381fc7f 100644 --- a/module/ASC.Thrdparty/ASC.FederatedLogin/ProviderConstants.cs +++ b/module/ASC.Thrdparty/ASC.FederatedLogin/ProviderConstants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/ASC.Thrdparty.csproj b/module/ASC.Thrdparty/ASC.Thrdparty/ASC.Thrdparty.csproj index 762ede1bc..e57fc0641 100644 --- a/module/ASC.Thrdparty/ASC.Thrdparty/ASC.Thrdparty.csproj +++ b/module/ASC.Thrdparty/ASC.Thrdparty/ASC.Thrdparty.csproj @@ -43,6 +43,8 @@ prompt 4 false + ..\..\..\web\studio\ASC.Web.Studio\bin\ASC.Thrdparty.xml + CS1591 none diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/Message.cs b/module/ASC.Thrdparty/ASC.Thrdparty/Message.cs index cb41d3efc..7ee2656ed 100644 --- a/module/ASC.Thrdparty/ASC.Thrdparty/Message.cs +++ b/module/ASC.Thrdparty/ASC.Thrdparty/Message.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,21 +27,25 @@ public class Message /// /// User name /// + /// Name user public string UserName { get; set; } /// /// Message text /// + /// text public string Text { get; set; } /// /// The date of message post /// + /// 2008-04-10T06-30-00.000Z public DateTime PostedOn { get; set; } /// /// Social network /// + /// 0 public SocialNetworks Source { get; set; } } } diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/SocialMediaException.cs b/module/ASC.Thrdparty/ASC.Thrdparty/SocialMediaException.cs index cca25d034..abdc8e855 100644 --- a/module/ASC.Thrdparty/ASC.Thrdparty/SocialMediaException.cs +++ b/module/ASC.Thrdparty/ASC.Thrdparty/SocialMediaException.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/SocialNetworks.cs b/module/ASC.Thrdparty/ASC.Thrdparty/SocialNetworks.cs index 1563fab58..2043422e7 100644 --- a/module/ASC.Thrdparty/ASC.Thrdparty/SocialNetworks.cs +++ b/module/ASC.Thrdparty/ASC.Thrdparty/SocialNetworks.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/Exceptions.cs b/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/Exceptions.cs index 981b04ae7..d938df373 100644 --- a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/Exceptions.cs +++ b/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/Exceptions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterApiInfo.cs b/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterApiInfo.cs index 3a5eff58a..bd6cd250f 100644 --- a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterApiInfo.cs +++ b/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterApiInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterDataProvider.cs b/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterDataProvider.cs index e3394e8ed..b2301acd1 100644 --- a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterDataProvider.cs +++ b/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterDataProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterMessage.cs b/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterMessage.cs index 37f252fbd..46d1abc5a 100644 --- a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterMessage.cs +++ b/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterMessage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterUserInfo.cs b/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterUserInfo.cs index 2f9c66e02..333442ec0 100644 --- a/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterUserInfo.cs +++ b/module/ASC.Thrdparty/ASC.Thrdparty/Twitter/TwitterUserInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,10 +19,19 @@ namespace ASC.Thrdparty.Twitter { public class TwitterUserInfo { + ///1,1 public decimal UserID { get; set; } + + ///Screen name public string ScreenName { get; set; } + + ///User Name public string UserName { get; set; } + + ///url to img public string SmallImageUrl { get; set; } + + ///Description public string Description { get; set; } } } diff --git a/module/ASC.Thumbnails.Svc/ASC.Thumbnails.Svc.csproj b/module/ASC.Thumbnails.Svc/ASC.Thumbnails.Svc.csproj index fc3dad1d0..375e05246 100644 --- a/module/ASC.Thumbnails.Svc/ASC.Thumbnails.Svc.csproj +++ b/module/ASC.Thumbnails.Svc/ASC.Thumbnails.Svc.csproj @@ -20,6 +20,8 @@ DEBUG;TRACE prompt 4 + bin\Debug\ASC.Thumbnails.Svc.xml + CS1591 none @@ -53,7 +55,7 @@ - 4.7.11 + 5.1.2 diff --git a/module/ASC.Thumbnails.Svc/ConfigHandler.cs b/module/ASC.Thumbnails.Svc/ConfigHandler.cs index b4d81858c..a251c6863 100644 --- a/module/ASC.Thumbnails.Svc/ConfigHandler.cs +++ b/module/ASC.Thumbnails.Svc/ConfigHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thumbnails.Svc/Launcher.cs b/module/ASC.Thumbnails.Svc/Launcher.cs index f12e286f0..021d8836c 100644 --- a/module/ASC.Thumbnails.Svc/Launcher.cs +++ b/module/ASC.Thumbnails.Svc/Launcher.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.Thumbnails/app/isLife.js b/module/ASC.Thumbnails/app/isLife.js index 66fdbef30..2d2baed5a 100644 --- a/module/ASC.Thumbnails/app/isLife.js +++ b/module/ASC.Thumbnails/app/isLife.js @@ -1,19 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + module.exports = function (req, res) { res.sendStatus(200); return; diff --git a/module/ASC.Thumbnails/app/log.js b/module/ASC.Thumbnails/app/log.js index 31e3b8d65..009434d97 100644 --- a/module/ASC.Thumbnails/app/log.js +++ b/module/ASC.Thumbnails/app/log.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const winston = require('winston'); const { format } = require('winston'); require('winston-daily-rotate-file') diff --git a/module/ASC.Thumbnails/app/thumb.js b/module/ASC.Thumbnails/app/thumb.js index c1b7951c6..794196df0 100644 --- a/module/ASC.Thumbnails/app/thumb.js +++ b/module/ASC.Thumbnails/app/thumb.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const fs = require('fs'); const path = require('path'); diff --git a/module/ASC.Thumbnails/app/webshot/options.js b/module/ASC.Thumbnails/app/webshot/options.js index e316a7bc3..37642f298 100644 --- a/module/ASC.Thumbnails/app/webshot/options.js +++ b/module/ASC.Thumbnails/app/webshot/options.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,7 +32,8 @@ exports.phantom = { , bottom: 0 } , defaultWhiteBackground: false -, customCSS: '' +, customCSS: 'iframe{display: none !important;}' +, customJS: 'Array.prototype.forEach.call(document.querySelectorAll("iframe"),function(iframe) {iframe.parentElement.removeChild(iframe);});' , takeShotOnCallback: false , streamType: 'png' , siteType: 'url' diff --git a/module/ASC.Thumbnails/app/webshot/webshot.js b/module/ASC.Thumbnails/app/webshot/webshot.js index 75403fdc8..8e85f911f 100644 --- a/module/ASC.Thumbnails/app/webshot/webshot.js +++ b/module/ASC.Thumbnails/app/webshot/webshot.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + var url = require('url') , fs = require('graceful-fs') , tmp = require('tmp') diff --git a/module/ASC.Thumbnails/app/webshot/webshot.phantom.js b/module/ASC.Thumbnails/app/webshot/webshot.phantom.js index e8da51e34..fe2b24b66 100644 --- a/module/ASC.Thumbnails/app/webshot/webshot.phantom.js +++ b/module/ASC.Thumbnails/app/webshot/webshot.phantom.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -110,6 +110,17 @@ var _takeScreenshot = function(status) { }, options.customCSS); } + // Handle customJS option + if (options.customJS) { + page.evaluate(function(customJS) { + var script = document.createElement('script'); + var text = document.createTextNode(customJS); + script.setAttribute('type', 'text/javascript'); + script.appendChild(text); + document.body.insertBefore(script, document.body.firstChild); + }, options.customJS); + } + if (options.captureSelector) { // Handle captureSelector option diff --git a/module/ASC.Thumbnails/config/index.js b/module/ASC.Thumbnails/config/index.js index 4371f4343..55b189dd5 100644 --- a/module/ASC.Thumbnails/config/index.js +++ b/module/ASC.Thumbnails/config/index.js @@ -1,26 +1,28 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const nconf = require('nconf'); const path = require('path'); nconf.argv() .env() - .file({ file: path.join(__dirname, 'config.json') }); + .file({ file: path.join(__dirname, `config.${process.argv[2]}.json`) }); + +nconf.file("default", path.join(__dirname, "config.json")); nconf.noThumb = nconf.get("noThumb"); diff --git a/module/ASC.Thumbnails/index.js b/module/ASC.Thumbnails/index.js index 5e3e68ae3..bd4815fe0 100644 --- a/module/ASC.Thumbnails/index.js +++ b/module/ASC.Thumbnails/index.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const express = require('express'); const cookieParser = require('cookie-parser'); diff --git a/module/ASC.UrlShortener.Svc/ASC.UrlShortener.Svc.csproj b/module/ASC.UrlShortener.Svc/ASC.UrlShortener.Svc.csproj index 3e7defa18..0e33909af 100644 --- a/module/ASC.UrlShortener.Svc/ASC.UrlShortener.Svc.csproj +++ b/module/ASC.UrlShortener.Svc/ASC.UrlShortener.Svc.csproj @@ -20,6 +20,8 @@ DEBUG;TRACE prompt 4 + bin\Debug\ASC.UrlShortener.Svc.xml + CS1591 none @@ -53,7 +55,7 @@ - 4.7.11 + 5.1.2 diff --git a/module/ASC.UrlShortener.Svc/ConfigHandler.cs b/module/ASC.UrlShortener.Svc/ConfigHandler.cs index d73a35a49..596373fa6 100644 --- a/module/ASC.UrlShortener.Svc/ConfigHandler.cs +++ b/module/ASC.UrlShortener.Svc/ConfigHandler.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Configuration; namespace ASC.UrlShortener.Svc diff --git a/module/ASC.UrlShortener.Svc/Launcher.cs b/module/ASC.UrlShortener.Svc/Launcher.cs index 756f18378..57e3ec45e 100644 --- a/module/ASC.UrlShortener.Svc/Launcher.cs +++ b/module/ASC.UrlShortener.Svc/Launcher.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.UrlShortener/app/app.js b/module/ASC.UrlShortener/app/app.js index 71dcf46f2..1a6b8478e 100644 --- a/module/ASC.UrlShortener/app/app.js +++ b/module/ASC.UrlShortener/app/app.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const queryConsts = require('./sqlConsts'); const shortUrl = require('./urlShortener'); const auth = require('../middleware/auth'); diff --git a/module/ASC.UrlShortener/app/log.js b/module/ASC.UrlShortener/app/log.js index e79e32368..ec9157be1 100644 --- a/module/ASC.UrlShortener/app/log.js +++ b/module/ASC.UrlShortener/app/log.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const winston = require('winston'); const { format } = require('winston'); require('winston-daily-rotate-file'); diff --git a/module/ASC.UrlShortener/app/sql.js b/module/ASC.UrlShortener/app/sql.js index 50f640a99..6d95d16cd 100644 --- a/module/ASC.UrlShortener/app/sql.js +++ b/module/ASC.UrlShortener/app/sql.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const sql = require('mysql2'); const log = require('./log'); const config = require('../config'); diff --git a/module/ASC.UrlShortener/app/sqlConsts.js b/module/ASC.UrlShortener/app/sqlConsts.js index b61b62419..d2875d637 100644 --- a/module/ASC.UrlShortener/app/sqlConsts.js +++ b/module/ASC.UrlShortener/app/sqlConsts.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + module.exports = { exists: "SELECT short,id FROM short_links WHERE link = ?", insert: "INSERT INTO short_links SET link = ?", diff --git a/module/ASC.UrlShortener/app/urlShortener.js b/module/ASC.UrlShortener/app/urlShortener.js index 2b76a6a90..f3868648c 100644 --- a/module/ASC.UrlShortener/app/urlShortener.js +++ b/module/ASC.UrlShortener/app/urlShortener.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + /* * ShortURL (https://github.com/delight-im/ShortURL) * Copyright (c) delight.im (https://www.delight.im/) diff --git a/module/ASC.UrlShortener/config/index.js b/module/ASC.UrlShortener/config/index.js index a117c129c..28d3325a5 100644 --- a/module/ASC.UrlShortener/config/index.js +++ b/module/ASC.UrlShortener/config/index.js @@ -1,25 +1,27 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const nconf = require("nconf"); const path = require("path"); nconf.argv() .env() - .file({ file: path.join(__dirname, 'config.json') }); + .file({ file: path.join(__dirname, `config.${process.argv[2]}.json`) }); + +nconf.file("default", path.join(__dirname, "config.json")); module.exports = nconf; \ No newline at end of file diff --git a/module/ASC.UrlShortener/index.js b/module/ASC.UrlShortener/index.js index cc5386775..14ae20388 100644 --- a/module/ASC.UrlShortener/index.js +++ b/module/ASC.UrlShortener/index.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const express = require('express'); const cookieParser = require('cookie-parser'); diff --git a/module/ASC.UrlShortener/middleware/auth.js b/module/ASC.UrlShortener/middleware/auth.js index b4f1f487a..249302740 100644 --- a/module/ASC.UrlShortener/middleware/auth.js +++ b/module/ASC.UrlShortener/middleware/auth.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const config = require('../config'), crypto = require('crypto'), diff --git a/module/ASC.VoipService/ASC.VoipService.csproj b/module/ASC.VoipService/ASC.VoipService.csproj index ae11641ae..9e8e75c9e 100644 --- a/module/ASC.VoipService/ASC.VoipService.csproj +++ b/module/ASC.VoipService/ASC.VoipService.csproj @@ -22,6 +22,8 @@ DEBUG;TRACE prompt 4 + ..\..\web\studio\ASC.Web.Studio\bin\ASC.VoipService.xml + CS1591 none diff --git a/module/ASC.VoipService/Dao/AbstractDao.cs b/module/ASC.VoipService/Dao/AbstractDao.cs index 43075422b..d08de2291 100644 --- a/module/ASC.VoipService/Dao/AbstractDao.cs +++ b/module/ASC.VoipService/Dao/AbstractDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,7 +34,7 @@ protected AbstractDao(int tenantID) protected IDbManager GetDb() { - return DbManager.FromHttpContext(dbid); + return new DbManager(dbid); } protected int TenantID diff --git a/module/ASC.VoipService/Dao/CachedVoipDao.cs b/module/ASC.VoipService/Dao/CachedVoipDao.cs index 8995501c5..0deb25151 100644 --- a/module/ASC.VoipService/Dao/CachedVoipDao.cs +++ b/module/ASC.VoipService/Dao/CachedVoipDao.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Globalization; diff --git a/module/ASC.VoipService/Dao/VoIPCallFilter.cs b/module/ASC.VoipService/Dao/VoIPCallFilter.cs index 155ced7b8..5cd2334c6 100644 --- a/module/ASC.VoipService/Dao/VoIPCallFilter.cs +++ b/module/ASC.VoipService/Dao/VoIPCallFilter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.VoipService/Dao/VoipDao.cs b/module/ASC.VoipService/Dao/VoipDao.cs index 16bf744d8..1a53c25cb 100644 --- a/module/ASC.VoipService/Dao/VoipDao.cs +++ b/module/ASC.VoipService/Dao/VoipDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.VoipService/IVoipProvider.cs b/module/ASC.VoipService/IVoipProvider.cs index 4daa7ecf8..a73aac233 100644 --- a/module/ASC.VoipService/IVoipProvider.cs +++ b/module/ASC.VoipService/IVoipProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.VoipService/Twilio/TwilioPhone.cs b/module/ASC.VoipService/Twilio/TwilioPhone.cs index e6fdbaed4..07a13f30c 100644 --- a/module/ASC.VoipService/Twilio/TwilioPhone.cs +++ b/module/ASC.VoipService/Twilio/TwilioPhone.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.VoipService/Twilio/TwilioProvider.cs b/module/ASC.VoipService/Twilio/TwilioProvider.cs index 3dbf0c1ce..b24fa63e7 100644 --- a/module/ASC.VoipService/Twilio/TwilioProvider.cs +++ b/module/ASC.VoipService/Twilio/TwilioProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.VoipService/Twilio/TwilioResponseHelper.cs b/module/ASC.VoipService/Twilio/TwilioResponseHelper.cs index 0c8034b09..92a9a916d 100644 --- a/module/ASC.VoipService/Twilio/TwilioResponseHelper.cs +++ b/module/ASC.VoipService/Twilio/TwilioResponseHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.VoipService/Twilio/TwilioVoipSettings.cs b/module/ASC.VoipService/Twilio/TwilioVoipSettings.cs index 59011c936..8b88fd51a 100644 --- a/module/ASC.VoipService/Twilio/TwilioVoipSettings.cs +++ b/module/ASC.VoipService/Twilio/TwilioVoipSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.VoipService/VoipCall.cs b/module/ASC.VoipService/VoipCall.cs index edd54c75c..e078b60b9 100644 --- a/module/ASC.VoipService/VoipCall.cs +++ b/module/ASC.VoipService/VoipCall.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/module/ASC.VoipService/VoipModel.cs b/module/ASC.VoipService/VoipModel.cs index 8487aa9b5..48a3de6d6 100644 --- a/module/ASC.VoipService/VoipModel.cs +++ b/module/ASC.VoipService/VoipModel.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,24 +21,34 @@ namespace ASC.VoipService { public class Agent { + ///92eb52c8-bb93-4caf-87fb-46ea11530899 public Guid Id { get; set; } + ///1 public AnswerType Answer { get; set; } + ///ClientID public string ClientID { get { return PhoneNumber + PostFix; } } + ///true public bool Record { get; set; } + ///1 public int TimeOut { get; set; } + ///1 public AgentStatus Status { get; set; } + ///true public bool AllowOutgoingCalls { get; set; } + ///PostFix public string PostFix { get; set; } + ///PhoneNumber public string PhoneNumber { get; set; } + ///RedirectToNumber public string RedirectToNumber { get; set; } public Agent() @@ -63,10 +73,19 @@ public Agent(Guid id, AnswerType answer, VoipPhone phone, string postFix) public class Queue { + ///id public string Id { get; set; } + + ///Name public string Name { get; set; } + + ///123 public int Size { get; set; } + + ///WaitUrl public string WaitUrl { get; set; } + + ///4 public int WaitTime { get; set; } public Queue() { } @@ -83,8 +102,13 @@ public Queue(string id, string name, int size, string waitUrl, int waitTime) public class WorkingHours { + ///true public bool Enabled { get; set; } + + ///2020-12-22T04:11:57.0469085+00:00 public TimeSpan? From { get; set; } + + ///2020-12-22T04:11:57.0469085+00:00 public TimeSpan? To { get; set; } public WorkingHours() { } @@ -123,9 +147,16 @@ public override int GetHashCode() public class VoipUpload { + ///Name public string Name { get; set; } + + ///Path public string Path { get; set; } + + ///1 public AudioType AudioType { get; set; } + + ///true public bool IsDefault { get; set; } } diff --git a/module/ASC.VoipService/VoipPhone.cs b/module/ASC.VoipService/VoipPhone.cs index 97a7b8ea4..555848459 100644 --- a/module/ASC.VoipService/VoipPhone.cs +++ b/module/ASC.VoipService/VoipPhone.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,10 +21,19 @@ namespace ASC.VoipService { public class VoipPhone { + ///id public string Id { get; set; } + + ///Number public string Number { get; set; } + + ///Alias public string Alias { get; set; } + + ///ASC.VoipService.VoipSettings, ASC.VoipService public VoipSettings Settings { get; set; } + + ///ASC.VoipService.Agent, ASC.VoipService public Agent Caller { get { return Settings.Caller; } diff --git a/module/ASC.VoipService/VoipSettings.cs b/module/ASC.VoipService/VoipSettings.cs index 62096273c..bc4dc3474 100644 --- a/module/ASC.VoipService/VoipSettings.cs +++ b/module/ASC.VoipService/VoipSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,28 +30,41 @@ namespace ASC.VoipService { public class VoipSettings { + ///VoiceUrl public string VoiceUrl { get; set; } + ///Name public string Name { get; set; } + ///ASC.VoipService.Agent, ASC.VoipService + ///list public List Operators { get; set; } + ///ASC.VoipService.Queue, ASC.VoipService public Queue Queue { get; set; } + ///ASC.VoipService.Agent, ASC.VoipService public Agent Caller { get { return Operators.FirstOrDefault(r => r.Id == SecurityContext.CurrentAccount.ID); } } + ///ASC.VoipService.WorkingHours, ASC.VoipService public WorkingHours WorkingHours { get; set; } + ///VoiceMail public string VoiceMail { get; set; } + ///GreetingAudio public string GreetingAudio { get; set; } + ///HoldAudio public string HoldAudio { get; set; } + ///true public bool AllowOutgoingCalls { get; set; } + ///true public bool Pause { get; set; } + ///true public bool Record { get; set; } internal string JsonSettings diff --git a/module/ASC.WebDav.Svc/ConfigHandler.cs b/module/ASC.WebDav.Svc/ConfigHandler.cs index 9cbe3dd67..1bf5525d8 100644 --- a/module/ASC.WebDav.Svc/ConfigHandler.cs +++ b/module/ASC.WebDav.Svc/ConfigHandler.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Configuration; namespace ASC.WebDav.Svc diff --git a/module/ASC.WebDav.Svc/Launcher.cs b/module/ASC.WebDav.Svc/Launcher.cs index 26f27b340..cb0ddfc97 100644 --- a/module/ASC.WebDav.Svc/Launcher.cs +++ b/module/ASC.WebDav.Svc/Launcher.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Configuration; @@ -58,6 +58,15 @@ public void Start() startInfo.EnvironmentVariables.Add("port", cfg.Port); startInfo.EnvironmentVariables.Add("logPath", Path.Combine(Logger.LogDirectory, "web.webdav.log")); + var appSettings = ConfigurationManagerExtension.AppSettings; + + var selfSignedCertPath = appSettings["core.self-signed-cert-path"] ?? ""; + + if (!string.IsNullOrEmpty(selfSignedCertPath)) + { + startInfo.EnvironmentVariables.Add("NODE_EXTRA_CA_CERTS", selfSignedCertPath); + } + StartNode(); HealthCheckSvc = new HealthCheckSvc(cfg.Port, ResultOfPing, Logger, PathToPing); HealthCheckSvc.StartPing(); diff --git a/module/ASC.WebDav/helper/helper.js b/module/ASC.WebDav/helper/helper.js index b5e3e167a..7fd4d1c00 100644 --- a/module/ASC.WebDav/helper/helper.js +++ b/module/ASC.WebDav/helper/helper.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const logger = require('./logger.js'); const logSplitter = ' | '; diff --git a/module/ASC.WebDav/helper/localLockManager.js b/module/ASC.WebDav/helper/localLockManager.js index d99302271..4f6104663 100644 --- a/module/ASC.WebDav/helper/localLockManager.js +++ b/module/ASC.WebDav/helper/localLockManager.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const webdav = require('webdav-server').v2; class CLocalLockManager extends webdav.LocalLockManager { getLocks(callback) { diff --git a/module/ASC.WebDav/helper/logger.js b/module/ASC.WebDav/helper/logger.js index fa97e1ba2..be55c5a9c 100644 --- a/module/ASC.WebDav/helper/logger.js +++ b/module/ASC.WebDav/helper/logger.js @@ -1,29 +1,29 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const winston = require("winston"); const { format } = require("winston"); require("winston-daily-rotate-file"); const path = require("path"); -const config = require("../server/config.js"); +const config = require(`../server/config.${process.argv[2]}.js`); const fs = require("fs"); const logLevel = process.env.logLevel || config.logLevel || "info"; -const fileName = process.env.logPath || path.join(__dirname, "..", "logs", "web.webdav.%DATE%.log"); +const fileName = config.logPath || path.join(__dirname, "..", "logs", "web.webdav.%DATE%.log"); const dirName = path.dirname(fileName); if (!fs.existsSync(dirName)) { diff --git a/module/ASC.WebDav/helper/propertyParser.js b/module/ASC.WebDav/helper/propertyParser.js index f94b3195d..e2c991a7d 100644 --- a/module/ASC.WebDav/helper/propertyParser.js +++ b/module/ASC.WebDav/helper/propertyParser.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + class PropertyParser { static parsePath(path) { let pathArray = path.split('/'); diff --git a/module/ASC.WebDav/helper/renamingDuplicateElements.js b/module/ASC.WebDav/helper/renamingDuplicateElements.js index c7371567f..720d70f4d 100644 --- a/module/ASC.WebDav/helper/renamingDuplicateElements.js +++ b/module/ASC.WebDav/helper/renamingDuplicateElements.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + var addRealTitle = function (response, folderId) { if (folderId != '@root') { let structFile = response.data.response.files; diff --git a/module/ASC.WebDav/helper/writable.js b/module/ASC.WebDav/helper/writable.js index ca29b2370..c75f0fa02 100644 --- a/module/ASC.WebDav/helper/writable.js +++ b/module/ASC.WebDav/helper/writable.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const { Duplex } = require('stream'); diff --git a/module/ASC.WebDav/manager/customFileSystem.js b/module/ASC.WebDav/manager/customFileSystem.js index e076c3741..09eaccc03 100644 --- a/module/ASC.WebDav/manager/customFileSystem.js +++ b/module/ASC.WebDav/manager/customFileSystem.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const webdav = require('webdav-server').v2; const VirtualResources = require('../resource/customVirtualResource'); const promise_1 = require('webdav-server/lib/helper/v2/promise'); diff --git a/module/ASC.WebDav/package-lock.json b/module/ASC.WebDav/package-lock.json index f91bfae3f..9105b546a 100644 --- a/module/ASC.WebDav/package-lock.json +++ b/module/ASC.WebDav/package-lock.json @@ -1,96 +1,177 @@ { "name": "webdav_server", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "accepts": { + "packages": { + "": { + "name": "webdav_server", + "version": "1.0.0", + "hasInstallScript": true, + "dependencies": { + "axios": "^0.21.0", + "express": "^4.17.1", + "form-data": "^3.0.0", + "get-byte": "0.0.0", + "help": "^3.0.2", + "node-fetch": "^2.6.9", + "patch-package": "^6.4.7", + "postinstall-postinstall": "^2.1.0", + "request": "^2.88.0", + "to-byte-array": "^1.0.2", + "webdav-server": "2.6.2", + "winston": "^3.2.1", + "winston-daily-rotate-file": "^4.5.5" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" + }, + "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { + "dependencies": { "mime-types": "~2.1.24", "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" } }, - "ajv": { + "node_modules/ajv": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "requires": { + "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, - "array-flatten": { + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-styles/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ansi-styles/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "asn1": { + "node_modules/asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { + "dependencies": { "safer-buffer": "~2.1.0" } }, - "assert-plus": { + "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } }, - "async": { + "node_modules/async": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { + "dependencies": { "lodash": "^4.17.14" } }, - "asynckit": { + "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "aws-sign2": { + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } }, - "aws4": { + "node_modules/aws4": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" }, - "axios": { + "node_modules/axios": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz", "integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==", - "requires": { + "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", + "dependencies": { "follow-redirects": "^1.10.0" } }, - "base64url": { + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64url": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "engines": { + "node": ">=6.0.0" + } }, - "bcrypt-pbkdf": { + "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { + "dependencies": { "tweetnacl": "^0.14.3" } }, - "body-parser": { + "node_modules/body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { + "dependencies": { "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", @@ -102,212 +183,305 @@ "raw-body": "2.4.0", "type-is": "~1.6.17" }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "bytes": { + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } }, - "caseless": { + "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "color": { + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/color": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "requires": { + "dependencies": { "color-convert": "^1.9.1", "color-string": "^1.5.2" } }, - "color-convert": { + "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { + "dependencies": { "color-name": "1.1.3" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "color-string": { + "node_modules/color-string": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "requires": { + "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, - "colornames": { + "node_modules/colornames": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" }, - "colors": { + "node_modules/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + } }, - "colorspace": { + "node_modules/colorspace": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", - "requires": { + "dependencies": { "color": "3.0.x", "text-hex": "1.0.x" } }, - "combined-stream": { + "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { + "dependencies": { "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "content-disposition": { + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { + "dependencies": { "safe-buffer": "5.1.2" }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } + "engines": { + "node": ">= 0.6" } }, - "content-type": { + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } }, - "cookie": { + "node_modules/cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } }, - "cookie-signature": { + "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "core-util-is": { + "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "dashdash": { + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { + "dependencies": { "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" } }, - "debug": { + "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } + "ms": "2.0.0" } }, - "delayed-stream": { + "node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } }, - "depd": { + "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } }, - "destroy": { + "node_modules/destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "diagnostics": { + "node_modules/diagnostics": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", - "requires": { + "dependencies": { "colorspace": "1.1.x", "enabled": "1.0.x", "kuler": "1.0.x" } }, - "ecc-jsbn": { + "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { + "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, - "ee-first": { + "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "enabled": { + "node_modules/enabled": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", - "requires": { + "dependencies": { "env-variable": "0.0.x" } }, - "encodeurl": { + "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } }, - "env-variable": { + "node_modules/env-variable": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==" }, - "escape-html": { + "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, - "etag": { + "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } }, - "express": { + "node_modules/express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { + "dependencies": { "accepts": "~1.3.7", "array-flatten": "1.1.1", "body-parser": "1.19.0", @@ -339,62 +513,80 @@ "utils-merge": "1.0.1", "vary": "~1.1.2" }, - "dependencies": { - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } + "engines": { + "node": ">= 0.10.0" } }, - "extend": { + "node_modules/express/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "extsprintf": { + "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] }, - "fast-deep-equal": { + "node_modules/fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" }, - "fast-json-stable-stringify": { + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "fast-safe-stringify": { + "node_modules/fast-safe-stringify": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, - "fecha": { + "node_modules/fecha": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" }, - "file-stream-rotator": { + "node_modules/file-stream-rotator": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.5.7.tgz", "integrity": "sha512-VYb3HZ/GiAGUCrfeakO8Mp54YGswNUHvL7P09WQcXAJNSj3iQ5QraYSp3cIn1MUyw6uzfgN/EFOarCNa4JvUHQ==", - "requires": { + "dependencies": { "moment": "^2.11.2" } }, - "finalhandler": { + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { + "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -402,196 +594,397 @@ "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dependencies": { + "micromatch": "^4.0.2" } }, - "follow-redirects": { + "node_modules/follow-redirects": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + } }, - "forever-agent": { + "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } }, - "form-data": { + "node_modules/form-data": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", - "requires": { + "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, - "forwarded": { + "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } }, - "fresh": { + "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "get-byte": { + "node_modules/get-byte": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/get-byte/-/get-byte-0.0.0.tgz", "integrity": "sha512-dFdDPbQR4zCgSxsmMEjVrLHtvSdTVqb2JUfcZ8KYhXUQD8eiE7uTgeHzse5K479Kd8IIRt6503+2gmQhahvJyg==" }, - "getpass": { + "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { + "dependencies": { "assert-plus": "^1.0.0" } }, - "har-schema": { + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } }, - "har-validator": { + "node_modules/har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { + "deprecated": "this library is no longer supported", + "dependencies": { "ajv": "^6.5.5", "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "help": { + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/help": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/help/-/help-3.0.2.tgz", "integrity": "sha1-luGQ1KCkU7icLLSwWrOOOo+f2t0=" }, - "http-errors": { + "node_modules/http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { + "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } + "engines": { + "node": ">= 0.6" } }, - "http-signature": { + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { + "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "iconv-lite": { + "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { + "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ipaddr.js": { + "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } }, - "is-arrayish": { + "node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, - "is-buffer": { + "node_modules/is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } }, - "is-stream": { + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } }, - "is-typedarray": { + "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "isarray": { + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "isstream": { + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, - "jsbn": { + "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, - "json-schema": { + "node_modules/json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, - "json-schema-traverse": { + "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "json-stringify-safe": { + "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "jsprim": { + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { + "engines": [ + "node >=0.6.0" + ], + "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" } }, - "kuler": { + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kuler": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", - "requires": { + "dependencies": { "colornames": "^1.1.1" } }, - "lodash": { + "node_modules/lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, - "logform": { + "node_modules/logform": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", - "requires": { + "dependencies": { "colors": "^1.2.1", "fast-safe-stringify": "^2.0.4", "fecha": "^2.3.3", @@ -599,152 +992,354 @@ "triple-beam": "^1.3.0" } }, - "media-typer": { + "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } }, - "merge-descriptors": { + "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, - "methods": { + "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } }, - "mime": { + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.43.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.26", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "requires": { + "dependencies": { "mime-db": "1.43.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "moment": { + "node_modules/moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "engines": { + "node": "*" + } }, - "ms": { + "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "negotiator": { + "node_modules/negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } }, - "oauth-sign": { + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } }, - "object-hash": { + "node_modules/object-hash": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "engines": { + "node": ">= 6" + } }, - "on-finished": { + "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { + "dependencies": { "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" } }, - "one-time": { + "node_modules/one-time": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" }, - "parseurl": { + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/patch-package": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", + "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "cross-spawn": "^6.0.5", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "is-ci": "^2.0.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^5.6.0", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^1.10.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=10", + "npm": ">5" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } }, - "path-to-regexp": { + "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "performance-now": { + "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "process-nextick-args": { + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postinstall-postinstall": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz", + "integrity": "sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==", + "hasInstallScript": true + }, + "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "proxy-addr": { + "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { + "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "psl": { + "node_modules/psl": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" }, - "punycode": { + "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } }, - "qs": { + "node_modules/qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } }, - "range-parser": { + "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } }, - "raw-body": { + "node_modules/raw-body": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { + "dependencies": { "bytes": "3.1.0", "http-errors": "1.7.2", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "readable-stream": { + "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { + "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "request": { + "node_modules/request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", @@ -766,39 +1361,62 @@ "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sax": { + "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, - "send": { + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { + "dependencies": { "debug": "2.6.9", "depd": "~1.1.2", "destroy": "~1.0.4", @@ -813,43 +1431,74 @@ "range-parser": "~1.2.1", "statuses": "~1.5.0" }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } + "engines": { + "node": ">= 0.8.0" } }, - "serve-static": { + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { + "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "setprototypeof": { + "node_modules/setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, - "simple-swizzle": { + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { + "dependencies": { "is-arrayish": "^0.3.1" } }, - "sshpk": { + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { + "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", @@ -859,145 +1508,259 @@ "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" } }, - "stack-trace": { + "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "engines": { + "node": "*" + } }, - "statuses": { + "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } }, - "string_decoder": { + "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { + "dependencies": { "safe-buffer": "~5.2.0" } }, - "text-hex": { + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, - "to-byte-array": { + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-byte-array": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/to-byte-array/-/to-byte-array-1.0.2.tgz", "integrity": "sha512-3Owdexa2azV7gAW5ZlSqp5646oqOOf3EZ3JsbX6AtIdpA0h3y8YVMS70NwMYzMJdZdgMnXW6UIetkeyIWSycrw==", - "requires": { + "dependencies": { "base64url": "^3.0.1", "is-buffer": "^2.0.3" } }, - "toidentifier": { + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } }, - "tough-cookie": { + "node_modules/tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { + "dependencies": { "psl": "^1.1.24", "punycode": "^1.4.1" }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } + "engines": { + "node": ">=0.8" } }, - "triple-beam": { + "node_modules/tough-cookie/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, - "tunnel-agent": { + "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { + "dependencies": { "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" } }, - "tweetnacl": { + "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, - "type-is": { + "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { + "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" } }, - "unpipe": { + "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } }, - "uri-js": { + "node_modules/uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "util-deprecate": { + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "utils-merge": { + "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } }, - "uuid": { + "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } }, - "vary": { + "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } }, - "verror": { + "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { + "engines": [ + "node >=0.6.0" + ], + "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, - "webdav-server": { + "node_modules/webdav-server": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/webdav-server/-/webdav-server-2.6.2.tgz", "integrity": "sha512-0iHdrOzlKGFD96bTvPF8IIEfxw9Q7jB5LqWqhjyBYsofD6T6mOYqWtAvR88VY9Mq0xeg8bCRHC2Vifc9iuTYuw==", - "requires": { + "dependencies": { "mime-types": "^2.1.18", "xml-js-builder": "^1.0.3" + }, + "engines": { + "node": ">= 4" } }, - "winston": { + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/winston": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", - "requires": { + "dependencies": { "async": "^2.6.1", "diagnostics": "^1.1.1", "is-stream": "^1.1.0", @@ -1007,109 +1770,139 @@ "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.3.0" + }, + "engines": { + "node": ">= 6.4.0" } }, - "winston-daily-rotate-file": { + "node_modules/winston-daily-rotate-file": { "version": "4.5.5", "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.5.5.tgz", "integrity": "sha512-ds0WahIjiDhKCiMXmY799pDBW+58ByqIBtUcsqr4oDoXrAI3Zn+hbgFdUxzMfqA93OG0mPLYVMiotqTgE/WeWQ==", - "requires": { + "dependencies": { "file-stream-rotator": "^0.5.7", "object-hash": "^2.0.1", "triple-beam": "^1.3.0", "winston-transport": "^4.4.0" }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "winston": "^3" + } + }, + "node_modules/winston-daily-rotate-file/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", - "requires": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" - } - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "winston-transport": { + "node_modules/winston-daily-rotate-file/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/winston-daily-rotate-file/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/winston-daily-rotate-file/node_modules/winston-transport": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "dependencies": { + "readable-stream": "^2.3.7", + "triple-beam": "^1.2.0" + }, + "engines": { + "node": ">= 6.4.0" + } + }, + "node_modules/winston-transport": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", - "requires": { + "dependencies": { "readable-stream": "^2.3.6", "triple-beam": "^1.2.0" }, + "engines": { + "node": ">= 6.4.0" + } + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/winston-transport/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/winston-transport/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "xml-js": { + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xml-js": { "version": "1.6.11", "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "requires": { + "dependencies": { "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" } }, - "xml-js-builder": { + "node_modules/xml-js-builder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/xml-js-builder/-/xml-js-builder-1.0.3.tgz", "integrity": "sha512-BoLgG/glT45M0jK5PGh9h+iGrQxa8jJk9ofR63GroRifl2tbGB3/yYiVY3wQWHrZgWWfl9+7fhEB/VoD9mWnSg==", - "requires": { + "dependencies": { "xml-js": "^1.6.2" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" } } } diff --git a/module/ASC.WebDav/package.json b/module/ASC.WebDav/package.json index b6bad2a7d..af15c9040 100644 --- a/module/ASC.WebDav/package.json +++ b/module/ASC.WebDav/package.json @@ -16,6 +16,7 @@ "form-data": "^3.0.0", "get-byte": "0.0.0", "help": "^3.0.2", + "node-fetch": "^2.6.9", "patch-package": "^6.4.7", "postinstall-postinstall": "^2.1.0", "request": "^2.88.0", diff --git a/module/ASC.WebDav/resource/customVirtualResource.js b/module/ASC.WebDav/resource/customVirtualResource.js index 93eb3cae9..047480a0d 100644 --- a/module/ASC.WebDav/resource/customVirtualResource.js +++ b/module/ASC.WebDav/resource/customVirtualResource.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const webdav = require('webdav-server').v2; const { getStructDirectory, diff --git a/module/ASC.WebDav/resource/simpleStruct.js b/module/ASC.WebDav/resource/simpleStruct.js index fd674c260..0cc7e90f9 100644 --- a/module/ASC.WebDav/resource/simpleStruct.js +++ b/module/ASC.WebDav/resource/simpleStruct.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + class SimpleStruct { constructor() { this.struct = {}; diff --git a/module/ASC.WebDav/server/config.js b/module/ASC.WebDav/server/config.js index 824d94874..83ae1f0d9 100644 --- a/module/ASC.WebDav/server/config.js +++ b/module/ASC.WebDav/server/config.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + /* Config */ module.exports = { diff --git a/module/ASC.WebDav/server/requestAPI.js b/module/ASC.WebDav/server/requestAPI.js index 91b626624..4f4de6042 100644 --- a/module/ASC.WebDav/server/requestAPI.js +++ b/module/ASC.WebDav/server/requestAPI.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,11 +12,12 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ +*/ const request = require('request'); const axios = require('axios'); +const nodeFetch = require('node-fetch'); const { getHeader, getHeaderPeople, @@ -355,14 +356,27 @@ var createEditSession = async function (ctx, fileId, fileSize, token) { var chunkedUploader = async function (ctx, url, data, token, bytesAmount, firstPosition, secondPosition) { try { const Authorization = token ? token : null; - const response = await axios.post(url, data, { - maxBodyLength: Infinity, + // const response = await axios.post(url, data, { + // maxBodyLength: Infinity, + // headers: { + // Authorization, + // "Content-Type": `multipart/form-data; boundary=${data._boundary}`, + // "Content-Range": `bytes ${firstPosition}-${secondPosition}/${bytesAmount}` + // } + // }); + + const requestConfig = { + method: 'POST', headers: { - Authorization, + "Authorization": Authorization, "Content-Type": `multipart/form-data; boundary=${data._boundary}`, "Content-Range": `bytes ${firstPosition}-${secondPosition}/${bytesAmount}` - } - }); + }, + body: data + }; + + const response = await nodeFetch(url, requestConfig); + logResponse(null, response, "requestAPI.chunkedUploader"); } catch (error) { logErrorAndCheckStatus(ctx.context, error, "requestAPI.chunkedUploader"); diff --git a/module/ASC.WebDav/server/webDavServer.js b/module/ASC.WebDav/server/webDavServer.js index 3f776db4a..c34fae2d7 100644 --- a/module/ASC.WebDav/server/webDavServer.js +++ b/module/ASC.WebDav/server/webDavServer.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const webdav = require('webdav-server').v2; const express = require('express'); @@ -31,7 +31,8 @@ const { keyPath, isHttps, virtualPath -} = require('./config.js'); +} = require(`./config.${process.argv[2]}.js`); + const { logContext, logMessage } = require('../helper/helper.js'); const userManager = new customUserManager(); diff --git a/module/ASC.WebDav/user/authentication/customHTTPBasicAuthentication.js b/module/ASC.WebDav/user/authentication/customHTTPBasicAuthentication.js index 9ee5fac08..9a95a0f64 100644 --- a/module/ASC.WebDav/user/authentication/customHTTPBasicAuthentication.js +++ b/module/ASC.WebDav/user/authentication/customHTTPBasicAuthentication.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const webdav = require('webdav-server').v2; class customHTTPBasicAuthentication extends webdav.HTTPBasicAuthentication diff --git a/module/ASC.WebDav/user/customSimpleUser.js b/module/ASC.WebDav/user/customSimpleUser.js index 8bbd22d36..da54c734e 100644 --- a/module/ASC.WebDav/user/customSimpleUser.js +++ b/module/ASC.WebDav/user/customSimpleUser.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + class customSimpleUser{ constructor(uid, isAdministrator, isDefaultUser, username, token){ this.uid = uid; diff --git a/module/ASC.WebDav/user/customUserLayout.js b/module/ASC.WebDav/user/customUserLayout.js index 82013576f..8cf904236 100644 --- a/module/ASC.WebDav/user/customUserLayout.js +++ b/module/ASC.WebDav/user/customUserLayout.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const customSimpleUser = require('./customSimpleUser.js'); const { userLifeTime } = require('../server/config.js'); diff --git a/module/ASC.WebDav/user/customUserManager.js b/module/ASC.WebDav/user/customUserManager.js index f7683a614..92830afe9 100644 --- a/module/ASC.WebDav/user/customUserManager.js +++ b/module/ASC.WebDav/user/customUserManager.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + const webdav = require('webdav-server').v2; const { requestAuth, diff --git a/module/ASC.WebDav/yarn.lock b/module/ASC.WebDav/yarn.lock index 7a3227b8b..f24408599 100644 --- a/module/ASC.WebDav/yarn.lock +++ b/module/ASC.WebDav/yarn.lock @@ -2,109 +2,107 @@ # yarn lockfile v1 -"@dabh/diagnostics@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.2.tgz#290d08f7b381b8f94607dc8f471a12c675f9db31" - integrity sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q== - dependencies: - colorspace "1.1.x" - enabled "2.0.x" - kuler "^2.0.0" - "@yarnpkg/lockfile@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== accepts@~1.3.7: version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== dependencies: mime-types "~2.1.24" negotiator "0.6.2" -ajv@^6.12.3: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== +ajv@^6.5.5: + version "6.11.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz" + integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - color-convert "^1.9.0" + color-convert "^2.0.1" array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= asn1@~0.2.3: version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz" integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== dependencies: safer-buffer "~2.1.0" -assert-plus@1.0.0, assert-plus@^1.0.0: +assert-plus@^1.0.0, assert-plus@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -async@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" - integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== +async@^2.6.1: + version "2.6.3" + resolved "https://registry.npmjs.org/async/-/async-2.6.3.tgz" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + version "1.9.1" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== axios@^0.21.0: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + version "0.21.0" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz" + integrity sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw== dependencies: follow-redirects "^1.10.0" balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64url@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" + resolved "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz" integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" body-parser@1.19.0: version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== dependencies: bytes "3.1.0" @@ -120,7 +118,7 @@ body-parser@1.19.0: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -128,76 +126,87 @@ brace-expansion@^1.1.7: braces@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" bytes@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== caseless@~0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + ansi-styles "^4.1.0" + supports-color "^7.1.0" ci-info@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.1: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" -color-name@1.1.3: +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@^1.0.0, color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0: +color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.5.2: - version "1.5.4" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" - integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== + version "1.5.3" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" color@3.0.x: version "3.0.0" - resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" + resolved "https://registry.npmjs.org/color/-/color-3.0.0.tgz" integrity sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w== dependencies: color-convert "^1.9.1" color-string "^1.5.2" +colornames@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz" + integrity sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y= + colors@^1.2.1: version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== colorspace@1.1.x: version "1.1.2" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.2.tgz#e0128950d082b86a2168580796a0aa5d6c68d8c5" + resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz" integrity sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ== dependencies: color "3.0.x" @@ -205,46 +214,46 @@ colorspace@1.1.x: combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== content-disposition@0.5.3: version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz" integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== dependencies: safe-buffer "5.1.2" content-type@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@~1.0.0, core-util-is@1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cross-spawn@^6.0.5: version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" @@ -255,36 +264,45 @@ cross-spawn@^6.0.5: dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" debug@2.6.9: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= depd@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= destroy@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +diagnostics@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz" + integrity sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ== + dependencies: + colorspace "1.1.x" + enabled "1.0.x" + kuler "1.0.x" + ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" @@ -292,37 +310,39 @@ ecc-jsbn@~0.1.1: ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -enabled@2.0.x: - version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" - integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== +enabled@1.0.x: + version "1.0.2" + resolved "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz" + integrity sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M= + dependencies: + env-variable "0.0.x" encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= +env-variable@0.0.x: + version "0.0.6" + resolved "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz" + integrity sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg== + escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= express@^4.17.1: version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + resolved "https://registry.npmjs.org/express/-/express-4.17.1.tgz" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== dependencies: accepts "~1.3.7" @@ -358,56 +378,51 @@ express@^4.17.1: extend@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -extsprintf@1.3.0: +extsprintf@^1.2.0, extsprintf@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + version "3.1.1" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-safe-stringify@^2.0.4: version "2.0.7" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz" integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== -fecha@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.0.tgz#3ffb6395453e3f3efff850404f0a59b6747f5f41" - integrity sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg== +fecha@^2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz" + integrity sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg== file-stream-rotator@^0.5.7: version "0.5.7" - resolved "https://registry.yarnpkg.com/file-stream-rotator/-/file-stream-rotator-0.5.7.tgz#868a2e5966f7640a17dd86eda0e4467c089f6286" + resolved "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.5.7.tgz" integrity sha512-VYb3HZ/GiAGUCrfeakO8Mp54YGswNUHvL7P09WQcXAJNSj3iQ5QraYSp3cIn1MUyw6uzfgN/EFOarCNa4JvUHQ== dependencies: moment "^2.11.2" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" finalhandler@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== dependencies: debug "2.6.9" @@ -420,30 +435,25 @@ finalhandler@~1.1.2: find-yarn-workspace-root@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + resolved "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz" integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== dependencies: micromatch "^4.0.2" -fn.name@1.x.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" - integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== - follow-redirects@^1.10.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" - integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== + version "1.13.0" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + version "3.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -451,7 +461,7 @@ form-data@^3.0.0: form-data@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" @@ -460,83 +470,84 @@ form-data@~2.3.2: forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== get-byte@0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/get-byte/-/get-byte-0.0.0.tgz#e8013923a21f8724dd77f06f916a07ae93f325ed" + resolved "https://registry.npmjs.org/get-byte/-/get-byte-0.0.0.tgz" integrity sha512-dFdDPbQR4zCgSxsmMEjVrLHtvSdTVqb2JUfcZ8KYhXUQD8eiE7uTgeHzse5K479Kd8IIRt6503+2gmQhahvJyg== getpass@^0.1.1: version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" glob@^7.1.3: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graceful-fs@^4.1.11, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== har-schema@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== dependencies: - ajv "^6.12.3" + ajv "^6.5.5" har-schema "^2.0.0" -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== help@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/help/-/help-3.0.2.tgz#96e190d4a0a453b89c2cb4b05ab38e3a8f9fdadd" + resolved "https://registry.npmjs.org/help/-/help-3.0.2.tgz" integrity sha1-luGQ1KCkU7icLLSwWrOOOo+f2t0= -http-errors@1.7.2: +http-errors@~1.7.2, http-errors@1.7.2: version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz" integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== dependencies: depd "~1.1.2" @@ -545,20 +556,9 @@ http-errors@1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - http-signature@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" @@ -567,123 +567,125 @@ http-signature@~1.2.0: iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: +inherits@^2.0.3, inherits@~2.0.3, inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-buffer@^2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-ci@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== dependencies: ci-info "^2.0.0" is-docker@^2.0.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-typedarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-wsl@^2.1.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isstream@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema@0.2.3: version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stringify-safe@~5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" jsprim@^1.2.2: version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz" integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" @@ -693,155 +695,155 @@ jsprim@^1.2.2: klaw-sync@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + resolved "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz" integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== dependencies: graceful-fs "^4.1.11" -kuler@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" - integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== +kuler@1.0.x: + version "1.0.1" + resolved "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz" + integrity sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ== + dependencies: + colornames "^1.1.1" -logform@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.2.0.tgz#40f036d19161fc76b68ab50fdc7fe495544492f2" - integrity sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg== +lodash@^4.17.14: + version "4.17.15" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +logform@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz" + integrity sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ== dependencies: colors "^1.2.1" fast-safe-stringify "^2.0.4" - fecha "^4.2.0" + fecha "^2.3.3" ms "^2.1.1" triple-beam "^1.3.0" media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^4.0.2: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.45.0: - version "1.45.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" - integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== - -mime-db@1.49.0: - version "1.49.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" - integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== -mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19: - version "2.1.28" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" - integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== +mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.26" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== dependencies: - mime-db "1.45.0" - -mime-types@~2.1.24: - version "2.1.32" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" - integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== - dependencies: - mime-db "1.49.0" + mime-db "1.43.0" mime@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -minimatch@^3.0.4: +minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== moment@^2.11.2: version "2.29.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + resolved "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz" integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - negotiator@0.6.2: version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== nice-try@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-fetch@^2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + oauth-sign@~0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-hash@^2.0.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz" integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== on-finished@~2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -one-time@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" - integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== - dependencies: - fn.name "1.x.x" +one-time@0.0.4: + version "0.0.4" + resolved "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz" + integrity sha1-+M33eISCb+Tf+T46nMN7HkSAdC4= open@^7.4.2: version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + resolved "https://registry.npmjs.org/open/-/open-7.4.2.tgz" integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== dependencies: is-docker "^2.0.0" @@ -849,104 +851,110 @@ open@^7.4.2: os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== patch-package@^6.4.7: - version "6.4.7" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148" - integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ== + version "6.5.1" + resolved "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz" + integrity sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA== dependencies: "@yarnpkg/lockfile" "^1.1.0" - chalk "^2.4.2" + chalk "^4.1.2" cross-spawn "^6.0.5" find-yarn-workspace-root "^2.0.0" - fs-extra "^7.0.1" + fs-extra "^9.0.0" is-ci "^2.0.0" klaw-sync "^6.0.0" - minimist "^1.2.0" + minimist "^1.2.6" open "^7.4.2" rimraf "^2.6.3" semver "^5.6.0" slash "^2.0.0" tmp "^0.0.33" + yaml "^1.10.2" path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== postinstall-postinstall@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" + resolved "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz" integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== proxy-addr@~2.0.5: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" ipaddr.js "1.9.1" -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== +psl@^1.1.24: + version "1.7.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - qs@~6.5.2: version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +qs@6.7.0: + version "6.7.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz" integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== dependencies: bytes "3.1.0" @@ -954,9 +962,22 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" +readable-stream@^2.3.6: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@^2.3.7: version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" @@ -967,9 +988,9 @@ readable-stream@^2.3.7: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.4.0: +readable-stream@^3.1.1: version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" @@ -977,9 +998,9 @@ readable-stream@^3.4.0: util-deprecate "^1.0.1" request@^2.88.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + version "2.88.0" + resolved "https://registry.npmjs.org/request/-/request-2.88.0.tgz" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -988,7 +1009,7 @@ request@^2.88.0: extend "~3.0.2" forever-agent "~0.6.1" form-data "~2.3.2" - har-validator "~5.1.3" + har-validator "~5.1.0" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" @@ -998,45 +1019,50 @@ request@^2.88.0: performance-now "^2.1.0" qs "~6.5.2" safe-buffer "^5.1.2" - tough-cookie "~2.5.0" + tough-cookie "~2.4.3" tunnel-agent "^0.6.0" uuid "^3.3.2" rimraf@^2.6.3: version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +safer-buffer@^2.0.2, safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3", safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== semver@^5.5.0, semver@^5.6.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== send@0.17.1: version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + resolved "https://registry.npmjs.org/send/-/send-0.17.1.tgz" integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== dependencies: debug "2.6.9" @@ -1055,7 +1081,7 @@ send@0.17.1: serve-static@1.14.1: version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz" integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== dependencies: encodeurl "~1.0.2" @@ -1065,36 +1091,36 @@ serve-static@1.14.1: setprototypeof@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== shebang-command@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= dependencies: is-arrayish "^0.3.1" slash@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + resolved "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== sshpk@^1.7.0: version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz" integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== dependencies: asn1 "~0.2.3" @@ -1109,50 +1135,50 @@ sshpk@^1.7.0: stack-trace@0.0.x: version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: - has-flag "^3.0.0" + has-flag "^4.0.0" text-hex@1.0.x: version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== tmp@^0.0.33: version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" to-byte-array@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/to-byte-array/-/to-byte-array-1.0.2.tgz#da3c121ff6c7eb56e19567f8568b1f351ac842d8" + resolved "https://registry.npmjs.org/to-byte-array/-/to-byte-array-1.0.2.tgz" integrity sha512-3Owdexa2azV7gAW5ZlSqp5646oqOOf3EZ3JsbX6AtIdpA0h3y8YVMS70NwMYzMJdZdgMnXW6UIetkeyIWSycrw== dependencies: base64url "^3.0.1" @@ -1160,89 +1186,94 @@ to-byte-array@^1.0.2: to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== dependencies: - psl "^1.1.28" - punycode "^2.1.1" + psl "^1.1.24" + punycode "^1.4.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== triple-beam@^1.2.0, triple-beam@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" + resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz" integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" mime-types "~2.1.24" -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + version "4.2.2" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== dependencies: punycode "^2.1.0" util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@^3.3.2: version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= verror@1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" @@ -1251,22 +1282,35 @@ verror@1.10.0: webdav-server@2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/webdav-server/-/webdav-server-2.6.2.tgz#5ea39b269aa34a1512c150e29c1b7e27d3a68908" + resolved "https://registry.npmjs.org/webdav-server/-/webdav-server-2.6.2.tgz" integrity sha512-0iHdrOzlKGFD96bTvPF8IIEfxw9Q7jB5LqWqhjyBYsofD6T6mOYqWtAvR88VY9Mq0xeg8bCRHC2Vifc9iuTYuw== dependencies: mime-types "^2.1.18" xml-js-builder "^1.0.3" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which@^1.2.9: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" winston-daily-rotate-file@^4.5.5: version "4.5.5" - resolved "https://registry.yarnpkg.com/winston-daily-rotate-file/-/winston-daily-rotate-file-4.5.5.tgz#cfa3a89f4eb0e4126917592b375759b772bcd972" + resolved "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.5.5.tgz" integrity sha512-ds0WahIjiDhKCiMXmY799pDBW+58ByqIBtUcsqr4oDoXrAI3Zn+hbgFdUxzMfqA93OG0mPLYVMiotqTgE/WeWQ== dependencies: file-stream-rotator "^0.5.7" @@ -1274,44 +1318,57 @@ winston-daily-rotate-file@^4.5.5: triple-beam "^1.3.0" winston-transport "^4.4.0" +winston-transport@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz" + integrity sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A== + dependencies: + readable-stream "^2.3.6" + triple-beam "^1.2.0" + winston-transport@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.0.tgz#17af518daa690d5b2ecccaa7acf7b20ca7925e59" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz" integrity sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw== dependencies: readable-stream "^2.3.7" triple-beam "^1.2.0" -winston@^3.2.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.3.3.tgz#ae6172042cafb29786afa3d09c8ff833ab7c9170" - integrity sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw== - dependencies: - "@dabh/diagnostics" "^2.0.2" - async "^3.1.0" - is-stream "^2.0.0" - logform "^2.2.0" - one-time "^1.0.0" - readable-stream "^3.4.0" +winston@^3, winston@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz" + integrity sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw== + dependencies: + async "^2.6.1" + diagnostics "^1.1.1" + is-stream "^1.1.0" + logform "^2.1.1" + one-time "0.0.4" + readable-stream "^3.1.1" stack-trace "0.0.x" triple-beam "^1.3.0" - winston-transport "^4.4.0" + winston-transport "^4.3.0" wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== xml-js-builder@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/xml-js-builder/-/xml-js-builder-1.0.3.tgz#91d275cb926f9dc4167f029357a5b2875b5d3894" + resolved "https://registry.npmjs.org/xml-js-builder/-/xml-js-builder-1.0.3.tgz" integrity sha512-BoLgG/glT45M0jK5PGh9h+iGrQxa8jJk9ofR63GroRifl2tbGB3/yYiVY3wQWHrZgWWfl9+7fhEB/VoD9mWnSg== dependencies: xml-js "^1.6.2" xml-js@^1.6.2: version "1.6.11" - resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz" integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== dependencies: sax "^1.2.4" + +yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== diff --git a/web/core/ASC.Web.Core/ASC.Web.Core.csproj b/web/core/ASC.Web.Core/ASC.Web.Core.csproj index b6195b824..b762883c2 100644 --- a/web/core/ASC.Web.Core/ASC.Web.Core.csproj +++ b/web/core/ASC.Web.Core/ASC.Web.Core.csproj @@ -47,6 +47,8 @@ 4 Auto false + ..\..\studio\ASC.Web.Studio\bin\ASC.Web.Core.xml + CS1591 none @@ -58,6 +60,8 @@ + + @@ -74,6 +78,7 @@ + @@ -107,7 +112,10 @@ + + + ASPXCodeBehind diff --git a/web/core/ASC.Web.Core/AddonContext.cs b/web/core/ASC.Web.Core/AddonContext.cs index 4919d813f..49f59bd48 100644 --- a/web/core/ASC.Web.Core/AddonContext.cs +++ b/web/core/ASC.Web.Core/AddonContext.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/BasePage.cs b/web/core/ASC.Web.Core/BasePage.cs index 1be79e303..ad1124f2e 100644 --- a/web/core/ASC.Web.Core/BasePage.cs +++ b/web/core/ASC.Web.Core/BasePage.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Web.UI; namespace ASC.Web.Core diff --git a/web/core/ASC.Web.Core/BruteForceLoginManager.cs b/web/core/ASC.Web.Core/BruteForceLoginManager.cs new file mode 100644 index 000000000..6d869329c --- /dev/null +++ b/web/core/ASC.Web.Core/BruteForceLoginManager.cs @@ -0,0 +1,102 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Collections.Generic; +using System.Linq; + +using ASC.Common.Caching; +using ASC.Web.Core.Utility; + +namespace ASC.Web.Core +{ + public class BruteForceLoginManager + { + private LoginSettings settings; + private ICache cache; + private string login; + private string requestIp; + + public BruteForceLoginManager(ICache cache, string login, string requestIp) + { + settings = LoginSettings.Load(); + this.cache = cache; + this.login = login; + this.requestIp = requestIp; + } + + private string GetBlockCacheKey() + { + return "loginblock/" + login + requestIp; + } + + private string GetHistoryCacheKey() + { + return "loginsec/" + login + requestIp; + } + + public bool Increment(out bool showRecaptcha) + { + showRecaptcha = true; + + var blockCacheKey = GetBlockCacheKey(); + + if (cache.Get(blockCacheKey) != null) + { + return false; + } + + var historyCacheKey = GetHistoryCacheKey(); + + var history = cache.Get>(historyCacheKey) ?? new List(); + + var now = DateTime.UtcNow; + + var checkTime = now.Subtract(TimeSpan.FromSeconds(settings.CheckPeriod)); + + history = history.Where(item => item > checkTime).ToList(); + + history.Add(now); + + showRecaptcha = history.Count > settings.AttemptCount - 1; + + if (history.Count > settings.AttemptCount) + { + cache.Insert(blockCacheKey, "block", now.Add(TimeSpan.FromSeconds(settings.BlockTime))); + cache.Remove(historyCacheKey); + return false; + } + + cache.Insert(historyCacheKey, history, now.Add(TimeSpan.FromSeconds(settings.CheckPeriod))); + return true; + } + + public void Decrement() + { + var historyCacheKey = GetHistoryCacheKey(); + + var history = cache.Get>(historyCacheKey) ?? new List(); + + if (history.Count > 0) + { + history.RemoveAt(history.Count - 1); + } + + cache.Insert(historyCacheKey, history, DateTime.UtcNow.Add(TimeSpan.FromSeconds(settings.CheckPeriod))); + } + } +} diff --git a/web/core/ASC.Web.Core/Calendars/BaseCalendar.cs b/web/core/ASC.Web.Core/Calendars/BaseCalendar.cs index 00459727d..749fb4d31 100644 --- a/web/core/ASC.Web.Core/Calendars/BaseCalendar.cs +++ b/web/core/ASC.Web.Core/Calendars/BaseCalendar.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Calendars/BaseEvent.cs b/web/core/ASC.Web.Core/Calendars/BaseEvent.cs index 0509c85fb..cfd7d3169 100644 --- a/web/core/ASC.Web.Core/Calendars/BaseEvent.cs +++ b/web/core/ASC.Web.Core/Calendars/BaseEvent.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Calendars/BaseTodo.cs b/web/core/ASC.Web.Core/Calendars/BaseTodo.cs index 4425bb24a..4e69a130b 100644 --- a/web/core/ASC.Web.Core/Calendars/BaseTodo.cs +++ b/web/core/ASC.Web.Core/Calendars/BaseTodo.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Text; diff --git a/web/core/ASC.Web.Core/Calendars/CalendarColors.cs b/web/core/ASC.Web.Core/Calendars/CalendarColors.cs index 24cbf27a6..12972be2f 100644 --- a/web/core/ASC.Web.Core/Calendars/CalendarColors.cs +++ b/web/core/ASC.Web.Core/Calendars/CalendarColors.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Calendars/CalendarManager.cs b/web/core/ASC.Web.Core/Calendars/CalendarManager.cs index 775978883..ad6a6cda4 100644 --- a/web/core/ASC.Web.Core/Calendars/CalendarManager.cs +++ b/web/core/ASC.Web.Core/Calendars/CalendarManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Calendars/IEvent.cs b/web/core/ASC.Web.Core/Calendars/IEvent.cs index a1caeec45..35810a3ed 100644 --- a/web/core/ASC.Web.Core/Calendars/IEvent.cs +++ b/web/core/ASC.Web.Core/Calendars/IEvent.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Calendars/IExternalCalendar.cs b/web/core/ASC.Web.Core/Calendars/IExternalCalendar.cs index 39ff673d5..c4eec77f0 100644 --- a/web/core/ASC.Web.Core/Calendars/IExternalCalendar.cs +++ b/web/core/ASC.Web.Core/Calendars/IExternalCalendar.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Calendars/ITodo.cs b/web/core/ASC.Web.Core/Calendars/ITodo.cs index 168c46c94..349ffe3c9 100644 --- a/web/core/ASC.Web.Core/Calendars/ITodo.cs +++ b/web/core/ASC.Web.Core/Calendars/ITodo.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; namespace ASC.Web.Core.Calendars diff --git a/web/core/ASC.Web.Core/Calendars/IiCalFormatView.cs b/web/core/ASC.Web.Core/Calendars/IiCalFormatView.cs index af17edfab..460672729 100644 --- a/web/core/ASC.Web.Core/Calendars/IiCalFormatView.cs +++ b/web/core/ASC.Web.Core/Calendars/IiCalFormatView.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Calendars/RecurrenceRule.cs b/web/core/ASC.Web.Core/Calendars/RecurrenceRule.cs index ee42cd19a..0c31462a2 100644 --- a/web/core/ASC.Web.Core/Calendars/RecurrenceRule.cs +++ b/web/core/ASC.Web.Core/Calendars/RecurrenceRule.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Calendars/SharingOptions.cs b/web/core/ASC.Web.Core/Calendars/SharingOptions.cs index cc3038193..9575be2b7 100644 --- a/web/core/ASC.Web.Core/Calendars/SharingOptions.cs +++ b/web/core/ASC.Web.Core/Calendars/SharingOptions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Client/Bundling/BundleConfig.cs b/web/core/ASC.Web.Core/Client/Bundling/BundleConfig.cs index 95a16d8e8..30a87a02a 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/BundleConfig.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/BundleConfig.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Client/Bundling/BundleHelper.cs b/web/core/ASC.Web.Core/Client/Bundling/BundleHelper.cs index 0c9825627..af49cbf8a 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/BundleHelper.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/BundleHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Client/Bundling/ClientScriptReference.cs b/web/core/ASC.Web.Core/Client/Bundling/ClientScriptReference.cs index ed20fb82b..eea457b0e 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/ClientScriptReference.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/ClientScriptReference.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Client/Bundling/ClientScriptRouteHandler.cs b/web/core/ASC.Web.Core/Client/Bundling/ClientScriptRouteHandler.cs index 9998198db..c7f8a0ed2 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/ClientScriptRouteHandler.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/ClientScriptRouteHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Client/Bundling/CloudFrontTransform.cs b/web/core/ASC.Web.Core/Client/Bundling/CloudFrontTransform.cs index 7711692f9..b8c09bdd2 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/CloudFrontTransform.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/CloudFrontTransform.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -201,7 +201,7 @@ private void UploadToCdn() } var cache = TimeSpan.FromDays(365); - request.Headers.CacheControl = string.Format("public, maxage={0}", (int)cache.TotalSeconds); + request.Headers.CacheControl = string.Format("public, max-age={0}", (int)cache.TotalSeconds); request.Headers.ExpiresUtc = DateTime.UtcNow.Add(cache); request.Headers["x-amz-meta-etag"] = checksum; diff --git a/web/core/ASC.Web.Core/Client/Bundling/CopyrigthTransform.cs b/web/core/ASC.Web.Core/Client/Bundling/CopyrigthTransform.cs index 7b8ae12e7..a772d2168 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/CopyrigthTransform.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/CopyrigthTransform.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Client/Bundling/CssTransform.cs b/web/core/ASC.Web.Core/Client/Bundling/CssTransform.cs index eb581f2c4..06ef5e5f3 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/CssTransform.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/CssTransform.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Client/Bundling/DiscTransform.cs b/web/core/ASC.Web.Core/Client/Bundling/DiscTransform.cs index 68bcb36f4..c1fcad388 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/DiscTransform.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/DiscTransform.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Client/Bundling/GoogleCloudStorageTransform.cs b/web/core/ASC.Web.Core/Client/Bundling/GoogleCloudStorageTransform.cs index 10a840eb5..adabc2f50 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/GoogleCloudStorageTransform.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/GoogleCloudStorageTransform.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -226,7 +226,7 @@ private void UploadToCdn() var cache = TimeSpan.FromDays(365); - uploaded.CacheControl = String.Format("public, maxage={0}", (int)cache.TotalSeconds); + uploaded.CacheControl = String.Format("public, max-age={0}", (int)cache.TotalSeconds); uploaded.Metadata["Expires"] = DateTime.UtcNow.Add(TimeSpan.FromDays(365)).ToString("R"); storage.UpdateObject(uploaded); diff --git a/web/core/ASC.Web.Core/Client/Bundling/IStaticBundle.cs b/web/core/ASC.Web.Core/Client/Bundling/IStaticBundle.cs index ca2e15436..66e6c31a7 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/IStaticBundle.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/IStaticBundle.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Security.Cryptography; @@ -30,6 +30,7 @@ public interface IStaticBundle { ScriptBundleData GetStaticJavaScript(); StyleBundleData GetStaticStyleSheet(); + StyleBundleData GetStaticDarkStyleSheet(); } public class BundleData diff --git a/web/core/ASC.Web.Core/Client/Bundling/JsTransform.cs b/web/core/ASC.Web.Core/Client/Bundling/JsTransform.cs index bb99d5c99..a9fb925fc 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/JsTransform.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/JsTransform.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Client/Bundling/NullOrderer.cs b/web/core/ASC.Web.Core/Client/Bundling/NullOrderer.cs index ccd711db1..2b7090bb9 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/NullOrderer.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/NullOrderer.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Client/Bundling/RackspaceCloudStorageTransform.cs b/web/core/ASC.Web.Core/Client/Bundling/RackspaceCloudStorageTransform.cs index 99b57d2e5..204dd452d 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/RackspaceCloudStorageTransform.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/RackspaceCloudStorageTransform.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -199,7 +199,7 @@ private void UploadToCdn() var cache = TimeSpan.FromDays(365); - customHeaders.Add("Cache-Control", String.Format("public, maxage={0}", (int)cache.TotalSeconds)); + customHeaders.Add("Cache-Control", String.Format("public, max-age={0}", (int)cache.TotalSeconds)); customHeaders.Add("Expires", DateTime.UtcNow.Add(cache).ToString()); client.CreateObject(_container, inputStream, path, mime, 4096, customHeaders); diff --git a/web/core/ASC.Web.Core/Client/Bundling/ResourceBundleControl.cs b/web/core/ASC.Web.Core/Client/Bundling/ResourceBundleControl.cs index 7064b4f1a..7b5d9b2f4 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/ResourceBundleControl.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/ResourceBundleControl.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Client/Bundling/SelectelStorageTransform.cs b/web/core/ASC.Web.Core/Client/Bundling/SelectelStorageTransform.cs index 2d9311952..e0e802d4d 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/SelectelStorageTransform.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/SelectelStorageTransform.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -186,7 +186,7 @@ private void UploadToCdn() var cache = TimeSpan.FromDays(365); - customHeaders.Add("Cache-Control", String.Format("public, maxage={0}", (int)cache.TotalSeconds)); + customHeaders.Add("Cache-Control", String.Format("public, max-age={0}", (int)cache.TotalSeconds)); customHeaders.Add("Expires", DateTime.UtcNow.Add(cache)); client.UploadFileAsync(_container, key, true, true, inputStream, etag, null, mime, null, null, customHeaders).Wait(); diff --git a/web/core/ASC.Web.Core/Client/Bundling/StorageTransform.cs b/web/core/ASC.Web.Core/Client/Bundling/StorageTransform.cs index 05b7a94b8..bdbb5a547 100644 --- a/web/core/ASC.Web.Core/Client/Bundling/StorageTransform.cs +++ b/web/core/ASC.Web.Core/Client/Bundling/StorageTransform.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.IO; using System.Text; diff --git a/web/core/ASC.Web.Core/Client/ClientCapabilities.cs b/web/core/ASC.Web.Core/Client/ClientCapabilities.cs index 763bad975..5ecb80b43 100644 --- a/web/core/ASC.Web.Core/Client/ClientCapabilities.cs +++ b/web/core/ASC.Web.Core/Client/ClientCapabilities.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Client/ClientSettings.cs b/web/core/ASC.Web.Core/Client/ClientSettings.cs index 2c028a79b..480b90125 100644 --- a/web/core/ASC.Web.Core/Client/ClientSettings.cs +++ b/web/core/ASC.Web.Core/Client/ClientSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ public static class ClientSettings private static bool? bundlesEnabled; private static bool? storeEnabled; private static bool? gzipEnabled; + private static bool? sameSiteCookieEnabled; private static readonly string resetCacheKey = ConfigurationManagerExtension.AppSettings["web.client.cache.resetkey"] ?? DateTime.UtcNow.ToString("yyyyMMddhhmmss"); @@ -43,6 +44,11 @@ public static bool GZipEnabled get { return gzipEnabled ?? (bool)(gzipEnabled = bool.Parse(ConfigurationManagerExtension.AppSettings["web.client.store.gzip"] ?? "true")); } } + public static bool SameSiteCookieEnabled + { + get { return sameSiteCookieEnabled ?? (bool)(sameSiteCookieEnabled = bool.Parse(ConfigurationManagerExtension.AppSettings["web.client.cookie.samesite"] ?? "false")); } + } + public static string ResetCacheKey { get { return resetCacheKey; } diff --git a/web/core/ASC.Web.Core/Client/HttpHandlers/ClientScript.cs b/web/core/ASC.Web.Core/Client/HttpHandlers/ClientScript.cs index 10b114899..00d1c5ef8 100644 --- a/web/core/ASC.Web.Core/Client/HttpHandlers/ClientScript.cs +++ b/web/core/ASC.Web.Core/Client/HttpHandlers/ClientScript.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Client/HttpHandlers/ClientScriptCustom.cs b/web/core/ASC.Web.Core/Client/HttpHandlers/ClientScriptCustom.cs index 91d567afa..be9f71f43 100644 --- a/web/core/ASC.Web.Core/Client/HttpHandlers/ClientScriptCustom.cs +++ b/web/core/ASC.Web.Core/Client/HttpHandlers/ClientScriptCustom.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Client/HttpHandlers/ClientScriptLocalization.cs b/web/core/ASC.Web.Core/Client/HttpHandlers/ClientScriptLocalization.cs index e8e07cdf4..2c1b93dcc 100644 --- a/web/core/ASC.Web.Core/Client/HttpHandlers/ClientScriptLocalization.cs +++ b/web/core/ASC.Web.Core/Client/HttpHandlers/ClientScriptLocalization.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/CommonPhotoManager.cs b/web/core/ASC.Web.Core/CommonPhotoManager.cs index ae75556d1..7f4f15e57 100644 --- a/web/core/ASC.Web.Core/CommonPhotoManager.cs +++ b/web/core/ASC.Web.Core/CommonPhotoManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/CookiesManager.cs b/web/core/ASC.Web.Core/CookiesManager.cs index b219b9b8a..187a785ee 100644 --- a/web/core/ASC.Web.Core/CookiesManager.cs +++ b/web/core/ASC.Web.Core/CookiesManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ using ASC.Core.Tenants; using ASC.Core.Users; using ASC.MessagingSystem; +using ASC.Web.Core.Client; using ASC.Web.Studio.Utility; using SecurityContext = ASC.Core.SecurityContext; @@ -33,13 +34,22 @@ namespace ASC.Web.Core public enum CookiesType { AuthKey, - SocketIO + SocketIO, + ShareLink, + ComebackAuthKey, + CurrentShareLink, + AnonymousSessionKey, + ModeThemeKey } public class CookiesManager { private const string AuthCookiesName = "asc_auth_key"; private const string SocketIOCookiesName = "socketio.sid"; + private const string ShareLinkCookiesName = "sharelink"; + private const string ComebackAuthKeyCookiesName = "comeback_auth_key"; + private const string AnonymousSessionKeyCookiesName = "anonymous_session_key"; + private const string ModeThemeKeyCookiesName = "mode_theme_key"; private static string GetCookiesName(CookiesType type) { @@ -47,92 +57,132 @@ private static string GetCookiesName(CookiesType type) { case CookiesType.AuthKey: return AuthCookiesName; case CookiesType.SocketIO: return SocketIOCookiesName; + case CookiesType.ShareLink: return ShareLinkCookiesName; + case CookiesType.ComebackAuthKey: return ComebackAuthKeyCookiesName; + case CookiesType.AnonymousSessionKey:return AnonymousSessionKeyCookiesName; + case CookiesType.ModeThemeKey: return ModeThemeKeyCookiesName; } return string.Empty; } + public static string GetCookiesName(CookiesType type, string itemId) + { + var cookieName = GetCookiesName(type); + + if (!string.IsNullOrEmpty(itemId)) + { + cookieName += itemId; + } + + return cookieName; + } + public static string GetRequestVar(CookiesType type) { if (HttpContext.Current == null) return ""; - var cookie = HttpContext.Current.Request.QueryString[GetCookiesName(type)] ?? HttpContext.Current.Request.Form[GetCookiesName(type)]; + var cookieName = GetCookiesName(type); + + var cookie = HttpContext.Current.Request.QueryString[cookieName] ?? HttpContext.Current.Request.Form[cookieName]; return string.IsNullOrEmpty(cookie) ? GetCookies(type) : cookie; } public static void SetCookies(CookiesType type, string value, bool session = false) + { + SetCookies(type, null, value, null, session, type != CookiesType.SocketIO); + } + + public static void SetCookies(CookiesType type, string value, string domain, bool session = false) + { + SetCookies(type, null, value, domain, session, type != CookiesType.SocketIO); + } + + public static void SetCookies(CookiesType type, string itemId, string value, string domain, bool session = false, bool httpOnly = false) { if (HttpContext.Current == null) return; - HttpContext.Current.Response.Cookies[GetCookiesName(type)].Value = value; - HttpContext.Current.Response.Cookies[GetCookiesName(type)].Expires = GetExpiresDate(session); + var cookieName = GetCookiesName(type, itemId); + + HttpContext.Current.Response.Cookies[cookieName].Value = value; + HttpContext.Current.Response.Cookies[cookieName].Expires = GetExpiresDate(session); + + if (!string.IsNullOrEmpty(domain)) + { + HttpContext.Current.Response.Cookies[cookieName].Domain = domain; + } - if (type == CookiesType.AuthKey) + if (httpOnly) { - HttpContext.Current.Response.Cookies[GetCookiesName(type)].HttpOnly = true; + HttpContext.Current.Response.Cookies[cookieName].HttpOnly = true; if (HttpContext.Current.Request.GetUrlRewriter().Scheme == "https") { - HttpContext.Current.Response.Cookies[GetCookiesName(type)].Secure = true; - if (CoreContext.Configuration.Personal) + HttpContext.Current.Response.Cookies[cookieName].Secure = true; + + if (ClientSettings.SameSiteCookieEnabled) { - var cookies = HttpContext.Current.Response.Cookies[GetCookiesName(type)]; + var cookies = HttpContext.Current.Response.Cookies[cookieName]; cookies.GetType() .GetProperty("SameSite") .SetValue(cookies, 0); } } - } } - public static void SetCookies(CookiesType type, string value, string domain, bool session = false) + public static HttpCookie GetCookie(CookiesType type, string itemId) { - if (HttpContext.Current == null) return; - - HttpContext.Current.Response.Cookies[GetCookiesName(type)].Value = value; - HttpContext.Current.Response.Cookies[GetCookiesName(type)].Domain = domain; - HttpContext.Current.Response.Cookies[GetCookiesName(type)].Expires = GetExpiresDate(session); - - if (type == CookiesType.AuthKey) + if (HttpContext.Current == null) { - HttpContext.Current.Response.Cookies[GetCookiesName(type)].HttpOnly = true; + return null; + } - if (HttpContext.Current.Request.GetUrlRewriter().Scheme == "https") - { - HttpContext.Current.Response.Cookies[GetCookiesName(type)].Secure = true; - if (CoreContext.Configuration.Personal) - { - var cookies = HttpContext.Current.Response.Cookies[GetCookiesName(type)]; + var cookieName = GetCookiesName(type, itemId); - cookies.GetType() - .GetProperty("SameSite") - .SetValue(cookies, 0); - } - } - } + return HttpContext.Current.Request.Cookies[cookieName]; } public static string GetCookies(CookiesType type) + { + return GetCookies(type, null); + } + + public static string GetCookies(CookiesType type, string itemId, bool allowHeader = false) { if (HttpContext.Current != null) { - var cookieName = GetCookiesName(type); + var cookieName = GetCookiesName(type, itemId); + + var cookie = HttpContext.Current.Request.Cookies[cookieName]; + if (cookie != null) + { + return cookie.Value ?? ""; + } - if (HttpContext.Current.Request.Cookies[cookieName] != null) - return HttpContext.Current.Request.Cookies[cookieName].Value ?? ""; + if (allowHeader) + { + return HttpContext.Current.Request.Headers[cookieName] ?? ""; + } } return ""; } public static void ClearCookies(CookiesType type) + { + ClearCookies(type, null); + } + + public static void ClearCookies(CookiesType type, string itemId) { if (HttpContext.Current == null) return; - if (HttpContext.Current.Request.Cookies[GetCookiesName(type)] != null) - HttpContext.Current.Response.Cookies[GetCookiesName(type)].Expires = DateTime.Now.AddDays(-3); + var cookieName = GetCookiesName(type, itemId); + + if (HttpContext.Current.Request.Cookies[cookieName] != null) + HttpContext.Current.Response.Cookies[cookieName].Expires = DateTime.Now.AddDays(-3); } private static DateTime GetExpiresDate(bool session) diff --git a/web/core/ASC.Web.Core/Extensions/EnumExtension.cs b/web/core/ASC.Web.Core/Extensions/EnumExtension.cs index ef098bf06..096ee79fb 100644 --- a/web/core/ASC.Web.Core/Extensions/EnumExtension.cs +++ b/web/core/ASC.Web.Core/Extensions/EnumExtension.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Extensions/ProductModuleExtension.cs b/web/core/ASC.Web.Core/Extensions/ProductModuleExtension.cs index 58b19a257..930b4d564 100644 --- a/web/core/ASC.Web.Core/Extensions/ProductModuleExtension.cs +++ b/web/core/ASC.Web.Core/Extensions/ProductModuleExtension.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Extensions/StringExtension.cs b/web/core/ASC.Web.Core/Extensions/StringExtension.cs index 1a5db100d..da2773abf 100644 --- a/web/core/ASC.Web.Core/Extensions/StringExtension.cs +++ b/web/core/ASC.Web.Core/Extensions/StringExtension.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Extensions/TimeZoneExtension.cs b/web/core/ASC.Web.Core/Extensions/TimeZoneExtension.cs index 87589a340..69ec33499 100644 --- a/web/core/ASC.Web.Core/Extensions/TimeZoneExtension.cs +++ b/web/core/ASC.Web.Core/Extensions/TimeZoneExtension.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace System { public static class TimeZoneExtension diff --git a/web/core/ASC.Web.Core/Extensions/UserInfoExtension.cs b/web/core/ASC.Web.Core/Extensions/UserInfoExtension.cs index d61cd0b3d..481e92e7c 100644 --- a/web/core/ASC.Web.Core/Extensions/UserInfoExtension.cs +++ b/web/core/ASC.Web.Core/Extensions/UserInfoExtension.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Extensions/WebItemExtension.cs b/web/core/ASC.Web.Core/Extensions/WebItemExtension.cs index 62760bec1..7479b8ba9 100644 --- a/web/core/ASC.Web.Core/Extensions/WebItemExtension.cs +++ b/web/core/ASC.Web.Core/Extensions/WebItemExtension.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Files/ContentDispositionUtil.cs b/web/core/ASC.Web.Core/Files/ContentDispositionUtil.cs index 48afdd628..a90ebeb97 100644 --- a/web/core/ASC.Web.Core/Files/ContentDispositionUtil.cs +++ b/web/core/ASC.Web.Core/Files/ContentDispositionUtil.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Files/DocumentService.cs b/web/core/ASC.Web.Core/Files/DocumentService.cs index d1bed574e..7f6044afa 100644 --- a/web/core/ASC.Web.Core/Files/DocumentService.cs +++ b/web/core/ASC.Web.Core/Files/DocumentService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -84,6 +84,7 @@ public static string GenerateRevisionId(string expectedKey) /// Password /// Four letter language codes /// Thumbnail settings + /// /// Perform conversions asynchronously /// Secret key to generate the token /// Uri to the converted document @@ -234,7 +235,6 @@ public static int GetConvertedUri( /// users id for drop /// file meta data for update /// Secret key to generate the token - /// server version /// Response public static CommandResponse CommandRequest( string documentTrackerUrl, diff --git a/web/core/ASC.Web.Core/Files/DocumentServiceLicense.cs b/web/core/ASC.Web.Core/Files/DocumentServiceLicense.cs index d2ecc17ac..e72d2a85a 100644 --- a/web/core/ASC.Web.Core/Files/DocumentServiceLicense.cs +++ b/web/core/ASC.Web.Core/Files/DocumentServiceLicense.cs @@ -1,19 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; diff --git a/web/core/ASC.Web.Core/Files/FileType.cs b/web/core/ASC.Web.Core/Files/FileType.cs index 021b32ea8..491596e17 100644 --- a/web/core/ASC.Web.Core/Files/FileType.cs +++ b/web/core/ASC.Web.Core/Files/FileType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Files/FileUtility.cs b/web/core/ASC.Web.Core/Files/FileUtility.cs index 78b4a436a..b65332dc6 100644 --- a/web/core/ASC.Web.Core/Files/FileUtility.cs +++ b/web/core/ASC.Web.Core/Files/FileUtility.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -155,10 +155,10 @@ public static Dictionary> ExtsConvertible _extsConvertible = new Dictionary>(); if (string.IsNullOrEmpty(FilesLinkUtility.DocServiceConverterUrl)) return _extsConvertible; - const string databaseId = "files"; + const string databaseId = "default"; const string tableTitle = "files_converts"; - using (var dbManager = DbManager.FromHttpContext(databaseId)) + using (var dbManager = new DbManager(databaseId)) { var sqlQuery = new SqlQuery(tableTitle).Select("input", "output"); diff --git a/web/core/ASC.Web.Core/Files/FilesLinkUtility.cs b/web/core/ASC.Web.Core/Files/FilesLinkUtility.cs index f027401a6..393c774e7 100644 --- a/web/core/ASC.Web.Core/Files/FilesLinkUtility.cs +++ b/web/core/ASC.Web.Core/Files/FilesLinkUtility.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,6 +51,8 @@ public static string FilesBaseAbsolutePath public const string OutType = "outputtype"; public const string AuthKey = "stream_auth"; public const string Anchor = "anchor"; + public const string LinkId = "linkid"; + public const string FolderShareKey = "share"; public static string FileHandlerPath { @@ -366,7 +368,7 @@ public static string GetFileThumbnailUrl(object fileId, int fileVersion) } - public static string GetInitiateUploadSessionUrl(object folderId, object fileId, string fileName, long contentLength, bool encrypted) + public static string GetInitiateUploadSessionUrl(object folderId, object fileId, string fileName, long contentLength, bool encrypted, string linkId) { var queryString = string.Format("?initiate=true&{0}={1}&fileSize={2}&tid={3}&userid={4}&culture={5}&encrypted={6}", FileTitle, @@ -383,6 +385,17 @@ public static string GetInitiateUploadSessionUrl(object folderId, object fileId, if (folderId != null) queryString = queryString + "&" + FolderId + "=" + HttpUtility.UrlEncode(folderId.ToString()); + if (!string.IsNullOrEmpty(linkId)) + { + queryString = queryString + "&" + LinkId + "=" + HttpUtility.UrlEncode(InstanceCrypto.Encrypt(linkId)); + } + + var shareKey = HttpContext.Current?.Request[FolderShareKey]; + if (!string.IsNullOrEmpty(shareKey)) + { + queryString = queryString + "&" + FolderShareKey + "=" + shareKey; + } + return CommonLinkUtility.GetFullAbsolutePath(GetFileUploaderHandlerVirtualPath() + queryString); } diff --git a/web/core/ASC.Web.Core/Files/IThumbnailBuilderService.cs b/web/core/ASC.Web.Core/Files/IThumbnailBuilderService.cs index c3d90edaa..be0b1efb6 100644 --- a/web/core/ASC.Web.Core/Files/IThumbnailBuilderService.cs +++ b/web/core/ASC.Web.Core/Files/IThumbnailBuilderService.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; using System.ServiceModel; diff --git a/web/core/ASC.Web.Core/Files/ThumbnailBuilderServiceClient.cs b/web/core/ASC.Web.Core/Files/ThumbnailBuilderServiceClient.cs index f0c8ca6d8..9d9a7c8b7 100644 --- a/web/core/ASC.Web.Core/Files/ThumbnailBuilderServiceClient.cs +++ b/web/core/ASC.Web.Core/Files/ThumbnailBuilderServiceClient.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; using ASC.Common.Module; diff --git a/web/core/ASC.Web.Core/Helpers/ApiSystemHelper.cs b/web/core/ASC.Web.Core/Helpers/ApiSystemHelper.cs index cdbc4d140..ce01f6f4e 100644 --- a/web/core/ASC.Web.Core/Helpers/ApiSystemHelper.cs +++ b/web/core/ASC.Web.Core/Helpers/ApiSystemHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Helpers/AuthorizationHelper.cs b/web/core/ASC.Web.Core/Helpers/AuthorizationHelper.cs index c0a3fb9b7..2f742f951 100644 --- a/web/core/ASC.Web.Core/Helpers/AuthorizationHelper.cs +++ b/web/core/ASC.Web.Core/Helpers/AuthorizationHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Helpers/GrammaticalHelper.cs b/web/core/ASC.Web.Core/Helpers/GrammaticalHelper.cs index fb794761d..aa486ccf8 100644 --- a/web/core/ASC.Web.Core/Helpers/GrammaticalHelper.cs +++ b/web/core/ASC.Web.Core/Helpers/GrammaticalHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Helpers/ImageHelpers.cs b/web/core/ASC.Web.Core/Helpers/ImageHelpers.cs index facc4d6c1..95194165a 100644 --- a/web/core/ASC.Web.Core/Helpers/ImageHelpers.cs +++ b/web/core/ASC.Web.Core/Helpers/ImageHelpers.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Helpers/ResourceEnumConverter.cs b/web/core/ASC.Web.Core/Helpers/ResourceEnumConverter.cs index ea1b29470..2697ae5cd 100644 --- a/web/core/ASC.Web.Core/Helpers/ResourceEnumConverter.cs +++ b/web/core/ASC.Web.Core/Helpers/ResourceEnumConverter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/IAddon.cs b/web/core/ASC.Web.Core/IAddon.cs index 0773d5615..92287a1bb 100644 --- a/web/core/ASC.Web.Core/IAddon.cs +++ b/web/core/ASC.Web.Core/IAddon.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/IModule.cs b/web/core/ASC.Web.Core/IModule.cs index 1c2c8dd63..6c05b3089 100644 --- a/web/core/ASC.Web.Core/IModule.cs +++ b/web/core/ASC.Web.Core/IModule.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/IProduct.cs b/web/core/ASC.Web.Core/IProduct.cs index 930680544..f4f769c73 100644 --- a/web/core/ASC.Web.Core/IProduct.cs +++ b/web/core/ASC.Web.Core/IProduct.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/IWebItem.cs b/web/core/ASC.Web.Core/IWebItem.cs index 0b1f16901..4f6ebba19 100644 --- a/web/core/ASC.Web.Core/IWebItem.cs +++ b/web/core/ASC.Web.Core/IWebItem.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Jabber/FireBase.cs b/web/core/ASC.Web.Core/Jabber/FireBase.cs index acbfc97e6..00700ab78 100644 --- a/web/core/ASC.Web.Core/Jabber/FireBase.cs +++ b/web/core/ASC.Web.Core/Jabber/FireBase.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; using ASC.Core.Common.Configuration; @@ -52,7 +52,7 @@ public FireBase() { } - public FireBase(string name, int order, Dictionary props, Dictionary additional = null) + public FireBase(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } diff --git a/web/core/ASC.Web.Core/Jabber/JabberServiceClient.cs b/web/core/ASC.Web.Core/Jabber/JabberServiceClient.cs index 9974bd384..e6de23df1 100644 --- a/web/core/ASC.Web.Core/Jabber/JabberServiceClient.cs +++ b/web/core/ASC.Web.Core/Jabber/JabberServiceClient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Mail/MailServiceHelper.cs b/web/core/ASC.Web.Core/Mail/MailServiceHelper.cs index 581171e77..ea32b4ab2 100644 --- a/web/core/ASC.Web.Core/Mail/MailServiceHelper.cs +++ b/web/core/ASC.Web.Core/Mail/MailServiceHelper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Configuration; using System.Linq; @@ -60,7 +60,7 @@ private static string GetDefaultDatabase() private static IDbManager GetDb() { - return DbManager.FromHttpContext("webstudio"); + return new DbManager("default"); } private static IDbManager GetDb(string dbid, string connectionString) @@ -74,7 +74,7 @@ private static IDbManager GetDb(string dbid, string connectionString) DbRegistry.RegisterDatabase(connectionSettings.Name, connectionSettings); - return DbManager.FromHttpContext(connectionSettings.Name); + return new DbManager(connectionSettings.Name); } private static void DemandPermission() diff --git a/web/core/ASC.Web.Core/Mobile/CachedMobileAppInstallRegistrator.cs b/web/core/ASC.Web.Core/Mobile/CachedMobileAppInstallRegistrator.cs index 43e8509c6..af0f10620 100644 --- a/web/core/ASC.Web.Core/Mobile/CachedMobileAppInstallRegistrator.cs +++ b/web/core/ASC.Web.Core/Mobile/CachedMobileAppInstallRegistrator.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Mobile/IMobileAppInstallRegistrator.cs b/web/core/ASC.Web.Core/Mobile/IMobileAppInstallRegistrator.cs index 0f513fc36..7b1c50e21 100644 --- a/web/core/ASC.Web.Core/Mobile/IMobileAppInstallRegistrator.cs +++ b/web/core/ASC.Web.Core/Mobile/IMobileAppInstallRegistrator.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Mobile/MobileAppInstallRegistrator.cs b/web/core/ASC.Web.Core/Mobile/MobileAppInstallRegistrator.cs index da70c454c..0439c2852 100644 --- a/web/core/ASC.Web.Core/Mobile/MobileAppInstallRegistrator.cs +++ b/web/core/ASC.Web.Core/Mobile/MobileAppInstallRegistrator.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -61,7 +61,7 @@ public bool IsInstallRegistered(string userEmail, MobileAppType? appType) private IDbManager GetDbManager() { - return DbManager.FromHttpContext("default"); + return new DbManager("default"); } } } \ No newline at end of file diff --git a/web/core/ASC.Web.Core/Mobile/MobileDetector.cs b/web/core/ASC.Web.Core/Mobile/MobileDetector.cs index b7b3582bc..bc35d7788 100644 --- a/web/core/ASC.Web.Core/Mobile/MobileDetector.cs +++ b/web/core/ASC.Web.Core/Mobile/MobileDetector.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/ModuleContext.cs b/web/core/ASC.Web.Core/ModuleContext.cs index cc9dee270..8fab126f0 100644 --- a/web/core/ASC.Web.Core/ModuleContext.cs +++ b/web/core/ASC.Web.Core/ModuleContext.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/ModuleManagement/Common/ISearchHandler.cs b/web/core/ASC.Web.Core/ModuleManagement/Common/ISearchHandler.cs index f63056b65..bae5ec4b8 100644 --- a/web/core/ASC.Web.Core/ModuleManagement/Common/ISearchHandler.cs +++ b/web/core/ASC.Web.Core/ModuleManagement/Common/ISearchHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/ModuleManagement/Common/IShortcutProvider.cs b/web/core/ASC.Web.Core/ModuleManagement/Common/IShortcutProvider.cs index d5563fdb4..8120b37e8 100644 --- a/web/core/ASC.Web.Core/ModuleManagement/Common/IShortcutProvider.cs +++ b/web/core/ASC.Web.Core/ModuleManagement/Common/IShortcutProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/ModuleManagement/Module.cs b/web/core/ASC.Web.Core/ModuleManagement/Module.cs index dc4b1105f..8437429dd 100644 --- a/web/core/ASC.Web.Core/ModuleManagement/Module.cs +++ b/web/core/ASC.Web.Core/ModuleManagement/Module.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/NavigationWebItem.cs b/web/core/ASC.Web.Core/NavigationWebItem.cs index eec5a883a..be070403a 100644 --- a/web/core/ASC.Web.Core/NavigationWebItem.cs +++ b/web/core/ASC.Web.Core/NavigationWebItem.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Product.cs b/web/core/ASC.Web.Core/Product.cs index 0bfab9628..915d874f9 100644 --- a/web/core/ASC.Web.Core/Product.cs +++ b/web/core/ASC.Web.Core/Product.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/ProductAttribute.cs b/web/core/ASC.Web.Core/ProductAttribute.cs index 05e72cec9..9d444f4ea 100644 --- a/web/core/ASC.Web.Core/ProductAttribute.cs +++ b/web/core/ASC.Web.Core/ProductAttribute.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/ProductContext.cs b/web/core/ASC.Web.Core/ProductContext.cs index 287ea6e90..9c5880ce7 100644 --- a/web/core/ASC.Web.Core/ProductContext.cs +++ b/web/core/ASC.Web.Core/ProductContext.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Security/SecurityAttribute.cs b/web/core/ASC.Web.Core/Security/SecurityAttribute.cs index afbc4a3e2..f179769b9 100644 --- a/web/core/ASC.Web.Core/Security/SecurityAttribute.cs +++ b/web/core/ASC.Web.Core/Security/SecurityAttribute.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Security/SecurityPassthroughAttribute.cs b/web/core/ASC.Web.Core/Security/SecurityPassthroughAttribute.cs index 99536b94d..c93156b98 100644 --- a/web/core/ASC.Web.Core/Security/SecurityPassthroughAttribute.cs +++ b/web/core/ASC.Web.Core/Security/SecurityPassthroughAttribute.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Sms/SmsKeyStorage.cs b/web/core/ASC.Web.Core/Sms/SmsKeyStorage.cs index 4a57fc8da..7df75b477 100644 --- a/web/core/ASC.Web.Core/Sms/SmsKeyStorage.cs +++ b/web/core/ASC.Web.Core/Sms/SmsKeyStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Sms/SmsProvider.cs b/web/core/ASC.Web.Core/Sms/SmsProvider.cs index 6837663f4..504696cb1 100644 --- a/web/core/ASC.Web.Core/Sms/SmsProvider.cs +++ b/web/core/ASC.Web.Core/Sms/SmsProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -121,7 +121,7 @@ protected SmsProvider() { } - protected SmsProvider(string name, int order, Dictionary props, Dictionary additional = null) + protected SmsProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } @@ -178,7 +178,7 @@ public SmscProvider() { } - public SmscProvider(string name, int order, Dictionary props, Dictionary additional = null) + public SmscProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } @@ -313,7 +313,7 @@ public ClickatellProvider() { } - public ClickatellProvider(string name, int order, Dictionary props, Dictionary additional = null) + public ClickatellProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } @@ -325,7 +325,7 @@ public ClickatellUSAProvider() { } - public ClickatellUSAProvider(string name, int order, Dictionary additional = null) + public ClickatellUSAProvider(string name, int order, Dictionary additional = null) : base(name, order, null, additional) { } @@ -399,7 +399,7 @@ public TwilioProvider() { } - public TwilioProvider(string name, int order, Dictionary props, Dictionary additional = null) + public TwilioProvider(string name, int order, Dictionary props, Dictionary additional = null) : base(name, order, props, additional) { } @@ -440,7 +440,7 @@ public TwilioSaaSProvider() { } - public TwilioSaaSProvider(string name, int order, Dictionary additional = null) + public TwilioSaaSProvider(string name, int order, Dictionary additional = null) : base(name, order, null, additional) { } diff --git a/web/core/ASC.Web.Core/Sms/SmsSender.cs b/web/core/ASC.Web.Core/Sms/SmsSender.cs index fce29423b..298ef7475 100644 --- a/web/core/ASC.Web.Core/Sms/SmsSender.cs +++ b/web/core/ASC.Web.Core/Sms/SmsSender.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/SpaceUsageStatManager.cs b/web/core/ASC.Web.Core/SpaceUsageStatManager.cs index 946c77f9e..0139c8f70 100644 --- a/web/core/ASC.Web.Core/SpaceUsageStatManager.cs +++ b/web/core/ASC.Web.Core/SpaceUsageStatManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,5 +36,7 @@ public class UsageSpaceStatItem public interface IUserSpaceUsage { long GetUserSpaceUsage(Guid userId); + + void RecalculateUserQuota(int TenantId, Guid userId); } } diff --git a/web/core/ASC.Web.Core/Subscriptions/IProductSubscriptionManager.cs b/web/core/ASC.Web.Core/Subscriptions/IProductSubscriptionManager.cs index f7b78e160..4f3a7ffa4 100644 --- a/web/core/ASC.Web.Core/Subscriptions/IProductSubscriptionManager.cs +++ b/web/core/ASC.Web.Core/Subscriptions/IProductSubscriptionManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Subscriptions/ISubscriptionManager.cs b/web/core/ASC.Web.Core/Subscriptions/ISubscriptionManager.cs index a50fa8a86..7b7b1a13b 100644 --- a/web/core/ASC.Web.Core/Subscriptions/ISubscriptionManager.cs +++ b/web/core/ASC.Web.Core/Subscriptions/ISubscriptionManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Subscriptions/SubscriptionGroup.cs b/web/core/ASC.Web.Core/Subscriptions/SubscriptionGroup.cs index 5e01fab45..896953c0e 100644 --- a/web/core/ASC.Web.Core/Subscriptions/SubscriptionGroup.cs +++ b/web/core/ASC.Web.Core/Subscriptions/SubscriptionGroup.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Subscriptions/SubscriptionObject.cs b/web/core/ASC.Web.Core/Subscriptions/SubscriptionObject.cs index bf396bd52..56d1eb437 100644 --- a/web/core/ASC.Web.Core/Subscriptions/SubscriptionObject.cs +++ b/web/core/ASC.Web.Core/Subscriptions/SubscriptionObject.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Subscriptions/SubscriptionType.cs b/web/core/ASC.Web.Core/Subscriptions/SubscriptionType.cs index d0a139e82..9de9f6880 100644 --- a/web/core/ASC.Web.Core/Subscriptions/SubscriptionType.cs +++ b/web/core/ASC.Web.Core/Subscriptions/SubscriptionType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Users/DisplayUserSettings.cs b/web/core/ASC.Web.Core/Users/DisplayUserSettings.cs index 115b7023a..4108064d2 100644 --- a/web/core/ASC.Web.Core/Users/DisplayUserSettings.cs +++ b/web/core/ASC.Web.Core/Users/DisplayUserSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Users/Import/IUserImporter.cs b/web/core/ASC.Web.Core/Users/Import/IUserImporter.cs index 1b30eab92..1e1801ddf 100644 --- a/web/core/ASC.Web.Core/Users/Import/IUserImporter.cs +++ b/web/core/ASC.Web.Core/Users/Import/IUserImporter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Users/Import/OutlookCSVUserImporter.cs b/web/core/ASC.Web.Core/Users/Import/OutlookCSVUserImporter.cs index 5f5c82776..6c6b5005e 100644 --- a/web/core/ASC.Web.Core/Users/Import/OutlookCSVUserImporter.cs +++ b/web/core/ASC.Web.Core/Users/Import/OutlookCSVUserImporter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Users/Import/TextFileUserImporter.cs b/web/core/ASC.Web.Core/Users/Import/TextFileUserImporter.cs index 79646f31f..f3c6e5efc 100644 --- a/web/core/ASC.Web.Core/Users/Import/TextFileUserImporter.cs +++ b/web/core/ASC.Web.Core/Users/Import/TextFileUserImporter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Users/UserHelpTourSettings.cs b/web/core/ASC.Web.Core/Users/UserHelpTourSettings.cs index a8792ed9f..e0641856c 100644 --- a/web/core/ASC.Web.Core/Users/UserHelpTourSettings.cs +++ b/web/core/ASC.Web.Core/Users/UserHelpTourSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Users/UserInfoComparer.cs b/web/core/ASC.Web.Core/Users/UserInfoComparer.cs index 9084b7895..b41be76de 100644 --- a/web/core/ASC.Web.Core/Users/UserInfoComparer.cs +++ b/web/core/ASC.Web.Core/Users/UserInfoComparer.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Users/UserPhotoManager.cs b/web/core/ASC.Web.Core/Users/UserPhotoManager.cs index e3e81903a..073965559 100644 --- a/web/core/ASC.Web.Core/Users/UserPhotoManager.cs +++ b/web/core/ASC.Web.Core/Users/UserPhotoManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,6 +30,7 @@ using ASC.Common.Threading.Workers; using ASC.Core; using ASC.Data.Storage; +using ASC.Web.Core.Utility; using ASC.Web.Core.Utility.Skins; using ASC.Web.Studio.Utility; @@ -184,7 +185,7 @@ static UserPhotoManager() public static string GetDefaultPhotoAbsoluteWebPath() { - return WebImageSupplier.GetAbsoluteWebPath(_defaultAvatar); + return WebImageSupplier.GetAbsoluteWebPath(IsLightTheme() ? _defaultAvatar : _defaultDarkAvatar); } @@ -283,13 +284,22 @@ public static Size SmallFotoSize private static readonly string _defaultMediumAvatar = "default_user_photo_size_48-48.png"; private static readonly string _defaultBigAvatar = "default_user_photo_size_82-82.png"; private static readonly string _tempDomainName = "temp"; + private static readonly string _defaultDarkRetinaAvatar = "default_user_photo_dark_size_360-360.png"; + private static readonly string _defaultDarkAvatar = "default_user_photo_dark_size_200-200.png"; + private static readonly string _defaultDarkSmallAvatar = "default_user_photo_dark_size_32-32.png"; + private static readonly string _defaultDarkMediumAvatar = "default_user_photo_dark_size_48-48.png"; + private static readonly string _defaultDarkBigAvatar = "default_user_photo_dark_size_82-82.png"; public static bool UserHasAvatar(Guid userID) { var path = GetPhotoAbsoluteWebPath(userID); - var fileName = Path.GetFileName(path); - return fileName != _defaultAvatar; + return !IsDeafaultPhoto(path); + } + + public static bool IsDeafaultPhoto(string path) + { + return path.Contains("default_user_photo"); } public static string GetPhotoAbsoluteWebPath(Guid userID) @@ -367,14 +377,19 @@ private static string GetSizedPhotoAbsoluteWebPath(Guid userID, Size size) private static string GetDefaultPhotoAbsoluteWebPath(Size size) { - if (size == RetinaFotoSize) return WebImageSupplier.GetAbsoluteWebPath(_defaultRetinaAvatar); - if (size == MaxFotoSize) return WebImageSupplier.GetAbsoluteWebPath(_defaultAvatar); - if (size == BigFotoSize) return WebImageSupplier.GetAbsoluteWebPath(_defaultBigAvatar); - if (size == SmallFotoSize) return WebImageSupplier.GetAbsoluteWebPath(_defaultSmallAvatar); - if (size == MediumFotoSize) return WebImageSupplier.GetAbsoluteWebPath(_defaultMediumAvatar); + if (size == RetinaFotoSize) return WebImageSupplier.GetAbsoluteWebPath(IsLightTheme() ? _defaultRetinaAvatar : _defaultDarkRetinaAvatar); + if (size == MaxFotoSize) return WebImageSupplier.GetAbsoluteWebPath(IsLightTheme() ? _defaultAvatar : _defaultDarkAvatar); + if (size == BigFotoSize) return WebImageSupplier.GetAbsoluteWebPath(IsLightTheme() ? _defaultBigAvatar : _defaultDarkBigAvatar); + if (size == SmallFotoSize) return WebImageSupplier.GetAbsoluteWebPath(IsLightTheme() ? _defaultSmallAvatar : _defaultDarkSmallAvatar); + if (size == MediumFotoSize) return WebImageSupplier.GetAbsoluteWebPath(IsLightTheme() ? _defaultMediumAvatar : _defaultDarkMediumAvatar); return GetDefaultPhotoAbsoluteWebPath(); } + private static bool IsLightTheme() + { + return ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.light; + } + //Regex for parsing filenames into groups with id's private static readonly Regex ParseFile = new Regex(@"^(?'module'\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1}){0,1}" + @@ -844,9 +859,9 @@ public static byte[] GetUserPhotoData(Guid userId, Size size) if (string.IsNullOrEmpty(fileName)) return null; using (var s = GetDataStore().GetReadStream("", fileName)) + using (var data = new MemoryStream()) { - var data = new MemoryStream(); - var buffer = new Byte[1024 * 10]; + var buffer = new byte[1024 * 10]; while (true) { var count = s.Read(buffer, 0, buffer.Length); @@ -947,13 +962,15 @@ public static byte[] RotateImageByExifOrientationData(byte[] data, bool updateEx public static RotateFlipType RotateImageByExifOrientationData(string sourceFilePath, string targetFilePath, ImageFormat targetFormat, bool updateExifData = true) { // Rotate the image according to EXIF data - var bmp = new Bitmap(sourceFilePath); - var fType = RotateImageByExifOrientationData(bmp, updateExifData); - if (fType != RotateFlipType.RotateNoneFlipNone) + using (var bmp = new Bitmap(sourceFilePath)) { - bmp.Save(targetFilePath, targetFormat); + var fType = RotateImageByExifOrientationData(bmp, updateExifData); + if (fType != RotateFlipType.RotateNoneFlipNone) + { + bmp.Save(targetFilePath, targetFormat); + } + return fType; } - return fType; } /// diff --git a/web/core/ASC.Web.Core/Users/UserPhotoThumbnailManager.cs b/web/core/ASC.Web.Core/Users/UserPhotoThumbnailManager.cs index 93e892118..9b6ee8ff1 100644 --- a/web/core/ASC.Web.Core/Users/UserPhotoThumbnailManager.cs +++ b/web/core/ASC.Web.Core/Users/UserPhotoThumbnailManager.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Drawing; diff --git a/web/core/ASC.Web.Core/Users/UserPhotoThumbnailSettings.cs b/web/core/ASC.Web.Core/Users/UserPhotoThumbnailSettings.cs index 07e0126f0..b33708b25 100644 --- a/web/core/ASC.Web.Core/Users/UserPhotoThumbnailSettings.cs +++ b/web/core/ASC.Web.Core/Users/UserPhotoThumbnailSettings.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Drawing; using System.Runtime.Serialization; diff --git a/web/core/ASC.Web.Core/Users/UserSortOrder.cs b/web/core/ASC.Web.Core/Users/UserSortOrder.cs index 3b73b4f55..c3330a7c7 100644 --- a/web/core/ASC.Web.Core/Users/UserSortOrder.cs +++ b/web/core/ASC.Web.Core/Users/UserSortOrder.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Utility/ColorThemesSettings.cs b/web/core/ASC.Web.Core/Utility/ColorThemesSettings.cs index 729358284..d60fccb21 100644 --- a/web/core/ASC.Web.Core/Utility/ColorThemesSettings.cs +++ b/web/core/ASC.Web.Core/Utility/ColorThemesSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -84,9 +84,14 @@ public static string GetThemeFolderName(string path) public static string GetColorThemesSettings() { + var modetheme = ModeThemeSettings.GetModeThemesSettings(); var colorTheme = Load(); var colorThemeName = colorTheme.ColorThemeName; - + if(modetheme.ModeThemeName == ModeTheme.dark) + { + colorThemeName = "dark-" + colorThemeName; + } + if (colorTheme.FirstRequest) { colorTheme.FirstRequest = false; diff --git a/web/core/ASC.Web.Core/Utility/CommonLinkUtility.cs b/web/core/ASC.Web.Core/Utility/CommonLinkUtility.cs index 21bcc3372..87ab3a4c5 100644 --- a/web/core/ASC.Web.Core/Utility/CommonLinkUtility.cs +++ b/web/core/ASC.Web.Core/Utility/CommonLinkUtility.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -80,7 +80,8 @@ public enum ConfirmType PhoneAuth, Auth, TfaActivation, - TfaAuth + TfaAuth, + ShareLinkPassword } public static class CommonLinkUtility diff --git a/web/core/ASC.Web.Core/Utility/IFileUploadHandler.cs b/web/core/ASC.Web.Core/Utility/IFileUploadHandler.cs index c705b30e6..331202eec 100644 --- a/web/core/ASC.Web.Core/Utility/IFileUploadHandler.cs +++ b/web/core/ASC.Web.Core/Utility/IFileUploadHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Utility/ImpersonationSettings.cs b/web/core/ASC.Web.Core/Utility/ImpersonationSettings.cs new file mode 100644 index 000000000..c4569f597 --- /dev/null +++ b/web/core/ASC.Web.Core/Utility/ImpersonationSettings.cs @@ -0,0 +1,224 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Runtime.Serialization; + +using ASC.Core; +using ASC.Core.Common.Settings; +using ASC.Core.Users; + +namespace ASC.Web.Core.Utility +{ + [Serializable] + [DataContract] + public class ImpersonationSettings : BaseSettings + { + [DataMember(Name = "Enabled")] + public bool Enabled { get; set; } + + [DataMember(Name = "EnableType")] + public ImpersonateEnableType EnableType { get; set; } + + [DataMember(Name = "OnlyForOwnGroups")] + public bool OnlyForOwnGroups { get; set; } + + [DataMember(Name = "AllowedAdmins")] + public List AllowedAdmins { get; set; } + + [DataMember(Name = "RestrictionUsers")] + public List RestrictionUsers { get; set; } + + [DataMember(Name = "RestrictionGroups")] + public List RestrictionGroups { get; set; } + + public override Guid ID => new Guid("{843C6381-E900-437F-B153-16DAAD3C7AC5}"); + + private static bool? _impersonateSettingsAvailable; + + public static bool Available + { + get + { + if (_impersonateSettingsAvailable.HasValue) + { + return _impersonateSettingsAvailable.Value; + } + + _impersonateSettingsAvailable = Convert.ToBoolean(ConfigurationManagerExtension.AppSettings["core.user.impersonate"]); + return _impersonateSettingsAvailable.Value; + } + } + + public override ISettings GetDefault() + { + return new ImpersonationSettings(); + } + + public static bool CanImpersonate(UserInfo currentUser, out ImpersonationSettings settings) + { + settings = null; + + if (!Available) return false; + + settings = Load(); + + if (!settings.Enabled) return false; + + if (currentUser.IsOwner()) return true; + + if (settings.EnableType == ImpersonateEnableType.DisableForAdmins) return false; + + if (!currentUser.IsAdmin()) return false; + + if (settings.EnableType == ImpersonateEnableType.EnableForAllFullAdmins) return true; + + if (settings.AllowedAdmins == null || !settings.AllowedAdmins.Contains(currentUser.ID)) return false; + + return true; + } + + public static bool CanImpersonateUser(Guid userId) + { + var currentUserId = SecurityContext.CurrentAccount.ID; + + if (userId == currentUserId || CoreContext.UserManager.IsSystemUser(userId)) return false; + + var currentUser = CoreContext.UserManager.GetUsers(currentUserId); + + if (!CanImpersonate(currentUser, out ImpersonationSettings settings)) + { + return false; + } + + var impersonatedUser = CoreContext.UserManager.GetUsers(userId); + + if (impersonatedUser.ID == Constants.LostUser.ID || impersonatedUser.IsOwner()) return false; + + if (currentUser.IsOwner()) return true; + + if (settings.RestrictionUsers != null && settings.RestrictionUsers.Contains(userId)) return false; + + var admins = WebItemSecurity.GetProductAdministrators(Guid.Empty).Select(admin => admin.ID).Distinct(); + + if (admins.Contains(userId)) return false; + + var impersonatedUserGroups = CoreContext.UserManager.GetUserGroups(userId); + + if (settings.RestrictionGroups != null && settings.RestrictionGroups.Any()) + { + foreach (var group in impersonatedUserGroups) + { + if (settings.RestrictionGroups.Contains(group.ID)) return false; + } + } + + if (settings.OnlyForOwnGroups) + { + var currentUserGroups = CoreContext.UserManager.GetUserGroups(currentUserId); + + foreach (var group in currentUserGroups) + { + if (impersonatedUserGroups.Contains(group)) return true; + } + + return false; + } + + return true; + } + + public static bool IsImpersonator() + { + var cookiesForComeback = CookiesManager.GetCookies(CookiesType.ComebackAuthKey); + + return !string.IsNullOrEmpty(cookiesForComeback); + } + + public static ImpersonationSettings LoadAndRefresh() + { + var settings = Load(); + var updatedFlag = false; + + if (settings.AllowedAdmins != null) + { + settings.AllowedAdmins.RemoveAll(adminId => + { + var admin = CoreContext.UserManager.GetUsers(adminId); + + if (admin.ID == Constants.LostUser.ID || admin.Status == EmployeeStatus.Terminated || !admin.IsAdmin()) + { + updatedFlag = true; + return true; + } + + return false; + }); + } + + if (settings.RestrictionUsers != null) + { + var admins = WebItemSecurity.GetProductAdministrators(Guid.Empty).Select(admin => admin.ID).Distinct(); + + settings.RestrictionUsers.RemoveAll(userId => + { + var user = CoreContext.UserManager.GetUsers(userId); + + if (user.ID == Constants.LostUser.ID || user.Status == EmployeeStatus.Terminated || admins.Contains(userId)) + { + updatedFlag = true; + return true; + } + return false; + }); + } + + if (settings.RestrictionGroups != null) + { + settings.RestrictionGroups.RemoveAll(groupId => + { + var groupInfo = CoreContext.UserManager.GetGroupInfo(groupId); + + if (groupInfo.ID == Constants.LostGroupInfo.ID) + { + updatedFlag = true; + return true; + } + + return false; + }); + } + + if (updatedFlag) + { + settings.Save(); + } + + return settings; + } + } + + public enum ImpersonateEnableType + { + DisableForAdmins, + EnableForAllFullAdmins, + EnableWithLimits + } +} diff --git a/web/core/ASC.Web.Core/Utility/LoginSettings.cs b/web/core/ASC.Web.Core/Utility/LoginSettings.cs new file mode 100644 index 000000000..dfd1d04fd --- /dev/null +++ b/web/core/ASC.Web.Core/Utility/LoginSettings.cs @@ -0,0 +1,50 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Runtime.Serialization; + +using ASC.Core.Common.Settings; + +namespace ASC.Web.Core.Utility +{ + [Serializable] + [DataContract] + public class LoginSettings : BaseSettings + { + [DataMember(Name = "AttemptCount")] + public int AttemptCount { get; set; } + + [DataMember(Name = "BlockTime")] + public int BlockTime { get; set; } + + [DataMember(Name = "CheckPeriod")] + public int CheckPeriod { get; set; } + + public override Guid ID => new Guid("{588C7E01-8D41-4FCE-9779-D4126E019765}"); + + public override ISettings GetDefault() + { + return new LoginSettings + { + AttemptCount = 5, + BlockTime = 60, + CheckPeriod = 60 + }; + } + } +} diff --git a/web/core/ASC.Web.Core/Utility/ModeThemeSettings.cs b/web/core/ASC.Web.Core/Utility/ModeThemeSettings.cs new file mode 100644 index 000000000..b6fd0daa1 --- /dev/null +++ b/web/core/ASC.Web.Core/Utility/ModeThemeSettings.cs @@ -0,0 +1,78 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Runtime.Serialization; + +using ASC.Core.Common.Settings; + +namespace ASC.Web.Core.Utility +{ + public enum ModeTheme + { + light = 0, + dark = 1 + } + + [Serializable] + [DataContract] + public class ModeThemeSettings : BaseSettings + { + + [DataMember(Name = "ModeThemeName")] + public ModeTheme ModeThemeName { get; set; } + + [DataMember(Name = "AutoDetect")] + public bool AutoDetect { get; set; } + + public override ISettings GetDefault() + { + return new ModeThemeSettings + { + ModeThemeName = ModeTheme.light, + AutoDetect = false + }; + } + + public override Guid ID + { + get { return new Guid("{0CA1BD54-081E-4F15-851B-4C86BDB69C3A}"); } + } + + public static ModeThemeSettings GetModeThemesSettings() + { + var modeTheme = LoadForCurrentUser(); + + if (modeTheme.AutoDetect) + { + var cookieValue = CookiesManager.GetCookies(CookiesType.ModeThemeKey); + if (!string.IsNullOrEmpty(cookieValue) && Enum.TryParse(cookieValue, out var theme)) + { + return new ModeThemeSettings { AutoDetect = true, ModeThemeName = theme }; + } + } + + return modeTheme; + } + + public static void SaveModeTheme(ModeTheme theme, bool auto) + { + var settings = new ModeThemeSettings { ModeThemeName = theme, AutoDetect = auto}; + settings.SaveForCurrentUser(); + } + } +} diff --git a/web/core/ASC.Web.Core/Utility/PasswordSettings.cs b/web/core/ASC.Web.Core/Utility/PasswordSettings.cs index d7263a308..0c85b4b4d 100644 --- a/web/core/ASC.Web.Core/Utility/PasswordSettings.cs +++ b/web/core/ASC.Web.Core/Utility/PasswordSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,13 +34,14 @@ public override Guid ID get { return new Guid("aa93a4d1-012d-4ccd-895a-e094e809c840"); } } + private static bool? printableASCII; private static bool PrintableASCII { get { - if (printableASCII == null) + if (!printableASCII.HasValue) { printableASCII = true; @@ -55,11 +56,80 @@ private static bool PrintableASCII } + private static int? limitMaxLength; + [DataMember] - public const int MaxLength = 30; + public static int LimitMaxLength + { + get + { + if (!limitMaxLength.HasValue) + { + limitMaxLength = 120; + + if (int.TryParse(ConfigurationManagerExtension.AppSettings["web.password.max"], out int max)) + { + limitMaxLength = max; + } + } + + return limitMaxLength.Value; + } + } + + + private static int? limitMinLength; [DataMember] - public int MinLength { get; set; } + public static int LimitMinLength + { + get + { + if (!limitMinLength.HasValue) + { + limitMinLength = 8; + + if (int.TryParse(ConfigurationManagerExtension.AppSettings["web.password.min"], out int min)) + { + limitMinLength = min; + } + } + + return limitMinLength.Value; + } + } + + + private int maxLength; + + [DataMember] + public int MaxLength + { + get + { + return maxLength == 0 ? LimitMaxLength : maxLength; + } + set + { + maxLength = GetLimitedValue(value); + } + } + + + private int minLength; + + [DataMember] + public int MinLength + { + get + { + return minLength == 0 ? LimitMinLength : minLength; + } + set + { + minLength = GetLimitedValue(value); + } + } [DataMember] @@ -111,22 +181,9 @@ public static string SpecSymbolsRegexStr } - private static PasswordSettings _default; - public override ISettings GetDefault() { - if (_default == null) - { - _default = new PasswordSettings { MinLength = 8, UpperCase = false, Digits = false, SpecSymbols = false }; - - int defaultMinLength; - if (int.TryParse(ConfigurationManagerExtension.AppSettings["web.password.min"], out defaultMinLength)) - { - _default.MinLength = Math.Max(1, Math.Min(MaxLength, defaultMinLength)); - } - } - - return _default; + return new PasswordSettings { MaxLength = LimitMaxLength, MinLength = LimitMinLength, UpperCase = false, Digits = false, SpecSymbols = false }; } @@ -143,7 +200,7 @@ public static string GetPasswordRegex(PasswordSettings passwordSettings) if (passwordSettings.SpecSymbols) pwdBuilder.Append(SpecSymbolsRegexStr); - pwdBuilder.Append(AllowedCharactersRegexStr + "{" + passwordSettings.MinLength + "," + MaxLength +"}$"); + pwdBuilder.Append(AllowedCharactersRegexStr + "{" + passwordSettings.MinLength + "," + passwordSettings.MaxLength + "}$"); return pwdBuilder.ToString(); } @@ -155,5 +212,15 @@ public static bool CheckPasswordRegex(PasswordSettings passwordSettings, string return new Regex(passwordRegex).IsMatch(password); } + + + private int GetLimitedValue(int value) + { + return value > LimitMaxLength + ? LimitMaxLength + : value < LimitMinLength + ? LimitMinLength + : value; + } } } \ No newline at end of file diff --git a/web/core/ASC.Web.Core/Utility/SearchHandlerManager.cs b/web/core/ASC.Web.Core/Utility/SearchHandlerManager.cs index d3980bb8c..2699b424b 100644 --- a/web/core/ASC.Web.Core/Utility/SearchHandlerManager.cs +++ b/web/core/ASC.Web.Core/Utility/SearchHandlerManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Utility/Settings/TenantAccessSettings.cs b/web/core/ASC.Web.Core/Utility/Settings/TenantAccessSettings.cs index 04fc3cc86..c9eb56ccd 100644 --- a/web/core/ASC.Web.Core/Utility/Settings/TenantAccessSettings.cs +++ b/web/core/ASC.Web.Core/Utility/Settings/TenantAccessSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Utility/Settings/WebItemSettings.cs b/web/core/ASC.Web.Core/Utility/Settings/WebItemSettings.cs index d92ac5ba7..5230ba236 100644 --- a/web/core/ASC.Web.Core/Utility/Settings/WebItemSettings.cs +++ b/web/core/ASC.Web.Core/Utility/Settings/WebItemSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Utility/Settings/WizardSettings.cs b/web/core/ASC.Web.Core/Utility/Settings/WizardSettings.cs index bb3fab2fc..738ed4482 100644 --- a/web/core/ASC.Web.Core/Utility/Settings/WizardSettings.cs +++ b/web/core/ASC.Web.Core/Utility/Settings/WizardSettings.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Runtime.Serialization; diff --git a/web/core/ASC.Web.Core/Utility/Skins/ImageOptions.cs b/web/core/ASC.Web.Core/Utility/Skins/ImageOptions.cs index c215dcaa0..17c4a65ff 100644 --- a/web/core/ASC.Web.Core/Utility/Skins/ImageOptions.cs +++ b/web/core/ASC.Web.Core/Utility/Skins/ImageOptions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Utility/Skins/WebImageSupplier.cs b/web/core/ASC.Web.Core/Utility/Skins/WebImageSupplier.cs index 83d53ba74..e738aed08 100644 --- a/web/core/ASC.Web.Core/Utility/Skins/WebImageSupplier.cs +++ b/web/core/ASC.Web.Core/Utility/Skins/WebImageSupplier.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Utility/Skins/WebSkinSettings.cs b/web/core/ASC.Web.Core/Utility/Skins/WebSkinSettings.cs index bce5333d3..0f634f10c 100644 --- a/web/core/ASC.Web.Core/Utility/Skins/WebSkinSettings.cs +++ b/web/core/ASC.Web.Core/Utility/Skins/WebSkinSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Utility/TenantProvider.cs b/web/core/ASC.Web.Core/Utility/TenantProvider.cs index 6ba2b311d..46c19b72b 100644 --- a/web/core/ASC.Web.Core/Utility/TenantProvider.cs +++ b/web/core/ASC.Web.Core/Utility/TenantProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Utility/UrlShortener.cs b/web/core/ASC.Web.Core/Utility/UrlShortener.cs index eae348591..e81d55d4c 100644 --- a/web/core/ASC.Web.Core/Utility/UrlShortener.cs +++ b/web/core/ASC.Web.Core/Utility/UrlShortener.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/Utility/UrlSwitcher.cs b/web/core/ASC.Web.Core/Utility/UrlSwitcher.cs index 064c0e5b7..be17fc4ff 100644 --- a/web/core/ASC.Web.Core/Utility/UrlSwitcher.cs +++ b/web/core/ASC.Web.Core/Utility/UrlSwitcher.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/WarmupPage.cs b/web/core/ASC.Web.Core/WarmupPage.cs index fe76c3241..27171fe8b 100644 --- a/web/core/ASC.Web.Core/WarmupPage.cs +++ b/web/core/ASC.Web.Core/WarmupPage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/WebItemContext.cs b/web/core/ASC.Web.Core/WebItemContext.cs index 8dce7acd9..79b5a4f13 100644 --- a/web/core/ASC.Web.Core/WebItemContext.cs +++ b/web/core/ASC.Web.Core/WebItemContext.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/WebItemManager.cs b/web/core/ASC.Web.Core/WebItemManager.cs index 20ce730c7..5e994c8bb 100644 --- a/web/core/ASC.Web.Core/WebItemManager.cs +++ b/web/core/ASC.Web.Core/WebItemManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,7 +39,7 @@ public enum ItemAvailableState public class WebItemManager { - private static readonly ILog log = LogManager.GetLogger("ASC.Web"); + private static readonly ILog log = BaseLogManager.GetLogger("ASC.WebItemManager"); private readonly Dictionary items = new Dictionary(); private static readonly string disableItem = ConfigurationManagerExtension.AppSettings["web.disabled-items"] + ","; @@ -134,7 +134,7 @@ public void LoadItems() { if (RegistryItem(webitem)) { - log.DebugFormat("Web item {0} loaded", webitem.Name); + log.DebugFormat("Web item {0} loaded", webitem.ProductClassName); } } } diff --git a/web/core/ASC.Web.Core/WebItemSecurity.cs b/web/core/ASC.Web.Core/WebItemSecurity.cs index 4a9f20e5d..2cd2e71e9 100644 --- a/web/core/ASC.Web.Core/WebItemSecurity.cs +++ b/web/core/ASC.Web.Core/WebItemSecurity.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/WebItemSecurityInfo.cs b/web/core/ASC.Web.Core/WebItemSecurityInfo.cs index 6c9112abc..763673270 100644 --- a/web/core/ASC.Web.Core/WebItemSecurityInfo.cs +++ b/web/core/ASC.Web.Core/WebItemSecurityInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/WebZones/IRenderCustomNavigation.cs b/web/core/ASC.Web.Core/WebZones/IRenderCustomNavigation.cs index 48130609c..b3635bee8 100644 --- a/web/core/ASC.Web.Core/WebZones/IRenderCustomNavigation.cs +++ b/web/core/ASC.Web.Core/WebZones/IRenderCustomNavigation.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/WebZones/WebZoneAttribute.cs b/web/core/ASC.Web.Core/WebZones/WebZoneAttribute.cs index b5904133a..5f1dd58fd 100644 --- a/web/core/ASC.Web.Core/WebZones/WebZoneAttribute.cs +++ b/web/core/ASC.Web.Core/WebZones/WebZoneAttribute.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/WhiteLabel/AdditionalWhiteLabelSettings.cs b/web/core/ASC.Web.Core/WhiteLabel/AdditionalWhiteLabelSettings.cs index 5d2cf79df..60a29becf 100644 --- a/web/core/ASC.Web.Core/WhiteLabel/AdditionalWhiteLabelSettings.cs +++ b/web/core/ASC.Web.Core/WhiteLabel/AdditionalWhiteLabelSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/WhiteLabel/CompanyWhiteLabelSettings.cs b/web/core/ASC.Web.Core/WhiteLabel/CompanyWhiteLabelSettings.cs index 3f59f86fd..2b8047775 100644 --- a/web/core/ASC.Web.Core/WhiteLabel/CompanyWhiteLabelSettings.cs +++ b/web/core/ASC.Web.Core/WhiteLabel/CompanyWhiteLabelSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/WhiteLabel/MailWhiteLabelSettings.cs b/web/core/ASC.Web.Core/WhiteLabel/MailWhiteLabelSettings.cs index 8a3a11cf9..5a36fc07c 100644 --- a/web/core/ASC.Web.Core/WhiteLabel/MailWhiteLabelSettings.cs +++ b/web/core/ASC.Web.Core/WhiteLabel/MailWhiteLabelSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/core/ASC.Web.Core/WhiteLabel/TenantInfoSettings.cs b/web/core/ASC.Web.Core/WhiteLabel/TenantInfoSettings.cs index 24e99d293..3e29e774d 100644 --- a/web/core/ASC.Web.Core/WhiteLabel/TenantInfoSettings.cs +++ b/web/core/ASC.Web.Core/WhiteLabel/TenantInfoSettings.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Configuration; using System.Drawing; @@ -109,11 +109,11 @@ public void SetCompanyLogo(string companyLogoFileName, byte[] data) TenantLogoManager.RemoveMailLogoDataFromCache(); } - public string GetAbsoluteCompanyLogoPath() + public string GetAbsoluteCompanyLogoPath(bool dark) { if (_isDefault) { - return WebImageSupplier.GetAbsoluteWebPath("logo/dark_general.png"); + return WebImageSupplier.GetAbsoluteWebPath(dark ? "logo/dark_general.png" : "logo/light_general.png"); } var store = StorageFactory.GetStorage(TenantProvider.CurrentTenantID.ToString(), "logo"); diff --git a/web/core/ASC.Web.Core/WhiteLabel/TenantLogoManager.cs b/web/core/ASC.Web.Core/WhiteLabel/TenantLogoManager.cs index 2d9e68bfd..9db5688cc 100644 --- a/web/core/ASC.Web.Core/WhiteLabel/TenantLogoManager.cs +++ b/web/core/ASC.Web.Core/WhiteLabel/TenantLogoManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -60,33 +60,22 @@ static TenantLogoManager() public static string GetFavicon(bool general, bool timeParam) { - string faviconPath; if (WhiteLabelEnabled) { - var tenantWhiteLabelSettings = TenantWhiteLabelSettings.Load(); - faviconPath = tenantWhiteLabelSettings.GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.Favicon, general); - if (timeParam) - { - var now = DateTime.Now; - faviconPath = String.Format("{0}?t={1}", faviconPath, now.Ticks); - } - } - else - { - faviconPath = TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.Favicon, general); + var faviconPath = TenantWhiteLabelSettings.Load().GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.Favicon, general); + return timeParam ? string.Format("{0}?t={1}", faviconPath, DateTime.Now.Ticks) : faviconPath; } - return faviconPath; + return TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.Favicon, general); } - public static string GetTopLogo(bool general)//LogoLightSmall + public static string GetTopLogo(bool general) { if (WhiteLabelEnabled) { - var tenantWhiteLabelSettings = TenantWhiteLabelSettings.Load(); - - return tenantWhiteLabelSettings.GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.LightSmall, general); + return TenantWhiteLabelSettings.Load().GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.LightSmall, general); } + return TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.LightSmall, general); } @@ -94,8 +83,7 @@ public static string GetLogoDark(bool general) { if (WhiteLabelEnabled) { - var tenantWhiteLabelSettings = TenantWhiteLabelSettings.Load(); - return tenantWhiteLabelSettings.GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.Dark, general); + return TenantWhiteLabelSettings.Load().GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.Dark, general); } if (IsVisibleWhiteLabelSettings) @@ -104,18 +92,44 @@ public static string GetLogoDark(bool general) } /*** simple scheme ***/ - var tenantInfoSettings = TenantInfoSettings.Load(); - return tenantInfoSettings.GetAbsoluteCompanyLogoPath(); + return TenantInfoSettings.Load().GetAbsoluteCompanyLogoPath(true); + /***/ + } + + public static string GetLogoLight(bool general) + { + if (WhiteLabelEnabled) + { + return TenantWhiteLabelSettings.Load().GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.Light, general); + } + + if (IsVisibleWhiteLabelSettings) + { + return TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.Light, general); + } + + /*** simple scheme ***/ + return TenantInfoSettings.Load().GetAbsoluteCompanyLogoPath(false); /***/ } + public static string GetLogoAboutDark(bool general) + { + return TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.AboutDark, general); + } + + public static string GetLogoAboutLight(bool general) + { + return TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.AboutLight, general); + } + public static string GetLogoDocsEditor(bool general) { if (WhiteLabelEnabled) { - var tenantWhiteLabelSettings = TenantWhiteLabelSettings.Load(); - return tenantWhiteLabelSettings.GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.DocsEditor, general); + return TenantWhiteLabelSettings.Load().GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.DocsEditor, general); } + return TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.DocsEditor, general); } @@ -123,9 +137,9 @@ public static string GetLogoDocsEditorEmbed(bool general) { if (WhiteLabelEnabled) { - var tenantWhiteLabelSettings = TenantWhiteLabelSettings.Load(); - return tenantWhiteLabelSettings.GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.DocsEditorEmbed, general); + return TenantWhiteLabelSettings.Load().GetAbsoluteLogoPath(WhiteLabelLogoTypeEnum.DocsEditorEmbed, general); } + return TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.DocsEditorEmbed, general); } @@ -133,9 +147,9 @@ public static string GetLogoText() { if (WhiteLabelEnabled) { - var tenantWhiteLabelSettings = TenantWhiteLabelSettings.Load(); - return tenantWhiteLabelSettings.LogoText ?? TenantWhiteLabelSettings.DefaultLogoText; + return TenantWhiteLabelSettings.Load().LogoText ?? TenantWhiteLabelSettings.DefaultLogoText; } + return TenantWhiteLabelSettings.DefaultLogoText; } @@ -144,10 +158,10 @@ public static bool IsRetina(HttpRequest request) if (request != null) { var cookie = request.Cookies["is_retina"]; - if (cookie != null && !String.IsNullOrEmpty(cookie.Value)) + if (cookie != null && !string.IsNullOrEmpty(cookie.Value)) { bool result; - if (Boolean.TryParse(cookie.Value, out result)) + if (bool.TryParse(cookie.Value, out result)) { return result; } @@ -164,8 +178,7 @@ public static Stream GetWhitelabelMailLogo() { if (WhiteLabelEnabled) { - var tenantWhiteLabelSettings = TenantWhiteLabelSettings.Load(); - return tenantWhiteLabelSettings.GetWhitelabelLogoData(WhiteLabelLogoTypeEnum.Dark, true); + return TenantWhiteLabelSettings.Load().GetWhitelabelLogoData(WhiteLabelLogoTypeEnum.Dark, true); } if (IsVisibleWhiteLabelSettings) @@ -174,8 +187,7 @@ public static Stream GetWhitelabelMailLogo() } /*** simple scheme ***/ - var tenantInfoSettings = TenantInfoSettings.Load(); - return tenantInfoSettings.GetStorageLogoData(); + return TenantInfoSettings.Load().GetStorageLogoData(); /***/ } diff --git a/web/core/ASC.Web.Core/WhiteLabel/TenantWhiteLabelSettings.cs b/web/core/ASC.Web.Core/WhiteLabel/TenantWhiteLabelSettings.cs index 9ca242e34..bc844e069 100644 --- a/web/core/ASC.Web.Core/WhiteLabel/TenantWhiteLabelSettings.cs +++ b/web/core/ASC.Web.Core/WhiteLabel/TenantWhiteLabelSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,7 +41,6 @@ namespace ASC.Web.Core.WhiteLabel public class TenantWhiteLabelSettings : BaseSettings { public const string DefaultLogoText = "ONLYOFFICE"; - private ILog Log = LogManager.GetLogger("ASC"); #region Logos information: extension, isDefault, text for img auto generating @@ -70,6 +69,21 @@ public class TenantWhiteLabelSettings : BaseSettings [DataMember(Name = "DefaultLogoDocsEditorEmbed")] private bool _isDefaultLogoDocsEditorEmbed { get; set; } + [DataMember(Name = "LogoLigthExt")] + private string _logoLightExt; + [DataMember(Name ="DefaultLogoLight")] + private bool _isDefaultLogoLight { get; set; } + + [DataMember(Name = "LogoAboutDarkExt")] + private string _logoAboutDarkExt; + [DataMember(Name = "DefaultLogoAboutDark")] + private bool _isDefaultLogoAboutDark { get; set; } + + [DataMember(Name = "LogAboutLightExt")] + private string _logoAboutLightExt; + [DataMember(Name = "DefaultLogoAboutLight")] + private bool _isDefaultLogoAboutLight { get; set; } + [DataMember(Name = "LogoText")] public string _logoText { get; set; } @@ -77,16 +91,16 @@ public string LogoText { get { - if (!String.IsNullOrEmpty(_logoText) && _logoText != DefaultLogoText) + if (!string.IsNullOrEmpty(_logoText) && _logoText != DefaultLogoText) return _logoText; var partnerSettings = LoadForDefaultTenant(); - return String.IsNullOrEmpty(partnerSettings._logoText) ? DefaultLogoText : partnerSettings._logoText; + return string.IsNullOrEmpty(partnerSettings._logoText) ? DefaultLogoText : partnerSettings._logoText; } set { _logoText = value; } } - private const String moduleName = "whitelabel"; + private const string moduleName = "whitelabel"; #endregion @@ -97,6 +111,9 @@ public string LogoText public static readonly Size logoFaviconSize = new Size(32, 32); public static readonly Size logoDocsEditorSize = new Size(172, 40); public static readonly Size logoDocsEditorEmbedSize = new Size(172, 40); + public static readonly Size logoLightSize = new Size(432, 70); + public static readonly Size logoAboutDarkSize = new Size(432, 70); + public static readonly Size logoAboutLightSize = new Size(432, 70); #endregion @@ -111,12 +128,18 @@ public override ISettings GetDefault() _logoFaviconExt = null, _logoDocsEditorExt = null, _logoDocsEditorEmbedExt = null, + _logoLightExt = null, + _logoAboutDarkExt = null, + _logoAboutLightExt = null, _isDefaultLogoLightSmall = true, _isDefaultLogoDark = true, _isDefaultLogoFavicon = true, _isDefaultLogoDocsEditor = true, _isDefaultLogoDocsEditorEmbed = true, + _isDefaultLogoLight = true, + _isDefaultLogoAboutDark = true, + _isDefaultLogoAboutLight = true, LogoText = null }; @@ -138,12 +161,18 @@ public bool IsDefault _logoFaviconExt == defaultSettings._logoFaviconExt && _logoDocsEditorExt == defaultSettings._logoDocsEditorExt && _logoDocsEditorEmbedExt == defaultSettings._logoDocsEditorEmbedExt && + _logoLightExt == defaultSettings._logoLightExt && + _logoAboutDarkExt == defaultSettings._logoAboutDarkExt && + _logoAboutLightExt == defaultSettings._logoAboutLightExt && _isDefaultLogoLightSmall == defaultSettings._isDefaultLogoLightSmall && _isDefaultLogoDark == defaultSettings._isDefaultLogoDark && _isDefaultLogoFavicon == defaultSettings._isDefaultLogoFavicon && _isDefaultLogoDocsEditor == defaultSettings._isDefaultLogoDocsEditor && _isDefaultLogoDocsEditorEmbed == defaultSettings._isDefaultLogoDocsEditorEmbed && + _isDefaultLogoLight == defaultSettings._isDefaultLogoLight && + _isDefaultLogoAboutDark == defaultSettings._isDefaultLogoAboutDark && + _isDefaultLogoAboutLight == defaultSettings._isDefaultLogoAboutLight && LogoText == defaultSettings.LogoText; } @@ -156,12 +185,18 @@ public void RestoreDefault(int tenantId, IDataStore storage = null) _logoFaviconExt = null; _logoDocsEditorExt = null; _logoDocsEditorEmbedExt = null; + _logoLightExt = null; + _logoAboutDarkExt = null; + _logoAboutLightExt = null; _isDefaultLogoLightSmall = true; _isDefaultLogoDark = true; _isDefaultLogoFavicon = true; _isDefaultLogoDocsEditor = true; _isDefaultLogoDocsEditorEmbed = true; + _isDefaultLogoLight = true; + _isDefaultLogoAboutDark = true; + _isDefaultLogoAboutLight = true; LogoText = null; @@ -172,25 +207,26 @@ public void RestoreDefault(int tenantId, IDataStore storage = null) } catch (Exception e) { - Log.Error(e); + LogManager.GetLogger("ASC").Error(e); } Save(tenantId, true); } - public void RestoreDefault(WhiteLabelLogoTypeEnum type) + public void RestoreDefaultLogo(WhiteLabelLogoTypeEnum type, int tenantId, IDataStore storage = null) { if (!GetIsDefault(type)) { try { + SetExt(type, null); SetIsDefault(type, true); - var store = StorageFactory.GetStorage(TenantProvider.CurrentTenantID.ToString(), moduleName); + var store = storage ?? StorageFactory.GetStorage(tenantId.ToString(), moduleName); DeleteLogoFromStore(store, type); } catch (Exception e) { - Log.Error(e); + LogManager.GetLogger("ASC").Error(e); } } } @@ -215,7 +251,7 @@ public void SetLogo(WhiteLabelLogoTypeEnum type, string logoFileExt, byte[] data } catch (Exception e) { - Log.Error(e); + LogManager.GetLogger("ASC").Error(e); } } #endregion @@ -247,7 +283,7 @@ public void SetLogo(Dictionary logo, IDataStore storage = null) var currentLogoType = (WhiteLabelLogoTypeEnum)(currentLogo.Key); var currentLogoPath = currentLogo.Value; - if (!String.IsNullOrEmpty(currentLogoPath)) + if (!string.IsNullOrEmpty(currentLogoPath)) { var fileExt = "png"; byte[] data = null; @@ -263,13 +299,13 @@ public void SetLogo(Dictionary logo, IDataStore storage = null) } catch (Exception ex) { - Log.Error(ex); + LogManager.GetLogger("ASC").Error(ex); } } else { var xB64 = currentLogoPath.Substring(xStart.Length); // Get the Base64 string - data = System.Convert.FromBase64String(xB64); // Convert the Base64 string to binary data + data = Convert.FromBase64String(xB64); // Convert the Base64 string to binary data } if (data != null) @@ -313,6 +349,12 @@ private bool GetIsDefault(WhiteLabelLogoTypeEnum type) return _isDefaultLogoDocsEditor; case WhiteLabelLogoTypeEnum.DocsEditorEmbed: return _isDefaultLogoDocsEditorEmbed; + case WhiteLabelLogoTypeEnum.Light: + return _isDefaultLogoLight; + case WhiteLabelLogoTypeEnum.AboutDark: + return _isDefaultLogoAboutDark; + case WhiteLabelLogoTypeEnum.AboutLight: + return _isDefaultLogoAboutLight; } return true; } @@ -336,6 +378,15 @@ private void SetIsDefault(WhiteLabelLogoTypeEnum type, bool value) case WhiteLabelLogoTypeEnum.DocsEditorEmbed: _isDefaultLogoDocsEditorEmbed = value; break; + case WhiteLabelLogoTypeEnum.Light: + _isDefaultLogoLight = value; + break; + case WhiteLabelLogoTypeEnum.AboutDark: + _isDefaultLogoAboutDark = value; + break; + case WhiteLabelLogoTypeEnum.AboutLight: + _isDefaultLogoAboutLight = value; + break; } } @@ -353,11 +404,17 @@ private string GetExt(WhiteLabelLogoTypeEnum type) return _logoDocsEditorExt; case WhiteLabelLogoTypeEnum.DocsEditorEmbed: return _logoDocsEditorEmbedExt; + case WhiteLabelLogoTypeEnum.Light: + return _logoLightExt; + case WhiteLabelLogoTypeEnum.AboutDark: + return _logoAboutDarkExt; + case WhiteLabelLogoTypeEnum.AboutLight: + return _logoAboutLightExt; } return ""; } - private void SetExt(WhiteLabelLogoTypeEnum type, String fileExt) + private void SetExt(WhiteLabelLogoTypeEnum type, string fileExt) { switch (type) { @@ -376,6 +433,15 @@ private void SetExt(WhiteLabelLogoTypeEnum type, String fileExt) case WhiteLabelLogoTypeEnum.DocsEditorEmbed: _logoDocsEditorEmbedExt = fileExt; break; + case WhiteLabelLogoTypeEnum.Light: + _logoLightExt = fileExt; + break; + case WhiteLabelLogoTypeEnum.AboutDark: + _logoAboutDarkExt = fileExt; + break; + case WhiteLabelLogoTypeEnum.AboutLight: + _logoAboutLightExt = fileExt; + break; } } @@ -408,7 +474,7 @@ private string GetAbsoluteStorageLogoPath(WhiteLabelLogoTypeEnum type, bool gene public static string GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum type, bool general) { var partnerLogoPath = GetPartnerStorageLogoPath(type, general); - if (!String.IsNullOrEmpty(partnerLogoPath)) + if (!string.IsNullOrEmpty(partnerLogoPath)) return partnerLogoPath; switch (type) @@ -423,6 +489,12 @@ public static string GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum type, boo return general ? WebImageSupplier.GetAbsoluteWebPath("logo/editor_logo_embed_general.png") : WebImageSupplier.GetAbsoluteWebPath("logo/editor_logo_embed.png"); case WhiteLabelLogoTypeEnum.Favicon: return general ? WebImageSupplier.GetAbsoluteWebPath("logo/favicon_general.ico") : WebImageSupplier.GetAbsoluteWebPath("logo/favicon.ico"); + case WhiteLabelLogoTypeEnum.Light: + return general ? WebImageSupplier.GetAbsoluteWebPath("logo/light_general.png") : WebImageSupplier.GetAbsoluteWebPath("logo/light.png"); + case WhiteLabelLogoTypeEnum.AboutLight: + return general ? WebImageSupplier.GetAbsoluteWebPath("logo/about_light_general.png") : WebImageSupplier.GetAbsoluteWebPath("logo/about_light.png"); + case WhiteLabelLogoTypeEnum.AboutDark: + return general ? WebImageSupplier.GetAbsoluteWebPath("logo/about_dark_general.png") : WebImageSupplier.GetAbsoluteWebPath("logo/about_dark.png"); } return ""; } @@ -487,7 +559,7 @@ public static Stream GetPartnerStorageLogoData(WhiteLabelLogoTypeEnum type, bool public static string BuildLogoFileName(WhiteLabelLogoTypeEnum type, String fileExt, bool general) { - return String.Format("logo_{0}{2}.{1}", type.ToString().ToLowerInvariant(), fileExt, general ? "_general" : ""); + return string.Format("logo_{0}{2}.{1}", type.ToString().ToLowerInvariant(), fileExt, general ? "_general" : ""); } public static Size GetSize(WhiteLabelLogoTypeEnum type, bool general) @@ -496,29 +568,41 @@ public static Size GetSize(WhiteLabelLogoTypeEnum type, bool general) { case WhiteLabelLogoTypeEnum.LightSmall: return new Size( - general ? TenantWhiteLabelSettings.logoLightSmallSize.Width / 2 : TenantWhiteLabelSettings.logoLightSmallSize.Width, - general ? TenantWhiteLabelSettings.logoLightSmallSize.Height / 2 : TenantWhiteLabelSettings.logoLightSmallSize.Height); + general ? logoLightSmallSize.Width / 2 : logoLightSmallSize.Width, + general ? logoLightSmallSize.Height / 2 : logoLightSmallSize.Height); case WhiteLabelLogoTypeEnum.Dark: return new Size( - general ? TenantWhiteLabelSettings.logoDarkSize.Width / 2 : TenantWhiteLabelSettings.logoDarkSize.Width, - general ? TenantWhiteLabelSettings.logoDarkSize.Height / 2 : TenantWhiteLabelSettings.logoDarkSize.Height); + general ? logoDarkSize.Width / 2 : logoDarkSize.Width, + general ? logoDarkSize.Height / 2 : logoDarkSize.Height); case WhiteLabelLogoTypeEnum.Favicon: return new Size( - general ? TenantWhiteLabelSettings.logoFaviconSize.Width / 2 : TenantWhiteLabelSettings.logoFaviconSize.Width, - general ? TenantWhiteLabelSettings.logoFaviconSize.Height / 2 : TenantWhiteLabelSettings.logoFaviconSize.Height); + general ? logoFaviconSize.Width / 2 : logoFaviconSize.Width, + general ? logoFaviconSize.Height / 2 : logoFaviconSize.Height); case WhiteLabelLogoTypeEnum.DocsEditor: return new Size( - general ? TenantWhiteLabelSettings.logoDocsEditorSize.Width / 2 : TenantWhiteLabelSettings.logoDocsEditorSize.Width, - general ? TenantWhiteLabelSettings.logoDocsEditorSize.Height / 2 : TenantWhiteLabelSettings.logoDocsEditorSize.Height); + general ? logoDocsEditorSize.Width / 2 : logoDocsEditorSize.Width, + general ? logoDocsEditorSize.Height / 2 : logoDocsEditorSize.Height); case WhiteLabelLogoTypeEnum.DocsEditorEmbed: return new Size( - general ? TenantWhiteLabelSettings.logoDocsEditorEmbedSize.Width / 2 : TenantWhiteLabelSettings.logoDocsEditorEmbedSize.Width, - general ? TenantWhiteLabelSettings.logoDocsEditorEmbedSize.Height / 2 : TenantWhiteLabelSettings.logoDocsEditorEmbedSize.Height); + general ? logoDocsEditorEmbedSize.Width / 2 : logoDocsEditorEmbedSize.Width, + general ? logoDocsEditorEmbedSize.Height / 2 : logoDocsEditorEmbedSize.Height); + case WhiteLabelLogoTypeEnum.Light: + return new Size( + general ? logoLightSize.Width / 2 : logoLightSize.Width, + general ? logoLightSize.Height / 2 : logoLightSize.Height); + case WhiteLabelLogoTypeEnum.AboutDark: + return new Size( + general ? logoAboutDarkSize.Width / 2 : logoAboutDarkSize.Width, + general ? logoAboutDarkSize.Height / 2 : logoAboutDarkSize.Height); + case WhiteLabelLogoTypeEnum.AboutLight: + return new Size( + general ? logoAboutLightSize.Width / 2 : logoAboutLightSize.Width, + general ? logoAboutLightSize.Height / 2 : logoAboutLightSize.Height); } return new Size(0, 0); } - private static void ResizeLogo(WhiteLabelLogoTypeEnum type, String fileName, byte[] data, long maxFileSize, Size size, IDataStore store) + private static void ResizeLogo(WhiteLabelLogoTypeEnum type, string fileName, byte[] data, long maxFileSize, Size size, IDataStore store) { //Resize synchronously if (data == null || data.Length <= 0) throw new UnknownImageFormatException(); diff --git a/web/core/ASC.Web.Core/WhiteLabel/WhiteLabelLogoTypeEnum.cs b/web/core/ASC.Web.Core/WhiteLabel/WhiteLabelLogoTypeEnum.cs index 8ed14c5a6..44be18094 100644 --- a/web/core/ASC.Web.Core/WhiteLabel/WhiteLabelLogoTypeEnum.cs +++ b/web/core/ASC.Web.Core/WhiteLabel/WhiteLabelLogoTypeEnum.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.Web.Core.WhiteLabel { public enum WhiteLabelLogoTypeEnum @@ -23,6 +23,9 @@ public enum WhiteLabelLogoTypeEnum Dark = 2, Favicon = 3, DocsEditor = 4, - DocsEditorEmbed = 5 + DocsEditorEmbed = 5, + Light = 6, + AboutDark = 7, + AboutLight = 8 } } diff --git a/web/studio/ASC.Web.Studio/ASC.Web.Studio.csproj b/web/studio/ASC.Web.Studio/ASC.Web.Studio.csproj index 7fc173c18..900bcd641 100644 --- a/web/studio/ASC.Web.Studio/ASC.Web.Studio.csproj +++ b/web/studio/ASC.Web.Studio/ASC.Web.Studio.csproj @@ -37,6 +37,8 @@ prompt 4 false + bin\ASC.Web.Studio.xml + CS1591 none @@ -47,7 +49,11 @@ false + + + + @@ -55,6 +61,7 @@ + @@ -75,6 +82,9 @@ + + + DeepLink.aspx @@ -460,6 +470,13 @@ Backup.ascx + + ShareLinkPassword.ascx + ASPXCodeBehind + + + ShareLinkPassword.ascx + CookieSettings.ascx ASPXCodeBehind @@ -475,6 +492,27 @@ CustomNavigation.ascx + + ImpersonateSettings.ascx + ASPXCodeBehind + + + ImpersonateSettings.ascx + + + ImpersonateUserConfirmationPanel.ascx + ASPXCodeBehind + + + ImpersonateUserConfirmationPanel.ascx + + + LoginSettings.ascx + ASPXCodeBehind + + + LoginSettings.ascx + PricingPageSettings.ascx ASPXCodeBehind @@ -704,6 +742,7 @@ SmtpSettings.ascx + TipsSettings.ascx ASPXCodeBehind @@ -733,7 +772,6 @@ - @@ -1143,6 +1181,7 @@ + @@ -1184,28 +1223,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - - - + + + + - + - - + + + + + + + + + + + @@ -1319,13 +1395,21 @@ + + + + + + + + + - @@ -1354,6 +1438,9 @@ + + + @@ -1361,16 +1448,17 @@ - - - + + + + @@ -1446,6 +1534,7 @@ + @@ -1466,7 +1555,15 @@ + + + + + + + + @@ -1474,6 +1571,8 @@ + + @@ -1596,7 +1695,6 @@ - @@ -1635,7 +1733,25 @@ - + + + + + + + + + + + + + + + + + + + @@ -1672,7 +1788,6 @@ - @@ -1887,9 +2002,7 @@ - - - + @@ -1907,7 +2020,6 @@ - @@ -1923,8 +2035,6 @@ - - @@ -2054,22 +2164,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2106,8 +2257,8 @@ - - + + @@ -2160,7 +2311,6 @@ - @@ -2169,11 +2319,9 @@ - - @@ -2196,7 +2344,6 @@ - @@ -2211,9 +2358,10 @@ - + + - + @@ -2222,7 +2370,15 @@ - + + + + + + + + + @@ -2231,7 +2387,8 @@ - + + @@ -2243,7 +2400,6 @@ - @@ -2252,10 +2408,16 @@ audittrail.less - - + + + + + + + + @@ -2283,7 +2445,6 @@ - @@ -2291,7 +2452,12 @@ - + + + + + + @@ -2377,16 +2543,28 @@ - + + + + + + + + + + + + + - + - + - + @@ -2404,7 +2582,7 @@ - + @@ -2413,7 +2591,6 @@ loginhistory.less - @@ -2427,15 +2604,16 @@ - + + + + - + - - @@ -2453,7 +2631,7 @@ - + @@ -2466,7 +2644,7 @@ - + @@ -2499,6 +2677,7 @@ + Designer @@ -3538,17 +3717,13 @@ - - - - @@ -3576,8 +3751,6 @@ - - @@ -3621,7 +3794,7 @@ - + @@ -3885,7 +4058,7 @@ - + @@ -3939,7 +4112,6 @@ - @@ -3976,8 +4148,6 @@ - - @@ -4173,7 +4343,7 @@ - + @@ -4297,7 +4467,7 @@ 10.0.1 - 1.3.2 + 1.4.2 7.2.1 diff --git a/web/studio/ASC.Web.Studio/AppInstall.aspx.cs b/web/studio/ASC.Web.Studio/AppInstall.aspx.cs index e154a3dca..2def42f03 100644 --- a/web/studio/ASC.Web.Studio/AppInstall.aspx.cs +++ b/web/studio/ASC.Web.Studio/AppInstall.aspx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Web; diff --git a/web/studio/ASC.Web.Studio/App_Start/WebApi.Startup.cs b/web/studio/ASC.Web.Studio/App_Start/WebApi.Startup.cs index e879e47dd..53d62e9b7 100644 --- a/web/studio/ASC.Web.Studio/App_Start/WebApi.Startup.cs +++ b/web/studio/ASC.Web.Studio/App_Start/WebApi.Startup.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Auth.aspx.cs b/web/studio/ASC.Web.Studio/Auth.aspx.cs index 81d0a523f..196117f78 100644 --- a/web/studio/ASC.Web.Studio/Auth.aspx.cs +++ b/web/studio/ASC.Web.Studio/Auth.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Controls/Common/CommonResultsView.cs b/web/studio/ASC.Web.Studio/Controls/Common/CommonResultsView.cs index fce4febaf..04ae8a193 100644 --- a/web/studio/ASC.Web.Studio/Controls/Common/CommonResultsView.cs +++ b/web/studio/ASC.Web.Studio/Controls/Common/CommonResultsView.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Controls/Common/Container.cs b/web/studio/ASC.Web.Studio/Controls/Common/Container.cs index 303054a5b..2bfe34ccd 100644 --- a/web/studio/ASC.Web.Studio/Controls/Common/Container.cs +++ b/web/studio/ASC.Web.Studio/Controls/Common/Container.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Controls/Common/EmptyScreenControl.cs b/web/studio/ASC.Web.Studio/Controls/Common/EmptyScreenControl.cs index a5eff8553..01cc326cc 100644 --- a/web/studio/ASC.Web.Studio/Controls/Common/EmptyScreenControl.cs +++ b/web/studio/ASC.Web.Studio/Controls/Common/EmptyScreenControl.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Controls/Common/FeedControl.cs b/web/studio/ASC.Web.Studio/Controls/Common/FeedControl.cs index be22cf16c..07ed70c90 100644 --- a/web/studio/ASC.Web.Studio/Controls/Common/FeedControl.cs +++ b/web/studio/ASC.Web.Studio/Controls/Common/FeedControl.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Controls/Common/InlineScript.cs b/web/studio/ASC.Web.Studio/Controls/Common/InlineScript.cs index b66db867c..9af1b875d 100644 --- a/web/studio/ASC.Web.Studio/Controls/Common/InlineScript.cs +++ b/web/studio/ASC.Web.Studio/Controls/Common/InlineScript.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Controls/Common/MenuItem.cs b/web/studio/ASC.Web.Studio/Controls/Common/MenuItem.cs index 6107a0789..12fca7cfb 100644 --- a/web/studio/ASC.Web.Studio/Controls/Common/MenuItem.cs +++ b/web/studio/ASC.Web.Studio/Controls/Common/MenuItem.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Controls/Common/NotFoundControl.cs b/web/studio/ASC.Web.Studio/Controls/Common/NotFoundControl.cs index 872e67c38..ba80a97ce 100644 --- a/web/studio/ASC.Web.Studio/Controls/Common/NotFoundControl.cs +++ b/web/studio/ASC.Web.Studio/Controls/Common/NotFoundControl.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Controls/Common/PageNavigator.cs b/web/studio/ASC.Web.Studio/Controls/Common/PageNavigator.cs index f5cb2a43a..2c251e45a 100644 --- a/web/studio/ASC.Web.Studio/Controls/Common/PageNavigator.cs +++ b/web/studio/ASC.Web.Studio/Controls/Common/PageNavigator.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Controls/Common/ResultsView.cs b/web/studio/ASC.Web.Studio/Controls/Common/ResultsView.cs index 287b0195b..d3e3d2b7e 100644 --- a/web/studio/ASC.Web.Studio/Controls/Common/ResultsView.cs +++ b/web/studio/ASC.Web.Studio/Controls/Common/ResultsView.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Controls/Common/SideContainer.cs b/web/studio/ASC.Web.Studio/Controls/Common/SideContainer.cs index 20e9cfe23..c3a4bfc42 100644 --- a/web/studio/ASC.Web.Studio/Controls/Common/SideContainer.cs +++ b/web/studio/ASC.Web.Studio/Controls/Common/SideContainer.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Controls/FileUploader/FileToUpload.cs b/web/studio/ASC.Web.Studio/Controls/FileUploader/FileToUpload.cs index 4c9176a95..173211f89 100644 --- a/web/studio/ASC.Web.Studio/Controls/FileUploader/FileToUpload.cs +++ b/web/studio/ASC.Web.Studio/Controls/FileUploader/FileToUpload.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Controls/FileUploader/HttpModule/UploadProgressHandler.cs b/web/studio/ASC.Web.Studio/Controls/FileUploader/HttpModule/UploadProgressHandler.cs index 555525e8c..96a15f65a 100644 --- a/web/studio/ASC.Web.Studio/Controls/FileUploader/HttpModule/UploadProgressHandler.cs +++ b/web/studio/ASC.Web.Studio/Controls/FileUploader/HttpModule/UploadProgressHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,14 +35,6 @@ public class FileUploadResult public string Message { get; set; } } - public virtual string GetFileName(string path) - { - if (string.IsNullOrEmpty(path)) return string.Empty; - - var ind = path.LastIndexOf('\\'); - return ind != -1 ? path.Substring(ind + 1) : path; - } - public abstract FileUploadResult ProcessUpload(HttpContext context); } diff --git a/web/studio/ASC.Web.Studio/Controls/Users/EmployeeUserCard.cs b/web/studio/ASC.Web.Studio/Controls/Users/EmployeeUserCard.cs index fbb391cb6..158af8eba 100644 --- a/web/studio/ASC.Web.Studio/Controls/Users/EmployeeUserCard.cs +++ b/web/studio/ASC.Web.Studio/Controls/Users/EmployeeUserCard.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/AdminHelperSettings.cs b/web/studio/ASC.Web.Studio/Core/AdminHelperSettings.cs index b6b337391..df0a4bcce 100644 --- a/web/studio/ASC.Web.Studio/Core/AdminHelperSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/AdminHelperSettings.cs @@ -1,4 +1,21 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; using System.Runtime.Serialization; using ASC.Core.Common.Settings; diff --git a/web/studio/ASC.Web.Studio/Core/Backup/BackupAjaxHandler.cs b/web/studio/ASC.Web.Studio/Core/Backup/BackupAjaxHandler.cs index e59bb3338..a85ae6026 100644 --- a/web/studio/ASC.Web.Studio/Core/Backup/BackupAjaxHandler.cs +++ b/web/studio/ASC.Web.Studio/Core/Backup/BackupAjaxHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -374,18 +374,34 @@ private static int GetCurrentTenantId() public class Schedule { + ///1 public BackupStorageType StorageType { get; set; } + + ///null public Dictionary StorageParams { get; set; } + + ///ASC.Web.Studio.Core.Backup.CronParams, ASC.Web.Studio public CronParams CronParams { get; set; } + + ///true public bool BackupMail { get; set; } + + ///1 public int BackupsStored { get; set; } + + ///2019-07-26T00:00:00 public DateTime LastBackupTime { get; set; } } public class CronParams { + ///0 public BackupPeriod Period { get; set; } + + ///5 public int Hour { get; set; } + + ///4 public int Day { get; set; } public CronParams() diff --git a/web/studio/ASC.Web.Studio/Core/Backup/BackupFileUploadHandler.cs b/web/studio/ASC.Web.Studio/Core/Backup/BackupFileUploadHandler.cs index 9668b8ac1..13aaf19b1 100644 --- a/web/studio/ASC.Web.Studio/Core/Backup/BackupFileUploadHandler.cs +++ b/web/studio/ASC.Web.Studio/Core/Backup/BackupFileUploadHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/CollaboratorSettings.cs b/web/studio/ASC.Web.Studio/Core/CollaboratorSettings.cs index cd706e705..d2e247958 100644 --- a/web/studio/ASC.Web.Studio/Core/CollaboratorSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/CollaboratorSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/CountriesResources.cs b/web/studio/ASC.Web.Studio/Core/CountriesResources.cs index 1b8720f27..83458dc73 100644 --- a/web/studio/ASC.Web.Studio/Core/CountriesResources.cs +++ b/web/studio/ASC.Web.Studio/Core/CountriesResources.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/CustomNavigationSettings.cs b/web/studio/ASC.Web.Studio/Core/CustomNavigationSettings.cs index f0ddaab75..c2578af26 100644 --- a/web/studio/ASC.Web.Studio/Core/CustomNavigationSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/CustomNavigationSettings.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Runtime.Serialization; @@ -45,24 +45,31 @@ public override ISettings GetDefault() [DataContract] public class CustomNavigationItem { + ///00000000-0000-0000-0000-000000000000 [DataMember] public Guid Id { get; set; } + ///Label [DataMember] public string Label { get; set; } + ///Url [DataMember] public string Url { get; set; } + ///data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkAgMAAAANjH3HAAAADFBMVEUAAADJycnJycnJycmiuNtHAAAAA3RSTlMAf4C\/aSLHAAAAyElEQVR4Xu3NsQ3CMBSE4YubFB4ilHQegdGSjWACvEpGoEyBYiL05AdnXUGHolx10lf82MmOpfLeo5UoJUhBlpKkRCnhUy7b9XCWkqQMUkYlXVHSf8kTvkHKqKQrSnopg5SRxTMklLmS1MwaSWpmCSQ1MyOzWGZCYrEMEFksA4QqlAFuJJYBcCKxjM3FMySeIfEMC2dMOONCGZZgmdr1ly3TSrJMK9EyJBaaGrHQikYstAiJZRYSyiQEdyg5S8Evckih\/YPscsdej0H6dc0TYw4AAAAASUVORK5CYII= [DataMember] public string BigImg { get; set; } + ///data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8\/9hAAAAUUlEQVR4AWMY\/KC5o\/cAEP9HxxgKcSpCGELYADyu2E6mAQjNxBlAWPNxkHdwGkBIM3KYYDUAr2ZCAE+oH8eujrAXDsA0k2EAAtDXAGLx4MpsADUgvkRKUlqfAAAAAElFTkSuQmCC [DataMember] public string SmallImg { get; set; } + ///true [DataMember] public bool ShowInMenu { get; set; } + ///true [DataMember] public bool ShowOnHomePage { get; set; } diff --git a/web/studio/ASC.Web.Studio/Core/DateTimeExtension.cs b/web/studio/ASC.Web.Studio/Core/DateTimeExtension.cs index b70e51400..c180af898 100644 --- a/web/studio/ASC.Web.Studio/Core/DateTimeExtension.cs +++ b/web/studio/ASC.Web.Studio/Core/DateTimeExtension.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/DebugInfo.cs b/web/studio/ASC.Web.Studio/Core/DebugInfo.cs index 6f1fbdcdd..eadf36398 100644 --- a/web/studio/ASC.Web.Studio/Core/DebugInfo.cs +++ b/web/studio/ASC.Web.Studio/Core/DebugInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/EmailActivationSettings.cs b/web/studio/ASC.Web.Studio/Core/EmailActivationSettings.cs index f397e063a..841cf4a6e 100644 --- a/web/studio/ASC.Web.Studio/Core/EmailActivationSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/EmailActivationSettings.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Runtime.Serialization; @@ -26,6 +26,7 @@ namespace ASC.Web.Studio.Core [DataContract] public class EmailActivationSettings : BaseSettings { + ///true [DataMember(Name = "Show")] public bool Show { get; set; } diff --git a/web/studio/ASC.Web.Studio/Core/EmailOperationService.cs b/web/studio/ASC.Web.Studio/Core/EmailOperationService.cs index e3c8a8c28..c740cd613 100644 --- a/web/studio/ASC.Web.Studio/Core/EmailOperationService.cs +++ b/web/studio/ASC.Web.Studio/Core/EmailOperationService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -191,6 +191,7 @@ public string SendEmailChangeInstructions(Guid userID, string email) if (!viewer.IsAdmin()) { StudioNotifyService.Instance.SendEmailChangeInstructions(user, email); + MessageService.Send(HttpContext.Current.Request, MessageAction.UserSentEmailChangeInstructions, user.DisplayUserName(false)); } else { @@ -209,10 +210,9 @@ public string SendEmailChangeInstructions(Guid userID, string email) CoreContext.UserManager.SaveUserInfo(user, syncCardDav: true); StudioNotifyService.Instance.SendEmailActivationInstructions(user, email); + MessageService.Send(HttpContext.Current.Request, MessageAction.UserSentActivationInstructions, user.DisplayUserName(false)); } - MessageService.Send(HttpContext.Current.Request, MessageAction.UserSentEmailChangeInstructions, user.DisplayUserName(false)); - return String.Format(Resource.MessageEmailChangeInstuctionsSentOnEmail, "" + email + ""); } catch (AccessDeniedException) diff --git a/web/studio/ASC.Web.Studio/Core/FCKUploadsDBManager.cs b/web/studio/ASC.Web.Studio/Core/FCKUploadsDBManager.cs index 4cafbc193..52bace9f3 100644 --- a/web/studio/ASC.Web.Studio/Core/FCKUploadsDBManager.cs +++ b/web/studio/ASC.Web.Studio/Core/FCKUploadsDBManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,7 @@ class FCKUploadsDBManager public static void SetUploadRelations(string storeDomain, string folderID, string itemID) { - using (var _dbManager = DbManager.FromHttpContext(_databaseID)) + using (var _dbManager = new DbManager(_databaseID)) { _dbManager.Connection.CreateCommand( @"insert into webstudio_fckuploads (TenantID, StoreDomain, FolderID, ItemID) @@ -42,7 +42,7 @@ public static void SetUploadRelations(string storeDomain, string folderID, strin public static string GetFolderID(string storeDomain, string itemID) { - using (var _dbManager = DbManager.FromHttpContext(_databaseID)) + using (var _dbManager = new DbManager(_databaseID)) { return _dbManager.ExecuteScalar(new SqlQuery("webstudio_fckuploads").Select("FolderID") .Where(Exp.Eq("TenantID", TenantProvider.CurrentTenantID) & @@ -53,7 +53,7 @@ public static string GetFolderID(string storeDomain, string itemID) public static void RemoveUploadRelation(string storeDomain, string folderID, string itemID) { - using (var _dbManager = DbManager.FromHttpContext(_databaseID)) + using (var _dbManager = new DbManager(_databaseID)) { _dbManager.ExecuteNonQuery(new SqlDelete("webstudio_fckuploads") .Where(Exp.Eq("TenantID", TenantProvider.CurrentTenantID) & diff --git a/web/studio/ASC.Web.Studio/Core/FileSizeComment.cs b/web/studio/ASC.Web.Studio/Core/FileSizeComment.cs index 8703b2402..d83d7871e 100644 --- a/web/studio/ASC.Web.Studio/Core/FileSizeComment.cs +++ b/web/studio/ASC.Web.Studio/Core/FileSizeComment.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/HelpCenter/BaseHelpCenterStorage.cs b/web/studio/ASC.Web.Studio/Core/HelpCenter/BaseHelpCenterStorage.cs index bc247fca5..d5423490f 100644 --- a/web/studio/ASC.Web.Studio/Core/HelpCenter/BaseHelpCenterStorage.cs +++ b/web/studio/ASC.Web.Studio/Core/HelpCenter/BaseHelpCenterStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,17 +21,16 @@ using System.IO; using System.IO.Compression; using System.Linq; -using System.Net; using System.Net.Http; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; -using System.Text; using System.Threading; using System.Threading.Tasks; using ASC.Common.Caching; using ASC.Common.Logging; using ASC.Common.Threading; +using ASC.Common.Web; using ASC.Web.Core.Client; namespace ASC.Web.Studio.Core.HelpCenter @@ -171,7 +170,7 @@ private T GetFromCacheOrFile(string url) } catch (Exception e) { - Log.Error("Error GetVideoGuide", e); + Log.Error("Error GetHelpCenter", e); } if (data == null) @@ -222,6 +221,13 @@ private void ToFile(Dictionary obj) { try { + var directoryName = Path.GetDirectoryName(FilePath); + + if (!Directory.Exists(directoryName)) + { + Directory.CreateDirectory(directoryName); + } + using (var filesStream = File.Open(FilePath, FileMode.Create)) { WriteToStream(filesStream, obj); @@ -229,7 +235,7 @@ private void ToFile(Dictionary obj) } catch (Exception e) { - Log.Error("Error UpdateVideoGuide", e); + Log.Error("Error UpdateHelpCenter", e); } } @@ -273,12 +279,21 @@ public class HelpCenterRequest public Action Starter { get; set; } private static bool stopRequesting; private static readonly ILog Log; + private static HttpClient httpClient; protected DistributedTask TaskInfo { get; private set; } static HelpCenterRequest() { Log = LogManager.GetLogger("ASC.Web.HelpCenter"); + + var httpHandler = new HttpClientHandler + { + AllowAutoRedirect = true + }; + + httpClient = HttpClientFactory.CreateClient(nameof(HelpCenterRequest), httpHandler); + httpClient.DefaultRequestHeaders.Add("Accept-Language", "en"); } public HelpCenterRequest() @@ -307,36 +322,12 @@ internal void SendRequest(DistributedTask task, CancellationToken token) } try { - var httpWebRequest = (HttpWebRequest)WebRequest.Create(Url); - - httpWebRequest.AllowAutoRedirect = true; - httpWebRequest.Timeout = 15000; - httpWebRequest.Method = "GET"; - httpWebRequest.Headers["Accept-Language"] = "en"; // get correct en lang - - var countTry = 0; - const int maxTry = 3; - while (countTry < maxTry) + Func> requestFunc = async () => { - try - { - countTry++; - using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse()) - using (var stream = httpWebResponse.GetResponseStream()) - using (var reader = new StreamReader(stream, Encoding.GetEncoding(httpWebResponse.CharacterSet))) - { - result = reader.ReadToEnd(); - break; - } - } - catch (WebException ex) - { - if (ex.Status != WebExceptionStatus.Timeout) - { - throw; - } - } - } + return await httpClient.GetStringAsync(Url); + }; + + result = Task.Run(() => ResiliencePolicyManager.GetStringWithPoliciesAsync("SendRequest", requestFunc)).Result; } catch (Exception e) { diff --git a/web/studio/ASC.Web.Studio/Core/HelpCenter/HelpCenterHelper.cs b/web/studio/ASC.Web.Studio/Core/HelpCenter/HelpCenterHelper.cs index 007c5aec7..090e0f366 100644 --- a/web/studio/ASC.Web.Studio/Core/HelpCenter/HelpCenterHelper.cs +++ b/web/studio/ASC.Web.Studio/Core/HelpCenter/HelpCenterHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/HelpCenter/HelpCenterStorage.cs b/web/studio/ASC.Web.Studio/Core/HelpCenter/HelpCenterStorage.cs index 2fcd4260f..8cbf96c39 100644 --- a/web/studio/ASC.Web.Studio/Core/HelpCenter/HelpCenterStorage.cs +++ b/web/studio/ASC.Web.Studio/Core/HelpCenter/HelpCenterStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/HelpCenter/UserVideoSettings.cs b/web/studio/ASC.Web.Studio/Core/HelpCenter/UserVideoSettings.cs index 373a92582..fe36081de 100644 --- a/web/studio/ASC.Web.Studio/Core/HelpCenter/UserVideoSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/HelpCenter/UserVideoSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/HelpCenter/VideoGuideStorage.cs b/web/studio/ASC.Web.Studio/Core/HelpCenter/VideoGuideStorage.cs index 7adb6392a..984c67840 100644 --- a/web/studio/ASC.Web.Studio/Core/HelpCenter/VideoGuideStorage.cs +++ b/web/studio/ASC.Web.Studio/Core/HelpCenter/VideoGuideStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Import/ContactInfo.cs b/web/studio/ASC.Web.Studio/Core/Import/ContactInfo.cs index 88e13501b..e5cf9e5d1 100644 --- a/web/studio/ASC.Web.Studio/Core/Import/ContactInfo.cs +++ b/web/studio/ASC.Web.Studio/Core/Import/ContactInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Import/IUserImporter.cs b/web/studio/ASC.Web.Studio/Core/Import/IUserImporter.cs index 501438589..cb499e681 100644 --- a/web/studio/ASC.Web.Studio/Core/Import/IUserImporter.cs +++ b/web/studio/ASC.Web.Studio/Core/Import/IUserImporter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Import/OutlookCSVUserImporter.cs b/web/studio/ASC.Web.Studio/Core/Import/OutlookCSVUserImporter.cs index 060227dff..735b03806 100644 --- a/web/studio/ASC.Web.Studio/Core/Import/OutlookCSVUserImporter.cs +++ b/web/studio/ASC.Web.Studio/Core/Import/OutlookCSVUserImporter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Import/TextFileUserImporter.cs b/web/studio/ASC.Web.Studio/Core/Import/TextFileUserImporter.cs index 56ec4293b..5dd91f5c8 100644 --- a/web/studio/ASC.Web.Studio/Core/Import/TextFileUserImporter.cs +++ b/web/studio/ASC.Web.Studio/Core/Import/TextFileUserImporter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/InfoType.cs b/web/studio/ASC.Web.Studio/Core/InfoType.cs index 54302d8ba..8c6836931 100644 --- a/web/studio/ASC.Web.Studio/Core/InfoType.cs +++ b/web/studio/ASC.Web.Studio/Core/InfoType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/IpRestrictionsSettings.cs b/web/studio/ASC.Web.Studio/Core/IpRestrictionsSettings.cs index bfcfcd534..61b78d906 100644 --- a/web/studio/ASC.Web.Studio/Core/IpRestrictionsSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/IpRestrictionsSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ namespace ASC.Web.Studio.Core [DataContract] public class IPRestrictionsSettings : BaseSettings { + ///true [DataMember(Name = "Enable")] public bool Enable { get; set; } diff --git a/web/studio/ASC.Web.Studio/Core/Notify/Actions.cs b/web/studio/ASC.Web.Studio/Core/Notify/Actions.cs index 14fbdfd25..5699970c2 100644 --- a/web/studio/ASC.Web.Studio/Core/Notify/Actions.cs +++ b/web/studio/ASC.Web.Studio/Core/Notify/Actions.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.Notify.Model; namespace ASC.Web.Studio.Core.Notify diff --git a/web/studio/ASC.Web.Studio/Core/Notify/NotifyConfiguration.cs b/web/studio/ASC.Web.Studio/Core/Notify/NotifyConfiguration.cs index c44ef7804..32cd4891e 100644 --- a/web/studio/ASC.Web.Studio/Core/Notify/NotifyConfiguration.cs +++ b/web/studio/ASC.Web.Studio/Core/Notify/NotifyConfiguration.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Notify/SpamEmailSettings.cs b/web/studio/ASC.Web.Studio/Core/Notify/SpamEmailSettings.cs index c5f61926f..1932e84b8 100644 --- a/web/studio/ASC.Web.Studio/Core/Notify/SpamEmailSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/Notify/SpamEmailSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Notify/StudioNotifyHelper.cs b/web/studio/ASC.Web.Studio/Core/Notify/StudioNotifyHelper.cs index 948a90910..11de128ca 100644 --- a/web/studio/ASC.Web.Studio/Core/Notify/StudioNotifyHelper.cs +++ b/web/studio/ASC.Web.Studio/Core/Notify/StudioNotifyHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Notify/StudioNotifyService.cs b/web/studio/ASC.Web.Studio/Core/Notify/StudioNotifyService.cs index 26b285f65..f2861131e 100644 --- a/web/studio/ASC.Web.Studio/Core/Notify/StudioNotifyService.cs +++ b/web/studio/ASC.Web.Studio/Core/Notify/StudioNotifyService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -131,12 +131,12 @@ public void SendMsgWhatsNew(DateTime scheduleDate) public void SendMsgToAdminAboutProfileUpdated() { - client.SendNoticeAsync(Actions.SelfProfileUpdated, null, null); + client.SendNoticeAsync(Actions.SelfProfileUpdated, null); } public void SendMsgToAdminFromNotAuthUser(string email, string message) { - client.SendNoticeAsync(Actions.UserMessageToAdmin, null, null, + client.SendNoticeAsync(Actions.UserMessageToAdmin, null, new TagValue(Tags.Body, message), new TagValue(Tags.UserEmail, email)); } @@ -168,7 +168,6 @@ public void SendRequestTariff(bool license, string fname, string lname, string t null, new[] { recipient }, new[] { "email.sender" }, - null, new TagValue(Tags.UserName, fname), new TagValue(Tags.UserLastName, lname), new TagValue(Tags.UserPosition, title), @@ -184,13 +183,13 @@ public void SendRequestTariff(bool license, string fname, string lname, string t public void SendToAdminVoipWarning(double balance) { - client.SendNoticeAsync(Actions.VoipWarning, null, null, + client.SendNoticeAsync(Actions.VoipWarning, null, new TagValue(Tags.Body, balance)); } public void SendToAdminVoipBlocked() { - client.SendNoticeAsync(Actions.VoipBlocked, null, null); + client.SendNoticeAsync(Actions.VoipBlocked, null); } @@ -217,7 +216,6 @@ public void UserPasswordChange(UserInfo userInfo) null, StudioNotifyHelper.RecipientFromEmail(userInfo.Email, false), new[] { EMailSenderName }, - null, TagValues.GreenButton(greenButtonText, confirmationUrl)); var displayUserName = userInfo.DisplayUserName(false); @@ -244,7 +242,6 @@ public void SendEmailChangeInstructions(UserInfo user, string email) null, StudioNotifyHelper.RecipientFromEmail(email, false), new[] { EMailSenderName }, - null, TagValues.GreenButton(greenButtonText, confirmationUrl), new TagValue(CommonTags.Culture, user.GetCulture().Name)); } @@ -260,7 +257,6 @@ public void SendEmailActivationInstructions(UserInfo user, string email) null, StudioNotifyHelper.RecipientFromEmail(email, false), new[] { EMailSenderName }, - null, new TagValue(Tags.InviteLink, confirmationUrl), TagValues.GreenButton(greenButtonText, confirmationUrl), new TagValue(Tags.UserDisplayName, (user.DisplayUserName() ?? string.Empty).Trim())); @@ -304,7 +300,6 @@ public void SendMailboxCreated(List toEmails, string username, string ad null, StudioNotifyHelper.RecipientFromEmail(toEmails, false), new[] { EMailSenderName }, - null, tags.ToArray()); } @@ -315,7 +310,6 @@ public void SendMailboxPasswordChanged(List toEmails, string username, s null, StudioNotifyHelper.RecipientFromEmail(toEmails, false), new[] { EMailSenderName }, - null, new TagValue(Tags.UserName, username ?? string.Empty), new TagValue(Tags.Address, address ?? string.Empty)); } @@ -333,7 +327,6 @@ public void SendMsgMobilePhoneChange(UserInfo userInfo) null, StudioNotifyHelper.RecipientFromEmail(userInfo.Email, false), new[] { EMailSenderName }, - null, TagValues.GreenButton(greenButtonText, confirmationUrl)); } @@ -348,7 +341,6 @@ public void SendMsgTfaReset(UserInfo userInfo) null, StudioNotifyHelper.RecipientFromEmail(userInfo.Email, false), new[] { EMailSenderName }, - null, TagValues.GreenButton(greenButtonText, confirmationUrl)); } @@ -357,7 +349,7 @@ public void UserHasJoin() { if (!CoreContext.Configuration.Personal) { - client.SendNoticeAsync(Actions.UserHasJoin, null, null); + client.SendNoticeAsync(Actions.UserHasJoin, null); } } @@ -373,7 +365,6 @@ public void SendJoinMsg(string email, EmployeeType emplType) null, StudioNotifyHelper.RecipientFromEmail(email, true), new[] { EMailSenderName }, - null, new TagValue(Tags.InviteLink, inviteUrl), TagValues.GreenButton(greenButtonText, inviteUrl)); } @@ -427,7 +418,6 @@ public void UserInfoAddedAfterInvite(UserInfo newUserInfo) null, StudioNotifyHelper.RecipientFromEmail(newUserInfo.Email, false), new[] { EMailSenderName }, - null, new TagValue(Tags.UserName, newUserInfo.FirstName.HtmlEncode()), new TagValue(Tags.MyStaffLink, GetMyStaffLink()), TagValues.GreenButton(greenButtonText, CommonLinkUtility.GetFullAbsolutePath("~").TrimEnd('/')), @@ -467,7 +457,6 @@ public void GuestInfoAddedAfterInvite(UserInfo newUserInfo) null, StudioNotifyHelper.RecipientFromEmail(newUserInfo.Email, false), new[] { EMailSenderName }, - null, new TagValue(Tags.UserName, newUserInfo.FirstName.HtmlEncode()), new TagValue(Tags.MyStaffLink, GetMyStaffLink()), TagValues.GreenButton(greenButtonText, CommonLinkUtility.GetFullAbsolutePath("~").TrimEnd('/')), @@ -507,7 +496,6 @@ public void UserInfoActivation(UserInfo newUserInfo) null, StudioNotifyHelper.RecipientFromEmail(newUserInfo.Email, false), new[] { EMailSenderName }, - null, new TagValue(Tags.ActivateUrl, confirmationUrl), TagValues.GreenButton(greenButtonText, confirmationUrl), new TagValue(Tags.UserName, newUserInfo.FirstName.HtmlEncode()), @@ -547,7 +535,6 @@ public void GuestInfoActivation(UserInfo newUserInfo) null, StudioNotifyHelper.RecipientFromEmail(newUserInfo.Email, false), new[] { EMailSenderName }, - null, new TagValue(Tags.ActivateUrl, confirmationUrl), TagValues.GreenButton(greenButtonText, confirmationUrl), new TagValue(Tags.UserName, newUserInfo.FirstName.HtmlEncode()), @@ -569,7 +556,6 @@ public void SendMsgProfileDeletion(UserInfo user) null, StudioNotifyHelper.RecipientFromEmail(user.Email, false), new[] { EMailSenderName }, - null, TagValues.GreenButton(greenButtonText, confirmationUrl), new TagValue(CommonTags.Culture, user.GetCulture().Name)); } @@ -597,7 +583,6 @@ public void SendMsgProfileHasDeletedItself(UserInfo user) null, new IRecipient[] { admin }, new[] { EMailSenderName }, - null, new TagValue(Tags.FromUserName, user.DisplayUserName()), new TagValue(Tags.FromUserLink, GetUserProfileLink(user.ID))); } @@ -617,7 +602,6 @@ public void SendMsgReassignsCompleted(Guid recipientId, UserInfo fromUser, UserI null, new[] { StudioNotifyHelper.ToRecipient(recipientId) }, new[] { EMailSenderName }, - null, new TagValue(Tags.UserName, DisplayUserSettings.GetFullUserName(recipientId)), new TagValue(Tags.FromUserName, fromUser.DisplayUserName()), new TagValue(Tags.FromUserLink, GetUserProfileLink(fromUser.ID)), @@ -632,7 +616,6 @@ public void SendMsgReassignsFailed(Guid recipientId, UserInfo fromUser, UserInfo null, new[] { StudioNotifyHelper.ToRecipient(recipientId) }, new[] { EMailSenderName }, - null, new TagValue(Tags.UserName, DisplayUserSettings.GetFullUserName(recipientId)), new TagValue(Tags.FromUserName, fromUser.DisplayUserName()), new TagValue(Tags.FromUserLink, GetUserProfileLink(fromUser.ID)), @@ -648,7 +631,6 @@ public void SendMsgRemoveUserDataCompleted(Guid recipientId, Guid fromUserId, st null, new[] { StudioNotifyHelper.ToRecipient(recipientId) }, new[] { EMailSenderName }, - null, new TagValue(Tags.UserName, DisplayUserSettings.GetFullUserName(recipientId)), new TagValue(Tags.FromUserName, fromUserName.HtmlEncode()), new TagValue(Tags.FromUserLink, GetUserProfileLink(fromUserId)), @@ -665,7 +647,6 @@ public void SendMsgRemoveUserDataFailed(Guid recipientId, Guid fromUserId, strin null, new[] { StudioNotifyHelper.ToRecipient(recipientId) }, new[] { EMailSenderName }, - null, new TagValue(Tags.UserName, DisplayUserSettings.GetFullUserName(recipientId)), new TagValue(Tags.FromUserName, fromUserName.HtmlEncode()), new TagValue(Tags.FromUserLink, GetUserProfileLink(fromUserId)), @@ -711,7 +692,6 @@ public void SendAdminWelcome(UserInfo newUserInfo) null, StudioNotifyHelper.RecipientFromEmail(newUserInfo.Email, false), new[] { EMailSenderName }, - null, tagValues.ToArray()); } @@ -724,7 +704,6 @@ public void SendMsgBackupCompleted(Guid userId, string link) null, new[] { StudioNotifyHelper.ToRecipient(userId) }, new[] { EMailSenderName }, - null, new TagValue(Tags.OwnerName, CoreContext.UserManager.GetUsers(userId).DisplayUserName())); } @@ -740,8 +719,7 @@ public void SendMsgRestoreStarted(bool notifyAllUsers) Actions.RestoreStarted, null, users, - new[] { EMailSenderName }, - null); + new[] { EMailSenderName }); } public void SendMsgRestoreCompleted(bool notifyAllUsers) @@ -762,7 +740,6 @@ public void SendMsgRestoreCompleted(bool notifyAllUsers) null, new IRecipient[] { user }, new[] { EMailSenderName }, - null, TagValues.GreenButton(greenButtonText, confirmationUrl)); } } @@ -782,7 +759,6 @@ public void SendMsgPortalDeactivation(Tenant t, string deactivateUrl, string act null, new IRecipient[] { u }, new[] { EMailSenderName }, - null, new TagValue(Tags.ActivateUrl, activateUrl), TagValues.GreenButton(greenButtonText, deactivateUrl), new TagValue(Tags.OwnerName, u.DisplayUserName())); @@ -799,7 +775,6 @@ public void SendMsgPortalDeletion(Tenant t, string url, bool showAutoRenewText) null, new IRecipient[] { u }, new[] { EMailSenderName }, - null, TagValues.GreenButton(greenButtonText, url), new TagValue(Tags.AutoRenew, showAutoRenewText.ToString()), new TagValue(Tags.OwnerName, u.DisplayUserName())); @@ -814,7 +789,6 @@ public void SendMsgPortalDeletionSuccess(UserInfo owner, string url) null, new IRecipient[] { owner }, new[] { EMailSenderName }, - null, TagValues.GreenButton(greenButtonText, url), new TagValue(Tags.OwnerName, owner.DisplayUserName())); } @@ -832,7 +806,6 @@ public void SendMsgDnsChange(Tenant t, string confirmDnsUpdateUrl, string portal null, new IRecipient[] { u }, new[] { EMailSenderName }, - null, new TagValue("ConfirmDnsUpdate", confirmDnsUpdateUrl),//TODO: Tag is deprecated and replaced by TagGreenButton TagValues.GreenButton(greenButtonText, confirmDnsUpdateUrl), new TagValue("PortalAddress", AddHttpToUrl(portalAddress)), @@ -850,7 +823,6 @@ public void SendMsgConfirmChangeOwner(UserInfo owner, UserInfo newOwner, string null, new IRecipient[] { owner }, new[] { EMailSenderName }, - null, TagValues.GreenButton(greenButtonText, confirmOwnerUpdateUrl), new TagValue(Tags.UserName, newOwner.DisplayUserName()), new TagValue(Tags.OwnerName, owner.DisplayUserName())); @@ -890,7 +862,6 @@ public void SendCongratulations(UserInfo u) null, StudioNotifyHelper.RecipientFromEmail(u.Email, false), new[] { EMailSenderName }, - null, new TagValue(Tags.UserName, u.FirstName.HtmlEncode()), new TagValue(Tags.MyStaffLink, GetMyStaffLink()), new TagValue(Tags.ActivateUrl, confirmationUrl), @@ -926,7 +897,6 @@ public void SendInvitePersonal(string email, string additionalMember = "") null, StudioNotifyHelper.RecipientFromEmail(email, false), new[] { EMailSenderName }, - null, new TagValue(Tags.InviteLink, confirmUrl), new TagValue(CommonTags.Footer, CoreContext.Configuration.CustomMode ? "personalCustomMode" : "personal"), new TagValue(CommonTags.Culture, Thread.CurrentThread.CurrentUICulture.Name)); @@ -939,7 +909,6 @@ public void SendUserWelcomePersonal(UserInfo newUserInfo) null, StudioNotifyHelper.RecipientFromEmail(newUserInfo.Email, true), new[] { EMailSenderName }, - null, new TagValue(CommonTags.Footer, CoreContext.Configuration.CustomMode ? "personalCustomMode" : "personal"), new TagValue(CommonTags.MasterTemplate, "HtmlMasterPersonal")); } @@ -989,7 +958,6 @@ private void MigrationNotify(INotifyAction action, string region, string url, bo null, new IRecipient[] { user }, new[] { EMailSenderName }, - null, currentArgs.ToArray()); } } @@ -1000,7 +968,6 @@ private void MigrationNotify(INotifyAction action, string region, string url, bo null, users.Select(u => StudioNotifyHelper.ToRecipient(u.ID)).ToArray(), new[] { EMailSenderName }, - null, args.ToArray()); } } @@ -1046,7 +1013,6 @@ public void PortalRenameNotify(String oldVirtualRootPath) null, new[] { StudioNotifyHelper.ToRecipient(u.ID) }, new[] { EMailSenderName }, - null, new TagValue(Tags.PortalUrl, oldVirtualRootPath), new TagValue(Tags.UserDisplayName, u.DisplayUserName())); } @@ -1146,7 +1112,6 @@ public void SendRegData(UserInfo u) null, new IRecipient[] { recipient }, new[] { EMailSenderName }, - null, new TagValue(Tags.UserName, u.FirstName.HtmlEncode()), new TagValue(Tags.UserLastName, u.LastName.HtmlEncode()), new TagValue(Tags.UserEmail, u.Email.HtmlEncode()), @@ -1206,7 +1171,6 @@ private void SendStorageEncryptionNotify(INotifyAction action, bool notifyAdmins null, new[] { StudioNotifyHelper.ToRecipient(u.ID) }, new[] { EMailSenderName }, - null, new TagValue(Tags.UserName, u.FirstName.HtmlEncode()), new TagValue(Tags.PortalUrl, serverRootPath), new TagValue(Tags.ControlPanelUrl, GetControlPanelUrl(serverRootPath))); diff --git a/web/studio/ASC.Web.Studio/Core/Notify/StudioNotifySource.cs b/web/studio/ASC.Web.Studio/Core/Notify/StudioNotifySource.cs index 348c8b78f..bd9f1db4a 100644 --- a/web/studio/ASC.Web.Studio/Core/Notify/StudioNotifySource.cs +++ b/web/studio/ASC.Web.Studio/Core/Notify/StudioNotifySource.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Notify/StudioPeriodicNotify.cs b/web/studio/ASC.Web.Studio/Core/Notify/StudioPeriodicNotify.cs index 521f79878..832694bcf 100644 --- a/web/studio/ASC.Web.Studio/Core/Notify/StudioPeriodicNotify.cs +++ b/web/studio/ASC.Web.Studio/Core/Notify/StudioPeriodicNotify.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Globalization; @@ -371,7 +371,6 @@ public static void SendSaasLetters(INotifyClient client, string senderName, Date null, new[] { StudioNotifyHelper.ToRecipient(u.ID) }, new[] { senderName }, - null, new TagValue(Tags.UserName, u.FirstName.HtmlEncode()), new TagValue(Tags.PricingPage, CommonLinkUtility.GetFullAbsolutePath("~/Tariffs.aspx")), new TagValue(Tags.ActiveUsers, CoreContext.UserManager.GetUsers().Count()), @@ -406,7 +405,7 @@ public static void SendSaasLetters(INotifyClient client, string senderName, Date public static void SendEnterpriseLetters(INotifyClient client, string senderName, DateTime scheduleDate) { var nowDate = scheduleDate.Date; - const string dbid = "webstudio"; + const string dbid = "default"; Log.Info("Start SendTariffEnterpriseLetters"); @@ -561,7 +560,7 @@ public static void SendEnterpriseLetters(INotifyClient client, string senderName .Where(Exp.Le("created_date", nowDate.AddDays(-1))) .GroupBy("short_date"); - using (var db = DbManager.FromHttpContext(dbid)) + using (var db = new DbManager(dbid)) { datesWithActivity = db .ExecuteList(query) @@ -764,7 +763,6 @@ public static void SendEnterpriseLetters(INotifyClient client, string senderName null, new[] { StudioNotifyHelper.ToRecipient(u.ID) }, new[] { senderName }, - null, new TagValue(Tags.UserName, u.FirstName.HtmlEncode()), new TagValue(Tags.PricingPage, CommonLinkUtility.GetFullAbsolutePath("~/Tariffs.aspx")), new TagValue(Tags.ActiveUsers, CoreContext.UserManager.GetUsers().Count()), @@ -835,7 +833,6 @@ public static void SendOpensourceLetters(INotifyClient client, string senderName null, new[] { StudioNotifyHelper.ToRecipient(u.ID) }, new[] { senderName }, - null, new TagValue(Tags.UserName, u.DisplayUserName()), new TagValue(CommonTags.Footer, "opensource")); } @@ -933,7 +930,6 @@ public static void SendPersonalLetters(INotifyClient client, string senderName, null, StudioNotifyHelper.RecipientFromEmail(user.Email, true), new[] { senderName }, - null, TagValues.PersonalHeaderStart(), TagValues.PersonalHeaderEnd(), TagValues.GreenButton(greenButtonText, greenButtonUrl), diff --git a/web/studio/ASC.Web.Studio/Core/Notify/StudioSubscriptionManager.cs b/web/studio/ASC.Web.Studio/Core/Notify/StudioSubscriptionManager.cs index e6f3d17dd..74cddcd37 100644 --- a/web/studio/ASC.Web.Studio/Core/Notify/StudioSubscriptionManager.cs +++ b/web/studio/ASC.Web.Studio/Core/Notify/StudioSubscriptionManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Notify/StudioWhatsNewNotify.cs b/web/studio/ASC.Web.Studio/Core/Notify/StudioWhatsNewNotify.cs index f17d176fb..72c8a3f35 100644 --- a/web/studio/ASC.Web.Studio/Core/Notify/StudioWhatsNewNotify.cs +++ b/web/studio/ASC.Web.Studio/Core/Notify/StudioWhatsNewNotify.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -173,7 +173,7 @@ public static void SendMsgWhatsNew(DateTime scheduleDate, INotifyClient client) { log.InfoFormat("Send whats new to {0}", user.Email); client.SendNoticeAsync( - Actions.SendWhatsNew, null, user, null, + Actions.SendWhatsNew, null, user, new TagValue(Tags.Activities, activities), new TagValue(Tags.Date, DateToString(scheduleDate.AddDays(-1), culture)), new TagValue(CommonTags.Priority, 1) diff --git a/web/studio/ASC.Web.Studio/Core/Notify/TagValues.cs b/web/studio/ASC.Web.Studio/Core/Notify/TagValues.cs index 1cf2dd189..8ffd14534 100644 --- a/web/studio/ASC.Web.Studio/Core/Notify/TagValues.cs +++ b/web/studio/ASC.Web.Studio/Core/Notify/TagValues.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Notify.Patterns; diff --git a/web/studio/ASC.Web.Studio/Core/Notify/Tags.cs b/web/studio/ASC.Web.Studio/Core/Notify/Tags.cs index 28fea9f55..387caf60a 100644 --- a/web/studio/ASC.Web.Studio/Core/Notify/Tags.cs +++ b/web/studio/ASC.Web.Studio/Core/Notify/Tags.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.Web.Studio.Core.Notify { static class Tags diff --git a/web/studio/ASC.Web.Studio/Core/OpensourceGiftSettings.cs b/web/studio/ASC.Web.Studio/Core/OpensourceGiftSettings.cs index 268bb31e6..5f093b77b 100644 --- a/web/studio/ASC.Web.Studio/Core/OpensourceGiftSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/OpensourceGiftSettings.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Runtime.Serialization; diff --git a/web/studio/ASC.Web.Studio/Core/PersonalSettings.cs b/web/studio/ASC.Web.Studio/Core/PersonalSettings.cs index 04627a0da..d9d4c9d4a 100644 --- a/web/studio/ASC.Web.Studio/Core/PersonalSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/PersonalSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/PrivacyRoomSettings.cs b/web/studio/ASC.Web.Studio/Core/PrivacyRoomSettings.cs index d98032a72..f32955573 100644 --- a/web/studio/ASC.Web.Studio/Core/PrivacyRoomSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/PrivacyRoomSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,9 +17,10 @@ using System; using System.Runtime.Serialization; +using System.Web; -using ASC.Core; using ASC.Core.Common.Settings; +using ASC.MessagingSystem; using ASC.Web.Studio.Utility; namespace ASC.Web.Studio.Core @@ -64,7 +65,24 @@ public static bool Available { get { - return SetupInfo.IsVisibleSettings(ManagementType.PrivacyRoom.ToString()); + return SetupInfo.IsVisibleSettings(ManagementType.PrivacyRoom.ToString()) && !IsWindowsXP; + } + } + + private static bool IsWindowsXP + { + get + { + var uaHeader = MessageSettings.GetUAHeader(HttpContext.Current.Request); + if (!string.IsNullOrEmpty(uaHeader)) + { + var clientInfo = MessageSettings.GetClientInfo(uaHeader); + if (clientInfo.OS.Family == "Windows") + { + return clientInfo.OS.Major == "XP"; + } + } + return false; } } } diff --git a/web/studio/ASC.Web.Studio/Core/PromotionsSettings.cs b/web/studio/ASC.Web.Studio/Core/PromotionsSettings.cs index e937cb407..77c9521a6 100644 --- a/web/studio/ASC.Web.Studio/Core/PromotionsSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/PromotionsSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Quota/QuotaSync.cs b/web/studio/ASC.Web.Studio/Core/Quota/QuotaSync.cs index e61e8ed3e..676bf1305 100644 --- a/web/studio/ASC.Web.Studio/Core/Quota/QuotaSync.cs +++ b/web/studio/ASC.Web.Studio/Core/Quota/QuotaSync.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Linq; using System.Threading; diff --git a/web/studio/ASC.Web.Studio/Core/Quota/QuotaWrapper.cs b/web/studio/ASC.Web.Studio/Core/Quota/QuotaWrapper.cs index 7502b1d4f..6150cb778 100644 --- a/web/studio/ASC.Web.Studio/Core/Quota/QuotaWrapper.cs +++ b/web/studio/ASC.Web.Studio/Core/Quota/QuotaWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,21 +31,27 @@ namespace ASC.Web.Studio.Core.Quota [DataContract(Name = "quota", Namespace = "")] public class QuotaWrapper { + ///1073741824 [DataMember(Name = "storageSize")] public ulong StorageSize { get; set; } + ///26214400 [DataMember(Name = "maxFileSize")] public ulong MaxFileSize { get; set; } + ///262144000 [DataMember(Name = "usedSize")] public ulong UsedSize { get; set; } + ///0 [DataMember(Name = "maxUsersCount")] public int MaxUsersCount { get; set; } + ///0 [DataMember(Name = "usersCount")] public int UsersCount { get; set; } + ///0 [DataMember(Name = "availableSize")] public ulong AvailableSize { diff --git a/web/studio/ASC.Web.Studio/Core/Quota/UserQuotaSync.cs b/web/studio/ASC.Web.Studio/Core/Quota/UserQuotaSync.cs new file mode 100644 index 000000000..d73adec17 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Core/Quota/UserQuotaSync.cs @@ -0,0 +1,82 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Linq; +using System.Threading; + +using ASC.Common.Threading; +using ASC.Core; +using ASC.Core.Tenants; +using ASC.Data.Storage; +using ASC.Web.Core; + +namespace ASC.Web.Studio.Core.Quota +{ + public class UserQuotaSync: DistributedTask + { + public const string TenantIdKey = "tenantID"; + protected DistributedTask TaskInfo { get; private set; } + private int TenantId { get; set; } + + public UserQuotaSync(int tenantId) + { + TenantId = tenantId; + TaskInfo = new DistributedTask(); + } + + public void RunJob(DistributedTask _, CancellationToken cancellationToken) + { + CoreContext.TenantManager.SetCurrentTenant(TenantId); + + var storageModules = StorageFactory.GetModuleList(string.Empty).ToList(); + + var users = CoreContext.UserManager.GetUsers(); + var webItems = WebItemManager.Instance.GetItems(Web.Core.WebZones.WebZoneType.All, ItemAvailableState.All); + + foreach (var user in users) + { + SecurityContext.AuthenticateMe(user.ID); + + foreach (var item in webItems) + { + IUserSpaceUsage manager; + + if (item.ID == WebItemManager.DocumentsProductID || item.ID == WebItemManager.MailProductID || item.ID == WebItemManager.TalkProductID) + { + manager = item.Context.SpaceUsageStatManager as IUserSpaceUsage; + if (manager == null) continue; + manager.RecalculateUserQuota(TenantId, user.ID); + } + } + } + + var tenantUserQuotaSetting = TenantUserQuotaSettings.Load(); + tenantUserQuotaSetting.LastRecalculateDate = DateTime.UtcNow; + + tenantUserQuotaSetting.Save(); + + } + + + public virtual DistributedTask GetDistributedTask() + { + TaskInfo.SetProperty(TenantIdKey, TenantId); + return TaskInfo; + } + } +} \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Core/Search/SearchComparer.cs b/web/studio/ASC.Web.Studio/Core/Search/SearchComparer.cs index fadd4ee0d..9e42f28cc 100644 --- a/web/studio/ASC.Web.Studio/Core/Search/SearchComparer.cs +++ b/web/studio/ASC.Web.Studio/Core/Search/SearchComparer.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Search/SearchResult.cs b/web/studio/ASC.Web.Studio/Core/Search/SearchResult.cs index 667ac1092..cc05da461 100644 --- a/web/studio/ASC.Web.Studio/Core/Search/SearchResult.cs +++ b/web/studio/ASC.Web.Studio/Core/Search/SearchResult.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/SearchHandlers/StudioSearchHandler.cs b/web/studio/ASC.Web.Studio/Core/SearchHandlers/StudioSearchHandler.cs index a6c4431cf..7ecb99de4 100644 --- a/web/studio/ASC.Web.Studio/Core/SearchHandlers/StudioSearchHandler.cs +++ b/web/studio/ASC.Web.Studio/Core/SearchHandlers/StudioSearchHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,7 @@ public class StudioSearchHandler : BaseSearchHandlerEx { public override ImageOptions Logo { - get { return new ImageOptions { ImageFileName = "common_search_icon.png", PartID = Guid.Empty }; } + get { return new ImageOptions { ImageFileName = "common_search_icon.svg", PartID = Guid.Empty }; } } public override string SearchName diff --git a/web/studio/ASC.Web.Studio/Core/SecutiryConstants.cs b/web/studio/ASC.Web.Studio/Core/SecutiryConstants.cs index 42bb222d7..38c968bb8 100644 --- a/web/studio/ASC.Web.Studio/Core/SecutiryConstants.cs +++ b/web/studio/ASC.Web.Studio/Core/SecutiryConstants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/SetupInfo.cs b/web/studio/ASC.Web.Studio/Core/SetupInfo.cs index 644c4ec79..f071b85d1 100644 --- a/web/studio/ASC.Web.Studio/Core/SetupInfo.cs +++ b/web/studio/ASC.Web.Studio/Core/SetupInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -155,7 +155,7 @@ public static string TeamlabSiteRedirect public static long ChunkUploadSize { get; - private set; + set; } public static long ProviderMaxUploadSize @@ -358,12 +358,6 @@ public static string RecaptchaVerifyUrl private set; } - public static int LoginThreshold - { - get; - private set; - } - public static string AmiMetaUrl { get; @@ -429,8 +423,6 @@ public static void Refresh() RecaptchaPublicKey = GetAppSettings("web.recaptcha.public-key", ""); RecaptchaPrivateKey = GetAppSettings("web.recaptcha.private-key", ""); RecaptchaVerifyUrl = GetAppSettings("web.recaptcha.verify-url", "https://www.recaptcha.net/recaptcha/api/siteverify"); - LoginThreshold = Convert.ToInt32(GetAppSettings("web.login.threshold", "0")); - if (LoginThreshold < 1) LoginThreshold = 5; web_display_mobapps_banner = (ConfigurationManagerExtension.AppSettings["web.display.mobapps.banner"] ?? "").Trim().Split(new char[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries); ShareTwitterUrl = GetAppSettings("web.share.twitter", "https://twitter.com/intent/tweet?text={0}"); diff --git a/web/studio/ASC.Web.Studio/Core/Sms/SmsManager.cs b/web/studio/ASC.Web.Studio/Core/Sms/SmsManager.cs index 315181f08..b28a7e05d 100644 --- a/web/studio/ASC.Web.Studio/Core/Sms/SmsManager.cs +++ b/web/studio/ASC.Web.Studio/Core/Sms/SmsManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -58,7 +58,7 @@ public static string SaveMobilePhone(UserInfo user, string mobilePhone) } } - if (StudioSmsNotificationSettings.Enable) + if (StudioSmsNotificationSettings.TfaEnabledForUser(user.ID)) { PutAuthCode(user, false); } @@ -70,7 +70,7 @@ public static void PutAuthCode(UserInfo user, bool again) { if (user == null || Equals(user, Constants.LostUser)) throw new Exception(Resource.ErrorUserNotFound); - if (!StudioSmsNotificationSettings.IsVisibleAndAvailableSettings || !StudioSmsNotificationSettings.Enable) throw new MethodAccessException(); + if (!StudioSmsNotificationSettings.IsVisibleAndAvailableSettings || !StudioSmsNotificationSettings.TfaEnabledForUser(user.ID)) throw new MethodAccessException(); var mobilePhone = SmsSender.GetPhoneValueDigits(user.MobilePhone); @@ -86,8 +86,9 @@ public static void PutAuthCode(UserInfo user, bool again) public static void ValidateSmsCode(UserInfo user, string code, bool isEntryPoint = false) { + if (!StudioSmsNotificationSettings.IsVisibleAndAvailableSettings - || !StudioSmsNotificationSettings.Enable) + || !StudioSmsNotificationSettings.TfaEnabledForUser(user.ID)) { return; } diff --git a/web/studio/ASC.Web.Studio/Core/Sms/StudioSmsNotificationSettings.cs b/web/studio/ASC.Web.Studio/Core/Sms/StudioSmsNotificationSettings.cs index 80cd206cf..3c8ac5bad 100644 --- a/web/studio/ASC.Web.Studio/Core/Sms/StudioSmsNotificationSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/Sms/StudioSmsNotificationSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,13 +21,14 @@ using ASC.Core; using ASC.Core.Common.Settings; using ASC.Web.Core.Sms; +using ASC.Web.Studio.Core.TFA; using ASC.Web.Studio.Utility; namespace ASC.Web.Studio.Core.SMS { [Serializable] [DataContract] - public class StudioSmsNotificationSettings : BaseSettings + public class StudioSmsNotificationSettings : TfaSettingsBase { public override Guid ID { @@ -36,20 +37,24 @@ public override Guid ID public override ISettings GetDefault() { - return new StudioSmsNotificationSettings { EnableSetting = false, }; + return new StudioSmsNotificationSettings(); } - [DataMember(Name = "Enable")] - public bool EnableSetting { get; set; } - - public static bool Enable { get { return Load().EnableSetting && SmsProviderManager.Enabled(); } set { - var settings = Load(); - settings.EnableSetting = value; + StudioSmsNotificationSettings settings; + if (value) + { + settings = Load(); + settings.EnableSetting = value; + } + else + { + settings = new StudioSmsNotificationSettings(); + } settings.Save(); } } @@ -82,5 +87,12 @@ public static bool IsAvailableSettings && !quota.Open); } } + + public static bool TfaEnabledForUser(Guid userGuid) + { + var settings = Load(); + + return settings.TfaEnabledForUserBase(settings, userGuid); + } } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Core/Statistic/StatisticManager.cs b/web/studio/ASC.Web.Studio/Core/Statistic/StatisticManager.cs index eeb034445..d59670653 100644 --- a/web/studio/ASC.Web.Studio/Core/Statistic/StatisticManager.cs +++ b/web/studio/ASC.Web.Studio/Core/Statistic/StatisticManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -166,7 +166,7 @@ private static void FlushCache() private static IDbManager GetDb() { - return DbManager.FromHttpContext(dbId); + return new DbManager(dbId); } } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Core/Statistic/UserVisit.cs b/web/studio/ASC.Web.Studio/Core/Statistic/UserVisit.cs index 5fdaa2d5d..1bf9b8720 100644 --- a/web/studio/ASC.Web.Studio/Core/Statistic/UserVisit.cs +++ b/web/studio/ASC.Web.Studio/Core/Statistic/UserVisit.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/StudioAdminMessageSettings.cs b/web/studio/ASC.Web.Studio/Core/StudioAdminMessageSettings.cs index 765e07d79..2cd35dd27 100644 --- a/web/studio/ASC.Web.Studio/Core/StudioAdminMessageSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/StudioAdminMessageSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/StudioDefaultPageSettings.cs b/web/studio/ASC.Web.Studio/Core/StudioDefaultPageSettings.cs index cfc9e9faa..190fdf601 100644 --- a/web/studio/ASC.Web.Studio/Core/StudioDefaultPageSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/StudioDefaultPageSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/StudioTrustedDomainSettings.cs b/web/studio/ASC.Web.Studio/Core/StudioTrustedDomainSettings.cs index e8fd14442..08832ed7b 100644 --- a/web/studio/ASC.Web.Studio/Core/StudioTrustedDomainSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/StudioTrustedDomainSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Tfa/ITfaSettings.cs b/web/studio/ASC.Web.Studio/Core/Tfa/ITfaSettings.cs new file mode 100644 index 000000000..73b6055ac --- /dev/null +++ b/web/studio/ASC.Web.Studio/Core/Tfa/ITfaSettings.cs @@ -0,0 +1,33 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Collections.Generic; + +namespace ASC.Web.Studio.Core.TFA +{ + public interface ITfaSettings + { + List TrustedIps { get; set; } + + List MandatoryUsers { get; set; } + + List MandatoryGroups { get; set; } + + bool EnableSetting { get; set; } + } +} \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Core/Tfa/TfaAppAuthSettings.cs b/web/studio/ASC.Web.Studio/Core/Tfa/TfaAppAuthSettings.cs index d12f7d29d..66f7ab74a 100644 --- a/web/studio/ASC.Web.Studio/Core/Tfa/TfaAppAuthSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/Tfa/TfaAppAuthSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,7 @@ namespace ASC.Web.Studio.Core.TFA { [Serializable] [DataContract] - public class TfaAppAuthSettings : BaseSettings + public class TfaAppAuthSettings : TfaSettingsBase { public override Guid ID { @@ -33,20 +33,24 @@ public override Guid ID public override ISettings GetDefault() { - return new TfaAppAuthSettings { EnableSetting = false, }; + return new TfaAppAuthSettings(); } - [DataMember(Name = "Enable")] - public bool EnableSetting { get; set; } - - public static bool Enable { get { return Load().EnableSetting; } set { - var settings = Load(); - settings.EnableSetting = value; + TfaAppAuthSettings settings; + if (value) + { + settings = Load(); + settings.EnableSetting = value; + } + else + { + settings = new TfaAppAuthSettings(); + } settings.Save(); } } @@ -55,5 +59,12 @@ public static bool IsVisibleSettings { get { return SetupInfo.IsVisibleSettings(); } } + + public static bool TfaEnabledForUser(Guid userGuid) + { + var settings = Load(); + + return settings.TfaEnabledForUserBase(settings, userGuid); + } } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Core/Tfa/TfaAppUserSettings.cs b/web/studio/ASC.Web.Studio/Core/Tfa/TfaAppUserSettings.cs index a3234c3ee..c99058cfd 100644 --- a/web/studio/ASC.Web.Studio/Core/Tfa/TfaAppUserSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/Tfa/TfaAppUserSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Tfa/TfaManager.cs b/web/studio/ASC.Web.Studio/Core/Tfa/TfaManager.cs index a0963dafd..f8c45c631 100644 --- a/web/studio/ASC.Web.Studio/Core/Tfa/TfaManager.cs +++ b/web/studio/ASC.Web.Studio/Core/Tfa/TfaManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ using ASC.MessagingSystem; using ASC.Security.Cryptography; using ASC.Web.Core; +using ASC.Web.Core.Utility; using ASC.Web.Studio.PublicResources; using ASC.Web.Studio.UserControls.Common; @@ -86,7 +87,7 @@ public static SetupCode GenerateSetupCode(this UserInfo user) public static bool ValidateAuthCode(this UserInfo user, string code, bool checkBackup = true, bool isEntryPoint = false) { if (!TfaAppAuthSettings.IsVisibleSettings - || !TfaAppAuthSettings.Enable) + || !TfaAppAuthSettings.TfaEnabledForUser(user.ID)) { return false; } @@ -97,9 +98,11 @@ public static bool ValidateAuthCode(this UserInfo user, string code, bool checkB if (string.IsNullOrEmpty(code)) throw new Exception(Resource.ActivateTfaAppEmptyCode); + var attemptsCount = LoginSettings.Load().AttemptCount; + int counter; int.TryParse(Cache.Get("tfa/" + user.ID), out counter); - if (++counter > SetupInfo.LoginThreshold) + if (++counter > attemptsCount) { throw new Authorize.BruteForceCredentialException(Resource.TfaTooMuchError); } diff --git a/web/studio/ASC.Web.Studio/Core/Tfa/TfaSettingsBase.cs b/web/studio/ASC.Web.Studio/Core/Tfa/TfaSettingsBase.cs new file mode 100644 index 000000000..d066d0c48 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Core/Tfa/TfaSettingsBase.cs @@ -0,0 +1,89 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Web; + +using ASC.Core; +using ASC.Core.Common.Settings; +using ASC.MessagingSystem; + +namespace ASC.Web.Studio.Core.TFA +{ + [Serializable] + [DataContract] + public abstract class TfaSettingsBase : BaseSettings, ITfaSettings where T : class, ISettings + { + [DataMember(Name = "TrustedIps")] + public List TrustedIps { get; set; } + + [DataMember(Name = "MandatoryUsers")] + public List MandatoryUsers { get; set; } + + [DataMember(Name = "MandatoryGroups")] + public List MandatoryGroups { get; set; } + + [DataMember(Name = "Enable")] + public bool EnableSetting { get; set; } + + public bool TfaEnabledForUserBase(ITfaSettings settings, Guid userGuid) + { + if (!settings.EnableSetting) + { + return false; + } + + if (settings.MandatoryGroups != null && settings.MandatoryGroups.Any()) + { + var userGroups = CoreContext.UserManager.GetUserGroupsId(userGuid); + foreach (var group in settings.MandatoryGroups) + { + if (userGroups.Contains(group)) + { + return true; + } + } + } + + if (settings.MandatoryUsers != null && settings.MandatoryUsers.Any()) + { + foreach (var user in settings.MandatoryUsers) + { + if (user == userGuid) + { + return true; + } + } + } + + if (settings.TrustedIps != null && settings.TrustedIps.Any()) + { + var requestIps = MessageSettings.GetIPs(HttpContext.Current.Request); + + if (requestIps != null && requestIps.Any(requestIp => settings.TrustedIps.Any(trustedIp => IPSecurity.IPSecurity.MatchIPs(requestIp, trustedIp)))) + { + return false; + } + } + + return true; + } + } +} \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Core/TipsSettings.cs b/web/studio/ASC.Web.Studio/Core/TipsSettings.cs index ca283ed1d..475d68481 100644 --- a/web/studio/ASC.Web.Studio/Core/TipsSettings.cs +++ b/web/studio/ASC.Web.Studio/Core/TipsSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ namespace ASC.Web.Studio.Core [DataContract] public class TipsSettings : BaseSettings { + ///true [DataMember(Name = "Show")] public bool Show { get; set; } diff --git a/web/studio/ASC.Web.Studio/Core/Users/CustomNamingPeople.cs b/web/studio/ASC.Web.Studio/Core/Users/CustomNamingPeople.cs index fca06da23..6abad44d0 100644 --- a/web/studio/ASC.Web.Studio/Core/Users/CustomNamingPeople.cs +++ b/web/studio/ASC.Web.Studio/Core/Users/CustomNamingPeople.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -75,6 +75,9 @@ public class PeopleNamesItem [DataMember(Name = "GroupHeadCaption")] private string groupHeadCaption; + [DataMember(Name = "UserLeadCaption")] + private string userLeadCaption; + [DataMember(Name = "RegDateCaption")] private string regDateCaption; @@ -140,6 +143,11 @@ public string GroupHeadCaption set { groupHeadCaption = value; } } + public string UserLeadCaption + { + get { return Id.Equals(CustomID, cmp) ? userLeadCaption ?? string.Empty : GetResourceValue(userLeadCaption); } + set { userLeadCaption = value; } + } public string RegDateCaption { get { return Id.Equals(CustomID, cmp) ? regDateCaption ?? string.Empty : GetResourceValue(regDateCaption); } @@ -195,7 +203,7 @@ public static string Substitute(string resourceKey) where T : class public static string Substitute(string text) { - return SubstituteGuest(SubstituteUserPost(SubstituteRegDate(SubstituteGroupHead(SubstitutePost(SubstituteGroup(SubstituteUser(text))))))); + return SubstituteGuest(SubstituteUserLead(SubstituteUserPost(SubstituteRegDate(SubstituteGroupHead(SubstitutePost(SubstituteGroup(SubstituteUser(text)))))))); } public static Dictionary GetSchemas() @@ -223,6 +231,7 @@ public static PeopleNamesItem GetPeopleNames(string schemaId) UserCaption = string.Empty, UserPostCaption = string.Empty, UsersCaption = string.Empty, + UserLeadCaption = string.Empty, GuestCaption = string.Empty, GuestsCaption = string.Empty, SchemaName = Resource.CustomNamingPeopleSchema @@ -270,6 +279,7 @@ private static void Load() Id = node.SelectSingleNode("id").InnerText, SchemaName = node.SelectSingleNode("names/schemaname").InnerText, GroupHeadCaption = node.SelectSingleNode("names/grouphead").InnerText, + UserLeadCaption = node.SelectSingleNode("names/userlead").InnerText, GroupCaption = node.SelectSingleNode("names/group").InnerText, GroupsCaption = node.SelectSingleNode("names/groups").InnerText, UserCaption = node.SelectSingleNode("names/user").InnerText, @@ -348,6 +358,17 @@ private static string SubstituteGroupHead(string text) } return text; } + private static string SubstituteUserLead(string text) + { + var item = Current; + if (item != null) + { + return text + .Replace("{!Userlead}", item.UserLeadCaption) + .Replace("{!userlead}", item.UserLeadCaption.ToLower()); + } + return text; + } private static string SubstituteRegDate(string text) { diff --git a/web/studio/ASC.Web.Studio/Core/Users/MyContact.cs b/web/studio/ASC.Web.Studio/Core/Users/MyContact.cs index d4f9ccc0b..439d5bc5d 100644 --- a/web/studio/ASC.Web.Studio/Core/Users/MyContact.cs +++ b/web/studio/ASC.Web.Studio/Core/Users/MyContact.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Users/NamingPeopleResource.Designer.cs b/web/studio/ASC.Web.Studio/Core/Users/NamingPeopleResource.Designer.cs index bb7577540..ee9d76b47 100644 --- a/web/studio/ASC.Web.Studio/Core/Users/NamingPeopleResource.Designer.cs +++ b/web/studio/ASC.Web.Studio/Core/Users/NamingPeopleResource.Designer.cs @@ -141,6 +141,15 @@ public static string CommonUser { } } + /// + /// Looks up a localized string similar to Lead. + /// + public static string CommonUserLead { + get { + return ResourceManager.GetString("CommonUserLead", resourceCulture); + } + } + /// /// Looks up a localized string similar to Users. /// @@ -240,6 +249,15 @@ public static string DefaultUser { } } + /// + /// Looks up a localized string similar to Lead. + /// + public static string DefaultUserLead { + get { + return ResourceManager.GetString("DefaultUserLead", resourceCulture); + } + } + /// /// Looks up a localized string similar to Employees. /// @@ -339,6 +357,15 @@ public static string EducationUser { } } + /// + /// Looks up a localized string similar to Curator. + /// + public static string EducationUserLead { + get { + return ResourceManager.GetString("EducationUserLead", resourceCulture); + } + } + /// /// Looks up a localized string similar to Teachers/Students. /// @@ -372,8 +399,8 @@ public static string EducationUserTitle { /// <grouphead>CommonGroupHead</grouphead> /// <regdate>CommonRegDate</regdate> /// <addusers>CommonAddUsers</addusers> - /// <guest>CommonGuest</guest> - /// <guests>CommonGuests< [rest of string was truncated]";. + /// <userlead>CommonUserLead</userlead> + /// <guest>CommonGu [rest of string was truncated]";. /// public static string PeopleNames { get { diff --git a/web/studio/ASC.Web.Studio/Core/Users/NamingPeopleResource.resx b/web/studio/ASC.Web.Studio/Core/Users/NamingPeopleResource.resx index f4b3bdbb0..700975398 100644 --- a/web/studio/ASC.Web.Studio/Core/Users/NamingPeopleResource.resx +++ b/web/studio/ASC.Web.Studio/Core/Users/NamingPeopleResource.resx @@ -85,6 +85,9 @@ User + + Lead + Users @@ -118,6 +121,9 @@ Employee + + Lead + Employees @@ -151,6 +157,9 @@ Teacher/Student + + Curator + Teachers/Students diff --git a/web/studio/ASC.Web.Studio/Core/Users/PeopleNames.xml b/web/studio/ASC.Web.Studio/Core/Users/PeopleNames.xml index 9387b5555..8d0c2dd7b 100644 --- a/web/studio/ASC.Web.Studio/Core/Users/PeopleNames.xml +++ b/web/studio/ASC.Web.Studio/Core/Users/PeopleNames.xml @@ -12,6 +12,7 @@ CommonGroupHead CommonRegDate CommonAddUsers + CommonUserLead CommonGuest CommonGuests @@ -28,6 +29,7 @@ DefaultGroupHead DefaultRegDate DefaultAddUsers + DefaultUserLead DefaultGuest DefaultGuests @@ -44,6 +46,7 @@ EducationGroupHead EducationRegDate EducationAddUsers + EducationUserLead EducationGuest EducationGuests diff --git a/web/studio/ASC.Web.Studio/Core/Users/ProfileHelper.cs b/web/studio/ASC.Web.Studio/Core/Users/ProfileHelper.cs index 6db2cc499..365b38199 100644 --- a/web/studio/ASC.Web.Studio/Core/Users/ProfileHelper.cs +++ b/web/studio/ASC.Web.Studio/Core/Users/ProfileHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Web; using ASC.Core; @@ -62,6 +63,9 @@ public ProfileHelper(string userNameOrUserId) UserInfo = CoreContext.UserManager.GetUsers(userID); } + + UserInfo.UsedSpace = Math.Max(0, CoreContext.TenantManager.FindUserQuotaRows(CoreContext.TenantManager.GetCurrentTenant().TenantId, UserInfo.ID).Where(r => !string.IsNullOrEmpty(r.Tag)).Where(r => r.Tag != Guid.Empty.ToString()).Sum(r => r.Counter)); + } public List Phones diff --git a/web/studio/ASC.Web.Studio/Core/Users/SocialContactsManager.cs b/web/studio/ASC.Web.Studio/Core/Users/SocialContactsManager.cs index d353e5cc8..6f9c78675 100644 --- a/web/studio/ASC.Web.Studio/Core/Users/SocialContactsManager.cs +++ b/web/studio/ASC.Web.Studio/Core/Users/SocialContactsManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -118,7 +118,7 @@ public static XmlDocument xmlSocialContacts xml.Append(""); xml.Append("" + Resource.HintTelegram + ""); - xml.Append(""); + xml.Append(""); xml.Append(""); xml.Append(""); diff --git a/web/studio/ASC.Web.Studio/Core/Users/UserInfoExtension.cs b/web/studio/ASC.Web.Studio/Core/Users/UserInfoExtension.cs index e89e997a6..8b37360b8 100644 --- a/web/studio/ASC.Web.Studio/Core/Users/UserInfoExtension.cs +++ b/web/studio/ASC.Web.Studio/Core/Users/UserInfoExtension.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Core/Users/UserManagerWrapper.cs b/web/studio/ASC.Web.Studio/Core/Users/UserManagerWrapper.cs index 7829c1088..e54df58ea 100644 --- a/web/studio/ASC.Web.Studio/Core/Users/UserManagerWrapper.cs +++ b/web/studio/ASC.Web.Studio/Core/Users/UserManagerWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -165,7 +165,7 @@ public static string SendUserPassword(string email) var tenant = CoreContext.TenantManager.GetCurrentTenant(); var settings = IPRestrictionsSettings.Load(); - if (settings.Enable && !IPSecurity.IPSecurity.Verify(tenant)) + if (settings.Enable && !IPSecurity.IPSecurity.Verify(tenant, email)) { throw new Exception(Resource.ErrorAccessRestricted); } @@ -177,15 +177,15 @@ public static string SendUserPassword(string email) } if (userInfo.Status == EmployeeStatus.Terminated) { - return Resource.ErrorDisabledProfile; + throw new Exception(Resource.ErrorDisabledProfile); } if (userInfo.IsLDAP()) { - return Resource.CouldNotRecoverPasswordForLdapUser; + throw new Exception(Resource.CouldNotRecoverPasswordForLdapUser); } if (userInfo.IsSSO()) { - return Resource.CouldNotRecoverPasswordForSsoUser; + throw new Exception(Resource.CouldNotRecoverPasswordForSsoUser); } StudioNotifyService.Instance.UserPasswordChange(userInfo); @@ -203,7 +203,7 @@ public static string GetPasswordHelpMessage(PasswordSettings passwordSettings) var text = new StringBuilder(); text.AppendFormat("{0} ", Resource.ErrorPasswordMessage); - text.AppendFormat(Resource.ErrorPasswordLength, passwordSettings.MinLength, PasswordSettings.MaxLength); + text.AppendFormat(Resource.ErrorPasswordLength, passwordSettings.MinLength, passwordSettings.MaxLength); text.AppendFormat(", {0}", Resource.ErrorPasswordOnlyASCII); if (passwordSettings.UpperCase) diff --git a/web/studio/ASC.Web.Studio/Core/WarmUp.cs b/web/studio/ASC.Web.Studio/Core/WarmUp.cs index 4865ccc43..cbc0eadb2 100644 --- a/web/studio/ASC.Web.Studio/Core/WarmUp.cs +++ b/web/studio/ASC.Web.Studio/Core/WarmUp.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/DeepLink.aspx.cs b/web/studio/ASC.Web.Studio/DeepLink.aspx.cs index 806b4130d..edf1852c3 100644 --- a/web/studio/ASC.Web.Studio/DeepLink.aspx.cs +++ b/web/studio/ASC.Web.Studio/DeepLink.aspx.cs @@ -1,11 +1,43 @@ -using System; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +using System; +using System.Configuration; +using System.Web; +using ASC.Web.Core.Mobile; using ASC.Web.Studio.UserControls; namespace ASC.Web.Studio { public partial class DeepLink : MainPage { + public static bool MustRedirect(HttpRequest request) + { + var userAgent = request.UserAgent.ToString().ToLower(); + HttpCookie deeplinkCookie = request.Cookies.Get("deeplink"); + var deepLink = ConfigurationManagerExtension.AppSettings["deeplink.documents.url"]; + + return deepLink != null && MobileDetector.IsMobile + && ((!userAgent.Contains("version/") && userAgent.Contains("android")) || !userAgent.Contains("android")) && //check webkit + ((request[DeepLinking.WithoutDeeplinkRedirect] == null && deeplinkCookie == null) || + request[DeepLinking.WithoutDeeplinkRedirect] == null && deeplinkCookie != null && deeplinkCookie.Value == "app"); + } + protected void Page_Load(object sender, EventArgs e) { diff --git a/web/studio/ASC.Web.Studio/Default.aspx.cs b/web/studio/ASC.Web.Studio/Default.aspx.cs index 2879f2a9b..b29a95525 100644 --- a/web/studio/ASC.Web.Studio/Default.aspx.cs +++ b/web/studio/ASC.Web.Studio/Default.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -63,22 +63,24 @@ protected void Page_Load(object sender, EventArgs e) Page.RegisterStyle("~/skins/page_default.less"); - var defaultPageSettings = StudioDefaultPageSettings.Load(); - if (defaultPageSettings != null && defaultPageSettings.DefaultProductID != Guid.Empty) + var defaultPageSettings = StudioDefaultPageSettings.Load() ?? (StudioDefaultPageSettings)new StudioDefaultPageSettings().GetDefault(); + var isDesktop = Request.DesktopApp(); + var defaultProductID = isDesktop ? WebItemManager.DocumentsProductID : defaultPageSettings.DefaultProductID; + if (defaultProductID != Guid.Empty) { - if (defaultPageSettings.DefaultProductID == defaultPageSettings.FeedModuleID && !CurrentUser.IsOutsider()) + if (defaultProductID == defaultPageSettings.FeedModuleID && !CurrentUser.IsOutsider()) { Response.Redirect("Feed.aspx", true); } - var webItem = WebItemManager.Instance[defaultPageSettings.DefaultProductID]; + var webItem = WebItemManager.Instance[defaultProductID]; if (webItem != null && webItem.Visible) { - var securityInfo = WebItemSecurity.GetSecurityInfo(defaultPageSettings.DefaultProductID.ToString()); - if (securityInfo.Enabled && WebItemSecurity.IsAvailableForMe(defaultPageSettings.DefaultProductID)) + var securityInfo = WebItemSecurity.GetSecurityInfo(defaultProductID.ToString()); + if (securityInfo.Enabled && WebItemSecurity.IsAvailableForMe(defaultProductID)) { var url = webItem.StartURL; - if (Request.DesktopApp()) + if (isDesktop) { url += "?desktop=true"; if (!string.IsNullOrEmpty(Request["first"])) diff --git a/web/studio/ASC.Web.Studio/Feed.aspx.cs b/web/studio/ASC.Web.Studio/Feed.aspx.cs index 048ac05e2..f56e4d4fd 100644 --- a/web/studio/ASC.Web.Studio/Feed.aspx.cs +++ b/web/studio/ASC.Web.Studio/Feed.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -72,7 +72,7 @@ private void LoadControls() var emptyScreen = new EmptyScreenControl { ID = "emptyFeedScr", - ImgSrc = WebPath.GetPath("UserControls/Feed/images/empty_screen_feed.png"), + ImgSrc = WebPath.GetPath("UserControls/Feed/images/empty_screen_feed.svg"), Header = UserControlsCommonResource.NewsNotFound, Describe = UserControlsCommonResource.NewsNotFoundDescription }; @@ -81,7 +81,7 @@ private void LoadControls() var emptyFilterScreen = new EmptyScreenControl { ID = "emptyFeedFilterScr", - ImgSrc = WebPath.GetPath("UserControls/Feed/images/empty_filter.png"), + ImgSrc = WebPath.GetPath("UserControls/Feed/images/empty_filter.svg"), Header = UserControlsCommonResource.FilterNoNews, Describe = UserControlsCommonResource.FilterNoNewsDescription, ButtonHTML = @@ -99,7 +99,7 @@ private void LoadControls() emptyScreensHolder.Controls.Add(new EmptyScreenControl { ID = "emptyListCommunity", - ImgSrc = WebImageSupplier.GetAbsoluteWebPath("community150.png"), + ImgSrc = WebImageSupplier.GetAbsoluteWebPath("community150.svg"), Header = UserControlsCommonResource.FeedEmptyCommunityHeader, Describe = isVisitor ? string.Empty : UserControlsCommonResource.FeedEmptyCommunityDescription, ButtonHTML = isVisitor @@ -118,7 +118,7 @@ private void LoadControls() emptyScreensHolder.Controls.Add(new EmptyScreenControl { ID = "emptyListPeople", - ImgSrc = WebImageSupplier.GetAbsoluteWebPath("community150.png"), + ImgSrc = WebImageSupplier.GetAbsoluteWebPath("community150.svg"), Header = UserControlsCommonResource.FeedEmptyPeopleHeader, Describe = isVisitor ? string.Empty : UserControlsCommonResource.FeedEmptyPeopleDescription, ButtonHTML = string.Empty @@ -127,7 +127,7 @@ private void LoadControls() emptyScreensHolder.Controls.Add(new EmptyScreenControl { ID = "emptyListCrm", - ImgSrc = WebImageSupplier.GetAbsoluteWebPath("empty_screen_persons.png", WebItemManager.CRMProductID), + ImgSrc = WebImageSupplier.GetAbsoluteWebPath("empty_screen_persons.svg", WebItemManager.CRMProductID), Header = UserControlsCommonResource.FeedEmptyContactListHeader, Describe = UserControlsCommonResource.FeedEmptyContactListDescription, ButtonHTML = string.Format("{1}
    " + @@ -144,7 +144,7 @@ private void LoadControls() emptyScreensHolder.Controls.Add(new EmptyScreenControl { Header = UserControlsCommonResource.FeedEmptyListProjHeader, - ImgSrc = WebImageSupplier.GetAbsoluteWebPath("projects_logo.png", WebItemManager.ProjectsProductID), + ImgSrc = WebImageSupplier.GetAbsoluteWebPath("projects_logo.svg", WebItemManager.ProjectsProductID), Describe = canCreateProjects ? UserControlsCommonResource.FeedEmptyListProjDescribe : string.Empty, ID = "emptyListProjects", ButtonHTML = canCreateProjects @@ -157,7 +157,7 @@ private void LoadControls() emptyScreensHolder.Controls.Add(new EmptyScreenControl { ID = "emptyListDocuments", - ImgSrc = WebImageSupplier.GetAbsoluteWebPath("documents150.png"), + ImgSrc = WebImageSupplier.GetAbsoluteWebPath("documents150.svg"), Header = UserControlsCommonResource.FeedCorporateFiles, Describe = UserControlsCommonResource.FeedEmptyScreenDescrCorporate, ButtonHTML = string.Format("{1}", diff --git a/web/studio/ASC.Web.Studio/Global.asax.cs b/web/studio/ASC.Web.Studio/Global.asax.cs index 40a9e3aee..f91a0832b 100644 --- a/web/studio/ASC.Web.Studio/Global.asax.cs +++ b/web/studio/ASC.Web.Studio/Global.asax.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -244,7 +244,9 @@ private void BlockNotFoundPortal(Tenant tenant) } else { - var redirectUrl = string.Format("{0}?url={1}", SetupInfo.NoTenantRedirectURL, Request.GetUrlRewriter().Host); + var requestUri = Request.GetUrlRewriter(); + var requestUrl = requestUri.ToString(); + var redirectUrl = string.Format("{0}?url={1}&ref={2}", SetupInfo.NoTenantRedirectURL, requestUri.Host, HttpUtility.UrlEncode(requestUrl)); ResponseRedirect(redirectUrl, HttpStatusCode.NotFound); } } @@ -270,7 +272,9 @@ private void BlockRemovedOrSuspendedPortal(Tenant tenant) } else { - var redirectUrl = string.Format("{0}?url={1}", SetupInfo.NoTenantRedirectURL, Request.GetUrlRewriter().Host); + var requestUri = Request.GetUrlRewriter(); + var requestUrl = requestUri.ToString(); + var redirectUrl = string.Format("{0}?url={1}&ref={2}", SetupInfo.NoTenantRedirectURL, requestUri.Host, HttpUtility.UrlEncode(requestUrl)); ResponseRedirect(redirectUrl, HttpStatusCode.NotFound); } } diff --git a/web/studio/ASC.Web.Studio/HttpHandlers/AjaxFileUploadHandler.cs b/web/studio/ASC.Web.Studio/HttpHandlers/AjaxFileUploadHandler.cs index 55936c291..40a85bcae 100644 --- a/web/studio/ASC.Web.Studio/HttpHandlers/AjaxFileUploadHandler.cs +++ b/web/studio/ASC.Web.Studio/HttpHandlers/AjaxFileUploadHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/HttpHandlers/FCKEditorFileUploadHandler.cs b/web/studio/ASC.Web.Studio/HttpHandlers/FCKEditorFileUploadHandler.cs index c7832dcae..050109ae7 100644 --- a/web/studio/ASC.Web.Studio/HttpHandlers/FCKEditorFileUploadHandler.cs +++ b/web/studio/ASC.Web.Studio/HttpHandlers/FCKEditorFileUploadHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,15 +44,7 @@ public override void OnProcessRequest(HttpContext context) return; } - var filename = file.FileName; - - var ind = filename.LastIndexOf("\\", StringComparison.Ordinal); - if (ind >= 0) - { - filename = filename.Substring(ind + 1); - } - - filename = new Regex("[\t*\\+:\"<>#%&?|\\\\/]").Replace(filename, "_"); + var filename = string.IsNullOrEmpty(file.FileName) ? string.Empty : Guid.NewGuid() + System.IO.Path.GetExtension(file.FileName); if (FileUtility.GetFileTypeByFileName(filename) != FileType.Image) { diff --git a/web/studio/ASC.Web.Studio/HttpHandlers/LicenseUploader.cs b/web/studio/ASC.Web.Studio/HttpHandlers/LicenseUploader.cs index 837756a51..b50a2f838 100644 --- a/web/studio/ASC.Web.Studio/HttpHandlers/LicenseUploader.cs +++ b/web/studio/ASC.Web.Studio/HttpHandlers/LicenseUploader.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/HttpHandlers/SsoHandler.cs b/web/studio/ASC.Web.Studio/HttpHandlers/SsoHandler.cs index 96fd083a9..00539395f 100644 --- a/web/studio/ASC.Web.Studio/HttpHandlers/SsoHandler.cs +++ b/web/studio/ASC.Web.Studio/HttpHandlers/SsoHandler.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web; diff --git a/web/studio/ASC.Web.Studio/HttpHandlers/TemplatingHandler.cs b/web/studio/ASC.Web.Studio/HttpHandlers/TemplatingHandler.cs index 52eb18945..23d2f3b20 100644 --- a/web/studio/ASC.Web.Studio/HttpHandlers/TemplatingHandler.cs +++ b/web/studio/ASC.Web.Studio/HttpHandlers/TemplatingHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/HttpHandlers/TenantLogoHandler.cs b/web/studio/ASC.Web.Studio/HttpHandlers/TenantLogoHandler.cs index d94b8ff32..05af5c355 100644 --- a/web/studio/ASC.Web.Studio/HttpHandlers/TenantLogoHandler.cs +++ b/web/studio/ASC.Web.Studio/HttpHandlers/TenantLogoHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,9 @@ using System; using System.Web; +using ASC.Core; +using ASC.Web.Core.Utility; using ASC.Web.Core.WhiteLabel; -using ASC.Web.Studio.Utility; #endregion @@ -41,12 +42,66 @@ public void ProcessRequest(HttpContext context) var whiteLabelType = (WhiteLabelLogoTypeEnum)Convert.ToInt32(type); var general = Convert.ToBoolean(context.Request["general"] ?? "true"); - var isDefIfNoWhiteLabel = Convert.ToBoolean(context.Request["defifnoco"] ?? "false"); + var defaultIfNoWhiteLabel = Convert.ToBoolean(context.Request["defifnoco"] ?? "false"); + var dependsOnInterfaceTheme = Convert.ToBoolean(context.Request["dependsontheme"] ?? "false"); - var imgUrl = TenantLogoHelper.GetLogo(whiteLabelType, general, isDefIfNoWhiteLabel); + if (dependsOnInterfaceTheme) + { + whiteLabelType = GetRigthLogo(whiteLabelType); + } + + var imgUrl = GetLogo(whiteLabelType, general, defaultIfNoWhiteLabel); context.Response.ContentType = "image"; context.Response.Redirect(imgUrl); } + + private static string GetLogo(WhiteLabelLogoTypeEnum type, bool general = true, bool defaultIfNoWhiteLabel = false) + { + if (TenantLogoManager.WhiteLabelEnabled) + { + return TenantWhiteLabelSettings.Load().GetAbsoluteLogoPath(type, general); + } + + if (defaultIfNoWhiteLabel) + { + return TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(type, general); + } + + if ((type == WhiteLabelLogoTypeEnum.Dark || type == WhiteLabelLogoTypeEnum.Light) && !TenantLogoManager.IsVisibleWhiteLabelSettings) + { + /*** simple scheme ***/ + return TenantInfoSettings.Load().GetAbsoluteCompanyLogoPath(type == WhiteLabelLogoTypeEnum.Dark); + /***/ + } + + return TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(type, general); + } + + private static WhiteLabelLogoTypeEnum GetRigthLogo(WhiteLabelLogoTypeEnum type) + { + if (!SecurityContext.IsAuthenticated) return type; + + var theme = ModeThemeSettings.GetModeThemesSettings().ModeThemeName; + + if (theme == ModeTheme.light) + { + if (type == WhiteLabelLogoTypeEnum.Light) + return WhiteLabelLogoTypeEnum.Dark; + + if (type == WhiteLabelLogoTypeEnum.AboutLight) + return WhiteLabelLogoTypeEnum.AboutDark; + } + else + { + if (type == WhiteLabelLogoTypeEnum.Dark) + return WhiteLabelLogoTypeEnum.Light; + + if (type == WhiteLabelLogoTypeEnum.AboutDark) + return WhiteLabelLogoTypeEnum.AboutLight; + } + + return type; + } } } diff --git a/web/studio/ASC.Web.Studio/HttpHandlers/UrlProxyHandler.cs b/web/studio/ASC.Web.Studio/HttpHandlers/UrlProxyHandler.cs index 815373b26..86b50d1a3 100644 --- a/web/studio/ASC.Web.Studio/HttpHandlers/UrlProxyHandler.cs +++ b/web/studio/ASC.Web.Studio/HttpHandlers/UrlProxyHandler.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.IO; using System.Net; diff --git a/web/studio/ASC.Web.Studio/HttpHandlers/UserPhotoHandler.cs b/web/studio/ASC.Web.Studio/HttpHandlers/UserPhotoHandler.cs index 22b7ada7c..e912993e0 100644 --- a/web/studio/ASC.Web.Studio/HttpHandlers/UserPhotoHandler.cs +++ b/web/studio/ASC.Web.Studio/HttpHandlers/UserPhotoHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Management.aspx.cs b/web/studio/ASC.Web.Studio/Management.aspx.cs index 0c6a0f8e8..2fca62475 100644 --- a/web/studio/ASC.Web.Studio/Management.aspx.cs +++ b/web/studio/ASC.Web.Studio/Management.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Masters/BaseTemplate.master b/web/studio/ASC.Web.Studio/Masters/BaseTemplate.master index 79f96898b..a2b6896e3 100644 --- a/web/studio/ASC.Web.Studio/Masters/BaseTemplate.master +++ b/web/studio/ASC.Web.Studio/Masters/BaseTemplate.master @@ -38,6 +38,7 @@ <%= string.Format("", ASC.Web.Core.WhiteLabel.TenantLogoManager.GetFavicon(true, true)) %> + <% if (!IsHealthcheck) { %> <% if (!String.IsNullOrEmpty(SetupInfo.FontOpenSansUrl)) { %> <%= string.Format("", SetupInfo.FontOpenSansUrl) %> @@ -46,6 +47,7 @@ { %> " /> <% } %> + <% } %> diff --git a/web/studio/ASC.Web.Studio/Masters/BaseTemplate.master.cs b/web/studio/ASC.Web.Studio/Masters/BaseTemplate.master.cs index e5e08dbee..29dfaafdf 100644 --- a/web/studio/ASC.Web.Studio/Masters/BaseTemplate.master.cs +++ b/web/studio/ASC.Web.Studio/Masters/BaseTemplate.master.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,6 +41,8 @@ using ASC.Web.Studio.UserControls.Statistics; using ASC.Web.Studio.Utility; +using Newtonsoft.Json; + namespace ASC.Web.Studio.Masters { public partial class BaseTemplate : MasterPage @@ -66,6 +68,8 @@ public bool EnabledWebChat public bool IsMobile { get; set; } + public bool IsHealthcheck { get; set; } + public TopStudioPanel TopStudioPanel; protected override void OnInit(EventArgs e) @@ -82,6 +86,8 @@ protected override void OnInit(EventArgs e) protected void Page_Load(object sender, EventArgs e) { + IsHealthcheck = !string.IsNullOrEmpty(Request["healthcheck"]); + InitScripts(); HubUrl = ConfigurationManagerExtension.AppSettings["web.hub"] ?? string.Empty; @@ -102,11 +108,11 @@ protected void Page_Load(object sender, EventArgs e) if (!DisabledSidePanel && !CoreContext.Configuration.Personal) { - /** InvitePanel popup **/ + // InvitePanel popup InvitePanelHolder.Controls.Add(LoadControl(InvitePanel.Location)); } - if ((!DisabledSidePanel || !DisabledTopStudioPanel) && !TopStudioPanel.DisableSettings && + if ((!DisabledSidePanel || !DisabledTopStudioPanel) && !TopStudioPanel.DisableSettings && !IsHealthcheck && HubUrl != string.Empty && SecurityContext.IsAuthenticated) { AddBodyScripts(ResolveUrl, "~/js/third-party/socket.io.js", "~/js/asc/core/asc.socketio.js"); @@ -141,6 +147,11 @@ protected void Page_Load(object sender, EventArgs e) } } + if (Request.DesktopApp()) + { + AddBodyScripts(ResolveUrl, "~/js/asc/core/desktop.polyfills.js"); + } + var matches = Regex.Match(HttpContext.Current.Request.Url.AbsolutePath, "(products|addons)/(\\w+)/(share\\.aspx|saveas\\.aspx|filechoice\\.aspx|ganttchart\\.aspx|jabberclient\\.aspx|timer\\.aspx|generatedreport\\.aspx).*", RegexOptions.IgnoreCase); if (SecurityContext.IsAuthenticated && !matches.Success && AdditionalWhiteLabelSettings.Instance.FeedbackAndSupportEnabled) @@ -193,12 +204,14 @@ private void InitScripts() private void InitStudioSettingsInlineScript() { var paid = !TenantStatisticsProvider.IsNotPaid(); - var showPromotions = paid && PromotionsSettings.Load().Show; - var showTips = !Request.DesktopApp() && paid && TipsSettings.LoadForCurrentUser().Show; + var showPromotions = !IsHealthcheck && paid && PromotionsSettings.Load().Show; + var showTips = !IsHealthcheck && paid && !Request.DesktopApp() && TipsSettings.LoadForCurrentUser().Show; + var modeThemeSettings = ModeThemeSettings.GetModeThemesSettings(); var script = new StringBuilder(); script.AppendFormat("window.ASC.Resources.Master.ShowPromotions={0};", showPromotions.ToString().ToLowerInvariant()); script.AppendFormat("window.ASC.Resources.Master.ShowTips={0};", showTips.ToString().ToLowerInvariant()); + script.AppendFormat("window.ASC.Resources.Master.ModeThemeSettings={0};", JsonConvert.SerializeObject(modeThemeSettings)); RegisterInlineScript(script.ToString(), true, false); } diff --git a/web/studio/ASC.Web.Studio/Masters/CommonBodyScripts.ascx.cs b/web/studio/ASC.Web.Studio/Masters/CommonBodyScripts.ascx.cs index c64e97fdb..9bac59ca5 100644 --- a/web/studio/ASC.Web.Studio/Masters/CommonBodyScripts.ascx.cs +++ b/web/studio/ASC.Web.Studio/Masters/CommonBodyScripts.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Web.Core.Client.Bundling; @@ -47,7 +47,6 @@ public ScriptBundleData GetStaticJavaScript() "~/js/asc/plugins/jquery-groupadvansedselector.js", "~/js/asc/plugins/jquery-contactadvansedselector.js", "~/js/asc/plugins/jquery-emailadvansedselector.js", - "~/js/asc/plugins/jquery.tlblock.js", "~/js/asc/plugins/popupbox.js", "~/js/asc/plugins/userselector.js", "~/js/asc/core/asc.files.utility.js", @@ -74,5 +73,9 @@ public StyleBundleData GetStaticStyleSheet() { return null; } + public StyleBundleData GetStaticDarkStyleSheet() + { + return null; + } } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Masters/CommonStyles.ascx.cs b/web/studio/ASC.Web.Studio/Masters/CommonStyles.ascx.cs index f2c229c08..c3922a8c3 100644 --- a/web/studio/ASC.Web.Studio/Masters/CommonStyles.ascx.cs +++ b/web/studio/ASC.Web.Studio/Masters/CommonStyles.ascx.cs @@ -1,23 +1,24 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Web.Core.Client.Bundling; +using ASC.Web.Core.Utility; namespace ASC.Web.Studio.Masters { @@ -25,7 +26,9 @@ public class CommonStyles : ResourceStyleBundleControl, IStaticBundle { protected void Page_Load(object sender, EventArgs e) { - SetData(GetStaticStyleSheet()); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + SetData(GetStaticDarkStyleSheet()); + else SetData(GetStaticStyleSheet()); } public ScriptBundleData GetStaticJavaScript() @@ -47,15 +50,39 @@ public StyleBundleData GetStaticStyleSheet() "~/skins/default/wizard.less", "~/skins/default/helper.less", "~/skins/default/comments-container.less", - "~/skins/default/filetype_style.css", + "~/skins/default/filetype_style.less", "~/skins/default/toastr.less", - "~/skins/default/groupselector.css", + "~/skins/default/groupselector.less", "~/skins/default/jquery-advansedfilter.css", "~/skins/default/jquery-advansedfilter-fix.less", "~/skins/default/jquery-advansedselector.less", - "~/skins/default/jquery-emailadvansedselector.css", + "~/skins/default/jquery-emailadvansedselector.less", "~/skins/default/userselector.less", - "~/skins/default/codestyle.css"); + "~/skins/default/codestyle.less"); + } + public StyleBundleData GetStaticDarkStyleSheet() + { + return (StyleBundleData) + new StyleBundleData("dark-studio", "common") + .AddSource(ResolveUrl, + "~/skins/default/jquery_style.css", + "~/skins/default/main-title-icon.less", + "~/skins/dark/dark-empty-screen-control.less", + "~/skins/dark/dark-common_style.less", + "~/skins/dark/dark-page-tabs-navigators.less", + "~/skins/default/main-page-container.less", + "~/skins/default/wizard.less", + "~/skins/dark/dark-helper.less", + "~/skins/default/comments-container.less", + "~/skins/default/filetype_style.less", + "~/skins/dark/dark-toastr.less", + "~/skins/dark/dark-groupselector.less", + "~/skins/default/jquery-advansedfilter.css", + "~/skins/dark/dark-jquery-advansedfilter-fix.less", + "~/skins/dark/dark-jquery-advansedselector.less", + "~/skins/dark/dark-jquery-emailadvansedselector.less", + "~/skins/dark/dark-userselector.less", + "~/skins/dark/dark-codestyle.less"); } } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Masters/FirstScripts.ascx.cs b/web/studio/ASC.Web.Studio/Masters/FirstScripts.ascx.cs index 019deb3e8..cc278c9ed 100644 --- a/web/studio/ASC.Web.Studio/Masters/FirstScripts.ascx.cs +++ b/web/studio/ASC.Web.Studio/Masters/FirstScripts.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Web.Core.Client.Bundling; @@ -39,5 +39,9 @@ public StyleBundleData GetStaticStyleSheet() { return null; } + public StyleBundleData GetStaticDarkStyleSheet() + { + return null; + } } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Masters/HeadScripts.ascx.cs b/web/studio/ASC.Web.Studio/Masters/HeadScripts.ascx.cs index 353b84680..b082b2bba 100644 --- a/web/studio/ASC.Web.Studio/Masters/HeadScripts.ascx.cs +++ b/web/studio/ASC.Web.Studio/Masters/HeadScripts.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Web.Core.Client.Bundling; @@ -63,5 +63,9 @@ public StyleBundleData GetStaticStyleSheet() { return null; } + public StyleBundleData GetStaticDarkStyleSheet() + { + return null; + } } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Masters/MainPage.cs b/web/studio/ASC.Web.Studio/Masters/MainPage.cs index cdfe071eb..5c38dcfa9 100644 --- a/web/studio/ASC.Web.Studio/Masters/MainPage.cs +++ b/web/studio/ASC.Web.Studio/Masters/MainPage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -119,13 +119,14 @@ protected void Page_PreInit(object sender, EventArgs e) if (!MayPhoneNotActivate && SecurityContext.IsAuthenticated) { - if (StudioSmsNotificationSettings.IsVisibleAndAvailableSettings && StudioSmsNotificationSettings.Enable + + if (StudioSmsNotificationSettings.IsVisibleAndAvailableSettings && StudioSmsNotificationSettings.TfaEnabledForUser(user.ID) && (string.IsNullOrEmpty(user.MobilePhone) || user.MobilePhoneActivationStatus == MobilePhoneActivationStatus.NotActivated)) { Response.Redirect(CommonLinkUtility.GetConfirmationUrl(user.Email, ConfirmType.PhoneActivation), true); } - if (TfaAppAuthSettings.IsVisibleSettings && TfaAppAuthSettings.Enable + if (TfaAppAuthSettings.IsVisibleSettings && TfaAppAuthSettings.TfaEnabledForUser(user.ID) && !TfaAppUserSettings.EnableForUser(user.ID)) { Response.Redirect(CommonLinkUtility.GetConfirmationUrl(user.Email, ConfirmType.TfaActivation), true); diff --git a/web/studio/ASC.Web.Studio/Masters/MasterManagement/StudioMasterExtensions.cs b/web/studio/ASC.Web.Studio/Masters/MasterManagement/StudioMasterExtensions.cs index 90f6a7d7f..1213068e0 100644 --- a/web/studio/ASC.Web.Studio/Masters/MasterManagement/StudioMasterExtensions.cs +++ b/web/studio/ASC.Web.Studio/Masters/MasterManagement/StudioMasterExtensions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterFileUtilityResources.cs b/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterFileUtilityResources.cs index f2c2c2ae6..54f06ab26 100644 --- a/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterFileUtilityResources.cs +++ b/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterFileUtilityResources.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -77,6 +77,7 @@ protected override IEnumerable> GetClientVariables( FilesLinkUtility.OpenPrivateString, FilesLinkUtility.FileRedirectPreviewUrlString, FilesLinkUtility.FileThumbnailUrlString, + FilesLinkUtility.FolderShareKey }) }; } diff --git a/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterLocalizationResources.cs b/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterLocalizationResources.cs index 651a2da68..79efde0bd 100644 --- a/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterLocalizationResources.cs +++ b/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterLocalizationResources.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -113,7 +113,18 @@ protected override IEnumerable> GetClientVariables( Resource.TfaAppShowBackupCodesDescription, Resource.PrintButton, Resource.RequestNewButton, - Resource.Choose + Resource.Choose, + Resource.ConsumersS3EncryprionNone, + Resource.ConsumersS3EncryprionSSE, + Resource.ConsumersS3EncryprionCSE, + Resource.ConsumersS3EncryprionSSES3, + Resource.ConsumersS3EncryprionSSES3Help, + Resource.ConsumersS3EncryprionSSEKMS, + Resource.ConsumersS3EncryprionSSEKMSHelp, + Resource.ConsumersS3EncryprionCMK, + Resource.ConsumersS3EncryprionCMKDefault, + Resource.ConsumersS3EncryprionCMKCustom, + Resource.ConsumersS3EncryprionKey }, DatePattern = dateTimeFormat.ShortDatePattern.Replace("'", ""), @@ -140,7 +151,9 @@ protected override IEnumerable> GetClientVariables( Resource.EmailOnDomainIsNotCreated, Resource.NoMailServerDomainsMsg, Resource.EmailAndPasswordCopiedToClipboard, - Resource.CopyToClipboard + Resource.CopyToClipboard, + Resource.QuotaSettingsEditQuota, + Resource.QuotaSettingsNoQuota }) }; } diff --git a/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterSettingsResources.cs b/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterSettingsResources.cs index d32357d49..a7052e63d 100644 --- a/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterSettingsResources.cs +++ b/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterSettingsResources.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ using ASC.Security.Cryptography; using ASC.Web.Core.Client.HttpHandlers; using ASC.Web.Core.Users; +using ASC.Web.Core.Utility; using ASC.Web.Core.Utility.Skins; using ASC.Web.Core.WhiteLabel; using ASC.Web.Studio.Core; @@ -84,9 +85,11 @@ protected override IEnumerable> GetClientVariables( ImageWebPath = WebImageSupplier.GetImageFolderAbsoluteWebPath(), UrlShareTwitter = SetupInfo.ShareTwitterUrl, UrlShareFacebook = SetupInfo.ShareFacebookUrl, + UrlMainSite = SetupInfo.TeamlabSiteRedirect, LogoDarkUrl = CommonLinkUtility.GetFullAbsolutePath(TenantLogoManager.GetLogoDark(true)), HelpLink = helpLink ?? "", - MailMaximumMessageBodySize = ConfigurationManagerExtension.AppSettings["mail.maximum-message-body-size"] ?? "524288", + MailMaximumMessageBodySize = ConfigurationManagerExtension.AppSettings["mail.maximum-message-body-size"] ?? "524288", + userDisplayFormat = (int) UserFormatter.GetUserDisplayDefaultOrder(), PasswordHasher.PasswordHashSize, PasswordHasher.PasswordHashIterations, PasswordHasher.PasswordHashSalt, @@ -113,6 +116,7 @@ protected override IEnumerable> GetClientVariables( result.Add(RegisterObject(new { FilterHelpCenterLink = helpLink.TrimEnd('/') + "/tipstricks/using-search.aspx" })); } + return result; } diff --git a/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterTemplateResources.cs b/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterTemplateResources.cs index 989b031c3..5a1dbd9e3 100644 --- a/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterTemplateResources.cs +++ b/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterTemplateResources.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterUserResources.cs b/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterUserResources.cs index 8bedb10a5..7bffb24aa 100644 --- a/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterUserResources.cs +++ b/web/studio/ASC.Web.Studio/Masters/MasterResources/MasterUserResources.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ using ASC.VoipService.Dao; using ASC.Web.Core.Client.HttpHandlers; using ASC.Web.Core.Users; +using ASC.Web.Core.Utility; using ASC.Web.Studio.Core; using ASC.Web.Studio.Utility; @@ -108,7 +109,8 @@ protected override string GetCacheHash() return SecurityContext.CurrentAccount.ID + (SecurityContext.IsAuthenticated && !CoreContext.Configuration.Personal ? (CoreContext.UserManager.GetMaxUsersLastModified().Ticks.ToString(CultureInfo.InvariantCulture) + - CoreContext.UserManager.GetMaxGroupsLastModified().Ticks.ToString(CultureInfo.InvariantCulture)) + CoreContext.UserManager.GetMaxGroupsLastModified().Ticks.ToString(CultureInfo.InvariantCulture) + + ((int)ModeThemeSettings.GetModeThemesSettings().ModeThemeName).ToString(CultureInfo.InvariantCulture)) : string.Empty); } diff --git a/web/studio/ASC.Web.Studio/MigrationPortal.aspx.cs b/web/studio/ASC.Web.Studio/MigrationPortal.aspx.cs index fc20251f7..218d318b0 100644 --- a/web/studio/ASC.Web.Studio/MigrationPortal.aspx.cs +++ b/web/studio/ASC.Web.Studio/MigrationPortal.aspx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Web.Core; diff --git a/web/studio/ASC.Web.Studio/My.aspx.cs b/web/studio/ASC.Web.Studio/My.aspx.cs index c0bb84d28..ef86ef92e 100644 --- a/web/studio/ASC.Web.Studio/My.aspx.cs +++ b/web/studio/ASC.Web.Studio/My.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/PaymentRequired.aspx.cs b/web/studio/ASC.Web.Studio/PaymentRequired.aspx.cs index 0edaf2c06..e3d1f78cf 100644 --- a/web/studio/ASC.Web.Studio/PaymentRequired.aspx.cs +++ b/web/studio/ASC.Web.Studio/PaymentRequired.aspx.cs @@ -1,26 +1,27 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web; using ASC.Core; using ASC.Core.Billing; using ASC.Web.Core.Files; +using ASC.Web.Core.Utility; using ASC.Web.Core.WhiteLabel; using ASC.Web.Studio.PublicResources; using ASC.Web.Studio.Utility; @@ -70,8 +71,14 @@ protected void Page_Load(object sender, EventArgs e) Master.TopStudioPanel.DisableGift = true; Title = HeaderStringHelper.GetPageTitle(Resource.PaymentRequired); - - Page.RegisterStyle("~/UserControls/Management/TariffSettings/css/tariff.less"); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Management/TariffSettings/css/dark-tariff.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Management/TariffSettings/css/tariff.less"); + } Page.RegisterStyle("~/UserControls/Management/TariffSettings/css/tariffstandalone.less"); Settings = AdditionalWhiteLabelSettings.Instance; diff --git a/web/studio/ASC.Web.Studio/PortalEncryption.aspx.cs b/web/studio/ASC.Web.Studio/PortalEncryption.aspx.cs index 35a52a9ed..e42834b98 100644 --- a/web/studio/ASC.Web.Studio/PortalEncryption.aspx.cs +++ b/web/studio/ASC.Web.Studio/PortalEncryption.aspx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Web.Core; diff --git a/web/studio/ASC.Web.Studio/PreparationPortal.aspx b/web/studio/ASC.Web.Studio/PreparationPortal.aspx index 4cb15e445..49c3fe04c 100644 --- a/web/studio/ASC.Web.Studio/PreparationPortal.aspx +++ b/web/studio/ASC.Web.Studio/PreparationPortal.aspx @@ -9,7 +9,7 @@ <%= string.Format("", ASC.Web.Core.WhiteLabel.TenantLogoManager.GetFavicon(true, true)) %> - "/> + "/> diff --git a/web/studio/ASC.Web.Studio/PreparationPortal.aspx.cs b/web/studio/ASC.Web.Studio/PreparationPortal.aspx.cs index 24864b10f..c03d3393f 100644 --- a/web/studio/ASC.Web.Studio/PreparationPortal.aspx.cs +++ b/web/studio/ASC.Web.Studio/PreparationPortal.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/ASC.Web.CRM.csproj b/web/studio/ASC.Web.Studio/Products/CRM/ASC.Web.CRM.csproj index 8f929be5e..3e3ff72f7 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/ASC.Web.CRM.csproj +++ b/web/studio/ASC.Web.Studio/Products/CRM/ASC.Web.CRM.csproj @@ -31,6 +31,8 @@ prompt 4 false + ..\..\bin\ASC.Web.CRM.xml + CS1591 none @@ -574,42 +576,67 @@
    - - - + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + - - + @@ -1896,12 +1923,7 @@ - - - - - @@ -2158,7 +2180,6 @@ - @@ -2184,20 +2205,8 @@ - - - - - - - - - - - - @@ -2205,13 +2214,6 @@ - - - - - - - @@ -2224,7 +2226,6 @@ - @@ -2378,6 +2379,12 @@ + + + + + + web.config @@ -2416,7 +2423,9 @@ + + \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-common.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-common.less new file mode 100644 index 000000000..13014f30b --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-common.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/css/common.less"; +@import "dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-contacts.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-contacts.less new file mode 100644 index 000000000..3b51a2a9f --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-contacts.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/css/contacts.less"; +@import "dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-crm.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-crm.less new file mode 100644 index 000000000..58512179a --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-crm.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/css/crm.less"; +@import "dark-params.less"; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-params.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-params.less new file mode 100644 index 000000000..4c211ff63 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/dark/dark-params.less @@ -0,0 +1,58 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@textColorRed: #DF8A70; +@textColorGreen: #A2E072; +@linkColor: #3DB8EC; + +@defaultBorColor: #BBD5E9; +@defaultBgColor: #333; +@textColorGrayDark: #bdbdbd; +@textColorGrayLight: #b2b2b2; + +@textColorBlackLight: rgba(204, 204, 204, 0.5); +@text-color: #fff; +@border-color: #474747; +@grey-text: #666666; +@body-color: #333; +@text-area-border-color: #474747; +@body-color-hover: #474747; +@dark-text-color: rgba(255, 255, 255, 0.92); +@dark-middle-text-color: #555555; +@body-color-bg: white; +@hover-row-color: #474747; +@button-ui: "calendar.svg"; +@button-ui-svg-bg: #292929; +@hover-row-color-aside: #404040; +@contact-prof-color: rgba(255, 255, 255, 0.92); +@no-matches: #524e3d; + +@loader-gif-24: "loader-dark-24.svg"; + +@crm-withArrowDown-after: #BDBDBD; +@generalListEdit-after: #BDBDBD; +@tag-item-bg: #474747; +@generalListEdi-input_with_type-bg: #292929; +@generalListEdi-input_with_type-a-col: #BDBDBD; +@categorySelector-selector-container-bg: #292929; +@search-icon-bg: #BDBDBD; +@ui-autocomplete-a-col: rgba(255, 255, 255, 0.92); +@invoice-icon-search-bg: #292929; +@option-button-col: #BDBDBD; +@option-button-bor: #BDBDBD; +@contact-photo-bor: #474747; +@change-status-button-bg: #474747; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/base.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/base.less index 0941f31f0..06fda50b8 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/base.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/base.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,25 +15,6 @@ */ -@textColorRed: #cc3300; -@textColorGreen: #6b931f; -@linkColor: #116d9d; - -@defaultBgColor: #fff; -@textColor: #333; -@textColorGrayDark: #83888d; -@textColorGrayLight: #b2b2b2; -@textColorBlackDark: #666; -@textColorBlackLight: #999; - -@borderColor: #d1d1d1; -@hoverRowColor: #f2f2f2; - - -@grayButtonTextColor: @textColorBlackDark; -@grayButtonTextColorDisable: @textColorBlackLight; - - .noneSelect () { touch-callout: none; -o-touch-callout: none; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/cases.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/cases.less index 1e39f1d6b..2c4e44aa5 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/cases.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/cases.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,6 @@ */ -@import "base.less"; /******************************************************************************* ListCasesView.ascx *******************************************************************************/ diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/common.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/common.less index b11965a12..6d2e0cec8 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/common.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/common.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ @import "base.less"; +@import "params.less"; /******************************************************************************* CSS Reset *******************************************************************************/ @@ -83,12 +84,12 @@ textarea { background: url("../images/icons.png") 0 -240px no-repeat transparent; .crm-actionLinkBase; } -.crm-addNewLink{ +.crm-addNewLink { .crm-actionLinkBase; position: relative; &:after { - color: #83888d; + color: @generalListEdit-after; content: "+"; cursor: pointer; display: block; @@ -195,7 +196,7 @@ textarea { &:after{ background-image: url('../../../../../skins/default/images/svg/crm/up.svg'); - color: @textColor; + color: @text-color; cursor: pointer; .crm-img-pseudo-base(50%, 0); left: -19px; @@ -333,7 +334,7 @@ Button with a triangle (arrow down) on the right &:after { border-left: 4px solid transparent; border-right: 4px solid transparent; - border-top: 4px solid #212121; + border-top: 4px solid @crm-withArrowDown-after; content: ""; display: block; height: 0; @@ -399,7 +400,7 @@ a.attachLink, a.attachLink:active, a.attachLink:hover, a.attachLink:visited{ } .border-panel { background-color: @defaultBgColor; - border: 1px solid #BBD5E9; + border: 1px solid @defaultBorColor; } .crm-pageHeader { @@ -419,8 +420,8 @@ a.attachLink, a.attachLink:active, a.attachLink:hover, a.attachLink:visited{ /******************************************************************************* containers for batch deleting elements *******************************************************************************/ -.containerForListBatchDelete{ - border: 1px solid @borderColor; +.containerForListBatchDelete { + border: 1px solid @border-color; line-height: 20px; margin: 15px 0; max-height: 300px; @@ -493,7 +494,7 @@ ContactInfoCard.ascx } .crm-contactInfoCardImg { - border: 1px solid #C7C7C7; + border: 1px solid @text-area-border-color; display: block; } @@ -523,11 +524,11 @@ TagView.ascx padding: 1px 22px 1px 12px; margin: 0 2px 4px 0; position: relative; - background-color: #E9E9E9; + background-color: @tag-item-bg; &:after { - border-left: 8px solid #E9E9E9; - border-top: 9px solid #FFFFFF; + border-left: 8px solid @tag-item-bg; + border-top: 9px solid @defaultBgColor; content: ""; display: block; height: 0; @@ -537,9 +538,10 @@ TagView.ascx top: 0; width: 0; } + &:before { - border-left: 8px solid #E9E9E9; - border-bottom: 10px solid #FFFFFF; + border-left: 8px solid @tag-item-bg; + border-bottom: 10px solid @defaultBgColor; content: ""; display: block; height: 0; @@ -551,7 +553,7 @@ TagView.ascx } a.delete_tag { - color: #83888d; + color: @generalListEdit-after; cursor: pointer; display: none; font-family: Arial; @@ -567,11 +569,11 @@ TagView.ascx } } - span.tag_item:hover a.delete_tag, - span.tag_item.tag_hover a.delete_tag, - span.tag_item a.delete_tag:hover { - display: inline-block; - } + span.tag_item:hover a.delete_tag, + span.tag_item.tag_hover a.delete_tag, + span.tag_item a.delete_tag:hover { + display: inline-block; + } .clear { clear: both; @@ -607,7 +609,7 @@ TagView.ascx } input { - border: 1px solid #C7C7C7; + border: 1px solid @text-area-border-color; float: left; &:focus { border: 1px solid #3186AF; @@ -634,7 +636,7 @@ Navigation panel with page navigator margin-bottom: 1px; vertical-align: middle; .combobox-title:after { - border-top-color: #83888D; + border-top-color: @generalListEdit-after; } } } @@ -663,7 +665,7 @@ File Uploader css style .pm_overAllProcessBarCssClass { height:8px; width:100%; - border: 1px solid @borderColor; + border: 1px solid @border-color; .borderRadius(2px); margin-top:10px; } @@ -710,9 +712,10 @@ CategorySelector.ascx *******************************************************************************/ .categorySelector-selector-container { - border: 1px solid #C7C7C7; + border: 1px solid @text-area-border-color; height: 20px; padding-left: 5px; + background-color: @categorySelector-selector-container-bg; } .categorySelector-selector { cursor: pointer; @@ -722,10 +725,10 @@ CategorySelector.ascx width: 18px; position: relative; - &:after{ + &:after { border-left: 6px solid transparent; border-right: 6px solid transparent; - border-top: 6px solid #83888D; + border-top: 6px solid @generalListEdit-after; content: ""; display: block; height: 0; @@ -735,12 +738,11 @@ CategorySelector.ascx right: 4px; top: 8px; } - } .categorySelector-categoriesContainer { - background-color: #FFFFFF; - border: 1px solid #C7C7C7; + background-color: @defaultBgColor; + border: 1px solid @text-area-border-color; display: none; max-height: 200px; margin-top: -1px; @@ -756,13 +758,13 @@ CategorySelector.ascx z-index: 100; &:hover { - background-color: @hoverRowColor; + background-color: @hover-row-color; cursor:pointer; } } .categorySelector-categories { - border-right: 1px solid #C7C7C7; + border-right: 1px solid @text-area-border-color; display: block; max-height: 200px; overflow: auto; @@ -1026,13 +1028,13 @@ ContactSelector.ascx position: relative; .crm-actionLinkBase; - &:before{content: " "; position: absolute; width: 7px; height: 7px; border: 2px solid #8d9195; .borderRadius(7px); top: 1px; left: 1px; } - &:after{content: " "; position: absolute; width: 0; height: 6px; border-right: 2px solid #8d9195; top: 9px; left: 11px; .rotateTransform(135deg); } + &:before{content: " "; position: absolute; width: 7px; height: 7px; border: 2px solid @search-icon-bg; .borderRadius(7px); top: 1px; left: 1px; } + &:after{content: " "; position: absolute; width: 0; height: 6px; border-right: 2px solid @search-icon-bg; top: 9px; left: 11px; .rotateTransform(135deg); } } } .noMatches { - background: #FFFFCC; + background: @no-matches; display: none; position: absolute; z-index: 10; @@ -1168,6 +1170,7 @@ table td.activityData { margin: 8px 0; overflow: auto; height: 100%; + background-color: #fff; } .importance { @@ -1203,7 +1206,7 @@ table td.activityData { .head { border-top: 1px solid #D7D8DC; - background-color: #F2F2F2; + background-color: @hover-row-color; padding: 3px 0; .row { @@ -1221,7 +1224,7 @@ table td.activityData { } .value a { - color: #000000; + color: @dark-text-color; cursor: pointer; outline: medium none; text-decoration: none; @@ -1243,7 +1246,7 @@ table td.activityData { margin-top: 16px; .percent { - color: #333333; + color: @text-color; float: right; font-size: 12px; font-weight: bold; @@ -1281,7 +1284,7 @@ ContactSelectorAutocomplete .ui-menu-item { background-color: @defaultBgColor; - border-bottom: 1px solid @borderColor; + border-bottom: 1px solid @border-color; list-style: none outside none; .ui-state-focus { @@ -1292,7 +1295,7 @@ ContactSelectorAutocomplete padding: 3px !important; } a, a:hover { - color: black !important; + color: @ui-autocomplete-a-col !important; display: block !important; padding: 3px !important; text-decoration: none !important; @@ -1306,9 +1309,9 @@ ContactSelectorAutocomplete border-radius: 2px 2px 2px 2px !important; } .ui-widget-content { - background-color: #FFFFFF; - border: 1px solid #D1D1D1; - color: #333333; + background-color: @defaultBgColor; + border: 1px solid @border-color; + color: @text-color; } /******************************************************************************** @@ -1364,12 +1367,12 @@ Import From CSV vertical-align: middle; .combobox-title { &:after { - border-top-color: #83888D; + border-top-color: @generalListEdit-after; } .inner-text { - border-bottom: 1px dotted @textColorBlackDark; - color: @textColorBlackDark; + border-bottom: 1px dotted @grey-text; + color: @grey-text; } } } @@ -1431,10 +1434,11 @@ body.media-width-min { #eventCategorySelector{ width: 180px; } + button.ui-datepicker-trigger, button.ui-datepicker-trigger:active, button.ui-datepicker-trigger:hover { - background: url('../../../../../skins/default/images/svg/crm/calendar.svg') no-repeat #ffffff; + background: url("../../../../../skins/default/images/svg/crm/@{button-ui}") no-repeat @button-ui-svg-bg; cursor: pointer; height: 19px; border: 0 none; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/contacts.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/contacts.less index 4e4a2c4d2..022f48646 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/contacts.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/contacts.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ @import "base.less"; +@import "params.less"; /******************************************************************************* Default.aspx *******************************************************************************/ @@ -170,7 +171,7 @@ ListContactView.ascx .addPrimaryDataInput { display: none; - width: 185px; + width: 184px; } .contactTitle { @@ -205,9 +206,9 @@ ListContactView.ascx width: auto; } .contactItemPhotoImg { - border: 1px solid #C7C7C7; + border: 1px solid @text-area-border-color; overflow: hidden; - background-color: #FFF; + background-color: @defaultBgColor; } .contactItemPhotoImgContainer { width: auto; @@ -226,17 +227,36 @@ img.contact-info-link-img { cursor: pointer; background-color: transparent !important; } -body.media-width-0-1300 { +body.media-width-0-1500 { #companyTable { .contactTitle { max-width: 380px; } + .primaryDataContainer { + width: 150px; + } + + .addPrimaryDataInput { + width: 144px; + } + + .nearestTask { + width: 150px; + } + } +} +body.media-width-0-1300 { + #companyTable { + .contactTitle { + max-width: 365px; + } + .primaryDataContainer { - width: 128px; + width: 126px; } .addPrimaryDataInput { - width: 123px; + width: 120px; } .nearestTask { @@ -255,7 +275,7 @@ body.media-width-min { width: 118px; } .addPrimaryDataInput { - width: 113px; + width: 112px; } .nearestTask { @@ -277,13 +297,13 @@ ContactActionView.ascx #contactProfileEdit { width: 100%; - >tbody > tr > td { + > tbody > tr > td { vertical-align: top; } .contactInfo { - >:not(.contactManagerPanel) input { + > :not(.contactManagerPanel) input { padding: 1px 2px; &.textEditCalendar { @@ -307,7 +327,7 @@ ContactActionView.ascx .requiredField { .headerPanelSmall { margin: 5px 0 4px; - color: #3C4046; + color: @contact-prof-color; font-weight: bold; } @@ -435,6 +455,7 @@ ContactActionView.ascx position: relative; vertical-align: top; width: 500px; + background-color: @generalListEdi-input_with_type-bg; input { border: medium none; @@ -445,7 +466,7 @@ ContactActionView.ascx a { border-bottom: 1px dotted; - color: #646567; + color: @generalListEdi-input_with_type-a-col; cursor: pointer; display: inline-block; font-size: 11px; @@ -458,7 +479,7 @@ ContactActionView.ascx &:after { border-left: 4px solid transparent; border-right: 4px solid transparent; - border-top: 4px solid #83888D; + border-top: 4px solid @generalListEdit-after; content: ""; display: block; height: 0; @@ -544,7 +565,7 @@ ContactActionView.ascx } .contact-photo { - border: 1px solid #BFBFBF; + border: 1px solid @contact-photo-bor; border-radius: 3px 3px 3px 3px; display: block; text-align: center; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/crm.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/crm.less new file mode 100644 index 000000000..024e5c35a --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/crm.less @@ -0,0 +1,31 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "params.less"; +@import "common.less"; +@import "tasks.less"; +@import "cases.less"; +@import "contacts.less"; +@import "deals.less"; +@import "invoices.less"; +@import "socialmedia.less"; +@import "settings.less"; +@import "voip.common.less"; +@import "voip.quick.less"; +@import "voip.numbers.less"; +@import "voip.calls.less"; +@import "reports.less"; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/deals.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/deals.less index aec408808..5dfd7162a 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/deals.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/deals.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,7 @@ @import "base.less"; - +@import "params.less"; /******************************************************************************* DealListView *******************************************************************************/ @@ -62,8 +62,8 @@ DealListView #showTotalAmount{ display: none; } -#showTotalAmount, #showTotalAmount:hover, #showTotalAmount:active{ - color: @textColorBlackDark; +#showTotalAmount, #showTotalAmount:hover, #showTotalAmount:active { + color: @grey-text; } #showMoreDealsButtons{ display:inline-block; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/fg.css b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/fg.css index 232f1b125..2bfaea280 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/fg.css +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/fg.css @@ -1,8 +1,8 @@ -/* Пиктограммы государственных флагов в спрайте */ -/* @author Артём Поликарпов, artpolikarpov.ru (artpolikarpov@gmail.com) */ -/* @author Никита Иванов (исходные пиктограммы флагов), nickivanov.ru (nickivanov@nickivanov.ru) */ -/* Набор распостраняется на условиях лицензии CC-BY-SA */ -/* Эти летом я был: в Гондурасе, Лихтенштейне, и Швеции. */ +/* Pictograms of national flags in a sprite */ +/* @author Artyom Polikarpov, artpolikarpov.ru (artpolikarpov@gmail.com) */ +/* @author Nikita Ivanov (original flag icons), nickivanov.ru (nickivanov@nickivanov.ru) */ +/* The set is distributed under the terms of the license CC-BY-SA */ +/* This summer I was in Honduras, Liechtenstein, and Sweden. */ .b-fg { display: -moz-inline-box; -moz-box-orient: vertical; display: inline-block; *display: inline; *zoom: 1; vertical-align: baseline; position: relative; overflow: hidden; width: 16px; height: 9px; font-size: 0; line-height: 0; } .b-fg img { display: inline; border: none; margin: 0; padding: 0; position: relative; top: 9px; -moz-transition-property: top; -webkit-transition-property: top; -o-transition-property: top; transition-property: top; -moz-transition-duration: 0.25s; -webkit-transition-duration: 0.25s; -o-transition-duration: 0.25s; transition-duration: 0.25s; } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/invoices.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/invoices.less index 7deeb4149..b41666c33 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/invoices.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/invoices.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ @import "base.less"; +@import "params.less"; /******************************************************************************* ListInvoiceView.ascx *******************************************************************************/ @@ -315,7 +316,7 @@ ListActionView.ascx } &.ui-sortable-helper { - background-color: #F2F2F2; + background-color: @hover-row-color; } } @@ -323,7 +324,7 @@ ListActionView.ascx padding: 0 6px 10px 16px; line-height: 20px; height: 20px; - border-bottom: 1px solid #C7C7C7; + border-bottom: 1px solid @text-area-border-color; } .tbl-subtotal-row { @@ -336,8 +337,8 @@ ListActionView.ascx font-weight: bold; .tbl-cell { - border-bottom: 1px solid #C7C7C7; - border-top: 1px solid #C7C7C7; + border-bottom: 1px solid @text-area-border-color; + border-top: 1px solid @text-area-border-color; } } @@ -354,6 +355,7 @@ ListActionView.ascx } } } + &.tax1, &.tax2 { .custom-input { input, input:focus { @@ -444,12 +446,12 @@ ListActionView.ascx width: 180px; margin-left: 410px; - >span.taxLineName { + > span.taxLineName { .text-overflow-nowrap(120px); float: left; } - >span.taxLineRate { + > span.taxLineRate { .text-overflow-nowrap(60px); } } @@ -512,7 +514,7 @@ ListActionView.ascx } .left-side { - border-right: 1px solid #C7C7C7; + border-right: 1px solid @text-area-border-color; display: none; .textEdit { @@ -583,7 +585,7 @@ ListActionView.ascx /*custom input for comboboxes or serch input*/ .custom-input { - border: 1px solid #C7C7C7; + border: 1px solid @text-area-border-color; height: 18px; input, input:focus { @@ -606,7 +608,7 @@ ListActionView.ascx &.drop-down:after { border-left: 4px solid transparent; border-right: 4px solid transparent; - border-top: 4px solid #83888D; + border-top: 4px solid @generalListEdit-after; content: ""; height: 0; width: 0; @@ -618,7 +620,7 @@ ListActionView.ascx } &.serch { - background: url("../images/icons.png") no-repeat scroll -1px -390px #FFFFFF; + background: url("../images/icons.png") no-repeat scroll -1px -390px @invoice-icon-search-bg; } } } @@ -630,24 +632,24 @@ ListActionView.ascx overflow-x: hidden; overflow-y: auto; padding: 0; - border-top: 1px solid #C7C7C7; + border-top: 1px solid @text-area-border-color; width: 100%; li { line-height: 20px; list-style-type: none; - border-bottom: 1px solid #C7C7C7; + border-bottom: 1px solid @text-area-border-color; margin: 0; padding: 0; &:hover { - background-color: #E6E6E6; + background-color: @body-color-hover; } a { .text-overflow-nowrap(); - color: #333333; + color: @text-color; display: block; padding: 2% 4%; text-decoration: none; @@ -742,6 +744,7 @@ body.media-width-min { position: absolute; top: 15px; left: 0; + color: #333; &.draft, &.rejected { @@ -763,7 +766,7 @@ body.media-width-min { .invoice-data { - background-color: #FFFFFF; + background-color: #fff; font-size: 10pt; color: #333; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/params.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/params.less new file mode 100644 index 000000000..0768caf5e --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/params.less @@ -0,0 +1,58 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@textColorRed: #cc3300; +@textColorGreen: #6b931f; +@linkColor: #116d9d; + +@defaultBorColor: #BBD5E9; +@defaultBgColor: #fff; +@text-color: #333; +@textColorGrayDark: #83888d; +@textColorGrayLight: #b2b2b2; +@grey-text: #666666; +@textColorBlackLight: #999999; +@dark-text-color: #000000; + +@border-color: #d1d1d1; +@hover-row-color: #f2f2f2; +@text-area-border-color:#C7C7C7; +@body-color-hover: #E6E6E6; +@hover-row-color-aside: #f2f2f2; +@contact-prof-color: #3C4046; +@no-matches: #FFFFCC; + +@grayButtonTextColor: @grey-text; +@grayButtonTextColorDisable: @textColorBlackLight; + +@button-ui: "calendar.svg"; +@button-ui-svg-bg: #ffffff; +@loader-gif-24: "loader_24.gif"; + +@crm-withArrowDown-after: #212121; +@generalListEdit-after: #83888D; +@tag-item-bg: #E9E9E9; +@generalListEdi-input_with_type-bg: none; +@generalListEdi-input_with_type-a-col: #646567; +@categorySelector-selector-container-bg: none; +@search-icon-bg: #8d9195; +@ui-autocomplete-a-col: black; +@invoice-icon-search-bg: #FFFFFF; +@option-button-col: #272727; +@option-button-bor: #8E908F; +@contact-photo-bor: #BFBFBF; +@change-status-button-bg: #eaeaea; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/reports.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/reports.less index 879b32219..21204c4f5 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/reports.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/reports.less @@ -1,24 +1,24 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -@import "base.less"; +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "params.less"; .aside-content { - background-color: #F2F2F2; + background-color: @hover-row-color-aside; } .reports-menu-container { @@ -43,7 +43,7 @@ } .menu-report-name { - color: #333; + color: @text-color; text-decoration: none; cursor: pointer; @@ -59,10 +59,6 @@ } } -.mainPageTable .reports-content-container { - padding-top: 12px; -} - #currencyRatesDialog .content { max-height: 200px; margin-top: 16px; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/settings.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/settings.less index 50efcc380..a2ac5aade 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/settings.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/settings.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,8 @@ @import "base.less"; +@import "params.less"; + .crm-settings-color-base() { width: 16px; height: 16px; @@ -81,7 +83,7 @@ background-image: url("../images/drag.png") !important; background-position: center center; background-repeat: no-repeat; - border-left: 1px solid #D1D1D1 !important; + border-left: 1px solid @border-color !important; cursor: move; display: none; left: 0; @@ -96,7 +98,7 @@ li:hover { - background-color: #F2F2F2; + background-color: @hover-row-color; z-index: 500; .count_link_items > a { @@ -167,7 +169,7 @@ } .headerCollapse, .headerExpand { - color: #333333; + color: @text-color; cursor: pointer; padding: 0 0 0 20px !important; position: relative; @@ -183,7 +185,7 @@ .headerCollapse:after { border-bottom: 6px solid transparent; - border-left: 6px solid #83888D; + border-left: 6px solid @generalListEdit-after; border-top: 6px solid transparent; left: 5px; margin-top: -7px; @@ -192,7 +194,7 @@ .headerExpand:after { border-left: 6px solid transparent; border-right: 6px solid transparent; - border-top: 6px solid #83888D; + border-top: 6px solid @generalListEdit-after; left: 2px; margin-top: -4px; } @@ -258,8 +260,8 @@ } #addOptionButton { - border-bottom-color: #8E908F; - color: #272727; + border-bottom-color: @option-button-bor; + color: @option-button-col; margin-top: 8px; display: inline-block; } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/socialmedia.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/socialmedia.less index 2e0196db3..7712f000e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/socialmedia.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/socialmedia.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,8 +15,8 @@ */ +@import "params.less"; @import "base.less"; - /* List Facebook UserInfo, List Twitter UserInfo */ #sm_tbl_UserList { border-collapse: collapse; @@ -49,7 +49,7 @@ .sm_message_line { - border-top: 1px solid #d1d1d1; + border-top: 1px solid @border-color; padding: 5px 0; } .sn_userName { @@ -135,7 +135,7 @@ margin-bottom: 10px; vertical-align: top; cursor: pointer; - border: 1px solid #fff; + border: 1px solid @text-color; img { padding: 2px; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/tasks.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/tasks.less index 20f328d9d..7defae4fa 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/tasks.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/tasks.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ +@import "params.less"; @import "base.less"; /******************************************************************************* ListTaskView.ascx @@ -36,7 +37,7 @@ ListTaskView.ascx overflow: hidden; width: 116px; &:not(.removedUser) span{ - color: @textColor; + color: @text-color; cursor: pointer; display: inline-block; font-size: 12px; @@ -47,7 +48,7 @@ ListTaskView.ascx tr:hover .divForUser:not(.removedUser) span{ padding-top: 1px; - border-bottom: 1px dotted #000000; + border-bottom: 1px dotted @dark-text-color; } } @@ -121,7 +122,7 @@ taskStatusesMenu width: 38px; &.canEdit { - border: 1px solid @borderColor; + border: 1px solid @border-color; cursor: pointer; position: relative; .borderRadius(3px); @@ -143,7 +144,7 @@ taskStatusesMenu tr:hover .changeStatusCombobox.canEdit, .changeStatusCombobox.canEdit.selected { - background-color: #eaeaea; + background-color: @change-status-button-bg; border-color: #A8A8A8; &:after { diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.calls.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.calls.less index deee1dc4f..b03b759d4 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.calls.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.calls.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,8 +15,8 @@ */ +@import "params.less"; @import "base.less"; - #voip-calls-view { .call-type-icon { display: block; @@ -42,6 +42,7 @@ position: relative; background-position: 0 -32px; cursor: pointer; + &:hover { background-position: -16px -32px; } @@ -58,7 +59,7 @@ .call-info-row { height: 26px; line-height: 26px; - + .call-info-title { margin-right: 5px; color: #83888D; @@ -85,7 +86,7 @@ #calls-list { display: none; - + .call-row { .toggle-redirections-btn { cursor: pointer; @@ -107,7 +108,6 @@ width: 60px; padding-left: 5px; text-align: left; - } .call-date { @@ -116,8 +116,9 @@ a { text-decoration: none; - color: #333; + color: @text-color; font-size: 12px; + &:hover { text-decoration: underline; } @@ -174,7 +175,7 @@ width: 130px; height: 12px; margin: 4px 0; - background-color: #d1d1d1; + background-color: @border-color; #call-record-play-panel-progress-percentage { display: inline-block; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.common.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.common.less index 7070d3129..82e98dc10 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.common.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.common.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,11 +15,10 @@ */ -@import "base.less"; - +@import "params.less"; #voip-common-view { display: none; - + .common-setting-item { margin-bottom: 29px; @@ -57,14 +56,14 @@ } &:hover .ringtone-group-box, &:hover .ringtone:hover { - background-color: #f2f2f2; + background-color: @hover-row-color; } .ringtone-group-box { - border-bottom: 1px solid #d1d1d1; - + border-bottom: 1px solid @border-color; + &.selected, &.ringtone-selected { - background-color: #f2f2f2; + background-color: @hover-row-color; } &.selected .actions { @@ -100,10 +99,10 @@ padding-left: 30px; .ringtone { - border-bottom: 1px solid #d1d1d1; + border-bottom: 1px solid @border-color; &.selected { - background-color: #f2f2f2; + background-color: @hover-row-color; .actions { background-position: center bottom; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.numbers.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.numbers.less index a9b260aab..47cd5d68d 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.numbers.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.numbers.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,8 +15,7 @@ */ -@import "base.less"; - +@import "params.less"; #voip-numbers-view { display: none; @@ -26,7 +25,7 @@ .voip-divider { width: 830px; - border-top: 1px solid #d1d1d1; + border-top: 1px solid @border-color; } #number-selector-box { @@ -90,7 +89,7 @@ .button { vertical-align: top; } - + input { height: 0; left: -1000px; @@ -115,7 +114,7 @@ } } - + #operators-box { margin-top: 50px; @@ -130,7 +129,7 @@ #operators-list { width: 830px; margin-bottom: 50px; - + #operators-list-header { line-height: 32px; color: #808080; @@ -151,10 +150,10 @@ .operator { height: 32px; - border-bottom: 1px solid #d1d1d1; + border-bottom: 1px solid @border-color; &.selected { - background-color: #f2f2f2; + background-color: @hover-row-color; .actions { background-position: center bottom; @@ -162,7 +161,7 @@ } &:hover { - background-color: #f2f2f2; + background-color: @hover-row-color; } .title { diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.quick.less b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.quick.less index 271d08d5f..d56cfd893 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.quick.less +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/css/voip.quick.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ */ -@import "base.less"; +@import "params.less"; #voip-quick-view { display: none; @@ -38,7 +38,7 @@ .number { &:hover .number-box { - background-color: #f2f2f2; + background-color: @hover-row-color; } &#existing-numbers-header { @@ -68,10 +68,10 @@ } .number-box { - border-bottom: 1px solid #d1d1d1; + border-bottom: 1px solid @border-color; &.selected, &.operator-selected { - background-color: #f2f2f2; + background-color: @hover-row-color; } &.selected .actions { @@ -129,7 +129,7 @@ .operators-box { display: none; - border-bottom: 1px solid #d1d1d1; + border-bottom: 1px solid @border-color; padding-left: 30px; &:last-child { @@ -138,19 +138,19 @@ .add-operators-box { height: 32px; - border-bottom: 1px solid #d1d1d1; + border-bottom: 1px solid @border-color; .add-operators-btn { - margin-top: 6px; + margin-top: 6px; } } .operator { height: 32px; - border-bottom: 1px solid #d1d1d1; + border-bottom: 1px solid @border-color; &.selected { - background-color: #f2f2f2; + background-color: @hover-row-color; .actions { background-position: center bottom; @@ -158,7 +158,7 @@ } &:hover { - background-color: #f2f2f2; + background-color: @hover-row-color; } .title { @@ -288,7 +288,7 @@ .numbers-loader { display: none; - background: url("../images/loader_24.gif") no-repeat scroll left center transparent; + background: url("../images/@{loader-gif-24}") no-repeat scroll left center transparent; font-size: 14px; margin: 50px 0 0 50px; padding: 10px 0 10px 40px; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/activity_widget.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/activity_widget.png deleted file mode 100644 index 736c3eb932603ff8cdb7eb997e78706e8f226f75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1271 zcmVfY{qyL-lD%!HoAD8}&>MNJH3lZCnvT&P(E6c>Un+_(_@3w&%`Xapfk zK@hSMTnIr01ve5fF`_c!IEloVj$t&DM^Df6tvW7lb@%PZOt;U1qN%=h@A>MS?|kQ! zs461D!07y;Y%)|geLT^KMi?$mEr9U+2O}CVZo;%-c19L}WCcL_%u9E7Hyl26Z~j2T z2Gs(3MFf&G=CK3EMgr&%hy^i7*KweDyk=x>mCQA1 zyC&=HX8qhR3$Fo3C*i>MQQW$;yg+3wrkq%8WUy8WEY$%|Xg3s!f;T8w8Sz~+2tWbv zhj(Vq#asV88v)1gkl_ke7nH0+Exyj z2sLo(fqC}rew15x?dQfV^VHHELm!$-Z{gscBV?}0mF8JinoFFy_z|u3<-U|0D?|hm z8Y`4a5pl^oVsccwTUF78A8+gq& zG=6F28%{31g?AqHJ@$L`c<(1jLje;2Bx#u>jYv{MTryY-%U4db*1o(Ufb+{=;C$B8 z0w2;^8Cwg22Ly~_F_gjEF2dZCct zO6ELg8lSS%_=MT%d-`No6~yOWFn&T0^wj_Yn>$07|+i&AreAD2OUvLSBpF zykhNS9ykx|>?~TXjCMQA3z7D^BMK7R(a^ls6!!@RB`PT{a}Kc+0eBvG7pMa)F08ob zwN;xr9TF5Rcwp!z7h+(IkX93_)8_5OOy+^(z#PB_$KRRwiZxf;o2PFmzoC63jw7b* z6wTGIsck8Z2k`!pg%l`Q=ZnE;zseZD1|T7SIg;dmwueae!0R_QoC2 h|2X8|xMKg4@h5y!^`EgiKFa_A002ovPDHLkV1i~hSH1uM diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/activity_widget.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/activity_widget.svg new file mode 100644 index 000000000..d35c17e32 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/activity_widget.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/cases_widget.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/cases_widget.png deleted file mode 100644 index b23cb3af0adc35015bf1e1fd654be68a2a36275f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1690 zcmV;L24(q)P)G=VU2{?C24yH8cQ=yUtsH)d3Dk%fI}&h2wf zpZe8N!6695`OT+&za4ph)8)w9>(n( zn&b$9t-2#f9`Xh%-;CgA00H#9^TFfWESH(47N(7mBvYs0_?dG9fZJVtpZV&epW}(M zPcxl1h{%I=N>Bc6`d%aq*5%X0?BWZD5AAF|*|zPQ5%HWw#m7(G#o}iB?-{t=6%p+2 zwtVH$PxF%>|BCnB|M0V~{^2P;@!?Y(z2_v8*@1CxyST>FkALmk?)_u$|KuaT2IL)! z-*BTf;(v*Oh+w(f@r6fD1MvFm7gs~lF0KhM-XD4B%a6Tr@%kQvF8rq$Uor5WgGW!j zw9jx^HI?UF+IQZ$4ZxA*pN6HEL;n_Vfr@t>*#Y3*yK}((w>A9t^Ut0H{wxu}OFumQ zOlmeiGoKwHM3K}0if6~7$1H;co{g^0Y&1%Ca5EwXmWUuC==zR21*(Z`LRiKE!ik(Aq1kr)!mM4M!4Z_xCh}z zgad)w&~Fx4Hu`K>HkwLkCc>-|X47k*Y*QBH?>Fx)X)5)r}}3h6n|OkAOwMWhGOT@mm;RwGb<` z3SvW`s1lKg0>Z$YzyKpe@KTjU1|tKw7^7myjJ(EJ&8sXz^LB{GBuDv*oeBto48U}H?ffG`ISA-n`ql<;-|Nr)sM zAtY3wlQ~*V0GLcBG-}k!n7S%5W>$m@#VleikGVQBkW@bU;;UEx@#2M74oOM9)md=} z+7ctB#d_|%??e3c7r%tOOVv!Ms>B~(xQNN5P`sY1gENCXMt0-AW7U}vz?)Zk4sCJa zWB0!MP&3&?nhom779JICx1j4f+P1?>;H7+x%XRSJ=Rb>EM^!g`>$_(;e)lGw?hqJm zPVPF|&glA{B*JteOd4TQCBk`X1aQ|KQwXmovpH#cfNH)&vvCl2WwBhaTr63(3oK_O zf)rEg_GKRb&i6@VLTVnE|CXKk9kf}2OwLZbgsN>xOF<);Zz!8nVK&jRP*nh3=R|~f zG7=q?wpes{1k2qe%VkU3c9`WcXzF~0Pi;L%nB$RYs)|LIFn1&%XCr6FGT5*YVmauu z(CMv}P)e#4%?2Yw&Wi}DYg(2~MpMmf6FeKpu=R!;vQ~ihipqLd?0c-(JJe|sNJ-En zXkCFTDJLYQ5r87NIDrsR6RLze(C@2^!^T!>2^1%aBf5uR4}efx7}^_F8L4Us5}rFG z_lRdCGDMWt%WcEi!ENaGVJ8wZ#2v7qEXQz02oF-K%uBJV0In}Gb&4;gX6ttsuVnhy zUg7$UU6yUna@mh3n#H31ufKSjrXs1*G!@h71{>3c$-z03t%ICD|CcXXD8~Sa2+o~5 zcO)Wa5wQboyZeENI2aMzz&3CIm;*KYk0=9qA}S(DRVx{iJ^)kIUR8HR^jziO5y~v{?+#R>o!6UHq1ldn#-;W!|b?sl5btf$P9k k;HrpR0iKut`>*4F0^32U6z6_lX8-^I07*qoM6N<$f&&2{O#lD@ diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/cases_widget.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/cases_widget.svg new file mode 100644 index 000000000..f17d1c766 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/cases_widget.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/companies_widget.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/companies_widget.png deleted file mode 100644 index f0550f4ecdc066dd743998c3c4ce5a1b7ea3ae74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1490 zcmV;@1ugoCP)7%Q6#iz{yY|{iY{vnbCIlxkvH!q3Q~ncbc7``-J$_hwf` zQG~zK&YU?T8`b&q=dqKf;eT$aO}tB{#~7ibnx?(Xaa1XFhvRp=f9YQZz-EPE^!e1( z-Z#g`$1yxSj6$J+wY9a0#l^*mo4?$C?~nV-OVx+A#kKBE0H|&nU<6JbIC${FtA`JR z-sAB#VHo1uD_8L2wX2sneVezu?HW$B(^UiI$^92bM@GPq$Hro$oJ$ihwr%67p&p|r0#o|3Kq2nF-Eu4Di6WduQh`T6+`&-(lO(QGzhSr&4pvYfGLM3u!Os=9mx zuI&=%mt6KKJ^ZSRrg{UA&1T_w9+cUK>FMdeJfEGNMWfM(=U(Aigr!M@4_B~fAhevN z+iz9w{e1MJ)2FZLn)Wf5d?tb0b{Y!zNn5q6?Vhwm7aDYE%0R@f<%hBRm3L8o{e5F_ z?@Nb_fuR}C53X|AYfp^8%*;%59<+HIXsXi26t2)5c(d%CPiH|K zk*%^Il}fcl_zaXWfXG>jxsp}OE;OWR&M|#!~s!vqd+nw$$}J9TKJB6 z_gNjofWMF#z*^u1hyo7*DN%+7Yxh3Xm*#udfEX&5%W*~sAPKueZY!0_BN5*Ef^&n< z)AZVc_S*o_^Po~`c=SF>5AoW9ZcwCQvv&%TLe%*tl$-%_FS*_~S&r}d;xPgG{sY`u zV-@u4Fqf|qn4(5Zgai@}?uz$(^5Hw%OTz?6V)XHMM4>~@hU6WhR9e@FlxvArtyV+b zy^C;Rfx<3r|GS`l^0kc1b?3cAl=7-3MrD-eLR*Pw#>U1lwRaMuBf}U_HJm(oGTIh^ z#QV*@qB`#<>k^n&UR) z8zA1-8ND`u1@a?3X%{bE?CFm?_w4A)=){Q=2RIZMx;zo)ITq!boq2^Ed-`!^*4a^- zbhea?i6l7p8J#*uo6lA`f53U%Ik&q}Fe-(P3u1!=kZT#1Zg!+(*y^gKA=UaHqqWX# s%@b}U`D?-gd!^Oo`iD(F&Hl^wCxyG=w2k=DfB*mh07*qoM6N<$f=2t{s{jB1 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/companies_widget.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/companies_widget.svg new file mode 100644 index 000000000..2d61bf921 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/companies_widget.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/contacts.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/contacts.png deleted file mode 100644 index 81ecd2b4aacb4a001ad962f847773edeeb24e02f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7571 zcmV;E9cP) zGGed2rf&@!BxSp8(x%%X*pg(sZAr2v$#&b4WJ{9mwk64yB-?FElI^x7$(AJBZA+3Z zNw(XTBwLbfw=GGwB-w6Tl5DpvNq)7qYK_J3AqWu)#EFU!B7~?& zZSru2-+XuU>#xf6@$uxC)eusK|B>JF|4i?zw|r*veJq?q3e&j|KtQ2{Tgbnl5JJRJ z2ndDZg(8567{wrp!5HJ~5c$I2{MQ@GCI9U2d~-M+?_a+;+TEu@U=)Hh6*?g#JhoAc zLJDa@VcbLrQp%n7i=>c9FDZ7)S9uU@eyjD8^eV1Q(wM$L3okF0_UR!eG$93*0JIte zcCP>Q5B||6a>>8^z26wKbt-|xIdqsm^XDQ6z5cZn5~4!l=5KeCSM%N75alo zePl8WQ*s%XJo|>`LapmjM6CIgnF}dY0YyZNKt5S0G=YF35CS5m)t=A~FTFgt`sVxJ z`Q6|62fx2rB&ofP#>45+$^7&I=M0Z(wF$&(C{%40>Ba4VqIzfc#M8=aS6frQKD->Z6X$HbT1maOmM7)2>r>w5t!RU%! zdTHahgo?>@GCetkqZ**`DV0J83Lr3{3Pi*pgfIy4I3CuFDFao?@nv_|8_lsy->`cc zmeRBPjSi55|D*T&BW~ z9}IS`ZJsU>8U-R|G`A?JnI#9JYDIIjZ=kSz7R_+hxqNuzy(_Q2J8{=9-Tu;sdhhW$lRFkHUj#LhCZPp&i9A>aas4A_ z#h7xH3A|#&8zUNwwr%HQGzMKC6hMf8q^LkJx+;T_8(yiee)-2Y{_=l1c=hj%hkjmf zE}&u*UyM|?cS_;ZxX==P;jS%25p7ABXJ!&e%P1?&=_t6e8qfY|{wz<0Q0)PAdoStE zbsg?Jy7rs@gWvoQpS*s5Uj2PJ65%G2gvkSz0znE2)+ma?CSDjLvQOo%#dTjvNGmOo ztl>eS5++H&k|L<8-J8{wH#s?c`1;@acaOgKM~|*Kr!E0P8_Ff50D;pJiWkilL>oV7 z6ic=*C=p3v7iN48mDY9Q8C{fwhV*d|!jxi%ZV30Ra64D3>vv>!{P^W>edoci|KQ1v z21A>a7f>&?F7*xyNC?F!Y7(GdLP#{8ya-iD(y~F*j3b2rg7co{Y@DSn0HpJ!Hmt%P z+btZobPE!%3}L<|7@_M-#t4N`hvVw%TNvz2=JVh8-}>&u;lPOqX#t^GKbNct2}TlM z5DE-1zy#sGf#^9BVj`9)K<1q=q64>cnd+vq<9=?NER`vj#h>Djd2gl9x6ei4ua!Gsyk_D_H8Q(4-_7KI2 z5j{dg6DbPS&K`BK!lUHkciCpL0uByNQj1x#LMeVL-nNn?%wPbg2Et4nqMeTLFdM1f zW3)7f>Qu5NMKpSsd19v7m3@@n!R8sWd?{Gc-7O|WgG?5Yl+JY#trf;-m(bMv+URRT zY=OZ&YfB-@7>-w;soDNW#Qw1{rZ?>x#JV7)}fUGsqo`AvR4eW#H*IWp{YDpPH zOfwI?p}D2fXIy4_byQ9{(V_}BKR-RN$uWl`+8{t)mGj1p)g{5HNW)@p5e{vdK5v zNFx}Gch4Rb4b5J9^hYv-@S-6p5vSr*o}Td2NBH`ba6nYH79dDJmupf zeR_&7+~nRER*OFi<6m%$l3i$&`6>OJ=E-RJe*4Og$XlC=aS=pHw?Rs}VS*hCHvutE zAz6`N>6e_THXMW^Kf5nKy32=8>!+uFHlwHb_LCUt)Rgk*Nbfyycc1E)Z{f8YqU>`d z&~PD&WQtO~nbEBFHEA-G`ugbbuUz@?cV>ThDF0+rEv^VJz$hxnq8TO5gyfL`5sM_y zfnZk~><~}+(J%E+Kbk*ySf9*kPAVXNlqNhR1_Vvy@RY}s`sf4)C)MG!x^r8c(zkLY zmQDyF@VEAV`0noA_m2Pgy4`)>u%WsnNnDAJN0TZ@BT#4>3oH^% z8S>ob6(HW^7mxM*AI}~<^(Iyg)g{bE8TGtqkrambt%C`VKAF}v$2+4h-0&c2J-&ab zu8O2fijcm(!=HQ|KlrBME2qaV+Z3)6;6jYF7@khk80W{%?=J`zMDJ27Od0Jb^ zA}Wtgs{j47>BkT2!BAY1hd_IxTj82RNKq%1>fF0u+@IgNF}Sg>`vaS{<&rcJxGq%~ zA!5EJA7AJFSL*Q|cT5H@fcq~130^1cD3)Tmh4YrI-W1kFmI@(j9kTS*5?OPPdk5~P zA5BJ8kqwmXw;Y^}Dk??uV z8^R>b*fH1H#9cPlRWwl=i6$i)A{t~p5|m;M_}HD9ous_<9!B=Gc8`yyaHJpv8&!(X zONk{zph=Y=W;-YZUgk4S=P*-5j_$akDRNTWKnihX0oCztHx}c{fvhGv)qdU%X3pYJ ziFp($B5cRTXSK}d=E7(f`4ZaZ4kWk`2-q6(%ut~P350nQ8_fB0IfEvvrW|vWXb-SC zw?MNu6;Pp>xK^^XBr*YLMU8UYmW{u-=&g5RO**T!_Et!wFz_LD51C^$xJ6pfC>N19 zFybSv(6O*%36q653^(kJ*6TrWv$@2Qvzsw4mh~Hw^U%qDXm^DL%n+o|A)Llxf+|VT z25Hs+R%wClk}(YfA|_5m2~nD@j=&V2VmW)daT{!~;9`l;NAjQ?b~Mnv6}lvQlq;T# z6z61TAmh=12S$h@YLY0OGUEhMW^52fZJb9^L@^vmrBc^DzZlPHqmj{5v_g%vve0C6 zxul(wvjDuZIjtkO&c`iOA*$@ul~rp|%0wk*g$11s2DTYg;>{nO*2fd>xSm*VPq2n8 zqM*qMYP97ByNY3Sy+}o|1Q2;hn$0bF&HgCj(#@$nJ;5*T%^p9UjRrAyGK28h7eO|7 zrAR1kYIkK=$>}M7_Q`Zd+*e-ls?iRHESpDZ_L$HpLIY@Ek-fUPuA(o+YzU2(CR2$4 zXFID%t>cm~dv^Qp9=V@>GCw_KM8hQ63Vnvxi{*c8!fnUn532EoU@?Y(eZAEP;=Ho^aNV7I-HzVRTN>J36;f{CIB?M z_u9q*;6yw;wWf?%b4hv;(G92Mz*s?f2p}(DTPN&Tf{&#YoW(~jUF3>VMCnQo5TjA0 ziojVxqnAZrX!)1OhH@#&8V|`tRn>K|HI@b0mdP8i2Wm`_ zLKbd$QxSl2*khU5GAMJqVrI;^%OWdtAt2&} zm&etE$-K&G@X7dP@O0Xh)Dh4G5vuT#b0WmZ!BwclkW&7nT@#}nA(j}wR+$X+!LIxG zwc*Eaj6b+NJ{~q1wi~ERq7pPCv}M<}(|@~ZZPF5Tr6+?%t{X>A#=DM>XGya%39Bgf z6^ra2X%MdhKxAez*sCt>YNg`qGRD@%7up3|VZMEO2|s>gIQ;q!-WXR`M+1etn5AFV z)B*czw;EkRc$Zs5@EY*!3b4Y%JKNFCoUL z-*~BdRwi+$X&ILhYNh63@eQ*QStTm7A56si<8)9cs9FI^UAwYP4hUzYr0 ziF+cuLzI+WBe8G9##&s9qp7lB-=n7$#F>)3yt4PUhsoE!eCgVLWhP>xA+N6Jk(GHT zh5clISMPjr_v&C)*T(Z17M&z7h-wec$j$XjnjD6Hd7cvB*f_%%iCiGDjLo)Oqtiw>aV)Fu42)nj-?g|h3>|N zlOR1d{sm$)#`@&wYp>L=y|SZK1OsyHqy?Nq0I0*Y%Y#9E?EN#>dJ+yfz!NPy%9nmL zCN@@=NPk&EU-hOuzg6#R!^z2xgE~RPfukYJ;$5H=IH%L8)wO?~)+}fv$2+I)tAD!t zH~#Q4bz=j)efQ6HOV~oDad}D9xh_9YxqE>7PiLe?&PeK7qp*sbGZAt!^`1IZ^Y-ks z4TjNFcTcM~em;Ef$NPW&d;3?O;Qq#juzIYN*g-p#HZLqU#?!#w{P38U6WBICQ{cc8$6_YcF_j`Ur4z91(Bpz%cEcXuvdh!E2D;$%xn3R zPxb%a<f9)nKM5bA) zy8sF~pAzHG!F#XP$0YsM8;gpj0zf*0=@l{>$OrfE{f}{QYN|RKR1k$C_rQxe4~6^I z)J`;=R}9&6}LfmgS;`a9CaKzl4LMUon!f4MOzl ziMC(Depp6iJd{7Vr{DhwM^hP9P93zB;F!b3!G?&JbLr|ugVk11sH3Pt6qSfmn75Oe z{qcwP+s=LQN?q3r*_t$3E#^hAckQNqdc44l8;k_A-Akz<56S>an{bqJF^ufn?+oNe z5AeYQcQlnjrOqire7NW!#eDVHxv=aegq9;wx{fKE2qKm0psI#dWpv;F7>`et=;Aj< zvwC9WaCi5{tr75ftiZG8-{_8XGxr;4$x=)x#!S(jo1tbSF4StP8l2anHDy$Vd=@PNN9{5=WP?{iMM)-Gs55D*=1_`8 zv|0c{Jau<4q(EdY(hbV{`RVNNv(c5?JA3sTf8llgpLc&nEUpHBi@qT`z&snkI5SHN z97YpUn$)~;X>c%MZMk-*y_5+vNg7eaoV)@}ehE4t3fb=PA47v24dnWsnKd1%m{4TG zX2*}AmD{v$0Xln=xy*f>H`0!((bv<%`$LKjcm2yx=Da%la5_Hlo1GKfajnXrx}^nv zQllGd)&+~n*^8~SrnSuK(H<7+lOsju&I z?}~ov2KP_av_#YkGJ?w`#)=O-n^GW^v|d=MRg0$7S$$ADY_uwB(^~y?4ex;@*)f>(Ztdw6wlni zItebWn^BiW2^Q$XE}!*(8oxT9pTM8E`KgWT&-SOgpZ-U={AcE;hlBC{rpHT|m%L-Z zhGG<}sd|r{XRMPJ@?0+#%_x>H-?zBG>_|wsF$Rw)^mU|p&L>BcgHLD2Pk3@TzW3k0 z`|tnNMuPKf`k{mfT<)ESLbZg|8<@IolDJq;uJik@3k%BiS{bbx*B)t{on3S|kjB~3 z(`t0R+Sz;XlOJp%?3lWnLfg1U?gQ7Dm25JJq~V#C7GJvvTh`yU-A+B!H5Pd%3#$>e zwUC*4Gc)fujwF_RHWo!z2pBA+Z2XYIiXcIgoG`-kkMVi>I7_GPMpD+DuAkD$;z<3c z$re8?yE&hVI5twfLkKEzOIj4tY|#)9F@(kb2)5be?3|vZ4W08+LRe;_b;DMao)AyF zQNr2HqSq~WtF;U9D1&obSfITKDAF1TaXDQnXBw8cbFH6Py}lLBYmIdi&%wL4 zkQ=pOx+FFml3eH!#>cm_wtQO9IOn702Ao-o#s-n>iEk}7V7|}{T}YTKF5AXN+4==` zO8{c?%Gj#FHjqnbVvHuOY7t)&Ff4If_+_EHGbuFCz`!_t1=qG#;~h2Ei|{~mJx_Oz@Y%N1}<;@Ys#g~cm! z{Xd_LF|yD}sU%jU$XMc8vf)}`HZ@`^;E)w$C7xUeE?8>Q#mys0xf-8=bw29Wh86V-?dJKtA?a8GX&Y&Ah5ksfo|93;HaX2` zC}$?&m77$@{#*!h4YF*VWV9sMvxzKgXVS0$Crfo^)^h24tzi^4+q|A_B$s#^#emSx zJO`P|^3Y&$dBO-Yb|5Jv8$s*jQxprl;E|Ts#f=C7ru=wC5E1p|BL+T2R`Q3*@D*E>*!<_3Vqa z`B?DYo5%`^pM%tMUvp~p=7IA72r=(#5eKM-6*J)D8n8tdGm21Y;*H*nW@ZsJ*LF0k zTq+lRcqGnE66;yzDK#RJRI8sBAI+*Etr-hs;~9-5MoR7Hc5({G*=+NS;Fvr}dhgAf zR?b0Fy{Mr;xN1XP8kt26mSuS}gofsGKgO%!cJ!YQsc| ze1R4+WHA8R%4lM{ZI>8pa|4}^cZcBSamhE{{pNSS_ddPV;{CkF+}AO971w*u<23h} z)^hm7KYXZ^(%M2 zwnmbyCmrIS|C@jN)|+ou!{J~!91I5P0ED)q03bOT*M+`+aT#UA2JtF6vv<|jZuxg% zi%^zaKlf5qgjT6gg(AI6OhVS84Hy7781L<0ySjgM_q99k{MCQ_oi&nVo&62|;otrC zhaY}8tSYA}q_?2C6Al6ZFpm?Hzy6KUUweD-+5P&-QycH7pwienpqES9f(zv#oWUb4 z%T^YaJuT#!wIFRziwkr2MY9Mu81L@vUb^+xH{SW%|8%`Z;tOdxvE4QcoPQqda-)U@ zpAVYzxsl||@m)M&@d$v<@kZe;eAGE-aX|Bt&P94Z>ZQsGBCU~r)$lsK@opU0u7}+y-R-AAi(w@1KA3OA;%M26^wT07G zjNP)K>^-eKxa{laB;ncWeR0TE3}UV`>?Od8k2+TXTFXW*qw9*R^$Mll{bggfY?N1! zq&#zR=S(^+5~jM4#9uw!%V@B!_w%sVYLfKM{WHh6b8;4mSul1aWEW~$IBmuG7uF@f zDxZe+`TV^1 z^O&m7VCJ6Ri(GcjdB);Q;$6sUdQKnZa|Kk^@>}b=;pZ8+7wXt=F|LiDes`+vCjwPQ()vAh5P002ovPDHLkV1gvSw%-5% diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/contacts.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/contacts.svg new file mode 100644 index 000000000..529ca733b --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/contacts.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/customize.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/customize.png deleted file mode 100644 index 6f9d3e22f5f4a67b8fe8af212cd0723897c8775f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10972 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 KMNUMnLSTX;U2xg} diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/customize.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/customize.svg new file mode 100644 index 000000000..8e852bbc5 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/customize.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/deal_widget.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/deal_widget.png deleted file mode 100644 index 63edcbe99c69adf727f45b52ed55d31094929ba7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2165 zcmV-*2#WWKP)^XYLPb;{DphHz6sd|OP>5R600|NeBn@#$iGv&4jbnT5&F*@4c6Vm(+&|}> zw`&rFXZe*1~GWl^EXeDd1Y*PT(Qn z$lRgBcX1h0Z{jAqxONBIY-7_lrqRUIQ>4~FoWr^VF@{Tpq5@T}L~i-Yw{2Bb^Mlbi z2_dwB1Xu+U;9=ksM?cU~{yz&$gz?&SV$7Y!$P|M5V67oM(!KemlKgdQf z9J~JjKj%UScN$~1b=obe7#R#kC8{kzfqMV}lwX(tJ_PzVqTVIV$(q<&Q^J4{4K)e4 zM(2UB{M~8W`>j5g_^&^DJC`%+{W~>yGQ^!CoA~U)J{~%Dmg$DW5JE48NaZ6pO}DxK)*bW*8F}GZSvrrb{)ogV5_0f4 z_#6RZtXMtzIK^O|bn6_F)QQFr1-wR76)_f!Ma2?TST780oM2xsB`-YQdt3~mGblZ2 z;&|viH?p=iqAWepT39~`#WHXsgo-N9P%#)8(m(Ni>YZuoogG}HWl5|`#MN-M8c_rd zN@SA=J`@y#Wy)5MfmNcfzzZ%^p|d(H`25{FnQmClZ)8+a8ISr*U-%aFZClaMr^?4v zMM;?z;u$t)*Zrh=78|$j@xq%leupdQb2Mw=x=c z_HS)*|GpW{^#_z8GA=w5*$Hehk8SOx$ohn`pvVidl|>w$T5}80mt-p!cqbn1zrtXChPc@ zAEtTz&GYFm)b9Qbu&W%=JD-@`e}+uwa3D)96-4wGeLuH7f3-D@yG zD2oC=x_~JIxwLqB@hnC?-Ye$!cK5h_c7o?$euY-2LuaZ@e&oxfDNyeb@*zGSk*zLL zW;xq#`fa+q?xq@h`mesga9ptW&VzKiGi;fj<=~%uoQ1_TPX6RMMvJEzuPlb8dbfY|5T%yRh=(a^kjoYq2beRSv$Q9BfcsIK}Eu zzm2IkC>D>BO!Roi!2^J&%K8|W;DC1?d^gWM`2^wUf3tJ<^%!fQ%CMb1EDQ?P^MY2* zL5SG;um8dCPv-rv?CwoHwKNQ0ZT#@BKG18de8@-XO1c%3G=PY)mTWY}56&?@_Y;h3 z(45(cRyo89jgkDq0!t@fCKe-RX138^T|+~~)MOnOOOhS$;(MWk^@b+^>IJ85=%Y)?~sSzxRKRkX}dHVJrNv9Y{> zHA1bP0?O_iuV=8fTK>=J^I+kSQNY`0_Lx02Ty!yPaJ{}vE+I1c}#Z( z(|lVr&Ao%g*E#jW|3JqJB$Higtu~;jdO{3@;89i9&!531b&`6WD&Ihi#Q@W@bK?h} zl$8_Q%4nQ%ba{hDRALCk5O7>d1O-&NC`MmyjPlScBPsxv1U>|5;O)v&))ljjN?Jre{ef8uVZJQ8iqMx@Gs<9z1>g%pu(ww@Pb@Kw-k>1=d~wbt>(_Iv*HqsO0l=C!GobXSkR zIOa0ly*JM#PMV=C4`}2L;Oz20{N*E#Um~i~-zd4LFG=2=svj{DzhJeTo||cZ^M+48 z`{>E9z3+ENOY;kj-5-AKuFrg!O{-kVpMMUN40syhY2GBN%GKmvdg-Mkgy3R~^$@~j zjIkF&n2s^FRkayotj8D|KngT~7LWodFafkgq#+_rV@y*-Y9iu{G0wa}thJRfX2lqD z#yR(@wf4Ak?nII#=MBH0Km;NX0RfDNSlPrTRkf-ryuknl5WoNeD4@JS01H^a0(E0d r!x&RH##j+iAc(4RH5sll!&UZw<;f>M{nUEY00000NkvXXu0mjf`b#Of diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/deal_widget.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/deal_widget.svg new file mode 100644 index 000000000..1a8e870aa --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/deal_widget.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_case_participants.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_case_participants.png deleted file mode 100644 index 06f087ae9d84691d9a8a045f4b8cd7203f9cdffe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20893 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 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_case_participants.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_case_participants.svg new file mode 100644 index 000000000..b934f235c --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_case_participants.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_cases.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_cases.png deleted file mode 100644 index 8bba737c4b09bc73d315b0b0b27faa1f6d2a9a0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16703 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 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_cases.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_cases.svg new file mode 100644 index 000000000..f95243637 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_cases.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_companies.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_companies.png deleted file mode 100644 index 1b2c241fbe45afadb6f6b08435038fdcf2653ad9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18568 zcmV*AKySZ^P)yib!(JVlB!B22_qqpL5wn($#xHh?uFeR8=JN<9=c7h)owS- zue(>bXN>WLjWJEXWq8la51YvhZUYuFgFwiDKtpM)Dpl2;=gf?VbIyK0&WVTYn;DrI8S%y5-~RS+h?%jyZEsKZCbmz(_O=bI?QI)a+uJs{hJb^C|3p{tsi}?oVRZjo*vS zNAJYcRnNtai4InB1w48?ApSa_0{PF)ez8w{AgX_uLK6bkE?Hv_f!rKghX8b>dY0F9gN1u z$3R3&-ts&U$MK6Fc;qo$wr|&Sy@l%f*S3ggvfb{Sc;wU>?AyEN{rmRrx%!#Uxb7G; z?_FD4Kk&$jldrx1_=7(?H$VT$6DLmKLm&D8fGu^dq3zRW<83Z+i2>_I06%{C>Z@*f z<}sOuG5)+~UVrTizvKGrUNkp9fA%Y1yZcT6ZwK)1$2++H z@9)11T=h~+tIcgxT|&Tm?cO~zZ+Y&`&tBOxvwI~;l9%51&?)@lo8SB&k|Ys62uTvB zj@!`n{o$Yd85g6PhzLRm{KA`lx_thXuY4um`qsBfWk^|Q3p8ve(z3zMgYmXiMpU18_f+SXN0Pwk=`01agzy6Cq z2LSxg55De~d%ga5udS_KGc`4p?%lgr9Xxn&V#o9}I_(awy!tBa+O-Qwl3;Fj7H7}S zwtBr@YxeA!nX_lk9$Q{ndC}V1>T6e4mNy?ebuyltJ$qN2Bwu*_kNg_|!18*}u59%G zWbgFYozJ`ZIiE4c%zWdX`;G&+a~nEO09aQZy5gyJd~dq>rf0>o3(NS>hd%hZR;z_~ z{OSLC#n{;R`=yjGKX&ZcFFpG?H{+Q%+<=`sc67APVDcPB=djj*tp!X5(@inmX<+*5 z%K;+bJFW!?uolqPwl_Ds?c)zVh_8O-Yqvgn;?bMl@u%-zlu~{!X*9p@*6(`hU!PuB zyW`3OGq~x-8xHmR>6-xjH~^ezTnilk+%}3H4_F8H?|Z5p-z%k3d-_>kkoTY4y?f?m z-~IAe9C+UIo{QbPcLP?#<~cT&=O9%C5)wixkcyKfh+Z#W9b`D>-tlcO;a6y_-}ci#`ERkd*~7v8`(6nE`~Jl* z;l#WCXd6N21FV^u-A}dS+tX>c0W6@^YW>B_U-8PzU-+UIN7GXih^0Wbu?m$mkhI$9 zB-0=vptXV4IgD`tg5`R#3lT^Nz)Bd_=;s#e8=KfzTZhp(8cB@lsVV%xYrjAK-dDYH z-)*;l_H`fs#K&I%0LB8>Uw7>EkACD~{LVIZ&L3FQJDz$Occl~_y6^7IAN{c(zxvp* zYtU&nAYnl=Mx)h16vt3Xfr!A&aC#^K?8~Pp9Nx?BKkFZ32Ebs;u-2m2PqDtSiMgd^ zv>OfVn4HARUv?{Qy78F@{_?N>>akrj`}PC4$-NN(;I{$%8i0juD4hdX>l;r!4d%Un z@&2{fe9ueAuQ_rA`?>l)I5f1v8i#%+@~a$7Hb*()%;dk1C@x*t<82gxX~>#+FojPK?#hAtT;JHl!s=PXN%OropZX+#e_z|n7=tx~qnl#v z-L0!%^X?|_aRBe|Ap7y{dq1HAc+cV=3m6&tGxSE0+?S~p_;1&L6F;rKp-OYGDa`MD^|q*S2Tt0 z19(4xU;cJ-l^0zgJ$Cd6c8x{n+~*5ls|w^yIEs??3YV-sLykk*}Ox2k;31 zZ+<$t%BLc*{yBi3_{N>LzpU9vkY?F{e89-F4D;*j=;s=O2uZUEkVLniVqswcCr_Tl z+}Sf&UtL1h@4D9s1;`js34}@@qXex+f~j_dv1W{B5|655MN*^6YDXvkwD!D}dkM2G*0i{W}%KZ)V`?+ykoD z?<2T+01@uI>mSk8KpZF7G2X=V&fRFV#(=mDIn_Wz&7d{I&>29QkYxsW-iJ+l(EUwt ze;r8Iv9Ym=mDLqAguz&63=^FOnn{Gt*mxZ~M5Se_nJ*5~MFqF;023rYg20v`!HARu z5kVRQDFkvd5MIs@qK&w52xjK;L;YP>{vJ5{ZEwZi0^lFFfpwnS!iL7q&d85`jgaz6 zW(%;pSXrh6D2K2;kV!!%2Xqby0*M$l zlCac*j;ElFg*7>Z&C$vhz;*?CqlDbk`Jgk>aJm?kL4{ZZ$i*0^A4|S~%7@f~Z zDGw7-e6Em8uAf0$baY*VpmLiBmW;w@|l6g-`a8Aq^Qct_iC37^Bd$2)Qv(N@;n2PD9dJyG0qBDJ0ue@TNtgqK&p|Y zDZ1S*vMfU+fIZU_BSdwtp-~+`=Th_q5d_FrUjSX5BT^D_Z& zKnGwD6XH06kOIp~3nTe@mgi9F!W_ERdLVT)2(rKmS`F42SQ&6@9HeBO)-xcaz(#IC zf*?skdY4`DEzg~Va288RiGG$MNg`Ozo%ItI)-Z&%5YkyN0>QGg)B?sS`_gs7^~CN2 z>e?UvRBRUB2UjO{(PfH@nJeteNd1C}qIs!ev|261aqQff5D>EZDY(QyuEbXw(8W9A z;NwP?-$X4SZh@i(cw+%}`4q5r1~8cyN!{W1jP?Mj$bBJ4C@By{5=sd~NmGkvyTacE z@VkqP3-4$&k{@ohnk_*DYZ(w+@)NLywV?o2#AJ@|u(jCS*g&_t38^HMiogt{X^OSA zRV*&dV`X^-y>1uA7zYrcAe2HJ#b`ESBuV0}9{Hs6Xtkk+CmIe40S2oCGMRx;640A4 zv-iP}fozY1C-xxI7Q(wccaH?WLzFI*1w$!;G|#>6#|AhHnb&MAY@v(b*@Yw5=(9q;=0Pj~YEQ)gxu|I_4H^UtTICSNUufHk(t%L!3N zb2Wj}U)4MByb~aa*4Q{ECa2JDx1pp!+V5j&X$5Ca&th?Y4&99nsPrHv$sIwT^XCPShY(ldaE z9((|;sToYiV`zy6&=`Y=6Nn~3CVL>;SA+Iyn7%t0OrFAIDQwmSvK~aX3DMic z>Sh;BN|7i5702kr64OZ%xZJJv_S#W01!*21`L%aJP0YaF`+n?y{%f&x-yL}H6Yqu) zK-8H;)S1TEWyjDO-vtQI$pj%a22x5$WkHr~SY!UJo3U|5=p>rsfh*%;K zK%A%G%~jZyc{Ep6(Caz!PTp#fQZP!vkixo_*vJS=eL%y4>{gDB2O2K84yeKB9HtiZ{wmhaycfXI(~4u=@%b&lV*{2gBm_3I6mcBGf?>3URT64qrgK(b`&U2peK)=M zX_wL|z;(yxZy!p%2ofVKnM?Qf`+dClg)eY?qDtmLYYnY6@*r2pY)g;{AziLe5TYo? z&Rx4PF*$_;2M%CqaS@A4OITZ5D*-@ZDw@vejs5QwLaprL88l&4$94gdzznqZ9ftPlD?tDRl`@H90Sh3_b2J(WjM1=G zgP0-WHmEUv3og)#8y6E;Zv*i2qrerOS!P>LrHqLB=jP_1qzqCzvdk40mT5Ro=#sgk za)q0ln^;?2MX%q7&hvWPw0DKpWn=0x1O*Bzje;2k+SPy?wLJ7WC9u4%#(^a)ezy#? zF24b-%Wi<~uVeX+~s;z$gy&wL6 zpR5b~&t7uVXkZC(L52A1cTDfZo;`bN{Dg>IY6RX&u`70C;t@W?J(gt|RI_&sR*k9PZydPNz~W*6 zR7NAyS^4~x&;CxFc;End^%V3YpFuQr0CMUOKoZ&*L~(>T%3&=-N!QfD05l`M;J~`T z7p+}n^5KO*9#W{>?@s(1umr&@hKspz>9HsbO3%%<{CO0f6H-wM7`nqiiYVMT2J(`H z3$IHZ7M3m2JV)7u?Y#{NKujHgnmPzOe?Rm?pFw>2bD`NFk`hw5d}OYrs|5p)TfXqX z;tLC`hLo~A>6WQGZd5!j5137&;@`rB&Geb$?@~V~*MGj;ZjEvE| z@D}UBZm|%uYVag3%|TJg;BMNwI~Zj}@44>*Se2mD?qGVy6eh;oh?H`_M_&$p^g}pv*C)}r>J}JZ116<_At2{+ z)s9QnV#Pub*!qZtE0NF_G?b*B9KoqyJ+8(LEzh4t>(GtB#5B~@4n$*ZL{S85fTVpH z;>qg}t>+MZ4V!9Yxkj#YHySd_VDc2u8KApRHbr9lFgitI4cf8Zg3Qw}&eJtOG`6%} zK`6d@f`WD@vp$FJqjw@ca3h4) zuKo)^X86JbYpe2+Ck))?ZzA-7pjwKeFK1vFMx&=1JF`&Ma)e+*If2 zi*fc#9|kTPFI=#?;J~_o+k_Cp09Jzi)Zzjr-h{ihER>a_)d{YTas&wf`MeD%)D=b>TXq2ijs>u)x zYED9o?}XZSt;^k=em@$!u0XbO7U{|vbQe#dF|ixEyM}mtCscb1qB((h#{sCuSox0q zG<8E!$XA*YkmnlKnDY6tcDojdh6Clo?;k!tam@>H=Ki|?IRgv2q=6N?W&w70P$@Qw zV7hUY776obJVf4swY4?O?3^m=$HO#Ekt@_%m$|~~B>OqnG>O9*^|L6F7#}hhU~*oC0E2+oiy_uLH#dh?vpF(X82*fM^QIiUc0Ren5y?tAhmtxX zX&%BdjMNJGf|4;b_FhxE`R?g^K=<5+=$h|FOaglKF<6~K&pm|x$*-c{?SY6P$7aCo zY3T9sDn0MdFp(H44lCmrAwUc?W)5TR;jf3Ye=ki}D5bPT^C!yD*9aoNT3vuUIpKw5 zzNjgk5J@~L8NStiAo%=@H%c_X+qg{4)QSMDK|jxtj~@hqFtwwDmE}#ullxs|#;&Vf zYySEM*jn()BcRPWY<&IW0D$BF@VAh=uJVl>5Gsi$v2Z!#_QaihVsn?4I ztd5kjcBzU6PQy-NuD&I0S$S5>W?x=f#F`L@;uwuaf+$V^xLo1d+B%jN7qGVK`U&vF=RDk%j1u&7ES z={!TEnkD3{W%PUff-C?Gbi2J0kZIZnR07_210u4}r@scCy{C3#4l@dRdRVMMWmyXN zVHs|mPjQlmyIv~WaQ8Rv0jnlDV;xLQPGVxLgGfpA`+Y1eE#dTIr?Ip!hmDPOl6=p1pgh4}L4z;;)FM{dWd&wmu{!!N2_ zwjVl2PXkw2o7h4mJr7~9w_eOn4ye(rfMXTz=#{+5Zc$idN>(ziMv87NvUwTLJ|_Nx>~WTkRxbx@K?3i zGp4S830kp0)Rs`Obdz1Qg~)RVB>+iak=KY2lY|ujD*;0>3}TRM!g3FS`>@Cm&d;dG zIByw@66yg*QCG!*2u>iRxvP@pDljZ-&U_FV%rm8OAEPxWjvz>&*=}QVeIuxda9S2K zV{>z}OyNio^gH_FzUmb}hEreq6qfJ$0Fq;`EIHPNLf6F_3er(hifYC%1&b$9S!G$3 zlK8tk*BCuAaxj(0BN-8GL7s=@11i)0U@CARsjvYG?M-iBFSd;sSg7q)jzUn*Cm_C4o zFa4FP?s!^6g|ZSli|Kmhls&evj56bnU>fn3iO1EGXf+58n;>b%h$TU08SKV7^y&f{ zp1hlYy!&y+U@5?{fbpY%+ze1tE1RxQhYahg9ygvWQ=O&w9WHMd>}kD7DvH2@2-;L_ zZx#$T?9K@T>+2g1x7PT%ssgzO7Bi!tZh}n?Et4R%Qy&c1yzC|<8=F`;dp}6*y!6R? zA$V59_6zfG3+;|LmrEXzP@5-?pLnFO_V`I>G( z=bMlPZ)JwH8S+#hiIbt5tBTxum%PQAQc~8}$tp$~8Vf-TgK8WQF#=ua98uu~&FNss zV)0;5TB;;fY)VN7)R}~gBE*p!^@vZrALB<~0O%B!fqdn3*-%<65nQyq>9p%@eA~~0 zHvnQV7&`4j&p!am8t8ArvW4o*fDmKx-hV_ialmVW(l=iWj#u(}p=E$KAke>HIYYIj zs{G_`Z6RdM5>%xffR_v%VP_W^GPYQu_o7ud_!jwKsO?Z`@<5Ms*?(BLQl@e?)~-WG zu(-Ghf`#01sN7%ps#@U{beVQRC;l2cp7|0iFLa%I+_3{h0vihpFuhr?wl^VV43Y`> zbAO9iG+^ew?iw&u6TIU}U}C0zUvkyi4YLU1^pdw&EfS&<(|t5p5_INDYVd9A1s@tJ zn;FOzsyIQCxbQm5GORyNu8{l!l_VsH1R~{|3%b zX`vD=E8&5O%aKi4nj-fTp|dP27Z1=rpPJ=e7~O*q37Bl{9&Am?_Hfne#sJbRgA^15BJLP^-L4Z$(-j}tsbVledBe?IemUkIeZa{s z6Z=6^2OxT@$j^Qq0F}8y5J5-@6^$WHRxeI-nR34{s^n$8FKI-g1Xn#N&-gC16GGB*eT6~*BDWBE2BF+Kfe@L$poIV_z(T<) z^1X#I47Xry3Q1jX&{tRn5>(B+A`G{|Q$XI!^h~W8m&(VB9AHtKPFz_xturVgp(2GW z&mg6AW6H_(QM!2-3d|Z-uS2L7ge+1&2Gz25RiR)A`sr(4fQ5&@g8BYOFmcU`k*+U6 z0Z>w1(!gp9DXZ*%ndd87lekn4Ib6yu1Xyj*=N8FeAIEWc!I^8q0S_qTgKt;%6&9Sy za_yKx^Hf@kB5_O=AWLD?>sAzSu(IOJza}@@&EJv|BDjHyT!mXphapHH?ahL12Eh$j zwjc%s=WaGW7^>`CtoJbH%^hgm@crn1{r_O?_-zo=4JaZ+7Xw%quoF5CXK$6Gf&7;@ zzQ3MpJ$wUJi|XZEoy`*%*8*ddpp6(x5LA|dyKCU}MYLB}(C>x0LO6>R5fBM5Nf;(r zxVh+BYh;E;BbI1D+ZruTP%Rf)$rEM8M(93+0UkQjAaX-H8jYwDbAu*UV!+xQI$eU0 z4VN#p)`1Ken6>XEun@kZiwMZHfgpis@0IAU^)PkaOR;?XgAi+NC^-o!_>#3)aTzml zHS0-+Lox=ql><4K1DoAV zto3`4k|BihWF8PShoO8Fd zpTj{>wfIu0bJB<+uiC(~dZ$4d_HR|lOQ`8^)&f>ow~)B7Amd)6e1(GX?O)_O!oh%) zZjy7>&tMGuwm4VpXRQSba{T~e3fe3q(~BShq(~uj4?+QoyGXOXJEQ)Xgm=Iqs3vh; z<6Q`$KqT;}8iOEx3A@57>g$ zMm#^*{#8`KIsw#Lf;JXJ24IG<0Xz9vIRFjQKMD9MQvqkCO?nmr)+e(4a&^L0Ws#_;h4hpmXT)Dg`$6Q^!670D4mIrb|#UuM^3Tq6s(P$zJ z?M;yapdg{3NFmcJU;s)+WtD^wm2oa;770Qzl-ihOFLg)=;!D_K`ESQT2so&!SM%Mu zQsKWP`GfrQ8b*Eg8CB)N2>uSD#@etn=7EI(+|K{zhkgj3z2oPxx^Nun$?e_$>)PGeZNm4>^i4{lw_UayB!r%vMb z&wmjoPM$zI_hqCfKa0nV0jmVNRRdo-@%QM-CbW!^<+<+{lu*K=kt9eO4Ky1~BuNvu z9Oz(W?jbZ=W0>r8&}y|IqZq($SO!+tR?+SEv9|IUv~q)jqbTuxWLfYw--^IuL39yTR`5aLcw{K|CjlqvP-5uM5fZ0>O*IF zq?UEAkfG6R;_%@kIDGg>`F_1#4<}AMicjADIn19ugLHEV>87iH;wV8T609M?CdF7y z`w$yzkbY@jDJ6tbAf+79_SG05LUU{qogKR{Ha3A|@^Xwz#_JAVjXncBwGXSAhR8KK z$dL#UjO#8$+f@)L2y%;oDv@8h7E20I<x<~EEnz`O2R5Z(q0rv315;BwF+I5x zyLRqIBWYl9bp>gj`g9P%5x*2dCB8d}x$931@+G~!MkM(*zJo?DPxclDw zurN1=jkOh|8)pC^ppq7J)IyrHktXAQG7q^mKHaLApxi=2Bb%SY+`w$gd~nHVOQuE^)6Gi)mx}?6S}VHVd5A%2#ab>?StXzJ&&P3$tFF2l zS6+E#xnH;2#mQ4A@zBE$V{Ud18|!D#pL+;GMUagabkaeZj3aGKx^)-al#q}lE@5E#i6B&4)+9_eSFVZ*wR>bz zoSp!A$3RJO_*l?f>96Wd#j4`m*B281AKK&R@pE-k-rKs{}Wp9G@AYxZ_?aOn6vP)P~uX!gL zF--PcL17UXVxW~PtnB2P22$-s0~HH_TOG8Sr5p6`Rk}WASX1>#T6RhCLS`ujoK%*K zYt{5)1xRu(t2!!22U7bU&L9SZ^k3$WFdNLqFYS0}nAkOtQ3{3SgOR?wSy3or}YmPCA2k}haCb#Ufd@EUv8pPC zfEwWntta@Q)v8CJb_iHJI7J6Q9LLyy;2`!NI0z!b-+cIkZ2%oqMgNyT655xBSigt> z$UyjBxw5n+7<*kVB@*1-G&JJx@!?gJ&Qyz9)EAtjtp)ZfJw7<#GB8@!&k!xFp)GEn zzycSmVU#?|yLe~8QSIwpne~rX^R#RkEtb41Ao)C^T7yUYKB`hAd`u~2jWL%Lu$r#c z%7UzcG5+F8)J{BG>j#4rCza|Xdf=*_w~7_&UxkCKm3;EhfU?0)s1I=tj-iPB3ZM*H zD?41v&q2bJ2w+nc6LN7p2rV3HQDiNu9L%o{SgEZ*#UqwP@za2wv_&y5jw=MHI`Ouq zcUIG7>LhkZH5w{!c|4|7ErQ4cYd{qzm21O7X{0J~E*+y1JL?v*azzFA@`-i=thQB> zz0m1OLAJ0=HUJTO9$Hx|jBs`3`qNvDBw!vft)N=jRZ4Z?fR!6YB%kzbcZZ0Gtshfl zjT>ELD$Sa0SgP!s!f1=54?MI3m<@^zlz6M%^eX0cxXlm8BT z_wGfj)q+wAU-`;c@aO;cd%jijUIK`TVT^UfXcUCzgW@D_Em!e5@^+*4s=2RVg^9u~ zS+-jzl?Ns+)@GS{PE>FlQ;5AB>QMm?^A^pRiZ>NO&7cKxtIql;F_d2d7d+_lf`sTf z`Bez6;&-W}d@?Q8c_oV8@+<%KTXcmqOlpg!hcH~Oh5Z+Q9@Z1xhIq^t(b%YkqqsK7 z|C?Bftr7nOhbPI z0YBo$1p$wkUs>;+9Bq5IBJjm)e5-xuQX%ghBI+`8t5{9d`Zlkvm{Peo=6T$8JkU+E z)dk(k%AD&WKHh~5b))c#)-9H;x{VO5W4MJ?8~y!;OSyTdl6GMExDk^H9*;J-3Y32$ zVEyKA{|>s{E`H@LzkL2u1In>iewmJ{Mwmkh0F^iys@$X2Ago9;`?aNozreg@$h{T7 zMp>AVE3=LW(ZdK30musNjM?$YaDU4c$0`L)%eB|o0j_4lWm9Tao`;VETzh`h_c@0v ze8Rx`)nETjeEQR$#_{9FzjcfChwu0kyz!^ra9+TYLgcQYfnnKCNM-?-C3Mq~*^~Hi zgf-E*El9!7iVkQZ8qkc+ePSOEbTlGT90a2EA!7lAs*f=o$yB#kTP@ZZf}~h@y^tL+ z$_fWoagcfqj=UK4UCV(bW$Cg2(fO}v|4YC87EDb|xdjfs6^=Ey{mGyH+4<}?CZsep zxVAZc6dhaMZY znqgbNF$UTge>?_S8|41jisy^Zb(YLO=J&CFDPd;U*jkCMMf7Ngqy@`WQhL;J@<64< z$P`mqDG~AcTCD&1Yrk<}Io3Ph^=|y+>wo-QyR-o0?9fAO;AWxwzBdrLPGI=XU0?jK zq;DSZ7tjRCc5yMa&Y_fq&Hb23b{#3UOqtjr!LV?dwszs{5O_fZl2vZdNd~q|sQ@Se zZOeefRtaQpxlFkxb*09GTscqy7Gta{4+^Z0^|Ke;egH6V0~m%W!CzET*qSA!z>*f4 z$+;Fk@KdeF&xZ~bt6^MF^8U8B|2}@<=iao{(`{?ax;A!~aPtiTYs+RzA~!Nj2m$u9 zL4^>m+}8IZYGYuHMV4idO1N%eDc!V~ehMLF&9nn<(l8Z;a=wkd0z>Xv;I%2i5n2@Y z+5!l&yqLzglvJU46_zj8c`26|V}d0~s;SS$*xE7`g+(e$WbB|N@`}6fDFht&3QNb< z&2_+_#j2%&g1W8|R3dDFBPy4(+tL;O*Z=-M&}yBxr+jjv!ngnaAL8fU^u|$7O_31V zr8N9h7!U+(sbUk`p#IK}ke1bn(0Ptr=k6kAIY=nIU*fGw&*XXTlyq%MGT!g^(eL-&v^`Y7Dqch0ik5#D zuAPT#s$62)1IW8Rf+PN=h-xetwx-UrDY%%aamw1tU*&KU9*QB|QhwFYI3gO`ic`K*GXsv5rhYtO;NkNI%|3vh+a6p|x?t^M&sj zk7A^0b%u&Onp+5p$`f1E&x@e6Sm!ykw@i7SyV;~hBhMW-GTH!C&8V`>ZkZ9I0dL&^ zpx5gnP1Dj%vvs_xPV%d&gu+5tHYkQcmsO-bZBqaa%x)2dK-n)M$3pS1v_RB27yJx~ zqKLzWHE08C47=m-A(U&Xm>RsU?|S!pkfu+3Z1;uMvBn6H)>eowoLOd1C~vYe73>DR$Ejy3{>J4rAeZkgi8XT8hQV%xBkvk zM)n-GFv$e^T3Jqmdc|llQlR)>k@q9i%W5nbu&5$J8}vz*z(Q@^p}GqUWDG(zS>FlR{q*(^)cA<5II7y&&jyR8?l&Yo~mmPqjoVOL;sReg-;~1Ug%l$;ZEOX#Z zvkdGBxFAuE0m^eX!cpqnaWDYu8|&zHyUu-DQ!C&rN?>Z~n!(vO1NHFXI>DBQmHJZS zsuA%jkxjv8q3nSy=G#~AHK-4oVigVd)?)zh8^86|r(8;>)_Y7u6Gaq62v;f%hPD!y z11nrKCfp)JzHTc`Q>1AQN>gZ~k!y`OilF@p4q;gJ8s&ZTM#ZE|F3 zj(+NZrSshJ7hh=T$gSg8#%M^Bm7(^=`nq$4#=Amm>gqkJfP%v%T?Yn@P{4_*=j#n1 z99TIHYTF6J!&F99lGYv%7OO5I^Kuw3bL(C2eh-$Gmi|eAMO*#7v9Un_u(q~FM~)l; zfXQM$C~-J!wyuVga9|=LFjTJ{WJ)C|>7c@Kc)9!^Gx=1-uR^N9hgwwlM-*q9H`a}oQ#e`Abr5&%<@ zB($-yfh0*t2r)%O(yeS|U2?hLSiv16yeR3aEQK4hQvfSVv17aiM7~xY8I&~;5RgVg z6vM{KA3kTr4g1zv#PB>w!q_IXj*)4DG}B0PjXXCn-dbr5up(?|f$8x!uDX0bgz00d z9aj-)Fn(JUbE$%nNrLLD#n!7D>fJTAOyktSS&I;B?^C(LawIdVwIOS3VEe-mzIssv zbF}Wh8}Z7@N*qNIZ)|LEyWQrEjSbdXqtoedz+H#tLqAbqi5qXc5$$%HthEF{D5WUR zb27%rJkLo8LDpJ9L?opYL?qeWGQt@1Do1j^`H3cf^U;qzB}-)<{NL}z({PKGQXOWt zQc9cWIU8fFwbn#YWLycewC#4A8;yny@`U_EfFkz^{=tPKEdn{W^zUTZU}qzuL<@I zA7^GZ{x!uu#gFlyWBg|tr{GZWI_q7WW@a0Ft_?oJ7WVGv`EPm^ttF`&w&lqbM>yt6>MhwH2@^iXyVsN-1S=p_R2Z0T5ejBO;2JIb!Ch zc-{j_`S&dWBiwxG0$@?_oEiXQ@mK+Z0&s(X83d0EK@)(`TYcBpNJN5}1yzIB1yvdH z!YU&GRnY|&mX6baD;T_B#RV=Nw?t(9h2IJ=EQB!r^=5ECe?g6Z4jxn{1g-xJ<3E=H z_y-601HgpOTL4xFQ9RGVad7bY##(EMC>Hr2S5~nLjs7bwaSA} z1pBD~5H+h-ytc4bLWmL&%pCrXVxJILg=O=W2p*UezK8#tihX<}NkKGqJ|s4@R>mDB z7Z(j490)F0v43bO^Z@XR=M6JkA%tZ&qo@E_0YVd4#1McOuzZ6cLhw8L*A>>aw2DFq z1Hg@I22uchX6}YJEi-eHBzE`i-S!P{ctg!%Q5Z2i`skyyva*6+uP55=wlKyhW>(DH z5JI#7G?}>xpvBCQ5TXGf39OU~K&1k!qzYG8fQN{bf1McEudpPAr3$SJc}pULNUwN( z==x+Ba127ib5<_7YgZ_b)DP={5(> zM`>w-i);LTrS&Q8X)D$lY2G5 zqm&0jY0e8-%AgW`~uuMIEEU5FSu10EDXBg0B|+{QwAXQ zmMdfCzOS=0S(fqY>MDQy;~&Qx-}uJICGVW)xotEWu-0k-Rw-owXl73R>o&ccEWi;) zbaK!ghEbq*gSCi|h?M7Q1t^pUi3t71+S%m?1vx?OOt6p z5avMw&%=xV*x)%6fXWVlg9lup@p_dG++S!tOb`hUxyr&t7S?0{SjGE?ZW-Zm5K&=? z%A3G*JL4@@VYN!qE`+cE_zPe70-rM~eDu*rYv3}*SnmogGaGAd?yZvWcYbkUWnm2h zJ|w)pRa%~qkO!8i1ZEMn4e%_vg`6Nli&a>yK`Fw29)ibc05B9rkiovfgNq01#CeM< z>LIxyux3NnV+7v{-H;t2OW1&14@H*)B%TYopm5QJ%PoK;ga~<=^^suVvQ6QwthL5k zYlRTj|7)a_Y>ctS81^MKPe{jN0DS!TaXNVLAdQWU!5BkIDXX=H5Q2mdq_r+0E3(!W zB57eQNGU}=fhzrTWn?!11{rWD1Xiz%;ylm_uuwp@Md0QrculBL6|QfPv=>0+AUGJ6 z_e4SHgC>MB1oMxDWVs;3AwlK=z65V6{A5fw+$p%ITyUn4n+4V>_tDBZ?v$cr&c6t?}5{*f*`b58ah>b8}+v-n~#t zK}t#8Zr7oTs4VLhLXdA{AQxm1^?E(TaZIgNi_$cuG)<||XpmBhj4_nwIS~;RfMsSf z#*j-T3gJ(BVMPQp7o$x}GVWhjlJLN|6t1s09{3vpA>aZ6&;HoUJX^SQT~X{;uT z;h@iui}Ib~BKqG8%TffM1>r_Wto_C1LcZ`4gY{md{5)d}ODPKgv9*@-JZB*UCrLtD zYfjUYiHMucCbBF;x7+1btHsRB{(D$|En%%i9LJodDYsfJSZmSgbdY5k&&|!D-|u7Z z-o59QFZ^bb&_ja`thF>bIf>cXS)4q161U!ZD{i~(HhRu;o`W<^aqqqN($S+w3t(b= zd>oxlhh}GI0RWv&hgz+ct1!@-k|e?U`a0q`CT6BA%c$LM`&CiXQoz+(LrRG#ieQW( zf6>WWi)OP)S(ZU5g*?wGiXsXV!nv!CAR$EYSOHY@`~Bj5DRhGcu!039xtM6&Xf(LE zI0d+gi1R#$zxah##(AEj0F9Iq#u(OGBaUOHqQQijvn*q!6s)z}@AuJcHqmG_kftdc zV>pT;q-lzFyUj(XPrKdbG)=L#wuXMckC~Yn7DCYS@-jD@O&mCI0QcX2KTl3h;^@(% zxb3#vaP;U=UR+$n$&)8>?X}l(x7(#gqwy{Eqd!??Gkl(p;UgdU2>tBO{w((G+Xrhc z9)9>?96fpz)6>(q_uhNy3t#vG+U+)8@PZd$&z?Ove*8F2o;*pNPKTS#Cid^&PeKT2 zt?}@~4}+PpbLUQ2YcV}Njm5=9q-jd+cAJZY_|no6cJJPeiHV64Seu)hC@5m_e(US& z*tv5j{Kcjyit1lz#H5y@0i@Mx@#5klq?GVMPXQ1#n@yI|Euhrz_c1>|k5;RN9Xob_ zhWtUxsiHQm1d5-1fWt=^G7X5x7V`F2u{`%{=*X!Za zpZ+xF=H_tp=uzBw + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_company_participants.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_company_participants.png deleted file mode 100644 index bca6914f66755b4017b4c7356a5a7b0836587ef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15284 zcmZ{LRa6{Zu4%d#~=^t9NzjuCFRgNkI|=jTj980ANT6Rb_Ik}KtaO^J;t0_b@;yJ>d0 zy>GkUO8>Wn39yi+6~}5UI&7PBJzaV}vb*;tDPicdYSBOK-4X-qn;1sT5o&I60%zU+ zXW-AN|Nrj14gPzZ=~igA9j*eXp1V}F^&pv8bOuf!-?Cg5Kv2s7K-v606=V*p#YPel@Eh%&&s=<#vTD zNpo(~kkWb6mJYmwtZuyGU?i+Ift*wZRRiA zLA^F|*zK*yvrD^>T;v9QP5t+>leH?VagFTe*K*wZr(qVaR>IOQD+0As__NB?eg6%x zWYJQ$eXIx^lm}X@p?B!N4OveYQ|4&|h2pY|hICWvDqAb2MZFRM(j6&4P)0E62Z~%S zY|7}Z6=l3TQSF&Xm4 z*Vb1#e*+M_$1~+u4Q>h$U>!~z5V%316pKs%2u4m8rWliDp_Ra+gH9o$i{|K0hF$vo z?(5)1rWZz(+5pGG^++IFlRo>RJ!9j0TcDS5n-7xchK)jYcH5QKsUSg}hJG`3Q2<)_ zYzn|(M&n@&Of+Y8Ni{e;Hx@o0?I$&Kick(Qaq$%Oh6vlejviikL#?xGARJzX$FTf4 znc?9lgo6~}2t#v}!(B|s7d!%3Cr7wL!H(VIotvvX-`T4c)T5&fZo zeEw0O{3yIx%~v1i)sML6mh6DIFbaPk3T1lK6e>J%I4qy#s^>ru$xFXg^=Rj>_hout z>f4O6%3(Yno5#1MLoA7;vkxA~;>vDHNY@&uoXqZ@FJOv+ASMwiG&9k7t~hEgDGoq3 zT7-&B6W~K`hZQBErGjCZ#?M}`XXBdIV*>1^zr&+dJ!gOfwd^G1VD4S0G+_VgVIPxS zF+mg#jY3q(n??eXtv@TQwvm3x@IIW!g2E;rK!|uD(Xh15_X(IQ%In`zQB)#LcLYPENH7S8 zIZN_IHnD~0^Cdn>vB8T_QeYUW!gYX^;jx|*SY6P|8iqi*m{-6BWOX>RK8d1t8h9cy zeCDIVEJoRh_!askVS(Xp(s_sKhG~GqDDO@bKPqA66T82`YLDcrs(dI8@vCv)yBox= z4_K>K(K_ILa_7huiWzh_z=YothlUV3l=e#07* zIDv#e6>BmJ^|uoTh4)d=5|WJH@Eu`FNN*ij4MH0<{J*(V3EuQA|8d2vC4~fuWSXSx z7@B?S&e==OHZ&22fcp@K{0-5&rQeh*6y}%GF=Eb2*wj$6eLA+*~g6XlVGeM3HxQmUz zMK;06rN3c_B7z8$ii10q@f@mV--x3aN6VKEFk=_r2$v!K@L5uj)I(T$AQok9FL3U~ zfi?ihInZfAnCgmV!VEY*a^<#Fnwc^&Z1rI{!nl+3kjx~=KT|Q~84*E`Wt-$c!u70- z0$8EPQ(qi6IwoeAMv9a!bo|{m9och<-T&Q}s09k{Jz9A$y`Pc@tT z`Y1s{7qdZJUAyXJ_DuN$Ih=H7lq zCB=Biz$JP$=e*!jM`oa7$}a`h37HAozJVW|iw}UkSs}dWq2R-@wJCmjj2K~)% zomH%`@RqYbYNkQ%dA0uk9vI44=bNqGt-8*AU2gjhugd(+OahO_(5j;+v0t-7fu(y( zF{_78=+QY{tHsYor{2(vt?ObFbi*{VwVug)JiplGGzA*|QRec{*tpogPyiR5b-FPU z-hI!BOtK^_AK4|0*k%9sSJr}y*zX@NPJ+PMnL)!71{zW9I|lshIW5V`TK|)!`c28T z_IIwQ(SI#_pz*YuJ$s5sT!ufzlvlH&OuWvX8#XFiT*;fnLN6mqtIlq8h;=wfln3ls zC={wxNiT9c`W}Fvb#?m(F9n!fP<*du3SvE3>L_SLATChGG{9_MM-$qdS~DeNRd}oh zo*`hPD%6^%qw5CA>#p)&Z`4mBZCo1;?Vlf&;6(9@)mYB81*&BLkx^hGadYlnZloOb zf}uz(jB0TQb9p&q7Z+f&OBof3SxTndnNF5q7HR3 z!3X%|fb+rV)T}1PHU10Cj^-T1jie^%3YrPK_pf{4V@hNlQ103N& z2*bcN$4A@c`tpdIX*}(ps`%!`pVRhbdKRVhX3lqmBLbvEl)$`%UkPytKM>+*{+Mwg z{gj4l^IMzs8HxuT)5OPh)v zzWKh6iLDiw6e&{@dxv4EQ;3ODQ(!0niXO|AHqScO(QKC?+P;R&+Nx|+&RV6f5!Op3 zE3Rgg-Dq>mRR7z5@XsGvM@)TrIrnTORFx*`zzrF|boi$!;=j{Hu_4qVukk zOb;1R6eY_vhpy;lrM4M@?Y|Y|s%8-%B^@6B0n?%obE#x491r&knqu`;BWG}uOCwP+ zQVUTm1_b@}TjW3ds3Lq}wIY19OBb0!SKj8G#?P+qX=+Ml^-|kFXsf2|!QSe-Cv-@A zunv}om6@gJg_KT^mG7uVO_$}`p2mDj%w@{fU@k~Rye>9$)3Ep9>+G@)&~FIL9f;#d zD-__pB-<#p#I+AzO0jjzn7#RvI)ZPTQYbwshs&|}VRW8-nI=umdjm0%SCujt>AGxE z-g2xTnGt}U&8Ol;A2=mq8OK1M&+VClq^N=f5p=h&u>en0&1>=^LlIajYpNF-#DSp+ z89ee6)(sAvJC1se9V+ISe|M;(Kj>sr-D)??~FvD9|J`@+!1Ms zk#cgBRAQrRb|ke1(I{WNK2=M3@nMwQ{X&VPWU~GxalS1LsqUYithv4R%KDu`w(XG6J{^xob%Z} zZL3bua-vABSYzU#o7Nc6T*+L2GDNB$QSiqQN$(z+B_lbKCHRaG2YVO;% z#p|aqI|blr5U4wxNHd9(cOZc%hS{uB6~sz3v<8$i&B-XCB{w|kGn`Gl`5LVfR{B&7 zH)QyW3`Y@83Ch~+$HOC&Cyp3dqFcWrTXahrW0w-Shyi{Q%~6A?MCSBCD~K)J6VXi- zk+-i0$-eGVL3?<@`r9eiG=jCb+Pe!;ljcy-0*)CKt73RiS384bB?FW&j60W@uCU<# z<0_qY+%-qdZlIlTN~*b^Fa_?x!$mL+fiN2{cj(}O#Rvq8jEteVKEq)F_>U!Lk* z-oN?YnWza_J6|GoVTiBWF!Q6&O~+WiPNQ+c70x2RCB<)vL`~h2ZkhN4DVrpU(qRsU z;iJHBs-LwyST>4(kRkAhC5HG13{Zq?3Z1PsygnUw{agDp>nCnk?|L5Xx#qn?X3}?Y ze>vc2K(>|sZtrnv7*9QKmc$?}b+bpdy?htoLvDDgs_Sj%plD>YuO@L^&WJGTV{z{;1t$8-psR z?WvbVH%s3LufOtP`RR?BpsQxRG8UG=D1WHo-&4;V!x1Z=n`FV~(%(K83yC7_LQ9$H zFj2oTUi;!6|M>5lfel4iEd9>ZVZ~Q>hxhL~AE_8TEoW@Ji5-mnM_k8{iH9QsqL5OH zd2*JR?YGmc+&rC2yUx7wX1Z?lnyZ}m6#kRVA0EU%9UWKaJTL-p1%$2?r!_C>w7AeE zY7mDy2(itD!De*hA=eqk2EsGge%V;r{#D;de7woaP%Yuso2D98y z1(x#$)IKgt;U_Uu2PRB-a1#+JW6Dtdof!D6hLn!=Lxg6B9%WIo{f1gP8+o_74{ZFX$2!EQfsx77 zZ5|RwUUUp3Eym*|oBS5Ib9Guod^z&dfj|q>TtdUoAUuOsiG$1ru9fV~$ErXSWm2kW z6Q<+Us6RGK4AQroKVvZBf1eixZeVTx@Iyq?=mm&1+EF_nelza{|Ak)WceI4+y1sfb zlal%EB?O+(sO!elt7$GFraDR{*WCxd?Fm4KD(VyF4b`SbIlC0puM&_i&-!%VTpw`t zKR|deu0vO)&|D_zHDrhN3uvAxw0l1s#5ZQZeC0%Q%KEb#PEwfV(uL;-l=0 z&Q*6C__i!q`?%Pc^5U`FS&zZiie+~0)KzRCSV8SgB`Qr`F|+wIC_&fzREgeIu_e4O zIRuqujXHT*~UmJYDgYD-`7TvI*`3>gGjPADpMN z)MPnj0Z_3Bsvij9FSFP7WtEJE8T<~L-||*o3Zkw#lQEEUgh9nUf2IGx|IC)ao*s7P zCoE;9&*>T7vv&tuwCWphCTy~^)%%|1_`VEE_IES^=MH|-y>jEyWwkcCb>6~M;M^P+ zzJ97s;i8!cx}yNY{BBk=8)m*uQ|VK0H$Rr4(jx4Izf(hh=|9@xF-T_5A(>(q`WL>L zI5t$1v`!yEepmoYq%Et>(*EOBr?#c!Po-@N#=;u`I3nUF^G^7l&H0==?!A3DWG<|G zoTXpuR!EwQzBmCwudcOTkPo|qq2E~U1C(S}e=2!zHS~s!M^fBmt4xTlkoU9kI|-0& zS^4O1Ncud^o5t8!muPU0Xctu5eD8qFcsp&}> zo3DbuU)p!ddLn7RFwICw>C!aT+ll~u*>|=$xcYR(Ju9L+`M%feA8gu-zTjsT zZaF9~ojKv>kyvjoD}a@+lyP2jDf`6`?Ac1TcH}b8^NC4p;?$|?$3G@vVNWyJUaPPl zy^Xji>+>W>+u6~8ZF?<2hI2F~0`}~~sk=S<$f zTqQZX72+;lw2qD*)G{03mz9{{%LY;i8J_nVn_9Z!!*C5;(gzk}=kkbLdP6Va>bI<& za{-3(xymLY!FYy^DLNPQ$*c8LdNh{7eowCi$JDhs5gSAy)mE@ zd?`+hhJ_fC@b>TZw-fD_{NtCYO*$ybbopZx8Upn^Z?XjzuFw>^=o5tV<9Ge=C_Yhq z0~2n$?Ib2wH`TyxqDbQes&9x&l=$zz(J(l4VMM)2_e0B>LYaCL$P-@G))wA9&L5o0 zti#ILjPJ1Q$9XJ3#+)5Yju-pgn~5c(e?cRfiV=<40e93aXr5R}p91&PV$rTvVB#&I zF)_20Mkz`!Jr_Q?kV(96_4@`6__U&Nt3~*bz@W zgjxYCz#1m8C~S?PiT_7++a7?Z%xCqMc8RD&y*%7SXC04V^l>*fIdC-+EKGd6DxPhxA>nbB6Y2@qg}Zd&I*<9UV-Vj4Y?@u zLEZYwLuyGi6VcS*2RRL^S(?0@ydqUHd~bGW?!ZO}0yy~PpRoBErQc;{?(j3X(6%zd z_G8YU)As%<@AagO^#flBgx9ZK0DmD%YdB)B;$X|W9DyMmWD<2x1n}*FAkPz)Ra6)| zo8m7w;eYw}!rN&6(dy`EAOvB$U-TzKS=2X*Sc0}iWK%lq@L!w&nh zlEh>Yf^LF-0TOFyj@EAvjchR4T^E8^{Md1^$oJ5Su_pFg?gbYae-B|M_>=~A7L#M| zcQ*zW&opVB>XiMS%(~5M-TX+kzKa2to1fS0?~T~QmSja|k7Qj6+g}?kIC$loGoSy@ zX&fc)%>4S%8w%aWBDr)O$dV)Mt~&0&`OKUtnu)O<4xjovcJ;2oaCbFAW9+k$yL&Yd z27gEz4tj@>^22;zN>|FCe>@I@EnQ2uFK&v_d~7YO-1QZNmWf1Rh*MUPF4@o!O&{LT z*FpHsggJ7@S5%HXIrpxTFGGQ^zPh4j<_JS2con4=(^buPn$WSi&MYLwShd+@D8DrY zN0-MJXCXWEH!rFN9$~x)+bzQSH*STNCx@~MvhIpt8>uctO=ePE!JuuTbUY)44Xjpu za=P(Kia8YS46q!Z5;=*nv=upHuv&GW#Gi1(*qZYiZJ;oA4#C=(e-WR#?C4Ph$HF z{_*{ZLQagHF4nnOujR+)FR7ouzg7_Pu^@m)q&6E(i#=;`R?1-HK>OS^a-RT{EWnv@ z8g0>=g5`yc8nuz<3rPi$EA?Vl=QOS+=&8j)SV30LgX%&BjBX+N+Ju3&?V(XoG`|vWy}Tbnqub^CKSp>0c~qW6pI*=AU64umPx2xeIAJpy}0Fj=Qs0V~Ik#Rf(L@hEB1;q>83+dfVttdB{vBkBsC`QbnNF-;zCT5|#l zfvd~@sedz90)uq~p}wz=ujrtF4ST45yT&zAMtVx0;?r~`|6E&hPuc15B z*NnCZdT7XSG%(v08+pQ|Xd;3bawUq`MxJYU%`1>pEB>aEuxOm?>>a6!>-|&P@6B97 zL-_d%{o_ogdG?IudffOkc09FcUYxOq2Tr*eLdet6+-%ZW_1cU4Z*9~<+SZd%kw-T6 zi{*{0)V$32brpd$<+U57Z`hL9n>-<~yRLVImO^2?fJBpSFLL&0QdYse^ruvwXKZzj zew-s6UBooy-cZ1E5#r*>(!2X%&C<-p87l!4u{BC7lyZ)8i4FUGVUsRtm~d%i!OrDC ztzf*H@${@R>XfQH$0SPo^Q#Z3!SkUB93Bd;vX~?Ze3=pd%^kbjoWS?<`Uaa&seW## zNdVN?;vCyf=U;-CbIK0?%=v)^@+{1_P_ZH#K2VkJlTgg6k zT6#F7Y23Q_KJK0s;0p;_Gb~&g(dTn3f%qd|sP~2tc@4S{OG2qgtci$M0uaws#wcol zu=hoZWWfyTIHtK7xf7A+o>^`m4SY5&pxbSjVw&RmL2n7$+yOxNS(cC|9!rZGoTDSN z=Fzy%hM#IB>G{;xs1n;*LQSjg`d4yER$`010R8Lc$nzyRFm17xs!Xj)%>-G<{VU== zZpi54n@3HcY*03iyq6dDO@^*+b*|g3$0a)#=pYf(=3Br|{;gy2gFP6)gNs4J4lm0N zcQT&hdDxUTJ$KW-4?umswxA`<)Jo_b=H7k1LU z-hmY|v^%%IAq1;#Yei3e*AD?&9JDW4!)u{_WCP-!)HlFoxB?oRD25^s5)YYvC4r-+ zx#3O`HgMzWgoJ>zwAZ1&gAgHcIb{nILNvO-J2rbY0IC4?6aHwYPx8=X9(YuzRc9Yn z#;UU~Al2b~^V3xm8KD(c|A(ymW9$|uVOo7sJH8}KGniXp@ZZ2XolZk)ue&M&xaNH05eEL7VkRW-gqs(<8gTDVA&905 zx(g>w$Hm-f_^g)wJT+Q~?{xO!dMualgH^@xIwZJ6+uQwZZ$b6e z8J&CWcWeq-`rR1~Hr+Qi%*QQ8z`z$iU1c>>L#`V7y#QwGEYZo7u97!z!D-U+!xG>3 z;ycTFsPDeQTht;^xrXr@`7tR8HjvQ~<`=f!Lm6%y%Roy@>u|)(40U{SolLXMWYkf# zWl=C=3}0QRZ>m5~d8>M}q`k6mgQ`BSF-<||6?m)M1vZ84B6X(&tCM zM!AF`gy=v`9RvU3Q=EMpfxyHW)2l}TIfe0!LcOVdyU}XXim+tGvUS;*EMdFnAVpa& zRzN_M96jngy%(8&kP;c<8h?e*{?>MhY8zfTeTReL%kXC|BQTvhJHEHjXDmtP2lO?-49f_28PZt$># z{FBwj&kMb4+hMfM;r{6Lie}99b(^JF>PWMxF5cj}Abt{KXB&I~zbZMPx~3_TX;_$o zM;Q{=IeSmLc!Ec#nBJoioeoLQr>MtgWWagoDs>A}9Sisx%=sZ0rOoG#WdGU&noAh< zwN&Nw8VJ~75@+Zy4~mdVFO@Phx$Eya=m$7eDjJ3@=Q1?Iw74i2qPu4FFawpC`STKo z|7kf|fzkzC;i5QtucoO(x{og$xM)uF#7MA3mWc~#Npt5P;1IMuii4K%HMR9bNolb5 zXpBgEHP_}lz$A5zKNMI;5V>m1^AYfR`K%MvS`SK}%cBYzdA&@~t-m>J_YzdMv_$eq z|4mD|vaDk01(FV$N9w6F9Ys7vfG|Vf5Ek4OS;!Jxi<2JlY3_vqWAQ5BH7kb{cnw1Tbw;-1O59HFyx0i_S;ZB88p{+2)lkTg zz!QJV%7em9?1sBmIW7>Ggh*|_CqCb!PV_>=y8TY6ma_9Hy#S?(A0 zqFEE@+dD!$fWF%~y{(Yj8&Z#4S&@FN>+y?9F@m>mvln-s{kRL5DETc1)M&p^MxL*Q z_ctE*(%+c$%ME;ZN3yg%-t1QvH#=~+5_>fxf{qmfZ_S4leavzGM^cJ_!3AE9U(7-h z1%lG}#iO^MwlaeLL)aLk3+YKXR0;8!8uS`EjCYCb7*fGEs}yy!A!Tq~rc;ui z;Rvv?e&Gd*V6uGlMn$$;!HlMoqWl%7$=wXV6OX>0nKI`nZ0$kA>s@dx%FeYXHRDGf zpOL^GOBcZB`-J>U5|Lo6J%}efaH2f%-21?FaR4;V#(%l&NFNTbIyLpi$A^e=j|}|{ z_!|41xmKWL?s0(XqKZrg;P&UQ#eMiY4iC!~it3GQuEXv9gn_kt<2h4W z;-1DIK*C)6h88>cDX}$yj9!Yo2vX_Yj-gro4-dq&v_-7E0;-P!YCg|9T%Y(cs5X%+ z>3?ab3 zD;m$dKCP|4Y14M2Stfr!_jjogU?!yc-FXL;l$>13+5{5R`-3=Z5AN95%Q~Yl?wjo0 zvKRk{aeelu&`g8qW|bVy?R;N3o!9Zhs2NGEPJIXQmm#0*$t3j0uV#>h+dnNbkBuV;WtAD- zi;F~1;&lFV9N;s2MqBn5tZk$m`}Y-RzXPG`cjw7iONd8S-zSdBk!4JN8_eGQLM1{Q zW-N6(JSf8MW!-JClgx|D<>U?CqjNE&*EVGXBYX5j^2?|;H_Dx%%hQyXq>&E$7qa$^ z=rwSCbyjChBrCM6#}Nx+aOSQN`n)s6Qn$&CIb^~0YoMs;Y^JC!TY$3(1IUA70o&mexCZ>QCD-+Yd;KSkANlHp6K)E3<+g) zBbyfYnBS4SxU<}|=ZTeGNPsGDBe;_r#Ow}37v!-elD{La8%aME{fBeX>#|f|Y>^Dr z)=5P~IRYRO{YAU#wHv#Hnuy@ka2xUrJl~yYzu*aT9O6H#YG2NrtrPqDjz^frFhlPa zYsWV;PVYW)kYGT~XUZ#o-~et5`<98U@Jih4YXGyJY zY6|LayZeL!tm0ZE{fw41+Lt}G(D74IAoy+L5S;Oam6I34A0%(wauPzcoay|xxiKgi z0j1KM8fi?p%fMt+D~N)KsU{MQj+}byBiyS2PBU%qO8t8mwS}99K5+#GC3Wy<(G|H>*a=bKRg4v;vXRV1T8&X z8+{pHs$JIvh5pP;@57m70~E4&BPsX~(_-5gLANNcQ> z@J*%#R+@@51nfSK=a)~~n>#uTTqBoJ)D8XAi9sdqUhfcae}5F8VpN>Os!sb!oo;km zFz<@bTQI@c%!7ET!LHxL;Dzn$SB=&*jD$ee`kJ5rTK7KwUSuYxLk}u1K0WvcF#<(2 zpSF=GA+9oP*Mvq+L=YsO&2PozEm#`O{ab145q$b;GW7gCo!^<5B;#{gl-K(YQ9e_& z424bhcj}YBhbcHUeve#}1ik;LnAmM21HNNi`>NtsS~{&=!3LD!v>2rc#^;>8Qo%_K ztFEf@b199IB=^QUIy%Z88YOS_we|V9b}8UWHOvOR<4BBWVh)FYa~Todk2i^|<7kK> z7)i-VXZy)*h~1IDY@3M6U7FGG<~j}0P3Fc(p6>83EQSgoFx*~K35n}36-o$7@UZyl zo;lVkm{z<<&(!|5T6)s;X6v^MBK-j6#&G$R3iTIqGHcc5$?hXjpdaf8PrEiEt<0@3 zx=i89C4`~hAFLS7UNT)*1IsTj>1%`&fQH!EtB;wt6wzDR0q8tfRjvBS2JV}vWv+aU z7HfiXatgxYjIl94=AZ4{4tBQY_g%atLhmv$)e}0k=jl1H!$2(8DbLULkuqSS3f42P zj8ai%GHCcOG>u$SO`Z6tj~s~&JuM~qrDdC)G#cQ~e_$3_b6{OaZA@vP|YymY7b@tsuyW7P-K*%+#yem#7EmScs9sr<$6vY z5f%`}Dj*Q({b<{HxpqgZeS%8LZ%>jo`a!O$7V77@>Wm&#Cc2Mw=<8eSh{hTK)MI8 z*>rIaDCv%HCNn<6%@*iRn%;`>i4U5yEZZaSWnl21_u!_ar*vcrc>cAn^U6%5-)*q& z3|zbQcH7xzl$yeGU3EvkIcX(w*AJS7gmWb`sOEW>wG%7>P4-4Uc@rgc3f@$z6} zp}ZxjS;&M!c#K<4pUM5|3W*1_UTBp?^tT7dl(u=(f5r-8fEhIjyU;>%`)unAMLgbSGwLGGWfa&~{SM(29|vfZXt}9p61JFj53hTvK1a z>pQtSA}CzPt`$Q$UAPy?#S76Z>(KaZhE*?V2Y1`Kywex5x9T&{1kIyNUP&b&T}sIp zy%E4<)-xjY^X6xi+19DhOOHnTMd2@=#_(BgeV&VUIYs$a7HN`K4ZQv%luyH^?Ilec zdPU@1f6jJQ#?NM^EDx6eZ<+33goc%nof&nn^N5(-r4tZ|S=H?3$O1ckdiSl+9R>B3 zR}58zHMk?oXIHVhsXnBk{rSYaPMcyTjX(yUMcs^&o@0CbU3iyB#=G*!<3gEySrPFw z45#OFdI3|3_?~fjd4(6b=9#8jOTdgeRrTRfHC?6~c8B7M?`doMTS2C89)qu{c>Pa! zt`PuY)bZzXHaaV~`B4N{ZUKE35=NVHa379bB#B)M_KGb5OUoJjqQN~{+wIGvawB|y zbZg|7(?%-7>q42|k5l7bz{+&K;O2i#?^IQ%1QoLu<{l6Bhh{t?RVB$Bp(tPMS{#0Q zYqD77X}gqVjeo-bZW?(H@>`RSzxzw@(enwGw(2p%rT@5@-2TMl*WZ4-a{9t4>?@3R z>nh^Kjm>!|Vo@F+ToRt8{;4f*8>mLqtf3ZljR^l{hfcfu`haaOPnRhvZ&j7YOdsl5 z41Ij8u0L8a3BKM-o?WqzZ+7?x&R1^%@x)otvZo46YwARH`QR~UK4UFjeT3ons#n$sc90F%fo68cmNnO%L!N5{HVB&jo&*Ft)SAAWGaMb47*8LrrAa`GQwWw^Hgcm%H zzFyNz9u43T4SEGo_}ig00}Kh+$tk)pV2xxQU;S*ou7znVwfw1+-r%2ru=DjmOyl7X zSwf~!A`Nrh{l2faSahhXH}%bidBw1G_nFh;J?Q-@PH?)~I#O|_a$+7J1MvzUTc9A^ zk>W6^`Fj0v4cUZQS6NuiNc5I?V)R^=eqF5#MdA;Cs5w)0+X*L=|IPKD*ZAC7 z0%NgqO2R*ZmJzcH!k-~fgs3|5a2GNIbiak)ryh?>rh8)3ND?n_H*Lnrrr_ zO}B#7(gC^lorMShCt)5H_vLUCh$dVWFgICE8Q=yKexF?#{$4E@&-HY*d|c?&%h~sI zwG|DZD0okObGl~Gy62enNc#RGzvhbXeoiO{>6QkP7mx45SA?(Ee`x&P9yFrz;Ns#s z9nZ5`HY`n>bI?oUEY8ob*YOmRDMP-GrEk!`K^mZ;n#eqQkcpi0TlvC^5c|2k)Z5m+ zdm|RmK_~`@H6?-*PKyRwCC0SsGe(<;TWDece|<#o6ZD(^bJ!+}BVHLwE&Usl;{2JB zTVVCXC9bf9Z*Q8Dc+p;AZfEqr`3qe*#1 z+1c5rZ5v9a4(#(LvR#@-pMA1OqJWh=->cee<5P(g#77LlRkPY-H6!p~WjrEvPMBp6 zAy;3OSt>R*S05NV4hjyY0qxN8?xD;Eq+fo~T?0~p5KZ(S`+8X5~@l?czpGKs{BV+QKYl?WVUP?}lSox{Y!IqO5H7aSZU8hLfi#TA zL~bM95vC1xe4ni}16r?JjLt1qnla`fZQ_uB2l~-R$W4eIl&Y6E5vx!{b>gD)@Z4s* z(xlGC#pUGSpo~c_SO%y2x1GAC&1CCYCfnmpM;!M5=AfzFuK5b-HQM{vGO@oc7}BS0 zRl`(kk){m_M>7FAf9^AkB{VVK(}lrM{Sf=8DP$ro;jM6s(yFA&VAVL{=$bU)*_NHw zYCSmYU-rml$Ovw10 zpdUTb8zVt{$5>iz-7x{Rf|q@^(pGhu6~;>8i-Dg*G@iy#ST zv0Z->peoF#2w?zJ_I?0=2LxnRuT&@V4IjKcoEqgOEe`2H1FLxxxQz!rN>yT3w$Rq( zBdRa>S$@0oP`ba#lgU|g1%%^Jz!-ACS^$)irr3Ae6r0ci>~+Wtt1^v00BBDlEcw=6ka9a=JTJ0v9-3|Uv2fQTRS~kUQT}> zDrSRh*T-8l##@fAwig8DXFvJ!_=QllBj)0Bwl=*Z%|C>^%s5M+Axf^1VPmM_N1OIp z`EODX1Z6UKLf9czrE_!FBb>EI^wZuqnFN1xDHxF&yZWdw$2Y@bpS9;BHFo9E>C(@y z+PO?Eg%9QVX{xchL+Or6b{o5zb>J7bKlI@;&WAE$YlKugtacp4i5mAwXa}T%UYdbX z!E{+(IB#mwuHR@cf*k07LyVDHJsa$UoH)9bPKDrC#(dd=?{gMLwF^Jy-t5o&H5aa= zufPbCLZyQND-KqIcG0q7+p;-X!$=gzApMEV%lLjE))&J@Q|1#H(WziejMN|7?=#fN zh=G}K${_5$gcMoM{eomzdoeT}_R!>=jdJtVlqyat2f`b+4NHrFYQ#Z^uy_7geneV& zCp`8dT88eS&I}#E2o;l#hm_S#9ysN%otCmnXng&8l@t1LQY`en9zG?R2WQCRdS~F( zUop%LZr@98cQdn)rj^fj3pK$@CtL*LM(K_ckVqIYsAi{}K74=>m(?*L%nehS8k7r# z=H}9Go-Lw`6keg@gOxb9v4>$p;JyaJ_tSxhnAo6v4jA_AWSa-`IQTF6Sul)&Dp3E= zF42#YwiI>s#ENwcK6RSiNd!C^92In5llRuy4MhFKXMEmV68p6ee4?fEU%iHk`hax?6xA3ZRbw)pS$Fu_l;m?cilE1QERt>-J}DYkQ~reWlxb z_jII(G;)51;qk56(6U2fus(UvTRPsna__tJ9FeP81)-~s$+Bnb$4QPE(7d=d-q5Tu zn9yxjV7zX{wiIgKzA{_V(U@HJh5fBK`^(k+URM9mYAauRbW8j&RWl+kzP$iVjNPd2`Bk1rWL zD3y40Oa)`ESae>peQ1?U=%I7$TN}+8y=N<9)^4i*^{Za%?Nq2GKK&E diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_company_participants.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_company_participants.svg new file mode 100644 index 000000000..2399e3760 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_company_participants.svg @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_deals.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_deals.png deleted file mode 100644 index 80a07a4221da0b4d25bc24ab507029261093e936..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17646 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 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_deals.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_deals.svg new file mode 100644 index 000000000..bb41f4d4e --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_deals.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_invoices.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_invoices.png deleted file mode 100644 index 8087865323b8d4430e77059a00e10a1e24649a66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15191 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 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_invoices.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_invoices.svg new file mode 100644 index 000000000..3ae87fec9 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_invoices.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_opportunity_participants.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_opportunity_participants.png deleted file mode 100644 index fa309f6c2779a98fcf03eeed3475abdf9a140b8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21795 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 G_UwN_%dCO` diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_opportunity_participants.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_opportunity_participants.svg new file mode 100644 index 000000000..7892f831f --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_opportunity_participants.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_persons.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_persons.png deleted file mode 100644 index 1d4cfa56406a150d6afc2eb720d09d338487da4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18306 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 + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_phones.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_phones.png deleted file mode 100644 index 0c96bf007ccdc9bb9cc09f5630d52d41f017553c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9094 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 C?m86! diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_phones.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_phones.svg new file mode 100644 index 000000000..453e8344c --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_phones.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_products_services.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_products_services.png deleted file mode 100644 index 7ab616aa4aa2a124a86974ce8597648bd85eacde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14171 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 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_products_services.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_products_services.svg new file mode 100644 index 000000000..27b637226 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_products_services.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_projects.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_projects.png deleted file mode 100644 index 492569a91c0d9f0dbd4d6e754b10979940b9e726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13216 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 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_projects.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_projects.svg new file mode 100644 index 000000000..928bc9ed0 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_projects.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_social.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_social.png deleted file mode 100644 index 3ae976f66dd8ef9f9d2c03f780a058e2b2a32994..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18386 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 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_social.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_social.svg new file mode 100644 index 000000000..68940c04e --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_social.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_tags.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_tags.png deleted file mode 100644 index 52c87fb7944efcabaccf29d6540240c718d257e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14622 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 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_tags.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_tags.svg new file mode 100644 index 000000000..2c81264ca --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_tags.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_tasks.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_tasks.png deleted file mode 100644 index 56b0140a6f460de91a13f7712b6c39e1731190de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18012 zcmYIPRa6@dum%d0;!q?=akml*6o=x)Ex0DQYm2+PyF0Y@4?8f7{y)OAc(m*e`1a$n_56jyM7 zkcqOPjh~Z0*RTq<0wz=W(Bz3uRQMf6!g6H5OJB!s!HY0Y*0^^F^p*YJ71Z5tPDSm@ z?`q$hV>~4&y^8tXMg3RjZv)Xl^^9YFA0J4KI_ARS-@8^d2|q4^T7R6LWdtiED^`TS zt=b7na}@*1V)7_Wvl@x-homOkJUjwRNUw`80WZf?`Gl0ZE_tY2IT`x!$BWdzgl<

    8o~+)?rO%q%ZnHe?i&$qJ6lyd%mN_i_av=_{Ya7s0Cy=hO_En!{6a0Fd4-eIJVmasjO<{~7 z;oOhm0zf^;r?G>wX$Gm{w0jq1;B#{* z;Br+x7_6pTGh7}VXn8_%rJXG_3nzawv=5Bh)HXb30f4ELy^>gRH%8j_Y#0j06A~B4 z=4L>r;j3n7fLvv2o%JMM3}^VcPTWxi8V8kT5RMTQmke8!$Ve&Spww~aE0Dx|@y^!u zqAxh6Jh+ptyqxa-px|?w3YAvoFmOZ9s`_b|6=X7cuj+AVSJr}gU3+B^xU;SGT{zpH zfpEgviJ9y~pS~?xTpx<8@;AuF(fD`J!{kcY_dy8SPt1=LHYTxRRyhWFOH(KY6xu<{ zG-3GcCgJ8#^Alb{##JS$P#drg2H=Ot=#dhiDRc}JwsRysGfl1uVj(`(^r(|1&9qMh z_!m(ohBrPj@_nvJoD!=CME_y_tI>0y^rDW(6*$(*a^Ot$mPQZ1@DTvFjzc^}woKvG+1?;J7pem=vaVWQ+v4Vgw`phvBMM2P6-+W;gN3xh(+gP&K2yR(lc7;Du4Fd2A|<51;hgaCW5N82$lVM z=Uc#1p_BnMCgE|}EX~@|_*dqYjI$hOh8xl>xUQ{uGCEJ^OOC(Q`zK;OcfY228)OS* z48!=&5s-SCcaC#I^ceu02#M?~>(qHJcD8{lY?}wcwef(N-&Z+#8|2f(b*E~`WcZ&F zE>~QQzk5s{g={3N{t)~y`JJ7`vsS3Wv^$RV6w)~USBEPl#?fNaaA}2c`^CJ=PpJ;Iym29o#-6)8*^e9N9EGmHn-j5%IfZPx7PV57wh*7GUK)1gT-X#Qya3P^Q8a`WHv{YjO)&QZ=L zqYx{)Fa$6~=PbekfM6PWq8qJe@Ld-~^dy5)Dp$2?!GjDYPtH$ebhVN}40xj*LST_% zp$3m52=C+CpVMf{p9Fmu7ZKDmX=Q?{K7cMdOsU-Mnm!vOFk5f~3k~_(IzgLm7#3Ns z9|-!_Xlo0B%Xv#n#Ej0d(|WF#K(X);sYWH4fjliVBHEs`>OX3Kkvs%fs$+oBhtb=a6E^xU{-Tzwt4wR|3kxQiG&oJV@5<(Y^%CVR;{;L><1FHsxkNChcZ8Bt0_i9QS zC|pd{3Y*yW+vG71R7-IrG0`gqkQJ2_@9cR3;SB^3$y7wU6d0XHZU@*?j0?eW+6h3BM9JHtTnpG~0kHVxzY<&w9*bDuO$>QsvT00j>8OAsbiwIP z53!V|+WNg$(*jcYz6B!XjDAU$u@!8|iaBfA)giw!jO5WZLydG9|6BIb310l=*bJhF zV3XC7CU z^*4pRfql69#&xCgZ!1F;GBIwpf@y7+C^>4Ej)4vauqvt+ralHY@u26G$R$i}bRL90 zm?m|@LDFjcs(W(cgT^<6CY^pSygGe6Y{HoV#+ufnS5=u^HDB)Zln?4mZr6=Az}Qi) zkW&&{zhT)q+%pZaMD{d}DX3WEk5P6M_wOKZ=e)Q6E(I_X<_6yXdQD~&=afoIDG9Jy zBNf~^DY>a;+C7e$-qjg5jA+h`IkfKMz8x~vaus;TxE)Ywd#t$NQv2TivPYB76QLNU zCQ00ui(?$d!pbtj9RrZcw!2|cz7$c;E42NHI>b&Rf1L0bi}p6Qa~M9a#NKu7Pp@Bm z`3Nl){b)#l?zoOsQI||2{AGc5DvDu5;4yXPVv55q0%QEOJBy?4ORpf&K9|WUOV`R% z_Q{+=-^!-COmH*vmfp!hXq&3qc-6%0x&}hy{xt7Wu zBXm^dvB@%zuLe0KJiT8S{{R&$x23pGiqK^^f-Ck^zWXYU!Ix0=3@rkYy8Okk-zSOX zHD(t{_?M0>XxgKPK(C+D!HS>El9o5kH9J$DB%#D6jA4~gJ3j@_<qS%+hQw8nXIN7EuthZZhKzQD+&;@Tzds*cC~JWF^@`OY+Xv#PU9#q+29k)R&1O;k)fljD>2?`{kJ1CHn_4>!XZ$PVGfzhHa`k zqAC*l^NV)kkN-K;w=GHI2!bwMl7 zy~2|pJ1@O{3$(kcZ;!Nn_q2@9g?*2ceRuCaj&}>N&p&UMk92PD*~%D(o+LXx%|Yvj zGMh4+dXX9y)SBy*#y4M6c+J4wv_z8 z3klze4|ncb13j)R>eviZS04cfg!&*eQ&TaZhGpgDYJb;NpS<;IYiq@5Te7&*%FZ9p z7L_J+YQFppo)0-0R`u&G+LTI2b|i!l@rGKQ@N~ZOY=_nlzZz*Bnt>d!uF?n; z`95qQ)z0_;SVPbRBCiu55JL3RgcK0@Li&BT7M~VHQntL@&M!d7)*RQhZ9gdUj}g|I z+gx$j*G|g~PXazCV%NB)CC$$tBh2p@W9Ox-DuDzDQ}x|3@jk#Wm6yEXHo?XL%k2!o z>lYS5^*TTi$83Zw80$r;L@Gp663{K#{2%#o$^Nr!*5v*~&|i zt<6l^j=rr06Lv{62h!wtDz7iFCBY4?vZc=26OIPDjQUOZts9$3jm%EOThF2Y_Wrki z3?<*~_~y{t!`|{;3ujjiyX*bY_u)b>Yu(j7! z6XR-d9e*rS-q9`I$idAJaMiWw6dBOi3E;8G#PvsA<+HT;asgcoL^A%?sn8)yQ0f3a zUT||sZ)Y<&88ww873pG~&C0Pd{bIYU4fK!++-{Bp&DR2)Ou!~@cCOE&>%+g@J0H%8 zK5F2FnbWVQw+U>pM#6E`1d2nSN#>fl=QU76UtK^%m;fd&E-ngS^eV)Ujf10{xtO;9 z7<@3U`=Sb9vjnQxs9CDucdi011yMAO#2DM&-Hq4CnJdK%15tIf} zBqW~WHJx2EcC7aDO^ri!BMhKM@662}Swrd%>z z_{?WRBi;M>uX5LC(Qb72nTtO_TyT)~r)M^|7_$%!MDcU8G>}W>kEqS@LEJj>C6O?@dU!d z@KeY-j9*?hefwJnj~CyuQHyyM-n7TC-AE@9MA}me@MMjySy&8mv%ztW&w*=tZ9W5A#gBbHgNYOv?PYlv!yis%MIU12F(ON|xv)IGsQ#E7IP18Il( zMETUi@?=5>3;EWKkMne|Zz0I*$JixR<;AdojcPlv}@e#Qx>So6JkdZ!(!r z`nk>D#TTy;TdSt`totec@=+5N?UWm%l!V2A(nESt^Ig??(_K@h7FOF+dH z?^XlsKnwrt0FwBgHc@PJbTo=C{FaIFEuE$V^4*@6Kg8$}A&t6GzEr1X#8e@Gg!tV{ z-vw9(N@Rf@tbtNzhC+KTL=iWz(m~Mt7x@mG{=dO)Ts3G@h}kI+rcupSRkKTWqyB+E`gshDNq4^s6lo~?03QVPIrnhFzUD^AS2ck!?7_yf zPrc(uneJc>!NuL5*4dldov|N`;ZcVxJq$5E2yrjt#j4{51{xbd811&h(5+1CoRvy+ z*ozI=27oU?_SO87{KIjUL1_1;|5Aeu=P+(S4fuM6s)rS&ZNLLD@1 zSXaAU-$F^}sOkbldU7cfE9iEse(Ev&Qp1W6?85AhJX# z>f;d&K5VIUD{~rVTKVazpV?h5G484b?nDnRnF$e?!sPA2h!ff{X R|A)W=q{QS!>x2!1{|_tiMri;5 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-tasks.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-tasks.svg new file mode 100644 index 000000000..fcac863d6 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-tasks.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import_contacts.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import_contacts.png deleted file mode 100644 index f502d6252b284e63ab17581c033b5aa1826bcf51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15764 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 SDlLlu0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/integration.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/integration.png deleted file mode 100644 index 46eb165085befccd065317477b21f5612a791584..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10862 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 Eg0CywF#rGn diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/integration.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/integration.svg new file mode 100644 index 000000000..9a8a2c8cd --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/integration.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/invoice.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/invoice.png deleted file mode 100644 index 7b6f1f5d2130a4c28d81727719e6e17d6152892b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12780 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/loader-dark-24.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/loader-dark-24.svg new file mode 100644 index 000000000..bbf0e7b53 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/loader-dark-24.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/mail_icons.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/mail_icons.png index 0a5a2b990dec44fc7e2d26accc7676b524160b1b..34af1164c67df823ee41a5c37b152bfdc3589186 100644 GIT binary patch delta 793 zcmV+!1Lpjh2Bij&8Gi-<006Ha-7o+E010qNS#tmY3ljhU3ljkVnw%H_0004VQb$4n zuFf3k00004XF*Lt006O%3;baP0008INklc!@uf;)l z8Bs~v2KO*I27iX;fP`)&jJ8A;4B_E$sKa%*`d~14APp0k$z-Nz>#C}DbGcky)`5oL zLTq4+b+Xy)cQku&XB8I4Y#$bM=W#Gx53DD)UsAhWXchXrzJ#<#F(p=s>O{IV`yXrhn!_=fDQJl0;c}nFrrMz9b3a z42;9s?Igv*l-Z>15p}a98T4hr5dMkg+bRwm*EW0V6C#PgXQ7q;&JJsRj>ico>t z$i`5Qi^XE(aujhEoZ$@3V~T)gBpa`@sO5yP7#@bzqa}!TTt57;H`gU*ooobs2azys z0bcYs0CrNEhb0)R?dsrPRqXe<-EN1;Yc`vaW(2AKws8Gi!+005Z5Edl@l0cB83R7C&)0RR90|NsC0|NsC0|6*cdXJ=<^ zZEbCCZhU-vgNTiZiHVh!m7JWMtE{cEva+|gx5LB3#KgqK#l^dCU$;rvd(ACP& z*2~Mw&CSiuLI%%41kXkb&`cB1P8ZQ#E78%>(o!4JR36gO(tp%$L)AkA)z#J3Vlmd% z*4N+V*hB=`h-TT@+1cUe+S=ONM+Vz-M%#2q+ly-3n0(vY+uV3f+?;{j+}z!LRNdX( z-RA7x-rnC@Am4yh--24;ubklE;NeLJ;kTyY;o;&+2jfc#<4z6ZPY&aUL)q_=H~A8=VL18Wi97tFXw16=h)Qf zhFj@#KUKlwdP(Z%=<4d~>+0<5>+9?E`|OBZ?CPE!B@0t6%>Jd|$$00CY} zL_t(I%bm{WTf#692JoV^(yEk-pvA3-h=N;D+~VHi#657~Kuh!Y+cqV=M$kv!4{d(A z7qXp~O{`YeCWdAl>D{vP#>ypn#m zK{=TN?|%gk?ej>?&#r;=Ns`ZgfC^hRbZPg%^wu5p_`~_k>Z9es>#K{+(Y5D-!zby} z^zl@9!F0#|!QRgLQh(zxcKhze%3@Db@0nR|UY-xNjNOoa4WZWAC-7e9wtXIYUK{J# zin@E8Y*w?2WnB>?vBZ()L@W}4#!+QaR6!S6Wq(u=SYKBIiJE9v0_)<5b`#b&&XUHSk_zdersGm$8jF!UvYzAD`re9=7zS=cialzF#gzzxmU1$64b5xhCzR9 zD~kCdiM!Z@e~yEENCZJB<#NhS$_~Mbah|f1u2c8RetEyBOXdsDZC`AlFz0;$0000< LMFvhpu0mjfZ+XEW diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/mail_send.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/mail_send.png deleted file mode 100644 index 84203a4955b20dbbf1684b06bdc7bc74d787b956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12662 zcmaibV{|4#({`}2ZEtMbxnthp#*#2C~H# zr&*ar&MBjoAY8W9_OoLOEcK@MCrwoeiH{H2igD`oU}qWOET^W_lKF`$&MBUEO6isK z7I+z}7Ia9UzRJj{up9>-`voNn!~0)&y)J1V%#r=I$>j1Q`J&lX9^k^Uq^%?VUyvH9 zk=-&1+FngyrZri<>Lq(BZiPU({Kzb&2^*A}X+)ASHmaSatt|zd{=BW8d>Um)+{s$= zfdHKGSf}X0?V19y)wM`jMGAFwL%9BHDFoEaLIB5ZReAI3$Pa%nO;Z`=Zbcs>edCbj zTZd}XJI5$ZtuzBZ&C;LNycT-h5ti9qX|i`)C+$K-TW+NlZDz=-f{xUqVYvm(O^T+% z+!oG|4on>BZd8>l6-Dc^2>f(12@{O$yM_+{b`2z*^=P`g#+$0eMYXchW}vM$+ewii zAcXTWch#)wVok_28iz(bnmb}1r0y_@x1{uEsO-cWs0j{6vU(V}m4!ubdzA6}xs+Ti z#@a(-8vfh0l;c*?L##2Hk#HBqgszaag)ItA>7tUYIA&^Bx~z-xP~2xFv&!4~R_SNE z+Z#jdiV;I{If(Ita=+Ba`h&{bO}%kdRY99L-a(QIP}-Im=U-G!vW;#4dY=@srByu~ zCWm6(joeOo+FRAWD6(HxlxRKW&Xo<ucx4U- zi!!p=$_k-G(;?4CRmMtCRi<3M*DgTWEO&k#RhyIGm$l7&jVD8@sqD|aP*-C1uZ}d_ z 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 Bnil{7 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/mail_send.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/mail_send.svg new file mode 100644 index 000000000..32a43b884 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/mail_send.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/people_widget.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/people_widget.png deleted file mode 100644 index 68375c7cf36abe00643772f26cdd2746b960ee44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1937 zcmV;C2X6R@P)w(bVwxNAEf*z`5}Z`2XbKOACvFj-ARtA+11Shasss{9 zK$}7;Ayg!kmbA3u0jUjY0zyDTssK$DB_)Y;n*SmAs8NM^ScH-D^?7~R@ zp0jh#`Ty_y_mMo$!@bXu?>&pf9!WyC_7v*x9R2e zXIqMhTolYAZl|Y^%N5a>(qP17ynkgB$6mPzMfRHHKtLSx{vQD3e9=bdx;h;CEM0-O zbRCj7ar+Nd)gr?9T?f=;cd5s*s9DBDm0~T+d7wUH~ zRj`qrvM`yoXqw90%9wa!XR`=b@syWs0@qtmW23qzPZ~xz;n*%DYBu0jl7dH)#5MRo zAO~P_y{RsOSX8~^IG(#~0A+V!levy_F03n0x~@~v$t+>cyj=E>hy_JB_S%lSd?##e zi7mKs+H{U+A@#{p!I^6ulJ99k=Ol4~h$iE}?v+0daa=Y4;cN@|08?)HGOsm23$31i zacOq1=Sj$y9Pj9t+kY=fbNP5n0dV9SyM-NqqFEWM{Dn15v;1>Ol71?LNP@dpU96~} zq7BJ6!%GBwS0GW#^pB9P&`;)~lI|}??OS(YVls!p-e39QCP26Z;|MUq;XH5Dv5P4Y zcAhIzvKSeL!Z#R>vgGlI6DOuMgHhJQhY!k?`22ufS$p zXLALN-+UEnrXVhYTQ>(jorot+%d!GiMa;yTBFlaX9=dt^;Hnj=tk6)TR!3dePZ$wl zC`thJMhKCx_V7F)kk>>*NW`OPtdAqv@)`78ItR(Za`7SFHdR5yQi3q;*%-bktU&9~XzUXDg z$02%wkftLTlwcK0NKa%Cjm2<#*f+hjdGAq-4IZ84wPnYy51t7{N*A__go4jJ|J?V@ zmX05wl+PnvOH(TmWU^CGX@Z6ie-|fC{4)2{fwu1~wZtw3Km#>#nD#wi6Oa99Y-~WA z$T<)oZua#eJv>mUR{WnU& zJGbpTEy?&9*}jGQqHdlBxE!Vjzo%)zQz2dN)^we_B%~RdDs3(rj**c*yms;!#(L}1@hBH z%<~T|<(*?^xpXrV*T`-a<^z^)ogmnq+ zYZ7?>;(O@1{C6Y?&ZAN~5X%?(HuZ)j(D6K8Q-8VgBcN32HEibN~Do z_IK~WbSZ=L{~pA^Es+lz zVYsL-H^sr3$0@e2@5x-0=m^xAWq~G=AT56(o?W4FgatB}i+SB;W zZ{NVW*0n5PHB}8(NKu0jRg)hrc|{KVLQ&Kf@_*?enb4-zoOC?DbpD1xf*9nLLMj)^TThL}ic26MIes3Hl$69gcdmDf2R5r_W^ X-VSxQk0{vj00000NkvXXu0mjfG+U(J diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/people_widget.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/people_widget.svg new file mode 100644 index 000000000..fc54e1f44 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/people_widget.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/sales.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/sales.png deleted file mode 100644 index 86dcfc0352cc2c6261ccc40f59c080599ed7c669..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8546 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 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/sales.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/sales.svg new file mode 100644 index 000000000..d3295d3c6 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/sales.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/tasks_widget.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/tasks_widget.png deleted file mode 100644 index 340e064c84cec44d3c246516e0b35c1b19bff4c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1252 zcmV#E?yry^AiYr3;B#Ya-59LHhqXkM*W zQLop}v(mZQ+1XQbb8{zM*PW}?YUl6WyAPN5xsJ=koX_qxtbRGbmg4T(8k)@6PC$Xb z6-d##B04^p%l*MK)E?H@Z2E=Q%H;A6Fkywj#!a_c4;iK#K;~scp{;3l@y~LIrwH>9wymsz0%)j_j4Ee1a-(ltQyR6K? zD~lKK-06kbo^Myb!uMB}kV+7e7Apg8v%X~ubo1IzTU`PCT^LSJom>44J3Bkr+Szz9|cI+AC^Lb=48N7F@jLnD6h9Xs7 z`FXo*6-=d52_%zA3=9llXlO_>9AB@lqSE-MTV4}-HDlarI+SO!@gO>C|I5?$h)ql=&DwKeVyCJ=cRWxf|oAcaC9q`1>hX#cI4927kZ-`miez* zGPXyo-e5YDFp@P=hWOES`EKtWC9`ev!{L1AQo8wwVl5lk?eVc#8xv8UAFz7=G2v3m zN%eS?VM=@4oC_rl(GqaiBfh<$ + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/web_to_leads.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/web_to_leads.png deleted file mode 100644 index 118d0e07a900837eddf2e732afdc1a1bacc27f23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4545 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 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/web_to_leads.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/web_to_leads.svg new file mode 100644 index 000000000..37c176fec --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/web_to_leads.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Calls.aspx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Calls.aspx.cs index 6d375f08c..89e0150b8 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Calls.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Calls.aspx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.Web.CRM.Controls.Settings; namespace ASC.Web.CRM diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Cases.aspx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Cases.aspx.cs index 222c68403..461f08256 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Cases.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Cases.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/BasePage.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/BasePage.cs index b6827dfa5..9a932949f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/BasePage.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/BasePage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/BaseUserControl.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/BaseUserControl.cs index 7458107c1..640a00b7a 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/BaseUserControl.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/BaseUserControl.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/CRMSettings.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/CRMSettings.cs index 385cb503d..581baf3de 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/CRMSettings.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/CRMSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -45,6 +45,7 @@ public SMTPServerSetting() HostPassword = String.Empty; SenderDisplayName = String.Empty; SenderEmailAddress = String.Empty; + UseNtlm = false; } public SMTPServerSetting(ASC.Core.Configuration.SmtpSettings smtpSettings) @@ -57,6 +58,7 @@ public SMTPServerSetting(ASC.Core.Configuration.SmtpSettings smtpSettings) HostPassword = smtpSettings.CredentialsUserPassword; SenderDisplayName = smtpSettings.SenderDisplayName; SenderEmailAddress = smtpSettings.SenderAddress; + UseNtlm = smtpSettings.UseNtlm; } [DataMember] @@ -83,6 +85,8 @@ public SMTPServerSetting(ASC.Core.Configuration.SmtpSettings smtpSettings) [DataMember] public String SenderEmailAddress { get; set; } + [DataMember] + public bool UseNtlm { get; set; } } [Serializable] @@ -114,24 +118,31 @@ public static InvoiceSetting DefaultSettings } } + ///true [DataMember] public bool Autogenerated { get; set; } + ///Prefix [DataMember] public String Prefix { get; set; } + ///Number [DataMember] public String Number { get; set; } + ///Terms [DataMember] public String Terms { get; set; } + ///CompanyName [DataMember] public String CompanyName { get; set; } + ///123 [DataMember] public Int32 CompanyLogoID { get; set; } + ///CompanyAddress [DataMember] public String CompanyAddress { get; set; } } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/CSVReader.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/CSVReader.cs index adce42d37..a07263f42 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/CSVReader.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/CSVReader.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/CSVReaderExtension.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/CSVReaderExtension.cs index 7f0017b35..626877c21 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/CSVReaderExtension.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/CSVReaderExtension.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/ContactPhotoManager.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/ContactPhotoManager.cs index 7f161954d..3dbf39291 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/ContactPhotoManager.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/ContactPhotoManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -630,7 +630,10 @@ public static ImageFormat CheckImgFormat(byte[] imageData) public class PhotoData { + ///url public string Url; + + ///path public string Path; } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/Global.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/Global.cs index e046dfce1..62cef2e3b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/Global.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/Global.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/ImportFromCSVManager.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/ImportFromCSVManager.cs index af22b25d8..e814245af 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/ImportFromCSVManager.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/ImportFromCSVManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/InvoiceFormattedData.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/InvoiceFormattedData.cs index 94a889f14..7774edddf 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/InvoiceFormattedData.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/InvoiceFormattedData.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/LocalizedEnumConverter.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/LocalizedEnumConverter.cs index 7d039b358..2b8f0cbd0 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/LocalizedEnumConverter.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/LocalizedEnumConverter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/OrganisationLogoManager.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/OrganisationLogoManager.cs index 6b78fb64e..74bab2032 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/OrganisationLogoManager.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/OrganisationLogoManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/PathProvider.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/PathProvider.cs index 6449af00e..42b5ddc7b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/PathProvider.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/PathProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/RegisterClientScriptHelper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/RegisterClientScriptHelper.cs index 11ba200a7..da64ee88b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/RegisterClientScriptHelper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/RegisterClientScriptHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -368,6 +368,22 @@ public static void DataDealFullCardView(BasePage page, Deal targetDeal) var tags = daoFactory.TagDao.GetEntityTags(EntityType.Opportunity, targetDeal.ID); var availableTags = daoFactory.TagDao.GetAllTags(EntityType.Opportunity).Where(item => !tags.Contains(item)); + var contactInfoJson = "null"; + + if (targetDeal.ContactID != 0) + { + var contactInfo = daoFactory.ContactDao.GetByID(targetDeal.ContactID); + if(contactInfo != null) + { + contactInfoJson = JsonConvert.SerializeObject(new + { + id = contactInfo.ID, + displayName = contactInfo.GetTitle().HtmlEncode().ReplaceSingleQuote(), + smallFotoUrl = ContactPhotoManager.GetSmallSizePhoto(contactInfo.ID, contactInfo is Company) + }); + } + } + var responsibleIDs = new List(); if (CRMSecurity.IsPrivate(targetDeal)) { @@ -377,11 +393,12 @@ public static void DataDealFullCardView(BasePage page, Deal targetDeal) var script = String.Format(@" var dealTags = {0}; var dealAvailableTags = {1}; - var dealResponsibleIDs = {2}; ", + var dealResponsibleIDs = {2}; + var contactForInitTaskActionPanel = {3}; ", JsonConvert.SerializeObject(tags.ToList().ConvertAll(t => t.HtmlEncode())), JsonConvert.SerializeObject(availableTags.ToList().ConvertAll(t => t.HtmlEncode())), - JsonConvert.SerializeObject(responsibleIDs) - ); + JsonConvert.SerializeObject(responsibleIDs), + contactInfoJson); page.RegisterInlineScript(script, onReady: false); page.JsonPublisher(customFieldList, "customFieldList"); diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SignalRHelper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SignalRHelper.cs index 6fd59f006..9d7902e30 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SignalRHelper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SignalRHelper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaAccountNotFound.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaAccountNotFound.cs index 4623bc5e1..5a65f449d 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaAccountNotFound.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaAccountNotFound.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaImageDescription.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaImageDescription.cs index f53f6e838..d72c78bba 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaImageDescription.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaImageDescription.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,8 +21,13 @@ namespace ASC.Web.CRM.Classes.SocialMedia { public class SocialMediaImageDescription { + ///0 public SocialNetworks SocialNetwork { get; set; } + + ///url to img public string ImageUrl { get; set; } + + ///Identity public string Identity { get; set; } } } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaUI.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaUI.cs index aee2b4ce5..b3147a871 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaUI.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/SocialMediaUI.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/TwitterApiHelper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/TwitterApiHelper.cs index f17502f6a..410f6cb5d 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/TwitterApiHelper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SocialMedia/TwitterApiHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/StringConverter.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/StringConverter.cs index 39fb93dc2..a9c5ad953 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/StringConverter.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/StringConverter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SubscriptionManager.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SubscriptionManager.cs index 2648974a7..62b1ce7a9 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/SubscriptionManager.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/SubscriptionManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/TwilioController.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/TwilioController.cs index e65d686c0..e8f41012e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/TwilioController.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/TwilioController.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Linq; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/UrlConstant.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/UrlConstant.cs index a4f73520a..708cb8a02 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/UrlConstant.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/UrlConstant.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/UrlParameters.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/UrlParameters.cs index d51b7fbe6..98ea8669c 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/UrlParameters.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/UrlParameters.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Classes/VoipEngine.cs b/web/studio/ASC.Web.Studio/Products/CRM/Classes/VoipEngine.cs index 5f40a8c42..67514f51f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Classes/VoipEngine.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Classes/VoipEngine.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Linq; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Configuration/CRMsSpaceUsageStatManager.cs b/web/studio/ASC.Web.Studio/Products/CRM/Configuration/CRMsSpaceUsageStatManager.cs index 22f2a2b63..8cd2f47e4 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Configuration/CRMsSpaceUsageStatManager.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Configuration/CRMsSpaceUsageStatManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,7 +33,7 @@ public class CRMSpaceUsageStatManager : SpaceUsageStatManager { public override List GetStatData() { - using (var filedb = DbManager.FromHttpContext(FileConstant.DatabaseId)) + using (var filedb = new DbManager(FileConstant.DatabaseId)) { var q = new SqlQuery("files_file f") .Select("b.right_node") diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Configuration/ProductEntryPoint.cs b/web/studio/ASC.Web.Studio/Products/CRM/Configuration/ProductEntryPoint.cs index 2b60e8beb..ae3a88c94 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Configuration/ProductEntryPoint.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Configuration/ProductEntryPoint.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -261,9 +261,10 @@ public static void ConfigurePortal() EnableAuth = smtp.RequiredHostAuthentication, }; - if (!string.IsNullOrEmpty(smtp.HostLogin) && !string.IsNullOrEmpty(smtp.HostPassword)) + if (newSettings.EnableAuth && !string.IsNullOrEmpty(smtp.HostLogin) && !string.IsNullOrEmpty(smtp.HostPassword)) { newSettings.SetCredentials(smtp.HostLogin, smtp.HostPassword); + newSettings.UseNtlm = smtp.UseNtlm; } CoreContext.Configuration.SmtpSettings = newSettings; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Configuration/SearchHandler.cs b/web/studio/ASC.Web.Studio/Products/CRM/Configuration/SearchHandler.cs index a6ee94346..b2296e722 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Configuration/SearchHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Configuration/SearchHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Configuration/VoipModule.cs b/web/studio/ASC.Web.Studio/Products/CRM/Configuration/VoipModule.cs index a31f23136..06cf42ed4 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Configuration/VoipModule.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Configuration/VoipModule.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/CasesActionView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/CasesActionView.ascx.cs index 86246ece6..fb5d27cef 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/CasesActionView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/CasesActionView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/CasesDetailsView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/CasesDetailsView.ascx.cs index 3e1cf4ea3..4ea617bba 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/CasesDetailsView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/CasesDetailsView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/CasesFullCardView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/CasesFullCardView.ascx.cs index 9acddb412..58e09b8af 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/CasesFullCardView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/CasesFullCardView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/ListCasesView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/ListCasesView.ascx.cs index e6acf3031..9e7268842 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/ListCasesView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Cases/ListCasesView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ButtonsSidePanel.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ButtonsSidePanel.ascx.cs index 9c751c937..c58381020 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ButtonsSidePanel.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ButtonsSidePanel.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; namespace ASC.Web.CRM.Controls.Common diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/FileUploader.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/FileUploader.ascx.cs index e37338488..e598202d2 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/FileUploader.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/FileUploader.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/HistoryView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/HistoryView.ascx.cs index 55ce193d6..b2d48cde2 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/HistoryView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/HistoryView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ImportFromCSVView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ImportFromCSVView.ascx.cs index f4cf87974..95a8e9e2f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ImportFromCSVView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ImportFromCSVView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -76,7 +76,7 @@ protected void InitForContacts() ImportStartingPanelDescriptionLabel = CRMContactResource.ImportStartingPanelDescription; ImportStartingPanelButtonLabel = CRMContactResource.ImportStartingPanelButton; - ImportImgSrc = WebImageSupplier.GetAbsoluteWebPath("import_contacts.png", ProductEntryPoint.ID); + ImportImgSrc = WebImageSupplier.GetAbsoluteWebPath("import_contacts.svg", ProductEntryPoint.ID); Page.RegisterClientScript(new Masters.ClientScripts.ImportFromCSVViewDataContacts()); RegisterClientScriptHelper.DataUserSelectorListView(Page, "_ImportContactsManager", null); @@ -99,7 +99,7 @@ protected void InitForOpportunity() ImportStartingPanelDescriptionLabel = CRMDealResource.ImportStartingPanelDescription; ImportStartingPanelButtonLabel = CRMDealResource.ImportStartingPanelButton; - ImportImgSrc = WebImageSupplier.GetAbsoluteWebPath("import-opportunities.png", ProductEntryPoint.ID); + ImportImgSrc = WebImageSupplier.GetAbsoluteWebPath("import-opportunities.svg", ProductEntryPoint.ID); Page.RegisterClientScript(new Masters.ClientScripts.ImportFromCSVViewDataDeals()); @@ -128,7 +128,7 @@ protected void InitForTask() ImportStartingPanelDescriptionLabel = CRMTaskResource.ImportStartingPanelDescription; ImportStartingPanelButtonLabel = CRMTaskResource.ImportStartingPanelButton; - ImportImgSrc = WebImageSupplier.GetAbsoluteWebPath("import-tasks.png", ProductEntryPoint.ID); + ImportImgSrc = WebImageSupplier.GetAbsoluteWebPath("import-tasks.svg", ProductEntryPoint.ID); Page.RegisterClientScript(new Masters.ClientScripts.ImportFromCSVViewDataTasks()); } @@ -147,7 +147,7 @@ protected void InitForCase() ImportStartingPanelDescriptionLabel = CRMCasesResource.ImportStartingPanelDescription; ImportStartingPanelButtonLabel = CRMCasesResource.ImportStartingPanelButton; - ImportImgSrc = WebImageSupplier.GetAbsoluteWebPath("import-cases.png", ProductEntryPoint.ID); + ImportImgSrc = WebImageSupplier.GetAbsoluteWebPath("import-cases.svg", ProductEntryPoint.ID); Page.RegisterClientScript(new Masters.ClientScripts.ImportFromCSVViewDataCases()); diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ListBaseView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ListBaseView.ascx.cs index 8995767f5..a08123ec6 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ListBaseView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ListBaseView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/NavigationSidePanel.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/NavigationSidePanel.ascx.cs index 28c439846..1a3e2d328 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/NavigationSidePanel.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/NavigationSidePanel.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/PrivatePanel.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/PrivatePanel.ascx.cs index 31bbf2c21..b096e84b6 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/PrivatePanel.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/PrivatePanel.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ResultsView.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ResultsView.cs index 844180ae5..dda562613 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ResultsView.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Common/ResultsView.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactActionView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactActionView.ascx.cs index 6ffe448d0..56c894bf0 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactActionView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactActionView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactDetailsView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactDetailsView.ascx.cs index 10e78959f..6bc92d6b4 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactDetailsView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactDetailsView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ using ASC.FederatedLogin.LoginProviders; using ASC.Web.Core; using ASC.Web.Core.Mobile; +using ASC.Web.Core.Utility; using ASC.Web.CRM.Classes; using ASC.Web.Studio.Utility; @@ -71,9 +72,16 @@ protected void Page_Load(object sender, EventArgs e) if (TargetContact is Company) ExecPeopleContainerView(); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/Products/Projects/App_Themes/dark/dark-allprojects.less"); + } + else + { + Page.RegisterStyle("~/Products/Projects/App_Themes/default/css/allprojects.less"); + } - Page.RegisterStyle("~/Products/Projects/App_Themes/default/css/allprojects.less") - .RegisterBodyScripts("~/Products/Projects/js/base.js") + Page.RegisterBodyScripts("~/Products/Projects/js/base.js") .RegisterBodyScripts("~/Products/Projects/js/projects.js"); RegisterScript(); } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactFullCardView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactFullCardView.ascx.cs index 4af48207f..a3324870c 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactFullCardView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ContactFullCardView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ListContactView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ListContactView.ascx.cs index 484715e2e..31932eaac 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ListContactView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Contacts/ListContactView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/DealActionView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/DealActionView.ascx.cs index 61947df96..63aea4400 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/DealActionView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/DealActionView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/DealDetailsView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/DealDetailsView.ascx.cs index a8d73c740..10a0e3410 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/DealDetailsView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/DealDetailsView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/DealFullCardView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/DealFullCardView.ascx.cs index 3d2f01071..090a32d3c 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/DealFullCardView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/DealFullCardView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/ListDealView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/ListDealView.ascx.cs index ee3e631e9..6a076b887 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/ListDealView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Deals/ListDealView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Invoices/InvoiceActionView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Invoices/InvoiceActionView.ascx.cs index d063d68e1..f764facd2 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Invoices/InvoiceActionView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Invoices/InvoiceActionView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Invoices/InvoiceDetailsView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Invoices/InvoiceDetailsView.ascx.cs index 1e7958ec6..3fc5e78f6 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Invoices/InvoiceDetailsView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Invoices/InvoiceDetailsView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Invoices/ListInvoiceView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Invoices/ListInvoiceView.ascx.cs index f02361ecc..f086fa83c 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Invoices/ListInvoiceView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Invoices/ListInvoiceView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Reports/ReportsNavigation.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Reports/ReportsNavigation.ascx.cs index 132ef00c9..31b82bb81 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Reports/ReportsNavigation.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Reports/ReportsNavigation.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + #region Import using System; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Reports/ReportsView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Reports/ReportsView.ascx.cs index 605a9697d..80113f5cb 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Reports/ReportsView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Reports/ReportsView.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + #region Import using System; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Sender/SmtpSender.ascx b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Sender/SmtpSender.ascx index d18647d10..54eb0b1f9 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Sender/SmtpSender.ascx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Sender/SmtpSender.ascx @@ -131,7 +131,7 @@ - " alt=""/> + " alt=""/> <%= String.Format(CRMContactResource.MassSendInfo.HtmlEncode(), "
    ")%> diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Sender/SmtpSender.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Sender/SmtpSender.ascx.cs index 10e4a33f7..32fc20af8 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Sender/SmtpSender.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Sender/SmtpSender.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CommonSettingsView.ascx b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CommonSettingsView.ascx index 3edf4e24f..d1e982d99 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CommonSettingsView.ascx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CommonSettingsView.ascx @@ -16,7 +16,7 @@ - " + " alt="<%= CRMSettingResource.ExportData %>" /> diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CommonSettingsView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CommonSettingsView.ascx.cs index 4657b7552..fa7fda421 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CommonSettingsView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CommonSettingsView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CurrencySettingsView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CurrencySettingsView.ascx.cs index 3e41aa4a0..1f93bb6b3 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CurrencySettingsView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CurrencySettingsView.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Web; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CustomFieldsView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CustomFieldsView.ascx.cs index d743fa1e8..35a841025 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CustomFieldsView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/CustomFieldsView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/DealMilestoneView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/DealMilestoneView.ascx.cs index 6a379249e..d8ede0a9d 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/DealMilestoneView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/DealMilestoneView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/InvoiceItemActionView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/InvoiceItemActionView.ascx.cs index 09369bf04..ce73592c7 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/InvoiceItemActionView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/InvoiceItemActionView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/InvoiceItemsView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/InvoiceItemsView.ascx.cs index 3a6e821a9..1361ce9de 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/InvoiceItemsView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/InvoiceItemsView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/InvoiceTaxesView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/InvoiceTaxesView.ascx.cs index 218d43716..571e5d415 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/InvoiceTaxesView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/InvoiceTaxesView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/OrganisationProfile.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/OrganisationProfile.ascx.cs index bc0427a4d..1374fc0dc 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/OrganisationProfile.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/InvoiceSettings/OrganisationProfile.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/ListItemView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/ListItemView.ascx.cs index a61a6460a..e42dfcaa9 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/ListItemView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/ListItemView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/SettingsHeaderView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/SettingsHeaderView.ascx.cs index 8262c6382..f01b72ba4 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/SettingsHeaderView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/SettingsHeaderView.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; namespace ASC.Web.CRM.Controls.Settings diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/TagSettingsView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/TagSettingsView.ascx.cs index 21a87e75f..14a729d9f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/TagSettingsView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/TagSettingsView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/TaskTemplateView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/TaskTemplateView.ascx.cs index a0347959f..a4088b679 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/TaskTemplateView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/TaskTemplateView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -57,7 +57,7 @@ protected void Page_Load(object sender, EventArgs e) var emptyScreenControl = new EmptyScreenControl { - ImgSrc = WebImageSupplier.GetAbsoluteWebPath("empty_screen_tasks.png", ProductEntryPoint.ID), + ImgSrc = WebImageSupplier.GetAbsoluteWebPath("empty_screen_tasks.svg", ProductEntryPoint.ID), Header = CRMSettingResource.EmptyContentTaskTemplates, Describe = CRMSettingResource.EmptyContentTaskTemplatesDescript, ButtonHTML = String.Format("
    {0}", diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipCalls.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipCalls.ascx.cs index 45fb0cf4f..15759b0df 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipCalls.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipCalls.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,7 +44,7 @@ protected void Page_Load(object sender, EventArgs e) var emptyScreenControl = new EmptyScreenControl { ID = "voip-calls-empty-list-box", - ImgSrc = WebPath.GetPath("UserControls/Feed/images/empty_screen_feed.png"), + ImgSrc = WebPath.GetPath("UserControls/Feed/images/empty_screen_feed.svg"), Header = UserControlsCommonResource.VoipCallsNotFound, Describe = UserControlsCommonResource.VoipCallsNotFoundDescription }; @@ -53,7 +53,7 @@ protected void Page_Load(object sender, EventArgs e) var emptyScreenFilterControl = new EmptyScreenControl { ID = "voip-calls-empty-filter-box", - ImgSrc = WebPath.GetPath("UserControls/Feed/images/empty_filter.png"), + ImgSrc = WebPath.GetPath("UserControls/Feed/images/empty_filter.svg"), Header = UserControlsCommonResource.FilterNoVoipCalls, Describe = UserControlsCommonResource.FilterNoVoipCallsDescription, ButtonHTML = string.Format("{0}", diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipCommon.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipCommon.ascx.cs index 49f543306..c6c766f4b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipCommon.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipCommon.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipNumbers.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipNumbers.ascx.cs index 6ab870e9b..37a6c95a5 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipNumbers.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipNumbers.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipQuick.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipQuick.ascx.cs index 838d6baa6..652005fb7 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipQuick.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/VoipSettings/VoipQuick.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/WebToLeadFormView.ascx b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/WebToLeadFormView.ascx index e7ac31414..1ea42ac94 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/WebToLeadFormView.ascx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/WebToLeadFormView.ascx @@ -13,7 +13,7 @@
    - " /> + " /> <%= CRMSettingResource.WebToLeadsFormHeader%> diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/WebToLeadFormView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/WebToLeadFormView.ascx.cs index e1c050725..31e7b1b25 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/WebToLeadFormView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Settings/WebToLeadFormView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Tasks/ListTaskView.ascx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Tasks/ListTaskView.ascx.cs index b13715712..73b73ae57 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Controls/Tasks/ListTaskView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Controls/Tasks/ListTaskView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/CRMConstants.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/CRMConstants.cs index 10d11bb10..fb079df98 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/CRMConstants.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/CRMConstants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/DIHelper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/DIHelper.cs index 2c25e201c..7f0414450 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/DIHelper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/DIHelper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.Common.Data; using ASC.Common.DependencyInjection; using ASC.CRM.Core.Dao; @@ -40,7 +40,7 @@ public static void Register() var container = AutofacConfigLoader.Load("crm"); - container.Register(c => DbManager.FromHttpContext("default")) + container.Register(c => new DbManager("default")) .AsSelf() .As() .InstancePerRequest(); diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/AbstractDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/AbstractDao.cs index 2c608197e..275beecad 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/AbstractDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/AbstractDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CasesDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CasesDao.cs index b4a54fb95..ec2bb30c4 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CasesDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CasesDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CommentDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CommentDao.cs index 2eee726a0..3a80d91d2 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CommentDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CommentDao.cs @@ -1,17 +1,17 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ContactDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ContactDao.cs index e47f67d98..4be07ed68 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ContactDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ContactDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ContactInfoDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ContactInfoDao.cs index 83251d1bb..21a4c9820 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ContactInfoDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ContactInfoDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CurrencyInfoDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CurrencyInfoDao.cs index fb85be282..550864373 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CurrencyInfoDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CurrencyInfoDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CurrencyRateDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CurrencyRateDao.cs index 8ab1b24f5..8a9112833 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CurrencyRateDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CurrencyRateDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CustomFieldDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CustomFieldDao.cs index b69005db9..63dfed21b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CustomFieldDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/CustomFieldDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/DaoFactory.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/DaoFactory.cs index 06e83bc2e..e50238ae4 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/DaoFactory.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/DaoFactory.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/DealDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/DealDao.cs index 0cb8e67d7..886634e55 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/DealDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/DealDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/DealMilestoneDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/DealMilestoneDao.cs index aed7b744f..89f7bacfe 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/DealMilestoneDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/DealMilestoneDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/FileDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/FileDao.cs index 0253df821..d9cfb2531 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/FileDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/FileDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceDao.cs index a39b0345c..6050f114a 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceItemDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceItemDao.cs index 88f9faed3..3d42e81ee 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceItemDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceItemDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -373,7 +373,7 @@ private void DeleteBatchItemsExecute(List items) var ids = items.Select(x => x.ID).ToArray(); //using (var tx = db.BeginTransaction(true)) - ///{ + //{ Db.ExecuteNonQuery(Delete("crm_invoice_item").Where(Exp.In("id", ids))); // tx.Commit(); //} diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceLineDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceLineDao.cs index 147f3fda1..a393e2fbd 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceLineDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceLineDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceTaxDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceTaxDao.cs index 0ae371028..c7b05a7a0 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceTaxDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/InvoiceTaxDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ListItemDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ListItemDao.cs index b5f949bcf..27f37dc77 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ListItemDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ListItemDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ListItemHistoryDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ListItemHistoryDao.cs index 65ebfc0eb..ec8387819 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ListItemHistoryDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ListItemHistoryDao.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + #region Import using System; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ManagerDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ManagerDao.cs index 29c127415..be9493214 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ManagerDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ManagerDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/RelationshipEventDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/RelationshipEventDao.cs index 2f7aa5caa..afcb2a453 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/RelationshipEventDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/RelationshipEventDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ReportDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ReportDao.cs index 21d94e960..dac8a6753 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ReportDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/ReportDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/SearchDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/SearchDao.cs index 89e9088e6..d460ae25f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/SearchDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/SearchDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -315,10 +315,10 @@ private SearchResultItem[] ToSearchResultItem(IEnumerable rows) url = String.Format("Default.aspx?id={0}", id); if (contact is Company) - imageRef = WebImageSupplier.GetAbsoluteWebPath("companies_widget.png", + imageRef = WebImageSupplier.GetAbsoluteWebPath("companies_widget.svg", ProductEntryPoint.ID); else - imageRef = WebImageSupplier.GetAbsoluteWebPath("people_widget.png", + imageRef = WebImageSupplier.GetAbsoluteWebPath("people_widget.svg", ProductEntryPoint.ID); break; @@ -332,7 +332,7 @@ private SearchResultItem[] ToSearchResultItem(IEnumerable rows) url = String.Format("Deals.aspx?id={0}", id); - imageRef = WebImageSupplier.GetAbsoluteWebPath("deal_widget.png", + imageRef = WebImageSupplier.GetAbsoluteWebPath("deal_widget.svg", ProductEntryPoint.ID); break; } @@ -344,7 +344,7 @@ private SearchResultItem[] ToSearchResultItem(IEnumerable rows) url = String.Format("Cases.aspx?id={0}", id); - imageRef = WebImageSupplier.GetAbsoluteWebPath("cases_widget.png", + imageRef = WebImageSupplier.GetAbsoluteWebPath("cases_widget.svg", ProductEntryPoint.ID); break; @@ -357,7 +357,7 @@ private SearchResultItem[] ToSearchResultItem(IEnumerable rows) url = ""; - imageRef = WebImageSupplier.GetAbsoluteWebPath("tasks_widget.png", + imageRef = WebImageSupplier.GetAbsoluteWebPath("tasks_widget.svg", ProductEntryPoint.ID); break; } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/TagDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/TagDao.cs index 88e35eb08..e3d59e207 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/TagDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/TagDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/TaskDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/TaskDao.cs index 509841b37..bb9f815c0 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/TaskDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/TaskDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/TaskTemplateContainerDao.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/TaskTemplateContainerDao.cs index a32eb1039..35a40e453 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/TaskTemplateContainerDao.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Dao/TaskTemplateContainerDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/DomainObject.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/DomainObject.cs index 32f5ef958..b58a2ddd1 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/DomainObject.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/DomainObject.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,7 @@ namespace ASC.CRM.Core [Serializable] public class DomainObject { - + ///1234 [DataMember(Name = "id")] public virtual int ID { diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Cases.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Cases.cs index 432e3ffc4..b60032302 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Cases.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Cases.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Comment.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Comment.cs index 9ec730851..353979db8 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Comment.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Comment.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Contact.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Contact.cs index b423e1ffe..90d9dc60b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Contact.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Contact.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/ContactInfo.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/ContactInfo.cs index a169d5f5a..27611b75a 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/ContactInfo.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/ContactInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/CurrencyInfo.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/CurrencyInfo.cs index 08f0ce2e8..80a9941b5 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/CurrencyInfo.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/CurrencyInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/CurrencyRate.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/CurrencyRate.cs index 40b7032de..0facac40e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/CurrencyRate.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/CurrencyRate.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,15 +20,19 @@ namespace ASC.CRM.Core { + ///ASC.CRM.Core.DomainObject,ASC.WEB.CRM [DataContract] public class CurrencyRate : DomainObject { + ///fromCurrency [DataMember(Name = "fromCurrency")] public string FromCurrency { get; set; } + ///toCurrency [DataMember(Name = "toCurrency")] public string ToCurrency { get; set; } + ///1.1 [DataMember(Name = "rate")] public decimal Rate { get; set; } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/CustomField.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/CustomField.cs index 8c3cbd3a0..4aeb0f00a 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/CustomField.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/CustomField.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Deal.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Deal.cs index f999e9e31..ab2e92f7a 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Deal.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Deal.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/DealMilestone.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/DealMilestone.cs index 28edd4efb..b73397e53 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/DealMilestone.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/DealMilestone.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Filter.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Filter.cs index 7d6048568..780c49b47 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Filter.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Filter.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + #region Import using System; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Invoice.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Invoice.cs index bdceb7136..ff9beb87e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Invoice.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Invoice.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/InvoiceItem.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/InvoiceItem.cs index 08c7b8ad2..f8a6d520e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/InvoiceItem.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/InvoiceItem.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/InvoiceLine.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/InvoiceLine.cs index 648296340..2d3434e92 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/InvoiceLine.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/InvoiceLine.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * */ + namespace ASC.CRM.Core.Entities { public class InvoiceLine : DomainObject diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/InvoiceTax.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/InvoiceTax.cs index 8ac8ff214..cdc41acce 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/InvoiceTax.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/InvoiceTax.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/ListItem.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/ListItem.cs index 71973a5a7..d2413b83d 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/ListItem.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/ListItem.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/ListItemHistory.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/ListItemHistory.cs index cb0c2ad17..f0bc8d1c7 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/ListItemHistory.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/ListItemHistory.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; namespace ASC.CRM.Core.Entities diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/OrderBy.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/OrderBy.cs index 3067e2ff6..afbdca349 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/OrderBy.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/OrderBy.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/RelationshipEvent.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/RelationshipEvent.cs index 9ae43cc04..ddabe8bfd 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/RelationshipEvent.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/RelationshipEvent.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Report.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Report.cs index 2fd823068..b717bbff0 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Report.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Report.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Task.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Task.cs index b4c0e9899..ab3dcc9bd 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Task.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/Task.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/TaskTemplateContainer.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/TaskTemplateContainer.cs index 28fedb24d..ea82a7cb0 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/TaskTemplateContainer.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Entities/TaskTemplateContainer.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/BidTypeEnum.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/BidTypeEnum.cs index 1fc4aa2ac..90eae39b7 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/BidTypeEnum.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/BidTypeEnum.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/CommunicationTypeEnum.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/CommunicationTypeEnum.cs index 0a95a27b7..1356b2164 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/CommunicationTypeEnum.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/CommunicationTypeEnum.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactInfoCategoryEnum.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactInfoCategoryEnum.cs index 973d9b4ea..938b9080a 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactInfoCategoryEnum.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactInfoCategoryEnum.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactInfoTypeEnum.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactInfoTypeEnum.cs index 8bd812a60..25597a334 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactInfoTypeEnum.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactInfoTypeEnum.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactListViewTypeEnum.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactListViewTypeEnum.cs index cdc04f068..e54f4709b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactListViewTypeEnum.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactListViewTypeEnum.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactSelectorTypeEnum.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactSelectorTypeEnum.cs index 14441a846..59483c4c7 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactSelectorTypeEnum.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ContactSelectorTypeEnum.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * */ + namespace ASC.CRM.Core { public enum ContactSelectorTypeEnum diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/CustomFieldTypeEnum.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/CustomFieldTypeEnum.cs index 4451429e1..493499fa7 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/CustomFieldTypeEnum.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/CustomFieldTypeEnum.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/DealMilestoneStatus.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/DealMilestoneStatus.cs index 4587d1b11..e092c892f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/DealMilestoneStatus.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/DealMilestoneStatus.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/EntityTypeEnum.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/EntityTypeEnum.cs index 1c11c3882..b3d460cf2 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/EntityTypeEnum.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/EntityTypeEnum.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/InvoiceStatus.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/InvoiceStatus.cs index 3982f7174..7e8d265c9 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/InvoiceStatus.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/InvoiceStatus.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/InvoiceTemplateTypeEnum.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/InvoiceTemplateTypeEnum.cs index 0e3aef8de..b85b6186b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/InvoiceTemplateTypeEnum.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/InvoiceTemplateTypeEnum.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ListTypeEnum.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ListTypeEnum.cs index 2a92ace31..2ce5ceea6 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ListTypeEnum.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ListTypeEnum.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ProgressStatus.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ProgressStatus.cs index 800543a12..e26662f39 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ProgressStatus.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ProgressStatus.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.CRM.Core { public enum ProgressStatus diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ReportTimePeriodEnum.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ReportTimePeriodEnum.cs index f60bccfe9..dee216512 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ReportTimePeriodEnum.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ReportTimePeriodEnum.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.CRM.Core { public enum ReportTimePeriod diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ReportTypeEnum.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ReportTypeEnum.cs index 94dbdefb8..007932cd8 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ReportTypeEnum.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ReportTypeEnum.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.CRM.Core { public enum ReportType diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ShareType.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ShareType.cs index 6abd613d4..dd3625f39 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ShareType.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/ShareType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/SortedByTypeEnum.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/SortedByTypeEnum.cs index f41502902..88bd35afa 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/SortedByTypeEnum.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Enums/SortedByTypeEnum.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/BundleSearch.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/BundleSearch.cs index 2b6cf6554..e6bfd4096 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/BundleSearch.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/BundleSearch.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Collections.Generic; using System.Linq; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/CasesWrapper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/CasesWrapper.cs index ad78fb014..f4d9ffd52 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/CasesWrapper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/CasesWrapper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Core; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/ContactsWrapper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/ContactsWrapper.cs index 552dbd115..3e75fac64 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/ContactsWrapper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/ContactsWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/DealsWrapper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/DealsWrapper.cs index 663a452ae..503e987e4 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/DealsWrapper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/DealsWrapper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Core; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/EmailWrapper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/EmailWrapper.cs index 0ac8a07b3..3a7c2c359 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/EmailWrapper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/EmailWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/EventsWrapper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/EventsWrapper.cs index c8c70c2a4..e86525455 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/EventsWrapper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/EventsWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/FieldsWrapper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/FieldsWrapper.cs index 4ffea4954..cc9051d70 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/FieldsWrapper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/FieldsWrapper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Core; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/InfoWrapper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/InfoWrapper.cs index a879c9f44..3971e7799 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/InfoWrapper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/InfoWrapper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/InvoicesWrapper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/InvoicesWrapper.cs index f40068d8c..3c917bf9c 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/InvoicesWrapper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/InvoicesWrapper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Core; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/TasksWrapper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/TasksWrapper.cs index 03351d842..434c5934f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/TasksWrapper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Search/TasksWrapper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using ASC.Core; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Security/CRMSecurityObjectProvider.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Security/CRMSecurityObjectProvider.cs index 87fd5a981..162deda3b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Security/CRMSecurityObjectProvider.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Security/CRMSecurityObjectProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Security/CRMSecutiry.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Security/CRMSecutiry.cs index 4d7b6db68..5db65566a 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Security/CRMSecutiry.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Security/CRMSecutiry.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Core/Security/FileSecurityProvider.cs b/web/studio/ASC.Web.Studio/Products/CRM/Core/Security/FileSecurityProvider.cs index 2e7b7cb02..e799d47a7 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Core/Security/FileSecurityProvider.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Core/Security/FileSecurityProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Deals.aspx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Deals.aspx.cs index 39508c0c7..8f8863d3a 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Deals.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Deals.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Default.aspx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Default.aspx.cs index a73b5a41e..db3551299 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Default.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Default.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Help.aspx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Help.aspx.cs index 169b524ee..cfd993354 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Help.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Help.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/ContactPhotoHandler.cs b/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/ContactPhotoHandler.cs index ef02f96ca..7508364f3 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/ContactPhotoHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/ContactPhotoHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/FileHandler.ashx.cs b/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/FileHandler.ashx.cs index e0241bb67..0ce73e5ea 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/FileHandler.ashx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/FileHandler.ashx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/FileUploaderHandler.cs b/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/FileUploaderHandler.cs index f1e3da984..2728cce75 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/FileUploaderHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/FileUploaderHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ using System; using System.Web; +using ASC.Core; using ASC.CRM.Core.Dao; using ASC.Files.Core; using ASC.Web.CRM.Core; @@ -34,22 +35,25 @@ public class FileUploaderHandler : FileUploadHandler { public override FileUploadResult ProcessUpload(HttpContext context) { + if (!SecurityContext.IsAuthenticated) + { + throw new HttpException(403, "Access denied."); + } + var fileUploadResult = new FileUploadResult(); if (!FileToUpload.HasFilesToUpload(context)) return fileUploadResult; var file = new FileToUpload(context); - if (String.IsNullOrEmpty(file.FileName) || file.ContentLength == 0) + var fileName = System.IO.Path.GetFileName(file.FileName); + + if (String.IsNullOrEmpty(fileName) || file.ContentLength == 0) throw new InvalidOperationException(CRMErrorsResource.InvalidFile); if (0 < SetupInfo.MaxUploadSize && SetupInfo.MaxUploadSize < file.ContentLength) throw FileSizeComment.FileSizeException; - var fileName = file.FileName.LastIndexOf('\\') != -1 - ? file.FileName.Substring(file.FileName.LastIndexOf('\\') + 1) - : file.FileName; - using (var scope = DIHelper.Resolve()) { var daoFactory = scope.Resolve(); diff --git a/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/ImportFileHandler.cs b/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/ImportFileHandler.cs index 1d667f14c..0efc68285 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/ImportFileHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/ImportFileHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/OrganisationLogoHandler.cs b/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/OrganisationLogoHandler.cs index 511d630fd..dfe1c9b50 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/OrganisationLogoHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/OrganisationLogoHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/WebToLeadFromHandler.ashx.cs b/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/WebToLeadFromHandler.ashx.cs index 28ddfc76e..28c109f8e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/WebToLeadFromHandler.ashx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/HttpHandlers/WebToLeadFromHandler.ashx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Invoices.aspx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Invoices.aspx.cs index 889de1ee5..583fd3e11 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Invoices.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Invoices.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/MailViewer.aspx.cs b/web/studio/ASC.Web.Studio/Products/CRM/MailViewer.aspx.cs index 230ce6461..f3d975438 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/MailViewer.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/MailViewer.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Masters/BasicTemplate.Master.cs b/web/studio/ASC.Web.Studio/Products/CRM/Masters/BasicTemplate.Master.cs index c7e7c5da7..e2db4d430 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Masters/BasicTemplate.Master.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Masters/BasicTemplate.Master.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ using ASC.Web.Core; using ASC.Web.Core.Client.Bundling; +using ASC.Web.Core.Utility; using ASC.Web.CRM.Controls.Common; using ASC.Web.CRM.Masters.ClientScripts; @@ -48,7 +49,7 @@ protected void InitControls() SideNavigation.Controls.Add(LoadControl(NavigationSidePanel.Location)); Master - .AddStaticStyles(GetStaticStyleSheet()) + .AddStaticStyles(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark ? GetStaticDarkStyleSheet() : GetStaticStyleSheet()) .AddStaticBodyScripts(GetStaticJavaScript()) .RegisterInlineScript("ASC.CRM.NavSidePanel.init();"); } @@ -96,20 +97,17 @@ public StyleBundleData GetStaticStyleSheet() return (StyleBundleData) new StyleBundleData("crm", "crm") .AddSource(PathProvider.GetFileStaticRelativePath, - "common.less", - "tasks.less", - "cases.less", - "contacts.less", - "deals.less", - "invoices.less", - "fg.css", - "socialmedia.less", - "settings.less", - "voip.common.less", - "voip.quick.less", - "voip.numbers.less", - "voip.calls.less", - "reports.less"); + "crm.less", + "fg.css"); + } + public StyleBundleData GetStaticDarkStyleSheet() + { + return (StyleBundleData) + new StyleBundleData("dark-crm", "crm") + .AddSource(ResolveUrl, + "~/Products/CRM/App_Themes/dark/dark-crm.less") + .AddSource(PathProvider.GetFileStaticRelativePath, + "fg.css"); } } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/CRMSettingsResources.cs b/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/CRMSettingsResources.cs index 831063672..e4b64f11b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/CRMSettingsResources.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/CRMSettingsResources.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,24 +40,24 @@ protected override IEnumerable> GetClientVariables( { var imgs = new Dictionary { - {"empty_screen_filter", WebImageSupplier.GetAbsoluteWebPath("empty_screen_filter.png")}, - {"empty_screen_tasks", WebImageSupplier.GetAbsoluteWebPath("empty_screen_tasks.png", ProductEntryPoint.ID)}, - {"empty_screen_deals", WebImageSupplier.GetAbsoluteWebPath("empty_screen_deals.png", ProductEntryPoint.ID)}, - {"empty_screen_cases", WebImageSupplier.GetAbsoluteWebPath("empty_screen_cases.png", ProductEntryPoint.ID)}, - {"empty_screen_invoices", WebImageSupplier.GetAbsoluteWebPath("empty_screen_invoices.png", ProductEntryPoint.ID)}, - {"empty_screen_products_services", WebImageSupplier.GetAbsoluteWebPath("empty_screen_products_services.png", ProductEntryPoint.ID)}, - {"empty_screen_taxes", WebImageSupplier.GetAbsoluteWebPath("empty_screen_taxes.png", ProductEntryPoint.ID)}, - {"empty_screen_persons", WebImageSupplier.GetAbsoluteWebPath("empty_screen_persons.png", ProductEntryPoint.ID)}, - {"empty_screen_phones", WebImageSupplier.GetAbsoluteWebPath("empty_screen_phones.png", ProductEntryPoint.ID)}, - {"empty_screen_voip_settings", WebImageSupplier.GetAbsoluteWebPath("empty_screen_voip_settings.png", ProductEntryPoint.ID)}, + {"empty_screen_filter", WebImageSupplier.GetAbsoluteWebPath("empty_screen_filter.svg")}, + {"empty_screen_tasks", WebImageSupplier.GetAbsoluteWebPath("empty_screen_tasks.svg", ProductEntryPoint.ID)}, + {"empty_screen_deals", WebImageSupplier.GetAbsoluteWebPath("empty_screen_deals.svg", ProductEntryPoint.ID)}, + {"empty_screen_cases", WebImageSupplier.GetAbsoluteWebPath("empty_screen_cases.svg", ProductEntryPoint.ID)}, + {"empty_screen_invoices", WebImageSupplier.GetAbsoluteWebPath("empty_screen_invoices.svg", ProductEntryPoint.ID)}, + {"empty_screen_products_services", WebImageSupplier.GetAbsoluteWebPath("empty_screen_products_services.svg", ProductEntryPoint.ID)}, + {"empty_screen_taxes", WebImageSupplier.GetAbsoluteWebPath("empty_screen_taxes.svg", ProductEntryPoint.ID)}, + {"empty_screen_persons", WebImageSupplier.GetAbsoluteWebPath("empty_screen_persons.svg", ProductEntryPoint.ID)}, + {"empty_screen_phones", WebImageSupplier.GetAbsoluteWebPath("empty_screen_phones.svg", ProductEntryPoint.ID)}, + {"empty_screen_voip_settings", WebImageSupplier.GetAbsoluteWebPath("empty_screen_voip_settings.svg", ProductEntryPoint.ID)}, {"empty_people_logo_40_40", WebImageSupplier.GetAbsoluteWebPath("empty_people_logo_40_40.png", ProductEntryPoint.ID)}, - {"empty_screen_opportunity_participants", WebImageSupplier.GetAbsoluteWebPath("empty_screen_opportunity_participants.png", ProductEntryPoint.ID)}, - {"empty_screen_company_participants", WebImageSupplier.GetAbsoluteWebPath("empty_screen_company_participants.png", ProductEntryPoint.ID)}, - {"empty_screen_case_participants", WebImageSupplier.GetAbsoluteWebPath("empty_screen_case_participants.png", ProductEntryPoint.ID)}, - {"empty_screen_projects", WebImageSupplier.GetAbsoluteWebPath("empty_screen_projects.png", ProductEntryPoint.ID)}, - {"empty_screen_userfields", WebImageSupplier.GetAbsoluteWebPath("empty_screen_userfields.png", ProductEntryPoint.ID)}, - {"empty_screen_tags", WebImageSupplier.GetAbsoluteWebPath("empty_screen_tags.png", ProductEntryPoint.ID)}, - {"empty_screen_twitter", WebImageSupplier.GetAbsoluteWebPath("empty_screen_twitter.png", ProductEntryPoint.ID)} + {"empty_screen_opportunity_participants", WebImageSupplier.GetAbsoluteWebPath("empty_screen_opportunity_participants.svg", ProductEntryPoint.ID)}, + {"empty_screen_company_participants", WebImageSupplier.GetAbsoluteWebPath("empty_screen_company_participants.svg", ProductEntryPoint.ID)}, + {"empty_screen_case_participants", WebImageSupplier.GetAbsoluteWebPath("empty_screen_case_participants.svg", ProductEntryPoint.ID)}, + {"empty_screen_projects", WebImageSupplier.GetAbsoluteWebPath("empty_screen_projects.svg", ProductEntryPoint.ID)}, + {"empty_screen_userfields", WebImageSupplier.GetAbsoluteWebPath("empty_screen_userfields.svg", ProductEntryPoint.ID)}, + {"empty_screen_tags", WebImageSupplier.GetAbsoluteWebPath("empty_screen_tags.svg", ProductEntryPoint.ID)}, + {"empty_screen_twitter", WebImageSupplier.GetAbsoluteWebPath("empty_screen_twitter.svg", ProductEntryPoint.ID)} }; return new List>(1) diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ClientLocalizationResources.cs b/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ClientLocalizationResources.cs index c8c79b921..213de6705 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ClientLocalizationResources.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ClientLocalizationResources.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ClientTemplateResources.cs b/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ClientTemplateResources.cs index 59a4e21b9..0401f7e71 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ClientTemplateResources.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ClientTemplateResources.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ControlsResources.cs b/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ControlsResources.cs index a10441b05..9db57bec2 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ControlsResources.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Masters/ClientScripts/ControlsResources.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Reports.aspx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Reports.aspx.cs index d08f6d50b..f83075db4 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Reports.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Reports.aspx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + #region Import using ASC.Web.CRM.Classes; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.Designer.cs b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.Designer.cs index 8b3dc992d..81a4825e5 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.Designer.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.Designer.cs @@ -564,6 +564,15 @@ public static string Currency_AlgerianDinar { } } + /// + /// Looks up a localized string similar to Angolan Kwanza. + /// + public static string Currency_AngolanKwanza { + get { + return ResourceManager.GetString("Currency_AngolanKwanza", resourceCulture); + } + } + /// /// Looks up a localized string similar to Argentinian Peso. /// @@ -1203,6 +1212,15 @@ public static string Currency_VenezuelanBolivar { } } + /// + /// Looks up a localized string similar to Venezuelan Bolivar Soberano. + /// + public static string Currency_VenezuelanBolivarSoberano { + get { + return ResourceManager.GetString("Currency_VenezuelanBolivarSoberano", resourceCulture); + } + } + /// /// Looks up a localized string similar to Vietnamese Dong. /// diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.resx b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.resx index e57b9cf60..149c82bc1 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.resx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Resources/CRMCommonResource.resx @@ -977,4 +977,10 @@ Ethiopian Birr + + Angolan Kwanza + + + Venezuelan Bolivar Soberano + \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Sender.aspx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Sender.aspx.cs index 650740821..01b1f6d13 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Sender.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Sender.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Services/NotifyService/NotifyClient.cs b/web/studio/ASC.Web.Studio/Products/CRM/Services/NotifyService/NotifyClient.cs index 5c9f2784e..daf533a74 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Services/NotifyService/NotifyClient.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Services/NotifyService/NotifyClient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Services/NotifyService/NotifyConstants.cs b/web/studio/ASC.Web.Studio/Products/CRM/Services/NotifyService/NotifyConstants.cs index 53af6c8a0..d48f089d5 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Services/NotifyService/NotifyConstants.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Services/NotifyService/NotifyConstants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Services/NotifyService/NotifySource.cs b/web/studio/ASC.Web.Studio/Products/CRM/Services/NotifyService/NotifySource.cs index 8b01dd962..7252f892f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Services/NotifyService/NotifySource.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Services/NotifyService/NotifySource.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Settings.aspx b/web/studio/ASC.Web.Studio/Products/CRM/Settings.aspx index ba11a3d32..f62b4b19f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Settings.aspx +++ b/web/studio/ASC.Web.Studio/Products/CRM/Settings.aspx @@ -34,7 +34,7 @@ diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Settings.aspx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Settings.aspx.cs index 586178ac8..b7a8a6302 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Settings.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Settings.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Tasks.aspx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Tasks.aspx.cs index ad43a5ee9..901c84f44 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Tasks.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Tasks.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Templates/CasesTemplates.html b/web/studio/ASC.Web.Studio/Products/CRM/Templates/CasesTemplates.html index 2d9eb7699..2a0998c45 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Templates/CasesTemplates.html +++ b/web/studio/ASC.Web.Studio/Products/CRM/Templates/CasesTemplates.html @@ -27,7 +27,7 @@ diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Templates/CommonTemplates.html b/web/studio/ASC.Web.Studio/Products/CRM/Templates/CommonTemplates.html index bb3fa9b0c..edbe6d421 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Templates/CommonTemplates.html +++ b/web/studio/ASC.Web.Studio/Products/CRM/Templates/CommonTemplates.html @@ -26,7 +26,7 @@ ${ASC.CRM.Resources.CRMSettingResource.AddTagInProgressing} + {{if ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0}}src="${StudioManager.GetImage('loader_16.gif')}"{{else}}src="${StudioManager.GetImage('loader-dark-16.svg')}"{{/if}} /> diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Templates/ContactSelectorTemplates.html b/web/studio/ASC.Web.Studio/Products/CRM/Templates/ContactSelectorTemplates.html index 0608eea6e..c78f0d037 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Templates/ContactSelectorTemplates.html +++ b/web/studio/ASC.Web.Studio/Products/CRM/Templates/ContactSelectorTemplates.html @@ -24,7 +24,7 @@
    - + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Templates/ContactsTemplates.html b/web/studio/ASC.Web.Studio/Products/CRM/Templates/ContactsTemplates.html index 45862aa23..6b5aa9c4a 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Templates/ContactsTemplates.html +++ b/web/studio/ASC.Web.Studio/Products/CRM/Templates/ContactsTemplates.html @@ -33,7 +33,7 @@ diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Templates/DealsSelectorTemplates.html b/web/studio/ASC.Web.Studio/Products/CRM/Templates/DealsSelectorTemplates.html index 63964f8ba..65ed1aea5 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Templates/DealsSelectorTemplates.html +++ b/web/studio/ASC.Web.Studio/Products/CRM/Templates/DealsSelectorTemplates.html @@ -5,7 +5,7 @@
    - + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Templates/DealsTemplates.html b/web/studio/ASC.Web.Studio/Products/CRM/Templates/DealsTemplates.html index 8b5721044..d5368ebe3 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Templates/DealsTemplates.html +++ b/web/studio/ASC.Web.Studio/Products/CRM/Templates/DealsTemplates.html @@ -27,7 +27,7 @@ diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Templates/InvoicesTemplates.html b/web/studio/ASC.Web.Studio/Products/CRM/Templates/InvoicesTemplates.html index ba997a762..7eedb4814 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Templates/InvoicesTemplates.html +++ b/web/studio/ASC.Web.Studio/Products/CRM/Templates/InvoicesTemplates.html @@ -25,7 +25,7 @@ diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Templates/SettingsTemplates.html b/web/studio/ASC.Web.Studio/Products/CRM/Templates/SettingsTemplates.html index 835e01fe1..5468dc2bb 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Templates/SettingsTemplates.html +++ b/web/studio/ASC.Web.Studio/Products/CRM/Templates/SettingsTemplates.html @@ -4,7 +4,8 @@ - @@ -30,7 +31,8 @@
    +
     
    -
    +
     
    @@ -50,7 +52,8 @@ -
    +
     
    @@ -175,7 +178,8 @@ - - - + + + @@ -321,20 +324,75 @@

    + + + + \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Templates/ManagementTemplates.html b/web/studio/ASC.Web.Studio/Templates/ManagementTemplates.html index 69dd1cb1b..e51d5f48c 100644 --- a/web/studio/ASC.Web.Studio/Templates/ManagementTemplates.html +++ b/web/studio/ASC.Web.Studio/Templates/ManagementTemplates.html @@ -16,7 +16,7 @@

    +
     
    @@ -274,7 +278,8 @@ - @@ -461,7 +466,8 @@ title="${ASC.CRM.Resources.CRMSettingResource.DeleteTaskTemplateContainer}" onclick="ASC.CRM.TaskTemplateView.deleteTemplateConatainer(${id})"> + {{if ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0}} src="${StudioManager.GetImage('loader_16.gif')}" + {{else}} src="${StudioManager.GetImage('loader-dark-16.svg')}" {{/if}}/> @@ -500,7 +506,8 @@ title="${ASC.CRM.Resources.CRMSettingResource.DeleteTaskTemplate}" onclick="ASC.CRM.TaskTemplateView.deleteTemplate(${id})"> + {{if ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0}} src="${StudioManager.GetImage('loader_16.gif')}" + {{else}} src="${StudioManager.GetImage('loader-dark-16.svg')}" {{/if}}/> diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/CurrencyProvider.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/CurrencyProvider.cs index 814f86857..a19d2a27c 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/CurrencyProvider.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/CurrencyProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,11 +21,12 @@ using System.Globalization; using System.IO; using System.Linq; -using System.Net; +using System.Net.Http; using System.Reflection; -using System.Text.RegularExpressions; +using System.Threading.Tasks; using ASC.Common.Logging; +using ASC.Common.Web; using ASC.CRM.Core; using ASC.CRM.Core.Dao; using ASC.Web.CRM.Core; @@ -48,6 +49,7 @@ public static class CurrencyProvider private static Dictionary _exchangeRates; private static DateTime _publisherDate; private const String _formatDate = "yyyy-MM-ddTHH:mm:ss.fffffffK"; + private static HttpClient httpClient; #endregion @@ -70,6 +72,17 @@ static CurrencyProvider() _currencies = currencies.ToDictionary(c => c.Abbreviation); } + + var httpHandler = new HttpClientHandler + { + AllowAutoRedirect = true, + UseDefaultCredentials = true, + MaxAutomaticRedirections = 2, + + }; + + httpClient = HttpClientFactory.CreateClient(nameof(CurrencyProvider), httpHandler); + httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0"); } #endregion @@ -184,8 +197,6 @@ private static string GetExchangesTempPath() return Path.Combine(TempPath.GetTempPath(), companyAttribute?.Company ?? string.Empty, "exchanges"); } - private static readonly Regex CurRateRegex = new Regex(""); - private static Dictionary GetExchangeRates() { if (ObsoleteData()) @@ -198,19 +209,22 @@ private static Dictionary GetExchangeRates() { _exchangeRates = new Dictionary(); + if (ConfigurationManagerExtension.AppSettings["crm.update.currency.info.enable"] == "false") + { + return _exchangeRates; + } + var tmppath = GetExchangesTempPath(); TryToReadPublisherDate(tmppath); - - var updateEnable = ConfigurationManagerExtension.AppSettings["crm.update.currency.info.enable"] != "false"; var ratesUpdatedFlag = false; foreach (var ci in _currencies.Values.Where(c => c.IsConvertable)) { var filepath = Path.Combine(tmppath, ci.Abbreviation + ".html"); - if (updateEnable && 0 < (DateTime.UtcNow.Date - _publisherDate.Date).TotalDays || !File.Exists(filepath)) + if (0 < (DateTime.UtcNow.Date - _publisherDate.Date).TotalDays || !File.Exists(filepath)) { var filepath_temp = Path.Combine(tmppath, ci.Abbreviation + "_temp.html"); @@ -239,7 +253,10 @@ private static Dictionary GetExchangeRates() _publisherDate = DateTime.UtcNow; WritePublisherDate(tmppath); } - + else + { + throw new Exception("Сurrency rates are not updated"); + } } catch (Exception error) { @@ -348,26 +365,20 @@ private static void DownloadCurrencyPage(string currency, string filepath) var destinationURI = new Uri(string.Format("https://themoneyconverter.com/{0}/{0}", currency)); - var request = (HttpWebRequest)WebRequest.Create(destinationURI); - request.Method = "GET"; - request.AllowAutoRedirect = true; - request.MaximumAutomaticRedirections = 2; - request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0"; - request.UseDefaultCredentials = true; - - using (var response = (HttpWebResponse)request.GetResponse()) - using (var responseStream = new StreamReader(response.GetResponseStream())) + Func> requestFunc = async () => { - var data = responseStream.ReadToEnd(); + return await httpClient.GetStringAsync(destinationURI); + }; - File.WriteAllText(filepath, data); - } + var data = Task.Run(() => ResiliencePolicyManager.GetStringWithPoliciesAsync("DownloadCurrencyPage", requestFunc)).Result; + File.WriteAllText(filepath, data); + + System.Threading.Thread.Sleep(100);// limit 10 requests per second - System.Threading.Thread.Sleep(100); // limit 10 requests per second } catch (Exception error) { - _log.Error(error); + _log.Error("DownloadCurrencyPage failed for currency: " + currency, error); } } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/ExportToCSV.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/ExportToCSV.cs index feeff58dd..11a01c33f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/ExportToCSV.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/ExportToCSV.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/FileHelper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/FileHelper.cs index 4e6f3e32f..4d213d2ce 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/FileHelper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/FileHelper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.IO; using System.Reflection; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportBase.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportBase.cs index 410234577..a508193a9 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportBase.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportBase.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportCSVSettings.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportCSVSettings.cs index a1589caef..2b21fe439 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportCSVSettings.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportCSVSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportCases.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportCases.cs index 9370bd71f..2cb8ff973 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportCases.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportCases.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportContacts.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportContacts.cs index fce4a3caa..b7ddc793d 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportContacts.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportContacts.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportDataOperation.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportDataOperation.cs index 06b1a4efa..ff6cdee04 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportDataOperation.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportDataOperation.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportDeals.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportDeals.cs index a9f509070..7f89220bd 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportDeals.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportDeals.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportFromCSV.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportFromCSV.cs index 8a42ed293..0dc670bb4 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportFromCSV.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportFromCSV.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportTasks.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportTasks.cs index 889806ddb..8a2c9c2db 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportTasks.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/Import/CSV/ImportTasks.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/MailSender.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/MailSender.cs index 77ced46da..9992d648e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/MailSender.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/MailSender.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/PdfCreator.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/PdfCreator.cs index e8ac77f6f..574b4472c 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/PdfCreator.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/PdfCreator.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -728,9 +728,16 @@ private static string EncodeAndReplaceLineBreaks(string str) public class ConverterData { + ///Storage Url public string StorageUrl { get; set; } + + ///123ws public string RevisionId { get; set; } + + ///2 public int InvoiceId { get; set; } + + ///1 public int FileId { get; set; } } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/PdfQueueWorker.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/PdfQueueWorker.cs index 8d2a0798d..e93fb8070 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/PdfQueueWorker.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/PdfQueueWorker.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Utils/ReportHelper.cs b/web/studio/ASC.Web.Studio/Products/CRM/Utils/ReportHelper.cs index 07d4c47a1..db33ccb12 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Utils/ReportHelper.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Utils/ReportHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/Warmup.aspx.cs b/web/studio/ASC.Web.Studio/Products/CRM/Warmup.aspx.cs index 428141e12..615dfe8fd 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/Warmup.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/CRM/Warmup.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/cases.js b/web/studio/ASC.Web.Studio/Products/CRM/js/cases.js index 5717a75b5..2d562a229 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/cases.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/cases.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/common.js b/web/studio/ASC.Web.Studio/Products/CRM/js/common.js index 39ca99cc9..93be79031 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/common.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/common.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -658,8 +658,8 @@ ASC.CRM.Common = (function() { options.afterScrollFunc(); } - element.css({ "background-color": "#ffffcc" }); - element.animate({ backgroundColor: '#ffffff' }, 2000, function () { + element.css({ "background-color": ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? "#ffffcc" : "rgba(204, 184, 102, 0.2)" }); + element.animate({ backgroundColor: ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? "#ffffff" : "#333" }, 2000, function () { element.css({ "background-color": "" }); }); }, diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/contacts.js b/web/studio/ASC.Web.Studio/Products/CRM/js/contacts.js index 90616c5d9..228adc9f2 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/contacts.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/contacts.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,7 +38,7 @@ ASC.CRM.ListContactView = (function() { jq.cookies.set(ASC.CRM.ListContactView.cookieKey, cookie, { path: path }); } }; - + var _lockMainActions = function() { jq("#contactsHeaderMenu .menuActionDelete").removeClass("unlockAction"); jq("#contactsHeaderMenu .menuActionAddTag").removeClass("unlockAction"); @@ -1717,6 +1717,23 @@ ASC.CRM.ListContactView = (function() { ASC.CRM.ListContactView.cookieKey = ""; }, + getkey: function () { + var key = location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '') + location.pathname + location.search; + return encodeURIComponent(key.charAt(key.length - 1) === '/' ? key + 'Default.aspx' : key); + }, + + clearCookieAnchor: function () { + var cookieKey = ASC.CRM.ListContactView.getkey(); + var path = '/', + parts = location.pathname.split('/'); + parts.splice(parts.length - 1, 1); + path = parts.join('/'); + var cookieAnchor = jq.cookies.get(cookieKey); + if (cookieAnchor != "") { + jq.cookies.set(cookieKey, "", { path: path }); + } + }, + init: function (parentSelector, filterSelector, pagingSelector) { if (jq(parentSelector).length == 0) return; ASC.CRM.Common.setDocumentTitle(ASC.CRM.Resources.CRMContactResource.AllContacts); @@ -1738,9 +1755,8 @@ ASC.CRM.ListContactView = (function() { page: 1, countOnPage: jq("#tableForContactNavigation select:first>option:first").val() }, - key = location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '') + location.pathname + location.search, currentAnchor = location.hash, - cookieKey = encodeURIComponent(key.charAt(key.length - 1) === '/' ? key + 'Default.aspx' : key); + cookieKey = ASC.CRM.ListContactView.getkey(); currentAnchor = currentAnchor && typeof currentAnchor === 'string' && currentAnchor.charAt(0) === '#' ? currentAnchor.substring(1) @@ -1842,6 +1858,10 @@ ASC.CRM.ListContactView = (function() { var dsc_created = true, dsc = settings.sortOrder == "descending"; + if (!settings.hasOwnProperty("contactListView")) { + ASC.CRM.ListContactView.clearCookieAnchor(); + } + if (settings.sortBy == "created") { dsc_created = dsc; } diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/deals.js b/web/studio/ASC.Web.Studio/Products/CRM/js/deals.js index 26f496123..a4fedc71f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/deals.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/deals.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1638,7 +1638,6 @@ ASC.CRM.DealActionView = (function() { window["dealClientSelector"] = new ASC.CRM.ContactSelector.ContactSelector("dealClientSelector", { - SelectorType: ASC.CRM.Data.ContactSelectorTypeEnum.CompaniesAndPersonsWithoutCompany, EntityType: 0, EntityID: 0, ShowOnlySelectorContent: false, @@ -2297,7 +2296,7 @@ ASC.CRM.DealDetailsView = (function() { params.taskResponsibleSelectorUserIDs = window.dealResponsibleIDs; } - jq("#menuCreateNewTask").on("click", function () { ASC.CRM.TaskActionView.showTaskPanel(0, window.entityData.type, window.entityData.id, null, params); }); + jq("#menuCreateNewTask").on("click", function () { ASC.CRM.TaskActionView.showTaskPanel(0, window.entityData.type, window.entityData.id, window.contactForInitTaskActionPanel, params); }); ASC.CRM.ListTaskView.bindEmptyScrBtnEvent(params); }; diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/fileuploader.js b/web/studio/ASC.Web.Studio/Products/CRM/js/fileuploader.js index 28cde3636..5f03efcea 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/fileuploader.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/fileuploader.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/invoices.js b/web/studio/ASC.Web.Studio/Products/CRM/js/invoices.js index f0425b93e..1dad3b72e 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/invoices.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/invoices.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -348,6 +348,9 @@ ASC.CRM.ListInvoiceView = (function () { var _getInvoices = function (startIndex) { var filters = _getFilterSettings(startIndex); + if (!filters.hasOwnProperty("status")) { + ASC.CRM.ListContactView.clearCookieAnchor(); + } Teamlab.getCrmInvoices({ startIndex: startIndex || 0 }, { filter: filters, @@ -1283,9 +1286,8 @@ ASC.CRM.ListInvoiceView = (function () { page: 1, countOnPage: jq("#tableForInvoiceNavigation select:first>option:first").val() }, - key = location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '') + location.pathname + location.search, currentAnchor = location.hash, - cookieKey = encodeURIComponent(key); + cookieKey = ASC.CRM.ListContactView.getkey(); currentAnchor = currentAnchor && typeof currentAnchor === 'string' && currentAnchor.charAt(0) === '#' ? currentAnchor.substring(1) @@ -2276,7 +2278,16 @@ ASC.CRM.InvoiceActionView = (function () { console.log(e); window.invoiceJsonData = null; } - } else { window.invoiceJsonData = null; } + } else { + window.invoiceJsonData = null; + + if (window.invoiceContactInfo) { + var billingAddress = getInvoiceContactInfo(7, 3); + if (billingAddress) { + jq("#addressDialog").find("[name='billingAddressID']").val(billingAddress.id); + } + } + } }; var showAddressDialog = function (swithcer) { diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/navsidepanel.js b/web/studio/ASC.Web.Studio/Products/CRM/js/navsidepanel.js index 64fd3df11..df80abb9a 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/navsidepanel.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/navsidepanel.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/reports.js b/web/studio/ASC.Web.Studio/Products/CRM/js/reports.js index bbb2357af..105f29976 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/reports.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/reports.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/sender.js b/web/studio/ASC.Web.Studio/Products/CRM/js/sender.js index f43ea61be..3cea94611 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/sender.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/sender.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/settings.invoices.js b/web/studio/ASC.Web.Studio/Products/CRM/js/settings.invoices.js index fd9c4d0d4..a0b67ae4f 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/settings.invoices.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/settings.invoices.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/settings.js b/web/studio/ASC.Web.Studio/Products/CRM/js/settings.js index d6fb32545..707609ae8 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/settings.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/settings.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/socialmedia.js b/web/studio/ASC.Web.Studio/Products/CRM/js/socialmedia.js index 88fb36b3c..a43ead859 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/socialmedia.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/socialmedia.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/tasks.js b/web/studio/ASC.Web.Studio/Products/CRM/js/tasks.js index c50957271..7c7355774 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/tasks.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/tasks.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1417,7 +1417,7 @@ ASC.CRM.TaskActionView = new function() { }; }, - showTaskPanel: function(taskID, entityType, entityID, contact, params) { + showTaskPanel: function (taskID, entityType, entityID, contact, params) { var index = ASC.CRM.TaskActionView.initPanel(taskID, contact, params); PopupKeyUpActionProvider.EnableEsc = false; HideRequiredError(); diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/voip.calls.js b/web/studio/ASC.Web.Studio/Products/CRM/js/voip.calls.js index 6ee624744..3b6ddb652 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/voip.calls.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/voip.calls.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/voip.common.js b/web/studio/ASC.Web.Studio/Products/CRM/js/voip.common.js index 32c9772a0..4f6926d9b 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/voip.common.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/voip.common.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/voip.numbers.js b/web/studio/ASC.Web.Studio/Products/CRM/js/voip.numbers.js index d75a6e6c6..b65834533 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/voip.numbers.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/voip.numbers.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/js/voip.quick.js b/web/studio/ASC.Web.Studio/Products/CRM/js/voip.quick.js index f702c80cf..c69be32d5 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/js/voip.quick.js +++ b/web/studio/ASC.Web.Studio/Products/CRM/js/voip.quick.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/CRM/web.config b/web/studio/ASC.Web.Studio/Products/CRM/web.config index b378ea1a9..735831545 100644 --- a/web/studio/ASC.Web.Studio/Products/CRM/web.config +++ b/web/studio/ASC.Web.Studio/Products/CRM/web.config @@ -8,7 +8,7 @@ - + diff --git a/web/studio/ASC.Web.Studio/Products/Community/ASC.Web.Community.csproj b/web/studio/ASC.Web.Studio/Products/Community/ASC.Web.Community.csproj index 8d0917f10..3b6c39419 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/ASC.Web.Community.csproj +++ b/web/studio/ASC.Web.Studio/Products/Community/ASC.Web.Community.csproj @@ -33,6 +33,8 @@ prompt 4 false + ..\..\bin\ASC.Web.Community.xml + CS1591 none @@ -2371,13 +2373,13 @@ - - - - + + + + + - ASPXCodeBehind @@ -2392,11 +2394,19 @@ ASPXCodeBehind - - - - - + + + + + + + + + + + + + @@ -2412,7 +2422,7 @@ ASPXCodeBehind - + @@ -2438,10 +2448,10 @@ - - - - + + + + @@ -2485,9 +2495,9 @@ - - - + + + @@ -2512,8 +2522,8 @@ - - + + ASPXCodeBehind @@ -2549,18 +2559,18 @@ - - - - - - - - - + + + + + + + + + - - + + ASPXCodeBehind @@ -2575,9 +2585,9 @@ - - - + + + @@ -2586,14 +2596,14 @@ - - - - + + + + - + @@ -2612,7 +2622,7 @@ - + @@ -3127,6 +3137,7 @@ + diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-blogstyle.less b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-blogstyle.less new file mode 100644 index 000000000..4bbd9d455 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-blogstyle.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../../Modules/Blogs/App_Themes/default/blogstyle.less"; +@import "dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-bookmarkingstyle.less b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-bookmarkingstyle.less new file mode 100644 index 000000000..30394301c --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-bookmarkingstyle.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../../Modules/Bookmarking/App_Themes/default/css/bookmarkingstyle.less"; +@import "dark-params.less"; diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-main.less b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-main.less new file mode 100644 index 000000000..46b1dfa80 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-main.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../../Modules/Wiki/content/main.less"; +@import "dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-newsstylesheet.less b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-newsstylesheet.less new file mode 100644 index 000000000..3916d803c --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-newsstylesheet.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../../Modules/News/App_Themes/default/newsstylesheet.less"; +@import "dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-params.less b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-params.less new file mode 100644 index 000000000..4a645a32d --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-params.less @@ -0,0 +1,26 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@text-color: #fff; +@border-color: #474747; +@grey-text: #666666; +@body-color: #333; +@text-area-border-color: #474747; +@body-color-hover: #474747; +@dark-text-color: #fff; +@dark-middle-text-color: #555555; +@body-color-bg: #333; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-style.less b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-style.less new file mode 100644 index 000000000..06e04ce6a --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-style.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../../Modules/Forum/App_Themes/default/style.less"; +@import "dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-wikicss.less b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-wikicss.less new file mode 100644 index 000000000..ded3ce0ba --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/dark/dark-wikicss.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../../Modules/Wiki/App_Themes/default/css/wikicss.less"; +@import "dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-blogs.png b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-blogs.png deleted file mode 100644 index 514eb0ae6b717c8cfcfb051f023d6f0a9e7f3d0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10772 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-bookmarks.png b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-bookmarks.png deleted file mode 100644 index 5b593363ca4a5f6ff2580b27a96eec94599aeb59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8084 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 cWvP2Kh43qHvj+t diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-bookmarks.svg b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-bookmarks.svg new file mode 100644 index 000000000..8393146d6 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-bookmarks.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-employees.png b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-employees.png deleted file mode 100644 index b7bdf967a4ead3a97cc12991121e1250328e11cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14158 zcmV-UH?hcxP)>sbtZPsx%X|kS7q(JqX7^*39b++K@=rYoFQd%B!$e;58L8cF`fvI{y4@l^UIpB z{lgABtZ_&Yj)_^M(O8Q$l0vj3ijp|u3XlW=68qlW=<2QZ%F6YLwd@T|^Wzvol|1-S3_KJLjUR!r{8b79DQEAu5OK5S2qz4%Zu*4tbk?rw>&urRZ#0007r7a%%v`(5w;_|M+{ zfe!-!yJ9lvGkZh?)wotqYK>d`&&0P&)ob_i>bdWH{e?&WdVTeLo===}A`GCapsFGw zETSqZ!eWqG?bb*Ci+@~ebuPW|)TOg84F>~j4S~+B9KY>7A6z_r_uR4D4pI63moFwS zKKg|hzVeqB&b&At4PD_>L=JrI5)~2WJS!^;vqq6!oSV;*q;SP}JnoN%g>%-JEKO@^ zws`#H{Xg-EyC42|tu+IPhZ^jATa!WW>;K{3Jpc7C^?N(x$ru=bKvfYD00A^CL<9g; z5Ek|xk+L+k#74@D)q?RSEdLxRhE1W8L@xqKj*D*8VB+sq2 z&wTmwlVShCzxxX-cie|Whp4;-DcRe7;!l42#m67r-QJo^CWr{2fB*o72oOOJYF`Ba z7Gdvg6gTV5BuSV>L`9WZefdN@AQ2ZuF|n3x^y+uMVd4Z4SMI$35S8z;xX7RT!XKY` z_KBUXjq!MlgrI;(h=>>jC1@=b4blR^;v-SBUT-xUNW|VL1Y9K89#vIPW<>HuQ6wo7 z(Zv^^$(pTNYo@bw^e~EivzX+y?>zGIP`3h@$FT5#BlI z?OuBEnTszyb%@IK*LZK|#jpNFZ*!y9+ZE;@8Xy1)Dk>~08Wd4*x&Sb^UJ6>T*IJEc z`L0S|1t^R)WUMj95CH-q5+W$DDk6+WgTe0B>NDTUhy6oTuCq2@d+G9-7sumaJ|2TA zBB}<TMubR)5HWy4fXrMJMV>=FP20^@@Rft{_ui|BR&izkrZh}MA?g$n2)_ow7tR-M z?aT{Pw7303N9ESiU~6Yz@SfSTsvrUp5fLJ( zmY|TK(!2-bp#X?knpk5vNCp6?I`0ZM$%{NMio!W&7TwR9Rf!s~WFl+Jcn6d{7o)+} zg>&%3&JEr|vZBI!YnOz5$huRdXF|%$7z9LLFd&4OQUDE#Ab~0bm3W7N6AN#O(( zDM_QqV7NG<0)QwB54JabksqS6AF1TyK}cAIAfw7}L9^XjIla_f?##@!+MQ-rPfZk? z(#jAh>l?5ea)`7Ex9m^?Sp;y}|C_@|m?ut9_4E<~hWqs=k=~ z(4FI3NrUZfyL5`1OX5QQ3#Ys z4T?cEMvM_cHo$S5%+57dPILjmJ6~NYTcAKO0#XF z1QZakRiLI8s$WYR)vf%QMzQDxySql?8!N9xi{D zclXt`Vic9BPoSWRTII+BNTLLy;;fD4mOJn?GK(bx07<>u?6d$>#g~eb?EeQ*DT?C! z>cv;joPF_?SI)k+IvNg{nGBsear~k8zxP8AeISnGy}kZkE>V&iLs6X68d-BDMMM<= zn%Z{-ppr(hFDnP&m|7SGMSy7v1_7qIFc4Jv2Jj>^lgp84iCAAj)TH~`+T!rfAN)9x7XJm>WtDfQN?;Ii_=(y0jb<#L;!+N#j4CQ9uyJ;)lku|yxdZv z6r`-0p-7MwP(kHT>`zl_v}&WhagZhJUfB4~vSduCQu0%A}AK?PB_^|qEycUYzU}jRdbp;CIm)_EG1bi!Yq)+V#u*) zR8j>|1re{B+K7mx*n^4@C|vZ`UL5XTT6*9=&lW%UHb6y09((LtU;65!8{501;iPbG zJRVK*qRNn~A_VqHQcG=Qyk`)xk?rLI7)3Fr%^D&C2ct6e6)B`DgIEOR1}eb~E3+^J zDu{}TprTmGl>|lxh+Y$uh+0E&Vue*j8x5DF6Yr6b5mdpbiiuMb#g$@idHd6$R`F{g26K`^-2(nO5edWHY{BM-4AV06+sb!2yA3Ugh*QL z0f`CftVyhx586%7$qcj_MC(NG9RYcZW6CFtIgy0Chh!+)wywJ;M zpBk+_rd-^*sGK`@?&Vj{Y;NyDS$G#fFxF;CTCdlejb^jih@&WqqIxY0U|_|oALf2_ zC$A-O2+mbSG)PwPWHESSfP_fXQkQC3_EJJYRX_m%)T$1KW!Vx-Vp%|2^r;l7&|EI9}ws)Cyo&P^8P3sCk!PK3pKM2h0%s)(o*YY-|4^{QTPPUK0FaRTVAsCzaL;j{q^KGAynAK?KU@RiJ|hwlt_PWCc())`-fWw>#S{ zqS$$15f*mri^And8rcXcIjf{ah1GlUES|xOiqLqlQ}oVq(YqCWu)$z39F9igoDijC zJJ2LA0*ACrlOT;Jh4WrmocE%F3f_4DYBw8OrZOIj_adxdu*eHH+LV09B%NChmEmA88s~XY7(xLsgjpi<%h_Eg+beVR zMm=$i>${V)7kaB}{qfk9P7^_%yTRC5qFK*-yM6CmKA8|H@Hl43`o zqCs8=unb6)00l94#2741rN6ufWdJ2a1854TjTQkk)hu$<9HY&1sM%)LZi6nPQorbM=$B`aP0kq74QyM2Cs zCbLAw00S1D3wLyH$P=%zAypXXZf9?_w%Om<7+hTMuU?5Z_GD+f*JyS)_(`D7IY1<1 z0I3v>ifN2xi;;p7fFdbK*)SQ3EDDMgLVEIEy_ENVaIo`9pEZt~_jVUgHD=~*91r_F z?}|993A1w(E^=XJK_H7fgvo}mkcFj{nWM*O@A-A-m09!gt}h0+q6R}MwMUjD#};cJ z`@q6`?^z5jSh;foAfRM0Azf&P;8|EzgqCO0yN^cVn>)SM7a!j|cYbGcYp+(T0VP40 zK*4#A5G|qTzE(L9?gy7Qlq-YHFO&LIRw#iPxYT!oWxC%E_IALe$4=Zix43BH#8A|o z?}~V3F9<5g0;1qWg<09LKkf5zKG^K_wimj!*-o~$Ir6Nd!Pw=KTQas+Fl5p=Y1EVZ zZmU0V=e*~Nbr(_`04m}X!MniS1`KssMrDh<+>L(XJ#&AfvbK{i&gXGGF1MZ(LNQ)T zM=K;E13&yg6)ebv0_t!#c0<;y!n3NzOxt10+Dz$|BQU9?wRY}IvmUh@89SekCeGcG zsMKn;cB_#l(b4&MVI~zHDDgpslTKYrRVXzG9;jv^AgZ7NJu;W(Y*(-Jls$$}T+7HN zq=Ktp1$006QaN2vIb3D0MA%&rDYG*{wv34#!)P*|nOlhC1cdja_kEi+E#d4(Ng*#uBomA$_eQOUAequxM*V~d$J7+5J9tPPbtbAdEm0fA-31gp(OWRba+ zop^Zm-0pBN2q6nVuu3W%z}_ z)oumyeR7tF&?E#ONKZ_0n0)p zmhKrVR#h@oAY;7ugF!#bGHa8-*3e2|HKb|6mnn&r09sYsv}|TlX2cjVjuRUYiL%zM zh)SBKjb;NuA`_zfeNvE?TNv7Zr=6o(ReS>>1*$r(&Udos&upCAkl~*&2 zku{Ck50ntJEK!!$0RnSnYAk?5?Td(p!wK^wN>gJEs|08jRf8uGE?p)NLIep4Ky-j< zDH{3(vLuRa)S5dov+}^Lh)R+qv$Nes7F&Z}q?{mu`xLH#PZ@q=MP8lOP^P;lY6v2W z$@2R~Il6p;sHJtOtS5d^00V(9@2AZsP$po(dIcK-B-Z{1A((IYD# z{mF;tI+=4UEMeC%6wk5L(o?q+N-B3*UPKY~!d{s9*nIpCfB7@B-R|6NACP!?wAUjj zZ{Uzf2Hh{%m-Yp2;0`?2Q2y|*qZQ54;N$DK*7p~B4Uoa5khR&~G-{p$htR`my~ zh!lmW2nr{0^6-b=2LQ$pJ>b-H&Ok{`SZRg2vL=% zCJ0N$QI)9IirO;0qahUV)mqC=cDA=?Prg5CbOE5X^5AXn{X6UmR46;et7L!0m3>`- zKvhLpl(|&P!#vf-U1*|P9Tg-Sw@(2mf5LKR<{=dkS|N>oh4ya&Re-}L1yfdAr z68@(M3XWAn*anD6t2uZ3!TcI38za4~t&3;Q_&hf@q#R4W7Xgup$Rx(5WMV`D;nFQo zG*QIfZLDwf`+f1u&P}fy*H@yfL#4M?(Z*ovVV9hi{pmRpHJ!wNqsJ^%_Z4@IX$YX!E2Ru1W*=X z5DtE_X`O5zc`xF%TAkFB`YcQH@#x%h&#zy&fZ%PE#c7*Nj6kS_Dxd;nY*I%PvG-eR z>#OH3?CcIb0J8{t6?gEuS@-UwwTz`v5}1ay)2eXweZ$nZAoqa4fZ66!dI2O84{G1-xaTJzU2o+2zFAgt^n!gO}d#Jzs6xAVj!agsG#Gg-ZvW*IP#2D{^7f6(tu z#se?T#Br9^5@Xo8A~*-r^zec2SzB1ocb-KGJxCOIcxBvMjv-O-ERI10L44Hgp8T=2 zHhVMn?WS|`ZRg(gGvA!=HiSjQBbu^CSZZqtb63JhmAwfrE$u3cEQxZIxUpfDnUF+i380Ytb^ z5d{RYJKH;ZBae9PxKuRJa4_5(Ga{HU#syT_Awna|YFWM0ogWSRMj? z8H=F?&8*%R;z*rf%5WW>W1@y>yrbWHqSH%)t{kcDg&s<;v#vV0$x;8x?21qGz~CZ)+v<;-&Fq@5T5m2q z^~5X3Pn~RcI>?}8jY)~Ds`tf+VS;3s=<>$Spw}1gAb#7TVl63>dcVE4KAzKJ)5iX?bpG zIZc|@q@tp1C?ZXY?cvty+J+kqBjKt)?`?>R`u^@qe^BIkEsLVax=Frz;SychvQcDh z?A>@c9OQ$3Ojys7e8gJxinXsMM}7(bhLhc|eESc-{?woT_#J8rVPFrTc*_i`A`IR$`=HbE$+%FnbmxbUoO;LVx#zz2tv`R{>A(8f zkNtzi?y>M~{kUgA(dRoC&X0zpnfW7W+AxNM9edu~+PZk*wS=@8gB!EH&SiL;prXEb z{@2ppW1Y_YZ~z%-TFWr56{6$3==b~Ta{}$OTCp)cpBR**vpdPf|7~?}d6=F4*2|xJ z>iMsFFJl>i(#*oKh5J5v`LTaj&quYSR@KHt1VlvGt8*f*?1c<7DMEr0(U9@QczZDD z-uLsz?*6fz^~<9{|Lod}=Ptawy8hhH{heQW;Pgi(lTpDLi8BzzY3zo*E2B{^)?*W_I9R`cvc2CiC-mHQ=SQbL#G>G%Kau)nvrxAm$!w5b{Z6EJ_qbX_^j4 zgBLG->sv4V*~9Pp#mpx6J@hlHGxHnY{yiP`>dlaSA|yp2FhoEKR?G2uihy9qyZp-b zUh9sZde=w(EALU5pWJ-ptIvGiJD#0s&d#=6?$2F(`sMTAMlsOur#m#)YTvVTv>wOx zG)vIOnwwuJ(^Vva!dJ5P6j7B3 z$CJ_8Q0DIc)B_*-1v0fF-}%bf&wlP3zvl)V$I+2v-C85LxVkau4{c=YN$u3J`|^DF z^xCU0U)(#|>dw_W?X*!#YIR%7C{B_(ct0BS>PH@|wHJlCx7YitS9k7OY`=4^9?=a0 z=Wlh=hZZ}!_X2Nx8Fn9|(G!x7*b|YMNEFl$i}iziif*Y&PKlxX`PWk5XqsNmtD_pMZgq;e9(pO}uzt`JxwPWx5#XBE(*Z{5VT>9L% zf9ng6{$al3P|eDb+1qYkCZgeRyt%QZst?}w?w|YVf86V>{@XwM7kkAZ%Ti;FB3ht2 zr8SebZ8i(0X1aGi^qHi-;6~f8?GFE&Z*4QtM~`f?aQw| z_WA#_*g13i>DyY(cAk&KyFhcWQM9+$yF85U`^Y~!cIqDRaCYs5KYZjjzWL-Aacoej z+il){=Zdu!iQ*)_uzGpz;>JvC=B|^sgMss#7mzSb6KkxhObX|no47(1VuAVgiFe-h z@#BkkFSb^G=lSj5c;T`TS)_>c_LMM<;n?;NDBr)`ZKt=t4FZ^+S=67WG zSu|>+0+>XsDnxN%NG5qgfN|u{jq%%?E6?T2>%$&eYpuy58%LI`F@}sa)>>moMDx7Z z+T0ophlG@6*{RdVvMkLD2U7A^_jWNdh#wV^vQEy`NOaN`pYjpYg__~v)%gXJB}u4 zq@qY<Y|q!?n}v$z+momNN4fMLL{x=P)kHpyy(?m2 z1k@xelu2Fm#f`?FU&=Noh=>+Vy%yDL8Cf!9j5WrPwbn+K2>N@Y@o3y?*E_QvW2`Y0 zMb>$*WpkUN3MdQ*gSE}gJa?|hiR?WmKJbZ$|LfDo?=6br>2LhSrRP4E;;`9hCP{5~ zTsXUU|A&5I`Pl7~@#M?T{?VU4@|)`yFB^$fVP>{*>bB*qmV|*ZM1%y9wZ)|H-h0pe zUVk{8q*>Z(H&oF($IR?G(AYyK)MPvyO$t$P$#TE(;9Bd)oSg;r0hN$KBPh8DnWf{+ z^wak&|0j1W-V9VUf8jUA&-|~(h_PP04bEqh<;v)bNCBdlBkPNa`JbPgy9_7lMt1t^ zhOC0tYe_9j(U38Qh!DVeW_B|(?d6q)w3bCt6!`V3$|6NxjK|}!Q-QoX9*@@7H;2QC zh%ozZd-)ST@|hod-_HWV`sE9&XP@hDyj<_z-d#Mtu(Z->v`6E?pFZ|){_-3D_h@TC z8X>~meCOElxj2bb%dxy+cD^+xjBgF|smJ4dcYAlYH!#*DNfKUn&NH)! z5eh1=&VK4b=TlY()gbYT+7|ko0Tdu1{3q`_{`c-Vf;Scw-g{~I$Uo%4IYNzMN2so_ zM1Ux9>hf_cfw=zvTUpYsptxb;fxy*F59a`2{B3HII=*bB8I3|uSJn9 z@`Al8==0|u+t@mP=dlOVtf4Hzjwl-Y!S8?Z*S_%RAK`>RD2mLnlM4$=GlXbko1|%) zBq0D4SLQA`;H<))nT5Rv&_*Mx)iM#uC%JP@JUj1QXvYEgi3k6)kG}tx=G#k8UR-@m zk6MaR8A5}MhIaLUc0gTnuSsMcKHj~Ns7zk^*S!0D=;BpD8!3^nClv&sICjoO%FI;D zPXB|2)1OuV=iTw;J2tmgU%mJYVH73NU3Z;2eaFeg7HQxKt*oA+*`^0;G z{9T_O=i^RuHqB-pUmuM*G2laGU&X5^gdzg7dal}N@#pSdxsi2ynQVt9HW3u1qOekt z+`T6Sv=Ivznx2x`k2A(1VT!kX=$${4+L|Z}ORLjtH0$0u=ISJ_>2e(GDhDhaJI~DQ zJv;Bccc2hOHcL`#D9zHNN0&P7CLz_b*3)Od`LF)upKoqmK*YcP_V0iGYrkth3&qHx}`^X%D)6Yo4b&(1mT*n97t^Xwe6=b~_vNv@(@d%1omjq01yI-V4g>@o#d3l%m=h~OxOV+5f(+h*gbjYi3h*)%2!|r+uM7sPNzC$ zOTxhd;f$y0T(y!1w?AYp(7r1M6N0s|f&+x*l|@nQ?erU2=aq}k{K4mc?S1e5*q?pv zH%(4SoH)-5i=BnV*)-0O$cqX)2)|mY!mp@68G1sga5Nn3BGdF|V6TFX26-5Zd}8VT z+4iw^yPef*MV{BueE7B_UwrN5-o&MmnU)~}t55PAi~&PN&BV(MMukTkp;3eY2ow;# znBWJhkaIRR&ZJ$PeF!jPmm2~EgQTrS_tcU5o_gi0s<5})FD5yZ?LK9{Pz6QUdjJp> z6p_Fv4unRTB2x{PLM0+Ty0WM&ySu|Qsy+VdSDxK|a?%^6QRbK%jdbP6e3oXSD&9%x z@(!RdSF;Yw=}Vx~Ly)xmE&;Rsa}prW3sGPxPOrSX-I{H8+AI>sF{-(H!91|o`r_Gj z=gU!5B^QxBxB{3=WYsXewOOOzi>!#_igFE7jv5R#Dnw;5>>o$?qurS6jdpuGy~$(}$4L;Ba1_VXtb{{3%4hrk66C48!9zhg#PA}D1{W9S^1_cs z6H3f@I51!p)fhT*WT8>31>+p{H()Qi-|SePT^JB41y?|oRk8e~L7uxxWA35^b-N+e;R znrDoxrDVp5dhd)W?+jzjvBh_E8jIV5&EaU`3U93y5fu>Nk`jMltAgZ!A}i~D*F$gz zs)yD6s}8KS-Pu-AI7loGydpZsGo41ORda=(@`tDX#Po4cP$f21KWab;ssjzD|5P~7 zBFygC{M`$)Cz3Q4@mRJNKw@d7nUabZF;GtUR{~)#>EmF@-V|`hcJk6;29|g^TL5U&OxQB zf+~Aq7D8&(m%6h{L?Arv9H)q|kr)lrcCe!OF=)sNs2cVp;@pkaU;suW4B0|v2m{^COB>I3R{rGwPTC#c>JZm5#j#cUb9&%N7(ZLT|O0)O1JN8Has9FWlU3P z91sy8gjzG5jF~OE5v!t&j4KN71xli71#n5W3k|0M|I(;P8A6thNXa~c=@b`W_KjM5 zrZ!h^G|3osE;P)7DiK9QEb2uqPffb0^WZ(IQ5F@hADp0cV`Rm9(Xzy+luOG|8vp79!r%f0_b9Nh%gqau z*{TU|h#)eW3|UNK6GP;^XCL4QJ{?LG&;{iur57R05;~SbtBqE}UZ+#}G>~r9x3l@B zxl`7dDx;!RBO7RFX<;tM#)XYykL=2Mf1<4jZ!jv}6|ATnvO8dzq#Ozf5h`$?MKh>J zw4%zMHD&}OBF55u_ei(7czOHWa5!NuM}kdtK2&D5)c(P;RK5ULlR3-QyXw9!%kv5# z>Y%VlrFvK)VI!p5>k~Eoi zP6h-Bu{?N>MW|vYvxxV=42UYC;)~s#8_fQmd+47f^Y08Dfl^I33A9@U5g~y(57+qo z??&j;tf9(zUX)W10A@Q&i?gRxbv({l#IyH>7iMJ^&mm&;EIT7*R`!XsF@AEu;5?=P+v#;2ZB@|^(H&u{S z97+~8WZL!FX0u~$q-84;Duk27>B`>3c`i*BbLglL@0|DSJ$na({!ib1^ajgH&q7v3ljV9(^%)K8=lM z1yCSW@73kXo1iE|8jisYq{S*l(JVb(0$M% zLUoGZf(wYV|g znvc^25E02*RLDoYE1Rp2{rZ>JA6vDZ2$Z=x<3iLIoENd7_rK%BKmF8)-+%hZ&0|ww zJahZfkN+?E)^oiVe}8=CaT&Z?uy{r#0`MBor;X(#^7;027dKzbn#beDBH6UvInr&< zHqut^$CKQ}Y2rPj?uYCE!cy87EYBL!a`cdJl?IS%$PJgDk}$VG*~?;k{#X9fU-_GF zeCdzA^jTLFhKvZqbhZdgXS9@Kz^4;k_m8R2gR}6fo_z%NtRkJPbM(kk^<_wzq;fAqbSiobu3OVYh(;e-F& z^;buizg}#92iBh8(MF!{X;x#ZWid5tO;MZ_7bokluoHK=SsS}f*1Wtoc7t2?oy4<0p>nFBre@>d&*>C# zgoAb^;Z8zQ<_AZK(cC+42vm;xQf*%WYl6bzA-Lo?H?vqRJIyU#g zJC1%Id;7O#9!1S#?dCDK<7bP#^R9Pha^QI@4+f9Eg1{^wV=dm;i#Q&GSJ zqmdBss?%@us@<>Nrw3+f001zHF}5D1#m>2=rA+cT()#?o_n40hfczb^_EYb^?Y?76 zcP-7V%rsVJ8ja-pCx_o4mL8h8eJXCBsvrCC@bcqZ7oS8G1qx=CU7_qmsFAj^C<#up zgz2=rpHB(FiM$?_%EFgwe|og%)!Ql}%d<=W=u`jfi6_7Ko1gvng?Dk9PCLqRYB8=l zgX(}ypSr{cA<_Mwro<$Tv=yiIS|e5Qu9%E-Uw9{?4&Yr!TkrbOAMMoZw0Ax06rY$l?G?c``NKqBlLcp_hlN-j;yYW0@ zvgzDy9~o{u;rCv_Y7B*nl7eU7Z8Q@biAsncN-s*Ua;^@XU{k3mI)Dvct$e1pyTI1Y z&ToJ2-xY--k}@D(Jptq3n?bK_ExIN_RZf}FvM)m}nHIh3nPm76n8Q(OQ($qm)Pxqy3{2 z5L*kUXI37JZfJw#P2}Xq%~Lj=cfA)}?-fC>0xaCgnh`}KpR-hFpH&tGrlTkcb(;AI zDJj&e^!)Vnh>F^)3b7#wM@VDnf&~$+&X&OGq+LKjC9Q^u0#rVkmb9UO2Tf1d!P3cy zj7=jO#RiGkBLGHOdv4*5diV4VKltnBb`??7NV@Mawd2Lsvr@byZZy-Hk0UF&c+W&I zodO*Obxdu>)RG+5)rs)P)<|FktkTU#(`H)@`Ay)y>fTxV``*b`;~ zQcywyA`k(jQYNNTr1xj;l|i|p9>f5lJSk`2bcd~{vLz47MB&tsD-xD@$cnC24K|!! z3c?u@gbJanOa%q%ahhedD4R9)1rsl!%>ZuJ;cNHR}i7he0?*6u~; z$KzrUQH{zYR7^E3r92oy!nnukgdk8sKn+v)rsp z0?!ep951==->I;ujwXF$pp`AD#J}+HXYM-nVA5Jdif;Oy{KGnPH!nsTyQ}9fy|A`< z;ljo|I0ZgJci`GdY;yvNAojI&gsM1N+k>tBGOLpdG@9<7tUrSOoz@+50?A z8uK&9T8;Uo?unC&@2Y1rb2H2BW*2`@XGH#>QBghM=HUKsth%zU`m?=vh0F6|?3~-! zJ-@MgZnwX_H{2SIcLw8~;kc&&o*f~niU{v}w^%uBQW+-zGKQ2wsS|;SED_YRZY^!p zvre-%)5toDv!|B3cSKPf**K1qB+lOCPk39R@NBI^X2WU(bWV@9Fg)C@R-{ z_Tba&K0a`q-F1Gx{^`{Tb-gAaygE~LO$FZ?q`~xAmGWu6R;cJ%0UruKVWeVm6h< z?++XMeVB*oz8s_>z7ZbRefs7?b6u#WzgI-2035VfZ{-%g?j~OI^Ua}pBh+7ikxD(5 z556aCzQ+!{1GjUj>*Z?F<697y*GtcL#pCtwyzYa8PQ+VLMAwMLb?@;LvQ`llOWQNB-W|N0yMyPAjVnu^y;(shl{n@iPo-|!}S?2YUJ5xvRV-sHt=e#JFH zR-VF6^d|Sp4fDZXzmIRERo>{GZ}C%aevvm(Vs8Y`n;7T64J2>$o;SJ`ZkA_!O+5G( z-Q_pm;y3c~zN@SKeJJ5KG8^9&$TxQ=-sB@c{Mi02Uh}$uy>+nP=$+qd0Qlxx{1)xR zjg9<&pc$992*9ngt{VgW|0O$lxUN}rxCMu(9IiuD4pBK=ho~H)a<~prIb4UR+@kCM Y1=1XVn1KMwvH$=807*qoM6N<$f)9wGJOBUy diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-employees.svg b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-employees.svg new file mode 100644 index 000000000..4bb59b92d --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-employees.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-events.png b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-events.png deleted file mode 100644 index cbd6716b33544ad23bdbd26dc8584337b150494f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6753 zcmaJ`Ra6v!5?#WDrMq0ZWrYO<9stIG(7smX7%AbVIy7R>#_+lr$GG^zpmJbAk6ab%GJX|cal933nr;7 zV(0|uSZr%%LqG$W@t!;uEK7`fvohjjfC7UdCl-(|S@W*n1JY&`!O`462y5WygQa&P zPr&!_)?(pG>y;lNv@lkSn+y#A7=rl#>5d+Em%`9En8APE+?kS9)J66ULBn+&8qWSL zszfE5@Gr_G1Pfv5qttSZ0eBuS9j=uiQOVOW>!sZ5P?kis*FS15w zY(~b%{l^6`$KA(o_Y>^<_g~kvZN5>sHTmurVO=qo*4*qnV=r{j?h~4t>R}mKClS9! zL%?)<%jfFpS&X~=d(@B_L&EnATTXv|x$TJFp+0kdW##fAH}iA8c1D=F=fo}zAVl2z z2L_-P5~`fgKtTfG<+TV3VyMz1Hw`$AIBUxiaq(qsnLb>L@pu@TtuR?ap-{DT-{aN$ zI}Yw7e*gZ>gzVU?dVV{<9KZtO;-nU?fC#oWYY%;?I4Cd26RueeNtt>`QkXl~SntM( zC2^>y)6+}imy~pJz_bo8dsE?i1?T?q^=n*Kqx1SN@73N>!^RGw>X|PM4W&jkyL25P z|Ac+a$+|$PCZEWOpxfAD78VRN<|ED5*28aY8x0e+H~y*AH)_^bW#G-F+7Q zHnQ`D-*2`G$hD79zgdwC0@O!aoR}zAIBUP&89q+=7$xInbDKcA&_&UpIq2(Ex6pBS zC-HM`j*>ag(D+q#aKr5gkh!it+TRE-CY{gJ@30Q}guA%#2@x?dQ}Lf5fB$hwgZ&oN zKGDuCW^Z(@fcq%_V*K_^#V{GwSl%iC7S0aAHD5nDAt7dz`qLqk%)}yQ2%Ez<4+Uc$ zcXs0dLgM4`nWZhZmqoX8(c`%ofV8xxZP*{*VWyEUz<)R=m@j3vjG4vFE3Z;cdyEA?CcE6 z`^hl-YfxY6FG!^CcY`LFWa_^S+4_UgP$-E3F7hTquw zr@X+}41*;`5;~!QfI1!L{L+$qc`;8ZHXv6z z7^PPc(Ki@VwGd$C=SL^v+!j$)g##TuIrqvtES!|+%n?71=Sd3`6pFITNbCwKcq-zY zFJ>HWmAP_k!x$WgnheFoHAZMx8~$tkRWKT>mO|5{#nYhKtxp=IMhxJT$d}au&@(KFu@J zk5q;X>}QF4ABFHAl^=Mu#^Vq($l#U#VTNn#wx*D=e@Dj06CTsmIYizBIXM}Z2iw@- zh%brj8yfaEd!U&h80Mht?6$t?9Qw+t>Ienj+V%uxLt?Ed)h0hDa_{zQDXF_(F6(`U zE}dj)SNmSAo18~uk-rCis?1e3mFPZO|9*AU^%b&B{YMm_J=S`Ba=CO20H6{QPCw)! zr|A$SWO}dXQvCT$+M>0~krx-|L#O5C+>n||g*Mvt^V=)8faP2Ifv4*0KGm_=Z&;A-Ed12xk1f9TCBWl&{Lf(MZEqCcn+yt=^XiZIrAC*2x{`mmx!>p#b*5%tPrLm6R%)fS zLY?N;k_~T}oMO!1yFJFbD0Fco&i!by{^bny-aoH!r4J3o9|iB@zYDl`Xyg|Z!~)p9 zptBX$0IxkK0>zq}^|%vQDH9z_{WjEZ0wMoey3J|!9pz?ZoFe!6w%utf92{Z-wRqDh z0rT%>&(iO+D2H;Zd~evG+GMlv6lMX*BDRl`B1tQM?(Zd)x6~BvHPh=lJ3ISA`kAP^ z^xZ9Zu&_eAj&lmBC`L#+A8CdX>90$0E zj4_UWkP^@Bt^cHnX{Bz)uZ^`tw@0D}X$y)E$1p`B%LJ9*_gPOqX+b`_yC88?vG7w0 zJC#!WMgnWLrII5#sHzAGMGK9l$~?6#jt=}zP_k3A+$KXAJ;QR{sW)`@MYCWV-W0;f zXo!GganD@I{CuR+j5*edcVv5fx*)7DBQ#gsy4Cu7@a(B9+>1jUl-*DdsWdg3%pxLU z7k;lfLXmW(a(_jcbMr7dJxfpengab->%lr=$|N30Z@xRmk|U6z^sK%Tr90JnSw9gW z5YEe(%j%pA9U7{|Rab6~BqSg~Oq@8%S!Qb&y)G@}#;4;l6xRpljg#ZN48tx84P9=0 ztKWtA%9iMOzb?8{_?`?$ILK833T=2i#iaU^KGEFq=lCgiE=@p?{@=f=fse$R<(U%* zaPW=4G=W_)BxKy8z^-x9uM^Sw-lca2j6Zo8BVS+ztFMI9Z*WJJo#FR9o+TH%$G0l=9CB$}(3jpl zhhGlz&6gwNlKShLomleH@YLT!zvFdiVl%_VoKmD7ILxAQhVG(ZbF4_4{=g}NuAR%M zMbqzFO_i~k?1>KYp+)H`=|=5tbv4guLsWzB z1lU62@zYs99Zk<{o8C{hM^uZqyNN0d2^{?T)7hBl5eTz%X0wi9_G9r@IF&z=P?~~S z7THP1hmptdIIkLh%D^6GE_-`zxjoF8pjEEhsXuQ71%7+;TutM3pgNxp_L6<0W|bbR zkiyA>nVmQ~Oh?K2>Ea>Pv((rPr(3j1oYzyz8t3{|!%-lwX|q>mhg(Ak1|W6lMOs=q z*-BDvQ;O?DqGk;r$7*}i);r?s4eDg1Um$nG95SVhkGKEwWO5y2?}9zgH|Fg8tEa$I z9Qn*V+QH$L;tcd3ks<R z%AQj1XIKZOXr5!TOUT;n@r@@i)e_zIIsy2c<&5ajuO>B?h(4;#c9Oa{Ep_z zjCKv@%uwN6Vs_0AM{IfMZ4bN^o#|O(GB6^?*EM>TCqQa@P62t?>V`9w+5BRugWvRFHF;u~3Xi}{*p z2#bv!Cmh5*xFpjzE1Z@=u{bnssW)&sB6>_~EYb<%qVaaoVK2qk-s`<2BEEb zdeXI>U=DJLmi%y2^}Zp&B_u{PoM>*=(R@N z-v?^=bS`UmLu(&56f3>>39$VA{f8uQHkT`EemRTR&8_c-dbJXABSo$@eoh`S$ZMwv zZrnXDDE{b|*%Q_I*SMsgZit9)7p}xQyK8TO_t^RHaDq;M&Ela!banM*E4zq+G%T$E z%kb!Oy;`8)ZG4hlsL<2K--&>yBQ7vW+8{e4MMgCDdceRH8!-vQc9t!iq9Mm3uIp#a z^$SIXLNUd@j!75!=Fo5&rduo=aYf%eJYrJLKm`Ad9eVR*8=f9PWY>lrFNiB3J9gj< zGeB6W+D6~)#Z>v6vr0;q(e3;aa19BUiW0C*2r(rguqNx{Ef?$Y;*K_Z17yk%3A_IC z+nxXqeONbg(8mVWPJ0QE;IIJCHjJlGLd$nw4VL>UkaC8p(setRoLNTe5lp?)6~)*x zH7QR%r>Lw%EK0w66)1ff`m`> z@;zX}9?B)_*7d_%5<}{E1d%SO%I+_=3A1}4`-Ka7(a zw|nQZH95-bvrL87ziKQJdP_`^27pA(kZE@>o(aUEhc!o**(&aL1s-q zqCByWRt1Elp0QY6%j;4@6C5w*`jWmaOK_6K$@!sraoq%#UjtulKgKDh2)MVmk#q+w ziZYX>adjtS5@3R-$Xj?=c6Aj|I-j8{xuzUBm#}j|wVOL4F6yXhS(PV{7@9`0xRwAR z9CpRYk4&%|Byq1M75{prT%x^I2wX+Lv6BSfR5j?UYRM1DQB0sQkL)zAwwF%!J8h0w z$}j?nI(o*easF%&tss=EWdA!7oTi>+NGRj7@Rrgt_J9RFa3^z$M3}LegRtI2+JR!B zk_6b$$D0mZeI9YLZHg+W!g%YKfUe|a02w`%P6*Y>c(OpApaZ@F85Zelq4MCWZ@LW* zuhUtRKAV)Sj+5YcakK4VbVvtwgGVX0+}sU_c7MFpb@;_`cSik)lZ@SGz~Zv*cX1^zifL49g|alMt^8+Ch&d4SsQB{Vx(Y3+U(gOfkO6xhJ&v=epR)LfT-4 z$i$A$P7JYMa|8J`a^R%&6onCM{rhZ5cH+5Z;W*2fzTQun+&Q^B+fdCl0|VK~))ixP z=37{4h0w?xHAy3V*XeM&e%YKQ&VEHYAAh?h4%1`_w~D9#U;+i>MUy)B#4R;8gqN>- zC#8d7QNj*8qg;1KgYhkIx*Rrp_y^|fdSR-(Zv2_e;nzQIj<_sh&7G7nKkV3x#kN5L zbw$;&`MQmdz@AE*CTRiY)t(DREVf2C6QeVx4>8j2A}}?|kluomORq1gVOVWp6+equ@|Y~aKWSviS!H{&Tl6Dwd(lx%Z(=Z+;YN&m zFjfbve&;N%Q~CB7(Za2w)flES0#!sxQ%RpI1r~wys%&R~4t*lQ#KzSK3c=*gxyHps zooki~i?=!Uh|K0N_UHq%D{2n%o7FtllQnUG&2UqV@&Q?U6&hk}AOB?VjtSXjW7W#= z)3UEOd?2n2EJge#9U{BPF_myHAl8YWbnX_|JQr1)M%He;PRJ+)F%w}Vm%Sl`E&yTp zy?GRxw_AWNE9D66VgQPmcyjkgq#bQ7TU2Q;@pYN7Dx7FRiG*}0#GgOb&((rxH~8_u z5|_J!w!i7Um4Odhq&;k*`Fh}7Cl$}Sa7>i0`1FR-+8S-S?~>itHF5x!!T#W8`mxMD zvTO(Y#|V_$sbKW^%%pHr4%NI3&Agx%He3?G<}@U9YTIkv4G;Ks$vjNP;I4hB&0_(- z5nDRswIM_2`*)p>4z$Eb^U4@)slY?X@1cDp^>!9B$N~pF6(pxb(a!@k5LM~5*VyiM zrJG5i(F%5yZ^%NVtiQ88$JTS=*tzt5+B$Sb02Q>UaLdHh!WsHOCq-ur^dZ{K`a!+5 z<>k|8$84q;blZ7t?>4v)L19$~#Fis^ZSi$Yz zB?xHglgxMJJRDJfeUR{d%noOhrY@OX{Fq{-B{3zJ4#-~|I62H>)^6F@HbScgg4&!@ z{3Q<$69)^fHNoeD70Xg+t)CGnQNw(mYfZsk9F>wL*X5U^^Lt$2FXw|NyVR<%fom80 zM3CuIp=hfa;MT;$<`g*PRe_q+>ya%h&w4zF$xzRQlrt&Hm(pJkRHJqVh6A8hw3s@Q zFDWL#t^GQ-F$MuGqi(L40bg)lw7in=x8u{%B(qe(QStsA+r6kVC(0l#)yMhoB;uTY z5-{Fz-`{Ur{~SON_zcA#H2gpiNTnx0*dwG;EepGonMuel!2!CB3=oxy7RWdJKJgMp zi^1lYI}gh`F;Iz@iz%Z*pm+kcR2bVX30YGuSH4@mWjWKDT6pO$5#^dax&M}3_WJcX zu*Epi?>inh`_DORXuIYYICRgH2mSZmz*g+zW>Iid3TC#0IrvL}biB0zN6@~5Y5!f9 z+}5>vW4L++Mzx?V9Ts~W5wPoe@dXhCl{PCIVYh=D8i9CH=TT?-<~eSK)$vTXKewOr z3yU`#dmgV2@;u$9gfaRi4&PjQO1t4=jEs%SO+WXn5>`_U2NJ0-KTH&SNPvf(>`Xe? z8p-!VzcjA)rM}Nhujh^Ub9p(iw;eC?#yk}C{-g2w_itiz!5pF|KnAUSr)ebxL#SGk z(+Mc#$nuAQN(tHGSA1sGi3_sg7n8|b8I;`?J0FcelE#cWB;DP{gxU?V#YJL55nk!F zfwr>K!-;GY!h!2wu^}IrBCzL{?`IC4%qHWCRM+JHBJ-JrYF4SO?>gfjHbn4#xU>hp z*Uc+{D|Bqi@Vk5=9%s6F=R zM%M76EfiPgi7`-RY+Rek)s~h{7u{a1_nQIq+G$lel_Yc68<*>&Lno6%286~dp7EXP zSTKFz5Q^H2Hh4zdZ!Um)14Nx+GPc?wa8Y!qKMw-_w{a=K=ag}XM2xaFP>&`)_8(GEI;9K^K6Dw%7{r( zsR6CU2=!k4HQvPcHNigox2%-aI9Z6CuRRKq(-XO~yw+UzIdJ~t9(=*o+*PM2LFEJ@ zo9H;8ZYk;&z;G#TpOvcxdGdZ5800~|s7=4)y_DZ6gfk3nnQr)M#Y!TOMWX+8{$AF* zoaT?u@@radS+~^tpS|w zo+TU$0lM_0se>Xog~mz6KXXN5-ortq_W8$5yI260BNw)~IIYMcgN6Cd_A1e)U|H6d zPmF7tcx%81nKY^VK9yVl6w`xD-FY!yj}&FL7yNmwV~i^2aSJ4@n=dHS+-lYKe%b1d zPbp6Ty!s*}M_NDG4KO9*%BvycpZeTH({%m+)3i7F-|GkfS5#N1mNN_c57%kalK=n! diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-events.svg b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-events.svg new file mode 100644 index 000000000..977cdb91d --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-events.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-helpcenter.png b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/images/icon-helpcenter.png deleted file mode 100644 index 653a17c83f066c268c10f4b909046445cc6703b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8738 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 + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/params.less b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/params.less new file mode 100644 index 000000000..11cf02177 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/App_Themes/default/params.less @@ -0,0 +1,26 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@text-color: #333; +@border-color: #d1d1d1; +@grey-text: #666666; +@body-color: #fff; +@text-area-border-color: #c7c7c7; +@body-color-hover: #E6E6E6; +@dark-text-color: #000000; +@dark-middle-text-color: #555555; +@body-color-bg: white; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/Controls/ButtonSidePanel.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Controls/ButtonSidePanel.ascx.cs index 914d9b079..96e1375b0 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Controls/ButtonSidePanel.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Controls/ButtonSidePanel.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + #region Usings using System; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Controls/NavigationSidePanel.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Controls/NavigationSidePanel.ascx.cs index 402470c5a..cef67624c 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Controls/NavigationSidePanel.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Controls/NavigationSidePanel.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Default.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Default.aspx.cs index 5b8c8d3ef..11b46bf60 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Default.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Default.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,7 +47,7 @@ private static bool ShowEmptyScreen() } var tenantId = CoreContext.TenantManager.GetCurrentTenant().TenantId; - using (var db = DbManager.FromHttpContext("community")) + using (var db = new DbManager("default")) { var hasacitvity = db.ExecuteScalar(@"select exists(select 1 from blogs_posts where tenant = @tid) or " + "exists(select 1 from bookmarking_bookmark where tenant = @tid) or exists(select 1 from events_feed where tenant = @tid) or " + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Help.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Help.aspx.cs index 7a4d5d365..5a4c7cf3a 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Help.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Help.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/HttpHandlers/ThumbHandler.cs b/web/studio/ASC.Web.Studio/Products/Community/HttpHandlers/ThumbHandler.cs index 44e7b7568..3787ecce3 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/HttpHandlers/ThumbHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/HttpHandlers/ThumbHandler.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Linq; using System.Net; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Master/ClientScripts/ClientLocalizationResources.cs b/web/studio/ASC.Web.Studio/Products/Community/Master/ClientScripts/ClientLocalizationResources.cs index 822fe84d3..eda94d8dc 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Master/ClientScripts/ClientLocalizationResources.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Master/ClientScripts/ClientLocalizationResources.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Master/ClientScripts/ClientTemplateResources.cs b/web/studio/ASC.Web.Studio/Products/Community/Master/ClientScripts/ClientTemplateResources.cs index 3826843ee..92eb79f7c 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Master/ClientScripts/ClientTemplateResources.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Master/ClientScripts/ClientTemplateResources.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using ASC.Web.Core.Client.HttpHandlers; namespace ASC.Web.Community.ClientScripts diff --git a/web/studio/ASC.Web.Studio/Products/Community/Master/Community.Master.cs b/web/studio/ASC.Web.Studio/Products/Community/Master/Community.Master.cs index b7c66b269..9b6d842d6 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Master/Community.Master.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Master/Community.Master.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/AddBlog.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/AddBlog.aspx.cs index 46acf561f..689f4aeab 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/AddBlog.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/AddBlog.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/blogstyle.css b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/blogstyle.less similarity index 82% rename from web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/blogstyle.css rename to web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/blogstyle.less index 3990e2542..19a1f9ab2 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/blogstyle.css +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/blogstyle.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,58 +15,60 @@ */ -table.MainBlogsTable -{ - width: 100%; - border-bottom: 1px dotted #D1D1D1; -} -table.MainBlogsTable td.avatarContainer -{ - width: 85px; -} - -.ContentMainBlog -{ - margin: 12px 8px 0; -} - -.TagsMainBlog -{ - margin: 20px 8px 0; -} -.TagsImgMainBlog -{ - margin-bottom:-2px; - margin-right:2px; -} - -.BlogsBodyBlock { - padding-left: 0px; -} - -#tableForNavigation { - height: 24px; - width: 100%; -} - -.navigationLinkBox .tl-combobox { - background: url("images/comboarrow_bottom.png") no-repeat scroll right center transparent; - margin-bottom: 1px; - vertical-align: middle; -} - -.navigationLinkBox .tl-combobox .combobox-title .inner-text { - border-bottom: 1px dotted #666666; - color: #666666; -} -.table-border-dotted { - border-bottom: 1px dotted #D1D1D1; -} - -.MainBlogsTable .author-title { - display: inline-block; -} -.MainBlogsTable .author-name { - display: inline-block; - margin-left: 12px; -} +@import "../../../../App_Themes/default/params.less"; + +table.MainBlogsTable +{ + width: 100%; + border-bottom: 1px dotted @border-color; +} +table.MainBlogsTable td.avatarContainer +{ + width: 85px; +} + +.ContentMainBlog +{ + margin: 12px 8px 0; +} + +.TagsMainBlog +{ + margin: 20px 8px 0; +} +.TagsImgMainBlog +{ + margin-bottom:-2px; + margin-right:2px; +} + +.BlogsBodyBlock { + padding-left: 0px; +} + +#tableForNavigation { + height: 24px; + width: 100%; +} + +.navigationLinkBox .tl-combobox { + background: url("images/comboarrow_bottom.png") no-repeat scroll right center transparent; + margin-bottom: 1px; + vertical-align: middle; +} + +.navigationLinkBox .tl-combobox .combobox-title .inner-text { + border-bottom: 1px dotted @grey-text; + color: @grey-text; +} +.table-border-dotted { + border-bottom: 1px dotted @border-color; +} + +.MainBlogsTable .author-title { + display: inline-block; +} +.MainBlogsTable .author-name { + display: inline-block; + margin-left: 12px; +} diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/BlogIconWG.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/BlogIconWG.png deleted file mode 100644 index a574cc919a0f0b3e205b996b74270c362d1cea95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1496 zcmV;}1t34+ ztvjoJdPTRYQmKSMAOKZWD*z}I50cS6gkY=D5Id-^jlVHf}%C$@XR^EhcI;F`tfrZ8XB>LanGhS(d_b&Liz@nCl1E-uhjZCU2$ z=dD?Gc6M$%lRkCC4*-`c085(IwGaxS*bs&7w4Ff+eI6@;@B-j)6bc0_EiGC7TefW3 zaVl~A7cT&5!wEq#9Q?hsCbUB>77-4I%OCR}wnH0-SpO+*+%7q^%i^6m8`d-p)6>(a zBOS@7tE;Q$#EF4JPXjO2Xh|X&930FN`T;VWjYJ}d-}nIP>|qj92+>3v^xW4#Fi``* zJA2l^$jFEVfXA@V*j_9aV`jeJuwlb%43hhKq7DPpF-|k+CPM?}@OxQfz7L6nKul1q z?o0z`U%<`O7ckYtvH-X+0L}t-!fhTGqR_Usw&Kc_E3Xm&D+A>J4g=@U52ILIMBx1U z*}ADi1DSOqyZ(LyO3)6J8h}{a0psBxpoBBa0^l%k{8@xt_}xl3Dx;<q~pti=nDC zj9hpZA%vmd=^JlsFuU&y8w1dltR++SMNB9&qr}9^n9A&hQI}jc3*6z5Pjhp#m7eTa zhNnt|iBcbgMhcA+?IB~F)}wC45M>Z@vYG*P;Udzv-XUmT^kS1nEAkOZ@t#mK+K&plbxj?!5nE?jjj(-&Z zXI0?rF)aXGk59DsV&m9ua(tb#z;Oe$@Fy{`o0uTxg8oc+-K(PS`YG}d& zp#{@0w)I0C-42yOsP;H!YVIP;KYB2gWG0d;ZaSGv#uA-mrzQl;fnYJAz75Kbe&E+0 z+DWcT60EVo;utcw--6Nc6HEf@4Tbx0FHSWpVOi;}P^e`P(olXzMcwAFkT~}`)Y3#H z95hxbi~;9*@Ne@06wSse2NFa&op#jk9|AX6Q2`+hFoif4*d+(_*w zVOFw(Yi57}xYrDS5qghIwra}^NP}sJ#1V*r=b>oV9H4{^Glf}{VsmI|f7CMQULm<= zd#tPF84#|vQp-SvR?R$6GW8qY{Oy(>(Xu17S2gY9zta855NOP0?6m{ zzU#g1q2FisC&Men}7mNV(xYeT&k=UgNM-mSN46B1!0Ha>}=(00 zHwV7Owr8I~DwXnGobHJMR&Gm6OARRRswVqeH$H&JpW2F#KHg)2+_Y(v^_>qYH79Gw z&_RDJmmV4swc-<1LXzLyyP({1<>DjTR1~^1So=ae9=|&Sxyv2O$}zHcPkRTQT?|;d zjMtkr_pVF15r@(LCBnO9O6AmKJBI&SlFQ|=?5Wsu?TSzpwo3@*ttaGp56XR09{25| y3>S^B8g^NvvS9a{t|N~@zO_}qoGPn*J^v4uWOCb`RDnkT0000}fB(Vq;}b_x(HL|0+`k}6 zdF1nXCzs1Pk|YUbvsovdPCKz!45?Hq2!Q<+%Y7ODmY)t_dpkK4P3ed5pRZo8gJ6iq zQ79C65qv%$wzjs!T_TbA%4XM9HsSZaTIr_ZVbUjt z%KSNGsS~TT2g@{I7zS+H7VS?>O~LE+Vrgj!Gcz+_D}xtVVCXulJYmBaI{=KeH9^4+ zNOi!l9GHd%UDsinrhsKK83E)SvE?^c+4S3649^*hJ!GSJN5wwUM^dB<@;;y$1kqJd z%tw-C8II$CZ-p)PpJkH+ml*CacCGXHiNefnfP3L@c2eEwf=X_wT9E*X=tNNzVQMm& z1PkYzT9m=MAH8;!xWyCgKtG3&Mj7nY%TOACqFH2~ECAJN6}!8;V8M;mmfZL5c9dxY z3Wxa500VzIA<$m%26AMqrs<$?p;RgfFBloolH2WeRmw#aodz;Adwt{>@RA_oOryPfw4F2gkHb=yn5?EjaIwLKsVqh$iR_C>s2q{fNaA2#3S?4RRMd>2CCp Q0000007*qoM6N<$g3Lu=;s5{u diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blog_add.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blog_add.svg new file mode 100644 index 000000000..70889145d --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blog_add.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blog_icon.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blog_icon.png deleted file mode 100644 index 7740bb118b8fc2498e6654db263278aedb180f10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17325 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 diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blog_icon.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blog_icon.svg new file mode 100644 index 000000000..eb9650e1c --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blog_icon.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blogiconwg.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blogiconwg.svg new file mode 100644 index 000000000..c95757771 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blogiconwg.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blogs.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/App_Themes/default/images/blogs.png deleted file mode 100644 index a574cc919a0f0b3e205b996b74270c362d1cea95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1496 zcmV;}1t34+ ztvjoJdPTRYQmKSMAOKZWD*z}I50cS6gkY=D5Id-^jlVHf}%C$@XR^EhcI;F`tfrZ8XB>LanGhS(d_b&Liz@nCl1E-uhjZCU2$ z=dD?Gc6M$%lRkCC4*-`c085(IwGaxS*bs&7w4Ff+eI6@;@B-j)6bc0_EiGC7TefW3 zaVl~A7cT&5!wEq#9Q?hsCbUB>77-4I%OCR}wnH0-SpO+*+%7q^%i^6m8`d-p)6>(a zBOS@7tE;Q$#EF4JPXjO2Xh|X&930FN`T;VWjYJ}d-}nIP>|qj92+>3v^xW4#Fi``* zJA2l^$jFEVfXA@V*j_9aV`jeJuwlb%43hhKq7DPpF-|k+CPM?}@OxQfz7L6nKul1q z?o0z`U%<`O7ckYtvH-X+0L}t-!fhTGqR_Usw&Kc_E3Xm&D+A>J4g=@U52ILIMBx1U z*}ADi1DSOqyZ(LyO3)6J8h}{a0psBxpoBBa0^l%k{8@xt_}xl3Dx;<q~pti=nDC zj9hpZA%vmd=^JlsFuU&y8w1dltR++SMNB9&qr}9^n9A&hQI}jc3*6z5Pjhp#m7eTa zhNnt|iBcbgMhcA+?IB~F)}wC45M>Z@vYG*P;Udzv-XUmT^kS1nEAkOZ@t#mK+K&plbxj?!5nE?jjj(-&Z zXI0?rF)aXGk59DsV&m9ua(tb#z;Oe$@Fy{`o0uTxg8oc+-K(PS`YG}d& zp#{@0w)I0C-42yOsP;H!YVIP;KYB2gWG0d;ZaSGv#uA-mrzQl;fnYJAz75Kbe&E+0 z+DWcT60EVo;utcw--6Nc6HEf@4Tbx0FHSWpVOi;}P^e`P(olXzMcwAFkT~}`)Y3#H z95hxbi~;9*@Ne@06wSse2NFa&op#jk9|AX6Q2`+hFoif4*d+(_*w zVOFw(Yi57}xYrDS5qghIwra}^NP}sJ#1V*r=b>oV9H4{^Glf}{VsmI|f7CMQULm<= zd#tPF84#|vQp-SvR?R$6GW8qY{Oy(>(Xu17S2gY9zta855NOP0?6m{ zzU#g1q2FisC&Men}7mNV(xYeT&k=UgNM-mSN46B1!0Ha>}=(00 zHwV7Owr8I~DwXnGobHJMR&Gm6OARRRswVqeH$H&JpW2F#KHg)2+_Y(v^_>qYH79Gw z&_RDJmmV4swc-<1LXzLyyP({1<>DjTR1~^1So=ae9=|&Sxyv2O$}zHcPkRTQT?|;d zjMtkr_pVF15r@(LCBnO9O6AmKJBI&SlFQ|=?5Wsu?TSzpwo3@*ttaGp56XR09{25| y3>S^B8g^NvvS9a{t|N~@zO_}qoGPn*J^v4uWOCb`RDnkT0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsModule.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsModule.cs index a70d5253a..a025e03f7 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsModule.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsModule.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,8 +59,8 @@ public BlogsModule() Context = new ModuleContext { DefaultSortOrder = 1, - SmallIconFileName = "blog_add.png", - IconFileName = "blogiconwg.png", + SmallIconFileName = "blog_add.svg", + IconFileName = "blogiconwg.svg", SubscriptionManager = new BlogsSubscriptionManager(), GetCreateContentPageAbsoluteUrl = () => CanEdit() ? VirtualPathUtility.ToAbsolute(ASC.Blogs.Core.Constants.BaseVirtualPath + "AddBlog.aspx") : null, SearchHandler = new BlogsSearchHandler(), diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsSearchHandler.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsSearchHandler.cs index c25a8db3d..ceded6cc3 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsSearchHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsSearchHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,7 +51,7 @@ public override SearchResultItem[] Search(string text) public override ImageOptions Logo { - get { return new ImageOptions { ImageFileName = "blog_add.png", PartID = Constants.ModuleID }; } + get { return new ImageOptions { ImageFileName = "blog_add.svg", PartID = Constants.ModuleID }; } } public override string SearchName diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsShortcutProvider.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsShortcutProvider.cs index 89cc6b8b3..093b21e11 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsShortcutProvider.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsShortcutProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsSubscriptionManager.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsSubscriptionManager.cs index db55d6e8f..ed5195f83 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsSubscriptionManager.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/BlogsSubscriptionManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/Subscriber.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/Subscriber.cs index 28ea46141..9cd19f49b 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/Subscriber.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Common/Subscriber.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/BlogsEngine.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/BlogsEngine.cs index bd640e2ff..fc81e180f 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/BlogsEngine.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/BlogsEngine.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -247,14 +247,12 @@ public void SavePost(Post post, bool isNew, bool notifyComments) NotifyClient.SendNoticeAsync( Constants.NewPost, null, - null, tags.ToArray()); NotifyClient.SendNoticeAsync( Constants.NewPostByAuthor, post.UserID.ToString(), - null, tags.ToArray()); NotifyClient.EndSingleRecipientEvent("asc_blog"); diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/BlogsSettings.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/BlogsSettings.cs index 00ef7f353..2bf539fd7 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/BlogsSettings.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/BlogsSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Constants.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Constants.cs index 663b453be..86f4f3376 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Constants.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Constants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/BlogsStorage.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/BlogsStorage.cs index a3b4b9b38..810137381 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/BlogsStorage.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/BlogsStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,7 @@ public class BlogsStorage : IDisposable public BlogsStorage(string dbId, int tenant) { - _db = DbManager.FromHttpContext(dbId); + _db = new DbManager(dbId); _tenant = tenant; _postDao = new DbPostDao(_db, _tenant); } diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/DbDao.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/DbDao.cs index 3507895f3..15acb9980 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/DbDao.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/DbDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/DbPostDao.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/DbPostDao.cs index 73a33c383..80d806ce0 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/DbPostDao.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/DbPostDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/IBlogDao.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/IBlogDao.cs index 66f79481e..f439ae147 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/IBlogDao.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/IBlogDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/Map.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/Map.cs index 70c2e8a78..db9b59708 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/Map.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Data/Map.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Blog.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Blog.cs index d3ae0d308..b8f4357a6 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Blog.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Blog.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/BlogInfo.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/BlogInfo.cs index 915b1c7e9..b49a40bc0 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/BlogInfo.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/BlogInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Comment.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Comment.cs index 2a7a5df88..9f7d40b27 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Comment.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Comment.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Post.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Post.cs index 53657fd1a..6afc141e2 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Post.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Post.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Rating.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Rating.cs index f43e11e85..610508d28 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Rating.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Rating.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/ReviewPost.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/ReviewPost.cs index 8ca0961ec..a5751f396 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/ReviewPost.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/ReviewPost.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Settings.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Settings.cs index 1a60644ad..c87690393 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Settings.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Settings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Tag.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Tag.cs index 650d6836f..b0c0cca18 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Tag.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Domain/Tag.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Helpers/SubscriptionNotitySenders.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Helpers/SubscriptionNotitySenders.cs index a7632ad43..4f7103e54 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Helpers/SubscriptionNotitySenders.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Helpers/SubscriptionNotitySenders.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Security/CorporateBlogSecObject.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Security/CorporateBlogSecObject.cs index 02d59d3e0..2076ec827 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Security/CorporateBlogSecObject.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Security/CorporateBlogSecObject.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Security/PersonalBlogSecObject.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Security/PersonalBlogSecObject.cs index 7fcfdbb3b..0c02a6db5 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Security/PersonalBlogSecObject.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Security/PersonalBlogSecObject.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Service/BlogNotifySource.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Service/BlogNotifySource.cs index 1e99b8b57..7f58fe7bc 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Service/BlogNotifySource.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Core/Service/BlogNotifySource.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Default.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Default.aspx.cs index f56ded75b..432ec5e81 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Default.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Default.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -176,7 +176,7 @@ private void FillSelectedPage(List posts, BlogsEngine engine) { var emptyScreenControl = new EmptyScreenControl { - ImgSrc = WebImageSupplier.GetAbsoluteWebPath("blog_icon.png", ASC.Blogs.Core.Constants.ModuleId), + ImgSrc = WebImageSupplier.GetAbsoluteWebPath("blog_icon.svg", ASC.Blogs.Core.Constants.ModuleId), Header = BlogsResource.EmptyScreenBlogCaption, Describe = currentUser.IsVisitor() ? BlogsResource.EmptyScreenBlogTextVisitor : BlogsResource.EmptyScreenBlogText }; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/EditBlog.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/EditBlog.aspx.cs index 4946c67b1..35af5738c 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/EditBlog.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/EditBlog.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/PageControllers/BasePage.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/PageControllers/BasePage.cs index 1225caff7..5aa80dbd9 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/PageControllers/BasePage.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/PageControllers/BasePage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ using AjaxPro; using ASC.Blogs.Core; +using ASC.Web.Core.Utility; using ASC.Web.Studio; using ASC.Web.Studio.Utility; @@ -66,9 +67,17 @@ protected virtual string RenderRedirectUpload() protected void RenderScripts() { + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/Products/Community/App_Themes/dark/dark-blogstyle.less"); + } + else + { + Page.RegisterStyle("~/Products/Community/Modules/Blogs/App_Themes/default/blogstyle.less"); + } + Page.RegisterBodyScripts("~/Products/Community/Modules/Blogs/js/blogs.js", "~/Products/Community/js/tagsautocompletebox.js") - .RegisterStyle("~/Products/Community/Modules/Blogs/App_Themes/default/blogstyle.css") .RegisterInlineScript(@" function createSearchHelper() { diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/PageControllers/BaseUserControl.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/PageControllers/BaseUserControl.cs index aff0339a7..ddd80eca7 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/PageControllers/BaseUserControl.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/PageControllers/BaseUserControl.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/ViewBlog.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/ViewBlog.aspx.cs index 68dcf60b3..29523152b 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/ViewBlog.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/ViewBlog.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Views/ViewBlogView.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Views/ViewBlogView.ascx.cs index 2359ef975..3b7dd4871 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Views/ViewBlogView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/Views/ViewBlogView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/js/blogs.js b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/js/blogs.js index 00e58153b..39433cc9d 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/js/blogs.js +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Blogs/js/blogs.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/css/bookmarkingstyle.css b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/css/bookmarkingstyle.less similarity index 81% rename from web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/css/bookmarkingstyle.css rename to web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/css/bookmarkingstyle.less index 6cad38ae2..65f24d72d 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/css/bookmarkingstyle.css +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/css/bookmarkingstyle.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,315 +15,306 @@ */ -.bookmarks-row { - border-left: medium none; - border-right: medium none; - margin-bottom: -1px; -} - -.bookmarks-row:hover -{ - background-color: #E6E6E6; -} - -.bookmarks-row:hover .linkHeader -{ - text-decoration: underline; -} - -.bookmarkingContentArea -{ - margin-top: 5px; - margin-bottom: 5px; -} - -.bookmarkingAreaWithMargin10 -{ - margin-top: 10px; - margin-bottom: 5px; -} - -.bookmarkingInputUrl, .bookmarkingInputText, .bookmarkingInputTextArea -{ - width: 100%; - background-color: #FFFFFF; - border: 1px solid #C7C7C7; - resize: none; -} - -.bookmarkingInputUrl, .bookmarkingInputText -{ - height: 19px; -} - -.bookmarkingAreaWithRightMargin10 -{ - margin-right: 10px; -} - -.bookmarkingRaitingCenterGold -{ - background-image: url('imagescss/yell01_star.png'); - width: 26px; - height: 19px; -} - -.bookmarkingRaitingCenterGrey -{ - background-image: url('imagescss/wh01_star.png'); - width: 26px; - height: 19px; -} - -.bookmarkingRaitingCenterSimpleMode -{ - background-image: url('imagescss/goldStar.gif'); - width: 25px; - height: 25px; -} - -.bookmarkingRaitingRight -{ - background-image: url('imagescss/wh03_end.png'); - width: 10px; - height: 19px; -} - -.bookmarkingRaitingRightGold -{ - background-image: url('imagescss/yell03_end.png'); - width: 10px; - height: 19px; -} - -.bookmarkingRaitingLeftGold -{ - background-image: url('imagescss/yel02_bg.gif'); - min-width: 10px; - max-width: 300px; - height: 25px; -} - -.bookmarkingRaitingLeftCornerGold -{ - background-image: url('imagescss/yel01.gif'); - width: 15px; - height: 25px; -} - -.bookmarkingRaitingLeftGrey -{ - background-image: url('imagescss/wh02_bg.gif'); - min-width: 10px; - max-width: 300px; - height: 25px; -} - -.bookmarkingRaitingLeftCornerGrey -{ - background-image: url('imagescss/wh01.gif'); - width: 15px; - height: 25px; -} - -.bookmarkingRaitingLabel -{ - background-image: url('imagescss/wh02_bg.png'); - height: 19px; -} - -.bookmarkingRaitingGoldLabel -{ - background-image: url('imagescss/yell02_bg.png'); - height: 19px; -} - -.bookmarkDescriptionPanel -{ -} - -.bookmarkDescriptionPanel a:link -{ - color: #555555; - text-decoration: none; -} -.bookmarkDescriptionPanel a:visited -{ - color: #555555; - text-decoration: none; -} -.bookmarkDescriptionPanel a:active -{ - color: #555555; - text-decoration: none; -} - -.bookmarkDescriptionPanel a:hover -{ - color: #000000; - text-decoration: none; -} - -.bookmarkingAreaWithHand -{ - cursor: pointer; -} - -.bookmarkingAreaWithBottomBorder -{ - border-bottom: solid 1px #D1D1D1; - margin-bottom: 8px; -} - -.bookmarkingAddBookmarkImage -{ - background: url('imagescss/add_book.gif') no-repeat scroll 0 bottom transparent; - display: inline-block; - padding-left: 17px; - padding-top: 4px; - height: 16px; -} - -.bookmarkingCreateNewBookmarkContainer -{ - padding-left: 5px; - margin-top: 15px; - padding-top: 15px; - padding-bottom: 15px; -} - -.bookmarkingThumbnail -{ - width: 96px; - height: 72px; - /*float: left; - margin-right: 15px;*/ - border: solid 1px #c7c7c7; -} - -.bookmarkingCommentsDiv -{ - background-image: url('imagescss/comment.gif'); - width: 16px; - height: 16px; - margin-right: 5px; -} - -.bookmarkingTag16 -{ - background-image: url('imagescss/tag_16.gif'); - width: 16px; - height: 16px; - margin-right: 2px; -} - -.bookmarkingInfoArea -{ - width: 92%; -} - -.bookmarkingSingleBookmarkDescriptionArea -{ - margin-top: 6px; -} - -.bookmarkingDetailsDivWithImage -{ - background: url("imagescss/bookmarking_details.png") no-repeat scroll 0 bottom transparent; - display: inline-block; - padding: 0 0 0 17px; - height: 15px; -} - -.bookmarkingEditDivWithImage -{ - background: url("imagescss/16_edit.png") no-repeat scroll 0 top transparent; - display: inline-block; - padding: 0 0 0 17px; - height: 16px; -} - -.bookmarkingAddToFavouritesPlus -{ - background: url("imagescss/plus_add.png") no-repeat scroll 0 bottom transparent; - display: inline-block; - width: 23px; - height: 19px; -} - -.bookmarkingRemoveFromFavourites -{ - background: url("imagescss/remove.png") no-repeat scroll 0 bottom transparent; - display: inline-block; - width: 23px; - height: 19px; -} - -.bookmarkingSingleBookmarkArea -{ - padding-bottom: 14px; - padding-top: 14px; - border-bottom: 1px solid #D1D1D1; -} - -.bookmarkingGreyText -{ - color: #646567; -} - -.bookmarkingAddToFavouritePanelWithMargin -{ - padding-left: 20px; - padding-right: 20px; -} - -.bookmarkingPagination -{ - margin-top: 0px; -} - -.boormarkedByAreaWithBorder -{ - border-bottom: solid 1px #D1D1D1; -} - -.bookmarkingAreaWithWhiteBackground -{ - background-color: #ffffff; -} - -img:-moz-broken, -img:-moz-user-disabled { - -moz-force-broken-image-icon: 1; -} - -.marginnone { - margin-bottom: 0px; -} - -#tableForNavigation { - height: 24px; - width: 100%; -} - -.navigationLinkBox .tl-combobox { - background: url("imagescss/comboarrow_bottom.png") no-repeat scroll right center transparent; - margin-bottom: 1px; - vertical-align: middle; -} - -.navigationLinkBox .tl-combobox .combobox-title .inner-text { - border-bottom: 1px dotted #666666; - color: #666666; -} - -.bookmarks-content { - max-width: 550px; - vertical-align: top; -} - -#BookmarkToRemoveFromFavouriteName { - display: block; - overflow: hidden; - text-overflow: ellipsis; +@import "../../../../../App_Themes/default/params.less"; + +.bookmarks-row { + border-left: medium none; + border-right: medium none; + margin-bottom: -1px; +} + +.bookmarks-row:hover { + background-color: @body-color-hover; +} + +.bookmarks-row:hover .linkHeader +{ + text-decoration: underline; +} + +.bookmarkingContentArea +{ + margin-top: 5px; + margin-bottom: 5px; +} + +.bookmarkingAreaWithMargin10 +{ + margin-top: 10px; + margin-bottom: 5px; +} + +.bookmarkingInputUrl, .bookmarkingInputText, .bookmarkingInputTextArea { + width: 100%; + background-color: @body-color; + border: 1px solid @text-area-border-color; + resize: none; +} + +.bookmarkingInputUrl, .bookmarkingInputText +{ + height: 19px; +} + +.bookmarkingAreaWithRightMargin10 +{ + margin-right: 10px; +} + +.bookmarkingRaitingCenterGold +{ + background-image: url('imagescss/yell01_star.png'); + width: 26px; + height: 19px; +} + +.bookmarkingRaitingCenterGrey +{ + background-image: url('imagescss/wh01_star.png'); + width: 26px; + height: 19px; +} + +.bookmarkingRaitingCenterSimpleMode +{ + background-image: url('imagescss/goldStar.gif'); + width: 25px; + height: 25px; +} + +.bookmarkingRaitingRight +{ + background-image: url('imagescss/wh03_end.png'); + width: 10px; + height: 19px; +} + +.bookmarkingRaitingRightGold +{ + background-image: url('imagescss/yell03_end.png'); + width: 10px; + height: 19px; +} + +.bookmarkingRaitingLeftGold +{ + background-image: url('imagescss/yel02_bg.gif'); + min-width: 10px; + max-width: 300px; + height: 25px; +} + +.bookmarkingRaitingLeftCornerGold +{ + background-image: url('imagescss/yel01.gif'); + width: 15px; + height: 25px; +} + +.bookmarkingRaitingLeftGrey +{ + background-image: url('imagescss/wh02_bg.gif'); + min-width: 10px; + max-width: 300px; + height: 25px; +} + +.bookmarkingRaitingLeftCornerGrey +{ + background-image: url('imagescss/wh01.gif'); + width: 15px; + height: 25px; +} + +.bookmarkingRaitingLabel +{ + background-image: url('imagescss/wh02_bg.png'); + height: 19px; +} + +.bookmarkingRaitingGoldLabel +{ + background-image: url('imagescss/yell02_bg.png'); + height: 19px; +} + +.bookmarkDescriptionPanel +{ +} + +.bookmarkDescriptionPanel a:link { + color: @dark-middle-text-color; + text-decoration: none; +} +.bookmarkDescriptionPanel a:visited { + color: @dark-middle-text-color; + text-decoration: none; +} +.bookmarkDescriptionPanel a:active { + color: @dark-middle-text-color; + text-decoration: none; +} + +.bookmarkDescriptionPanel a:hover { + color: @dark-text-color; + text-decoration: none; +} + +.bookmarkingAreaWithHand +{ + cursor: pointer; +} + +.bookmarkingAreaWithBottomBorder { + border-bottom: solid 1px @border-color; + margin-bottom: 8px; +} + +.bookmarkingAddBookmarkImage +{ + background: url('imagescss/add_book.gif') no-repeat scroll 0 bottom transparent; + display: inline-block; + padding-left: 17px; + padding-top: 4px; + height: 16px; +} + +.bookmarkingCreateNewBookmarkContainer +{ + padding-left: 5px; + margin-top: 15px; + padding-top: 15px; + padding-bottom: 15px; +} + +.bookmarkingThumbnail { + width: 96px; + height: 72px; + /*float: left; + margin-right: 15px;*/ + border: solid 1px @text-area-border-color; +} + +.bookmarkingCommentsDiv +{ + background-image: url('imagescss/comment.gif'); + width: 16px; + height: 16px; + margin-right: 5px; +} + +.bookmarkingTag16 +{ + background-image: url('imagescss/tag_16.gif'); + width: 16px; + height: 16px; + margin-right: 2px; +} + +.bookmarkingInfoArea +{ + width: 92%; +} + +.bookmarkingSingleBookmarkDescriptionArea +{ + margin-top: 6px; +} + +.bookmarkingDetailsDivWithImage +{ + background: url("imagescss/bookmarking_details.png") no-repeat scroll 0 bottom transparent; + display: inline-block; + padding: 0 0 0 17px; + height: 15px; +} + +.bookmarkingEditDivWithImage +{ + background: url("imagescss/16_edit.png") no-repeat scroll 0 top transparent; + display: inline-block; + padding: 0 0 0 17px; + height: 16px; +} + +.bookmarkingAddToFavouritesPlus +{ + background: url("imagescss/plus_add.png") no-repeat scroll 0 bottom transparent; + display: inline-block; + width: 23px; + height: 19px; +} + +.bookmarkingRemoveFromFavourites +{ + background: url("imagescss/remove.png") no-repeat scroll 0 bottom transparent; + display: inline-block; + width: 23px; + height: 19px; +} + +.bookmarkingSingleBookmarkArea { + padding-bottom: 14px; + padding-top: 14px; + border-bottom: 1px solid @border-color; +} + +.bookmarkingGreyText +{ + color: #646567; +} + +.bookmarkingAddToFavouritePanelWithMargin +{ + padding-left: 20px; + padding-right: 20px; +} + +.bookmarkingPagination +{ + margin-top: 0px; +} + +.boormarkedByAreaWithBorder { + border-bottom: solid 1px @border-color; +} + +.bookmarkingAreaWithWhiteBackground { + background-color: @body-color; +} + +img:-moz-broken, +img:-moz-user-disabled { + -moz-force-broken-image-icon: 1; +} + +.marginnone { + margin-bottom: 0px; +} + +#tableForNavigation { + height: 24px; + width: 100%; +} + +.navigationLinkBox .tl-combobox { + background: url("imagescss/comboarrow_bottom.png") no-repeat scroll right center transparent; + margin-bottom: 1px; + vertical-align: middle; +} + +.navigationLinkBox .tl-combobox .combobox-title .inner-text { + border-bottom: 1px dotted @grey-text; + color: @grey-text; +} + +.bookmarks-content { + max-width: 550px; + vertical-align: top; +} + +#BookmarkToRemoveFromFavouriteName { + display: block; + overflow: hidden; + text-overflow: ellipsis; } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarking_icon.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarking_icon.png deleted file mode 100644 index 764eebf72ed579aa24a2c055391ed23b7f457199..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1104 zcmV-W1h4yvP)mKZU3p}!U0MVOLMXMKBI8q3k(en!M1Ja za1OWOK9!!H9*m8RH3K;F?yZ-(<6Qpghl`PdH6XpVz+M&B@@>RYgAg$r7)W97?`<%- zfpHGbh3a$p1(yd1?*P$%@MkdgQT3A#SDOI9Fs{Z2lDT$Ti_qN1r;cM`VF8nqllZmh z;Dg)0;l_Kf;H8mNTe?>_w(;8Xoq4wP*RmXrh5#UESawIjTr|d9YN?AO7s#1h-Z`u8 zIj;Pv0hQ87iw_v`Z+-P(|c5g!g zVVo(D+;zcR*>@f3TrOUJ;V`}~{L$)!zibt8x0J_)Hd<55L<7)j{xM>)br@R?V8{Ih zAq9ijQLU^JfJ9L5`wq%m0X%qr5vf!PPkw4R9Y;gB2B4xq{#;(1!P3$qrl+UT-`_96 zbRW@cYiq3l8sXCrtOSZipL<|TvbWTXD1MsTG%7@`@CFj(MhF(7xvv3qBe1JPqz_{O zy0tK_LFsk5u)Dj9QmLeBP!OHN81q}Iv`*t}Hrt*7n$!$9qFG}N$o0N6WJ@-ujMmrJ zheRR~=>uT~I+{S+QwidA!O90r8%%~MclPR8PSgQZDixH=WyOSH82-U3^t?*iYg2W_ zfJ!PVv3T^y58z2M3ugCXVCw-`wd|Y2vMiqgiUJLyljG?c^qnRrqy-YL?A@EddU^`$ zN8iMFHV5nOE%e;`9&YI$n8bwCj#wxbi@p$_MbGwOf5_!>?E&aRh<=es(nS&iGLrkyqy6 z;2`4hdZrtG;~X{;hv0tmxdK3iq9Ew$;Rv9<_JfIu2_HzL6B2;YOP?Z@%qSaEW+d&X zPame!X{6sii^r3*$P7=YaWa`y?*a0Gpmv=YXlnwZ@$ic$kk9AUCi3uVwc6xRG~at< zP90XO)v&X(ql9a%gOQ+F&~<8Rs^unaNkqhgriu>MnuS5spAbgJI1jh_yGQ^MVL{q@ zjOhM9i{}r8CWbS1Fm+yh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarking_mini_icon.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarking_mini_icon.png deleted file mode 100644 index 545760e6b2d4c0a43f70a2bd098f79dc9ef2d15a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 633 zcmV-<0*3vGP)c-Eo^L4gcQNpq)3s{GHHVUAdtos zf$dHb4Yw9`S73r9J+S%hs~82 z{hix&iWJDAy8oMJ%lgcZ-{-Zx^J#t|`}=nesV**IR)S7Wsh+!)t8Ts7^Rh$%DrkUh zgV}}Dz5Dymf3NIWuMz~ViLZ~s=o>Gs7yYhEOztns)>ZSpo0|}TabQ%yBR_C1cwS7$05O-4U z;9gko?c&(^lOaF*O!@3k*gR$pRi!L;+D@Ja(!vOuNuA@MMT*grE`!sUU(N zKuuCaL}|uM-omZJ=jfliOf#q`uLH3L(ZHi%YM2@BMu~!%)0mMZq~01jx4%8j#-*#A z`DPD~S66xd%dhP23XK8oSQw^?sne7OS4G=4Ws0)@x9gmoS!QFoN0N%KF8;)LX+NEV zE41TxOp2gof`rg$P}&h+%+8~2V;>{r;l|I{L6-(h;p&5s^qeR2JeXa&l=cirQ`Y-*5Z~@2pZz T5&+kS00000NkvXXu0mjf{V*`G diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarking_mini_icon.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarking_mini_icon.svg new file mode 100644 index 000000000..94b8ea8fd --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarking_mini_icon.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarks_icon.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarks_icon.png deleted file mode 100644 index 5c328b94dfb93fea174438f5ac50114af29d5fe8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16157 zcmZvDWmFwaux)U6cMo=Om*DR1?r?C|;KAM9g1fuJ!QCN9a3{FKq^-+r8VcpM@7&Z;)Nhc*I?lyQ6cF7lrYgOp@Nj$&A9Ix6f*MV2vzb=1nKaPbxUKn&g zI8Lu0ox5DNr){dgW_Pd50^J^a^ZtIml;iM!>;6aT zam)xjqqL5)+-sRW+eeIJbN?U_Nu%~5(4O+(a@ggDU&OT>s7Ih$&y!Adv~wxK7*?ntyrC5tL0W53E{` zNnJ^54y>yY6)4`g9El(KnTJ`DTr{F|s99d=w_|DvSEYwF>|cE=@`@^GKp#2}om^~d zQT9x%09Rl@N(K_Ba8bV&iAcNbd{8_;MXC^LU8YVbDC{d^v^Ya-v#HL#{8J;78hXHp zeyny>2-OD@1ew`TfHw>y3SKNpX6Ia{Ls~BO3)Cx0E-MP|CS~|Tsw+b3)rP?q#vRTT zt$;8z^l~JBq@ANZMv(t45M9@i3@}FHHu@@Hd%>fE6nnr)U$7A z8x38)E>czP^O=>est=Y356uVFTn_nJ@P_6g-aT(7fw)6aq{6%|L@Jau=s@BQtKS|f zp~Ytl_?eJ&)eFNa#}Cg25^J}GklH_b>GYqhSin6e{_y2)=Acb7B#-_3E?U)}g=h{a zlyeOgL!hFQP%LO35>5>`wJ+Q{8c%eaX^ftVG3KWlF(S{`Qsamc4|Vy_GW&zA>HHe@ zx_lx93vI?}%1lEO9Ra5To&hdK+r_ZuowIwqp#-{(w z1Nt23Sv~0#6HGpo7z>%K0ttB#feqLsn+q*Dmn(iy@Mm7<)gtkLkA0jcGym_H-{#C6c z`I7^_$G2{WV#Q&ng~>?6pe9`%$=ErnHJaVw51wN&K;f;baSL-6^6%O0ug}Lrc>zt@ z@hLl*qCKxua<*#z7Y-oUMD0_{?X{qe?92x2O3dL7Dp_4k+4JI5Cf9 z{d209VcFeUlOM6)<~s!P_zNzTlNlb11L|Cp$n%pb7v2$N8F(6(iDV}V7=F;8=Ref( z5MHZZ`N3#1>K76sk3}T{m`0<(Q_PL*3T38^5MnnC-?$YOacq$$reCfuFR$0V<37(f z3`ZV&{?c-Ca`kn=iYJsDf-Xb+KTc+Dw}0Nq%7M~wQ=Sv2;Y47`4Cz7eK=O$&E3Zrt z8{h_64XLgSD3b?YFDwKlqBN1+1*O5Qm##rurb$FnoQMS+^e%o)?ewdz+83U`)|p5z zaX8T|M=F@n^2FrG%!tc>G_dO0@$IweN1c_Rs`QS-7Sm<4w^vd`?iez6a2VGe0PB6? z`sA(k9^PYO1g0G5b@^s|?)Wg>9#S*jVkmy1aqXiI{*mywgdhuP{#Mitx%>i0d;}o? z>j&`e<4N0%KxL~WofA8rg_=*8(4I$Sd4Q$;4kzm-B*r+Goz`CnUC|Cr*Tb%65qlDlqXaz?vV%Iftj99 zA|`<{WV`Ka(8~38*HISSD~1h;FcsNQ*3TG{i{QHHIN47wGD0}SZlHPL}P&F5^B~O96TT8jrh#m zpRGJkZNJGg>b3Q$D*hPWixcc|riNzXX2QG=B6&OHa#z&vbdTwMit61Nqt4sE&HLo{ z%60iW5W2)%W?h!`OIW+`{sM#P>W6U1 z&WTfMAfWY}Bt+4_uC1@{{`bx=_h$g?D2n`-b(b0AMnqFYbntat)RR6=L%?WNu~Y1t ziLk1=UYBQru=W;K%hufxmdLwYgGQj^sOcuO)>*ewXaIZ=!t9Y16{N5J2p>y^tT`!n zib+umclPSzkRCN)c$J=3VXpfJwX;++JZu6izIG}F??PFcd9wY{SmeFInkXjGfpY7s zJ%a_f>e+|=1VQn|eXakG#lp54yDLK8fKkFf5*P&vlZH#?7xnqmu3T=?1lFD(JYu= za$9<^dS9z1N#Yg4Kck2Qn5#d;S1As1V@TCS(JUjSA+hQ*RA-YWg;azk)20^2KiOv? zV`(Kzaq8f83CLHmrWWgK7Ma0Dw(~7+ay9vN8N>wSW(l5^Rm7p}DgEr=Y%>I>+6g}8 z{$u4dICm2I_QJ$&Y)w?zn{gb8)!d&HL^ z_dQyILg1l3?pjpvPL%(82t(HBfG4WL#GkbQAQMUcVb>V_Y|_6hF}d6bC~}I8nF}wm zw#x3LH}d;9t(KDU3B(kwg{pEh#0?^q`KO?9)=P$Z`im5mGIKn=zIebf&MWq=DV8cu ztt+Jt5Qyr!NJVpU8d8BYq+Y8RoWJg^tb$2cg4PjV?&eppX_zGsa+Xu7a9NQ|hKy`B zt;R9%3@owsJk#AC-`XP1dq21I`WuSlxm0Q3mJFk~?9XKNad6Z#+3G*Y3caAy*w{EY zJ&i2C;COpDg=G|qI@%cR@YQ%#ko%hvKcNbrWUjfHwnVPEUZ+=*ur@0VeAlA~6kR|Z z|1DPZw22-?>9^$$7Hl%`aTl%k5?Jyvo8cV=G8%@E*$%9e$a(Stj14I5aieuPhULfg z5lw_5VUa4u7PvqS`fCA7*(HQy4ana%W7A=zt1aOGzbHySwQ7dDPUi!7!RI8wu@rjE zZ~rqABWCX0BZYlOW#p$~%O23S-)o4b{yOi?I9KoURHakRvR+49^cds$dG?bZvF!Gq zL5u(Wk>OvD9@nS=jEO~(A9)*OSqt+am9$l=cS%dt z0_!QSc@S9$Y$jzJdT}BBa>VN?gv$D<3qraYxQ&|;*^;YTuRBbc6;Te&O^bUQxnUw! zDNRJz4{M)cdV_i$2%pn(Q$tJF3QkWl%}mRq%+F)4pK*rIx>x3Em?%hb_n| zQS3z3?;ofrz+d}Td7~YC?`=C2X;dOhfX5zX++>fj32{wa5zW`Qn)wkw$SVwbl01iJ z2G?UD^e)Ra=9ID+)Kp085n=H&+-mcg2CCLI=wsJ-U@_Hs^G&YdNQLdi#Ikm069#bl?ACnhug_SJcpn%semg5)G z=K9`@;QNtnjKuyRix-d35!CmI*=3NH0`Sgh_(j!79W= zHP-O_39{a|c7nwjy`u8Nx9)DdZEQ@1kewnMAu4cm90KJOhvzcS{@^$$lbi+-u>uOY zRMy?;?vjcqfbbTF(P)8$Tn-?~Kn0=Nh6nP*x(zaTH-o_C=cTHl1v@V3Gin|VWER8p!&k7iVgwFyL7{|f_%Ho?e1ByyB zB2y`K*q4R@)lHfwTF1-3gXc=3T$&7uNmE6*wc-BghTl`&UGx@cY9iX%hVP^doFSGX z4DCbe@5n36YOCQ|g^EG_trt5w*{Ag*wz}`;UD6|hS9532I9|a+o@kF7ypxe@t6FJ! zr;jcFGea99( zv`w@QDq%%tc{@55i;Fsz?}Siugi;yf4Qv{Dxz@L|yT2dRXl*hfQN1k-o0y=A6oP?| z!z70+Lj8Uj`x6PJG@_TcXB)=*!Am^1e)4lT|3ZQn?)S*?F`D+K<#uN6+g9VhhALGn zo=X=qsw{m?B|D(@OahQcZB;%7f}s}+{T8_%_C&2q)YQc(4yaNOLEX`aTHHqKxS|mZ zFC`TTk#dU}4Y2{$J#;a12e;uA}GvRqW`YK({TLJEo1Pye#Y z8O*0uvQR#=6fr(y`T`caaZBcPeLYjDPQO^>68msNoCPwGJ>f9r;03;I`N-ePM&V_I)l#p zZ2Sy8d_L+N|3Pj=zyQV~a?)W+dFRR$h?OA&xES(l?VmNkpeo$p$%$_F$0(0F z@vu%sL{j+6N;?@E12Ru7pN!HvMqw@0VS*kleR^2vkA)w+FvH-Iny%Uqr4VqcCoYd3 z9ywddjE-f$Jc0c}l8^>Nh2eTO;`EQ{70c#Kyc$2}(Y3)pFuBNf*r4zEK_b>M-f)P{ zT4~7K)l{lj3U!>V6If3zu%)uFr@5cVya3DVYYo2^C&;g)I2d4-I8A6 zV6`*hEK6o~87NFBo^P@fKO++NQBgOn`NKCy23R0JNh%3@IZ4&Ooo~*}amcQqGg2HJ z&L$Kcf`%sx{7$Jb4$AKaR@a&eIh?Z|DtC0x($SKW!!@sn$rid{K0slu0x{DP2@H(O zDd%v1QHfS*zy13cC%JEGus^KMpjdQkmzQC<%H5W-K7e@6XCvkQ??Tq9NIh zg%xZ3^pb4Kqs}Ql9haf~rDGBMqy1KP)@0KoV3SF6mHLk!M2xJTr2trAu_{Cx-CFP> z$KGbc(d^@5cG)pJ^)34f85VE@8Uf9?H}X1LIRGId4PIYqyF*$UJ-6mr#N^M)rREF2 zJlDouI!HBvty_o*yN~$J;_4ZJe)c>`(1dG^ueIlFeOC+%mk=wOGt}Hp5wJ^9sdq=W%KPs{2f!Hu z8=LiE&xrIyT!)mw#Hj-DLpRsb0;urQLzg-1`fgP3k=FB&%PA2*IP;K4He$Z&Vcy^r z+TGz>GAB*+O_J^azB>!fkYGPfwqYYR3H5To<{aw|O3u9vTN|qH=_gQMOGQn}H|;jJ zYjTwqiB&M1PW}4CUpOePA$L)Yo-RN^Xg=W^M-HN>hJux$@Ota==`5V!+qxU$Y_Mak z2LW{?EGV6i6SRe6)ZAFolv?xeEEAWWLq5|t?U!9R!u98~z(#Q~07jC4R8&zWJLuA0 zKr{|FZr_0Z>vW>}EBZ@hA@N(a9b4TWKFFVhU=R4U zSosxnA>80Q>^taaH3r>ZhWS=`zuQ%#b0TVuod%M@sB?j}N~Jniyv(o#d>=>9)~2P8 zOH!7wRVI|OUlWN-Hb+7;crhb1#cMfoqpY&Zm~AD-J!SulhYBmwr!4f^ecK`4%^F6m z_)V0TaH~5Z`@?9^Znhem+s8g^f8FLj+fE5cTSp zBfEL^^RZmW%b^cFV(D{o*RO9?ihH?PBumR4PTp)I2g8;xu0Oyf(6?n~_(Hzs3R+LU zXnw!Tel4didy#0fDv~O9t4}ve+a1JX;}q~%PX+K4*6z4G$E~e2_o8lIf}w6J`FnWD z7)3sUfT|Tg{OxB$f*~s_p43j>5r1hM7D>ct9yp zi-I?0Cxhe!QDi@|%MTucpreL^DpzV)Xk?O?&q?I)lBviCwmt+TfZ1_Ee*{;lCs->w zN@!&5|FlJ<^>KCGr2JXmC@Ke5RD7Rs_I1=U{Tl9o*UZ-)8TFIcSj#q5F*~{|ej4hb zkGT~U%l6fR1V+uU3WUiDjIuzD4zu-#`_=R>a6Q%?ku3l5VRdVD=Wqx^FI)&dGGB`b zmc08~#M(JiB{Rna?hU1-bM{_ zWX@qBM8rc1Q(FpZ0F2#cH_$k4nKoG{Sy)wD>tXo7$|YYRLI)2K;a9OBwzfDF6av64@eL0Qu!(UN=3tbKdC6EKJHDKeso>T<7ssE9_1zw{~53)iLa zw@PNwIb5B_qry&_2-b-9f;7;pG&D+3BU~iWh*HKRlr zk-NdD&8rW0)HHPZgXIc-7G&Zaj1za_w!OlbsxOxc?unyc$SSR|K;wFssS0Nehz5uxZ z*9?j`Ut=Y`%rOHZx-)a9{yIUyJ~>9){6Zn%3l&otYfSQ&OA8X>02>gn||$(-x_eS$S!7@PsKiUqRyX(aWg1k68*(@yO@xx z&oN)(tl%_oY<68Ul#2E~$CnwD4wn{>?w2YqU6nh_TD3h(th5@z8J=X;87;ByK%9o@ zO}yqg($ISOiH$3g?_|$|E={X<8dp)H~1bm%|H7Q+kiweSra7N9kuNR?$w9fovRFyotMeXoJ}&Ay&q z7R3dv&vmX?8vP4m-Iz)Th-|^u!o?|MjU5H$m8-0dwY<*$0%M_LYjBR4u)VQNGd8RXIV}x<~q3ePy2VUX3`za{v%+fE$-=xzl)sI3vGsr zs7SY1^e6G6MX5h^yBK9fkn%z?#jrK-e$!74&FE+mktkGl}E!@bDPG zomf_rg-l33kRpq7P0Q^Nd~syx8ECA%D~^j2#(m`Vcb!9G4=s&JZ)e9SvbiLyoJxIa z%BJ6wU!owLFYY#X*dzgj9CDX~8C6keO{lIf*|4A^5iCr&?w+?&vn{}ok&IA00-1sZ*tp!#-Y%VbWR+#yfOrKVOgqjWH<1PTci;gz z28fG!&;Y?)|0zTJwLTQ}ytOn@QVsSF_U`pdj?7Yf1Z+)ndL52|6%}~KwX(#qBX7&W@$%u9n0wX9f)~ZB?K%-@_(!rDd%1ge#J`o z-3e7*i7F~g_=#0ph}3AsgeajO!xACe!$=J%|Bz^U0)%Z4L7DazK@Pjdd^mdmS4xIZ z+%5tL&=8AcwfQypfzhZDGbK)(^@Gzwq=X6TdG<2EZ{-pKkuMXsN zRNZOFP!zf;A-mz=AM5hP`vquK5QeXm^(V!9-HiK7nD6nF9XL{tY)$S2F~1}kN2SHz z2G?{6Hk#|#qz!&c6~$@5PJWjt_<_+&h+x=YA+4%D_`e zT?ZM|sI!N#*Ul?<{xWXi$C4pG&T#>hut^jtA9-uC?wYCZ0+b2%s2kUbm(X*m&CS&H zO{*`k`c@W1s^toQCJgyLCXgcG0%7TjoSfR#amabr8Mx5%o$4=S39ximy9Y`bt(lCF z-JSZ2k_+AOf#fjQJTxcEAT&7klmXoMopi&j{N`aZw5cuWaqhj*7OVF8*I*^C_~P;~ zr$WQN6)Yd0S4A$LXlO%rZhB@TINa>QMhaa2k=n)R_^vN7Li zmUD&gdaG*@jDoZb>n3bN18x>qER;JU}4Qe>+G{%NA`C1^X#$W>TcMT z0GS}jNd8`W@qt0pdP+KuMq}Z+2|TUoQYtHSMf1H`Y!NGcGn2m?P7>nJI1>8CJ%j#(9Nsj~%r!p_y&$mI#Ve5i^=e)*4gCJ3Kq@zDOsCHC9$Kd9vYyiNs zQNUbg70tiJuL=J?(@@54MVQ8@Z&t5mR9!sklKrR!oRe{TQz5_@Hp0)2)39PEG>M6! zqV0R_%Ll-cFE$Up_8lHVUmPo3L4d3p0N=4RfSjBlE#Rme-5xCB1X$2-^7c|W1cdAs ztGD>}0ZM2B>~simb)SU;&nF6RVZtb~;*#mx5s z3Qa~feB?FUxX!lHylS^KgWmDdR1dFI^JqTjhSm?aEB-@*tdT^19Ht?%mW`1i%L$aJ z?*O2+>gPGJNpb3yN->~kCw3-y#ckFm(*KR2#20l0G3^x;b-g(rnW4{FIyz6NvKJU!URk> z6}w75pH^99PW@zy=HdXBA+f#>_hgygl}s7NF6oy;Qi$hGcO3TYvpJKAm87~%1s47Z zKKHE1KcxP4`x6nV1#>vn=)~wQr{CmP-}Tk#gkqnINoZiwye_;mM1RUk$8mJyUWN_w`lEC4tl2 zOvgLva_)Fnwj(dPdu@)_#SXqauu%V6=c=VU{n?>C0?cso56#vaLwcr;0QxN7-uhJNpk0B`}e62K)Py z8)(v}jGE{?Y z`*h1Ms*qE3$5D|U%?AiBS@;-Ds#q4Q(JgR?0=+AjsD1P}>h%_pp{z$_b+O8DkUi>V zY+Lfn32qw98m;TJL4`WZIhw1X-zQvxU~ixK>kp~q_tLo~b1iAqB73FWI<4ey0HXB6 zn!O){{V+9pu`Zz8&KK~wAI_ot6ZM>?9t~j}&_x`#!-Plp;|=*vNS#S=!r%l&EDO(w z)tHT5RY=dw=V zBFpM+Dyd_&x>M_ovr+~qXF8!Teyz%vhUoWEv|!7e9M;CL3l5z}grP#f(l^mgP2lH9 zoxovIR#yklwBRSEO31bF0kTzK*iPc#@{j0DEKZ_7>NvosCTR@*KV+RIWWkkm;%Sl&V7xaB^T{&&@-OY=RHKYEk zv_@Y|Q<6y7Xid(nOFY@0t4`TrE`L6ce1YhN)yD&^4f13!sYkHYW|a~@`CDfO1SWL> zgu;ci$%yy*%@=4{Be@2wn2oq`?=TBliqyKBwIMxku17kf^f95b2uy`E=$Li02qd*U z(oCviu07#OHWt4f6syeh=$W9RH8^8NHIliS6J=3}i*~H?UTYV2%$;mj+>kTZ?z%Nt zjIFo6)Qn5cBC?L&XldCK?sMw2q*5T@v&uUsBz%vTP%f1~PRVVQP}VGGnDp_*a62&9 zW+jZ-6WOCpRapmQF~{nIGG&6-N<`o%T2U$W3A?$!1Rrt$&6P+Ms{V)`KTNh1eB@x&cYtZ)m_c8p}S3lz)yRQ7A!$d!J zPPTWFKF@JH_bX>^BaNev)WSu2+$mchWg}uAmCP=Td{Zl%zZ0b^i!kOs_k;N?K>Xqy zwBX^K$XHQz)vvFwj{xF-{XID+9H*7Bp}rJ(OiWDrDK%M+O2REXIWCc9n)j9JMXfPs z-U2(4ZdTUURI=sGXfJZ;47XL(04;8L%(Yeay{a5aY$+|0Qs0C9ZuqYvw;Afb3T(x^ zDNCzjK9l=msH#|RSVRfYrnz{b1al?zIrU})yG(blq{Z;{Hmj75Uy-~ZeIMc;*K1bY z?N_j^*DGJaIKdC@o|^L0$g7VmK@dUDS?6=G;U|Z{yZ;AWoB`iXeZ5gs4F$mcW7%m{ zDp!VIIc|H;Rkh$xdVu@aP>H$hFIBMc4y?j&a-U6vF~G%@8?0;&qcYc~bd!S<&$t}^ zc9+t?f0@6$IpX@6kl0bH!H=T{6Hhzs?t9QW1TCDP5Y)P5XGdmJc0y%!j!qv8)-1Ay z8C&8EmrxUL<_p;QFDLI|8T-qhUpR>lUdwjZ%V9}H<>zv^2vV_)9Rcw9&$#m;6*(xf zjZ1jT{&`sOV3aV$pQ|5J8#GCf0Wc8dQ}o$x_}Y-KsFxJmh(O)q3-oe;dXBn%S77{; zSGxaZr7K!03)ljR0Hrn9{12<9zW+);ReL`AQEp#*|0zD-IlSR3ZaMO|H0p)%hBJ?P zBZwrxF3rlAkbkp;F=FJd3W}+gFQXstBKy&16CMWm*p)cHy-8-53nfL(>Tx)(q{T_ch)S9V(4<33 zW0nz75Kw0DMc;F-b}s}UJf2cLx{`zw_A-A7Yf#b|QXN>}?-a1t`tN0VzR$d2d`!i? zLw>&azma%;?2#P6p`>w{b{!-oF0ETp;kdmKw`i(PvcdMVjRJHD2&AyG9I zKU?r=?K5_)^dn#d%hp~<)U{qde65gERyq!t7=;}8{DCP(bHmT!+(f@oNdY{Tf|UdZ zCa9}h>w?=bDQr}Z7OdPu+?c+inY*P&G;_NDxzkfwK3nHutmMzO+kyjFLUHob7h+i&e?0D z^-~0a9gzXj3+b9A&*fB_hlwqxzrD0Cqy^Iz_^jpA%uBGJ_qG-;T5+O92`8PhgVd;G zi(|-SS#usZrrRmD>zAUM*N&~z13H`aEQR7Fj1IC0h?WAPz`E?#ZoaLL^u3)9M};_i z5^p^gpxiEUbwOkCYZ|uwTF&gEDLaKWXJ6OBc9YM=`2znu>l?B`9Ld3Ct@iST0<;qu z=OlGpIfc!C^-11PYhQs^e=&L==zU*s{Bx;mxAx~)Lhd#r`O69UpWxxKR`V{|a;CLN zY3xR$635Jfrdh}P<16f8rBhjnW3Hty=*VdiqF)JPB)E^--QS@(8}(M#L9#}lJEZQX zzYAR`Blkkm=Nw0ua16q;Gv<@Ur(HRt>|L3|^Dt6@_OCl%R3jjlJqt0?ZcHhrx~i%f z&#jHHMI%kvvbEC<|551K%G%Z+v-m^aKX8C|sPRTs@SEr$4<(S11jYO@HEcW zKY3r8r091CZvuyB0>Lj5$^k<-u+974s{tT+vKsGX`WZl~gh@3{(^QYx5bdSva(~Fc zInNxWtv-T9S!L|cStO(1hrU~Zt-Hr^^|B#2?6Q3?@UfrwiJtfKMbmS5D@eBJxV=;! zahD;UpnrP5L9QJU$F74j?m=L1Vszu^}8_Vsao(fJ_G1P?9L^9@5Zr88u8rp z!O(twow5nucf#kNIo8Gw>mwnPS;A&y9^OY`!!( zIqb{M;nUiU!fNpbvVKtmt09=*vG)If%Z~5O4u3gFo|v~^TUr}`Z0&=l2%lQcHK#)YjA5VUTi`(ni6%cD3kNn=~Ui9xv$V{7lVDB}D@1FlP zisyrc0CzmOJ|!4T+d#=@#)=&Tz+MGV zFtPf=B1R?#7$ujqAbo-PYqryl+`mV6b>@|iE<16p*zrM!3%}o;w~Xb^fmIm2&7FMx zsn|(}@`#Z^B{fc4%KJPA`9pjp44T?IIij>g2!H9^^(cZkuuY39t4>Q?uBnxw!#cxs z9$$`&;OJ7q#^6^2kpCDPYQ;}I= zzxrp(*wh8Wv=K5FH@%XxK@rWrbY?zsBrMpzI-B#*8s%em7=ixX`O0@N}NGUli_d#}Qt|DwFp)cPLK!@0?K zmk9wIgvZ?J=ayJV(;&Z}uvWC>OQjV)##LsS|0%f|N!IQ-lt-&rLj)pSdCt5(Rc?Re zy!A`|3|4&qBWUuLA$ZU{NZTHFfSqKnKZ(0k1)ZfWGVZGjM&dDA*Ac-QHbM99Br&oG z@w)v((FONqWKIw!2a-3i65=#cLqXwp#3gI?&u`ksGv0VWS}x8fQJ6K459X`4e{r|V zt=&Y1>fA?r{bqPF!_&L${+*2q7mGiV8ZwqypBE*XF(E53_5wleG}6+h*p2(>8*Prf zSuBpoMVMEwJ7LeMy&s!zm$h%`d2ibvmMyt{sUG)gnT43b!`!9ao)^-ac_3UXCG35# zpCR9^sQb(~r`hbXn4($gyXp0J+yh385x#so(7M>~L!xkX#hWTs&>w|T?dg%kOW&p( zK6;iLh~)2i0-jgf5ho(Rt2&1_PJ?^H57Vu?l`UC&S3+3b6{*ay6Vdz%oH2YW@I+o6 z%!Ow{J4|yl>CshxoU+qQNk)AOUfm)4G*^{QV@e5(E=zyjVrzU(km(nYsy%r$IX_H* z3@!H^0~xtQPwp1!duONF@{Q={hyQ3^*E`YMn1g@z`#S_9(yw!(bM$~Nz?cmV6Du=5 zGT)ATscILAF^)R5<-?XozOoDpaSZqBcBxEIgX~w6JSJFlw+9LO$U-A!O{X%(Iu>G8 zE+ii=2a{^^_@Kj<@El7#FJ-_{+VqjxvI?fTZJsQ7^NFoQ!cjRtCT(~jO{(2fDddWu zq0kQZZFO>?!KBx1=k}msIk4u(Cx1#*cJf^0vv2I!t!GekNx6+4Y<+StIop@h1(%gY za8A;cq_;a8HE98fhFk(uE?;q}vJ)I^U8NYQglS&UFOL@|FWgSZDsy?d;qP zW!F(nh3ZF$scf%n9PGCR-7m@6Rn)puY&A>w%<6V+LG@ z$40#7?6?hOUpC?>g_`=Xi)O9LK9#xlj^ECg9-QN)^6LrdyS!u^{98v*wZXk|ZPOZ6 z9-CCq%RRpzVzI)$L#Ulg-M|F3ty5$NVxCB!!ZGtwsKN3|mE@uwSYH0Vjti}08f~tG z2}zllI<#)6zG7={%SMQZ>9*`hAL+=`IPU)j7uW#En8L>NQc%XUwX<{QQsLXQa51Im*!se*@mXkKuG^@L z8WuOokk+j-J1%LEi!njCL9k4J+WHR=a5TSvZZfTSLihVPSZag5Vz3LNv#@P;EgczI z3IBkmB?q{}6c(K3L3VOq+YL8HqTU%rvZU$mby6&3YD%8dhkE~}Se8)Rn`1MDkB@I6 zU5At_mD`d66vvRZI zom8fcBQzvA>ut%oWw0LGu{W&HO_P z4#zS2@d>hmF7Y%PSMgg8|G|2zQhcBMDkw9&)Z>j~^0||rr8~<$RZo$xOJ7&^W#dSG zvK5!&sn97jC4G4CF2=3QsNh&n^S>NdgrbO?`lP-JO22-P9*jTO_dYpkizI2-joyy3 zw^9XgCQYysu#ua#HS-y>6AneVyG>2$c1BBxW_A=fA=wC6@)Lr<9^8ni=xEdPZk+_prkI1Dqa5Yb1 z4Fx8L#{NGtL#w^h-ZBFx7w0vt-Lj5xOg{&bkM$Z#K=&6RM0MeC>jO;3`g;-_;}B)R zC_>fTB#wG1csf&see!+v7^B<55cjot)9y-+-s5{+;Uhn&%pa_2E_pZrz;&D~Z>~ML z*f6Pr4W+K%*w`(ujVbr=(C!6HyQrSxhH0u{u_l-0W9OW3{(3rYoP_moEzLAgvtu-h zpMlSERW6T$98)~DhQL*3On$vohBYsBv*o)xW>NUrG9?c0`INnXdf&f%y<1-5)1J10 zJxFWu+}mS{w2n3K;1hNQ6#GK>FREBusapdlh173^me!URS^6PbCNf83%Pa)GjY=xY z-KOqq&()Ylfw%XTM7iP^H#eP9e6r<51sQ&WU7*l*t>@)$#%eZ*<-bvm^H=2aXs%&L zE-f=hUha27K6rnmZKTM?f9kfj#+IX0(k?{VfEmEEtUye_D@LulU4Hl=p&L$X92ECd zJJfsA1^0w@*m1m@*KJzYUz@5UGC9dU7ACu1N~z?|LHXb+zFfrKRykC3!fjn0)VswQ zZvxF%)SwynXU}3AwMxOpqnhcKWZ@Q>KuE5gXXs-8wlslYXGZ@1IV!72aiT_as1G|APH{(m-x1Jr#Yy z_luWGt)R`P!$x;urja3IB4E+w?4BpJto!`gOLvNPs?!&1-SPf(skb({Vx_&Or8lVm zq5-UUaYW$pdFH*Ey0rEwV}!*2ZLX@->^$dNZujkpeK~d*}!4-iJp#^r| z=Ly4}m#=h&_tHkd>#Ea;i=OUU0)^kpNom|gfL&NQr~K`{BlDA@ySw{V+R<}m_+F?Y z^sJZOn^1LA_S^14kgB@+{lVtgek)GYupr>(Z4EFHTXj>By!(FT|9Mj5gTNXt(gX?k z6$~c7pk*pICu1@bcpu+3v!K(95s)I`uPLtGF-%^e+sICGPRYD^@Aer}npYx?fVSio z!{Q{L=FWJ;Q)fWjXS334pZUv~`HN2!$$td%a|h<~6O8};Zo&7ih~!6aBGbYJ1<5mP z@5fp1&!6Petzm#%U#SPDo^IE!(~O{9LjI$Ta-mXU)UxToXVyk3kM*z)1ky5>Z|}uW z$yKk}9T3dRUW{E_YqTHj9f@sJkQ-zGZeOQXdq9bGOHctF+dCa|Y%0PPeB=Gpbqjhog1J zaO{dA>pAV@LyiG8&?3ee2S+65#w6R#-7PgBS@jRUC6>$Bk1omSn^+AGNB#HvVtbs) zJWgyC4==9mm}1}hs+5kwn6IryW%)11OdhpW&=`rH_N)WG85(s7PWWB=q_RsYpBLys z!!-YTfY>|elqyXWS&ba*rLPpl3o+rmj^HK8Hn8!78hEKXy~DQ^!_l#!B{z-R=M0bI zOFp~!O>#etzbtull>5uRk0S2oB`>U4)1GW43oLQLe&6;yJLBL)VlvsOOr@`i4 z#E+TJHZ(nm6B9!uLa( d=j$iflW6{UD&}$HSK9kGX>kRy8WE$Q{{wX7q~ZVo diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarks_icon.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarks_icon.svg new file mode 100644 index 000000000..679c35076 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/bookmarks_icon.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/goldstar.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/App_Themes/default/images/goldstar.png deleted file mode 100644 index 4e54e6fcebf34fa3b0986165ab54375d5073fac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 539 zcmV+$0_6RPP)ahXTYN^41bO$pZ|C;>20`+vH-~j{M;Mt z^6PH#|6h+P{-2)hP(ri;KaVG~{5a^Z^y5h2{vYpa{{Q$;`~T%$pT`e2I_P{m=F5ZC zfU8SfB|h)=-244>@Z;|n!v21{7WMzz!<7Hu-W5RbleGU|Z$|w8dL{7xmkZwS-yN_x zUzeufg5rX6i>#eKobvwo`9{H#T{5 z-2UZO38nA% zkIKJ)c~j&6i`&}&kF6EmOwfQgXJi&WJ1_Hh<1CSbF4kO5Q2~My$JPn=KRze^{qi2c z`ywJDY + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/BookmarkInfo.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/BookmarkInfo.aspx.cs index 589042ef9..6af1bd125 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/BookmarkInfo.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/BookmarkInfo.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/BookmarkingCommunityConstants.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/BookmarkingCommunityConstants.cs index fccfee99a..3e9dd4229 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/BookmarkingCommunityConstants.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/BookmarkingCommunityConstants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/BookmarkingModule.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/BookmarkingModule.cs index 23bffb97f..8f78ba4c3 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/BookmarkingModule.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/BookmarkingModule.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -62,8 +62,8 @@ public BookmarkingModule() Context = new ModuleContext { DefaultSortOrder = 4, - SmallIconFileName = "bookmarking_mini_icon.png", - IconFileName = "bookmarking_icon.png", + SmallIconFileName = "bookmarking_mini_icon.svg", + IconFileName = "bookmarking_icon.svg", SubscriptionManager = new BookmarkingSubscriptionManager(), SearchHandler = new BookmarkingSearchHandler(), GetCreateContentPageAbsoluteUrl = () => BookmarkingPermissionsCheck.PermissionCheckCreateBookmark() ? VirtualPathUtility.ToAbsolute("~/Products/Community/Modules/Bookmarking/" + BookmarkingServiceHelper.GetCreateBookmarkPageUrl()) : null, diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/BookmarkingService.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/BookmarkingService.cs index fcacae4ef..20726c41f 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/BookmarkingService.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/BookmarkingService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -417,7 +417,7 @@ private static void SendBookmarkNoticeAsync(INotifyAction action, string objectI try { notifyClient.AddInterceptor(initatorInterceptor); - notifyClient.SendNoticeAsync(action, objectID, null, tags); + notifyClient.SendNoticeAsync(action, objectID, tags); } finally { diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/IBookmarkingService.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/IBookmarkingService.cs index 4cee5e51e..5b207d670 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/IBookmarkingService.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/IBookmarkingService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Permissions/BookmarkPermissionSecurityObject.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Permissions/BookmarkPermissionSecurityObject.cs index b94abcd2f..2f11674c6 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Permissions/BookmarkPermissionSecurityObject.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Permissions/BookmarkPermissionSecurityObject.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Permissions/BookmarkingPermissionsCheck.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Permissions/BookmarkingPermissionsCheck.cs index d86892fa5..cc98743ea 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Permissions/BookmarkingPermissionsCheck.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Permissions/BookmarkingPermissionsCheck.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkSubscriptionConstants.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkSubscriptionConstants.cs index 06bf08fa5..af4b9df5e 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkSubscriptionConstants.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkSubscriptionConstants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * */ + namespace ASC.Bookmarking.Business.Subscriptions { public static class BookmarkSubscriptionConstants diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkingNotifyClient.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkingNotifyClient.cs index e4dd42cf9..93d8cb1e5 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkingNotifyClient.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkingNotifyClient.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkingNotifySource.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkingNotifySource.cs index 7ae3cea5c..a2fb4681a 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkingNotifySource.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkingNotifySource.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkingSubscriptionManager.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkingSubscriptionManager.cs index b57a5a854..0ea362c29 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkingSubscriptionManager.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Business/Subscriptions/BookmarkingSubscriptionManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/BookmarkingBusinessConstants.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/BookmarkingBusinessConstants.cs index 08ac3e12f..a804f14bc 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/BookmarkingBusinessConstants.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/BookmarkingBusinessConstants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ namespace ASC.Bookmarking.Common { public static class BookmarkingBusinessConstants { - public const string BookmarkingDbID = "community"; + public const string BookmarkingDbID = "default"; public static Guid CommunityProductID = CommunityProduct.ID; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/BookmarkingBusinessFactory.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/BookmarkingBusinessFactory.cs index 2cad49299..ca9f1a41f 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/BookmarkingBusinessFactory.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/BookmarkingBusinessFactory.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/BookmarkingSessionObject.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/BookmarkingSessionObject.cs index ee7918e6c..46c2fb965 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/BookmarkingSessionObject.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/BookmarkingSessionObject.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * */ + namespace ASC.Bookmarking.Common { public class BookmarkingSessionObject where T : class, new() diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/Util/BookmarkingBusinessUtil.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/Util/BookmarkingBusinessUtil.cs index 29d67dcd0..63f8e9d4b 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/Util/BookmarkingBusinessUtil.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/Util/BookmarkingBusinessUtil.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/Util/Converters.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/Util/Converters.cs index 65677e462..31e5a8532 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/Util/Converters.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Common/Util/Converters.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Dao/BookmarkingHibernateDao.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Dao/BookmarkingHibernateDao.cs index fea6549dc..8301127d8 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Dao/BookmarkingHibernateDao.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Dao/BookmarkingHibernateDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,7 +38,7 @@ public class BookmarkingHibernateDao : BookmarkingSessionObject GetUserBookmarkTags(UserBookmark ub) internal void UpdateBookmark(UserBookmark userBookmark, IList tags) { - var tx = DbManager.BeginTransaction(); - try + using (var tx = DbManager.BeginTransaction()) { - var date = DateTime.UtcNow; - userBookmark.UserBookmarkID = - DbManager.ExecuteScalar( - new SqlInsert("bookmarking_userbookmark", true) - .InColumns("UserBookmarkID", "UserID", "DateAdded", "Name", "Description", "BookmarkID", "Raiting", "Tenant") - .Values(userBookmark.UserBookmarkID, GetCurrentUserId(), date, userBookmark.Name, userBookmark.Description, userBookmark.BookmarkID, 1, Tenant) - .Identity(0, 0L, true)); + try + { + var date = DateTime.UtcNow; + userBookmark.UserBookmarkID = + DbManager.ExecuteScalar( + new SqlInsert("bookmarking_userbookmark", true) + .InColumns("UserBookmarkID", "UserID", "DateAdded", "Name", "Description", "BookmarkID", "Raiting", "Tenant") + .Values(userBookmark.UserBookmarkID, GetCurrentUserId(), date, userBookmark.Name, userBookmark.Description, userBookmark.BookmarkID, 1, Tenant) + .Identity(0, 0L, true)); - DbManager.ExecuteNonQuery( - new SqlDelete("bookmarking_userbookmarktag") - .Where(Exp.Eq("UserBookmarkID", userBookmark.UserBookmarkID) - & Exp.Eq("Tenant", Tenant))); + DbManager.ExecuteNonQuery( + new SqlDelete("bookmarking_userbookmarktag") + .Where(Exp.Eq("UserBookmarkID", userBookmark.UserBookmarkID) + & Exp.Eq("Tenant", Tenant))); - foreach (var tag in tags) + foreach (var tag in tags) + { + tag.TagID = DbManager.ExecuteScalar( + new SqlInsert("bookmarking_tag", true) + .InColumns("TagID", "Name", "Tenant") + .Values(tag.TagID, tag.Name, Tenant) + .Identity(0, 0L, true)); + + var ubt = new UserBookmarkTag { UserBookmarkID = userBookmark.UserBookmarkID, TagID = tag.TagID }; + + ubt.UserBookmarkTagID = DbManager.ExecuteScalar( + new SqlInsert("bookmarking_userbookmarktag", true) + .InColumns("UserBookmarkID", "TagID", "Tenant") + .Values(ubt.UserBookmarkID, tag.TagID, Tenant) + .Identity(0, 0L, true)); + } + tx.Commit(); + } + catch (Exception) { - tag.TagID = DbManager.ExecuteScalar( - new SqlInsert("bookmarking_tag", true) - .InColumns("TagID", "Name", "Tenant") - .Values(tag.TagID, tag.Name, Tenant) - .Identity(0, 0L, true)); - - var ubt = new UserBookmarkTag { UserBookmarkID = userBookmark.UserBookmarkID, TagID = tag.TagID }; - - ubt.UserBookmarkTagID = DbManager.ExecuteScalar( - new SqlInsert("bookmarking_userbookmarktag", true) - .InColumns("UserBookmarkID", "TagID", "Tenant") - .Values(ubt.UserBookmarkID, tag.TagID, Tenant) - .Identity(0, 0L, true)); + tx.Rollback(); } - tx.Commit(); - } - catch (Exception) - { - tx.Rollback(); } } internal void UpdateBookmark(Bookmark bookmark, IList tags) { UserBookmark userBookmark = null; - var tx = DbManager.BeginTransaction(); - try + using (var tx = DbManager.BeginTransaction()) { - var date = Core.Tenants.TenantUtil.DateTimeToUtc(bookmark.Date); - - bookmark.ID = DbManager.ExecuteScalar( - new SqlInsert("bookmarking_bookmark", true) - .InColumns("ID", "URL", "Date", "Name", "Description", "UserCreatorID", "Tenant") - .Values(bookmark.ID, bookmark.URL, date, bookmark.Name, bookmark.Description, bookmark.UserCreatorID, Tenant) - .Identity(0, 0L, true)); - - DbManager.ExecuteNonQuery( - new SqlDelete("bookmarking_bookmarktag") - .Where(Exp.Eq("BookmarkID", bookmark.ID) - & Exp.Eq("Tenant", Tenant))); - - userBookmark = GetCurrentUserBookmark(bookmark); - long userBookmarkId = 0; - if (userBookmark != null) + try { - userBookmarkId = userBookmark.UserBookmarkID; - } + var date = Core.Tenants.TenantUtil.DateTimeToUtc(bookmark.Date); - var nowDate = DateTime.UtcNow; + bookmark.ID = DbManager.ExecuteScalar( + new SqlInsert("bookmarking_bookmark", true) + .InColumns("ID", "URL", "Date", "Name", "Description", "UserCreatorID", "Tenant") + .Values(bookmark.ID, bookmark.URL, date, bookmark.Name, bookmark.Description, bookmark.UserCreatorID, Tenant) + .Identity(0, 0L, true)); - userBookmarkId = DbManager.ExecuteScalar( - new SqlInsert("bookmarking_userbookmark", true) - .InColumns("UserBookmarkID", "UserID", "DateAdded", "Name", "Description", "BookmarkID", "Raiting", "Tenant") - .Values(userBookmarkId, GetCurrentUserId(), nowDate, bookmark.Name, bookmark.Description, bookmark.ID, 1, Tenant) - .Identity(0, 0L, true)); + DbManager.ExecuteNonQuery( + new SqlDelete("bookmarking_bookmarktag") + .Where(Exp.Eq("BookmarkID", bookmark.ID) + & Exp.Eq("Tenant", Tenant))); - userBookmark = new UserBookmark - { - UserBookmarkID = userBookmarkId, - BookmarkID = bookmark.ID, - UserID = GetCurrentUserId(), - DateAdded = nowDate, - Name = bookmark.Name, - Description = bookmark.Description, - Raiting = 1 - }; + userBookmark = GetCurrentUserBookmark(bookmark); + long userBookmarkId = 0; + if (userBookmark != null) + { + userBookmarkId = userBookmark.UserBookmarkID; + } - DbManager.ExecuteNonQuery( - new SqlDelete("bookmarking_userbookmarktag") - .Where(Exp.Eq("UserBookmarkID", userBookmarkId) - & Exp.Eq("Tenant", Tenant))); + var nowDate = DateTime.UtcNow; - if (bookmark.Tags == null) - { - bookmark.Tags = new List(); - } - foreach (var tag in tags) - { - tag.TagID = DbManager.ExecuteScalar( - new SqlInsert("bookmarking_tag", true) - .InColumns("TagID", "Name", "Tenant") - .Values(tag.TagID, tag.Name, Tenant) - .Identity(0, 0L, true)); + userBookmarkId = DbManager.ExecuteScalar( + new SqlInsert("bookmarking_userbookmark", true) + .InColumns("UserBookmarkID", "UserID", "DateAdded", "Name", "Description", "BookmarkID", "Raiting", "Tenant") + .Values(userBookmarkId, GetCurrentUserId(), nowDate, bookmark.Name, bookmark.Description, bookmark.ID, 1, Tenant) + .Identity(0, 0L, true)); - new BookmarkTag + userBookmark = new UserBookmark { + UserBookmarkID = userBookmarkId, BookmarkID = bookmark.ID, - TagID = tag.TagID, - BookmarkTagID = DbManager.ExecuteScalar( - new SqlInsert("bookmarking_bookmarktag", true) - .InColumns("BookmarkID", "TagID", "Tenant") - .Values(bookmark.ID, tag.TagID, Tenant) - .Identity(0, 0L, true)) + UserID = GetCurrentUserId(), + DateAdded = nowDate, + Name = bookmark.Name, + Description = bookmark.Description, + Raiting = 1 }; + DbManager.ExecuteNonQuery( + new SqlDelete("bookmarking_userbookmarktag") + .Where(Exp.Eq("UserBookmarkID", userBookmarkId) + & Exp.Eq("Tenant", Tenant))); - - var ubt = new UserBookmarkTag { UserBookmarkID = userBookmarkId, TagID = tag.TagID }; - - ubt.UserBookmarkTagID = DbManager.ExecuteScalar( - new SqlInsert("bookmarking_userbookmarktag", true) - .InColumns("UserBookmarkID", "TagID", "Tenant") - .Values(ubt.UserBookmarkID, tag.TagID, Tenant) - .Identity(0, 0L, true)); - - if (bookmark.Tags.All(r => r.TagID == tag.TagID)) + if (bookmark.Tags == null) { - bookmark.Tags.Add(tag); + bookmark.Tags = new List(); + } + foreach (var tag in tags) + { + tag.TagID = DbManager.ExecuteScalar( + new SqlInsert("bookmarking_tag", true) + .InColumns("TagID", "Name", "Tenant") + .Values(tag.TagID, tag.Name, Tenant) + .Identity(0, 0L, true)); + + new BookmarkTag + { + BookmarkID = bookmark.ID, + TagID = tag.TagID, + BookmarkTagID = DbManager.ExecuteScalar( + new SqlInsert("bookmarking_bookmarktag", true) + .InColumns("BookmarkID", "TagID", "Tenant") + .Values(bookmark.ID, tag.TagID, Tenant) + .Identity(0, 0L, true)) + }; + + + + var ubt = new UserBookmarkTag { UserBookmarkID = userBookmarkId, TagID = tag.TagID }; + + ubt.UserBookmarkTagID = DbManager.ExecuteScalar( + new SqlInsert("bookmarking_userbookmarktag", true) + .InColumns("UserBookmarkID", "TagID", "Tenant") + .Values(ubt.UserBookmarkID, tag.TagID, Tenant) + .Identity(0, 0L, true)); + + if (bookmark.Tags.All(r => r.TagID == tag.TagID)) + { + bookmark.Tags.Add(tag); + } } - } - tx.Commit(); - } - catch (Exception) - { - tx.Rollback(); + tx.Commit(); + } + catch (Exception) + { + tx.Rollback(); + } } if (userBookmark != null) @@ -407,65 +411,67 @@ internal void UpdateBookmark(Bookmark bookmark, IList tags) internal Bookmark RemoveBookmarkFromFavourite(long bookmarkID, Guid? userID = null) { - var tx = DbManager.BeginTransaction(); - try + using (var tx = DbManager.BeginTransaction()) { - var userBookmarkID = DbManager.ExecuteScalar( - new SqlQuery() - .Select("UserBookmarkID") - .From("bookmarking_userbookmark") - .Where("BookmarkID", bookmarkID) - .Where("Tenant", Tenant) - .Where("UserID", userID ?? GetCurrentUserId())); - - var raiting = GetUserBookmarksCount(bookmarkID); + try + { + var userBookmarkID = DbManager.ExecuteScalar( + new SqlQuery() + .Select("UserBookmarkID") + .From("bookmarking_userbookmark") + .Where("BookmarkID", bookmarkID) + .Where("Tenant", Tenant) + .Where("UserID", userID ?? GetCurrentUserId())); - DbManager.ExecuteNonQuery( - new SqlDelete("bookmarking_userbookmark") - .Where("UserBookmarkID", userBookmarkID) - .Where("Tenant", Tenant)); + var raiting = GetUserBookmarksCount(bookmarkID); - DbManager.ExecuteNonQuery( - new SqlDelete("bookmarking_userbookmarktag") - .Where("UserBookmarkID", userBookmarkID) - .Where("Tenant", Tenant)); - - if (raiting <= 1) - { DbManager.ExecuteNonQuery( - new SqlDelete("bookmarking_bookmarktag") - .Where("BookmarkID", bookmarkID) - .Where("Tenant", Tenant)); + new SqlDelete("bookmarking_userbookmark") + .Where("UserBookmarkID", userBookmarkID) + .Where("Tenant", Tenant)); DbManager.ExecuteNonQuery( - new SqlDelete("bookmarking_comment") - .Where("BookmarkID", bookmarkID) - .Where("Tenant", Tenant)); + new SqlDelete("bookmarking_userbookmarktag") + .Where("UserBookmarkID", userBookmarkID) + .Where("Tenant", Tenant)); - DbManager.ExecuteNonQuery( - new SqlDelete("bookmarking_bookmark") - .Where("ID", bookmarkID) - .Where("Tenant", Tenant)); + if (raiting <= 1) + { + DbManager.ExecuteNonQuery( + new SqlDelete("bookmarking_bookmarktag") + .Where("BookmarkID", bookmarkID) + .Where("Tenant", Tenant)); + + DbManager.ExecuteNonQuery( + new SqlDelete("bookmarking_comment") + .Where("BookmarkID", bookmarkID) + .Where("Tenant", Tenant)); + + DbManager.ExecuteNonQuery( + new SqlDelete("bookmarking_bookmark") + .Where("ID", bookmarkID) + .Where("Tenant", Tenant)); + + DbManager.ExecuteNonQuery( + new SqlDelete("bookmarking_tag") + .Where("tenant", Tenant) + .Where(!Exp.Exists(new SqlQuery("bookmarking_bookmarktag b").Select("b.tagid").Where("b.Tenant", Tenant).Where(Exp.EqColumns("b.TagID", "bookmarking_tag.TagID")))) + ); - DbManager.ExecuteNonQuery( - new SqlDelete("bookmarking_tag") - .Where("tenant", Tenant) - .Where(!Exp.Exists(new SqlQuery("bookmarking_bookmarktag b").Select("b.tagid").Where("b.Tenant", Tenant).Where(Exp.EqColumns("b.TagID", "bookmarking_tag.TagID")))) - ); + tx.Commit(); + return null; + } + var bookmark = GetBookmarkByID(bookmarkID); tx.Commit(); + return bookmark; + } + catch + { + tx.Rollback(); return null; } - - var bookmark = GetBookmarkByID(bookmarkID); - tx.Commit(); - return bookmark; - } - catch - { - tx.Rollback(); } - return null; } #region Sorting (currently in use) @@ -791,46 +797,50 @@ internal Comment GetCommentById(Guid commentID) internal Comment UpdateComment(Guid commentID, string text) { - var tx = DbManager.BeginTransaction(); - try + using (var tx = DbManager.BeginTransaction()) { - var c = GetCommentById(commentID); - c.Content = text; + try + { + var c = GetCommentById(commentID); + c.Content = text; - DbManager.ExecuteNonQuery( - new SqlUpdate("bookmarking_comment") - .Set("Content", c.Content) - .Where(Exp.Eq("ID", commentID) & Exp.Eq("Tenant", Tenant))); - tx.Commit(); - return c; - } - catch - { - tx.Rollback(); - return null; + DbManager.ExecuteNonQuery( + new SqlUpdate("bookmarking_comment") + .Set("Content", c.Content) + .Where(Exp.Eq("ID", commentID) & Exp.Eq("Tenant", Tenant))); + tx.Commit(); + return c; + } + catch + { + tx.Rollback(); + return null; + } } } internal Comment RemoveComment(Guid commentID) { - var tx = DbManager.BeginTransaction(); - try + using (var tx = DbManager.BeginTransaction()) { - var c = GetCommentById(commentID); - c.Inactive = true; + try + { + var c = GetCommentById(commentID); + c.Inactive = true; - DbManager.ExecuteNonQuery( - new SqlUpdate("bookmarking_comment") - .Set("Inactive", 1) - .Where(Exp.Eq("ID", commentID) & Exp.Eq("Tenant", Tenant))); + DbManager.ExecuteNonQuery( + new SqlUpdate("bookmarking_comment") + .Set("Inactive", 1) + .Where(Exp.Eq("ID", commentID) & Exp.Eq("Tenant", Tenant))); - tx.Commit(); - return c; - } - catch - { - tx.Rollback(); - return null; + tx.Commit(); + return c; + } + catch + { + tx.Rollback(); + return null; + } } } diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Dao/BookmarkingHibernateDaoHelper.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Dao/BookmarkingHibernateDaoHelper.cs index 88b916121..1bac563e2 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Dao/BookmarkingHibernateDaoHelper.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Dao/BookmarkingHibernateDaoHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * */ + namespace ASC.Bookmarking.Dao { internal class BookmarkingHibernateDaoHelper diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/Bookmark.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/Bookmark.cs index b7f1700ac..f2d230f41 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/Bookmark.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/Bookmark.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/BookmarkTag.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/BookmarkTag.cs index cda709ac4..5e4153d28 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/BookmarkTag.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/BookmarkTag.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/Comment.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/Comment.cs index 27de3fd51..0c00c385d 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/Comment.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/Comment.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/Tag.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/Tag.cs index 9a7ebe90d..d06a26d12 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/Tag.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/Tag.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/UserBookmark.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/UserBookmark.cs index 94fa4d338..428b60c67 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/UserBookmark.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/UserBookmark.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/UserBookmarkTag.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/UserBookmarkTag.cs index c946ece64..4ebc99922 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/UserBookmarkTag.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Core/Pojo/UserBookmarkTag.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/CreateBookmark.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/CreateBookmark.aspx.cs index 7da12e84c..6f1a88d26 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/CreateBookmark.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/CreateBookmark.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Default.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Default.aspx.cs index 10b3297db..df80cda9e 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Default.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Default.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/FavouriteBookmarks.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/FavouriteBookmarks.aspx.cs index bc428e810..f59eedce3 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/FavouriteBookmarks.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/FavouriteBookmarks.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserBookmarks.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserBookmarks.aspx.cs index 66cf42091..469c807f7 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserBookmarks.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserBookmarks.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkAddedByUserContorl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkAddedByUserContorl.ascx.cs index ce3b41b3c..ac09c80f8 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkAddedByUserContorl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkAddedByUserContorl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkHeaderPageControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkHeaderPageControl.ascx.cs index 6ca4ba4b8..c15b49d8c 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkHeaderPageControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkHeaderPageControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkInfoUserControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkInfoUserControl.ascx.cs index fa3bad136..911f73970 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkInfoUserControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkInfoUserControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkRaitingUserControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkRaitingUserControl.ascx.cs index de4cce1e2..d85a17fda 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkRaitingUserControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkRaitingUserControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingPagingUserControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingPagingUserControl.ascx.cs index 0fb31d8b1..368603953 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingPagingUserControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingPagingUserControl.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web.UI; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingRemoverFromFavouritePopup.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingRemoverFromFavouritePopup.ascx.cs index ab6228ad4..25e047d26 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingRemoverFromFavouritePopup.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingRemoverFromFavouritePopup.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingUserControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingUserControl.ascx.cs index 062e6735c..76a89fad3 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingUserControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/BookmarkingUserControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -100,7 +100,7 @@ protected void Page_Load(object sender, EventArgs e) var emptyScreenControl = new EmptyScreenControl { - ImgSrc = WebImageSupplier.GetAbsoluteWebPath("bookmarks_icon.png", BookmarkingSettings.ModuleId), + ImgSrc = WebImageSupplier.GetAbsoluteWebPath("bookmarks_icon.svg", BookmarkingSettings.ModuleId), Describe = currentUser.IsVisitor() ? BookmarkingUCResource.EmptyScreenTextVisitor : BookmarkingUCResource.EmptyScreenText }; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/CommentsUserControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/CommentsUserControl.ascx.cs index cd043f6d0..4e0d46f59 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/CommentsUserControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/CommentsUserControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/ActionButton/ActionButton.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/ActionButton/ActionButton.cs index 3e536d3c3..6e3e2c2d2 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/ActionButton/ActionButton.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/ActionButton/ActionButton.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/ActionButton/js/actionbutton.js b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/ActionButton/js/actionbutton.js index ba3255ba8..42f47c262 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/ActionButton/js/actionbutton.js +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/ActionButton/js/actionbutton.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/BookmarkUserControlPath.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/BookmarkUserControlPath.cs index 79c580c72..3977dd902 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/BookmarkUserControlPath.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/BookmarkUserControlPath.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/BookmarkingSettings.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/BookmarkingSettings.cs index 0e338600e..7da283370 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/BookmarkingSettings.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/BookmarkingSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkDisplayMode.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkDisplayMode.cs index c2367770a..b74948aa3 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkDisplayMode.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkDisplayMode.cs @@ -1,19 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + namespace ASC.Bookmarking { diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkInfoBase.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkInfoBase.cs index 497cf5301..a1597d324 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkInfoBase.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkInfoBase.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkingRequestConstants.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkingRequestConstants.cs index a79a75152..0d683cea5 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkingRequestConstants.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkingRequestConstants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkingServiceHelper.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkingServiceHelper.cs index 246f41af9..cec49821b 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkingServiceHelper.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/BookmarkingServiceHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/SortParam.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/SortParam.cs index 8a9b190d7..896fad8f4 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/SortParam.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/SortParam.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/TagMenuItemControl.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/TagMenuItemControl.cs index 9c0150116..1f2be543e 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/TagMenuItemControl.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Presentation/TagMenuItemControl.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Search/BookmarkingSearchHandler.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Search/BookmarkingSearchHandler.cs index 943be5832..87d48647a 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Search/BookmarkingSearchHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Search/BookmarkingSearchHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,7 +31,7 @@ public class BookmarkingSearchHandler : BaseSearchHandlerEx { public override ImageOptions Logo { - get { return new ImageOptions { ImageFileName = "bookmarking_mini_icon.png", PartID = ModuleID }; } + get { return new ImageOptions { ImageFileName = "bookmarking_mini_icon.svg", PartID = ModuleID }; } } public override string SearchName diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/BookmarkingConverter.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/BookmarkingConverter.cs index 76b82ee73..836ec690e 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/BookmarkingConverter.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/BookmarkingConverter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/BookmarkingSortUtil.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/BookmarkingSortUtil.cs index 81a304556..9d7ac2cab 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/BookmarkingSortUtil.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/BookmarkingSortUtil.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/BookmarkingThumbnailSize.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/BookmarkingThumbnailSize.cs index 95cf2d84b..2f1b3f980 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/BookmarkingThumbnailSize.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/BookmarkingThumbnailSize.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/IThumbnailHelper.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/IThumbnailHelper.cs index 03998aa5e..b92ae91f5 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/IThumbnailHelper.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/IThumbnailHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/SortByEnum.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/SortByEnum.cs index 51cf14ef2..bea9d46c3 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/SortByEnum.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/SortByEnum.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/WebSiteThumbnailHelper.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/WebSiteThumbnailHelper.cs index 5c32153d1..129fd869c 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/WebSiteThumbnailHelper.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Common/Util/WebSiteThumbnailHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/CreateBookmarkUserControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/CreateBookmarkUserControl.ascx.cs index 6c88b693e..f93fc4042 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/CreateBookmarkUserControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/CreateBookmarkUserControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Default.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Default.aspx.cs index 756fcda49..bfa10ede3 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Default.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/Default.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/SingleBookmarkUserControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/SingleBookmarkUserControl.ascx.cs index cacfdf332..8d912262a 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/SingleBookmarkUserControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/UserControls/SingleBookmarkUserControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Util/BookmarkingBasePage.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Util/BookmarkingBasePage.cs index 3ee007212..701de9bad 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Util/BookmarkingBasePage.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Util/BookmarkingBasePage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ using ASC.Bookmarking.Common; using ASC.Web.Community.Modules.Bookmarking.UserControls.Resources; using ASC.Web.Community.Product; +using ASC.Web.Core.Utility; using ASC.Web.Studio; using ASC.Web.UserControls.Bookmarking.Common.Presentation; @@ -39,8 +40,15 @@ protected void Page_Load(object sender, EventArgs e) { BookmarkingBusinessConstants.CommunityProductID = CommunityProduct.ID; - Page.RegisterStyle("~/Products/Community/Modules/Bookmarking/App_Themes/default/css/bookmarkingstyle.css") - .RegisterBodyScripts("~/Products/Community/Modules/Bookmarking/js/bookmarking.js", + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/Products/Community/App_Themes/dark/dark-bookmarkingstyle.less"); + } + else + { + Page.RegisterStyle("~/Products/Community/Modules/Bookmarking/App_Themes/default/css/bookmarkingstyle.less"); + } + Page.RegisterBodyScripts("~/Products/Community/Modules/Bookmarking/js/bookmarking.js", "~/Products/Community/js/tagsautocompletebox.js"); ServiceHelper = BookmarkingServiceHelper.GetCurrentInstanse(); diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Util/BookmarkingNavigationItem.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Util/BookmarkingNavigationItem.cs index 8da6bd2aa..db56eb6e8 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Util/BookmarkingNavigationItem.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/Util/BookmarkingNavigationItem.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/js/bookmarking.js b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/js/bookmarking.js index 17b62c310..00d94ba11 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/js/bookmarking.js +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Bookmarking/js/bookmarking.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -281,13 +281,13 @@ function animateBookmarkChange(singleBookmarkDivID) { var el = jq('#' + singleBookmarkDivID); var bg = el.css("background-color"); bg = bg.toLowerCase(); - el.css({ "background-color": "#ffffcc" }); + el.css({ "background-color": ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? "#ffffcc" : "rgba(204, 184, 102, 0.2)" }); if (bg == "#edf6fd" || bg == "rgb(237, 246, 253)") { el.animate({ backgroundColor: '##EDF6FD' }, 2000); } else { - el.animate({ backgroundColor: "#ffffff" }, 2000); + el.animate({ backgroundColor: ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? "#ffffff" : "#333" }, 2000); } - } catch (err) { el.css({ "background-color": "#ffffff" }); } + } catch (err) { el.css({ "background-color": ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? "#ffffff" : "#333" }); } } /////////////////////////////////////////////////////////////// /////// Ajax Request preparation end diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forum_icon.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forum_icon.png deleted file mode 100644 index e7bf06f6641aaba1e52fd5639c2ab6e084131cfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1691 zcmV;M24wk(P))_?uiTK~1Ts4DkzINam$27osJ+;afl+QqM4IYHQs5s|O*fLwg>(I{^K5grZwUg4*ekk^1gRxs2<%fP3?8 zkz1Aupn=Kkfh3I&^uzAqLDK(t8rp?&t$g89Xs+7^XqTv%Ma)4lzdu)S^=vdf*Qqr|4-I2@Ng$tMH~Y-g{RJt zZV@kE2sq+0Ufs&Z@-)@bD2})VBMyPoAC;*ilXq~|2wVX!0O!n$j~D=1>jlsK<_ob` zi2{HOMmVihz8ih|-Ax3cMK zFtPhW{cWE;CtleA*MT1bogsi{PJc$rb!B5^hC}*dB(bAt-l>}H}G$TB4k6Qb0=IQFiu{@fqi)d!Y<9}EF}|Nph*$;C6?1!*ws0O3N*IuBeE4Wbu z`VAQL&@4vNK@KL1A&v9jBtf$ze-`!7ZUd*aOxX$VTYlk~2N+;_n1tB$R5CF8OBI*j zUic>M=o)`tdI<|eS&z5Qe1P%h%LGXWB!eACkWKGH|L`fWiW)6KQ3#c>#diw@QvroQ zLn7&Y6nGNY=iSs~|70?V5BmXgop2F=cDR5dSfJ!p2|EA83sN+g!P))@dhL0f2Yw6+ z_R`OA-uyWLvX_qGzWYR;1+}ec?KEbzg5ZdQ_S#T&Aeu*){{%@FJAW##b7L`oeHLft0Z<>QZOub_?&|=!@B9*)#Gn>J z4S zr2n4nM=#%0!d8Eg(dsOlr*;yyuMnk88cPw)<-yZm+q!hT;glHMNKW-LyMJRKXm1{@ zh45lghMM1tgZ;;g!|<`zHNqwUQKV#$1J3V5zX*CO|sY?Tv#^ems^JZKv65GN^aN+qIu>Fn~>&Z*a{5`9edsy z4*C^IYL2Y$h7{$72;)%gdsBDAh$w0o9lkn0Ru zL|le9uE4WXbvZmf;&5rzk{RAUUU$xqZ}D@XTCtQLUAmQl|2#CyDbBv13hppr60d)plm=7g2=~m)dM$ykT$Oki70Nc{4&mmo1C{CBYf{w>@nE zV9PZ43n?qB_V{X_<+3YJQUdK;G}1foh+db0LdVyVOZyhW;xBH;ARAq#W&>O|#fHDvivjUWgYyXzlEszy61_nR~^ly3geIRR{n7$459h30? l03ZW0RZVZRb+3=-{{qVPg){6Lmihny002ovPDHLkV1kGWEc5^X diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forum_icon.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forum_icon.svg new file mode 100644 index 000000000..13b00e405 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forum_icon.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forum_mini_icon.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forum_mini_icon.png deleted file mode 100644 index 22addee1a02d463b24ee9d80b68889dd5d8a4e96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 713 zcmV;)0yh1LP)7pfaSe$Z^iwRbfTKa79l688k*A{wn%XcdvV6~gi$n>x19sf!3H zD9IkXy>Itn1HBT2gehQLPtN?x&TR)68aU6Lrz0rg6LsxI%-rUacodbsh8%K?Y)s7G zkXSOK5IskyyY`&Bp_}O(tL+9RUuAFqaUL&Busy62zP3 zh1zV^=n-FE+c&ztxAKJ)MSNZ5jo;1D>>s*UpTK8#aSzVml355o!p`1@@*o5ibbXwE z>wh|}M0jwvK4+tKS}d&mMs3GgK6o|{x(HqwvFjo%{RQP6NGvk!db{4^5!Bczp=H64 z)Z5aw{bY0h*3vIOk6rn)vM{uv68D)qUm>fzFw?i8`4YYVTg>!N*mxRWNlXsfEpFt) z(iWE56QxJv&9Rl*;EC1A(ZiVNNB!a|dGjjT1DivBc|XR27XYD8GvJXrbYuW29Z4L| z{E@2DH=Exh3Z_7!Yf^vlQBBmDfVoFfc{|g}*QA&UpkqJph zQ5>6^&rasK{9FiHxi!mDviH+|eWAW&X)IGM`xgB^&wWjT=Ii_jC7k_-w8-#JpT);s?PB1sBm7A1XH00000NkvXXu0mjfwOvmY diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forum_mini_icon.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forum_mini_icon.svg new file mode 100644 index 000000000..92d43a446 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forum_mini_icon.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forums_icon.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/forums_icon.png deleted file mode 100644 index 8002dcc1925704293db0960eef0ebcd6d548da81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16602 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/upload.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/upload.png deleted file mode 100644 index 1d06c86b694909e938cd734d04ae9784c7e17db2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 829 zcmV-D1H$}?P)u3mm=oiXMF` z)1&~7+<8fJ3IQ&6_x}9^4t2et&VrBWIUgN44@d95q`w9@aO)X$=6w`A7d>H&g6p6o z>*8?NbDD6#z8g=evk;)*x%d<%_!e_~u5si&7c;Ux4&Hi369(9O?J>>%)x5WsppQ!o zNR2)&>kuCHUw@Js!O}j4d#*g9xy2lcfsZc(2_m7O>(0$EhQKmV@@$l&0lce(IJRa9 zYYAZYrH3?cN*=|)$LCsta76QZMAkA;@*R}J2=6Nqj;~+J#s%1Q@d3@Bl1DKcpf`#e zHXn(Y?mH+)HN2~YII&?F8xvs1h5NK%Y5~P;fSxEumH)YUJtAit=niqJz`E1dsZq?n>%#W@R2YLX@PQg?aoljuwe73fsP=(Xr>@e>QVIQB zHl3TdP4s;IirYKaHr)rzv{7=Uk;yP5S~tG|GYnkmRCQAWgi=tNkfbQAG(jlUS^!rX zToV%2e95?`iAX?0XbqlX353=VEeHH6n&!%euq{u3(_p+!mw@nJCP0vyAW|eCH9;t9 zEkJ4wNhtwDkgZN&2q0;a07?^HcfUl3F00000NkvXX Hu0mjf%>jE^ diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/upload.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/upload.svg new file mode 100644 index 000000000..3831c82e4 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/images/upload.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/style.css b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/style.less similarity index 71% rename from web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/style.css rename to web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/style.less index 75710650e..d6e7b2245 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/style.css +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/App_Themes/default/style.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,262 +15,258 @@ */ -.forums-row:hover -{ - background-color: #E6E6E6; -} -.forums-row.view-content:hover -{ - background-color:transparent; -} -.forums-row:hover .link -{ - text-decoration: underline; -} - -.forum_thrCategBox -{ - display:block; - padding:5px; - margin:0px; -} - -.forum_mesBox -{ - display:block; - padding:5px 5px 15px 5px; - height: expression( this.scrollHeight < 100 ? "100px" : "auto" ); /* sets max-height for IE */ - min-height:100px; - overflow:auto; - overflow-x:auto; - overflow-y:hidden; -} -.forum_mesBoxPreview -{ - display:block; - padding:5px 5px 15px 5px; - height: expression( this.scrollHeight < 100 ? "100px" : "auto" ); /* sets max-height for IE */ - min-height:100px; - overflow:auto; - overflow-x:auto; - overflow-y:hidden; -} -.forum_postBoxUserSection -{ - width:150px; - overflow:hidden; -} - -.forum_attachmentsBox -{ - margin:5px; - padding:5px; -} -.forum_attachItem -{ - border-right:none; - border-left:none; - border-top:none; - margin:2px 0px; padding:2px; -} - -.forum_upItemBox -{ - margin-top:3px; - padding:2px 0px; - border-top:none; - border-left:none; - border-right:none; -} - -.forum_sh_item -{ - border-top:none; - cursor:pointer; - padding:0px; - margin:0px; - border:solid 1px #c7c7c7; - border-top:none; - background-color:#ffffff; -} -.forum_sh_itemselect -{ - border-top:none; - cursor:pointer; - padding:0px; - margin:0px; - border:solid 1px #c7c7c7; - border-top:none; - background-color:#edf6fd; -} -.forum_uploader -{ - padding:5px; -} -.forum_columnHeader -{ - color: #82878D; - font-size:12px; - border-bottom:solid 1px #D1D1D1; - padding-bottom:5px; -} - - -.postClass -{ - -} - -/* File Uploader*/ - -.forum_uploadContainer -{ - margin: 10px 0 0 0; - max-height: 150px; - width: 100%; - overflow: auto; -} - -*+html .forum_uploadContainer table -{ - width:507px !important; - z-index:290; -} -*+html div.studioFileUploaderProgressBar -{ - z-index:190; - max-width:507px; -} -.files_uploadIcon -{ - background: url(images/upload.png) no-repeat; - height:32px; - width:32px; -} -.forum_deleteLinkCSSClass -{ - background:url("images/trash.png") no-repeat scroll center center transparent; - cursor:pointer; - height:12px; - width:12px; - display:inline-block; - margin-top:2px; - text-decoration:none !important; -} -.forum_loadingCSSClass -{ - background:url("images/loader_small.gif") no-repeat scroll center center transparent; - cursor:default; - height:24px; - width:24px; - display:inline-block; - margin-top:2px; - margin-left:-5px; - text-decoration:none !important; -} -.forum_completeCSSClass -{ - background:url("images/complete.png") no-repeat scroll center center transparent; - cursor:default; - height:12px; - width:12px; - display:inline-block; - margin-top:2px; - text-decoration:none !important; -} - - -#forum_uploadDialogContainer -{ - padding: 15px; border: 1px solid #d1d1d1 -} - -#forum_uploadDialogContainer #forum_uploadContainer -{ - margin: 10px 0 0 0; - max-height: 120px; - width: 100%; - overflow: auto; -} - -#forum_uploadDialogContainer #forum_uploadContainer div.fu_item -{ - margin:0; - padding:0; -} -#forum_uploadDialogContainer #forum_uploadContainer div.fu_item:first-child -{ - border-top:1px solid #d1d1d1; -} - -#forum_uploadDialogContainer #forum_upload_pnl -{ - padding: 15px 0 10px; - position: relative; - height: 22px; -} - - -#forum_uploadDialogContainer #forum_upload_pnl #switcher -{ - float:right; -} - -#forum_uploadDialogContainer .forum_overAllProcessBarCssClass -{ - height:8px; - width:100%; - border: 1px solid #d1d1d1; - -moz-border-radius:2px; - -webkit-border-radius:2px; - border-radius:2px; - margin-top:10px; -} -#forum_uploadDialogContainer .forum_overAllProcessBarCssClass div -{ - height:8px; - background:url("images/back-progress.png") repeat-x !important; -} - -#forum_uploadDialogContainer .forum_uploadIcon -{ - background: url(images/upload.png) no-repeat; - height:32px; - width:32px; -} - -a.forum_uploadButton -{ - float:left; - cursor:pointer; - position: absolute !important; -} -*html a.forum_uploadButton {margin-left:0px !important} -*+html a.forum_uploadButton {margin-left:0px !important} - -#tableForNavigation { - height: 24px; - width: 100%; -} - -.navigationLinkBox .tl-combobox { - background: url("images/comboarrow_bottom.png") no-repeat scroll right center transparent; - margin-bottom: 1px; - vertical-align: middle; -} - -.navigationLinkBox .tl-combobox .combobox-title .inner-text { - border-bottom: 1px dotted #666666; - color: #666666; -} - -.text11px { - font-size: 11px; -} - -.forum-page-parent { - color: #666666; - font-size: 12px; - padding-bottom:8px; - text-align: right; -} +@import "../../../../App_Themes/default/params.less"; + +.forums-row:hover { + background-color: @body-color-hover; +} +.forums-row.view-content:hover +{ + background-color:transparent; +} +.forums-row:hover .link +{ + text-decoration: underline; +} + +.forum_thrCategBox +{ + display:block; + padding:5px; + margin:0px; +} + +.forum_mesBox +{ + display:block; + padding:5px 5px 15px 5px; + height: ~'expression( this.scrollHeight < 100 ? "100px" : "auto" )'; /* sets max-height for IE */ + min-height:100px; + overflow:auto; + overflow-x:auto; + overflow-y:hidden; +} +.forum_mesBoxPreview +{ + display:block; + padding:5px 5px 15px 5px; + height: ~'expression( this.scrollHeight < 100 ? "100px" : "auto" )'; /* sets max-height for IE */ + min-height:100px; + overflow:auto; + overflow-x:auto; + overflow-y:hidden; +} +.forum_postBoxUserSection +{ + width:150px; + overflow:hidden; +} + +.forum_attachmentsBox +{ + margin:5px; + padding:5px; +} +.forum_attachItem +{ + border-right:none; + border-left:none; + border-top:none; + margin:2px 0px; padding:2px; +} + +.forum_upItemBox +{ + margin-top:3px; + padding:2px 0px; + border-top:none; + border-left:none; + border-right:none; +} + +.forum_sh_item { + border-top: none; + cursor: pointer; + padding: 0px; + margin: 0px; + border: solid 1px @text-area-border-color; + border-top: none; + background-color: @body-color; +} +.forum_sh_itemselect { + border-top: none; + cursor: pointer; + padding: 0px; + margin: 0px; + border: solid 1px @text-area-border-color; + border-top: none; + background-color: #edf6fd; +} +.forum_uploader +{ + padding:5px; +} +.forum_columnHeader { + color: #82878D; + font-size: 12px; + border-bottom: solid 1px @border-color; + padding-bottom: 5px; +} + + +.postClass +{ + +} + +/* File Uploader*/ + +.forum_uploadContainer +{ + margin: 10px 0 0 0; + max-height: 150px; + width: 100%; + overflow: auto; +} + +*+html .forum_uploadContainer table +{ + width:507px !important; + z-index:290; +} +*+html div.studioFileUploaderProgressBar +{ + z-index:190; + max-width:507px; +} +.files_uploadIcon +{ + background: url(images/upload.svg) no-repeat; + height:32px; + width:32px; +} +.forum_deleteLinkCSSClass +{ + background:url("images/trash.png") no-repeat scroll center center transparent; + cursor:pointer; + height:12px; + width:12px; + display:inline-block; + margin-top:2px; + text-decoration:none !important; +} +.forum_loadingCSSClass +{ + background:url("images/loader_small.gif") no-repeat scroll center center transparent; + cursor:default; + height:24px; + width:24px; + display:inline-block; + margin-top:2px; + margin-left:-5px; + text-decoration:none !important; +} +.forum_completeCSSClass +{ + background:url("images/complete.png") no-repeat scroll center center transparent; + cursor:default; + height:12px; + width:12px; + display:inline-block; + margin-top:2px; + text-decoration:none !important; +} + + +#forum_uploadDialogContainer { + padding: 15px; + border: 1px solid @border-color; +} + +#forum_uploadDialogContainer #forum_uploadContainer +{ + margin: 10px 0 0 0; + max-height: 120px; + width: 100%; + overflow: auto; +} + +#forum_uploadDialogContainer #forum_uploadContainer div.fu_item +{ + margin:0; + padding:0; +} +#forum_uploadDialogContainer #forum_uploadContainer div.fu_item:first-child { + border-top: 1px solid @border-color; +} + +#forum_uploadDialogContainer #forum_upload_pnl +{ + padding: 15px 0 10px; + position: relative; + height: 22px; +} + + +#forum_uploadDialogContainer #forum_upload_pnl #switcher +{ + float:right; +} + +#forum_uploadDialogContainer .forum_overAllProcessBarCssClass { + height: 8px; + width: 100%; + border: 1px solid @border-color; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + margin-top: 10px; +} +#forum_uploadDialogContainer .forum_overAllProcessBarCssClass div +{ + height:8px; + background:url("images/back-progress.png") repeat-x !important; +} + +#forum_uploadDialogContainer .forum_uploadIcon +{ + background: url(images/upload.svg) no-repeat; + height:32px; + width:32px; +} + +a.forum_uploadButton +{ + float:left; + cursor:pointer; + position: absolute !important; +} +*html a.forum_uploadButton {margin-left:0px !important} +*+html a.forum_uploadButton {margin-left:0px !important} + +#tableForNavigation { + height: 24px; + width: 100%; +} + +.navigationLinkBox .tl-combobox { + background: url("images/comboarrow_bottom.png") no-repeat scroll right center transparent; + margin-bottom: 1px; + vertical-align: middle; +} + +.navigationLinkBox .tl-combobox .combobox-title .inner-text { + border-bottom: 1px dotted @grey-text; + color: @grey-text; +} + +.text11px { + font-size: 11px; +} + +.forum-page-parent { + color: @grey-text; + font-size: 12px; + padding-bottom: 8px; + text-align: right; +} diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumManager.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumManager.cs index d43eaf9e4..706d56211 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumManager.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,7 +25,7 @@ public static class ForumManager { public static string DbId { - get { return "community"; } + get { return "default"; } } public static Guid ModuleID diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumModule.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumModule.cs index a30032bb9..2e2ba6885 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumModule.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumModule.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -56,8 +56,8 @@ public ForumModule() Context = new ModuleContext { DefaultSortOrder = 2, - SmallIconFileName = "forum_mini_icon.png", - IconFileName = "forum_icon.png", + SmallIconFileName = "forum_mini_icon.svg", + IconFileName = "forum_icon.svg", SubscriptionManager = new ForumSubscriptionManager(), GetCreateContentPageAbsoluteUrl = ForumShortcutProvider.GetCreateContentPageUrl, SearchHandler = new ForumSearchHandler(), diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumSearchHandler.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumSearchHandler.cs index 7d54b9f94..7a545ac7a 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumSearchHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumSearchHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,7 +48,7 @@ public override SearchResultItem[] Search(string text) public override ImageOptions Logo { - get { return new ImageOptions { ImageFileName = "forum_mini_icon.png", PartID = ForumManager.ModuleID }; } + get { return new ImageOptions { ImageFileName = "forum_mini_icon.svg", PartID = ForumManager.ModuleID }; } } public override string SearchName diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumShortcutProvider.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumShortcutProvider.cs index 4cbbea866..1b44916fd 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumShortcutProvider.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumShortcutProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumSubscriptionManager.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumSubscriptionManager.cs index ef9508ca6..e7c96633f 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumSubscriptionManager.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/ForumSubscriptionManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/Subscriber.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/Subscriber.cs index 4fea27a82..b4d596d30 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/Subscriber.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Common/Subscriber.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Dao/ForumDataProvider.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Dao/ForumDataProvider.cs index 41c8eb71b..a2a0b34c3 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Dao/ForumDataProvider.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Dao/ForumDataProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -131,7 +131,7 @@ internal static IDbManager DbManager { get { - return Common.Data.DbManager.FromHttpContext(ASC.Web.Community.Forum.ForumManager.DbId); + return new DbManager(ASC.Web.Community.Forum.ForumManager.DbId); } } diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/ForumPresenterFactory.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/ForumPresenterFactory.cs index ec6db43e4..1f203e29b 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/ForumPresenterFactory.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/ForumPresenterFactory.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * */ + namespace ASC.Forum { public class ForumPresenterFactory : IPresenterFactory diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/ForumPresenterSettings.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/ForumPresenterSettings.cs index 8644ffaee..652b9f78c 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/ForumPresenterSettings.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/ForumPresenterSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/Interfaces.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/Interfaces.cs index 47d008038..3df37b172 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/Interfaces.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/Interfaces.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/PresenterTemplate.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/PresenterTemplate.cs index 837eef1be..654b1e0b4 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/PresenterTemplate.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/PresenterTemplate.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * */ + namespace ASC.Forum { internal abstract class PresenterTemplate : IPresenter diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/UserKeys.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/UserKeys.cs index 6d5120bf6..25b7fa2f0 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/UserKeys.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/HelpClasses/UserKeys.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Module/Constants.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Module/Constants.cs index 9b602c8d1..a3554719f 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Module/Constants.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Module/Constants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Module/ForumNotifySource.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Module/ForumNotifySource.cs index 165402788..a2fff93fd 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Module/ForumNotifySource.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Module/ForumNotifySource.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/NotifierPresenter.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/NotifierPresenter.cs index e879d915e..489bfdb25 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/NotifierPresenter.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/NotifierPresenter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,7 +36,7 @@ private void SendNotifyHandler(object sender, NotifyEventArgs e) if (String.Equals(e.NotifyAction.ID, Constants.NewPostInTopic.ID, StringComparison.InvariantCultureIgnoreCase)) { - ForumNotifyClient.NotifyClient.SendNoticeAsync(Constants.NewPostInTopic, e.ObjectID, null, + ForumNotifyClient.NotifyClient.SendNoticeAsync(Constants.NewPostInTopic, e.ObjectID, new TagValue(Constants.TagDate, e.Date), new TagValue(Constants.TagThreadTitle, e.ThreadTitle), new TagValue(Constants.TagTopicTitle, e.TopicTitle), @@ -53,7 +53,7 @@ private void SendNotifyHandler(object sender, NotifyEventArgs e) else if (String.Equals(e.NotifyAction.ID, Constants.NewPostInThread.ID, StringComparison.InvariantCultureIgnoreCase)) { - ForumNotifyClient.NotifyClient.SendNoticeAsync(Constants.NewPostInThread, e.ObjectID, null, + ForumNotifyClient.NotifyClient.SendNoticeAsync(Constants.NewPostInThread, e.ObjectID, new TagValue(Constants.TagDate, e.Date), new TagValue(Constants.TagThreadTitle, e.ThreadTitle), new TagValue(Constants.TagTopicTitle, e.TopicTitle), @@ -69,7 +69,7 @@ private void SendNotifyHandler(object sender, NotifyEventArgs e) else if (String.Equals(e.NotifyAction.ID, Constants.NewPostByTag.ID, StringComparison.InvariantCultureIgnoreCase)) { - ForumNotifyClient.NotifyClient.SendNoticeAsync(Constants.NewPostByTag, e.ObjectID, null, + ForumNotifyClient.NotifyClient.SendNoticeAsync(Constants.NewPostByTag, e.ObjectID, new TagValue(Constants.TagDate, e.Date), new TagValue(Constants.TagThreadTitle, e.ThreadTitle), new TagValue(Constants.TagTopicTitle, e.TopicTitle), @@ -84,7 +84,7 @@ private void SendNotifyHandler(object sender, NotifyEventArgs e) else if (String.Equals(e.NotifyAction.ID, Constants.NewTopicInForum.ID, StringComparison.InvariantCultureIgnoreCase)) { - ForumNotifyClient.NotifyClient.SendNoticeAsync(Constants.NewTopicInForum, e.ObjectID, null, + ForumNotifyClient.NotifyClient.SendNoticeAsync(Constants.NewTopicInForum, e.ObjectID, new TagValue(Constants.TagDate, e.Date), new TagValue(Constants.TagThreadTitle, e.ThreadTitle), new TagValue(Constants.TagTopicTitle, e.TopicTitle), diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/SecurityActionPresenter.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/SecurityActionPresenter.cs index a3da494eb..3d3e6d280 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/SecurityActionPresenter.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/SecurityActionPresenter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/SubscriberPresenter.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/SubscriberPresenter.cs index 59146d981..93b7479eb 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/SubscriberPresenter.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/SubscriberPresenter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/SubscriptionGetcherPresenter.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/SubscriptionGetcherPresenter.cs index 76ece17ac..df6570e65 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/SubscriptionGetcherPresenter.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Presenters/SubscriptionGetcherPresenter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/AnswerVariant.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/AnswerVariant.cs index 52ee9c03a..721f9b3fa 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/AnswerVariant.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/AnswerVariant.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * */ + namespace ASC.Forum { public class AnswerVariant diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Attachment.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Attachment.cs index 95e8d880e..8224095e9 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Attachment.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Attachment.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/ForumAction.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/ForumAction.cs index ab4566c77..3e7675a6d 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/ForumAction.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/ForumAction.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/NotFoundUser.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/NotFoundUser.cs index 6be396f12..4730f2c1a 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/NotFoundUser.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/NotFoundUser.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Post.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Post.cs index d07e01dc5..4fcc9346c 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Post.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Post.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Question.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Question.cs index 132f702d9..622517e03 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Question.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Question.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/SubscriptionConstants.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/SubscriptionConstants.cs index 9f9daccdb..8a5a3a50d 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/SubscriptionConstants.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/SubscriptionConstants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Tag.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Tag.cs index 125d3890a..6951dd15a 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Tag.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Tag.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * */ + namespace ASC.Forum { public class Tag diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Thread.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Thread.cs index 2167d543f..896b29619 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Thread.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Thread.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/ThreadCategory.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/ThreadCategory.cs index ce50e57b4..1f4a04535 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/ThreadCategory.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/ThreadCategory.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Topic.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Topic.cs index 2186bd0c6..ac74534a8 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Topic.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Shared/Topic.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/INotifierView.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/INotifierView.cs index 5d4a8d654..835500bc0 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/INotifierView.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/INotifierView.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/ISecurityActionView.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/ISecurityActionView.cs index c9b092191..fa8ae0de3 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/ISecurityActionView.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/ISecurityActionView.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/ISubscriberView.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/ISubscriberView.cs index 7d8976b60..22bc9fa7b 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/ISubscriberView.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/ISubscriberView.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/ISubscriptionGetcherView.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/ISubscriptionGetcherView.cs index adea9ce48..5e7277149 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/ISubscriptionGetcherView.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Core/Views/ISubscriptionGetcherView.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Default.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Default.aspx.cs index a7b879916..63d722a32 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Default.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Default.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ protected void Page_Load(object sender, EventArgs e) var emptyScreenControl = new EmptyScreenControl { - ImgSrc = WebImageSupplier.GetAbsoluteWebPath("forums_icon.png", ForumManager.Settings.ModuleID), + ImgSrc = WebImageSupplier.GetAbsoluteWebPath("forums_icon.svg", ForumManager.Settings.ModuleID), Header = ForumResource.EmptyScreenForumCaption, Describe = currentUser.IsVisitor() ? ForumResource.EmptyScreenForumTextVisitor : ForumResource.EmptyScreenForumText, ButtonHTML = ForumManager.Instance.ValidateAccessSecurityAction(ForumAction.GetAccessForumEditor, null) ? String.Format("{0}", ForumResource.EmptyScreenForumLink) : String.Empty diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/EditTopic.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/EditTopic.aspx.cs index c777ac7de..397602cc7 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/EditTopic.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/EditTopic.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Forum.Master.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Forum.Master.cs index 7751fe008..93fb88ecd 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Forum.Master.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Forum.Master.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ using System.Web.UI.WebControls; using ASC.Web.Community.Modules.Forum.Resources; +using ASC.Web.Core.Utility; using ASC.Web.Studio.Core; namespace ASC.Web.Community.Forum @@ -62,8 +63,15 @@ protected void Page_Load(object sender, EventArgs e) sb.Append(" ForumMakerProvider.NameEmptyString='" + ForumResource.NameEmptyString + "'; "); sb.Append(" ForumContainer_PanelInfoID = '" + ForumContainer.GetInfoPanelClientID() + "'; "); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/Products/Community/App_Themes/dark/dark-style.less"); + } + else + { + Page.RegisterStyle(ForumManager.BaseVirtualPath + "/App_Themes/default/style.less"); + } Page.RegisterBodyScripts(ForumManager.BaseVirtualPath + "/js/forummaker.js") - .RegisterStyle(ForumManager.BaseVirtualPath + "/App_Themes/default/style.css") .RegisterInlineScript(sb.ToString()); SearchText = ""; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/ManagementCenter.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/ManagementCenter.aspx.cs index 3de1f0f02..79d60f989 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/ManagementCenter.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/ManagementCenter.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/NewForum.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/NewForum.aspx.cs index 5240eeba3..fcec63140 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/NewForum.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/NewForum.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/NewPost.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/NewPost.aspx.cs index 95c1ca585..24cb20473 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/NewPost.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/NewPost.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Posts.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Posts.aspx.cs index 6c9de76d0..7c445d0a7 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Posts.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Posts.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Search.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Search.aspx.cs index c8d0638f7..9b694d75b 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Search.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Search.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -132,7 +132,7 @@ protected void Page_Load(object sender, EventArgs e) { var emptyScreenControl = new EmptyScreenControl { - ImgSrc = WebImageSupplier.GetAbsoluteWebPath("forums_icon.png", ForumManager.Settings.ModuleID), + ImgSrc = WebImageSupplier.GetAbsoluteWebPath("forums_icon.svg", ForumManager.Settings.ModuleID), Header = ForumResource.EmptyScreenSearchCaption, Describe = ForumResource.EmptyScreenSearchText, }; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Topics.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Topics.aspx.cs index 3a1f73089..583e42ffc 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Topics.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/Topics.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -64,7 +64,7 @@ protected void Page_Load(object sender, EventArgs e) { var emptyScreenControl = new EmptyScreenControl { - ImgSrc = WebImageSupplier.GetAbsoluteWebPath("forums_icon.png", ForumManager.Settings.ModuleID), + ImgSrc = WebImageSupplier.GetAbsoluteWebPath("forums_icon.svg", ForumManager.Settings.ModuleID), Header = ForumResource.EmptyScreenTopicCaption, Describe = ForumResource.EmptyScreenTopicText, ButtonHTML = ForumManager.Instance.ValidateAccessSecurityAction(ForumAction.TopicCreate, thread) ? String.Format("{0}", ForumResource.EmptyScreenTopicLink) : String.Empty diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/DateTimeService.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/DateTimeService.cs index c6d14eeea..a31421865 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/DateTimeService.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/DateTimeService.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/ForumManager.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/ForumManager.cs index 2103ad662..a47ca35d1 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/ForumManager.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/ForumManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/ForumScriptProvider.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/ForumScriptProvider.cs index e8bbca1ea..15df0c9a3 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/ForumScriptProvider.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/ForumScriptProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/LinkProvider.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/LinkProvider.cs index 87676fba1..b93536f01 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/LinkProvider.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/LinkProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/PageLocation.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/PageLocation.cs index 1796b663a..3a70d0be6 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/PageLocation.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/PageLocation.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/Settings.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/Settings.cs index 95f3ab9be..d5a168dbe 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/Settings.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/Settings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/TagSuggest.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/TagSuggest.cs index 9bd58766e..cd90683f8 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/TagSuggest.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/Common/TagSuggest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/ForumEditor.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/ForumEditor.ascx.cs index 30c82d1d6..cc2647e3c 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/ForumEditor.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/ForumEditor.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -73,7 +73,7 @@ protected string RenderForumCategories() { var emptyScreenControl = new EmptyScreenControl { - ImgSrc = WebImageSupplier.GetAbsoluteWebPath("forums_icon.png", ForumManager.Settings.ModuleID), + ImgSrc = WebImageSupplier.GetAbsoluteWebPath("forums_icon.svg", ForumManager.Settings.ModuleID), Header = ForumResource.EmptyScreenForumCaption, Describe = ForumResource.EmptyScreenForumText, ButtonHTML = String.Format("{0}", ForumResource.EmptyScreenForumLink) diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/ForumMaker.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/ForumMaker.ascx.cs index 6dad0cb5f..2244ee7a8 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/ForumMaker.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/ForumMaker.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/NewPostControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/NewPostControl.ascx.cs index 034ce9aaf..d3f73a761 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/NewPostControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/NewPostControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; @@ -51,6 +52,11 @@ public override FileUploadResult ProcessUpload(HttpContext context) var result = new FileUploadResult { Success = false }; try { + if (!SecurityContext.IsAuthenticated) + { + throw new HttpException(403, "Access denied."); + } + if (FileToUpload.HasFilesToUpload(context)) { var settingsID = new Guid(context.Request["SettingsID"]); @@ -60,11 +66,19 @@ public override FileUploadResult ProcessUpload(HttpContext context) var forumManager = settings.ForumManager; var offsetPhysicalPath = string.Empty; - forumManager.GetAttachmentVirtualDirPath(thread, settingsID, new Guid(context.Request["UserID"]), out offsetPhysicalPath); + var userId = new Guid(context.Request["UserID"]); + + if (userId != SecurityContext.CurrentAccount.ID) + { + result.Message = ForumUCResource.ErrorAccessDenied; + return result; + } + + forumManager.GetAttachmentVirtualDirPath(thread, settingsID, userId, out offsetPhysicalPath); var file = new FileToUpload(context); - var newFileName = GetFileName(file.FileName); + var newFileName = Path.GetFileName(file.FileName); var origFileName = newFileName; var i = 1; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PagingControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PagingControl.ascx.cs index b8c79eaee..a96362afa 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PagingControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PagingControl.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web.UI; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PostControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PostControl.ascx.cs index 83c67a4cc..b4f0f58d7 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PostControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PostControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PostListControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PostListControl.ascx.cs index 07e44ba11..86c6e6448 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PostListControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/PostListControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/RecentActivityControl.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/RecentActivityControl.cs index b9d1923a0..6bbda3155 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/RecentActivityControl.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/RecentActivityControl.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/ThreadCategoryListControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/ThreadCategoryListControl.ascx.cs index 6185d2247..dc271b33d 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/ThreadCategoryListControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/ThreadCategoryListControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/TopicControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/TopicControl.ascx.cs index 11eec172d..090e4b389 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/TopicControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/TopicControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/TopicEditorControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/TopicEditorControl.ascx.cs index 873ac5ff3..dfd06ddcd 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/TopicEditorControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/TopicEditorControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/TopicListControl.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/TopicListControl.ascx.cs index 40d7621d0..a91fd0f79 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/TopicListControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserControls/TopicListControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserTopics.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserTopics.aspx.cs index 73a467431..4a438b401 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserTopics.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/UserTopics.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -105,7 +105,7 @@ protected void Page_Load(object sender, EventArgs e) { var emptyScreenControl = new EmptyScreenControl { - ImgSrc = WebImageSupplier.GetAbsoluteWebPath("forums_icon.png", ForumManager.Settings.ModuleID), + ImgSrc = WebImageSupplier.GetAbsoluteWebPath("forums_icon.svg", ForumManager.Settings.ModuleID), Header = ForumResource.EmptyScreenSearchCaption, Describe = ForumResource.EmptyScreenSearchText, }; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/js/forum.js b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/js/forum.js index da85694c3..26e6dbd75 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/js/forum.js +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/js/forum.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/js/forummaker.js b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/js/forummaker.js index 349f617e9..69917cd91 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/js/forummaker.js +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/js/forummaker.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/js/searchhelper.js b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/js/searchhelper.js index d6ae75246..a243185fe 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/js/searchhelper.js +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Forum/js/searchhelper.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ */ -var LoaderPath = StudioManager.GetImage('loader_16.gif'); +var LoaderPath = ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? StudioManager.GetImage('loader_16.gif') : StudioManager.GetImage('loader-dark-16.svg'); var ContainerElementID ='container'; HelpItem = function(accord,value,rank,help) diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_advert.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_advert.png deleted file mode 100644 index 962233d03261d5d0cb07984c7fc54fcd22f66648..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10817 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 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_news.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_news.png deleted file mode 100644 index adc5d859557d0ac1e46f603a359634a578a32734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15552 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 B4&49% diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_news.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_news.svg new file mode 100644 index 000000000..0920fec18 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_news.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_newslogo.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_newslogo.png deleted file mode 100644 index dc6583e00c380f35371df32450153a4fa0f6a5a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21655 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_order.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_order.png deleted file mode 100644 index 18da419aab1554456ecd18694d48375f82c80bc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19013 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

    4pz|;{cFP!*F7?!MWnf+CYNE`9 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 diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_order.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_order.svg new file mode 100644 index 000000000..650829bd5 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_order.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_poll.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_poll.png deleted file mode 100644 index d215291b27e40bdd5e1b19bc97e5084a821dee4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9185 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 diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_poll.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_poll.svg new file mode 100644 index 000000000..c4d2880be --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/150x_poll.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_advert.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_advert.png deleted file mode 100644 index 9b8a063a469fa8f16cbe20a2852e68cf771ba678..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1648 zcmV-$29NoPP)R1OhAkVe2T05cF=WOx8G!^}9@^6aKc?wx5dDp3_RB~_=aGNq)+*0N={rzX?Y z{HoQEkZHhN(S-kbeZrw?8PpVwifY7N0i~)!S;M@NW%pJ+SrbhKiE9IRM)M2+_0)L=+TE~`N0@XSg1 ze17hzFa__=dyI~0#5|ICmAsV6QXyDMlC;w?dRlv*W>-`!b1*eoY#uIAV`xe)3vl|q z(~CRDj|ak=S{m`VMkPkWV#F*W9?3~cdp7W;84vP>Pb{JPx*430naC&Gg3C0kf=Z>bVBFYoZ}yc+vtr@DWr^X_Ng~rN35YsD6oPa2$G=I($ZksMSx%on zLTZ7kC8SB1q8_)lgt#pmeA&$L%l091ktRnD902#GRnVSrsxQ^( zXsmg`%$eGC9}_xea=!E~TV7v5TKOlfp+q7nRTa+19OtxUep!>fyH7m2=Cu>6I|s>7 zgAr+(f>sFu;0`m#%+csORBeZ9?e}$~CNrw-qx8K07F+gwhhpj9WIUx+$`nG0EGbnJ ziZM%3bEK9mcIV*H^M6>co<0mrLa+kZ;2 ze3~tLen`363$7sjWJqa|GKJ7bA@tEARosoXOb3(4ENbr_anDy1$*shF!LTOGX0zn7 zxd)FNJF4#f)Q9834gRm$3r@W;ElGv=v*nfBvriPo>dVo8ib%RzZgc9wc zkM6?9m_GU|oI9DY^W|4Kd+r>-j$us*aQ$tEpFi^FuGe~d-*{krM@MHamz_6qQ5mM2K;UyPEO$Z!l&rW-^r%mzr?QHe*vJQqvMZ1UcY+Z zlfQTjM4AI2F!9dgM}Z#+2Qh&p6Ub%*ZehGTOH3URA5_mZ2oWccXHxq@^47(gb?Z5D z^cVo$6S{Qjl*wNQa6p<>0f2;>OXZ^Ka8#WbeN~KB95CcS3fvtxNND56!q>3AaXhnj zT_bp*P+;zy*-O8>blIVL@5YCF5d{%saMSk-{od41Y4pbjfXp1Lf8z;Vxi3>Z6L|Vp zYdLY^WW!fq{QT!$Shs$|6Bn%=hF750F(pVt1|Jm2)SpoG90X0HzC8V9axM?$I z&YW$`H+RnLLpM*GI&1mLhtp8zg!rVD`?YralPflC8YIXUN<=f=|LL&9&X+&)^CzFu;TAkv2Wa{pNHT)EfQQ;@Rvhsmby;_EYkJc$OSHSYyNeHv z8U0q*4L2-$;kTRiUuijRs + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_news.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_news.png deleted file mode 100644 index 36b52c59290157d7f08f6205168558bcdf7edd99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1298 zcmV+t1?~EYP)eB9LGO1vwvK7F|ILdNkyG)M6+2f_0Xk7TF|D21WO4N+C%9jmwG6)AvcxH|jhy&mFBcKws~BDv%Tk2mkVnfJcG z@9+1%KSonZ@hnZ}8QXIJ&jCCK5CE8*oWw8;rRzGHrtNCLQ+uTpx~}`<%I^R?t#Mr! z*LAgH$BtD42!%punnq`5=Ye`VKR?e-;R^uhy6$^WY1wQR+qSW7n}LA=EXyLB&0?A+ zwr!J6r^)4Vq|<4#*{t6u5(zSy%&z@*GUEf-IqBKx=qS->6x+4|7#SJCG)+cEMo6dA zSeC`m&=3Oy1LSf!hK7d7WHJ zN~P*Gr4%zWGbp80DwR6WTQD^>MKBnosi}#jrKR;$Dpjw0v2k7Zz(q$0u`3Y+6#@ak z%E}6wrs0XwPI0OHIx)T6+Jmm}2_YZHz#G;`$ot&Q9KZE#m{-FIm0#3n6^xyl?~n z2A9TLek;|{(b-8&G{)jTON{+;op(?66RD{I;O5*s_f{X$)!j|BCX8}ju3Q`CQK3Lj z*9rg7{qiE2O!_M5I1Y~EJOL01ht4+~K1_F48cj;JoH8;H;>wRdG4NI&LI|dB-{I9v zhFBzmp=$`;;Pu{KMuvw;wZB9p62UMG0)c=ZzRF6wv9Up^RAO^;6Wg}g+}y0HhHr<1 zL8Rlbc<&w?WkEC+WA@e^R{p+AJRWC54^b?vBT6NBc5K_GP$*DWS4X*AegdHEI1m1sovFP$Hy6nC_R`vBVi${qLP5@*`wW2Z zE)9c}yx7);kdJAeoV-D6^HByr{)l`&&*jUP85|rW91dd`#;)Ax>FHr&VuFT-h9_52 zDaEH>eEGEy?m*&bGdE{vy3C}>;=&>k9pbe$D5VfevF5m->7Z$p%MPVdi5FrKg4)Y#aVJ$35T2LS+CSo^A|jJEsJf4-xne3Z}M zL_=LG=z$L}9zVV1W%8NHA3B5(pG&1ODEX_V)cJ2aPT%s@-@kq_&uDXtu z>L-No%eJPJBKplJu2Q`B$E6M_+?UtZ9_FuJ`hFe=10f)|-B*r-fB|@_BmsB3m4U78 zwh3%(&r3jf?n+a07*qo IM6N<$g6OMl+yDRo diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_news.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_news.svg new file mode 100644 index 000000000..f4f00c6ba --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_news.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_order.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_order.png deleted file mode 100644 index 4aea878c8bbeabdd63674c9facc7921b49d085f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1578 zcmV+_2G#kAP)`O7zc4e+{Q5&$Hj4DU|ftbfFdaV#w_^*UjkG^t7*3YLd1(d ze}VkxK8yFS%lK>WBM8Ps0F1$P99%a}ERn`d=E7ysW&QFT`2(jy5Z$=ohP#E-$L__y z^e!fwCAoVy3yWpm{M$U&xz>}3u~BJ&RSG$mM~?4hZn1(c{vHq%0TG4=GTP1$Zl~jo zK;M&JqcK0j+RuJL@$+8@9U5)Z@B?z$4Aq)XpvtwCI*4%3@$tywEk#gz`<3o30K)PM zzr@|O9VeSc#IR!^-P(4&(qL|}Ou5ov&rpubSJ!#t($f9#rZOJx9Z zyYpPQw9ZHOrVuyYF@A000*J>Q%9REKeHm(XpK`gudZhsfdxml}8bL%zi{~}TX5uuO zO8>Svv)397_T9Q?mo9+mtE&`pDWvS}C35Ac0Uu{X)e`*i@kM!-g;K_c#e2-CAQ z-n}fOQw~FYz1_Q@`jJ!A=T;!cVt=?3=5Py3`ABfZp^T)H$}PZQ7oje zsv+B>R<8Q3{={SZuvU>UD8Vzn{COMhJa^Z49#O$1{ka17rN;W + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_poll.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/32x_poll.png deleted file mode 100644 index ae3e3cd650e451c1c2fbfd92bfdbed230a39adc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 880 zcmV-$1CRWPP)28$6otQYtEXo?_Ac-ONJs<(h*v-w2mFUwT;&XOt2-@RI6&b?x}N5-KthZaG%Av=kgZ7TL9H=$JdV^U-{=J zUq1cY3BR#NNOmgIETx2iz*+CM`2MTUpMG{FfV&p~%%;-=l8tch$lj9OX_hUi((GTC zz?7(LOr54AtC30==|Av*nJ_cVDw2(^4gN+Fv|Y#fVokFYn99V~PaXlPOQ-c~(?7Kf zJOa=uszRv>DTPUqjLmv#CQOD|B3T8pEf~9*|K=u?Kxy{ium-EaTks2r3+~N zB3Z(eNLG`S&;TIrAVC3tc#oHfw)BfVk+yC%TA&i0QkWF zkbrCz)GsmO9)Odx@4$pbY|-=WJ6~*r3buAYc<+H6xH%xqDuf~Rro7QEuyiULg)D_k zArXilR>++aX@mX&Ofg~*p*{~JB&{U4>;k?AK=oucJvySE9AK6>ZvziLEeR+36x{S} z>@iXN5O_H5j)!yI)qkIXdJG3gP)`U;WT{Xafp;ym=dgTUT5tE3+u+Mrc(WutlXHNHh`_yp#a zPtRY@Ny}qALpX{6#r(JKj30k#=Al22(K+sUbrNpmn>il`zdrk8ZaO + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/newslogo.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/newslogo.png deleted file mode 100644 index 328c4f6067db0eef0ec4eb9b8c8d55793e9cf4a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|KAtX)AsXkCZ^Y(13MDZ-ieByA z=^~Qx`Oo3_V=htRJCJq-iTy8MExu7$6f{ESS8Gb5E gnJf6ilsOq0WbLJ86TOn>0nKIbboFyt=akR{06q6BN&o-= diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/newslogo.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/newslogo.svg new file mode 100644 index 000000000..e6422445c --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/images/newslogo.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/newsstylesheet.css b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/newsstylesheet.less similarity index 75% rename from web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/newsstylesheet.css rename to web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/newsstylesheet.less index b0ce3ed96..a5b3b60d9 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/newsstylesheet.css +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/App_Themes/default/newsstylesheet.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,230 +15,227 @@ */ -.ContentView { - -} -#left-section -{ - min-width: 160px; - width:15%; - padding:15px; -} -#right-section -{ - width:85%; - padding:15px; - max-width:400px; -} - -.section -{ - padding:0 0.25em; - vertical-align:top; -} -.divMenu -{ - float:left; - width:100%; - height:100%; -} - -.divContent -{ - float:left; - padding:10px; - padding-right: 50px; - width:95%; -} - -.menuLink -{ - color:#ffffff; - text-align:center; - vertical-align:middle; - font-size:12px; -} - -.infoLink -{ - display:inline-block; - padding:3px; - color:#ffffff; - text-decoration:none; - cursor:pointer; - position:relative; - background-color:#367caf; - width:100px; - text-align:center; - vertical-align:middle; - font-size:12px; - border-color:#ffffff #ffffff #ffffff #ffffff; - border-width:1px 1px 0px 1px; - border-style: solid solid solid solid; - margin-right:10px; -} - -.newsDiv -{ - margin-bottom: 10px; - padding: 5px; - width: 100%; - -moz-border-radius-bottomleft:5px; - -moz-border-radius-bottomright:5px; - -moz-border-radius-topleft:5px; - -moz-border-radius-topright:5px; - overflow:hidden; -} - -.newsRepeater -{ - width: 100%; -} - -.newsLink -{ - font-size:20px; - text-decoration:none; -} - - -.newsHeader -{ - float:left; - overflow: hidden; - margin-bottom: 10px; - width:100%; - -} - - -.newsFullText img -{ - max-width:800px; - overflow:scroll; -} -.newsFullText -{ - overflow-y:hidden; - overflow-x:auto; - width:100%; -} - -.newsText -{ - width: 100%; - max-height:80px; - overflow:hidden; -} - -.newsContextMenu -{ - padding: 20px 0 5px 9px; - width: 100%; - overflow: hidden; -} - - -/*---------------------News module------------------*/ -.news-row:hover -{ - background-color: #E6E6E6; -} -.news-row:hover .linkMedium -{ - text-decoration: underline; -} -.news-link-container { - overflow: hidden; - text-overflow: ellipsis; -} -.feedPrevDescription -{ - border-bottom: solid 1px #C7CCD2; - border-top: solid 1px #C7CCD2; - font-size:16px; - font-weight:bold; - padding:11px 0px; - color:#111; -} - -.feedPrevCaption { - border: 0 none; - color: #111; - font-size: 24px; - padding: 0; - width: 100%; -} - -.feedPrevBody -{ - padding:32px 24px 36px 32px; -} - -.feedPrevCredits -{ - border-bottom: solid 1px #C7CCD2; - color:#D1D1D1; - padding:10px 0; -} - -.feedPrevEditButton -{ - color:#36393E !important; -} - -/*--------------------------------------------------*/ - -#feedPrevDiv_Body -{ - border-bottom: 1px solid #D1D1D1; - margin-bottom: 20px; - padding: 15px 10px; -} - -#tableForNavigation { - height: 24px; - width: 100%; -} -.navigationLinkBox .tl-combobox .combobox-container { - padding: 8px; - width: 50px; -} -.navigationLinkBox .tl-combobox .combobox-container .combobox-options { - line-height: 22px; -} -.navigationLinkBox .tl-combobox .combobox-title .inner-text { - border-bottom: 1px dotted #666666; - color: #666666; -} -.navigationLinkBox .tl-combobox { - background: url("images/comboarrow_bottom.png") no-repeat scroll right center transparent; - margin-bottom: 1px; - vertical-align: middle; -} - - -/*--------------Events list------------*/ - -.news-row .events_date { -} -.news-row .events_type { -} -.news-row .events_name { - max-width:250px; -} -.news-row .events_autor { - max-width: 600px; - overflow: hidden; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; -} - - -body.media-width-0-1300 .news-row .events_name { - max-width: 150px; -} -body.media-width-0-1300 .news-row .events_autor { - max-width: 330px; +@import "../../../../App_Themes/default/params.less"; + +.ContentView { + +} +#left-section +{ + min-width: 160px; + width:15%; + padding:15px; +} +#right-section +{ + width:85%; + padding:15px; + max-width:400px; +} + +.section +{ + padding:0 0.25em; + vertical-align:top; +} +.divMenu +{ + float:left; + width:100%; + height:100%; +} + +.divContent +{ + float:left; + padding:10px; + padding-right: 50px; + width:95%; +} + +.menuLink { + color: @body-color; + text-align: center; + vertical-align: middle; + font-size: 12px; +} + +.infoLink { + display: inline-block; + padding: 3px; + color: @body-color; + text-decoration: none; + cursor: pointer; + position: relative; + background-color: #367caf; + width: 100px; + text-align: center; + vertical-align: middle; + font-size: 12px; + border-color: @body-color @body-color @body-color @body-color; + border-width: 1px 1px 0px 1px; + border-style: solid solid solid solid; + margin-right: 10px; +} + +.newsDiv +{ + margin-bottom: 10px; + padding: 5px; + width: 100%; + -moz-border-radius-bottomleft:5px; + -moz-border-radius-bottomright:5px; + -moz-border-radius-topleft:5px; + -moz-border-radius-topright:5px; + overflow:hidden; +} + +.newsRepeater +{ + width: 100%; +} + +.newsLink +{ + font-size:20px; + text-decoration:none; +} + + +.newsHeader +{ + float:left; + overflow: hidden; + margin-bottom: 10px; + width:100%; + +} + + +.newsFullText img +{ + max-width:800px; + overflow:scroll; +} +.newsFullText +{ + overflow-y:hidden; + overflow-x:auto; + width:100%; +} + +.newsText +{ + width: 100%; + max-height:80px; + overflow:hidden; +} + +.newsContextMenu +{ + padding: 20px 0 5px 9px; + width: 100%; + overflow: hidden; +} + + +/*---------------------News module------------------*/ +.news-row:hover { + background-color: @body-color-hover; +} +.news-row:hover .linkMedium +{ + text-decoration: underline; +} +.news-link-container { + overflow: hidden; + text-overflow: ellipsis; +} +.feedPrevDescription +{ + border-bottom: solid 1px #C7CCD2; + border-top: solid 1px #C7CCD2; + font-size:16px; + font-weight:bold; + padding:11px 0px; + color:#111; +} + +.feedPrevCaption { + border: 0 none; + color: #111; + font-size: 24px; + padding: 0; + width: 100%; +} + +.feedPrevBody +{ + padding:32px 24px 36px 32px; +} + +.feedPrevCredits { + border-bottom: solid 1px #C7CCD2; + color: @border-color; + padding: 10px 0; +} + +.feedPrevEditButton +{ + color:#36393E !important; +} + +/*--------------------------------------------------*/ + +#feedPrevDiv_Body { + border-bottom: 1px solid @border-color; + margin-bottom: 20px; + padding: 15px 10px; +} + +#tableForNavigation { + height: 24px; + width: 100%; +} +.navigationLinkBox .tl-combobox .combobox-container { + padding: 8px; + width: 50px; +} +.navigationLinkBox .tl-combobox .combobox-container .combobox-options { + line-height: 22px; +} +.navigationLinkBox .tl-combobox .combobox-title .inner-text { + border-bottom: 1px dotted @grey-text; + color: @grey-text; +} +.navigationLinkBox .tl-combobox { + background: url("images/comboarrow_bottom.png") no-repeat scroll right center transparent; + margin-bottom: 1px; + vertical-align: middle; +} + + +/*--------------Events list------------*/ + +.news-row .events_date { +} +.news-row .events_type { +} +.news-row .events_name { + max-width:250px; +} +.news-row .events_autor { + max-width: 600px; + overflow: hidden; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + + +body.media-width-0-1300 .news-row .events_name { + max-width: 150px; +} +body.media-width-0-1300 .news-row .events_autor { + max-width: 330px; } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/DbFeedStorage.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/DbFeedStorage.cs index 70a02d9f6..dfc59e1f9 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/DbFeedStorage.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/DbFeedStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,7 +41,7 @@ namespace ASC.Web.Community.News.Code.DAO { internal class DbFeedStorage : IFeedStorage { - private readonly IDbManager dbManager = DbManager.FromHttpContext(FeedStorageFactory.Id); + private readonly IDbManager dbManager = new DbManager(FeedStorageFactory.Id); private readonly int tenant; @@ -270,7 +270,7 @@ private static void NotifyFeed(Feed feed, bool isEdit, FeedType type) if (type == FeedType.Poll && feed is FeedPoll) { NewsNotifyClient.NotifyClient.SendNoticeAsync( - NewsConst.NewFeed, null, null, + NewsConst.NewFeed, null, new TagValue(NewsConst.TagFEED_TYPE, "poll"), new TagValue(NewsConst.TagAnswers, ((FeedPoll)feed).Variants.ConvertAll(v => v.Name)), new TagValue(NewsConst.TagCaption, feed.Caption), @@ -289,7 +289,7 @@ private static void NotifyFeed(Feed feed, bool isEdit, FeedType type) else { NewsNotifyClient.NotifyClient.SendNoticeAsync( - NewsConst.NewFeed, null, null, + NewsConst.NewFeed, null, new TagValue(NewsConst.TagFEED_TYPE, "feed"), new TagValue(NewsConst.TagCaption, feed.Caption), new TagValue(NewsConst.TagText, @@ -432,7 +432,7 @@ private void NotifyNewComment(FeedComment comment, Feed feed) try { NewsNotifyClient.NotifyClient.AddInterceptor(initatorInterceptor); - + var mentionedUsers = MentionProvider.GetMentionedUsers(comment.Comment); var mentionedUserIds = mentionedUsers.Select(u => u.ID.ToString()); @@ -450,7 +450,7 @@ private void NotifyNewComment(FeedComment comment, Feed feed) if (mentionedUsers.Length > 0) { NewsNotifyClient.NotifyClient.SendNoticeToAsync(NewsConst.MentionForFeedComment, objectID, mentionedUsers, false, tags); - } + } } finally { diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/DbFeedStorageTest.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/DbFeedStorageTest.cs index 0eaebc690..7d326590f 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/DbFeedStorageTest.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/DbFeedStorageTest.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/FeedStorageFactory.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/FeedStorageFactory.cs index 9a86cc5bf..66568c27c 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/FeedStorageFactory.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/FeedStorageFactory.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ namespace ASC.Web.Community.News.Code.DAO { public static class FeedStorageFactory { - public static string Id = "community"; + public static string Id = "default"; private const string Key = "FeedStorageKey"; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/IFeedStorage.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/IFeedStorage.cs index 3c76c632c..37bd4cd2a 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/IFeedStorage.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/IFeedStorage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/Mappers.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/Mappers.cs index aa487d577..30ab4a6cf 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/Mappers.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/DAO/Mappers.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Feed.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Feed.cs index effcbbf0e..e7dcc2469 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Feed.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Feed.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedComment.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedComment.cs index 25ebdbdaf..97caa1568 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedComment.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedComment.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedNews.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedNews.cs index 0b4f22209..8dfe33fc0 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedNews.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedNews.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPoll.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPoll.cs index 504ca58fe..a04ad575a 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPoll.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPoll.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPollAnswer.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPollAnswer.cs index 5bf05f816..ebf65f179 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPollAnswer.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPollAnswer.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPollType.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPollType.cs index faa8aa0b9..5d5377b86 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPollType.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPollType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPollVariant.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPollVariant.cs index 4e7e38c29..2c13e9c2c 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPollVariant.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedPollVariant.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedType.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedType.cs index 8c661bdba..e9abb2e8b 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedType.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedTypeInfo.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedTypeInfo.cs index a5cf75a88..1cde9327e 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedTypeInfo.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedTypeInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,10 +52,10 @@ public static FeedTypeInfo FromFeedType(FeedType feedType) { switch (feedType) { - case FeedType.News: return new FeedTypeInfo(feedType, NewsResource.FeedTypeNews, "32x_news.png"); - case FeedType.Order: return new FeedTypeInfo(feedType, NewsResource.NewsOrdersTypeName, "32x_order.png"); - case FeedType.Advert: return new FeedTypeInfo(feedType, NewsResource.NewsAnnouncementsTypeName, "32x_advert.png"); - case FeedType.Poll: return new FeedTypeInfo(feedType, NewsResource.FeedTypePoll, "32x_poll.png"); + case FeedType.News: return new FeedTypeInfo(feedType, NewsResource.FeedTypeNews, "32x_news.svg"); + case FeedType.Order: return new FeedTypeInfo(feedType, NewsResource.NewsOrdersTypeName, "32x_order.svg"); + case FeedType.Advert: return new FeedTypeInfo(feedType, NewsResource.NewsAnnouncementsTypeName, "32x_advert.svg"); + case FeedType.Poll: return new FeedTypeInfo(feedType, NewsResource.FeedTypePoll, "32x_poll.svg"); default: throw new ArgumentOutOfRangeException(string.Format("Unknown feed type: {0}.", feedType)); } } diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedUrls.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedUrls.cs index 09f4cbfdd..453ffe700 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedUrls.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/FeedUrls.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/NewsNotifySource.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/NewsNotifySource.cs index 354f47b16..6c412814f 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/NewsNotifySource.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/NewsNotifySource.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/SearchHandler.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/SearchHandler.cs index 1ce7eeca7..24c3c02a4 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/SearchHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/SearchHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,7 +46,7 @@ public override SearchResultItem[] Search(string text) public override ImageOptions Logo { - get { return new ImageOptions { ImageFileName = "newslogo.png", PartID = NewsConst.ModuleId }; } + get { return new ImageOptions { ImageFileName = "newslogo.svg", PartID = NewsModule.ModuleId }; } } public override string SearchName @@ -56,7 +56,7 @@ public override string SearchName public override Guid ModuleID { - get { return NewsConst.ModuleId; } + get { return NewsModule.ModuleId; } } public override Guid ProductID diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/ShortcutProvider.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/ShortcutProvider.cs index 43f4289c3..361bb17ba 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/ShortcutProvider.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/ShortcutProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/SubscriptionManager.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/SubscriptionManager.cs index a66816ef4..8565f9553 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/SubscriptionManager.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/Module/SubscriptionManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/PollVoteHandler.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/PollVoteHandler.cs index 8af4f520c..2e970375d 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/PollVoteHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/PollVoteHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/RequestInfo.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/RequestInfo.cs index fe9fd013d..dc8e6162c 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/RequestInfo.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Code/RequestInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Controls/BreadCumbsControl.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Controls/BreadCumbsControl.cs index 8a867e5a3..502db3df8 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Controls/BreadCumbsControl.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Controls/BreadCumbsControl.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Controls/FeedItem.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Controls/FeedItem.ascx.cs index a42c32b23..e9d1cf8dc 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Controls/FeedItem.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Controls/FeedItem.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Controls/FeedView.ascx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Controls/FeedView.ascx.cs index 961c2e84c..d1e831d73 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Controls/FeedView.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Controls/FeedView.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Default.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Default.aspx.cs index 2d216d509..76a38c5f8 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Default.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/Default.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -257,31 +257,31 @@ private void LoadData() switch (feedType) { case FeedType.News: - emptyScreenControl.ImgSrc = WebImageSupplier.GetAbsoluteWebPath("150x_news.png", NewsConst.ModuleId); + emptyScreenControl.ImgSrc = WebImageSupplier.GetAbsoluteWebPath("150x_news.svg", NewsModule.ModuleId); emptyScreenControl.Header = NewsResource.EmptyScreenNewsCaption; buttonLink = FeedUrls.EditNewsUrl; buttonName = NewsResource.EmptyScreenNewsLink; break; case FeedType.Order: - emptyScreenControl.ImgSrc = WebImageSupplier.GetAbsoluteWebPath("150x_order.png", NewsConst.ModuleId); + emptyScreenControl.ImgSrc = WebImageSupplier.GetAbsoluteWebPath("150x_order.svg", NewsModule.ModuleId); emptyScreenControl.Header = NewsResource.EmptyScreenOrdersCaption; buttonLink = FeedUrls.EditOrderUrl; buttonName = NewsResource.EmptyScreenOrderLink; break; case FeedType.Advert: - emptyScreenControl.ImgSrc = WebImageSupplier.GetAbsoluteWebPath("150x_advert.png", NewsConst.ModuleId); + emptyScreenControl.ImgSrc = WebImageSupplier.GetAbsoluteWebPath("150x_advert.svg", NewsModule.ModuleId); emptyScreenControl.Header = NewsResource.EmptyScreenAdvertsCaption; buttonLink = FeedUrls.EditAdvertUrl; buttonName = NewsResource.EmptyScreenAdvertLink; break; case FeedType.Poll: - emptyScreenControl.ImgSrc = WebImageSupplier.GetAbsoluteWebPath("150x_poll.png", NewsConst.ModuleId); + emptyScreenControl.ImgSrc = WebImageSupplier.GetAbsoluteWebPath("150x_poll.svg", NewsModule.ModuleId); emptyScreenControl.Header = NewsResource.EmptyScreenPollsCaption; buttonLink = FeedUrls.EditPollUrl; buttonName = NewsResource.EmptyScreenPollLink; break; default: - emptyScreenControl.ImgSrc = WebImageSupplier.GetAbsoluteWebPath("150x_newslogo.png", NewsConst.ModuleId); + emptyScreenControl.ImgSrc = WebImageSupplier.GetAbsoluteWebPath("150x_newslogo.svg", NewsModule.ModuleId); emptyScreenControl.Header = NewsResource.EmptyScreenEventsCaption; buttonLink = FeedUrls.EditNewsUrl; buttonName = NewsResource.EmptyScreenEventLink; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/EditNews.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/EditNews.aspx.cs index d58fe368b..f456aa79a 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/EditNews.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/EditNews.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/EditPoll.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/EditPoll.aspx.cs index 642709ae8..6efb34bbb 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/EditPoll.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/EditPoll.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/News.Master.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/News.Master.cs index 75e53c81d..563642397 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/News.Master.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/News.Master.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ using ASC.Core; using ASC.Notify.Recipients; using ASC.Web.Community.News.Code.Module; +using ASC.Web.Core.Utility; using ASC.Web.Studio.Core; namespace ASC.Web.Community.News @@ -59,8 +60,15 @@ protected Guid RequestedUserId protected void Page_Load(object sender, EventArgs e) { - Page.RegisterStyle("~/Products/Community/Modules/News/App_Themes/default/newsstylesheet.css") - .RegisterBodyScripts("~/Products/Community/Modules/News/js/news.js"); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/Products/Community/App_Themes/dark/dark-newsstylesheet.less"); + } + else + { + Page.RegisterStyle("~/Products/Community/Modules/News/App_Themes/default/newsstylesheet.less"); + } + Page.RegisterBodyScripts("~/Products/Community/Modules/News/js/news.js"); SearchText = ""; if (!string.IsNullOrEmpty(Request["search"])) diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/News.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/News.aspx.cs index 6b9333457..d267bed7a 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/News.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/News.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/NewsConst.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/NewsConst.cs index 4eab7ceee..ecc250e84 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/NewsConst.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/NewsConst.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,9 +26,6 @@ namespace ASC.Web.Community.News { public static class NewsConst { - public static Guid ModuleId = new Guid("3CFD481B-46F2-4a4a-B55C-B8C0C9DEF02C"); - - public static readonly Action Action_Add = new Action(new Guid("{2C6552B3-B2E0-4a00-B8FD-13C161E337B1}"), NewsResource.Action_Add_Name); public static readonly Action Action_Edit = new Action(new Guid("{14BE970F-7AF5-4590-8E81-EA32B5F7866D}"), NewsResource.Action_Edit_Name); public static readonly Action Action_Comment = new Action(new Guid("{FCAC42B8-9386-48eb-A938-D19B3C576912}"), NewsResource.Action_Comment_Name); diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/NewsModule.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/NewsModule.cs index 919386720..984bd7bd3 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/NewsModule.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/NewsModule.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,9 +28,11 @@ namespace ASC.Web.Community.News { public class NewsModule : Module { + public static Guid ModuleId = new Guid("3CFD481B-46F2-4a4a-B55C-B8C0C9DEF02C"); + public override Guid ID { - get { return NewsConst.ModuleId; } + get { return ModuleId; } } public override Guid ProjectId @@ -57,8 +59,8 @@ public NewsModule() { Context = new ModuleContext { - SmallIconFileName = "newslogo.png", - IconFileName = "32x_news.png", + SmallIconFileName = "newslogo.svg", + IconFileName = "32x_news.svg", SubscriptionManager = new SubscriptionManager(), GetCreateContentPageAbsoluteUrl = () => CommunitySecurity.CheckPermissions(NewsConst.Action_Add) ? FeedUrls.EditNewsUrl : null, SearchHandler = new SearchHandler(), diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/js/news.js b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/js/news.js index 02915e602..cc333019e 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/News/js/news.js +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/News/js/news.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/filetype_style.css b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/filetype_style.less similarity index 92% rename from web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/filetype_style.css rename to web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/filetype_style.less index ab64eaae1..1ffaa2edc 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/filetype_style.css +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/filetype_style.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,41 +15,41 @@ */ -.ftUnknown, .ftArchive, .ftVideo, .ftAudio, .ftImage, .ftSpreadsheet, .ftPresentation, .ftDocument -{ - background-position: 7px center !important; - background-repeat:no-repeat; -} - -.ftUnknown -{ - background-image:url('../images/filetype/file_na.png'); -} -.ftArchive -{ - background-image:url('../images/filetype/file_zip.png'); -} -.ftVideo -{ - background-image:url('../images/filetype/file_mpg.png'); -} -.ftAudio -{ - background-image:url('../images/filetype/file_sound.png'); -} -.ftImage -{ - background-image:url('../images/filetype/file_image.png'); -} -.ftSpreadsheet -{ - background-image:url('../images/filetype/file_xls.png'); -} -.ftPresentation -{ - background-image:url('../images/filetype/file_ppt.png'); -} -.ftDocument -{ - background-image:url('../images/filetype/file_txt.png'); +.ftUnknown, .ftArchive, .ftVideo, .ftAudio, .ftImage, .ftSpreadsheet, .ftPresentation, .ftDocument +{ + background-position: 7px center !important; + background-repeat:no-repeat; +} + +.ftUnknown +{ + background-image:url('../images/filetype/file_na.png'); +} +.ftArchive +{ + background-image:url('../images/filetype/file_zip.png'); +} +.ftVideo +{ + background-image:url('../images/filetype/file_mpg.png'); +} +.ftAudio +{ + background-image:url('../images/filetype/file_sound.png'); +} +.ftImage +{ + background-image:url('../images/filetype/file_image.png'); +} +.ftSpreadsheet +{ + background-image:url('../images/filetype/file_xls.png'); +} +.ftPresentation +{ + background-image:url('../images/filetype/file_ppt.png'); +} +.ftDocument +{ + background-image:url('../images/filetype/file_txt.png'); } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/wikicss.css b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/wikicss.less similarity index 74% rename from web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/wikicss.css rename to web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/wikicss.less index cf799a190..4a54e326b 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/wikicss.css +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/wikicss.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,388 +15,377 @@ */ -body -{ - margin: 0; - padding: 0; -} - - -.wikiCaption -{ - color: #111; - font-size: 24px; - padding: 24px 0px 0px 8px; -} - -.wikiBody -{ - padding: 0px 0px 36px; - overflow-x: auto; -} - -.wikiCredits -{ - border-top: solid 1px #D1D1D1; - margin: 6px 24px 16px 32px; - padding-top: 6px; -} - -.wikiEditButton -{ - color: #36393E !important; - padding:0 0 0 4px; -} - -.wikiVersionInfo, .wikiVersionInfo a -{ - -} - -.wikiLabelStatus -{ - color: #36393E; - font-size: 12px; - font-weight: normal; -} - -.errorColor -{ - color: Red !important; -} - -.listGrid -{ - width: 100%; - border-style: none; - table-layout: fixed; - padding-bottom:12px; -} - -.pageHelpPanel -{ - background-color:White; - border:1px solid #C7C7C7; - position:absolute; - width:154px; - z-index:10; - overflow-x:hidden; -} - -div.wikiMaxFileSizeBlock -{ - color:#656668; - display:inline-block; - position:relative; - text-align:center; - width:100%; - *clear:both; - *margin-bottom:0px; -} - -div.seachHelpItem -{ - cursor:pointer; - padding:2px 0px 2px 10px; -} - -div.seachHelpSelected, div.seachHelpItem:hover -{ - -} - -/* header column rules */ -.listGrid th -{ - - color: #82878D; - height: 24px; - padding: 19px 0px 10px 0px; - vertical-align: middle; - font-size: 12px; - font-weight:normal; - border-top: solid 1px #ffffff; - border-left-style: none; - border-right-style: none; - border-bottom: solid 1px #D7D8DC; -} - - -/* data cell and data row rules */ -.listGrid td -{ - padding: 10px 0px 10px 0px; - border-top-style: none; - border-left-style: none; - border-right-style: none; - border-bottom: solid 1px #D7D8DC; -} - -tr.alter, tr.alter td -{ - -} - -.listGrid td table td -{ - border:none; -} - - -.row:hover -{ - background-color: #E6E6E6; -} - -.row:hover .linkMedium, -.row:hover .linkHeaderMedium -{ - text-decoration: underline; -} - -.wikiDiff ol li -{ - padding-left:5px; - word-wrap:break-word; - padding:1px 0px 1px 5px; - vertical-align:top; -} - -.wikiDiff span.d -{ - background-color: Orange; -} - -.wikiDiff span.i -{ - background-color: Lime; -} - -.wikiDiff ol -{ - word-break: break-all; -} - - -.PrintHeader -{ - color:#111111; - font-size:32px; - font-weight:bold; - padding-bottom:20px; - display: none; -} - -.catDict -{ - width:100%; -} - -.catDict .catLetter -{ - width:33%; - vertical-align:top; - padding-bottom:26px; -} - -.catDict .catLetter .block -{ - padding-bottom:15px; -} - -.catDict .catLetter .letter -{ - color:#666666; - font-size:24px; - padding:5px; -} - -.catDict .catLetter .catList -{ - max-width: 220px; - padding: 5px; - word-wrap: break-word; -} - -.catDict .catLetter .catList .category -{ - padding: 2px 0px; -} - -.catDict .catLetter .catList .category a -{ - -} - -.editCommandPanel -{ - padding: 0 0 15px; -} - -.lblNotExists -{ - display:block; - text-align:center; - width:100%; -} - -.wikiDiffRadion, .wikiDiffRadion input[type=radio] -{ - padding-left: 0px; - padding-right: 3px; - margin-left: 0px; - margin-right: 0px; -} - -.wikiEmptyPage -{ - font-size: 12px; - font-style:normal; - font-weight:normal; - text-decoration:none; - color:#000; - padding: 14px 0px 20px; - -} - -.wikiEmptyPage .caption -{ - font-size:24px; - color:#277BA4; -} - -.wikiEmptyPage .secondaryCaption -{ - font-size:18px; - color:#277BA4; - padding-bottom:4px; -} - -.wikiEmptyPage a, .wikiEmptyPage a:visited -{ - font-size: 12px; - font-style:normal; - font-weight:normal; - text-decoration:underline; - color:#000; -} - -.wikiEmptyPage a:hover -{ - text-decoration:none; - color:#000; -} - -.wikiVersionLeft -{ - width:12px; -} - -@media screen and (-webkit-min-device-pixel-ratio:0) -{ - .wikiVersionLeft - { - width:46px; - } -} - -.wikiLeftSideTable -{ - padding-left: 15px !important; - padding-right: 19px !important; -} - -.wikiLeftSideTableFiles -{ - padding-left: 35px !important; - padding-right: 19px !important; -} - -.wikiRightSideTable -{ - padding-right:15px !important; -} - -.wikiDateTime -{ - color:#83888d; -} - -.wikiFileSize -{ - color:#83888d; -} - -.subHeaderPanel -{ - padding-bottom: 20px; -} - -table.homeTable -{ - - border:none; - border-bottom: solid 1px #D1D1D1; - border-top: solid 1px #D1D1D1; -} - -table.homeTable td:first-child -{ - width:102px; -} - -table.homeTable td -{ - vertical-align:top; - padding-left:14px; -} - - -.actionsBar -{ - color:#0061AC; - float:right; -} - -*html .actionsBar -{ - color:#0061AC; - float: none; -} - -.actionsBar a -{ - color:#333333 !important; -} - -.wikiBlockOverlay -{ - border: medium none; - margin: 0pt; - padding: 0pt; - z-index: 1000; - cursor: default; - width: 100%; - height: 100%; - top: 0pt; - left: 0pt; - background-color: rgb(170, 170, 170); - opacity: 0.3; - filter: alpha(opacity = 30); - position: fixed; -} - -div#wiki_UploadFileBox -{ - border: medium none; - padding: 0px; - z-index: 1001; - position: fixed; - width: 600px; - height: 250px; - cursor: default; - text-align: left; - background-color: Transparent; - margin-left: -300px; - top: 240px; +@import "../../../../../App_Themes/default/params.less"; + +body +{ + margin: 0; + padding: 0; +} + + +.wikiCaption +{ + color: #111; + font-size: 24px; + padding: 24px 0px 0px 8px; +} + +.wikiBody +{ + padding: 0px 0px 36px; + overflow-x: auto; +} + +.wikiCredits { + border-top: solid 1px @border-color; + margin: 6px 24px 16px 32px; + padding-top: 6px; +} + +.wikiEditButton +{ + color: #36393E !important; + padding:0 0 0 4px; +} + +.wikiVersionInfo, .wikiVersionInfo a +{ + +} + +.wikiLabelStatus +{ + color: #36393E; + font-size: 12px; + font-weight: normal; +} + +.errorColor +{ + color: Red !important; +} + +.listGrid +{ + width: 100%; + border-style: none; + table-layout: fixed; + padding-bottom:12px; +} + +.pageHelpPanel { + background-color: White; + border: 1px solid @text-area-border-color; + position: absolute; + width: 154px; + z-index: 10; + overflow-x: hidden; +} + +div.wikiMaxFileSizeBlock +{ + color:#656668; + display:inline-block; + position:relative; + text-align:center; + width:100%; + *clear:both; + *margin-bottom:0px; +} + +div.seachHelpItem +{ + cursor:pointer; + padding:2px 0px 2px 10px; +} + +div.seachHelpSelected, div.seachHelpItem:hover +{ + +} + +/* header column rules */ +.listGrid th { + color: #82878D; + height: 24px; + padding: 19px 0px 10px 0px; + vertical-align: middle; + font-size: 12px; + font-weight: normal; + border-top: solid 1px @body-color; + border-left-style: none; + border-right-style: none; + border-bottom: solid 1px #D7D8DC; +} + + +/* data cell and data row rules */ +.listGrid td +{ + padding: 10px 0px 10px 0px; + border-top-style: none; + border-left-style: none; + border-right-style: none; + border-bottom: solid 1px #D7D8DC; +} + +tr.alter, tr.alter td +{ + +} + +.listGrid td table td +{ + border:none; +} + + +.row:hover { + background-color: @body-color-hover; +} + +.row:hover .linkMedium, +.row:hover .linkHeaderMedium +{ + text-decoration: underline; +} + +.wikiDiff ol li +{ + padding-left:5px; + word-wrap:break-word; + padding:1px 0px 1px 5px; + vertical-align:top; +} + +.wikiDiff span.d +{ + background-color: Orange; +} + +.wikiDiff span.i +{ + background-color: Lime; +} + +.wikiDiff ol +{ + word-break: break-all; +} + + +.PrintHeader +{ + color:#111111; + font-size:32px; + font-weight:bold; + padding-bottom:20px; + display: none; +} + +.catDict +{ + width:100%; +} + +.catDict .catLetter +{ + width:33%; + vertical-align:top; + padding-bottom:26px; +} + +.catDict .catLetter .block +{ + padding-bottom:15px; +} + +.catDict .catLetter .letter { + color: @grey-text; + font-size: 24px; + padding: 5px; +} + +.catDict .catLetter .catList +{ + max-width: 220px; + padding: 5px; + word-wrap: break-word; +} + +.catDict .catLetter .catList .category +{ + padding: 2px 0px; +} + +.catDict .catLetter .catList .category a +{ + +} + +.editCommandPanel +{ + padding: 0 0 15px; +} + +.lblNotExists +{ + display:block; + text-align:center; + width:100%; +} + +.wikiDiffRadion, .wikiDiffRadion input[type=radio] +{ + padding-left: 0px; + padding-right: 3px; + margin-left: 0px; + margin-right: 0px; +} + +.wikiEmptyPage { + font-size: 12px; + font-style: normal; + font-weight: normal; + text-decoration: none; + color: @dark-text-color; + padding: 14px 0px 20px; +} + +.wikiEmptyPage .caption +{ + font-size:24px; + color:#277BA4; +} + +.wikiEmptyPage .secondaryCaption +{ + font-size:18px; + color:#277BA4; + padding-bottom:4px; +} + +.wikiEmptyPage a, .wikiEmptyPage a:visited { + font-size: 12px; + font-style: normal; + font-weight: normal; + text-decoration: underline; + color: @dark-text-color; +} + +.wikiEmptyPage a:hover { + text-decoration: none; + color: @dark-text-color; +} + +.wikiVersionLeft +{ + width:12px; +} + +@media screen and (-webkit-min-device-pixel-ratio:0) +{ + .wikiVersionLeft + { + width:46px; + } +} + +.wikiLeftSideTable +{ + padding-left: 15px !important; + padding-right: 19px !important; +} + +.wikiLeftSideTableFiles +{ + padding-left: 35px !important; + padding-right: 19px !important; +} + +.wikiRightSideTable +{ + padding-right:15px !important; +} + +.wikiDateTime +{ + color:#83888d; +} + +.wikiFileSize +{ + color:#83888d; +} + +.subHeaderPanel +{ + padding-bottom: 20px; +} + +table.homeTable { + border: none; + border-bottom: solid 1px @border-color; + border-top: solid 1px @border-color; +} + +table.homeTable td:first-child +{ + width:102px; +} + +table.homeTable td +{ + vertical-align:top; + padding-left:14px; +} + + +.actionsBar +{ + color:#0061AC; + float:right; +} + +*html .actionsBar +{ + color:#0061AC; + float: none; +} + +.actionsBar a { + color: @text-color !important; +} + +.wikiBlockOverlay +{ + border: medium none; + margin: 0pt; + padding: 0pt; + z-index: 1000; + cursor: default; + width: 100%; + height: 100%; + top: 0pt; + left: 0pt; + background-color: rgb(170, 170, 170); + opacity: 0.3; + filter: alpha(opacity = 30); + position: fixed; +} + +div#wiki_UploadFileBox +{ + border: medium none; + padding: 0px; + z-index: 1001; + position: fixed; + width: 600px; + height: 250px; + cursor: default; + text-align: left; + background-color: Transparent; + margin-left: -300px; + top: 240px; } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/wikicssprint.css b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/wikicssprint.less similarity index 91% rename from web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/wikicssprint.css rename to web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/wikicssprint.less index a012aa523..88e6851c6 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/wikicssprint.css +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/css/wikicssprint.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,29 +15,29 @@ */ -.studio-top-panel.mainPageLayout, -.borderBase.mainPageTableSidePanel, -.containerHeaderBlock, -.infoPanel, -.WikiHeaderBlock .follow-status, -.WikiHeaderBlock .menu-small, -.big-button-container, -.wikiCredits, -.editsection { - display:none !important; -} - -#WikiActionsMenuPanel, -#edit_container, -#_PrevContainer, -#wikiCommentsDiv, -#uvTab { - display:none !important; -} - -.mainPageLayout, -.mainPageContent, -.wikiBody { - padding:0 !important; - margin:0 !important; +.studio-top-panel.mainPageLayout, +.borderBase.mainPageTableSidePanel, +.containerHeaderBlock, +.infoPanel, +.WikiHeaderBlock .follow-status, +.WikiHeaderBlock .menu-small, +.big-button-container, +.wikiCredits, +.editsection { + display:none !important; +} + +#WikiActionsMenuPanel, +#edit_container, +#_PrevContainer, +#wikiCommentsDiv, +#uvTab { + display:none !important; +} + +.mainPageLayout, +.mainPageContent, +.wikiBody { + padding:0 !important; + margin:0 !important; } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/page.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/page.png deleted file mode 100644 index a0b334e9c286a8392aec7e7c772c2ff6888c3a3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1249 zcmV<71Rnc|P)CV`IZiKs+9&TB7Z@ zC~~2h5{ZNmjYf$@kmESSLTGq+7}vqSa$G8vM1+xmSS&`Y)+2ZKXL8@&OR1Lk39rq~ zO^@~Ubt)E%w6L%s3=R(7wXFK}3x$GJE|<*&U?D6F3X{F$Htr+7Pl+$zuG$>p*cI{O zG&MCvoDLD#-`{_yR>bP+s>MRh1R%7mmdcrBihlHhYz`2CTKD)~E|;T$fdQJFoFskq z^z;P%B5*zsh1~=^&0KN@|CEKDt7pB<-J2IB=fHJc$-Qmc;(B^|nu5U~4Gj&E|JBvi z75F;>8W>wP{Q5&GrlRDYdPX+S1ilxy{&RtAgdh1w1bTaW5qgOP4rC}4BAlggIQ%OP zAb)4q6dYlG5dkOnP~u#JY;IrvM4ZAgoGTguQ~+;69UUDM2n49LwUyf1+Niy~UCssW zK|nsAmr5`>10QSHW1k(RQa&e6_jTWy>S`Z zKVBlY`2gAd_qN>!ejw+3lYCY*0yqb=v$GQRiHQjhZc5bM-Hr6f<}BJw02V98ZE*;) zzu%HRkZfu8%2UzraCjvW9BSf{6HuOgeSJVSH|~VUDHa!(oo(baK2@oPGsmj(uOJHk zXedYz4kb4y+1ywFLMcrqo382u{s^dZMf!#hLKEST z_Kk0=a<7he0s_Xy#%O$e+~^E=ePH&&2UK2)k=s=11KHoM)j9V&Rd5FU*Z4cSBO?NK zs{&sic$|{w8!PUwd|KxmB?d4NfjZXQ>or6moqVQb5Sb1muMfmOKT2!G{C3S3R_mO@ z^}|2~fSH*Yl&CZz<7pVW_6$w&x1HaWKp zT4*WZc+N9-ev&?r`0Bkn*Kmp2$Gg@)W&;l&0iy8agmH{^Y%Bnqi*xjWhDsl>&%9aZ z+V2?o#&0nl(FvEAmpuV^RD%d30a!q0ea-U#BH(we_+4WrVB@8wC7A^fhBJ^(r>mY9 zckBaUuMeE9>I1dTu{eNWI7i8G&C}@UsEp)fGAVyU6|f+S#hLYixt7yZTHJmfNZ zJJtSPudXq4)cNA#qHK%@S3Jx@0H?;{`x1qJ^gN)>;Tm}cSQu|fbjH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo150.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo150.png deleted file mode 100644 index 7756cc857f79356bf72fd8b6ba19bf3176e4b4f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19495 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 KMNUMnLSTYp^!{xC diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo150.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo150.svg new file mode 100644 index 000000000..b2ac7ff20 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo150.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo16.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo16.png deleted file mode 100644 index 2511d6844d7daf3bca97e844d33ad7252ed4037c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 906 zcmV;519kj~P)@Na8mu9R5c3Oj(7S18wiPT`0STNVqW(k6i%=0DuxU_{=u9jaWcfiw{^K z0Y{~M`?cAnHQssR2&eAr<)_&N&i#0;DH)6Ai`udyY*E!fPdnv}*pR~N02c(9nvYc> zCRZ|iGc>?=b7_89%<=Sv6f7<0iN}e@6ptR*j|{Af1=bQ2i)dd{2{b`SFtM2C{Rg_~ zZ*L+~EV4V{@#I}yJUiI08loYho(F)e8keZ8rztMp7%XH~H>yZ76;0G>j`nWj@P$#H z8|Wpqm}Wj#u;nRM#e7e5AfowM4W(;nLC@=SQ@b=g&^Aih< z?rP!P>#Hy`$IQ-#w`fSdxZ+0|8so7;YO7GhX~#-+lXyrWN@WldPdJ9VJJ>q1mt*_7 zvDUD>vz~|V?tASOnc%-nmcgDKNNw#G){D3(c8?zf@0rGC2m+*#%&cd*w36pmKF{RF z7C)~RS=(4=a^V(N*GsGyODJ2b=7QEvoag;xg~S&MLXN*O1@<(?$ozVPi=FkP(iQA4 zQ_T0oL~82qB%!+O^qnoJQq?aBzlxC&q;%-~CXvj_`EURDy>R{9sWWSjKg7tsc82y! zQeAO+T9e>KHj|!KwMuQ5wASMLKEAF|DHPDl^Jir|af0TS7oI=={jpc?@8;;2DRPw> zA5Z+t$*(WVd)gCJoG?Plo62Y%iFr|+lAshtPaUY`avy}F9;0)cuYWqdz( gRdU91`Q|GB1J$~y>P{n0JOBUy07*qoM6N<$f(JUUp#T5? diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo16.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo16.svg new file mode 100644 index 000000000..d76f33a10 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo16.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo32.png b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo32.png deleted file mode 100644 index 44da52bd995f4935b858e1337ab4ca0fbfd0119e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2089 zcmV+^2-f$BP)vxAot=++-}gNJac7t9?*1(|d2{EU zd1ub^p7We@o*PKwL8Ybcq02&{IsF4OX178+g1Qdb&!0#p9t4ubc zy@=HOt%NrrKp5VHx5Vyb$i%>n>&^r))oCyVo#F<-9|>D-Ak0A~lkD(*rA4*7RjY20 zi?2c?0AxsD2$L`qCNMJ$;l1HyGb6wh$I}@hX=6}mMN^_8w=m zL||$mX!0(U4N;?hGnLbQYAbFa6DIaX4aO_?JMV8Hmq(__e7k18O~T8NGzlQ#!)yQm zjSMkSlA3}>s3vi(#zs$Cu{#f7V`GuberOV^Rq^AMB)oBikLq~uaFK(~9*h7o8GJg6 zQfbWmOaLY&&h?RRQ>T=v1^RnB zgVT+O56a{G>*x^AzI~L}OCu;9&K`m0X|XxIs0m==J2PvRmthkrEB4@>BdS&T+_`<+ ze11P;jhI3v%{9Myf}dWqj_n7JaYGl<_6dQ!lJZH2 zl&si~$(U)~<% zp^X>K0$_?$FA;m2WU!k6Wg<3DWS+>0#(0(6FJ3{IO7YF7U!t!q&sZbom6K(hH%t&a zqmj;W|Lz0awCWrlKX{y5pWib(faH`(6igE(lytAiTjJP6>_xpc&SmpExO~xEw!ir< z=XJI5jnzwd@yHO%+FMxB*-CquWpPJ=<%Klwlqy`du$R?c1tK>K3B3vLeUf+Y@nfUN zMffm}@~ug9Ea8YZVU-GZY`TzLM^Ey_rDqcaaN+z;PK=Fn_KL+=t(%2&+Sstrv#KM+ z%s4V!X4?hlaq&%>1Thx6xma-^K)E9NI>#-h$5 zSFTt>f4Ra$hwIGe`0ARai)H|bz2WOMBt7Gev}8A1z5ap4F@mj@Z$XyKa? z7%3$cluW~k*=)!sfF_2GnPwLx$)vKPf?%WC=3rx`R}{xjo7pn87S}7=f|*YMNSvzF z*>Px);}(Dyb8=Zuj8%F3@TtU6qt1mrttWQ8@t<%{MP20c1dSS7Rxjbvy$1##p56yy z?=iDcAIDfWgB82xTcLfc@913bb2+?uyl)DOAYlJcnH4=9hyVovC&sFrmE;#?LNq!I z(psdsR;%1+jT&8Hnvq%^g4B*#8c_nm`K0qX3vgi$OJyd7grYiryo~Bqp8fCp+^~Eh z)@b14hEsyhHVI@E)WSYRP-W(QPW1Zdu)y*|&diXg8_UT~h%BlIZ>I^SBQO zktBNOPv%OdL}tYeG&20MnLP)pWvi8q&wcCq^#jL8kVGng&-X9jnS)1@!B(&F=}+_p zZ;y_1^7J^EV|i~U00)Lf*mm_5(>UM_HDwc~Nyi`*H}J!!UIblEChH}LQki>x`NF^x zcWhXD!|i|Hix+g}Lk^EtdHLuN8ZEJ)*v5|cPqBY^lyngAK>uRC{kJ{Ty=U9ZY3T9Z z5?$v#l1EKZ>1#ERo>V&PDRvWdbV9zs(+7|2{^#N2-1y1Gyfswj!M%sLw6B{tN)_H1 z8l_yT^KQAqo2MNMJ6hQ_IK;rI3gvn{a~Rn~s4c1W#CcM7K{|tEYls?P262R3+(tIH z`6s*flOo`eO&9atXqC1w%LP5{XE?~lHMXwl=b_i$;kqUBc=QXG%mg5P6oKBB481KG z=H|1^&1aZf>;QtzpnOv)f^-RCZe?e0FFzkR#Lo9Wvg+R7> zpZc5y(o;mU0lv9npwV1)pxU$>;3oEkKYJ{mjv$ak5Cs1h0FvVAvmp4mU(f#sd6vuq T-$ODU00000NkvXXu0mjf1sM5r diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo32.svg b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo32.svg new file mode 100644 index 000000000..7f3cb5553 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/App_Themes/default/images/wikilogo32.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/ActionHelper.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/ActionHelper.cs index 7967f04a5..bf6185f85 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/ActionHelper.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/ActionHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * */ + namespace ASC.Web.UserControls.Wiki { public class ActionHelper diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/BaseDao.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/BaseDao.cs index 18b44a9dd..f09a53b52 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/BaseDao.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/BaseDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,7 +32,7 @@ class BaseDao : IDisposable public BaseDao(string dbid, int tenant) { - this.db = DbManager.FromHttpContext(dbid); + this.db = new DbManager(dbid); this.tenant = tenant; } diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/BaseUserControl.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/BaseUserControl.cs index 741ab53b9..60cfb6554 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/BaseUserControl.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/BaseUserControl.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ using System; using System.Web; +using ASC.Web.Core.Utility; using ASC.Web.UserControls.Wiki.Data; using ASC.Web.UserControls.Wiki.Handlers; @@ -131,8 +132,16 @@ protected override void OnInit(EventArgs e) { base.OnInit(e); - Page.RegisterBodyScripts("~/Products/Community/Modules/Wiki/scripts/editpage.js") - .RegisterStyle("~/Products/Community/Modules/Wiki/content/main.css"); + Page.RegisterBodyScripts("~/Products/Community/Modules/Wiki/scripts/editpage.js"); + + if (ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/Products/Community/App_Themes/dark/dark-main.less"); + } + else + { + Page.RegisterStyle("~/Products/Community/Modules/Wiki/content/main.less"); + } } protected override void OnLoad(EventArgs e) diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Category.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Category.cs index 246f6b77e..3c2711906 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Category.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Category.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/CategoryDao.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/CategoryDao.cs index 9e8abeeae..2b28ead74 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/CategoryDao.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/CategoryDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Comment.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Comment.cs index 0a80da144..dd1a02bd0 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Comment.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Comment.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/CommentDao.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/CommentDao.cs index 0296a4024..788db1f0d 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/CommentDao.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/CommentDao.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Constants.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Constants.cs index a22888ef5..6dceb4aad 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Constants.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Constants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Diff.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Diff.cs index 269011291..7b715da73 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Diff.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Diff.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,68 +15,68 @@ */ -/// This Class implements the Difference Algorithm published in -/// "An O(ND) Difference Algorithm and its Variations" by Eugene Myers -/// Algorithmica Vol. 1 No. 2, 1986, p 251. -/// -/// There are many C, Java, Lisp implementations public available but they all seem to come -/// from the same source (diffutils) that is under the (unfree) GNU public License -/// and cannot be reused as a sourcecode for a commercial application. -/// There are very old C implementations that use other (worse) algorithms. -/// Microsoft also published sourcecode of a diff-tool (windiff) that uses some tree data. -/// Also, a direct transfer from a C source to C# is not easy because there is a lot of pointer -/// arithmetic in the typical C solutions and i need a managed solution. -/// These are the reasons why I implemented the original published algorithm from the scratch and -/// make it avaliable without the GNU license limitations. -/// I do not need a high performance diff tool because it is used only sometimes. -/// I will do some performace tweaking when needed. -/// -/// The algorithm itself is comparing 2 arrays of numbers so when comparing 2 text documents -/// each line is converted into a (hash) number. See DiffText(). -/// -/// Some chages to the original algorithm: -/// The original algorithm was described using a recursive approach and comparing zero indexed arrays. -/// Extracting sub-arrays and rejoining them is very performance and memory intensive so the same -/// (readonly) data arrays are passed arround together with their lower and upper bounds. -/// This circumstance makes the LCS and SMS functions more complicate. -/// I added some code to the LCS function to get a fast response on sub-arrays that are identical, -/// completely deleted or inserted. -/// -/// The result from a comparisation is stored in 2 arrays that flag for modified (deleted or inserted) -/// lines in the 2 data arrays. These bits are then analysed to produce a array of Item objects. -/// -/// Further possible optimizations: -/// (first rule: don't do it; second: don't do it yet) -/// The arrays DataA and DataB are passed as parameters, but are never changed after the creation -/// so they can be members of the class to avoid the paramter overhead. -/// In SMS is a lot of boundary arithmetic in the for-D and for-k loops that can be done by increment -/// and decrement of local variables. -/// The DownVector and UpVector arrays are alywas created and destroyed each time the SMS gets called. -/// It is possible to reuse tehm when transfering them to members of the class. -/// See TODO: hints. -/// -/// diff.cs: A port of the algorythm to C# -/// Created by Matthias Hertel, see http://www.mathertel.de -/// This work is licensed under a Creative Commons Attribution 2.0 Germany License. -/// see http://creativecommons.org/licenses/by/2.0/de/ -/// -/// Changes: -/// 2002.09.20 There was a "hang" in some situations. -/// Now I undestand a little bit more of the SMS algorithm. -/// There have been overlapping boxes; that where analyzed partial differently. -/// One return-point is enough. -/// A assertion was added in CreateDiffs when in debug-mode, that counts the number of equal (no modified) lines in both arrays. -/// They must be identical. -/// -/// 2003.02.07 Out of bounds error in the Up/Down vector arrays in some situations. -/// The two vetors are now accessed using different offsets that are adjusted using the start k-Line. -/// A test case is added. -/// -/// 2006.03.05 Some documentation and a direct Diff entry point. -/// -/// 2006.03.08 Refactored the API to static methods on the Diff class to make usage simpler. -/// 2006.03.10 using the standard Debug class for self-test now. -/// compile with: csc /target:exe /out:diffTest.exe /d:DEBUG /d:TRACE /d:SELFTEST Diff.cs +// This Class implements the Difference Algorithm published in +// "An O(ND) Difference Algorithm and its Variations" by Eugene Myers +// Algorithmica Vol. 1 No. 2, 1986, p 251. +// +// There are many C, Java, Lisp implementations public available but they all seem to come +// from the same source (diffutils) that is under the (unfree) GNU public License +// and cannot be reused as a sourcecode for a commercial application. +// There are very old C implementations that use other (worse) algorithms. +// Microsoft also published sourcecode of a diff-tool (windiff) that uses some tree data. +// Also, a direct transfer from a C source to C# is not easy because there is a lot of pointer +// arithmetic in the typical C solutions and i need a managed solution. +// These are the reasons why I implemented the original published algorithm from the scratch and +// make it avaliable without the GNU license limitations. +// I do not need a high performance diff tool because it is used only sometimes. +// I will do some performace tweaking when needed. +// +// The algorithm itself is comparing 2 arrays of numbers so when comparing 2 text documents +// each line is converted into a (hash) number. See DiffText(). +// +// Some chages to the original algorithm: +// The original algorithm was described using a recursive approach and comparing zero indexed arrays. +// Extracting sub-arrays and rejoining them is very performance and memory intensive so the same +// (readonly) data arrays are passed arround together with their lower and upper bounds. +// This circumstance makes the LCS and SMS functions more complicate. +// I added some code to the LCS function to get a fast response on sub-arrays that are identical, +// completely deleted or inserted. +// +// The result from a comparisation is stored in 2 arrays that flag for modified (deleted or inserted) +// lines in the 2 data arrays. These bits are then analysed to produce a array of Item objects. +// +// Further possible optimizations: +// (first rule: don't do it; second: don't do it yet) +// The arrays DataA and DataB are passed as parameters, but are never changed after the creation +// so they can be members of the class to avoid the paramter overhead. +// In SMS is a lot of boundary arithmetic in the for-D and for-k loops that can be done by increment +// and decrement of local variables. +// The DownVector and UpVector arrays are alywas created and destroyed each time the SMS gets called. +// It is possible to reuse tehm when transfering them to members of the class. +// See TODO: hints. +// +// diff.cs: A port of the algorythm to C# +// Created by Matthias Hertel, see http://www.mathertel.de +// This work is licensed under a Creative Commons Attribution 2.0 Germany License. +// see http://creativecommons.org/licenses/by/2.0/de/ +// +// Changes: +// 2002.09.20 There was a "hang" in some situations. +// Now I undestand a little bit more of the SMS algorithm. +// There have been overlapping boxes; that where analyzed partial differently. +// One return-point is enough. +// A assertion was added in CreateDiffs when in debug-mode, that counts the number of equal (no modified) lines in both arrays. +// They must be identical. +// +// 2003.02.07 Out of bounds error in the Up/Down vector arrays in some situations. +// The two vetors are now accessed using different offsets that are adjusted using the start k-Line. +// A test case is added. +// +// 2006.03.05 Some documentation and a direct Diff entry point. +// +// 2006.03.08 Refactored the API to static methods on the Diff class to make usage simpler. +// 2006.03.10 using the standard Debug class for self-test now. +// compile with: csc /target:exe /out:diffTest.exe /d:DEBUG /d:TRACE /d:SELFTEST Diff.cs using System; @@ -277,6 +277,8 @@ public static Item[] DiffInt(int[] ArrayA, int[] ArrayB) /// the input text /// This extern initialized hashtable is used for storing all ever used textlines. /// ignore leading and trailing space characters + /// + /// /// a array of integers. private static int[] DiffCodes(string aText, Hashtable h, bool trimSpace, bool ignoreSpace, bool ignoreCase) { @@ -344,10 +346,10 @@ private static SMSRD SMS(DiffData DataA, int LowerA, int UpperA, DiffData DataB, int Delta = (UpperA - LowerA) - (UpperB - LowerB); bool oddDelta = (Delta & 1) != 0; - /// vector for the (0,0) to (x,y) search + // vector for the (0,0) to (x,y) search int[] DownVector = new int[2 * MAX + 2]; - /// vector for the (u,v) to (N,M) search + // vector for the (u,v) to (N,M) search int[] UpVector = new int[2 * MAX + 2]; // The vectors in the publication accepts negative indexes. the vectors implemented here are 0-based @@ -589,7 +591,7 @@ internal class DiffData ///

    /// Initialize the Diff-Data buffer. /// - /// reference to the buffer + /// reference to the buffer internal DiffData(int[] initData) { data = initData; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/File.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/File.cs index be61a64a0..3b4c1b8b4 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/File.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/File.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/FileDAO.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/FileDAO.cs index c584ed0d7..f81baced5 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/FileDAO.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/FileDAO.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/HtmlWikiUtil.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/HtmlWikiUtil.cs index 978596e9a..c09c6db1b 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/HtmlWikiUtil.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/HtmlWikiUtil.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/HtmlWikiUtil_Wiki2Html.cs.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/HtmlWikiUtil_Wiki2Html.cs.cs index 97dba3763..edfff7a5b 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/HtmlWikiUtil_Wiki2Html.cs.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/HtmlWikiUtil_Wiki2Html.cs.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/IVersioned.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/IVersioned.cs index a639c4a88..84e41d6d9 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/IVersioned.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/IVersioned.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/IWikiObjectOwner.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/IWikiObjectOwner.cs index 0279dd1d9..1f8a83045 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/IWikiObjectOwner.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/IWikiObjectOwner.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Page.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Page.cs index 0a0e13b4f..373eacfb8 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Page.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/Page.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/PageDAO.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/PageDAO.cs index 8ed68bc47..dfb83d88e 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/PageDAO.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/PageDAO.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/PageNameUtil.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/PageNameUtil.cs index a6fcfebf1..ca9cf630f 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/PageNameUtil.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/PageNameUtil.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiEngine.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiEngine.cs index 934eda414..e97819595 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiEngine.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiEngine.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -564,7 +564,6 @@ private void NotifyPageCreated(Page page) SecurityContext.CurrentAccount.ID.ToString(), Constants.NewPage, null, - null, GetNotifyTags(page.PageName)); } @@ -574,7 +573,6 @@ private void NotifyPageEdited(Page page) SecurityContext.CurrentAccount.ID.ToString(), Constants.EditPage, PageNameUtil.ReplaceSpaces(page.PageName), - null, GetNotifyTags(page.PageName, "edit wiki page", null)); } @@ -584,7 +582,6 @@ private void NotifyCategoryAdded(string category, string page) SecurityContext.CurrentAccount.ID.ToString(), Constants.AddPageToCat, category, - null, GetCategoryNotifyTags(category, page)); } @@ -610,7 +607,7 @@ private void NotifyCommentCreated(Page page, Comment comment) if (mentionedUsers.Length > 0) { WikiNotifyClient.SendNoticeToAsync(authorID, Constants.MentionForWikiComment, objectID, mentionedUsers, tags); - } + } } private ITagValue[] GetNotifyTags(string pageName) diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiManager.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiManager.cs index 1f0e88b6f..3b5ad803e 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiManager.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiNotifySource.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiNotifySource.cs index 97da6e339..20e02acb5 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiNotifySource.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiNotifySource.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiStrExtentions.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiStrExtentions.cs index c05dabcf1..4e8f72836 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiStrExtentions.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiStrExtentions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * */ + namespace ASC.Web.UserControls.Wiki { public static class WikiStrExtentions diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiSubscriptionManager.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiSubscriptionManager.cs index 87e6906e8..3d12c4de9 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiSubscriptionManager.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Code/WikiSubscriptionManager.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,13 +37,13 @@ static WikiNotifyClient() NotifyClient = WorkContext.NotifyContext.NotifyService.RegisterClient(WikiNotifySource.Instance); } - public static void SendNoticeAsync(string AuthorID, INotifyAction action, string objectID, SendNoticeCallback sendCallback, params ITagValue[] args) + public static void SendNoticeAsync(string AuthorID, INotifyAction action, string objectID, params ITagValue[] args) { InitiatorInterceptor initatorInterceptor = new InitiatorInterceptor(new DirectRecipient(AuthorID, "")); try { NotifyClient.AddInterceptor(initatorInterceptor); - NotifyClient.SendNoticeAsync(action, objectID, sendCallback, args); + NotifyClient.SendNoticeAsync(action, objectID, args); } finally { diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/Constants.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/Constants.cs index 10c505a1c..0f3917739 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/Constants.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/Constants.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/Extentions.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/Extentions.cs index 87af89f29..8327737fe 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/Extentions.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/Extentions.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/PageDictionary.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/PageDictionary.cs index 706d9a284..02617da63 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/PageDictionary.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/PageDictionary.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiActivityPublisher.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiActivityPublisher.cs index 6c59f73c3..7ddd59a90 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiActivityPublisher.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiActivityPublisher.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiBasePage.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiBasePage.cs index 215286ccf..14cead29c 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiBasePage.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiBasePage.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiModuleSettings.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiModuleSettings.cs index 02a5a2160..5a7a9687a 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiModuleSettings.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiModuleSettings.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiObjectsSecurityObject.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiObjectsSecurityObject.cs index 72bb2ec1a..773c52ba6 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiObjectsSecurityObject.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiObjectsSecurityObject.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiSearchHandler.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiSearchHandler.cs index 71881a377..66c17abd3 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiSearchHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Common/WikiSearchHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -63,7 +63,7 @@ public override SearchResultItem[] Search(string text) public override ImageOptions Logo { - get { return new ImageOptions { ImageFileName = "wikilogo16.png", PartID = WikiManager.ModuleId }; } + get { return new ImageOptions { ImageFileName = "wikilogo16.svg", PartID = WikiManager.ModuleId }; } } public override string SearchName diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Default.aspx b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Default.aspx index 3017a1796..b2f36f35e 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Default.aspx +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Default.aspx @@ -16,7 +16,7 @@ <%@ Register TagPrefix="scl" Namespace="ASC.Web.Studio.UserControls.Common.Comments" Assembly="ASC.Web.Studio" %> - " + " rel="stylesheet" type="text/css" media="print" /> diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Default.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Default.aspx.cs index 4c9d56369..bab687035 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Default.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Default.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Diff.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Diff.aspx.cs index 2204e9475..983ac907d 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Diff.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Diff.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiFileHandler.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiFileHandler.cs index 0e01b1e39..a9b776022 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiFileHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiFileHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiPageHandler.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiPageHandler.cs index 1d2e41b46..2d1630ec4 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiPageHandler.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiPageHandler.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiSection.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiSection.cs index a5ccc7ca0..9ed70bb71 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiSection.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/Handlers/WikiSection.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/ListCategories.aspx.cs b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/ListCategories.aspx.cs index 8df7ee706..384e10d1f 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/ListCategories.aspx.cs +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/ListCategories.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -139,7 +139,7 @@ private void BindRepeater() { var emptyScreenControl = new EmptyScreenControl { - ImgSrc = WebImageSupplier.GetAbsoluteWebPath("wikilogo150.png", WikiManager.ModuleId), + ImgSrc = WebImageSupplier.GetAbsoluteWebPath("wikilogo150.svg", WikiManager.ModuleId), Header = WikiResource.EmptyScreenWikiCategoriesCaption, Describe = WikiResource.EmptyScreenWikiCategoriesText }; diff --git a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/ListFiles.aspx b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/ListFiles.aspx index 52b5c0b7d..92ab0ef74 100644 --- a/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/ListFiles.aspx +++ b/web/studio/ASC.Web.Studio/Products/Community/Modules/Wiki/ListFiles.aspx @@ -9,7 +9,7 @@ <%@ Register TagPrefix="sc" Namespace="ASC.Web.Studio.Controls.Common" Assembly="ASC.Web.Studio" %> - " + " rel="stylesheet" type="text/css" /> + + \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/ChunkUploadDialog.ascx.cs b/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/ChunkUploadDialog.ascx.cs index f8b0b3582..6530f671c 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/ChunkUploadDialog.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/ChunkUploadDialog.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploaddialog.css b/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploaddialog.less similarity index 70% rename from web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploaddialog.css rename to web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploaddialog.less index bb3e85e91..203f96bcb 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploaddialog.css +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploaddialog.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,143 +15,199 @@ */ +@import "../../App_Themes/default/params.less"; + #chunkUploadDialog .progress-dialog-header.menu-upload-icon { - background-image: url("../../../../skins/default/images/svg/crm/uploadblack.svg"); + background-image: url("../../../../skins/default/images/svg/crm/@{uploadsvg}"); background-position: 24px center; background-repeat: no-repeat; padding-left: 48px; -} -#chunkUploadDialog .settings-container { - line-height: 32px; -} -#chunkUploadDialog .files-container { - max-height: 240px; - margin-bottom: 8px; - overflow-y: auto; -} -.upload-info-container { - margin-top: 8px; - min-height: 8px; -} -#chunkUploadDialog .info-content { - margin-bottom: 8px; -} -.fu-width-icon { - width: 30px; -} -.fu-width-progress { - width: 110px; -} -.fu-width-action { - width: 90px; -} -body.wild-pink .upload-svg { - fill: #ffffff; -} -body.bright-blue .upload-svg { - fill: #ffffff; -} -.upload-svg { - fill: #50565c; - width: 16px; - height: 16px; - padding-top: 3px; -} -.fu-row .fu-action-cell { - text-align: center; - width: 80px; -} -.fu-row .fu-progress-cell { - text-align: center; - width: 100px; -} -.fu-row .fu-title-cell { - overflow: hidden; - text-overflow: ellipsis; +} +#chunkUploadDialog .settings-container { + line-height: 32px; + height: 32px; +} +#chunkUploadDialog .files-container { + max-height: 240px; + margin-bottom: 8px; + overflow-y: auto; + scrollbar-width: thin; +} +.upload-info-container { + margin-top: 8px; + min-height: 8px; +} +#chunkUploadDialog .info-content { + margin-bottom: 8px; +} +.fu-width-icon { + width: 30px; +} +.fu-width-progress { + width: 110px; +} +.fu-width-action { + width: 90px; +} +body.wild-pink .upload-svg { + fill: @body-color; +} +body.bright-blue .upload-svg { + fill: @body-color; +} +.upload-svg { + fill: @upload-svg; + width: 16px; + height: 16px; + padding-top: 3px; +} +.fu-row .fu-action-cell { + text-align: right; + width: 90px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.fu-row .fu-progress-cell { + text-align: center; + width: 100px; white-space: nowrap; - width: 190px; -} -.fu-row .fu-title-cell span { - cursor: default; -} -.fu-row.done .ftFile_21, -.fu-row.done .fu-title-cell span { - cursor: pointer; -} - -.fu-row progress, -.fu-row .asc-progress-wrapper, -.fu-row .progress-color-anim { - float: left; - width: 100px; -} -.fu-row .progress-color-anim { - height: 14px; - background: url("images/uploader_progress.gif") no-repeat scroll 0 0 #D1D1D1; -} -.fu-row .progress-label { - color: #FFFFFF; - float: left; - font-size: 10px; - margin-left: -100px; overflow: hidden; text-overflow: ellipsis; - white-space: nowrap; - width: 100px; -} -.fu-row.upload .share, -.fu-row.upload .upload-complete, -.fu-row.upload .upload-error, -.fu-row.upload .upload-canceled { - display: none; -} -.fu-row.done .abort-file-uploadig, -.fu-row.done progress, -.fu-row.done .asc-progress-wrapper, -.fu-row.done .progress-label, -.fu-row.done .progress-color-anim, -.fu-row.done .upload-error, -.fu-row.done .upload-canceled { - display: none; -} -.fu-row.error progress, -.fu-row.error .asc-progress-wrapper, -.fu-row.error .progress-label, -.fu-row.error .progress-color-anim, -.fu-row.error .upload-complete, -.fu-row.error .fu-action-cell, -.fu-row.error .upload-canceled { - display: none; -} -.fu-row.canceled progress, -.fu-row.canceled .asc-progress-wrapper, -.fu-row.canceled .progress-label, -.fu-row.canceled .progress-color-anim, -.fu-row.canceled .upload-complete, -.fu-row.canceled .fu-action-cell, -.fu-row.canceled .upload-error { - display: none; -} -.fu-row.convert .fu-action-cell, -.fu-row.convert .upload-complete, -.fu-row.convert .upload-error, -.fu-row.convert .upload-canceled { - display: none; -} - -.fu-row:hover .linkMedium { - text-decoration: underline; -} - -#abortUploadigBtn { - float: right; - margin-left: 5px; -} - -#uploadSettingsPanel ul.dropdown-content label { - white-space: nowrap; -} - -#uploadSettingsSwitcher { - cursor: pointer; -} +} +.fu-row .fu-title-cell { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 184px; +} +.fu-row .fu-title-cell span { + cursor: default; +} +.fu-row.done .ftFile_21, +.fu-row.done .fu-title-cell span { + cursor: pointer; +} + +.fu-row progress, +.fu-row .asc-progress-wrapper, +.fu-row .progress-color-anim { + float: left; + width: 100px; +} +.fu-row .progress-color-anim { + height: 14px; + background: url("images/uploader_progress.gif") no-repeat scroll 0 0 @border-color; +} +.fu-row .progress-label { + color: @body-color; + float: left; + font-size: 10px; + margin-left: -100px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100px; +} + +.fu-row.upload .share, +.fu-row.upload .enter-password, +.fu-row.upload .hide-enter-password, +.fu-row.upload .upload-complete, +.fu-row.upload .upload-error, +.fu-row.upload .upload-canceled { + display: none; +} +.fu-row.done .abort-file-uploadig, +.fu-row.done .enter-password, +.fu-row.done .hide-enter-password, +.fu-row.done progress, +.fu-row.done .asc-progress-wrapper, +.fu-row.done .progress-label, +.fu-row.done .progress-color-anim, +.fu-row.done .upload-error, +.fu-row.done .upload-canceled { + display: none; +} +.fu-row.error .abort-file-uploadig, +.fu-row.error .share, +.fu-row.error .hide-enter-password, +.fu-row.error progress, +.fu-row.error .asc-progress-wrapper, +.fu-row.error .progress-label, +.fu-row.error .progress-color-anim, +.fu-row.error .upload-complete, +.fu-row.error .upload-canceled { + display: none; +} +.fu-row.canceled progress, +.fu-row.canceled .asc-progress-wrapper, +.fu-row.canceled .progress-label, +.fu-row.canceled .progress-color-anim, +.fu-row.canceled .upload-complete, +.fu-row.canceled .fu-action-cell, +.fu-row.canceled .upload-error { + display: none; +} +.fu-row.convert .fu-action-cell, +.fu-row.convert .upload-complete, +.fu-row.convert .upload-error, +.fu-row.convert .upload-canceled { + display: none; +} + +.fu-row.error .enter-password, +.fu-row.error .hide-enter-password { + text-decoration: underline; + text-decoration-style: dotted; +} + +.fu-row:hover .linkMedium { + text-decoration: underline; +} + +#abortUploadigBtn { + float: right; + margin-left: 5px; +} + +#uploadSettingsPanel ul.dropdown-content label { + white-space: nowrap; +} + +#uploadSettingsSwitcher { + cursor: pointer; +} + +table.tableBase tbody tr.fu-password-row:hover { + background-color: @body-color; +} + +table.tableBase tbody tr.fu-password-row span:hover { + text-decoration: none; +} + +.convert-input-button { + display: flex; + margin-bottom: 4px; +} + +.convert-password-text, +.convert-password-error-invalid { + font-weight: 600; + margin-bottom: 4px; +} + +.convert-password-error-invalid { + display: none; +} + +.convert-password-input { + width: 100%; + height: 20px; + margin-right: 8px; +} + +.convert-button { + float: right; +} \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploadmanager.js b/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploadmanager.js index c604b45bc..bd3d0993e 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploadmanager.js +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/chunkuploadmanager.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -64,6 +64,10 @@ window.ASC.Files.ChunkUploads = (function () { ASC.Files.ServiceManager.bind(ASC.Files.ServiceManager.events.ChunkUploadGetFileFromServer, onGetFileFromServer); } + if (!ASC.Resources.Master.IsAuthenticated && !chunkUploader) { + return; + } + if (!dragDropEnabled(true)) { jq("#emptyContainer .emptyContainer_dragDrop").remove(); } @@ -88,6 +92,10 @@ window.ASC.Files.ChunkUploads = (function () { var getUploadSession = function (file) { var uploadUrl = jq.format("{0}files/{1}/upload/create_session.json", ASC.Resources.Master.ApiPath, file.fid); var initResponse = null; + + if (ASC.Files.Utility) { + uploadUrl = ASC.Files.Utility.AddExternalShareKey(uploadUrl); + } jq.ajax({ type: "POST", @@ -198,6 +206,10 @@ window.ASC.Files.ChunkUploads = (function () { var activateUploader = function () { changeQuotaText(); + if (!ASC.Resources.Master.IsAuthenticated && !jq("#buttonUpload").length) { + return; + } + if (!jq("#buttonUpload").hasClass("not-ready") && !jq("#buttonFolderUpload").hasClass("not-ready")) { return; } @@ -235,7 +247,10 @@ window.ASC.Files.ChunkUploads = (function () { ASC.Files.UI.displayInfoPanel(ASC.Files.FilesJSResource.InfoUploadedSuccess.format(successfullyUploadedFiles)); } - ASC.Files.ChunkUploads.initTenantQuota(); + if (ASC.Resources.Master.IsAuthenticated) { + ASC.Files.ChunkUploads.initTenantQuota(); + } + changeHeaderText(ASC.Files.FilesJSResource.UploadComplete); ASC.Files.ChunkUploads.uploaderBusy = false; jq("#abortUploadigBtn").hide(); @@ -291,7 +306,7 @@ window.ASC.Files.ChunkUploads = (function () { data.id = createNewGuid(); data.session = uploadSession; - if (checkFileConvert(file) && confirmConvert) { + if (checkFileConvert(file) && confirmConvert && ASC.Resources.Master.IsAuthenticated) { file.status = uploadStatus.WAITCONFIRM; ASC.Files.ConfrimConvert.showDialog(convertConfirmed, "ASC.Files.ChunkUploads.abortForWaitingConfirm();", true); @@ -390,7 +405,8 @@ window.ASC.Files.ChunkUploads = (function () { successfullyUploadedFiles++; var canConvert = checkFileConvert(file); - var showData = !canConvert || (canConvert && ASC.Files.Common.storeOriginal); + var storeOriginal = ASC.Resources.Master.IsAuthenticated ? ASC.Files.Common.storeOriginal : true; + var showData = !canConvert || (canConvert && storeOriginal); if (file.data.folderId != ASC.Files.Folders.currentFolder.id || ASC.Files.Filter && ASC.Files.Filter.getFilterSettings().isSet) { @@ -496,11 +512,73 @@ window.ASC.Files.ChunkUploads = (function () { if (!canDrop(dt)) { return true; } - ASC.Files.ChunkUploads.hideDragHighlight(); + + var items = dt.items; + if (items && items.length && (items[0].webkitGetAsEntry)) { + for (var i = 0; i < items.length; i++) { + getFolders(items[i]).then(createFolders); + } + } return false; }; + function getFolders(item) { + return new Promise((resolve, reject) => { + traverseFileTree(item.webkitGetAsEntry(), "") + .then(function (results) { + resolve(results); + }) + }); + } + + function createFolders(relativePaths) { + if (relativePaths && relativePaths.length) { + var folderId = ASC.Files.Folders.currentFolder.id; + + window.Teamlab.createFolders({}, folderId, relativePaths, { + success: function (params, data) { + var folderJsonData = { folder: data }; + var stringData = ASC.Files.Common.jsonToXml(folderJsonData); + var htmlXML = ASC.Files.TemplateManager.translateFromString(stringData); + + var folderNewObj = ASC.Files.UI.getEntryObject("folder", "0"); + var folderObj = ASC.Files.EventHandler.insertFolderItems(htmlXML, folderNewObj); + + folderObj.yellowFade().removeClass("new-folder"); + + if (ASC.Files.Tree) { + ASC.Files.Tree.reloadFolder(folderId); + } + + var folderTitle = ASC.Files.UI.getObjectData(folderObj).title; + ASC.Files.UI.displayInfoPanel(ASC.Files.FilesJSResource.InfoCrateFolder.format(folderTitle)); + }, + processUrl: function (url) { + return ASC.Files.Utility.AddExternalShareKey(url); + } + }); + } + } + + var readEntriesPromise = function () { + return new Promise((resolve, reject) => this.readEntries(resolve, reject)); + }; + + function traverseFileTree(item, path) { + path = path || ""; + if (item.isDirectory) { + var dirReader = item.createReader(); + dirReader.readEntriesPromise = readEntriesPromise; + return dirReader.readEntriesPromise() + .then(entries => entries.filter(entry => entry.isDirectory)) + .then(dirs => Promise.all(dirs.map(entry => traverseFileTree(entry, path + item.name + "/")))) + .then(result => [].concat.apply([path + item.name], result)); + } else { + return Promise.resolve([]); + } + } + var correctFile = function (file, folderId) { var posExt = ASC.Files.Utility.GetFileExtension(file.name); var errorMessage; @@ -738,6 +816,13 @@ window.ASC.Files.ChunkUploads = (function () { .addClass("canceled"); }; + var showEnterPassword = function (fileId) { + jq("#" + fileId).find(".enter-password").show(); + }; + + var hideEnterPassword = function (fileId) { + jq("#" + fileId).find(".enter-password").hide(); + }; //change uploader dialog info text var changeHeaderText = function (text, session) { @@ -1010,6 +1095,7 @@ window.ASC.Files.ChunkUploads = (function () { var removeUploadItem = function (uploadId) { jq("#" + uploadId).remove(); + jq("#passwordContent_" + uploadId).remove(); var dialog = jq("#chunkUploadDialog"); if (!dialog.find("#uploadFilesTable tr").length) { @@ -1058,12 +1144,13 @@ window.ASC.Files.ChunkUploads = (function () { return ASC.Files.Utility.MustConvert(fileData.name); }; - var addFileToConvertQueue = function (id, version) { + var addFileToConvertQueue = function (id, version, password = "") { ASC.Files.Marker.removeNewIcon("file", id); ASC.Files.ChunkUploads.convertQueue.push({ id: id, version: version, + password: password, needToRun: true }); }; @@ -1096,7 +1183,7 @@ window.ASC.Files.ChunkUploads = (function () { jq.each(ASC.Files.ChunkUploads.convertQueue, function (index, item) { data.entry.push({ - entry: [item.id, item.version, item.needToRun === true] + entry: [item.id, item.version, item.needToRun === true, item.password] }); }); @@ -1130,9 +1217,12 @@ window.ASC.Files.ChunkUploads = (function () { return; } + var currentInLineEl = null; + for (var i = 0; i < obj.length; i++) { var source = JSON.parse(obj[i].source); var file = getFileDataById(source.id, source.version); + currentInLineEl = currentInLine(source.id); changeConvertQueueItemStatus(source.id, source.version); @@ -1143,6 +1233,18 @@ window.ASC.Files.ChunkUploads = (function () { if (file) { showFileUploadingError(file.id, error); showFileData(file.data.id); + + if (currentInLineEl.password && currentInLineEl.password.length > 0) { + showErrorInvalidPassword(file.id); + } + else { + if (obj[i].result == "password") { + showEnterPassword(file.id); + } + else { + hideEnterPassword(file.id); + } + } } } else { var percent = obj[i].progress || 0; @@ -1159,13 +1261,16 @@ window.ASC.Files.ChunkUploads = (function () { correctFolderCount(file.fid); } else if (!ASC.Files.UI.isSettingsPanel()) { var stringXmlFile = convertResult.fileXml; - writeFileRow(ASC.Files.Common.storeOriginal ? convertResult.id : file.data.id, stringXmlFile, true); + var storeOriginal = ASC.Resources.Master.IsAuthenticated ? ASC.Files.Common.storeOriginal : true; + writeFileRow(storeOriginal ? convertResult.id : file.data.id, stringXmlFile, true); } showFileData(source.id); percent = 100; isDone = true; + hidePasswordContent(file.id); + removeFileFromConvertQueue(source.id, source.version); } @@ -1182,11 +1287,21 @@ window.ASC.Files.ChunkUploads = (function () { if (ASC.Files.ChunkUploads.convertQueue.length == 0) { ASC.Files.ChunkUploads.converterBusy = false; clearTimeout(convertTimeout); - } else { + } else + { convertTimeout = setTimeout(checkConvertStatus, ASC.Files.Constants.REQUEST_CONVERT_DELAY); } }; + var currentInLine = function (id) { + + if (ASC.Files.ChunkUploads.convertQueue.length == 0) return; + + var currentFile = ASC.Files.ChunkUploads.convertQueue.find(x => x.id == id); + + return currentFile; + } + var correctFolderCount = function (folderId) { var folderToObj = ASC.Files.UI.getEntryObject("folder", folderId); @@ -1281,6 +1396,76 @@ window.ASC.Files.ChunkUploads = (function () { } }; + var enterPasswordInFile = function (obj) { + var row = jq(obj).closest(".fu-row"); + var id = row.attr("id"); + var file = { id }; + + var $newRow = jq("#filePasswordRowTmpl").tmpl(file); + var $exstRow = jq("#passwordContent_" + id); + + if ($exstRow.length != 0) { + $exstRow.remove(); + + jq("#" + file.id).find(".hide-enter-password").hide(); + showEnterPassword(id); + } else { + jq($newRow).insertAfter("#uploadFilesTable tbody #" + id); + jq("#uploadFilesTable").parent().scrollTo("#passwordContent_" + id); + + hideEnterPassword(id); + jq("#" + id).find(".hide-enter-password").show(); + jq("#passwordContent_" + id).find(".convert-input-button span").addClass("disable"); + } + }; + + var checkConversionWithPassword = function (obj) { + var row = jq(obj).closest(".fu-password-row"); + + var password = row.find('.convert-password-input').val(); + if (!password) return; + + var rowId = row.attr("id"); + var rowFileId = rowId.split('_').pop(); + var fileRow = jq('#' + rowFileId); + + var fileId = ASC.Files.ChunkUploads.uploadQueue.find(x => x.files[0].id == rowFileId).files[0].data.id; + disableInputPasswordAndButton(row); + + var version = 1; + addFileToConvertQueue(fileId, version, password); + fileRow.removeClass("error"); + fileRow.addClass("convert"); + + if (!ASC.Files.ChunkUploads.converterBusy) { + ASC.Files.ChunkUploads.converterBusy = true; + checkConvertStatus(); + } + }; + + var hidePasswordContent = function (fileId) { + jq("#passwordContent_" + fileId).remove(); + jq("#" + fileId).find(".hide-enter-password").hide(); + hideEnterPassword(fileId); + }; + + var disableInputPasswordAndButton = function (row) { + row.find('.convert-password-input').prop("disabled", true); + row.find(".convert-input-button span").addClass("disable"); + }; + + var enableInputPassword = function (row) { + row.find('.convert-password-input').prop("disabled", false); + }; + + var showErrorInvalidPassword = function (fileId) { + var passwordContent = jq("#passwordContent_" + fileId); + passwordContent.find(".convert-password-text").hide(); + passwordContent.find(".convert-password-error-invalid").show(); + passwordContent.find(".convert-password-input").val(""); + enableInputPassword(passwordContent); + }; + return { uploadQueue: uploadQueue, uploaderBusy: uploaderBusy, @@ -1300,6 +1485,9 @@ window.ASC.Files.ChunkUploads = (function () { shareUploadedFile: shareUploadedFile, showUploadingErrorText: showUploadingErrorText, + enterPasswordInFile: enterPasswordInFile, + checkConversionWithPassword: checkConversionWithPassword, + disableBrowseButton: disableBrowseButton, closeUploadDialod: closeUploadDialod, @@ -1358,6 +1546,27 @@ window.ASC.Files.ChunkUploads = (function () { ASC.Files.ChunkUploads.showUploadingErrorText(this); }); + jq("#chunkUploadDialog").on("click", ".fu-row.error .enter-password", function () { + ASC.Files.ChunkUploads.enterPasswordInFile(this); + }); + + jq("#chunkUploadDialog").on("click", ".fu-row.error .hide-enter-password", function () { + ASC.Files.ChunkUploads.enterPasswordInFile(this); + }); + + jq("#chunkUploadDialog").on("keyup", ".fu-password-row .convert-password-input", function () { + if (this.value.length > 0) { + jq(this.parentElement).find("span").removeClass("disable"); + } + else { + jq(this.parentElement).find("span").addClass("disable"); + } + }); + + jq("#chunkUploadDialog").on("click", ".fu-password-row .convert-input-button span", function () { + ASC.Files.ChunkUploads.checkConversionWithPassword(this); + }); + jq.dropdownToggle({ switcherSelector: "#uploadSettingsSwitcher", dropdownID: "uploadSettingsPanel", diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/dark-chunkuploaddialog.less b/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/dark-chunkuploaddialog.less new file mode 100644 index 000000000..48e72d6d1 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ChunkUploadDialog/dark-chunkuploaddialog.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "chunkuploaddialog.less"; +@import "../../App_Themes/dark-default/params.less"; diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/ContentList.ascx.cs b/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/ContentList.ascx.cs index 9f11202b3..cd79a6366 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/ContentList.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/ContentList.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/contentlist.css b/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/contentlist.less similarity index 92% rename from web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/contentlist.css rename to web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/contentlist.less index 9c9447acc..0b104641d 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/contentlist.css +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/contentlist.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,272 +15,279 @@ */ -#pageNavigatorHolder { - display: none; - padding-top: 20px; - text-align: center; -} - -/************************************************************* - BreadCrumbs -*************************************************************/ -#filesBreadCrumbs { - border-top: 1px solid #D1D1D1; - display: none; - height: 33px; -} -.to-parent-folder { - display: inline-block; - cursor: pointer; - margin: 0 4px 0 0; - outline: none; - padding-left: 6px; - width: 70px; -} -.to-parent-folder .up { - line-height: 32px; - text-decoration: none; -} -.to-parent-folder .link-blank, -.with-search-crumbs .to-parent-folder .link-dots { - display: none; -} -#searchBreadCrumbs { - cursor: pointer; -} -.search-bread-crumbs { - display: none; - line-height: 32px; - max-width: 400px; - overflow: hidden; - text-overflow: ellipsis; - vertical-align: bottom; - white-space: nowrap; -} -.with-search-crumbs .to-parent-folder { - width: 22px; -} -.with-search-crumbs .search-bread-crumbs { - display: inline-block; -} -.with-search-crumbs .to-parent-folder .link-blank { - display: inline-block; -} -/************************************************************* - Main Content -*************************************************************/ -.contentMenu { - border-bottom: none; - margin-bottom: 0; -} -#mainContent { - /*min-height: 450px;*/ - min-width: 660px; - overflow: hidden; - border: 1px solid transparent; -} -#mainContent.selected { - border: 1px dashed #bbb; -} -#filesMainContent { - display: none; - margin: 0; - padding: 0; -} -.file-row { - border-bottom: 1px solid #d1d1d1; - height: 36px; - list-style: none outside none; - padding: 6px 0 5px; - z-index: 98; -} -.file-row:first-of-type { - border-top: 1px solid #d1d1d1; -} -.file-row div { - float: left; -} -.file-row, -.file-row a, -.file-row span, -.file-row div, -.file-row input { - outline: none; -} -.row-selected { - background-color: #f2f2f2; -} -.row-hover:not(.row-rename):hover { - background-color: #e5e5e5; -} -.file-row .thumb-file, -.file-row .thumb-folder { - cursor: pointer; - margin: 2px 16px 0 0; - position: relative; -} -.file-row .thumb-img { - display: none; +@import "../../App_Themes/default/params.less"; + +#pageNavigatorHolder { + display: none; + padding-top: 20px; + text-align: center; +} + +/************************************************************* + BreadCrumbs +*************************************************************/ +#filesBreadCrumbs { + border-top: 1px solid @border-color; + display: none; + height: 33px; +} +.to-parent-folder { + display: inline-block; + cursor: pointer; + margin: 0 4px 0 0; + outline: none; + padding-left: 6px; + width: 70px; +} +.to-parent-folder .up { + line-height: 32px; + text-decoration: none; +} +.to-parent-folder .link-blank, +.with-search-crumbs .to-parent-folder .link-dots { + display: none; +} +#searchBreadCrumbs { + cursor: pointer; +} +.search-bread-crumbs { + display: none; + line-height: 32px; + max-width: 400px; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: bottom; + white-space: nowrap; +} +.with-search-crumbs .to-parent-folder { + width: 22px; +} +.with-search-crumbs .search-bread-crumbs { + display: inline-block; +} +.with-search-crumbs .to-parent-folder .link-blank { + display: inline-block; +} +/************************************************************* + Main Content +*************************************************************/ +.contentMenu { + border-bottom: none; + margin-bottom: 0; +} +#mainContent { + /*min-height: 450px;*/ + min-width: 660px; + overflow: hidden; + border: 1px solid transparent; +} +#mainContent.selected { + border: 1px dashed #bbb; +} +#filesMainContent { + display: none; + margin: 0; + padding: 0; +} +.file-row { + border-bottom: 1px solid @border-color; + height: 36px; + list-style: none outside none; + padding: 6px 0 5px; + z-index: 98; +} +.file-row:first-of-type { + border-top: 1px solid @border-color; +} +.file-row div { + float: left; +} +.file-row, +.file-row a, +.file-row span, +.file-row div, +.file-row input { + outline: none; +} +.row-selected { + background-color: @body-color-selected; +} +.row-hover:not(.row-rename):hover { + background-color: @body-color-hover-another; +} +.file-row .thumb-file, +.file-row .thumb-folder { + cursor: pointer; + margin: 2px 16px 0 0; + position: relative; +} +.file-row .thumb-img { + display: none; } .thumb-encrypted { - background: url("images/encrypted.png") no-repeat 0 0 / 16px 16px transparent; + background-image: url("images/encrypted.png"); + background-repeat: no-repeat; + background-position: 0 0; + background-size: 16px 16px; + background-color: transparent; bottom: -1px; height: 16px; position: absolute; right: -1px; width: 16px; -} -.file-row .checkbox { - cursor: pointer; - height: 19px; - margin-top: -6px; - margin-right: 4px; - padding: 14px 0 14px 4px; - width: 25px; -} -.file-row .checkbox:hover { - background-color: rgba(0, 0, 0, .05); +} +.file-row .checkbox { + cursor: pointer; + height: 19px; + margin-top: -6px; + margin-right: 4px; + padding: 14px 0 14px 4px; + width: 25px; +} +.file-row .checkbox:hover { + background-color: rgba(0, 0, 0, .05); } .file-row.checkloading .checkbox { - background: url("images/throbber.gif") no-repeat 7px 16px transparent; -} - -.file-row.new-folder .checkbox, -.file-row.new-file .checkbox, -.file-row.row-rename .checkbox, -.file-row.new-folder .menu-small, -.file-row.new-file .menu-small, -.file-row.row-rename .menu-small, -.file-row.checkloading.new-folder .checkbox, -.file-row.checkloading.new-file .checkbox, -.file-row.checkloading.row-rename .checkbox, -.file-row.checkloading .checkbox input, -.file-row.checkloading .menu-small, -.file-row.checkloading .btn-row, -.file-row.checkloading .template-action, -.file-row.checkloading .file-lock, -.file-row.checkloading .favorite, -.file-row.checkloading .pencil { - visibility: hidden; -} -.file-row.checkloading.new-folder .entry-title, -.file-row.checkloading.new-file .entry-title, -.file-row.checkloading.row-rename .entry-title { - margin: 6px 0 8px; -} - -.file-row .checkbox input { - cursor: pointer; -} -.file-row .checkbox input[type=radio] { - display: none; -} -* + html .file-row .checkbox input { - padding: 0; - margin: -1px 0 0 0; -} -.file-row .entry-title { - float: none; - z-index: 90; - color: #333; - white-space: nowrap; - overflow: hidden; -} -.file-row .entry-title, -.file-row .entry-descr { - width: 390px; -} -.file-row.row-rename .entry-title, -#filesMainContent.compact .file-row.row-rename .entry-title, -.file-row.row-rename .entry-descr { - width: 290px; -} - -.file-row .entry-title .name { - margin-top: -2px; - max-width: 206px; - overflow: hidden; - position: relative; - text-overflow: ellipsis; - white-space: nowrap; -} -.file-row.folder-row .entry-title .name { - max-width: 332px; -} -.file-row.row-rename .entry-title .name, -.file-row.folder-row.row-rename .entry-title .name -{ - max-width: 280px; -} -.file-row .entry-title .name a { - cursor: pointer; - color: #333; - font-size: 16px; - font-weight: 600; - text-decoration: none; - line-height: 22px; - outline: none; - white-space: pre; -} -.file-row .entry-title .name a .file-extension { - color: #A2A2A2; - display: inline; - font-size: 14px; - font-weight: normal; - line-height: 19px; -} -.file-row.row-hover:hover .entry-title .name a { - text-decoration: underline; -} -.trashFiles .file-row.row-hover:hover .entry-title .name a { - text-decoration: none; -} -.input-rename { - color: #333; - cursor: text; - font-size: 14px; - font-weight: bold; - height: 18px; - margin-top: 5px; - padding: 4px 12px; - width: 254px; - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; -} -.row-rename div.entry-info { - width: 300px; -} -.rename-action { - margin-top: 7px; -} -.rename-action > div:first-child { - margin-right: 8px; -} - -.row-rename .entry-title .name a, -.row-rename .entry-descr, -.row-rename .template-action, -.row-rename .pencil, -.row-rename .favorite, -.row-rename .version, -.row-rename .is-new, -.row-rename .btn-row, -.row-rename .entry-descr-compact, -.row-rename .file-lock, -.file-row.new-folder .entry-descr, -.file-row.new-file .entry-descr, -.file-row.new-file .template-action, -.file-row.new-file .pencil, -.file-row.new-file .favorite, -.file-row.new-file .btn-row, -.file-row.new-file .file-lock { - display: none !important; + background: url("images/@{file-row-checkloading-bg}") no-repeat 7px 16px transparent; +} + +.file-row.new-folder .checkbox, +.file-row.new-file .checkbox, +.file-row.row-rename .checkbox, +.file-row.new-folder .menu-small, +.file-row.new-file .menu-small, +.file-row.row-rename .menu-small, +.file-row.checkloading.new-folder .checkbox, +.file-row.checkloading.new-file .checkbox, +.file-row.checkloading.row-rename .checkbox, +.file-row.checkloading .checkbox input, +.file-row.checkloading .menu-small, +.file-row.checkloading .btn-row, +.file-row.checkloading .template-action, +.file-row.checkloading .file-lock, +.file-row.checkloading .favorite, +.file-row.checkloading .pencil { + visibility: hidden; +} +.file-row.checkloading.new-folder .entry-title, +.file-row.checkloading.new-file .entry-title, +.file-row.checkloading.row-rename .entry-title { + margin: 6px 0 8px; +} + +.file-row .checkbox input { + cursor: pointer; +} +.file-row .checkbox input[type=radio] { + display: none; +} +* + html .file-row .checkbox input { + padding: 0; + margin: -1px 0 0 0; +} +.file-row .entry-title { + float: none; + z-index: 90; + color: @text-color; + white-space: nowrap; + overflow: hidden; +} +.file-row .entry-title, +.file-row .entry-descr { + width: 390px; +} +.file-row.row-rename .entry-title, +#filesMainContent.compact .file-row.row-rename .entry-title, +.file-row.row-rename .entry-descr { + width: 290px; +} + +.file-row .entry-title .name { + margin-top: -2px; + max-width: 206px; + overflow: hidden; + position: relative; + text-overflow: ellipsis; + white-space: nowrap; +} +.file-row.folder-row .entry-title .name { + max-width: 332px; +} +.file-row.row-rename .entry-title .name, +.file-row.folder-row.row-rename .entry-title .name +{ + max-width: 280px; +} +.file-row .entry-title .name a { + cursor: pointer; + color: @text-color; + font-size: 16px; + font-weight: 600; + text-decoration: none; + line-height: 22px; + outline: none; + white-space: pre; +} +.file-row .entry-title .name a .file-extension { + color: #A2A2A2; + display: inline; + font-size: 14px; + font-weight: normal; + line-height: 19px; +} +.file-row.row-hover:hover .entry-title .name a { + text-decoration: underline; +} +.trashFiles .file-row.row-hover:hover .entry-title .name a { + text-decoration: none; +} +.input-rename { + color: @text-color; + cursor: text; + font-size: 14px; + font-weight: bold; + height: 18px; + margin-top: 5px; + padding: 4px 12px; + width: 254px; + border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + background: transparent; +} +.row-rename div.entry-info { + width: 300px; +} +.rename-action { + margin-top: 7px; +} +.rename-action > div:first-child { + margin-right: 8px; +} + +.row-rename .entry-title .name a, +.row-rename .entry-descr, +.row-rename .template-action, +.row-rename .pencil, +.row-rename .favorite, +.row-rename .version, +.row-rename .is-new, +.row-rename .btn-row, +.row-rename .entry-descr-compact, +.row-rename .file-lock, +.file-row.new-folder .entry-descr, +.file-row.new-file .entry-descr, +.file-row.new-file .template-action, +.file-row.new-file .pencil, +.file-row.new-file .favorite, +.file-row.new-file .btn-row, +.file-row.new-file .file-lock { + display: none !important; } .file-row .version { - background-color: #e6e6e6; - color: #83888d; + background-color: @file-row-version-bg; + color: @file-row-version-col; cursor: pointer; font-size: 10px; padding: 2px 5px; @@ -292,897 +299,903 @@ -webkit-border-radius: 2px; } .row-hover:hover .version { - background-color: #d9d9d9; -} -.file-row .entry-descr, -.file-row .entry-descr-compact { - color: #787878; - font-size: 10px; - cursor: default; - float: none; - z-index: 90; - overflow: hidden; - white-space: nowrap; -} -.file-row .entry-descr .create-by, -.file-row .entry-descr-compact { - display: inline-block; - max-width: 280px; - overflow: hidden; - vertical-align: bottom; -} -.file-row .entry-descr-compact { - display: none; - float: right; - font-size: 12px; - margin-left: 8px; - margin-top: 7px; - text-overflow: ellipsis; - text-align: right; - width: 140px; -} -.file-row.cannot-edit .entry-descr .create-by { - max-width: 405px; -} -.title-removed, -.folder-row .modified-date { - display: none; -} -.file-editing { - display: none; -} -.file-row.on-edit .file-edit { - display: none !important; -} - -.file-row.on-edit .file-editing { - cursor: default; - display: block; -} -.file-row.on-edit.can-coauthoring .file-editing { - cursor: pointer; -} -.menu-small { - margin: 8px 10px 0 16px; -} - -.file-row .pencil { - float: left; - margin: 2px 0 0 8px; -} -.pencil.convert-action, -.pencil.fillform-action { - display: none; -} -.row-hover:hover .pencil, -.file-row .pencil.file-editing { - background: url('../../../../skins/default/images/svg/documents/pencilblue.svg'); -} -.row-hover:hover .pencil.convert-action { - background: url('../../../../skins/default/images/svg/documents/rotateblue.svg'); -} -.on-edit .pencil.fillform-action, -.row-hover:hover .pencil.fillform-action { - background: url('../../../../skins/default/images/svg/documents/fillformsblue.svg'); -} -.file-row.can-coauthoring .pencil.file-editing { - background: url('../../../../skins/default/images/svg/documents/pencil_add.svg'); -} -.is-template .pencil, -.template-action { - display: none; -} -.is-template .template-action { - display: block; - float: left; - margin: 2px 0 0 8px; -} -.row-hover:hover .template-action { - background: url('../../../../skins/default/images/svg/documents/templateblue.svg'); -} -.file-lock { - display: none; - margin: 2px 0 0 8px; -} -.file-row.file-locked .file-lock { - display: block; -} -.file-row.file-locked-by .file-lock { - cursor: default; -} -.file-row.file-locked-by.file-can-unlock .file-lock { - cursor: pointer; -} -.file-row.file-locked-by .pencil { - display: none; -} -.file-row .favorite { - display: none; - margin-left: 8px; -} -.file-row.on-favorite .favorite { - display: block; -} - -li.without-share .btn-row { - visibility: hidden; -} -ul.without-share li:not(.can-share) .btn-row { - display: none; -} -.file-row .btn-row { - margin: 5px 0 0 8px; - max-width: 83px; - overflow: hidden; - white-space: nowrap; -} -.compact .file-row .btn-row { - margin-top: 1px; -} -.file-row .menu-small, -.file-row .btn-row { - float: right; -} -.corporateFiles .__share, -.btn-row.__lock { - display: none; -} -.corporateFiles .__lock { - display: inline-block; -} -/******************************************************************************* - compact view -*******************************************************************************/ -#filesMainContent.compact .file-row.checkloading .checkbox { - background-position-y: 7px; -} -#filesMainContent.compact .file-row { - height: 28px; - padding: 2px 0 1px; -} -#filesMainContent.compact .thumb-encrypted { - bottom: -5px; - right: -5px; -} -#filesMainContent.compact .checkbox { - margin-top: -2px; - padding-bottom: 6px; - padding-top: 6px; -} -#filesMainContent.compact .file-row .entry-title .name { - max-width: 74px; - padding-top: 7px; -} -#filesMainContent.compact .file-row.folder-row .entry-title .name { - max-width: 200px; -} -#filesMainContent.compact .file-row.row-rename .entry-title .name { - max-width: 280px; -} -#filesMainContent.compact .file-row .entry-title { - margin: 0; - float: left; - width: 258px; -} -#filesMainContent.compact .file-row .entry-descr-compact { - display: block; -} -#filesMainContent.compact .file-row .entry-descr { - display: none -} -#filesMainContent.compact .file-row .entry-title .name a { - font-size: 12px; - line-height: 17px; -} -#filesMainContent.compact .file-row .entry-title .name a .file-extension { - font-size: 11px; - line-height: 15px; -} -#filesMainContent.compact .thumb-file -#filesMainContent.compact .thumb-folder { - margin-top: 3px; -} -#filesMainContent.compact .input-rename { - font-size: 12px; - height: 16px; - margin-top: -5px; -} -#filesMainContent.compact .rename-action { - margin-top: 2px; -} -#filesMainContent.compact .pencil, -#filesMainContent.compact .template-action, -#filesMainContent.compact .file-lock { - margin-top: 6px; -} -#filesMainContent.compact .menu-small { - margin-top: 4px; -} -#filesMainContent.compact #contentVersions { - margin: 1px 0 0; -} -#filesMainContent.compact .favorite, -#filesMainContent.compact .file-row .version, -#filesMainContent.compact .file-row .is-new { - margin-top: 4px; -} -#filesMainContent .file-row.file-row-fix, -#filesMainContent.compact .file-row.file-row-fix { - height: auto; - padding-bottom: 0; -} -.file-row-fix:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; -} -/******************************************************************************* - thumbnails view -*******************************************************************************/ -#filesMainContent.thumbnails { - margin-top: 14px; -} - -#filesMainContent .folders-separator, -#filesMainContent .files-separator { - display: none; -} - -#filesMainContent.thumbnails .folders-separator, -#filesMainContent.thumbnails .files-separator { - display: block; -} - -#filesMainContent.thumbnails .row-selected .checkbox, -#filesMainContent.thumbnails .file-row.checkloading .checkbox, -#filesMainContent.thumbnails .file-row:hover .checkbox { - display: block; -} - -#filesMainContent.thumbnails .row-selected .thumb-file, -#filesMainContent.thumbnails .row-selected .thumb-folder, -#filesMainContent.thumbnails .file-row.checkloading .thumb-file, -#filesMainContent.thumbnails .file-row.checkloading .thumb-folder, -#filesMainContent.thumbnails .file-row:hover .thumb-file, -#filesMainContent.thumbnails .file-row:hover .thumb-folder { - display: none; -} - -#filesMainContent.thumbnails .thumb-encrypted { - display: none; -} - -#filesMainContent.thumbnails .file-row { - position: relative; - box-sizing: border-box; - border-radius: 3px; - border: 1px solid #d1d1d1; - display: inline-block; - padding: 0; - height: 204px; - width: 204px; - margin: 0 20px 20px 0; -} - -#filesMainContent.thumbnails .file-row.min { - height: 48px; -} - -#filesMainContent.thumbnails .file-row.row-hover:not(.row-rename):hover { - background: linear-gradient(to bottom, #e5e5e5 156px, #f2f2f2 48px) !important; -} - -#filesMainContent.thumbnails .file-row.min.row-hover:not(.row-rename):hover { - background: #f2f2f2 !important; -} - -#filesMainContent.thumbnails .file-row.row-selected { - border-color: #0075ff; - background: linear-gradient(to bottom, #e5e5e5 156px, #ffffff 48px); -} - -#filesMainContent.thumbnails .file-row.min.row-selected { - background: #ffffff; -} - -#filesMainContent.thumbnails .file-row.display-versions { - border-color: #0075ff; -} - -#filesMainContent.thumbnails .file-row.row-selected .version { - background-color: #d9d9d9; -} - -#filesMainContent.thumbnails .checkbox { - display: none; - position: absolute; - left: 0; - bottom: 0; - padding: 17px 11px 17px 15px; - margin: 0; - height: 14px; - width: 14px; -} - -#filesMainContent.thumbnails .checkbox:hover { - background-color: transparent; -} - -#filesMainContent.thumbnails .checkbox input { - margin: 1px 1px 0 0; - padding: 0; -} - -#filesMainContent.thumbnails .entry-info { - position: absolute; - top: 0; - left: 0; - width: 204px; -} - -#filesMainContent.thumbnails .file-row .entry-title { - margin: 0px; - width: 204px; - height: 28px; - padding: 4px 8px 0 0; - box-sizing: border-box; - display: flex; - align-items: flex-start; -} - -#filesMainContent.thumbnails .file-row.min .entry-title { - height: 0; - padding: 0; -} - -#filesMainContent.thumbnails .entry-info .name { - height: 36px; - width: 128px; - max-width: 128px; - position: absolute; - top: 162px; - left: 40px; - display: flex; - align-items: center; -} - -#filesMainContent.thumbnails .file-row.min .entry-info .name { - top: 6px; - cursor: pointer; -} - -#filesMainContent.thumbnails .file-row .entry-descr-compact { - display: none; -} - -#filesMainContent.thumbnails .file-row .entry-descr { - display: none; -} - -#filesMainContent.thumbnails .file-row .entry-title .name a { - font-style: normal; - font-weight: 600; - font-size: 12px; - line-height: 16px; - white-space: normal; - overflow: hidden; - text-overflow: ellipsis; - max-height: 36px; -} - -#filesMainContent.thumbnails .file-row .entry-title .name a .file-extension { - font-style: normal; - font-weight: 600; - font-size: 12px; - line-height: 18px; -} - -#filesMainContent.thumbnails .thumb-file, -#filesMainContent.thumbnails .thumb-folder { - height: 24px; - margin: 12px 6px 12px 10px; - width: 24px; - bottom: 0; - left: 0; - padding: 0; - position: absolute; -} - -#filesMainContent.thumbnails .thumb-file { - background-position: 0px -38px; -} - -#filesMainContent.thumbnails .thumb-folder { - background-size: 24px; -} - -#filesMainContent.thumbnails .thumb-img { - display: flex; - justify-content: center; - align-items: center; - margin: 28px 5px 46px; - padding: 0; - width: 192px; - height: 128px; - text-align: center; - cursor: pointer; -} - -#filesMainContent.thumbnails .thumb-img img { - max-width: 192px; - max-height: 128px; - border-radius: 2px; - user-select: none; - pointer-events: none; -} - -#filesMainContent.thumbnails .file-row.min .thumb-img, -#filesMainContent.thumbnails .file-row.min .version, -#filesMainContent.thumbnails .file-row.min .pencil, -#filesMainContent.thumbnails .file-row.min .file-lock, -#filesMainContent.thumbnails .file-row.min .template-action { - display: none !important; -} - -#filesMainContent.thumbnails .file-row.min.on-favorite:not(.row-rename) .entry-info .name { - width: 104px; - max-width: 104px; -} - -#filesMainContent.thumbnails .file-row.min.on-favorite:not(.row-rename) .favorite { - position: absolute; - right: 38px; - top: 14px; -} - -#filesMainContent.thumbnails .file-row.min .new-label-menu { - position: absolute; - right: 4px; - top: 2px; - border-radius: 8px; - padding: 2px 2px; - width: 2px; - height: 2px; - font-size: 0; -} - -#filesMainContent.thumbnails .file-row.min.row-hover .new-label-menu, -#filesMainContent.thumbnails .file-row.min.row-selected .new-label-menu { - position: absolute; - right: -6px; - top: -8px; - border-radius: 8px; - padding: 1px 5px; - width: auto; - height: auto; - font-size: 10px; - transition-property: all; - transition-duration: 0.2s; - transition-timing-function: linear; -} - -#filesMainContent.thumbnails .file-row.row-rename .thumb-file, -#filesMainContent.thumbnails .file-row.row-rename .thumb-folder { - display: none; -} - -#filesMainContent.thumbnails .file-row.row-rename .entry-info .name { - left: 10px; - top: 166px; - width: 120px; - height: 28px; -} - -#filesMainContent.thumbnails .file-row.min.row-rename .entry-info .name { - top: 10px; -} - -#filesMainContent.thumbnails .input-rename { - font-style: normal; - font-weight: 600; - font-size: 12px; - line-height: 18px; - height: 18px; - width: 94px; - margin: 0; -} - -#filesMainContent.thumbnails .rename-action { - position: absolute; - bottom: 12px; - right: 10px; - margin: 0; -} - -#filesMainContent.thumbnails .rename-action > div:first-child { - margin-right: 4px; -} - -#filesMainContent.thumbnails .file-row .btn-row { - display: none -} - -#filesMainContent.thumbnails .menu-small { - bottom: 14px; - right: 10px; - position: absolute; - margin: 0; -} - -#filesMainContent.thumbnails .file-row .version, -#filesMainContent.thumbnails .folder-row .new-label-menu { - margin-left: auto; -} - -#filesMainContent.thumbnails .row-selected .checkbox { - display: block; -} - -#filesMainContent.thumbnails #contentVersions { - border: 1px solid #d1d1d1; - width: auto; - margin: 0 20px 20px 0; - padding: 10px 20px 10px 30px; - border-radius: 3px; -} - -#filesMainContent.thumbnails #contentVersions table { - padding: 0; -} - -#filesMainContent.thumbnails #contentVersions table thead tr.versions-title th { - padding-top: 0; -} - -#filesMainContent.thumbnails #contentVersions .rename-action { - position: static; -} - -/******************************************************************************* - Error in content -*******************************************************************************/ -.file-row.error-entry { - background-color: #FFECE3; -} -.file-row.error-entry .entry-title .name a { - color: #666668; -} -.file-row.error-entry .entry-descr { - color: #aa2c2c; -} -.file-row.error-entry .btn-row, -.file-row.error-entry .template-action, -.file-row.error-entry .pencil, -.file-row.error-entry .menu-small { - display: none !important; -} -/******************************************************************************* - Mouse moving -*******************************************************************************/ -.file-mouse-move, -.file-mouse-move * { - cursor: alias !important; -} -.file-mouse-copy, -.file-mouse-copy * { - cursor: copy !important; -} -#filesMovingTooltip { - cursor: move; - display: block; - font-size: 12px; - height: auto; - line-height: 24px; - margin-left: 13px; - margin-top: 6px; - max-width: 500px; - padding: 4px 16px; - position: absolute; - word-wrap: break-word; - z-index: 301; -} -#filesMovingTooltip, #ie#fix { - cursor: alias; -} -* + html #filesMovingTooltip { - cursor: move; -} - -/******************************************************************************* - versions -*******************************************************************************/ -#contentVersions { - background-color: #fff; - border-top: 1px solid #e5e5e5; - width: 100%; - padding-bottom: 5px; -} -.row-hover:hover #contentVersions, -.row-selected #contentVersions { - border-top-color: #FFF; -} -#contentVersions table { - padding-left: 40px; - width: 100%; -} -.versions-title th { - font-size: 14px; - padding: 12px 5px 10px; - text-align: left; -} -.version-close { - background: url("images/version_operation.png") no-repeat scroll 3px -97px transparent; - cursor: pointer; - float: right; - height: 16px; - margin: 2px 8px 0 0; - width: 16px; -} -.version-row { - border-bottom: 1px solid #D1D1D1; - color: #323232; - display: none; - height: 30px; - padding: 5px; - width: 100%; -} -.version-highlight .version-row:hover { - background-color: #e5e5e5; -} -.version-group-head { - display: table-row; -} -.version-row td { - white-space: nowrap; -} -.version-row a { - color: #323232; -} -.version-row .version-num { - font-weight: bold; - padding-left: 7px; - text-align: left; - width: 27px; -} -.version-edit.version-highlight .version-row:hover .version-num span { - display: none; -} -.version-row .version-continue, -.version-row .version-complete { - background: url("images/version_operation.png") no-repeat scroll center -80px transparent; - cursor: pointer; - display: none; - height: 16px; - width: 16px; -} -.version-row .version-complete { - background-position: center -60px; -} -.version-highlight .version-row:hover .version-complete, -.version-highlight .version-row:hover .version-continue, -.version-edit.version-highlight .version-row:hover span.display-num { - display: block; -} -.version-row .version-date { - padding-left: 7px; - padding-right: 4px; - width: 110px; -} -.version-sublist { - width: 80px; -} -.version-highlight .version-row:hover .version-sublist-toggle { - border-bottom: 1px dotted; - cursor: pointer; -} -.version-row .version-author { - width: 115px; -} -.version-row .version-author .userLink { - color: #787878; - cursor: default; - overflow: hidden; - text-overflow: ellipsis; - width: 115px; - white-space: nowrap; -} -.version-row .version-comment { - overflow: hidden; - padding-left: 13px; -} -.version-comment-fix { - width: 1px; -} -#contentVersions .version-comment .input-rename { - float: left; - font-size: 12px; - font-weight: normal; - height: 16px; - margin: 0 8px 0 0; - margin-top: 0; - width: 60%; -} -#contentVersions .version-comment .rename-action { - margin-top: 1px; -} -.version-row-comment .version-comment { - padding-left: 0; -} -.version-row-comment .version-operation, -.version-row-comment .version-size { - display: none; -} -.version-row .version-size { - color: #787878; - width: 1px; -} -.version-row .version-operation { - padding-right: 8px; - width: 72px; -} -.version-row .version-restore { - width: 90px; - padding-right: 10px; - text-align: right; -} -.version-row .version-restore span { - cursor: pointer; - font-size: 11px; - margin-left: 7px; -} -.version-highlight .version-row:hover .version-restore span { - border-bottom: 1px dotted; -} -.version-operation .version-download, -.version-operation .version-preview, -.version-operation .version-comment-edit { - background: url("images/version_operation.png") no-repeat center 0 transparent; - cursor: pointer; - display: none; - float: right; - height: 16px; - margin-left: 8px; - padding: 0; - width: 16px; -} -.version-operation .version-preview { - background-position: center -20px; -} -.version-operation .version-comment-edit { - background-position: center -40px; -} -.version-highlight .version-row:hover .version-download, -.version-highlight .version-row:hover .version-preview, -.version-highlight .version-row:hover .version-comment-edit { - display: block; -} -#contentVersions .not-preview:hover .version-preview { - display: none; -} -/******************************************************************************* - Tooltip -*******************************************************************************/ -#entryTooltip { - line-height: 20px; - margin: 4px 0 0 -20px; - z-index: 254; -} -#entryTooltip table { - margin: 6px 12px; -} -#entryTooltip td { - vertical-align: top; -} -#entryTooltip tr td:first-child { - color: #9CA0A4; - padding-right: 24px; -} -#entryTooltip img { - margin-left: -5px; - margin-right: -14px; - max-width: 130px; - max-height: 100px; - - box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); -} -/******************************************************************************* - Mobile -*******************************************************************************/ -body.mobile #contentVersions .version-preview, -body.mobile #contentVersions .version-comment-edit { - display: block; -} - -/***************************************\ - Width -\***************************************/ - -body.media-width-1620-0 .file-row .entry-title, -body.media-width-1620-0 .file-row .entry-descr { width: 952px; } -body.media-width-1620-0 .file-row .entry-title .name { max-width: 768px; } -body.media-width-1620-0 .file-row.folder-row .entry-title .name { max-width: 870px; } -body.media-width-1620-0 #filesMainContent.compact .file-row .entry-title { width: 854px; } -body.media-width-1620-0 #filesMainContent.compact .file-row .entry-title .name { max-width: 670px; } -body.media-width-1620-0 #filesMainContent.compact .file-row.folder-row .entry-title .name { max-width: 772px; } - - -body.media-width-0-1620 .file-row .entry-title, -body.media-width-0-1620 .file-row .entry-descr { width: 752px; } -body.media-width-0-1620 .file-row .entry-title .name { max-width: 568px; } -body.media-width-0-1620 .file-row.folder-row .entry-title .name { max-width: 670px; } -body.media-width-0-1620 #filesMainContent.compact .file-row .entry-title { width: 654px; } -body.media-width-0-1620 #filesMainContent.compact .file-row .entry-title .name { max-width: 470px; } -body.media-width-0-1620 #filesMainContent.compact .file-row.folder-row .entry-title .name { max-width: 572px; } - - -body.media-width-0-1420 .file-row .entry-title, -body.media-width-0-1420 .file-row .entry-descr { width: 600px; } -body.media-width-0-1420 .file-row .entry-title .name { max-width: 416px; } -body.media-width-0-1420 .file-row.folder-row .entry-title .name { max-width: 518px; } -body.media-width-0-1420 #filesMainContent.compact .file-row .entry-title { width: 494px; } -body.media-width-0-1420 #filesMainContent.compact .file-row .entry-title .name { max-width: 310px; } -body.media-width-0-1420 #filesMainContent.compact .file-row.folder-row .entry-title .name { max-width: 412px; } - - -body.media-width-0-1260 .file-row .entry-title, -body.media-width-0-1260 .file-row .entry-descr { width: 540px; } -body.media-width-0-1260 .file-row .entry-title .name { max-width: 356px; } -body.media-width-0-1260 .file-row.folder-row .entry-title .name { max-width: 458px; } -body.media-width-0-1260 #filesMainContent.compact .file-row .entry-title { width: 434px; } -body.media-width-0-1260 #filesMainContent.compact .file-row .entry-title .name { max-width: 250px; } -body.media-width-0-1260 #filesMainContent.compact .file-row.folder-row .entry-title .name { max-width: 352px; } - - -body.media-width-0-1200 .file-row .entry-title, -body.media-width-0-1200.file-row .entry-descr { width: 480px; } -body.media-width-0-1200 .file-row .entry-title .name { max-width: 296px; } -body.media-width-0-1200 .file-row.folder-row .entry-title .name { max-width: 398px; } -body.media-width-0-1200 #filesMainContent.compact .file-row .entry-title { width: 374px; } -body.media-width-0-1200 #filesMainContent.compact .file-row .entry-title .name { max-width: 190px; } -body.media-width-0-1200 #filesMainContent.compact .file-row.folder-row .entry-title .name { max-width: 292px; } - - -body.media-width-0-1140 .file-row .entry-title, -body.media-width-0-1140 .file-row .entry-descr { width: 420px; } -body.media-width-0-1140 .file-row .entry-title .name { max-width: 236px; } -body.media-width-0-1140 .file-row.folder-row .entry-title .name { max-width: 338px; } -body.media-width-0-1140 #filesMainContent.compact .file-row .entry-title { width: 283px; } -body.media-width-0-1140 #filesMainContent.compact .file-row .entry-title .name { max-width: 82px; } -body.media-width-0-1140 #filesMainContent.compact .file-row.folder-row .entry-title .name { max-width: 184px; } - - -body[class*='media-width'] .file-row.row-rename .entry-title .name, -body[class*='media-width'] .file-row.folder-row.row-rename .entry-title .name -{ - max-width: 280px; -} - -body[class*='media-width'] .file-row.row-rename .entry-title, -body[class*='media-width'] #filesMainContent.compact .file-row.row-rename .entry-title, -body[class*='media-width'] .file-row.row-rename .entry-descr { - width: 290px; -} - -body[class*='media-width'] #filesMainContent.compact .file-row.row-rename .entry-title .name { - max-width: 280px; -} - - -/******************************************************************************* - For Retina -*******************************************************************************/ -@media only screen and (-webkit-min-device-pixel-ratio: 2), -only screen and ( min--moz-device-pixel-ratio: 2), -only screen and ( -o-min-device-pixel-ratio: 2/1), -only screen and ( min-device-pixel-ratio: 2), -only screen and ( min-resolution: 192dpi), -only screen and ( min-resolution: 2dppx) -{ - .thumb-encrypted { - background-image: url("images/retina/encrypted.png"); - } + background-color: @file-row-version-bg-hover; +} +.file-row .entry-descr, +.file-row .entry-descr-compact { + color: #787878; + font-size: 10px; + cursor: default; + float: none; + z-index: 90; + overflow: hidden; + white-space: nowrap; +} +.file-row .entry-descr .create-by, +.file-row .entry-descr-compact { + display: inline-block; + max-width: 280px; + overflow: hidden; + vertical-align: bottom; +} +.file-row .entry-descr-compact { + display: none; + float: right; + font-size: 12px; + margin-left: 8px; + margin-top: 7px; + text-overflow: ellipsis; + text-align: right; + width: 140px; +} +.file-row.cannot-edit .entry-descr .create-by { + max-width: 405px; +} +.title-removed, +.folder-row .modified-date { + display: none; +} +.file-editing { + display: none; +} +.file-row.on-edit .file-edit { + display: none !important; +} + +.file-row.on-edit .file-editing { + cursor: default; + display: block; +} +.file-row.on-edit.can-coauthoring .file-editing { + cursor: pointer; +} +.menu-small { + margin: 8px 10px 0 16px; +} + +.file-row .pencil { + float: left; + margin: 2px 0 0 8px; +} +.pencil.convert-action, +.pencil.fillform-action { + display: none; +} +.row-hover:hover .pencil, +.file-row .pencil.file-editing { + background: url('../../../../skins/default/images/svg/documents/pencilblue.svg'); +} +.row-hover:hover .pencil.convert-action { + background: url('../../../../skins/default/images/svg/documents/rotateblue.svg'); +} +.on-edit .pencil.fillform-action, +.row-hover:hover .pencil.fillform-action { + background: url('../../../../skins/default/images/svg/documents/fillformsblue.svg'); +} +.file-row.can-coauthoring .pencil.file-editing { + background: url('../../../../skins/default/images/svg/documents/pencil_add.svg'); +} +.is-template .pencil, +.template-action { + display: none; +} +.is-template .template-action { + display: block; + float: left; + margin: 2px 0 0 8px; +} +.row-hover:hover .template-action { + background: url('../../../../skins/default/images/svg/documents/templateblue.svg'); +} +.file-lock { + display: none; + margin: 2px 0 0 8px; +} +.file-row.file-locked .file-lock { + display: block; +} +.file-row.file-locked-by .file-lock { + cursor: default; +} +.file-row.file-locked-by.file-can-unlock .file-lock { + cursor: pointer; +} +.file-row.file-locked-by .pencil { + display: none; +} +.file-row .favorite { + display: none; + margin-left: 8px; +} +.file-row.on-favorite .favorite { + display: block; +} + +li.without-share .btn-row { + visibility: hidden; +} +ul.without-share li:not(.can-share) .btn-row { + display: none; +} +.file-row .btn-row { + margin: 5px 0 0 8px; + max-width: 83px; + overflow: hidden; + white-space: nowrap; +} +.compact .file-row .btn-row { + margin-top: 1px; +} +.file-row .menu-small, +.file-row .btn-row { + float: right; +} +.corporateFiles .__share, +.btn-row.__lock { + display: none; +} +.corporateFiles .__lock { + display: inline-block; +} +/******************************************************************************* + compact view +*******************************************************************************/ +#filesMainContent.compact .file-row.checkloading .checkbox { + background-position-y: 7px; +} +#filesMainContent.compact .file-row { + height: 28px; + padding: 2px 0 1px; +} +#filesMainContent.compact .thumb-encrypted { + bottom: -5px; + right: -5px; +} +#filesMainContent.compact .checkbox { + margin-top: -2px; + padding-bottom: 6px; + padding-top: 6px; +} +#filesMainContent.compact .file-row .entry-title .name { + max-width: 74px; + padding-top: 7px; +} +#filesMainContent.compact .file-row.folder-row .entry-title .name { + max-width: 200px; +} +#filesMainContent.compact .file-row.row-rename .entry-title .name { + max-width: 280px; +} +#filesMainContent.compact .file-row .entry-title { + margin: 0; + float: left; + width: 258px; +} +#filesMainContent.compact .file-row .entry-descr-compact { + display: block; +} +#filesMainContent.compact .file-row .entry-descr { + display: none +} +#filesMainContent.compact .file-row .entry-title .name a { + font-size: 12px; + line-height: 17px; +} +#filesMainContent.compact .file-row .entry-title .name a .file-extension { + font-size: 11px; + line-height: 15px; +} +#filesMainContent.compact .thumb-file +#filesMainContent.compact .thumb-folder { + margin-top: 3px; +} +#filesMainContent.compact .input-rename { + font-size: 12px; + height: 16px; + margin-top: -5px; +} +#filesMainContent.compact .rename-action { + margin-top: 2px; +} +#filesMainContent.compact .pencil, +#filesMainContent.compact .template-action, +#filesMainContent.compact .file-lock { + margin-top: 6px; +} +#filesMainContent.compact .menu-small { + margin-top: 4px; +} +#filesMainContent.compact #contentVersions { + margin: 1px 0 0; +} +#filesMainContent.compact .favorite, +#filesMainContent.compact .file-row .version, +#filesMainContent.compact .file-row .is-new { + margin-top: 4px; +} +#filesMainContent .file-row.file-row-fix, +#filesMainContent.compact .file-row.file-row-fix { + height: auto; + padding-bottom: 0; +} +.file-row-fix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} +/******************************************************************************* + thumbnails view +*******************************************************************************/ +#filesMainContent.thumbnails { + display: grid; + margin-top: 14px; + grid-template-columns: repeat(auto-fill, minmax(204px, 1fr)); + gap: 0 20px; + box-sizing: border-box; +} + +#filesMainContent .folders-separator, +#filesMainContent .files-separator { + display: none; +} + +#filesMainContent.thumbnails .folders-separator, +#filesMainContent.thumbnails .files-separator { + display: block; + grid-column-start: 1; + grid-column-end: -1; +} + +#filesMainContent.thumbnails .row-selected .checkbox, +#filesMainContent.thumbnails .file-row.checkloading .checkbox, +#filesMainContent.thumbnails .file-row:hover .checkbox { + display: block; +} + +#filesMainContent.thumbnails .row-selected .thumb-file, +#filesMainContent.thumbnails .row-selected .thumb-folder, +#filesMainContent.thumbnails .file-row.checkloading .thumb-file, +#filesMainContent.thumbnails .file-row.checkloading .thumb-folder, +#filesMainContent.thumbnails .file-row:hover .thumb-file, +#filesMainContent.thumbnails .file-row:hover .thumb-folder { + display: none; +} + +#filesMainContent.thumbnails .thumb-encrypted { + display: none; +} + +#filesMainContent.thumbnails .file-row { + position: relative; + box-sizing: border-box; + border-radius: 3px; + border: 1px solid @border-color; + display: flex; + justify-content: center; + padding: 0; + height: 204px; + min-width: 204px; + max-width: 300px; + margin: 0 0 20px 0; +} + +#filesMainContent.thumbnails .file-row.min { + height: 48px; +} + +#filesMainContent.thumbnails .file-row.row-hover:not(.row-rename):hover { + background: linear-gradient(to bottom, @body-color-hover-another 156px, @body-color-selected 48px) !important; +} + +#filesMainContent.thumbnails .file-row.min.row-hover:not(.row-rename):hover { + background: @body-color-selected; +} + +#filesMainContent.thumbnails .file-row.row-selected { + border-color: #0075ff; + background: linear-gradient(to bottom, @body-color-hover-another 156px, @body-color 48px); +} + +#filesMainContent.thumbnails .file-row.min.row-selected { + background: @body-color; +} + +#filesMainContent.thumbnails .file-row.display-versions { + border-color: #0075ff; +} + +#filesMainContent.thumbnails .file-row.row-selected .version { + background-color: #d9d9d9; +} + +#filesMainContent.thumbnails .checkbox { + display: none; + position: absolute; + left: 0; + bottom: 0; + padding: 17px 11px 17px 15px; + margin: 0; + height: 14px; + width: 14px; +} + +#filesMainContent.thumbnails .checkbox:hover { + background-color: transparent; +} + +#filesMainContent.thumbnails .checkbox input { + margin: 1px 1px 0 0; + padding: 0; +} + +#filesMainContent.thumbnails .entry-info { + position: absolute; + top: 0; + left: 0; + width: 100%; +} + +#filesMainContent.thumbnails .file-row .entry-title { + margin: 0px; + width: 100%; + height: 28px; + padding: 4px 8px 0 0; + box-sizing: border-box; + display: flex; + align-items: flex-start; +} + +#filesMainContent.thumbnails .file-row.min .entry-title { + height: 0; + padding: 0; +} + +#filesMainContent.thumbnails .entry-info .name { + height: 36px; + width: ~"calc(100% - 80px)"; + position: absolute; + top: 162px; + left: 40px; + display: flex; + align-items: center; +} + +#filesMainContent.thumbnails .file-row.min .entry-info .name { + top: 6px; + cursor: pointer; +} + +#filesMainContent.thumbnails .file-row .entry-descr-compact { + display: none; +} + +#filesMainContent.thumbnails .file-row .entry-descr { + display: none; +} + +#filesMainContent.thumbnails .file-row .entry-title .name a { + font-style: normal; + font-weight: 600; + font-size: 12px; + line-height: 17px; + white-space: normal; + overflow: hidden; + text-overflow: ellipsis; + max-height: 36px; +} + +#filesMainContent.thumbnails .file-row .entry-title .name a .file-extension { + font-style: normal; + font-weight: 600; + font-size: 12px; + line-height: 18px; +} + +#filesMainContent.thumbnails .thumb-file, +#filesMainContent.thumbnails .thumb-folder { + height: 24px; + margin: 12px 6px 12px 10px; + width: 24px; + bottom: 0; + left: 0; + padding: 0; + position: absolute; +} + +#filesMainContent.thumbnails .thumb-file { + background-position: 0px -38px; +} + +#filesMainContent.thumbnails .thumb-folder { + background-size: 24px; +} + +#filesMainContent.thumbnails .thumb-img { + display: block; + margin: 28px auto 46px; + padding: 0; + width: 192px; + height: 128px; + text-align: center; + cursor: pointer; +} + +#filesMainContent.thumbnails .thumb-img img { + max-width: 192px; + max-height: 128px; + border-radius: 2px; + user-select: none; + pointer-events: none; +} + +#filesMainContent.thumbnails .file-row.min .thumb-img, +#filesMainContent.thumbnails .file-row.min .version, +#filesMainContent.thumbnails .file-row.min .pencil, +#filesMainContent.thumbnails .file-row.min .file-lock, +#filesMainContent.thumbnails .file-row.min .template-action { + display: none !important; +} + +#filesMainContent.thumbnails .file-row.min.on-favorite:not(.row-rename) .entry-info .name { + width: 104px; + max-width: 104px; +} + +#filesMainContent.thumbnails .file-row.min.on-favorite:not(.row-rename) .favorite { + position: absolute; + right: 38px; + top: 14px; +} + +#filesMainContent.thumbnails .file-row.min .new-label-menu { + position: absolute; + right: 4px; + top: 2px; + border-radius: 8px; + padding: 2px 2px; + width: 2px; + height: 2px; + font-size: 0; +} + +#filesMainContent.thumbnails .file-row.min.row-hover .new-label-menu, +#filesMainContent.thumbnails .file-row.min.row-selected .new-label-menu { + position: absolute; + right: -6px; + top: -8px; + border-radius: 8px; + padding: 1px 5px; + width: auto; + height: auto; + font-size: 10px; + transition-property: all; + transition-duration: 0.2s; + transition-timing-function: linear; +} + +#filesMainContent.thumbnails .file-row.row-rename .thumb-file, +#filesMainContent.thumbnails .file-row.row-rename .thumb-folder { + display: none; +} + +#filesMainContent.thumbnails .file-row.row-rename .entry-info .name { + left: 10px; + top: 166px; + height: 28px; +} + +#filesMainContent.thumbnails .file-row.min.row-rename .entry-info .name { + top: 10px; +} + +#filesMainContent.thumbnails .input-rename { + font-style: normal; + font-weight: 600; + font-size: 12px; + line-height: 18px; + height: 18px; + width: 100%; + margin: 0; +} + +#filesMainContent.thumbnails .rename-action { + position: absolute; + bottom: 12px; + right: 10px; + margin: 0; +} + +#filesMainContent.thumbnails .rename-action > div:first-child { + margin-right: 4px; +} + +#filesMainContent.thumbnails .file-row .btn-row { + display: none +} + +#filesMainContent.thumbnails .menu-small { + bottom: 14px; + right: 10px; + position: absolute; + margin: 0; +} + +#filesMainContent.thumbnails .file-row .version, +#filesMainContent.thumbnails .folder-row .new-label-menu { + margin-left: auto; +} + +#filesMainContent.thumbnails .row-selected .checkbox { + display: block; +} + +#filesMainContent.thumbnails #contentVersions { + border: 1px solid @border-color; + width: auto; + margin: 0 0 20px 0; + padding: 10px 20px 10px 30px; + border-radius: 3px; + grid-column-start: 1; + grid-column-end: -1; +} + +#filesMainContent.thumbnails #contentVersions table { + padding: 0; +} + +#filesMainContent.thumbnails #contentVersions table thead tr.versions-title th { + padding-top: 0; +} + +#filesMainContent.thumbnails #contentVersions .rename-action { + position: static; +} + +/******************************************************************************* + Error in content +*******************************************************************************/ +.file-row.error-entry { + background-color: #FFECE3; +} +.file-row.error-entry .entry-title .name a { + color: #666668; +} +.file-row.error-entry .entry-descr { + color: #aa2c2c; +} +.file-row.error-entry .btn-row, +.file-row.error-entry .template-action, +.file-row.error-entry .pencil, +.file-row.error-entry .menu-small { + display: none !important; +} +/******************************************************************************* + Mouse moving +*******************************************************************************/ +.file-mouse-move, +.file-mouse-move * { + cursor: alias !important; +} +.file-mouse-copy, +.file-mouse-copy * { + cursor: copy !important; +} +#filesMovingTooltip { + cursor: move; + display: block; + font-size: 12px; + height: auto; + line-height: 24px; + margin-left: 13px; + margin-top: 6px; + max-width: 500px; + padding: 4px 16px; + position: absolute; + word-wrap: break-word; + z-index: 301; +} +#filesMovingTooltip, #ie#fix { + cursor: alias; +} +* + html #filesMovingTooltip { + cursor: move; +} + +/******************************************************************************* + versions +*******************************************************************************/ +#contentVersions { + background-color: @body-color; + border-top: 1px solid @body-color-hover-another; + width: 100%; + padding-bottom: 5px; +} +.row-hover:hover #contentVersions, +.row-selected #contentVersions { + border-top-color: @body-color; +} +#contentVersions table { + padding-left: 40px; + width: 100%; +} +.versions-title th { + font-size: 14px; + padding: 12px 5px 10px; + text-align: left; +} +.version-close { + background: url("images/version_operation.png") no-repeat scroll 3px -97px transparent; + cursor: pointer; + float: right; + height: 16px; + margin: 2px 8px 0 0; + width: 16px; +} +.version-row { + border-bottom: 1px solid @border-color; + color: @version-row-col; + display: none; + height: 30px; + padding: 5px; + width: 100%; +} +.version-highlight .version-row:hover { + background-color: @body-color-hover-another; +} +.version-group-head { + display: table-row; +} +.version-row td { + white-space: nowrap; +} +.version-row a { + color: #323232; +} +.version-row .version-num { + font-weight: bold; + padding-left: 7px; + text-align: left; + width: 27px; +} +.version-edit.version-highlight .version-row:hover .version-num span { + display: none; +} +.version-row .version-continue, +.version-row .version-complete { + background: url("images/version_operation.png") no-repeat scroll center -80px transparent; + cursor: pointer; + display: none; + height: 16px; + width: 16px; +} +.version-row .version-complete { + background-position: center -60px; +} +.version-highlight .version-row:hover .version-complete, +.version-highlight .version-row:hover .version-continue, +.version-edit.version-highlight .version-row:hover span.display-num { + display: block; +} +.version-row .version-date { + padding-left: 7px; + padding-right: 4px; + width: 110px; +} +.version-sublist { + width: 80px; +} +.version-highlight .version-row:hover .version-sublist-toggle { + border-bottom: 1px dotted; + cursor: pointer; +} +.version-row .version-author { + width: 115px; +} +.version-row .version-author .userLink { + color: #787878; + cursor: default; + overflow: hidden; + text-overflow: ellipsis; + width: 115px; + white-space: nowrap; +} +.version-row .version-comment { + overflow: hidden; + padding-left: 13px; +} +.version-comment-fix { + width: 1px; +} +#contentVersions .version-comment .input-rename { + float: left; + font-size: 12px; + font-weight: normal; + height: 16px; + margin: 0 8px 0 0; + margin-top: 0; + width: 60%; +} +#contentVersions .version-comment .rename-action { + margin-top: 1px; +} +.version-row-comment .version-comment { + padding-left: 0; +} +.version-row-comment .version-operation, +.version-row-comment .version-size { + display: none; +} +.version-row .version-size { + color: #787878; + width: 1px; +} +.version-row .version-operation { + padding-right: 8px; + width: 72px; +} +.version-row .version-restore { + width: 90px; + padding-right: 10px; + text-align: right; +} +.version-row .version-restore span { + cursor: pointer; + font-size: 11px; + margin-left: 7px; +} +.version-highlight .version-row:hover .version-restore span { + border-bottom: 1px dotted; +} +.version-operation .version-download, +.version-operation .version-preview, +.version-operation .version-comment-edit { + background: url("images/version_operation.png") no-repeat center 0 transparent; + cursor: pointer; + display: none; + float: right; + height: 16px; + margin-left: 8px; + padding: 0; + width: 16px; +} +.version-operation .version-preview { + background-position: center -20px; +} +.version-operation .version-comment-edit { + background-position: center -40px; +} +.version-highlight .version-row:hover .version-download, +.version-highlight .version-row:hover .version-preview, +.version-highlight .version-row:hover .version-comment-edit { + display: block; +} +#contentVersions .not-preview:hover .version-preview { + display: none; +} +/******************************************************************************* + Tooltip +*******************************************************************************/ +#entryTooltip { + line-height: 20px; + margin: 4px 0 0 -20px; + z-index: 254; +} +#entryTooltip table { + margin: 6px 12px; +} +#entryTooltip td { + vertical-align: top; +} +#entryTooltip tr td:first-child { + color: #9CA0A4; + padding-right: 24px; +} +#entryTooltip img { + margin-left: -5px; + margin-right: -14px; + max-width: 130px; + max-height: 100px; + + box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); +} +/******************************************************************************* + Mobile +*******************************************************************************/ +body.mobile #contentVersions .version-preview, +body.mobile #contentVersions .version-comment-edit { + display: block; +} + +/***************************************\ + Width +\***************************************/ + +body.media-width-1620-0 .file-row .entry-title, +body.media-width-1620-0 .file-row .entry-descr { width: 952px; } +body.media-width-1620-0 .file-row .entry-title .name { max-width: 768px; } +body.media-width-1620-0 .file-row.folder-row .entry-title .name { max-width: 870px; } +body.media-width-1620-0 #filesMainContent.compact .file-row .entry-title { width: 854px; } +body.media-width-1620-0 #filesMainContent.compact .file-row .entry-title .name { max-width: 670px; } +body.media-width-1620-0 #filesMainContent.compact .file-row.folder-row .entry-title .name { max-width: 772px; } + + +body.media-width-0-1620 .file-row .entry-title, +body.media-width-0-1620 .file-row .entry-descr { width: 752px; } +body.media-width-0-1620 .file-row .entry-title .name { max-width: 568px; } +body.media-width-0-1620 .file-row.folder-row .entry-title .name { max-width: 670px; } +body.media-width-0-1620 #filesMainContent.compact .file-row .entry-title { width: 654px; } +body.media-width-0-1620 #filesMainContent.compact .file-row .entry-title .name { max-width: 470px; } +body.media-width-0-1620 #filesMainContent.compact .file-row.folder-row .entry-title .name { max-width: 572px; } + + +body.media-width-0-1420 .file-row .entry-title, +body.media-width-0-1420 .file-row .entry-descr { width: 600px; } +body.media-width-0-1420 .file-row .entry-title .name { max-width: 416px; } +body.media-width-0-1420 .file-row.folder-row .entry-title .name { max-width: 518px; } +body.media-width-0-1420 #filesMainContent.compact .file-row .entry-title { width: 494px; } +body.media-width-0-1420 #filesMainContent.compact .file-row .entry-title .name { max-width: 310px; } +body.media-width-0-1420 #filesMainContent.compact .file-row.folder-row .entry-title .name { max-width: 412px; } + + +body.media-width-0-1260 .file-row .entry-title, +body.media-width-0-1260 .file-row .entry-descr { width: 540px; } +body.media-width-0-1260 .file-row .entry-title .name { max-width: 356px; } +body.media-width-0-1260 .file-row.folder-row .entry-title .name { max-width: 458px; } +body.media-width-0-1260 #filesMainContent.compact .file-row .entry-title { width: 434px; } +body.media-width-0-1260 #filesMainContent.compact .file-row .entry-title .name { max-width: 250px; } +body.media-width-0-1260 #filesMainContent.compact .file-row.folder-row .entry-title .name { max-width: 352px; } + + +body.media-width-0-1200 .file-row .entry-title, +body.media-width-0-1200.file-row .entry-descr { width: 480px; } +body.media-width-0-1200 .file-row .entry-title .name { max-width: 296px; } +body.media-width-0-1200 .file-row.folder-row .entry-title .name { max-width: 398px; } +body.media-width-0-1200 #filesMainContent.compact .file-row .entry-title { width: 374px; } +body.media-width-0-1200 #filesMainContent.compact .file-row .entry-title .name { max-width: 190px; } +body.media-width-0-1200 #filesMainContent.compact .file-row.folder-row .entry-title .name { max-width: 292px; } + + +body.media-width-0-1140 .file-row .entry-title, +body.media-width-0-1140 .file-row .entry-descr { width: 420px; } +body.media-width-0-1140 .file-row .entry-title .name { max-width: 236px; } +body.media-width-0-1140 .file-row.folder-row .entry-title .name { max-width: 338px; } +body.media-width-0-1140 #filesMainContent.compact .file-row .entry-title { width: 283px; } +body.media-width-0-1140 #filesMainContent.compact .file-row .entry-title .name { max-width: 82px; } +body.media-width-0-1140 #filesMainContent.compact .file-row.folder-row .entry-title .name { max-width: 184px; } + + +body[class*='media-width'] .file-row.row-rename .entry-title .name, +body[class*='media-width'] .file-row.folder-row.row-rename .entry-title .name +{ + max-width: 280px; +} + +body[class*='media-width'] .file-row.row-rename .entry-title, +body[class*='media-width'] #filesMainContent.compact .file-row.row-rename .entry-title, +body[class*='media-width'] .file-row.row-rename .entry-descr { + width: 290px; +} + +body[class*='media-width'] #filesMainContent.compact .file-row.row-rename .entry-title .name { + max-width: 280px; +} + + +/******************************************************************************* + For Retina +*******************************************************************************/ +@media only screen and (-webkit-min-device-pixel-ratio: 2), +only screen and ( min--moz-device-pixel-ratio: 2), +only screen and ( -o-min-device-pixel-ratio: 2/1), +only screen and ( min-device-pixel-ratio: 2), +only screen and ( min-resolution: 192dpi), +only screen and ( min-resolution: 2dppx) +{ + .thumb-encrypted { + background-image: url("images/retina/encrypted.png"); + } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/dark-contentlist.less b/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/dark-contentlist.less new file mode 100644 index 000000000..d53c128b7 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/dark-contentlist.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "contentlist.less"; +@import "../../App_Themes/dark-default/params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/images/throbber-dark-16.svg b/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/images/throbber-dark-16.svg new file mode 100644 index 000000000..520cf5be1 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ContentList/images/throbber-dark-16.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/ConfirmConvert.ascx.cs b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/ConfirmConvert.ascx.cs index 48bc6c938..fb6e3bc6e 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/ConfirmConvert.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/ConfirmConvert.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/ConvertFile.ascx b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/ConvertFile.ascx index d512a64c7..676dd1e14 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/ConvertFile.ascx +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/ConvertFile.ascx @@ -30,7 +30,7 @@ <%= FilesUCResource.CaptionConvertPassword %>

    - +
    diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/ConvertFile.ascx.cs b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/ConvertFile.ascx.cs index 1d7de4e3a..6450c8b57 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/ConvertFile.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/ConvertFile.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/confirmconvert.js b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/confirmconvert.js index f14b08001..9d41a9cc0 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/confirmconvert.js +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/confirmconvert.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/confirmconvert.css b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/confirmconvert.less similarity index 75% rename from web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/confirmconvert.css rename to web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/confirmconvert.less index 3e6681dfc..d4fd8581b 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/confirmconvert.css +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/confirmconvert.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,9 +15,15 @@ */ -.confirm-convert-panel { - background: url("images/convert_alert.png") no-repeat top left transparent; - font-size: 12px; - min-height: 100px; - padding-left: 120px; -} +.confirm-convert-panel { + background: url("images/convert_alert.svg") no-repeat top left transparent; + font-size: 12px; + min-height: 100px; + padding-left: 120px; +} + +.convert-password { + width: 100%; + box-sizing: border-box; + height: 20px; +} \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/convertfile.js b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/convertfile.js index 3089b8012..18f92dfb1 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/convertfile.js +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/convertfile.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -80,7 +80,7 @@ window.ASC.Files.Converter = (function () { } else { jq("#confirmCopyConvertToMyText").show(); } - } else if (ASC.Files.UI.accessDelete(fileObj) && !ASC.Files.UI.lockedForMe(fileObj)) { + } else if (ASC.Files.UI.accessDelete(fileObj) && !ASC.Files.UI.lockedForMe(fileObj) && ASC.Resources.Master.IsAuthenticated) { jq("#confirmCopyConvertLabelText").show(); jq("#confirmCopyConvertLabelText input").prop("disabled", false); } @@ -146,10 +146,11 @@ window.ASC.Files.Converter = (function () { //todo: replace with ASC.Files.EventHandler.onGetFile var stringXmlFile = file.fileXml; var htmlXML = ASC.Files.TemplateManager.translateFromString(stringXmlFile); - + var storeOriginal = ASC.Resources.Master.IsAuthenticated ? ASC.Files.Common.storeOriginal : true; + ASC.Files.EmptyScreen.hideEmptyScreen(); var sourceFileObj = ASC.Files.UI.getEntryObject("file", sourceFileId); - if (sourceFileObj.length == 0 || ASC.Files.Common.storeOriginal) { + if (sourceFileObj.length == 0 || storeOriginal) { var replaceWith = ASC.Files.UI.getEntryObject("file", fileId); if (replaceWith.length) { replaceWith.after(htmlXML); diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/convertfile.css b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/convertfile.less similarity index 93% rename from web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/convertfile.css rename to web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/convertfile.less index d86cf1899..b2485edc5 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/convertfile.css +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/convertfile.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,141 +14,141 @@ * */ - -/******************************************************************************* - Convert&Dowload -*******************************************************************************/ -.cnvrt-list-file-block { - padding: 10px 0; -} -.cnvrt-list-file-block .tl-combobox { - max-width: 100%; - display: none; -} -.cnvrt-list-file-block .tl-combobox .combobox-container .container-top { - right: 8px; -} -.cnvrt-list-file-block .tl-combobox .combobox-container .combobox-options { - max-height: none; -} -.cnvrt-file-block { - border-left: medium none; - border-right: medium none; - margin-bottom: -1px; - min-height: 30px; +@import "../../App_Themes/default/params.less"; +/******************************************************************************* + Convert&Dowload +*******************************************************************************/ +.cnvrt-list-file-block { + padding: 10px 0; +} +.cnvrt-list-file-block .tl-combobox { + max-width: 100%; + display: none; +} +.cnvrt-list-file-block .tl-combobox .combobox-container .container-top { + right: 8px; +} +.cnvrt-list-file-block .tl-combobox .combobox-container .combobox-options { + max-height: none; +} +.cnvrt-file-block { + border-left: medium none; + border-right: medium none; + margin-bottom: -1px; + min-height: 30px; } .cnvrt-file-block:hover { - background-color: #f2f2f2; + background-color: @cnvrt-file-block-hover; } .cnvrt-file-block-active { - background-color: #fafafa; -} -.cnvrt-file-block-open .cnvrt-file-block-head { - border-bottom: 1px dotted #d1d1d1; -} -.cnvrt-file-block-body { - padding-left: 20px; -} -.cnvrt-file-block-open .cnvrt-file-block-body { - display: block; -} -.cnvrt-file-block-closed .cnvrt-file-block-body { - display: none; -} -.cnvrt-status-content { - background-color: transparent; - background-image: url("images/tree_action.png"); - background-repeat: no-repeat; - cursor: pointer; - float: left; - height: 30px; - width: 20px; -} -.cnvrt-file-block-open .cnvrt-status-content { - background-position: -12px 5px; -} -.cnvrt-file-block-closed .cnvrt-status-content { - background-position: 5px 5px; -} -.cnvrt-cbx-content { - float: left; - margin-top: 6px; -} -.cnvrt-format-icon-content { - float: left; - margin: 4px 5px 5px; -} -.cnvrt-title-content { - float: left; - line-height: 30px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - width: 205px; -} -.cnvrt-title-content .file-extension { - font-weight: bold; -} -.cnvrt-file-block-head .cnvrt-title-content { - cursor: pointer; - font-size: 14px; - margin-left: 5px; - width: 231px; -} -.cnvrt-tooltip-content { - color: #808080; - display: none; - float: left; - line-height: 30px; - overflow: hidden; - padding: 0 10px; - text-align: right; - text-overflow: ellipsis; - width: 115px; - white-space: nowrap; -} -.cnvrt-format-title-content { - float: right; - margin-top: 8px; - width: 130px; -} -.cnvrt-format-title-content select { - width: 122px; -} -.mobile .cnvrt-format-title-content { - margin-top: 3px; -} -.cnvrt-format-title-content .tl-combobox { - height: 15px; -} -.cnvrt-format-title { - display: none; -} - -.cnvrt-file-block-active .tl-combobox { - display: inline-block; -} -.cnvrt-file-block-active .tl-combobox .combobox-title .inner-text { - border-bottom-width: 0; -} -.cnvrt-file-block-active:hover .tl-combobox .combobox-title .inner-text { - border-bottom-width: 1px; -} - -.cnvrt-file-block-active .cnvrt-file-block-head .cnvrt-tooltip-content, -.cnvrt-file-block-active .cnvrt-file-row-active .cnvrt-tooltip-content { - display: block; -} -.cnvrt-file-row, -.cnvrt-file-block-head { - height: 30px; -} -/***********************************\ - Convert and Open -\***********************************/ -#confirmCopyConvert .files-progress-box { - border: none; - display: block; - margin-left: auto; - padding: 0; + background-color: @cnvrt-file-block-active; +} +.cnvrt-file-block-open .cnvrt-file-block-head { + border-bottom: 1px dotted #d1d1d1; +} +.cnvrt-file-block-body { + padding-left: 20px; +} +.cnvrt-file-block-open .cnvrt-file-block-body { + display: block; +} +.cnvrt-file-block-closed .cnvrt-file-block-body { + display: none; +} +.cnvrt-status-content { + background-color: transparent; + background-image: url("images/tree_action.png"); + background-repeat: no-repeat; + cursor: pointer; + float: left; + height: 30px; + width: 20px; +} +.cnvrt-file-block-open .cnvrt-status-content { + background-position: -12px 5px; +} +.cnvrt-file-block-closed .cnvrt-status-content { + background-position: 5px 5px; +} +.cnvrt-cbx-content { + float: left; + margin-top: 6px; +} +.cnvrt-format-icon-content { + float: left; + margin: 4px 5px 5px; +} +.cnvrt-title-content { + float: left; + line-height: 30px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 205px; +} +.cnvrt-title-content .file-extension { + font-weight: bold; +} +.cnvrt-file-block-head .cnvrt-title-content { + cursor: pointer; + font-size: 14px; + margin-left: 5px; + width: 231px; +} +.cnvrt-tooltip-content { + color: #808080; + display: none; + float: left; + line-height: 30px; + overflow: hidden; + padding: 0 10px; + text-align: right; + text-overflow: ellipsis; + width: 115px; + white-space: nowrap; +} +.cnvrt-format-title-content { + float: right; + margin-top: 8px; + width: 130px; +} +.cnvrt-format-title-content select { + width: 122px; +} +.mobile .cnvrt-format-title-content { + margin-top: 3px; +} +.cnvrt-format-title-content .tl-combobox { + height: 15px; +} +.cnvrt-format-title { + display: none; +} + +.cnvrt-file-block-active .tl-combobox { + display: inline-block; +} +.cnvrt-file-block-active .tl-combobox .combobox-title .inner-text { + border-bottom-width: 0; +} +.cnvrt-file-block-active:hover .tl-combobox .combobox-title .inner-text { + border-bottom-width: 1px; +} + +.cnvrt-file-block-active .cnvrt-file-block-head .cnvrt-tooltip-content, +.cnvrt-file-block-active .cnvrt-file-row-active .cnvrt-tooltip-content { + display: block; +} +.cnvrt-file-row, +.cnvrt-file-block-head { + height: 30px; +} +/***********************************\ + Convert and Open +\***********************************/ +#confirmCopyConvert .files-progress-box { + border: none; + display: block; + margin-left: auto; + padding: 0; } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/dark-convertfile.less b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/dark-convertfile.less new file mode 100644 index 000000000..435f0a965 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/dark-convertfile.less @@ -0,0 +1,18 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +@import "convertfile.less"; +@import "../../App_Themes/dark-default/params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/images/convert_alert.png b/web/studio/ASC.Web.Studio/Products/Files/Controls/ConvertFile/images/convert_alert.png deleted file mode 100644 index f04f2903be6556b0cb7b9cae82c89d35121d78e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4473 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/CreateMenu/CreateMenu.ascx.cs b/web/studio/ASC.Web.Studio/Products/Files/Controls/CreateMenu/CreateMenu.ascx.cs index 4751dd580..869d39a49 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/CreateMenu/CreateMenu.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/CreateMenu/CreateMenu.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/CreateMenu/createmenu.js b/web/studio/ASC.Web.Studio/Products/Files/Controls/CreateMenu/createmenu.js index 8f076660f..c8c756cd5 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/CreateMenu/createmenu.js +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/CreateMenu/createmenu.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -103,6 +103,10 @@ window.ASC.Files.CreateMenu = (function () { if (enable) { jq("#createMasterFormFromFile").toggleClass("disable", ASC.Files.Folders.folderContainer == "privacy"); } + + if (!ASC.Resources.Master.IsAuthenticated) { + jq("#createMasterFormFromFile").hide(); + } }; var toggleCreateByTemplate = function (enable) { diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/Desktop.ascx.cs b/web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/Desktop.ascx.cs index e71d5e1ec..7941d479e 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/Desktop.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/Desktop.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,7 +40,7 @@ public static string Location protected void Page_Load(object sender, EventArgs e) { - Page.RegisterStyle(FilesLinkUtility.FilesBaseAbsolutePath + "Controls/Desktop/desktop.css"); + Page.RegisterStyle(FilesLinkUtility.FilesBaseAbsolutePath + "Controls/Desktop/desktop.less"); Page.RegisterBodyScripts("~/Products/Files/Controls/Desktop/desktop.js"); desktopWelcomeDialog.Options.IsPopup = true; diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/desktop.js b/web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/desktop.js index 937eff979..c06fa778b 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/desktop.js +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/desktop.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -178,6 +178,10 @@ window.ASC.Desktop = (function () { return "*" + format; }).toArray().join(" "); + if (!!filter.length) { + filter = "(" + filter + ")"; + } + window.AscDesktopEditor.cloudCryptoCommand("upload", { "cryptoEngineId": "{FFF0E1EB-13DB-4678-B67D-FF0A41DBBCEF}", diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/desktop.css b/web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/desktop.less similarity index 93% rename from web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/desktop.css rename to web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/desktop.less index 366734558..c8c583046 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/desktop.css +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/Desktop/desktop.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + /******************************************************************************* Congratulation *******************************************************************************/ diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/EmptyFolder.ascx.cs b/web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/EmptyFolder.ascx.cs index 60f78bd83..d446b9199 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/EmptyFolder.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/EmptyFolder.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -113,7 +113,7 @@ protected void Page_Load(object sender, EventArgs e) EmptyScreenFolder.Controls.Add(new EmptyScreenControl { ID = "emptyContainer_my", - ImgSrc = PathProvider.GetImagePath("empty_screen_my.png"), + ImgSrc = PathProvider.GetImagePath("empty_screen_my.svg"), Header = FilesUCResource.MyFiles, HeaderDescribe = FilesUCResource.EmptyScreenHeader, Describe = descrMy, @@ -123,7 +123,7 @@ protected void Page_Load(object sender, EventArgs e) EmptyScreenFolder.Controls.Add(new EmptyScreenControl { ID = "emptyContainer_recent", - ImgSrc = PathProvider.GetImagePath("empty_screen_recent.png"), + ImgSrc = PathProvider.GetImagePath("empty_screen_recent.svg"), Header = FilesUCResource.Recent, HeaderDescribe = FilesUCResource.EmptyScreenHeader, Describe = FilesUCResource.EmptyScreenDescrRecent.HtmlEncode() @@ -132,7 +132,7 @@ protected void Page_Load(object sender, EventArgs e) EmptyScreenFolder.Controls.Add(new EmptyScreenControl { ID = "emptyContainer_favorites", - ImgSrc = PathProvider.GetImagePath("empty_screen_favorites.png"), + ImgSrc = PathProvider.GetImagePath("empty_screen_favorites.svg"), Header = FilesUCResource.Favorites, HeaderDescribe = FilesUCResource.EmptyScreenHeader, Describe = FilesUCResource.EmptyScreenDescrFavorites.HtmlEncode() @@ -141,7 +141,7 @@ protected void Page_Load(object sender, EventArgs e) EmptyScreenFolder.Controls.Add(new EmptyScreenControl { ID = "emptyContainer_templates", - ImgSrc = PathProvider.GetImagePath("empty_screen_templates.png"), + ImgSrc = PathProvider.GetImagePath("empty_screen_templates.svg"), Header = FilesUCResource.Templates, HeaderDescribe = FilesUCResource.EmptyScreenHeader, Describe = FilesUCResource.EmptyScreenDescrTemplates.HtmlEncode() @@ -188,7 +188,7 @@ protected void Page_Load(object sender, EventArgs e) EmptyScreenFolder.Controls.Add(new EmptyScreenControl { ID = "emptyContainer_privacy", - ImgSrc = PathProvider.GetImagePath("empty_screen_privacy.png"), + ImgSrc = PathProvider.GetImagePath("empty_screen_privacy.svg"), Header = FilesUCResource.PrivacyRoomEmptyFolder.HtmlEncode(), Describe = privacyDescr, ButtonHTML = privacyWithButton ? strButtons.ToString() : "" @@ -201,7 +201,7 @@ protected void Page_Load(object sender, EventArgs e) EmptyScreenFolder.Controls.Add(new EmptyScreenControl { ID = "emptyContainer_forme", - ImgSrc = PathProvider.GetImagePath("empty_screen_forme.png"), + ImgSrc = PathProvider.GetImagePath("empty_screen_forme.svg"), Header = FilesUCResource.SharedForMe, HeaderDescribe = FilesUCResource.EmptyScreenHeader, Describe = FilesUCResource.EmptyScreenDescrForme.HtmlEncode() @@ -210,7 +210,7 @@ protected void Page_Load(object sender, EventArgs e) EmptyScreenFolder.Controls.Add(new EmptyScreenControl { ID = "emptyContainer_corporate", - ImgSrc = PathProvider.GetImagePath("empty_screen_corporate.png"), + ImgSrc = PathProvider.GetImagePath("empty_screen_corporate.svg"), Header = FilesUCResource.CorporateFiles, HeaderDescribe = FilesUCResource.EmptyScreenHeader, Describe = FilesUCResource.EmptyScreenDescrCorporate.HtmlEncode() + strDragDrop, @@ -222,7 +222,7 @@ protected void Page_Load(object sender, EventArgs e) EmptyScreenFolder.Controls.Add(new EmptyScreenControl { ID = "emptyContainer_trash", - ImgSrc = PathProvider.GetImagePath("empty_screen_trash.png"), + ImgSrc = PathProvider.GetImagePath("empty_screen_trash.svg"), Header = FilesUCResource.Trash, HeaderDescribe = FilesUCResource.EmptyScreenHeader, Describe = FilesUCResource.EmptyScreenDescrTrash.HtmlEncode(), @@ -235,7 +235,7 @@ protected void Page_Load(object sender, EventArgs e) EmptyScreenFolder.Controls.Add(new EmptyScreenControl { ID = "emptyContainer_project", - ImgSrc = PathProvider.GetImagePath("empty_screen_project.png"), + ImgSrc = PathProvider.GetImagePath("empty_screen_project.svg"), Header = FilesUCResource.ProjectFiles, HeaderDescribe = FilesUCResource.EmptyScreenHeader, Describe = (!isVisitor @@ -249,7 +249,7 @@ protected void Page_Load(object sender, EventArgs e) EmptyScreenFolder.Controls.Add(new EmptyScreenControl { ID = "emptyContainer_filter", - ImgSrc = PathProvider.GetImagePath("empty_screen_filter.png"), + ImgSrc = PathProvider.GetImagePath("empty_screen_filter.svg"), Header = FilesUCResource.Filter, HeaderDescribe = FilesUCResource.EmptyScreenFilter, Describe = FilesUCResource.EmptyScreenFilterDescr.HtmlEncode(), @@ -262,7 +262,7 @@ protected void Page_Load(object sender, EventArgs e) EmptyScreenFolder.Controls.Add(new EmptyScreenControl { ID = "emptyContainer_subfolder", - ImgSrc = PathProvider.GetImagePath("empty_screen.png"), + ImgSrc = PathProvider.GetImagePath("empty_screen.svg"), HeaderDescribe = FilesUCResource.EmptyScreenFolderHeader, ButtonHTML = strButtons.ToString() }); diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/emptyfolder.js b/web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/emptyfolder.js index 3902760ea..5aa6f89dd 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/emptyfolder.js +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/emptyfolder.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ window.ASC.Files.EmptyScreen = (function () { jq("#emptyContainer .empty-folder-create").toggle(ASC.Files.Folders.folderContainer == "privacy" ? !!ASC.Desktop : ASC.Files.UI.accessEdit()); - if (!ASC.Files.Tree || ASC.Files.Tree.pathParts.length > 1) { + if (!ASC.Files.Tree || ASC.Files.Tree.pathParts.length > 1 || !ASC.Resources.Master.IsAuthenticated) { jq("#emptyContainer_subfolder").show(); ASC.Files.UI.checkButtonBack(".empty-folder-toparent"); diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/emptyfolder.css b/web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/emptyfolder.less similarity index 92% rename from web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/emptyfolder.css rename to web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/emptyfolder.less index 340e158e4..418ccda07 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/emptyfolder.css +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/EmptyFolder/emptyfolder.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,42 +15,42 @@ */ -#emptyContainer .emptyScrCtrl { - display: none; -} - -.empty-folder-goto, -.empty-folder-create, -.empty-folder-toparent { - display: table; - margin-bottom: 10px; -} - -#emptyContainer_trash .empty-folder-goto:after { - /* background: url("images/btn_emptyfolder.png") no-repeat center top transparent;*/ - - background-image: url('../../../../skins/default/images/svg/documents/people.svg'); -} - -.empty-folder-create-document { - float: left; -} - -.empty-folder-privacy-li { - font-size: 16px; - margin-bottom: 13px; - margin-left: 27px; - position: relative; -} -.empty-folder-privacy-li:after { - background-image: url("images/privacy.svg"); - content: " "; - cursor: pointer; - display: block; - height: 20px; - left: -27px; - margin-top: -10px; - position: absolute; - top: 50%; - width: 19px; -} +#emptyContainer .emptyScrCtrl { + display: none; +} + +.empty-folder-goto, +.empty-folder-create, +.empty-folder-toparent { + display: table; + margin-bottom: 10px; +} + +#emptyContainer_trash .empty-folder-goto:after { + /* background: url("images/btn_emptyfolder.png") no-repeat center top transparent;*/ + + background-image: url('../../../../skins/default/images/svg/documents/people.svg'); +} + +.empty-folder-create-document { + float: left; +} + +.empty-folder-privacy-li { + font-size: 16px; + margin-bottom: 13px; + margin-left: 27px; + position: relative; +} +.empty-folder-privacy-li:after { + background-image: url("images/privacy.svg"); + content: " "; + cursor: pointer; + display: block; + height: 20px; + left: -27px; + margin-top: -10px; + position: absolute; + top: 50%; + width: 19px; +} diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/FileChoisePopup.ascx.cs b/web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/FileChoisePopup.ascx.cs index 7973ec864..8afd8976a 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/FileChoisePopup.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/FileChoisePopup.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web.UI; diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/filechoisepopup.js b/web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/filechoisepopup.js index 3626fdb1a..ce24c288a 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/filechoisepopup.js +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/filechoisepopup.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -133,6 +133,9 @@ window.FileChoisePopup = (function () { } ASC.Files.UI.displayInfoPanel(error[0], true); + }, + processUrl: function (url) { + return ASC.Files.Utility.AddExternalShareKey(url); } }); }; diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/filechoisepopup.css b/web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/filechoisepopup.less similarity index 92% rename from web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/filechoisepopup.css rename to web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/filechoisepopup.less index eedc12073..3a5940f75 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/filechoisepopup.css +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/FileChoisePopup/filechoisepopup.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + #fileChoisePopupDialod { display: none; } diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/FileSelector.ascx.cs b/web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/FileSelector.ascx.cs index 8b24d1029..195879f5e 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/FileSelector.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/FileSelector.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/fileselector.js b/web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/fileselector.js index dd204e2d8..7dab157ba 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/fileselector.js +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/fileselector.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -159,8 +159,8 @@ window.ASC.Files.FileSelector = (function () { jq("#fileSelectorDialog").toggleClass("hide-thirdparty", hide); }; - var openDialog = function (folderId, onlyFolder, thirdParty) { - isFolderSelector = !jq("#mainContent").length || onlyFolder; + var openDialog = function (data) { + isFolderSelector = !jq("#mainContent").length || data.onlyFolder; ASC.Files.FileSelector.fileSelectorTree.clickOnFolder = isFolderSelector ? checkFolder : selectFolder; @@ -170,8 +170,18 @@ window.ASC.Files.FileSelector = (function () { ASC.Files.UI.blockUI("#fileSelectorDialog", isFolderSelector ? 440 : 1030); } + jq("#fileSelectorTree").toggleClass("scrolled", data.scrolled); + + if (!data.displayPrivacy) { + var privacyFolderData = ASC.Files.FileSelector.fileSelectorTree.getFolderData(ASC.Files.Constants.FOLDER_ID_PRIVACY); + if (privacyFolderData) { + privacyFolderData.entryObject.addClass("privacy-node"); + } + } + PopupKeyUpActionProvider.EnterAction = "jq(\"#submitFileSelector\").trigger('click');"; + var thirdParty = data.thirdParty; if (typeof thirdParty != "undefined") { jq("#fileSelectorTree>ul>li:not(.third-party-entry)").toggle(!thirdParty); @@ -180,7 +190,7 @@ window.ASC.Files.FileSelector = (function () { ASC.Files.FileSelector.fileSelectorTree.rollUp(); - folderId = folderId || ASC.Files.FileSelector.fileSelectorTree.getDefaultFolderId(); + var folderId = data.folderId || ASC.Files.FileSelector.fileSelectorTree.getDefaultFolderId(); ASC.Files.FileSelector.fileSelectorTree.setCurrent(folderId); ASC.Files.FileSelector.fileSelectorTree.clickOnFolder(folderId); diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/fileselector.css b/web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/fileselector.less similarity index 87% rename from web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/fileselector.css rename to web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/fileselector.less index d56dee0ea..a8f2c5fdc 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/fileselector.css +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/FileSelector/fileselector.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,84 +15,82 @@ */ -.popup-modal { - display: none; +.popup-modal { + display: none; +} + +#fileSelectorTree { + max-height: 500px; + width: 240px; } -#fileSelectorTree { - max-height: 500px; - width: 240px; -} - -.hide-thirdparty .third-party-entry { - display: none; -} - -.only-folder #fileSelectorTree { - width: 370px; -} - -.only-folder .file-selector-files { - display: none; -} - -.file-selector-tree { - padding-right: 24px; -} - -.file-selector-files { - border-top: none; - border-right: none; - border-bottom: none; - padding-left: 24px; -} - -.file-selector-tree, -.file-selector-files { - vertical-align: top; -} - -#fileSelectorDialog .template-action, -#fileSelectorDialog .pencil, -#fileSelectorDialog .menu-small, -#fileSelectorDialog .file-lock, -#fileSelectorDialog .favorite, -#fileSelectorDialog .version, -#fileSelectorDialog .btn-row { - display: none !important; -} - -.file-selector-files #filesMainContent.compact .file-row .entry-title, -.file-selector-files #filesMainContent.compact .file-row .entry-title .name{ - max-width: 400px; - width: 400px; -} - -.file-selector-files #filesMainContent.compact .file-row .is-new { - display: none; -} - -.file-selector-single .file-row .checkbox input[type=checkbox] { - display: none; -} -.file-selector-single .file-row .checkbox input[type=radio] { - display: inline; -} - -.file-selector-compact .mainPageTable { - height: 450px; -} -.file-selector-compact .mainPageTable .mainPageContent { - padding-bottom: 0; -} -.file-selector-compact #fileSelectorTree { - height: 400px; -} -.file-selector-compact #mainContent { - height: 400px; - min-height: 400px; -} - -#fileSelectorDialog #emptyContainer .emptyScrCtrl > table { - margin: 0 auto; -} +#fileSelectorTree.scrolled { + overflow: auto; +} + +.hide-thirdparty .third-party-entry { + display: none; +} + +.only-folder #fileSelectorTree { + width: 370px; +} + +.only-folder .file-selector-files { + display: none; +} + +.file-selector-tree { + padding-right: 24px; +} + +.file-selector-files { + border-top: none; + border-right: none; + border-bottom: none; + padding-left: 24px; +} + +.file-selector-tree, +.file-selector-files { + vertical-align: top; +} + +#fileSelectorDialog .template-action, +#fileSelectorDialog .pencil, +#fileSelectorDialog .menu-small, +#fileSelectorDialog .file-lock, +#fileSelectorDialog .favorite, +#fileSelectorDialog .version, +#fileSelectorDialog .btn-row { + display: none !important; +} + +.file-selector-files #filesMainContent.compact .file-row .entry-title, +.file-selector-files #filesMainContent.compact .file-row .entry-title .name{ + max-width: 400px; + width: 400px; +} + +.file-selector-files #filesMainContent.compact .file-row .is-new { + display: none; +} + +.file-selector-single .file-row .checkbox input[type=checkbox] { + display: none; +} +.file-selector-single .file-row .checkbox input[type=radio] { + display: inline; +} + +.file-selector-compact #fileSelectorTree { + height: 400px; +} +.file-selector-compact #mainContent { + height: 400px; + min-height: 400px; +} + +#fileSelectorDialog #emptyContainer .emptyScrCtrl > table { + margin: 0 auto; +} diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContent.ascx b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContent.ascx index a5004d751..0adfcd385 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContent.ascx +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContent.ascx @@ -8,12 +8,11 @@ <%@ Import Namespace="ASC.Web.Files.Classes" %> <%@ Import Namespace="ASC.Web.Files.Resources" %> <%@ Import Namespace="ASC.Web.Files.Services.WCFService.FileOperations" %> -<%@ Import Namespace="ASC.Web.Studio.Utility" %> <%@ Import Namespace="ASC.Web.Studio.PublicResources" %> <%@ Register TagPrefix="sc" Namespace="ASC.Web.Studio.Controls.Common" Assembly="ASC.Web.Studio" %> -
    "> +
    ">
    @@ -82,7 +81,10 @@
  • <%= FilesUCResource.ButtonRestore %> ()
  • - + <% if (SecurityContext.IsAuthenticated) + { %> + + <% } %>
  • <%= FilesUCResource.ButtonRemoveFavorite %> ()
  • @@ -125,14 +127,22 @@ <%= FilesUCResource.ButtonShareAccess %>
  • <%= FilesUCResource.FormFillingSettings %>
  • - + <% if (!SecurityContext.IsAuthenticated) + { %> + + <% } %> <% if (!CoreContext.Configuration.Personal) { %>
  • diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContent.ascx.cs b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContent.ascx.cs index ca9ab1240..46e3b927c 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContent.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContent.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ using ASC.Web.Files.Services.WCFService.FileOperations; using ASC.Web.Studio.UserControls.EmptyScreens; using ASC.Web.Studio.UserControls.Management; +using ASC.Web.Studio.Utility; namespace ASC.Web.Files.Controls { @@ -42,6 +43,7 @@ public static string Location } public object FolderIDCurrentRoot { get; set; } + public object ExternalFolderIDCurrentRoot { get; set; } public String TitlePage { get; set; } @@ -52,6 +54,7 @@ public static string Location protected bool IsFirstVisit; protected bool IsVisitor; + protected bool Trial { get; set; } public void Page_Init(object sender, EventArgs e) { @@ -69,6 +72,12 @@ protected void Page_Load(object sender, EventArgs e) InitControls(); InitScripts(); + + if (TenantExtra.Saas) + { + var quota = TenantExtra.GetTenantQuota(); + Trial = quota.Trial || quota.Free; + } } private void InitControls() diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContent.ascx.designer.cs b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContent.ascx.designer.cs index 15d174336..7c0772d49 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContent.ascx.designer.cs +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContent.ascx.designer.cs @@ -1,4 +1,4 @@ -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // This code was generated by a tool. // @@ -7,11 +7,13 @@ // //------------------------------------------------------------------------------ -namespace ASC.Web.Files.Controls { - - - public partial class MainContent { - +namespace ASC.Web.Files.Controls +{ + + + public partial class MainContent + { + /// /// ListHolder control. /// @@ -20,7 +22,7 @@ public partial class MainContent { /// To modify move field declaration from designer file to code-behind file. /// protected global::System.Web.UI.WebControls.PlaceHolder ListHolder; - + /// /// confirmRemoveDialog control. /// @@ -29,7 +31,7 @@ public partial class MainContent { /// To modify move field declaration from designer file to code-behind file. /// protected global::ASC.Web.Studio.Controls.Common.Container confirmRemoveDialog; - + /// /// confirmOverwriteDialog control. /// @@ -38,7 +40,7 @@ public partial class MainContent { /// To modify move field declaration from designer file to code-behind file. /// protected global::ASC.Web.Studio.Controls.Common.Container confirmOverwriteDialog; - + /// /// changeOwnerDialog control. /// @@ -47,7 +49,7 @@ public partial class MainContent { /// To modify move field declaration from designer file to code-behind file. /// protected global::ASC.Web.Studio.Controls.Common.Container changeOwnerDialog; - + /// /// UploaderPlaceHolder control. /// @@ -56,7 +58,7 @@ public partial class MainContent { /// To modify move field declaration from designer file to code-behind file. /// protected global::System.Web.UI.WebControls.PlaceHolder UploaderPlaceHolder; - + /// /// ControlPlaceHolder control. /// diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContentFilter.ascx.cs b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContentFilter.ascx.cs index c31c3d064..ce0b12fe6 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContentFilter.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/MainContentFilter.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web.UI; diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/dark-maincontent.less b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/dark-maincontent.less new file mode 100644 index 000000000..d599902c2 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/dark-maincontent.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "maincontent.less"; +@import "../../App_Themes/dark-default/params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/maincontent.css b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/maincontent.less similarity index 92% rename from web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/maincontent.css rename to web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/maincontent.less index a7e4af78c..25b45fdce 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/maincontent.css +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainContent/maincontent.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,249 +15,251 @@ */ -#settingCommon, -#settingAdmin, -#settingThirdPartyPanel { - display: none; -} -/******************************************************************************* - header -*******************************************************************************/ -.stick-panel .menu-action-on-top { - display: list-item; -} -.stick-panel #switchViewFolder { - margin-left: 12px; -} - -/******************************************************************************* - Content Menu -*******************************************************************************/ -ul.contentMenu { - padding-top: 8px; -} -.advansed-filter { - margin-bottom: 24px; -} -/******************************************************************************* - Dialog window -*******************************************************************************/ - -div.files-remove-list { - border: 1px solid #D1D1D1; - line-height: 20px; - margin: 15px 0 0; - max-height: 300px; - overflow-x: hidden; - overflow-y: auto; - padding: 0 10px 10px; -} -.files-remove-list > dl { - margin: 0; -} -dd.confirm-remove-folders, -dd.confirm-remove-files { - padding: 0; - margin-left: 0; -} -dd.confirm-remove-folders label, -dd.confirm-remove-files label { - display: block; - overflow: hidden; - white-space: nowrap; -} -dt.confirm-remove-folders, -dt.confirm-remove-files { - font-weight: bold; - margin-top: 10px; -} -#confirmRemoveTextDescription, -#confirmRemoveSharpBoxTextDescription { - padding: 10px 0 0; -} -#overwriteMessage { - overflow: hidden; - padding-bottom: 6px; -} -.overwrite-capt, -#overwriteListShow, -#overwriteListHide { - line-height: 30px; -} -.overwrite-resolve { - display: inline-block; - margin-bottom: 1px; - padding: 8px 10px; - width: 400px; -} -.overwrite-resolve.selected { - background-color: #f2f2f2; -} -.overwrite-resolve:hover { - background-color: #e5e5e5; -} -.overwrite-resolve input { - float: left; - margin: 4px 8px 0 0; -} -.overwrite-resolve-descr { - float: left; - width: 370px; -} -.overwrite-resolve-head { - font-size: 14px; - font-weight: 600; - line-height: 22px; -} -#overwriteList { - border: 1px solid #D1D1D1; - line-height: 20px; - list-style-type: none; - margin: 0 0 15px; - max-height: 120px; - overflow-x: hidden; - overflow-y: auto; - padding: 8px 15px; -} -#overwriteList li { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - width: 365px; -} - -.change-owner-header { - max-width: 350px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.change-owner-selector { - border-bottom: 1px dotted; - max-width: 350px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -/******************************************************************************* - Panel with new items -*******************************************************************************/ -.files-news-panel .file-row:hover { - background-color: #e5e5e5; -} -.files-news-panel .thumb-file, -.files-news-panel .thumb-folder { - margin-top: 0; -} -.files-news-panel .entry-info, -.files-news-panel .file-row .entry-title .name, -.files-news-panel .file-row.folder-row .folder-row .entry-title .name { - max-width: 195px; -} -.files-news-panel .file-row { - height: 21px; -} -.files-news-panel .file-row .entry-title .name { - padding-top: 4px; -} -.files-news-panel .file-row .entry-title .name a { - font-size: 12px; -} -.files-news-panel .file-row .entry-title .name a .file-extension { - font-size: 11px; -} -.files-news-panel .entry-title { - width: auto; -} -#filesNewsList { - max-height: 300px; - padding: 0 12px; - width: 285px; -} - -#filesNewsList .file-row { - margin-bottom: 0; -} -#filesNewsList .thumb-file, -#filesNewsList .thumb-folder { - margin: 0 12px 0 0; -} -#filesNewsList .thumb-encrypted { - bottom: -5px; - right: -5px; -} -#filesNewsMarkRead { - display: inline-block; - margin: 8px 0 8px 12px; -} - -/******************************************************************************* - Panel with templates items -*******************************************************************************/ -.files-templates-panel .file-row:hover { - background-color: #e5e5e5; -} - -.files-templates-panel .thumb-file, -.files-templates-panel .thumb-folder { - margin-top: 0; -} - -.files-templates-panel .entry-info, -.files-templates-panel .file-row .entry-title .name, -.files-templates-panel .file-row.folder-row .folder-row .entry-title .name { - max-width: 195px; -} - -.files-templates-panel .file-row { - height: 21px; -} - -.files-templates-panel .file-row .entry-title .name { - padding-top: 4px; -} - -.files-templates-panel .file-row .entry-title .name a { - font-size: 12px; -} - -.files-templates-panel .file-row .entry-title .name a .file-extension { - font-size: 11px; -} - -.files-templates-panel .entry-title { - width: auto; -} - -#filesTemplateList { - max-height: 300px; - padding: 0 12px; - width: 285px; -} - -#filesTemplateList .file-row { - margin-bottom: 0; -} - -#filesTemplateList .thumb-file, -#filesTemplateList .thumb-folder { - margin: 0 12px 0 0; -} - -#filesTemplateEmpty { - display: inline-block; - margin: 8px 8px 8px 12px; -} - -#filesTemplateLoader { - display: inline-block; - margin: 8px 8px 8px 12px; -} -/******************************************************************************* - Mobile -*******************************************************************************/ -body.mobile #contentVersions .version-preview, -body.mobile #contentVersions .version-comment-edit { - display: block; +@import "../../App_Themes/default/params.less"; + +#settingCommon, +#settingAdmin, +#settingThirdPartyPanel { + display: none; +} +/******************************************************************************* + header +*******************************************************************************/ +.stick-panel .menu-action-on-top { + display: list-item; +} +.stick-panel #switchViewFolder { + margin-left: 12px; +} + +/******************************************************************************* + Content Menu +*******************************************************************************/ +ul.contentMenu { + padding-top: 8px; +} +.advansed-filter { + margin-bottom: 24px; +} +/******************************************************************************* + Dialog window +*******************************************************************************/ + +div.files-remove-list { + border: 1px solid @border-color; + line-height: 20px; + margin: 15px 0 0; + max-height: 300px; + overflow-x: hidden; + overflow-y: auto; + padding: 0 10px 10px; +} +.files-remove-list > dl { + margin: 0; +} +dd.confirm-remove-folders, +dd.confirm-remove-files { + padding: 0; + margin-left: 0; +} +dd.confirm-remove-folders label, +dd.confirm-remove-files label { + display: block; + overflow: hidden; + white-space: nowrap; +} +dt.confirm-remove-folders, +dt.confirm-remove-files { + font-weight: bold; + margin-top: 10px; +} +#confirmRemoveTextDescription, +#confirmRemoveSharpBoxTextDescription { + padding: 10px 0 0; +} +#overwriteMessage { + overflow: hidden; + padding-bottom: 6px; +} +.overwrite-capt, +#overwriteListShow, +#overwriteListHide { + line-height: 30px; +} +.overwrite-resolve { + display: inline-block; + margin-bottom: 1px; + padding: 8px 10px; + width: 400px; +} +.overwrite-resolve.selected { + background-color: @body-color-selected; +} +.overwrite-resolve:hover { + background-color: @body-color-hover-another; +} +.overwrite-resolve input { + float: left; + margin: 4px 8px 0 0; +} +.overwrite-resolve-descr { + float: left; + width: 370px; +} +.overwrite-resolve-head { + font-size: 14px; + font-weight: 600; + line-height: 22px; +} +#overwriteList { + border: 1px solid @border-color; + line-height: 20px; + list-style-type: none; + margin: 0 0 15px; + max-height: 120px; + overflow-x: hidden; + overflow-y: auto; + padding: 8px 15px; +} +#overwriteList li { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 365px; +} + +.change-owner-header { + max-width: 350px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.change-owner-selector { + border-bottom: 1px dotted; + max-width: 350px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/******************************************************************************* + Panel with new items +*******************************************************************************/ +.files-news-panel .file-row:hover { + background-color: @body-color-hover-another; +} +.files-news-panel .thumb-file, +.files-news-panel .thumb-folder { + margin-top: 0; +} +.files-news-panel .entry-info, +.files-news-panel .file-row .entry-title .name, +.files-news-panel .file-row.folder-row .folder-row .entry-title .name { + max-width: 195px; +} +.files-news-panel .file-row { + height: 21px; +} +.files-news-panel .file-row .entry-title .name { + padding-top: 4px; +} +.files-news-panel .file-row .entry-title .name a { + font-size: 12px; +} +.files-news-panel .file-row .entry-title .name a .file-extension { + font-size: 11px; +} +.files-news-panel .entry-title { + width: auto; +} +#filesNewsList { + max-height: 300px; + padding: 0 12px; + width: 285px; +} + +#filesNewsList .file-row { + margin-bottom: 0; +} +#filesNewsList .thumb-file, +#filesNewsList .thumb-folder { + margin: 0 12px 0 0; +} +#filesNewsList .thumb-encrypted { + bottom: -5px; + right: -5px; +} +#filesNewsMarkRead { + display: inline-block; + margin: 8px 0 8px 12px; +} + +/******************************************************************************* + Panel with templates items +*******************************************************************************/ +.files-templates-panel .file-row:hover { + background-color: @body-color-hover-another; +} + +.files-templates-panel .thumb-file, +.files-templates-panel .thumb-folder { + margin-top: 0; +} + +.files-templates-panel .entry-info, +.files-templates-panel .file-row .entry-title .name, +.files-templates-panel .file-row.folder-row .folder-row .entry-title .name { + max-width: 195px; +} + +.files-templates-panel .file-row { + height: 21px; +} + +.files-templates-panel .file-row .entry-title .name { + padding-top: 4px; +} + +.files-templates-panel .file-row .entry-title .name a { + font-size: 12px; +} + +.files-templates-panel .file-row .entry-title .name a .file-extension { + font-size: 11px; +} + +.files-templates-panel .entry-title { + width: auto; +} + +#filesTemplateList { + max-height: 300px; + padding: 0 12px; + width: 285px; +} + +#filesTemplateList .file-row { + margin-bottom: 0; +} + +#filesTemplateList .thumb-file, +#filesTemplateList .thumb-folder { + margin: 0 12px 0 0; +} + +#filesTemplateEmpty { + display: inline-block; + margin: 8px 8px 8px 12px; +} + +#filesTemplateLoader { + display: inline-block; + margin: 8px 8px 8px 12px; +} +/******************************************************************************* + Mobile +*******************************************************************************/ +body.mobile #contentVersions .version-preview, +body.mobile #contentVersions .version-comment-edit { + display: block; } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainMenu/MainButton.ascx b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainMenu/MainButton.ascx index 51fd9ce80..e38b99c8e 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainMenu/MainButton.ascx +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainMenu/MainButton.ascx @@ -6,7 +6,7 @@ <%@ Import Namespace="ASC.Web.Files.Resources" %> <%@ Import Namespace="ASC.Data.Storage" %> -<% if (!Global.IsOutsider) +<% if (!Global.IsOutsider && ((!ASC.Core.SecurityContext.IsAuthenticated && ExternalFolderFullAccess) || ASC.Core.SecurityContext.IsAuthenticated)) { %> diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainMenu/MainButton.ascx.cs b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainMenu/MainButton.ascx.cs index 760b55ca1..26657811a 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainMenu/MainButton.ascx.cs +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainMenu/MainButton.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web.UI; @@ -29,6 +29,8 @@ public static string Location get { return PathProvider.GetFileControlPath("MainMenu/MainButton.ascx"); } } + public bool ExternalFolderFullAccess { get; set; } + protected void Page_Load(object sender, EventArgs e) { CreateMenuHolder.Controls.Add(LoadControl(CreateMenu.Location)); diff --git a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainMenu/MainMenu.ascx b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainMenu/MainMenu.ascx index 834207ba2..ed911c46d 100644 --- a/web/studio/ASC.Web.Studio/Products/Files/Controls/MainMenu/MainMenu.ascx +++ b/web/studio/ASC.Web.Studio/Products/Files/Controls/MainMenu/MainMenu.ascx @@ -13,7 +13,7 @@
  • +
     
    [a-zA-Z]{3})\">(?[\\d\\.]+)
    - - - - - - - - - - - - - - - - - - - - -
    <%= FilesUCResource.EmbeddedSize %><%= FilesUCResource.EmbedSizeWidth %><%= FilesUCResource.EmbedSizeHeight %>
    -
    - 600 × 800 px -
    -
    -
    - 400 × 600 px -
    -
    -
    - <%= FilesUCResource.EmbedSizeAuto %> -
    -
    - - -  ×  - -
    + + + + +
    <%= string.Format(FilesJSResource.SharingSettingsEmpty, "
    ") %>
    @@ -156,8 +189,11 @@
    @@ -169,7 +205,7 @@
    -
    +
    <%= FilesUCResource.AddMessage %>:
    <%= FilesUCResource.NotifyWithChangesInRights %>
    @@ -180,7 +216,7 @@
    -
    +
    <%= FilesUCResource.AdvancedSettings %>
    ${ASC.Resources.Master.TemplateResource.MailIcsCalendarDescriptionLabel}: + ${ASC.Resources.Master.TemplateResource.MailIcsCalendarDescriptionLabel}:
    +

    {{html description}}
    - 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 DxGP)^ diff --git a/web/studio/ASC.Web.Studio/UserControls/Management/InvitePanel/css/invitepanel.less b/web/studio/ASC.Web.Studio/UserControls/Management/InvitePanel/css/invitepanel.less index 316126f91..783135cd1 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Management/InvitePanel/css/invitepanel.less +++ b/web/studio/ASC.Web.Studio/UserControls/Management/InvitePanel/css/invitepanel.less @@ -1,19 +1,21 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../../../../skins/default/params.less"; #shareInviteUserLinkPanel { margin-top: 24px; @@ -36,8 +38,8 @@ } #shareInviteUserLink { - background-color: transparent; - border-color: #DFDFDF; + background-color: @back-ground-text; + border-color: @invite-border; float: left; height: 55px; margin: 10px 0; @@ -94,6 +96,6 @@ p { font-size: 12px; margin: 0; - color: #333; + color: @textColor; } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Management/InvitePanel/js/invitepanel.js b/web/studio/ASC.Web.Studio/UserControls/Management/InvitePanel/js/invitepanel.js index 6b2c86750..99ddfc3d9 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Management/InvitePanel/js/invitepanel.js +++ b/web/studio/ASC.Web.Studio/UserControls/Management/InvitePanel/js/invitepanel.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Management/IpSecurity/IpSecurity.ascx b/web/studio/ASC.Web.Studio/UserControls/Management/IpSecurity/IpSecurity.ascx index c054cb707..c766b6081 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Management/IpSecurity/IpSecurity.ascx +++ b/web/studio/ASC.Web.Studio/UserControls/Management/IpSecurity/IpSecurity.ascx @@ -7,7 +7,7 @@ +
    /> - +
    <% if (SmsVisible) @@ -66,12 +69,40 @@
    <%= TfaAppEnable ? "" : "disabled='disabled'" %> /> - + +
    + +
    + + + + +
    diff --git a/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/SmsValidationSettings.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/SmsValidationSettings.ascx.cs index bdd516941..565c79718 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/SmsValidationSettings.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/SmsValidationSettings.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,7 +46,8 @@ public partial class SmsValidationSettings : UserControl protected void Page_Load(object sender, EventArgs e) { AjaxPro.Utility.RegisterTypeForAjax(GetType()); - Page.RegisterBodyScripts("~/UserControls/Management/SmsControls/js/smsvalidation.js"); + Page.RegisterBodyScripts("~/UserControls/Management/SmsControls/js/smsvalidation.js") + .RegisterStyle("~/UserControls/Management/SmsControls/css/smsvalidationsettings.less"); SmsVisible = StudioSmsNotificationSettings.IsVisibleSettings; SmsAvailable = StudioSmsNotificationSettings.IsAvailableSettings; diff --git a/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/css/confirmmobile.less b/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/css/confirmmobile.less index 7a31ae328..4e5e7b607 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/css/confirmmobile.less +++ b/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/css/confirmmobile.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/css/smsvalidationsettings.less b/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/css/smsvalidationsettings.less new file mode 100644 index 000000000..1b834bdef --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/css/smsvalidationsettings.less @@ -0,0 +1,96 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +#studio_smsValidationSettings { + + .line-height-min { + line-height: 10px; + } + + #restrictions-list { + + .restriction { + margin-bottom: 15px; + + .ip { + float: left; + width: 300px; + } + + .menu-item-icon { + display: inline-block; + vertical-align: middle; + cursor: pointer; + background-position: 0 0; + float: none; + margin: 0; + } + } + } + + .sms-advanced-settings { + + .header-base-small { + margin-bottom: 16px; + margin-top: 24px; + } + + .describe-text { + padding: 0 10px 7px 0; + } + + .SelectedItem { + float: left; + padding: 0 10px 7px 0; + white-space: nowrap; + } + + .image { + display: Inline-block; + position: relative; + margin: 0px 4px -2px 0px; + width: 12px; + height: 12px; + cursor: pointer; + } + + .people-image { + background: url("../../../../skins/default/images/user_12.png"); + } + + .trash-image { + background: url("../../../../skins/default/images/trash_12.png"); + } + + .group-image { + background: url("../../../../skins/default/images/group_12.png"); + } + + .smsValidation-SelectorContent > div:first-child { + float: left; + margin-right: 25px; + } + + .toggle-button { + margin: 24px 0 8px 0; + } + } + + #chk2FactorAppAuthLabel { + margin-bottom: 0px; + } +} diff --git a/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/js/changemobile.js b/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/js/changemobile.js index 12d44015c..d33a1932a 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/js/changemobile.js +++ b/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/js/changemobile.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/js/confirmmobile.js b/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/js/confirmmobile.js index 144f633f3..57dc11d08 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/js/confirmmobile.js +++ b/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/js/confirmmobile.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/js/smsvalidation.js b/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/js/smsvalidation.js index e0260d8ec..7fd55135c 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/js/smsvalidation.js +++ b/web/studio/ASC.Web.Studio/UserControls/Management/SmsControls/js/smsvalidation.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,52 +16,381 @@ ; -window.ASC.Controls.SmsValidationSettings = (function () { +window.ASC.Controls.SmsValidationSettings = new function () { + + var commonIpRegex = /^(\s*(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\s*(\-\s*(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\s*)?)$/; + var CIDRIpRegex = /^(\s*(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\s*(\/(3[012]|[12]?[0-9]))\s*)$/; + + var mainTag = jq('#studio_smsValidationSettings'), + smsAuthCbx = mainTag.find('#chk2FactorAuthEnable'), + appAuthCbx = mainTag.find('#chk2FactorAppAuthEnable'), + restrictionsList = mainTag.find('#restrictions-list'), + restrictionTmpl = mainTag.find('#restriction-tmpl'), + addRestrictionBtn = mainTag.find('#add-restriction-btn'), + emptyList = mainTag.find("#emptyUserListLabel"), + showView = mainTag.find('#show-view'), + hideView = mainTag.find('#hide-view'), + userSelectorTag = mainTag.find("#userSelector"), + groupSelectorTag = mainTag.find("#groupSelector"), + selectedUsersTag = mainTag.find('#selectedUsers'), + selectedGroupsTag = mainTag.find('#selectedGroups'); + + var tfaType = { + none: 0, + sms: 1, + app: 2 + } + + var isOpen = false; + return { - SaveSmsValidationSettings: function () { + ShowAdvancedSettings : function () { + showView.show(); + hideView.hide(); + isOpen = true; + }, + + ShowAdvancedSettingsButton: function () { + showView.hide(); + hideView.show(); + isOpen = false; + }, + HideAdvancedSettings: function () { + showView.hide(); + hideView.hide(); + }, - AjaxPro.onLoading = function (loading) { - if (loading) { - LoadingBanner.showLoaderBtn("#sms-validation-settings"); + RefreshAdvancedSettingsView: function () { + if (smsAuthCbx.is(':checked') || appAuthCbx.is(':checked')) { + if (isOpen) { + ASC.Controls.SmsValidationSettings.ShowAdvancedSettings(); } else { - LoadingBanner.hideLoaderBtn("#sms-validation-settings"); + ASC.Controls.SmsValidationSettings.ShowAdvancedSettingsButton(); } - }; + } else { + ASC.Controls.SmsValidationSettings.HideAdvancedSettings(); + } + }, + + InitMandatoryBlock: function (users = [], groups = []) { + + initUserSelector(users); + initGroupSelector(groups); + + showView.on("mouseover", ".SelectedItem", selectedItem_mouseOver); + showView.on("mouseout", ".SelectedItem", selectedItem_mouseOut); + + selectedUsersTag.on("click", "div[id^=deleteSelectedUserImg_]", deleteUserFromList); + selectedGroupsTag.on("click", "div[id^=deleteSelectedGroupImg_]", deleteGroupFromList); + + function initUserSelector(userIds) { + + userSelectorTag.useradvancedSelector({ + showGroups: true, + }).on("showList", function (event, items) { + pushUsersIntoList(items) + }); + + if (userIds.length) { + userSelectorTag.useradvancedSelector("disable", userIds); + + var users = UserManager.getUsers(userIds); + pushUsersIntoList(users); + } + } + + function initGroupSelector(groupIds) { + + groupSelectorTag.groupadvancedSelector() + .on("showList", function (event, items) { + pushGroupsIntoList(items) + }); + + if (groupIds.length) { + groupSelectorTag.groupadvancedSelector("disable", groupIds); + + var groups = GroupManager.getGroups(groupIds); + pushGroupsIntoList(groups); + } + } + + function pushUsersIntoList(users) { + + users.forEach(function (user) { + + var item = jq("
    ") + .attr("id", user.id) + .addClass("SelectedItem") + .addClass("user-item"); + + var peopleImg = jq("
    ") + .attr("class", "people-image") + .addClass("image"); + + var deleteImg = jq("
    ") + .attr("class", "trash-image") + .addClass("image") + .css("display", "none") + .attr("id", "deleteSelectedUserImg_" + user.id); + + item.append(peopleImg).append(deleteImg).append(Encoder.htmlEncode(user.title || user.displayName)); + + selectedUsersTag.append(item); + }); + + emptyList.hide(); + + var usersForDisable = users.map(a => a.id); + userSelectorTag.useradvancedSelector("disable", usersForDisable); + } + + function pushGroupsIntoList(groups) { + + groups.forEach(function (group) { + + var item = jq("
    ") + .attr("id", group.id) + .addClass("SelectedItem") + .addClass("group-item"); + + var groupImg = jq("
    ") + .attr("class", "group-image") + .addClass("image"); + + var deleteImg = jq("
    ") + .attr("class", "trash-image") + .css("display", "none") + .attr("id", "deleteSelectedGroupImg_" + group.id) + .addClass("image"); + + item.append(groupImg).append(deleteImg).append(Encoder.htmlEncode(group.title || group.name)); + + selectedGroupsTag.append(item); + }); + + emptyList.hide(); + + var groupForDisable = groups.map(a => a.id); + groupSelectorTag.groupadvancedSelector("disable", groupForDisable); + } + + function deleteUserFromList() { + var obj = jq(this); + var idComponent = obj.attr("id").split("_"); + var uId = idComponent[1]; + + obj.parent().remove(); + + if (!getSelectedUsers().length && !getSelectedGroups().length) + emptyList.show(); + + userSelectorTag.useradvancedSelector("undisable", [uId]); + + } + + function deleteGroupFromList() { + var obj = jq(this); + var idComponent = obj.attr("id").split("_"); + var gId = idComponent[1]; + + obj.parent().remove(); + + if (!getSelectedGroups().length && !getSelectedUsers().length) + emptyList.show(); + + groupSelectorTag.groupadvancedSelector("undisable", [gId]); + } + + function getSelectedUsers() { + return selectedUsersTag.find(".user-item"); + } - var smsEnable = jq("#chk2FactorAuthEnable").is(":checked"); - var tfaAppEnable = jq("#chk2FactorAppAuthEnable").is(":checked"); + function getSelectedGroups() { + return selectedGroupsTag.find(".group-item"); + } + + function selectedItem_mouseOver() { + var obj = jq(this); + obj.find(".group-image,.people-image").hide(); + obj.find(".trash-image").show(); + } + + function selectedItem_mouseOut() { + var obj = jq(this); + obj.find(".group-image,.people-image").show(); + obj.find(".trash-image").hide(); + } + }, + + InitTrustedIpBlock: function(data = []) { + + var userRestrictions = data.map(it => new Object({ ip: it })); + + bindEvents(); + renderView(); + + function bindEvents() { + addRestrictionBtn.on('click', addRestriction); + restrictionsList.on('click', '.restriction .delete-btn', deleteRestriction); + } + + function addRestriction() { + var newRestriction = restrictionTmpl.tmpl(); + addRestrictionBtn.before(newRestriction); + } + + function renderView() { + var restrictions = restrictionTmpl.tmpl(userRestrictions); + addRestrictionBtn.before(restrictions); + } + + function deleteRestriction() { + jq(this).closest('.restriction').remove(); + } + }, + + InitAdvancedSettings: function () { + + getSettings(function (params, data) { + if (data.tfaSettings) { + window.ASC.Controls.SmsValidationSettings.InitMandatoryBlock(data.tfaSettings.mandatoryUsers, data.tfaSettings.mandatoryGroups); + window.ASC.Controls.SmsValidationSettings.InitTrustedIpBlock(data.tfaSettings.trustedIps); + } + else { + window.ASC.Controls.SmsValidationSettings.InitMandatoryBlock(); + window.ASC.Controls.SmsValidationSettings.InitTrustedIpBlock(); + } + }) + + ASC.Controls.SmsValidationSettings.RefreshAdvancedSettingsView(); + + function getSettings(callback) { + + var smsDisabled = smsAuthCbx.is(':disabled'); + var appDisabled = appAuthCbx.is(':disabled'); + + if (smsDisabled && appDisabled) { + return; + } + + var smsChecked = smsAuthCbx.is(':checked'); + var appChecked = appAuthCbx.is(':checked'); + + if (smsChecked || appChecked) { + showLoader(); + } + + Teamlab.getTfaSettings({ + success: function (params, data) { + hideLoader(); + callback(params, data); + }, + error: function () { + hideLoader(); + showErrorMessage(); + } + }); + + function showLoader() { + LoadingBanner.showLoaderBtn(mainTag); + } + + function hideLoader() { + LoadingBanner.hideLoaderBtn(mainTag); + } + + function showErrorMessage() { + LoadingBanner.showMesInfoBtn(mainTag, ASC.Resources.Master.ResourceJS.CommonJSErrorMsg, 'error'); + } + } + }, + + SaveSettings: function () { var callback = { + before: function showLoader() { + LoadingBanner.showLoaderBtn(mainTag); + }, success: function (_, data) { - LoadingBanner.showMesInfoBtn("#studio_smsValidationSettings", ASC.Resources.Master.ResourceJS.SuccessfullySaveSettingsMessage, "success"); + LoadingBanner.showMesInfoBtn(mainTag, ASC.Resources.Master.ResourceJS.SuccessfullySaveSettingsMessage, "success"); if (data) { window.location.reload(true); } + else { + LoadingBanner.hideLoaderBtn(mainTag); + } }, - error: function (params, error) { - LoadingBanner.showMesInfoBtn("#studio_smsValidationSettings", error[0], "error"); + error: function (_, error) { + LoadingBanner.hideLoaderBtn(mainTag); + LoadingBanner.showMesInfoBtn(mainTag, error[0], "error"); } }; + var smsEnable = smsAuthCbx.is(":checked"); + var tfaAppEnable = appAuthCbx.is(":checked"); + + if (!smsEnable && !tfaAppEnable) { + Teamlab.tfaAppAuthSettings(tfaType.none, null, [], [], callback); + return; + } + + var formTrustedIP = []; + restrictionsList.find('.restriction .ip').each(function (idx, el) { + formTrustedIP.push(jq(el).val()); + }); + + var trustedIPForSave = []; + for (var i = 0; i < formTrustedIP.length; i++) { + var r = formTrustedIP[i].replace(/\s/g, ''); + if (r == '') { + continue; + } + + if (!commonIpRegex.test(r) && !CIDRIpRegex.test(r)) { + LoadingBanner.showMesInfoBtn(mainTag, ASC.Resources.Master.ResourceJS.IncorrectIPAddressFormatError, 'error'); + return; + } + + if (~trustedIPForSave.indexOf(r)) { + LoadingBanner.showMesInfoBtn(mainTag, ASC.Resources.Master.ResourceJS.SameIPRestrictionError, 'error'); + return; + } else { + trustedIPForSave.push(r); + } + } + + var mandatoryUsersForSave = [], + mandatoryGroupsForSave = []; + + var selectedUsers = mainTag.find(".user-item"), + selectedGroups = mainTag.find(".group-item"); + + selectedUsers.each(function (idx, el) { + mandatoryUsersForSave.push(jq(el).attr("id")); + }); + + selectedGroups.each(function (idx, el) { + mandatoryGroupsForSave.push(jq(el).attr("id")); + }); + if (smsEnable) { - Teamlab.tfaAppAuthSettings("sms", callback); - } else if (tfaAppEnable) { - Teamlab.tfaAppAuthSettings("app", callback); + Teamlab.tfaAppAuthSettings(tfaType.sms, trustedIPForSave, mandatoryUsersForSave, mandatoryGroupsForSave, callback); } else { - Teamlab.tfaAppAuthSettings("none", callback); + Teamlab.tfaAppAuthSettings(tfaType.app, trustedIPForSave, mandatoryUsersForSave, mandatoryGroupsForSave, callback); } } }; -})(); +}; (function () { jq(function () { - jq("#studio_smsValidationSettings").on("click", "#chk2FactorAuthSave:not(.disable)", ASC.Controls.SmsValidationSettings.SaveSmsValidationSettings); - jq("input[name=\"chk2FactorAuth\"]").on("change", function () { - jq("#chk2FactorAuthSave").removeClass("disable"); - }); + ASC.Controls.SmsValidationSettings.InitAdvancedSettings(); + + jq("#chk2FactorAuthSave").on("click", ASC.Controls.SmsValidationSettings.SaveSettings); + + jq('#studio_smsValidationSettings input[type="radio"]').on("change", ASC.Controls.SmsValidationSettings.RefreshAdvancedSettingsView); }); })(); \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/SmtpSettings.ascx b/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/SmtpSettings.ascx index b72cbdfb3..ef09fd172 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/SmtpSettings.ascx +++ b/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/SmtpSettings.ascx @@ -16,6 +16,7 @@ + @@ -62,6 +63,10 @@ +
    + + +
    <%= Resource.SenderName %>:
    diff --git a/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/SmtpSettings.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/SmtpSettings.ascx.cs index c8667bb8f..9721f7e69 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/SmtpSettings.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/SmtpSettings.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -74,7 +74,7 @@ protected void Page_Load(object sender, EventArgs e) Page.ClientScript.RegisterClientScriptBlock(GetType(), "smtpsettings_style", string.Format("", - WebPath.GetPath("UserControls/Management/SmtpSettings/css/smtpsettings.css")), false); + WebPath.GetPath("UserControls/Management/SmtpSettings/css/smtpsettings.less")), false); Page.RegisterInlineScript(GetSmtpSettingsInitInlineScript(), true, false); } diff --git a/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/css/smtpsettings.css b/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/css/smtpsettings.less similarity index 93% rename from web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/css/smtpsettings.css rename to web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/css/smtpsettings.less index b6768adde..6dfe300a3 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/css/smtpsettings.css +++ b/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/css/smtpsettings.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,103 +15,103 @@ */ -.smtp-settings-text { - margin-bottom: 28px; -} - -.smtp-settings-item { - margin: 0 0 10px 0; - width: 350px; -} -.smtp-settings-item label { - margin: 1px 0 0 0; - display: inline-block; - font-weight: bold; - vertical-align: top; -} -.smtp-settings-item input[type="checkbox"] { - margin-left: 0; -} -.smtp-settings-title { - font-weight: bold; - margin-bottom: 5px; -} -.smtp-settings-field { - width: 345px; -} -.smtp-settings-item .host { - float: left; - margin-right: 15px; -} -.smtp-settings-item .port{ - float: right; -} -.smtp-settings-item .host .smtp-settings-field { - width: 270px; -} -.smtp-settings-item .port .smtp-settings-field{ - width: 50px; -} -#smtpSettingsButtonSave, -#smtpSettingsButtonDefault, -#smtpSettingsButtonTest - { - margin-bottom: 15px; -} - -#smtpSettingsView .smtp-settings-item label { - font-weight: normal; -} - -#smtpSettingsView .smtp-settings-title { - margin-bottom: 6px; -} - -#smtpSettingsView .smtp-settings-item { - margin-bottom: 13px; -} - -#smtpSettingsView .middle-button-container { - margin-top: 23px; - width: 530px; -} - -#smtpSettingsView .textEdit { - padding: 1px; -} - -#settingsSwitch { - padding-left: 0; - margin-bottom: 11px; -} - -#settingsSwitch #settingsSwitchHeader { - font-weight: bold; - margin-top: 2px; - margin-bottom: 15px; -} - -#noDomainsMsg a { - text-decoration: underline; -} - -#noDomainsMsg a:hover { - text-decoration: none; -} - -#notificationLogin { - float: left; - width: 165px; - margin-bottom: 10px; -} - -#notificationHostDomainSplitter { - float: left; - width: 11px; - margin: 0 2px; -} - -#notificationDomain { - width: 165px; - height: 20px; +.smtp-settings-text { + margin-bottom: 28px; +} + +.smtp-settings-item { + margin: 0 0 10px 0; + width: 350px; +} +.smtp-settings-item label { + margin: 1px 0 0 0; + display: inline-block; + font-weight: bold; + vertical-align: top; +} +.smtp-settings-item input[type="checkbox"] { + margin-left: 0; +} +.smtp-settings-title { + font-weight: bold; + margin-bottom: 5px; +} +.smtp-settings-field { + width: 345px; +} +.smtp-settings-item .host { + float: left; + margin-right: 15px; +} +.smtp-settings-item .port{ + float: right; +} +.smtp-settings-item .host .smtp-settings-field { + width: 270px; +} +.smtp-settings-item .port .smtp-settings-field{ + width: 50px; +} +#smtpSettingsButtonSave, +#smtpSettingsButtonDefault, +#smtpSettingsButtonTest + { + margin-bottom: 15px; +} + +#smtpSettingsView .smtp-settings-item label { + font-weight: normal; +} + +#smtpSettingsView .smtp-settings-title { + margin-bottom: 6px; +} + +#smtpSettingsView .smtp-settings-item { + margin-bottom: 13px; +} + +#smtpSettingsView .middle-button-container { + margin-top: 23px; + width: 530px; +} + +#smtpSettingsView .textEdit { + padding: 1px; +} + +#settingsSwitch { + padding-left: 0; + margin-bottom: 11px; +} + +#settingsSwitch #settingsSwitchHeader { + font-weight: bold; + margin-top: 2px; + margin-bottom: 15px; +} + +#noDomainsMsg a { + text-decoration: underline; +} + +#noDomainsMsg a:hover { + text-decoration: none; +} + +#notificationLogin { + float: left; + width: 165px; + margin-bottom: 10px; +} + +#notificationHostDomainSplitter { + float: left; + width: 11px; + margin: 0 2px; +} + +#notificationDomain { + width: 165px; + height: 20px; } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/js/smtpsettings.js b/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/js/smtpsettings.js index 71683b16e..c4ae7d131 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/js/smtpsettings.js +++ b/web/studio/ASC.Web.Studio/UserControls/Management/SmtpSettings/js/smtpsettings.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -218,7 +218,7 @@ window.SmtpSettingsView = function ($) { } function bindChanges() { - $("#smtpSettingsView input") + $("#smtpSettingsView input[type=\"text\"]") .off('input') .on('input', function() { @@ -343,10 +343,12 @@ window.SmtpSettingsView = function ($) { function changeSettingsAuthenticationRequired() { var checked = $customSettingsBox.find("#customSettingsAuthenticationRequired").is(":checked"), $loginEl = $customSettingsBox.find(".host-login"), - $passwordEl = $customSettingsBox.find(".host-password"); + $passwordEl = $customSettingsBox.find(".host-password"), + $useNtlm = $customSettingsBox.find("#customSettingsUseNtlm"); $loginEl.find(".textEdit").prop("disabled", !checked); $passwordEl.find(".textEdit").prop("disabled", !checked); + $useNtlm.attr("disabled", !checked); $loginEl.toggleClass('requiredField', checked); $passwordEl.toggleClass('requiredField', checked); @@ -387,7 +389,8 @@ window.SmtpSettingsView = function ($) { $authCheckbox = $customSettingsBox.find("#customSettingsAuthenticationRequired"), $loginEl = $customSettingsBox.find(".host-login .textEdit"), $passwordEl = $customSettingsBox.find(".host-password .textEdit"), - $sslCheckbox = $customSettingsBox.find("#customSettingsEnableSsl"); + $sslCheckbox = $customSettingsBox.find("#customSettingsEnableSsl"), + $useNtlm = $customSettingsBox.find("#customSettingsUseNtlm"); $hostEl.prop("disabled", disable); $portEl.prop("disabled", disable); @@ -400,6 +403,7 @@ window.SmtpSettingsView = function ($) { $senderAddressEl.prop("disabled", disable); $sslCheckbox.prop("disabled", disable); + $useNtlm.attr("disabled", disable); if (!disable) changeSettingsAuthenticationRequired(); @@ -433,7 +437,8 @@ window.SmtpSettingsView = function ($) { settings1.senderDisplayName === settings2.senderDisplayName && settings1.senderAddress === settings2.senderAddress && settings1.enableSSL === settings2.enableSSL && - settings1.enableAuth === settings2.enableAuth; + settings1.enableAuth === settings2.enableAuth && + settings1.useNtlm === settings2.useNtlm; } function getSettingsForTest() { @@ -450,7 +455,8 @@ window.SmtpSettingsView = function ($) { credentialsUserPassword = $customSettingsBox.find(".host-password .textEdit").val(), senderDisplayName = $customSettingsBox.find(".display-name .textEdit").val(), senderAddress = $customSettingsBox.find(".email-address .textEdit").val(), - enableSsl = $customSettingsBox.find("#customSettingsEnableSsl").is(":checked"); + enableSsl = $customSettingsBox.find("#customSettingsEnableSsl").is(":checked"), + useNtlm = $customSettingsBox.find("#customSettingsUseNtlm").is(":checked"); host = !host ? "" : host.trim(); port = !port ? null : parseInt(port); @@ -501,7 +507,8 @@ window.SmtpSettingsView = function ($) { senderDisplayName: senderDisplayName, senderAddress: senderAddress, enableSSL: enableSsl, - enableAuth: enableAuth + enableAuth: enableAuth, + useNtlm: useNtlm } : null; } @@ -549,7 +556,8 @@ window.SmtpSettingsView = function ($) { senderDisplayName: $box.find("#currentSenderDisplayName").val(), senderAddress: $box.find("#currentSenderAddress").val(), enableSSL: $("#currentEnableSsl").val().toLowerCase() === "true", - enableAuth: $("#currentEnableAuth").val().toLowerCase() === "true" + enableAuth: $("#currentEnableAuth").val().toLowerCase() === "true", + useNtlm: $("#currentUseNtlm").val().toLowerCase() === "true" }; } @@ -566,7 +574,8 @@ window.SmtpSettingsView = function ($) { senderDisplayName: "", senderAddress: "", enableSSL: false, - enableAuth: false + enableAuth: false, + useNtlm: false }; } @@ -707,7 +716,8 @@ window.SmtpSettingsView = function ($) { senderDisplayName: mailserverSettings.senderDisplayName, senderAddress: res.email, enableSSL: res.smtp_encryption_type === "STARTTLS" || res.smtp_encryption_type === "SSL", - enableAuth: true + enableAuth: true, + useNtlm: false }; Teamlab.savePortalSmtpSettings(null, settings, { diff --git a/web/studio/ASC.Web.Studio/UserControls/Management/StorageSettings/StorageSettings.ascx b/web/studio/ASC.Web.Studio/UserControls/Management/StorageSettings/StorageSettings.ascx index 0e9b78848..3f1445a0c 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Management/StorageSettings/StorageSettings.ascx +++ b/web/studio/ASC.Web.Studio/UserControls/Management/StorageSettings/StorageSettings.ascx @@ -15,21 +15,18 @@ + + diff --git a/web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/css/dark_productquotes_style.less b/web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/css/dark_productquotes_style.less new file mode 100644 index 000000000..adf43b3bc --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/css/dark_productquotes_style.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "productquotes_style.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/css/productquotes_style.less b/web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/css/productquotes_style.less index 1893e36c4..048f9a7b7 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/css/productquotes_style.less +++ b/web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/css/productquotes_style.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,42 @@ */ +@import "../../../../skins/default/params.less"; + +.memoryQuotaBlock{ + margin-bottom: 45px; +} +div.recalculate { + margin: 0 auto 30px auto; + width: 600px; +} +.recalculateQuotaBlock { + background: no-repeat url('../../../../skins/default/images/svg/settings/recalculate_quota.svg') 60px 40px transparent; + background-size: 150px; + height: 255px; + display: flex; + padding-left: 225px; + justify-content: center; + align-items: center; + text-decoration: none; + outline: none; + + .inner { + .background { + } + + .title { + display: block; + margin: 0 0 12px 0; + } + + .description { + display: block; + line-height: 20px; + margin-bottom: 15px; + } + } +} .informationBlock { tr:not(:last-child) td { padding: 0px 16px 8px 0; @@ -24,7 +60,173 @@ padding: 0px 16px 0 0; } } +.editUsersQuotaForm { + display: inline-block; +} +p.lastUpdate{ + color: #787878; + font-size: 11px; +} + +#peopleHeaderMenu.no-quota { + .menuActionSelectAll, + .editUsersQuotaForm, + .menuEditQuota, + .menuNoQuota { + display: none !important; + } +} +.menuActionSelectAll, +.editUsersQuotaForm, +.menuEditQuota, +.menuNoQuota { + &.display-none { + display: none !important; + } +} +.quotaSettingBlock { + .set-quota { + margin-top: 7px; + } +} +#tableForPeopleNavigation { + height: 24px; + width: 100%; + + .tl-combobox { + margin-bottom: 1px; + vertical-align: middle; + } +} +#totalUsers { + margin-right: 20px; +} +#peopleContent { + .used-space-info { + width: 115px; + + .dotted { + position: relative; + padding-left: 2px; + + &:after { + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid @textColorGrayDark; + content: ""; + height: 0; + position: absolute; + right: -10px; + top: 50%; + width: 0; + margin-top: -1px; + } + } + } + + .item-icon { + width: 16px; + height: 16px; + margin: 0 5px 0 0; + float: left; + + .item-svg { + width: 16px; + height: 16px; + fill: @textColorGrayDark; + } + } +} + +#peopleHeaderMenu, +#peopleContent, +.quotaSettingBlock { + .set-quota.display-none { + display: none; + } + + .set-quota { + display: flex; + width: 100%; + color: @textColor; + + input { + width: 45px; + height: 20px; + margin-right: 3px; + } + + .sizes { + width: auto; + padding-top: 1px; + margin-right: 8px; + cursor: pointer; + + .val { + border: solid 1px @borderColor2; + padding: 3px 22px 0px 4px; + height: 19px; + margin-top: -1px; + position: relative; + background: @body-color; + + &:after { + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid @textColorGrayDark; + content: ""; + height: 0; + position: absolute; + right: 7px; + top: 50%; + width: 0; + margin-top: -1px; + } + } + } + + .save-btn { + position: relative; + cursor: pointer; + width: 23px; + height: 23px; + border: 1px solid @border-button-default; + border-radius: 3px; + margin-right: 5px; + background: @body-color; + + .mark { + position: absolute; + width: 8px; + height: 5px; + right: 6px; + top: 6px; + border: 3px solid @textColorGrayDark; + transform: rotate(-45deg); + border-width: 0 0 3px 3px; + } + } + + .close-btn { + position: relative; + cursor: pointer; + width: 23px; + height: 23px; + border: 1px solid @border-button-default; + border-radius: 3px; + background: @body-color; + .mark { + background: url('../../../../skins/default/images/svg/people/close.svg') center no-repeat; + background-size: contain; + display: block; + margin: 5px 0px 0px 6px; + width: 12px; + height: 12px; + } + } + } +} .quotesBlock { margin: 0 0 45px 0; @@ -112,7 +314,7 @@ } .tabs-header-corner { - background: url(../img/corner.png) center no-repeat; + background: url("../img/@{corner-img}") center no-repeat; position: absolute; width: 11px; height: 7px; diff --git a/web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/img/corner-dark.png b/web/studio/ASC.Web.Studio/UserControls/Statistics/ProductQuotes/img/corner-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b394858d01d720808448929c81e33c283e6f116b GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^+(69E!3HGn;3F{FaAcEU+s1_utNsng! 0) { + toastr.success(ASC.Resources.Master.ResourceJS.QuotaEnabled); + } + }, + before: LoadingBanner.displayLoading, + after: LoadingBanner.hideLoading, + error: function (params, errors) { + + toastr.error(errors); + } + }); + } + + function saveQuota(userId, row) { + closeEditForm(row) + + var quotaLimit = parseInt(row.find(".set-user-quota-form input").val()); + var quotaVal = row.find(".edit-quota-val").attr("data-id"); + var quota = -1; + + switch (quotaVal) { + case '0': //bytes + quota = quotaLimit; + break; + case '1': + quota = quotaLimit * 1024; + break; + case '2': + quota = parseInt(quotaLimit * Math.pow(1024, 2)) + break; + case '3': + quota = parseInt(quotaLimit * Math.pow(1024, 3)) + break; + case '4': + quota = parseInt(quotaLimit * Math.pow(1024, 4)) + break; + } + var filter = {}; + filter.fields = 'id,userName,email,avatarSmall,displayName,usedSpace,docsSpace,mailSpace,talkSpace,quotaLimit'; + var data = { userIds: [userId], quota: quota }; + Teamlab.updateUserQuota({}, + data, + { + filter: filter, + success: function (params, data) { + var profiles = performProfiles(data); + updateProfiles(params, profiles); + if (data[0].quotaLimit > 0) { + toastr.success(ASC.Resources.Master.ResourceJS.QuotaEnabled); + } + }, + before: LoadingBanner.displayLoading, + after: LoadingBanner.hideLoading, + error: function (params, errors) { + + toastr.error(errors); + } + }); + } + + function renderProfiles(params, data) { + var selectedIDs = new Array(); + for (var i = 0, n = _selectedItems.length; i < n; i++) { + selectedIDs.push(_selectedItems[i].id); + } + + var existsGroupManager = false; + var filteredByGroup = jq.getAnchorParam('group', ASC.Controls.AnchorController.getAnchor()); + for (var i = 0, n = data.length; i < n; i++) { + var index = jq.inArray(data[i].id, selectedIDs); + data[i].isChecked = index != -1; + data[i].isGroupManager = data[i].groups.some(function (group) { + if (filteredByGroup) { + return filteredByGroup == group.id && group.manager == data[i].userName; + } + + return group.manager == data[i].userName; + }); + + existsGroupManager = existsGroupManager || data[i].isGroupManager; + } + + if (filteredByGroup && existsGroupManager) + data = data.sort(function (item) { return (-1) * item.isGroupManager; }); + + _peopleList = data; + + var $o = jq.tmpl("userListTemplate", + { + users: data, + isAdmin: Teamlab.profile.isAdmin || window.ASC.Resources.Master.IsProductAdmin, + quotaEnabled: jq("#quota-enabled").is(":checked") + }); + + + jq("#peopleData tbody").empty().append($o); + bindEvents(jq($o)); + jq(window).trigger('people-render-profiles', [params, data]); + + checkFullSelection(); + renderSimplePageNavigator(); + } + + var onButtonClick = function (evt) { + var $this = jq(this); + + peopleActions.callMethodByClassname($this.attr('class'), this, [evt, $this]); + jq(document.body).trigger('click'); + }; + + function onGetProfiles(params, profiles) { + profiles = performProfiles(profiles); + if (profiles != null && profiles.length > 0) { + renderProfiles(params, profiles); + jq("#emptyContentForPeopleFilter").addClass("display-none"); + jq(".people-content").removeClass("display-none"); + showGroupActionMenu(); + } else { + jq(window).trigger('people-render-profiles', [params, profiles]); + jq(".people-content").addClass("display-none"); + jq("#emptyContentForPeopleFilter").removeClass("display-none"); + } + //scroll on top + jq("#peopleHeaderMenu .on-top-link").trigger("click"); + }; + + function thisSection(cur, ne) { + if (cur == null || ne == null) + return false; + + cur = jq.removeParam('p', cur); + cur = jq.removeParam('c', cur); + cur = jq.removeParam('sortby', cur); + cur = jq.removeParam('sortorder', cur); + cur = jq.removeParam('query', cur); + + ne = jq.removeParam('p', ne); + ne = jq.removeParam('c', ne); + ne = jq.removeParam('sortby', ne); + ne = jq.removeParam('sortorder', ne); + ne = jq.removeParam('query', ne); + + return jq.isEqualAnchors(jq.anchorToObject(ne), jq.anchorToObject(cur)); + }; + + function onAnchChange() { + + var newAnchor = ASC.Controls.AnchorController.getAnchor(); + if (currentAnchor === newAnchor) { + return undefined; + } else { + var newAnchorObj = jq.anchorToObject(newAnchor); + var currentAnchorObj = currentAnchor != null ? jq.anchorToObject(currentAnchor) : null; + if (!newAnchorObj.hasOwnProperty("sortorder")) { + if (currentAnchorObj != null && currentAnchorObj.hasOwnProperty("sortby") && currentAnchorObj.hasOwnProperty("sortorder")) { + newAnchorObj["sortby"] = currentAnchorObj["sortby"]; + newAnchorObj["sortorder"] = currentAnchorObj["sortorder"]; + } else { + newAnchorObj["sortby"] = ASC.Resources.Master.userDisplayFormat == 1 ? "firstname" : "lastname"; + newAnchorObj["sortorder"] = "ascending"; + if (currentAnchorObj == null && (Teamlab.profile.isAdmin || window.ASC.Resources.Master.IsProductAdmin)) { + //check if active users exist + var needActiveFilterAsDefault = false; + var users = window.UserManager.getAllUsers(true); + for (var userId in users) { + if (!users.hasOwnProperty(userId)) continue; + var user = users[userId]; + if (user.isActivated === true && user.isOwner === false) { + needActiveFilterAsDefault = true; + break; + } + } + + if (needActiveFilterAsDefault) { + newAnchorObj["employeestatus"] = "active"; + } + } + } + } + + newAnchor = jq.objectToAnchor(newAnchorObj); + if (!thisSection(currentAnchor, newAnchor)) { + newAnchor = jq.removeParam('p', newAnchor); + newAnchor = jq.removeParam('c', newAnchor); + } + ASC.Controls.AnchorController.safemove(newAnchor); + currentAnchor = newAnchor; + } + + pageNavigator.CurrentPageNumber = 1; + setPaginationCookie(1, "pageOfProfilesList"); + searchQuery(); + jq(window).trigger('change-group', [jq.getAnchorParam("group") || null]); + }; + + + function showUserActionMenu(personId) { + var $person = jq("#user_" + personId), + email = $person.attr("data-email"), + username = $person.attr("data-username"), + status = $person.attr("data-status"), + isOwner = $person.attr("data-isOwner"), + isVisitor = $person.attr("data-isVisitor"), + $actionMenu = jq("#editQuotaMenu"), + + isLDAP = $person.attr("data-isLDAP"), + isSSO = $person.attr("data-isSSO"); + + var profile = { + id: personId, + email: email, + username: username, + status: status, + isOwner: isOwner, + isLDAP: isLDAP, + isSSO: isSSO + }; + + var $menu = jq.tmpl("userQuotaMenuTemplate", + { user: profile }); + $actionMenu.html($menu); + + var $buttons = $actionMenu.find(".dropdown-item"); + $buttons.on("click", function (e) { + $actionMenu.hide(); + var $row = jq("#user_" + personId); + if (jq(this).hasClass("no-quota")) { + resetQuota(personId, $row) + } + else if (jq(this).hasClass("edit-quota")) { + $row.find(".user-quota-info").addClass("display-none"); + $row.find(".set-user-quota-form").removeClass("display-none"); + } + else if (jq(this).hasClass("block-profile")) { + changeUserStatusAction(personId, 2, isVisitor); + } + + }); + } + + function initPeopleQuotaMenu() { + + jq.dropdownToggle({ + dropdownID: "editQuotaMenu", + switcherSelector: "#peopleData .quota-action", + addTop: 2, + addLeft: -2, + fixWinSize: true, + showFunction: function (switcherObj, dropdownItem) { + var personId = switcherObj.attr("id").split('_')[1]; + if (!personId) { + return; + } + showUserActionMenu(personId); + + }, + hideFunction: function () { + + } + }); + }; + var init = function () { + + if (isInit !== false) { + return undefined; + } + isInit = true; + + + pageNavigator = ASC.UserQuotaController.PageNavigator.pgNavigator; + + initAdvansedFilter(); + + initPeopleQuotaMenu(); + initButtonsEvents(); + + ASC.Controls.AnchorController.bind(onAnchChange); + + }; + + + + var getAnchorByFilterParams = function (filters) { + var newAnchor = {}, + filter = null; + for (var i = 0, n = filters.length; i < n; i++) { + filter = filters[i]; + switch (filter.id) { + case "sorter": + newAnchor.sortby = filter.params.id; + newAnchor.sortorder = filter.params.sortOrder; + break; + case "text": + newAnchor.query = encodeURIComponent(filter.params.value); + break; + case "selected-employee-status-active": + case "selected-employee-status-disabled": + newAnchor.employeestatus = filter.params.value; + break; + case "selected-activation-status-active": + case "selected-activation-status-pending": + newAnchor.activationstatus = filter.params.value; + break; + case "selected-type-admin": + case "selected-type-user": + case "selected-type-visitor": + newAnchor.type = filter.params.value; + break; + case "selected-group": + newAnchor.group = filter.params.id; + break; + } + } + return newAnchor; + }; + + var setFilter = function (evt, $container, filter, filterparams, filters) { + + pageNavigator.CurrentPageNumber = 1; + setPaginationCookie(1, "pageOfProfilesList"); + + deselectAll(); + var + oldAnchor = ASC.Controls.AnchorController.getAnchor(), + newAnchor = getAnchorByFilterParams(filters); + + if (filter.id === "text") { + oldAnchor = jq.removeParam('p', oldAnchor); + oldAnchor = jq.removeParam('c', oldAnchor); + } + + oldAnchor = jq.anchorToObject(oldAnchor); + newAnchor = jq.mergeAnchors(oldAnchor, newAnchor); + + if (!jq.isEqualAnchors(newAnchor, oldAnchor)) { + ASC.Controls.AnchorController.move(jq.objectToAnchor(newAnchor)); + } + }; + + var resetFilter = function (evt, $container, filter, filters) { + pageNavigator.CurrentPageNumber = 1; + setPaginationCookie(1, "pageOfProfilesList"); + deselectAll(); + var + oldAnchor = jq.anchorToObject(ASC.Controls.AnchorController.getAnchor()), + newAnchor = getAnchorByFilterParams(filters); + + if (filter.id === "text") { + currentAnchor = jq.removeParam('query', currentAnchor); + } + if (!jq.isEqualAnchors(newAnchor, oldAnchor)) { + ASC.Controls.AnchorController.move(jq.objectToAnchor(newAnchor)); + } + if (filter.id === "text") { + return searchQuery(); + } + }; + + function searchQuery() { + var cookieCount = jq.cookies.get("countOfProfilesList"); + if (cookieCount) { + pageNavigator.EntryCountOnPage = cookieCount.key; + } + cookieCount = jq.cookies.get("pageOfProfilesList"); + if (cookieCount) { + pageNavigator.CurrentPageNumber = cookieCount.key; + } + var + pageCount = pageNavigator.EntryCountOnPage, + page = pageNavigator.CurrentPageNumber, + type = jq.getAnchorParam("type") || null, + employeestatus = jq.getAnchorParam("employeestatus") || null, + activationstatus = jq.getAnchorParam("activationstatus") || null, + groupId = jq.getAnchorParam("group") || null, + sortby = jq.getAnchorParam("sortby") || ASC.People.Data.userDisplayFormat == 1 ? "firstname" : "lastname", + sortorder = jq.getAnchorParam("sortorder") == "descending" || false, + search = decodeURIComponent(jq.getAnchorParam("query")); + + page = isFinite(+page) ? + page : 0; + jq("#countOfRows").val(pageCount).tlCombobox(); + + var params = { + sortby: sortby, + sortorder: sortorder, + page: page, + type: type, + employeestatus: employeestatus, + activationstatus: activationstatus, + groupId: groupId, + query: search + }; + + var filter = getRequestFilter({ + StartIndex: (page > 0 ? page - 1 : page) * pageCount, + Count: pageCount, + sortby: sortby, + sortorder: sortorder, + employeestatus: employeestatus, + activationstatus: activationstatus + }); + + Teamlab.getProfilesByFilter(params, { + filter: filter, + before: function () { + if (!isFirstLoad) { + showLoader(); + }; + }, + after: function () { + isFirstLoad ? hideFirstLoader() : hideLoader(); + }, + success: onGetProfiles + }); + + if (!type && !status && !groupId && !search.length) { + jq('#peopleFilter').advansedFilter(null); + } + }; + + var resetAllFilters = function () { + pageNavigator.CurrentPageNumber = 1; + setPaginationCookie(1, "pageOfProfilesList"); + deselectAll(); + currentAnchor = jq.removeParam('query', currentAnchor); + ASC.Controls.AnchorController.move(""); + }; + + var moveToPage = function (page) { + pageNavigator.CurrentPageNumber = page; + setPaginationCookie(page, "pageOfProfilesList"); + searchQuery(); + }; + + var changeCountOfRows = function (newValue) { + if (isNaN(newValue)) { + return; + } + var newCountOfRows = newValue * 1; + pageNavigator.EntryCountOnPage = newCountOfRows; + setPaginationCookie(newCountOfRows, "countOfProfilesList"); + ASC.UserQuotaController.moveToPage("1"); + }; + + var setPaginationCookie = function (value, cookieKey) { + if (cookieKey && cookieKey != "") { + var cookie = { + key: value + }; + jq.cookies.set(cookieKey, cookie, { path: location.pathname }); + } + }; + + + var showGroupActionMenu = function () { + jq("#peopleHeaderMenu").show(); + //call ScrolledGroupMenu.stickMenuToTheTop + jq(window).trigger("scroll"); + }; + var lockMainActions = function () { + jq("#peopleHeaderMenu").find(".menuEditQuota, .menuNoQuota").removeClass("unlockAction").off("click"); + }; + + var checkForLockMainActions = function () { + var $changeQuotaButton = jq("#peopleHeaderMenu .menuEditQuota"), + $resetQuotaButton = jq("#peopleHeaderMenu .menuNoQuota"); + + if (_selectedItems.length === 0) { + closeEditUsersQuotaForm(); + lockMainActions(); + return; + } else { + $changeQuotaButton.addClass("unlockAction"); + $resetQuotaButton.addClass("unlockAction"); + } + + }; + + var selectAll = function (obj) { + var isChecked = jq(obj).is(":checked"); + + var selectedIDs = new Array(); + for (var i = 0, n = _selectedItems.length; i < n; i++) { + selectedIDs.push(_selectedItems[i].id); + } + + for (var i = 0, len = _peopleList.length; i < len; i++) { + var peopleItem = _peopleList[i]; + var index = jq.inArray(peopleItem.id, selectedIDs); + if (isChecked && index == -1) { + _selectedItems.push(peopleItem); + selectedIDs.push(peopleItem.id); + jq("#user_" + peopleItem.id).addClass("selected"); + jq("#checkUser_" + peopleItem.id).prop("checked", true); + } + if (!isChecked && index != -1) { + _selectedItems.splice(index, 1); + selectedIDs.splice(index, 1); + jq("#user_" + peopleItem.id).removeClass("selected"); + jq("#checkUser_" + peopleItem.id).prop("checked", false); + } + } + renderSelectedCount(_selectedItems.length); + checkForLockMainActions(); + }; + + var selectRow = function () { + var id = jq(this).attr("id").split("_")[1].trim(); + selectItem(id, !jq("#checkUser_" + id).is(":checked")); + }; + + var selectCheckbox = function (e) { + var id = jq(this).attr("id").split("_")[1].trim(); + selectItem(id, this.checked); + if (!e) { + e = window.event; + } + e.cancelBubble = true; + if (e.stopPropagation) { + e.stopPropagation(); + } + }; + + var selectItem = function (id, value) { + var selectedUser = null; + for (var i = 0, n = _peopleList.length; i < n; i++) { + if (id == _peopleList[i].id) { + selectedUser = _peopleList[i]; + } + } + var selectedIDs = new Array(); + for (i = 0, n = _selectedItems.length; i < n; i++) { + selectedIDs.push(_selectedItems[i].id); + } + + var index = jq.inArray(id, selectedIDs); + + jq("#checkUser_" + id).prop("checked", value === true); + if (value) { + jq("#user_" + id).addClass("selected"); + if (index == -1 && selectedUser != null) { + _selectedItems.push(selectedUser); + } + checkFullSelection(); + } else { + jq("#mainSelectAll").prop("checked", false); + jq("#user_" + id).removeClass("selected"); + if (index != -1) { + _selectedItems.splice(index, 1); + } + } + + renderSelectedCount(_selectedItems.length); + checkForLockMainActions(); + }; + + var deselectAll = function () { + _selectedItems = new Array(); + jq("#peopleData input:checkbox").prop("checked", false); + jq("#mainSelectAll").prop("checked", false); + jq("#peopleData tr.selected").removeClass("selected"); + renderSelectedCount(_selectedItems.length); + lockMainActions(); + }; + + var checkFullSelection = function () { + var rowsCount = jq("#peopleData tbody tr").length; + var selectedRowsCount = jq("#peopleData input[id^=checkUser_]:checked").length; + jq("#mainSelectAll").prop("checked", rowsCount == selectedRowsCount); + }; + + var renderSelectedCount = function (count) { + if (count > 0) { + jq("#peopleHeaderMenu .menu-action-checked-count > span").text(jq.format("{0} selected", count)); //TODO + jq("#peopleHeaderMenu .menu-action-checked-count").show(); + } else { + jq("#peopleHeaderMenu .menu-action-checked-count > span").text(""); + jq("#peopleHeaderMenu .menu-action-checked-count").hide(); + } + }; + + var renderSimplePageNavigator = function () { + jq("#peopleHeaderMenu .menu-action-simple-pagenav").html(""); + var $simplePN = jq("
    "); + var lengthOfLinks = 0, + $prevBtn = jq("#tableForPeopleNavigation .pagerPrevButtonCSSClass"), + $nextBtn = jq("#tableForPeopleNavigation .pagerNextButtonCSSClass"); + if ($prevBtn.length != 0) { + lengthOfLinks++; + $prevBtn.clone().appendTo($simplePN); + } + if ($nextBtn.length != 0) { + lengthOfLinks++; + if (lengthOfLinks === 2) { + jq(" ").clone().appendTo($simplePN); + } + $nextBtn.clone().appendTo($simplePN); + } + if ($simplePN.children().length != 0) { + $simplePN.appendTo("#peopleHeaderMenu .menu-action-simple-pagenav"); + jq("#peopleHeaderMenu .menu-action-simple-pagenav").show(); + } else { + jq("#peopleHeaderMenu .menu-action-simple-pagenav").hide(); + } + }; + + var editUsersQuota = function () { + jq("#peopleHeaderMenu").find(".menuEditQuota, .menuNoQuota").removeClass("unlockAction").removeClass("menuAction").addClass("display-none"); + jq("#peopleHeaderMenu").find(".editUsersQuotaForm").removeClass("display-none"); + }; + var setNoUsersQuota = function () { + var users = jq.extend(true, [], _selectedItems); + var userIds = users.map(function (user) { + return user.id; + }); + saveUsersQuotaLimit(userIds, -1); + }; + + var saveUsersQuotaLimit = function (users, quota) { + + var data = { userIds: users, quota: quota }; + + Teamlab.updateUserQuota({}, data, + { + success: function (params, data) { + var profiles = performProfiles(data); + updateProfiles(params, profiles); + if (data[0].quotaLimit > 0) { + toastr.success(ASC.Resources.Master.ResourceJS.QuotaEnabled); + } + }, + before: LoadingBanner.displayLoading, + after: LoadingBanner.hideLoading, + error: function (params, errors) { + + toastr.error(errors); + } + }); + } + + //redraw user rows + + var updateProfiles = function (params, data) { + for (var i = 0, n = data.length; i < n; i++) { + var profile = data[i]; + profile.isChecked = true; + + var $row = jq.tmpl("userListTemplate", + { + users: [profile], + isAdmin: Teamlab.profile.isAdmin || window.ASC.Resources.Master.IsProductAdmin, + quotaEnabled: jq("#quota-enabled").is(":checked") + }); + jq("#user_" + profile.id).replaceWith($row); + + for (var j = 0, m = _peopleList.length; j < m; j++) { + if (profile.id == _peopleList[j].id) { + _peopleList[j] = profile; + } + } + + for (var k = 0, l = _selectedItems.length; k < l; k++) { + if (profile.id == _selectedItems[k].id) { + _selectedItems[k] = profile; + } + } + bindEvents(jq($row)); + } + }; + + //init functions + + var initAdvansedFilter = function () { + var filters = new Array(); + + filters.push( + { + type: "combobox", + id: "selected-activation-status-active", + title: ASC.Resources.Master.ResourceJS.LblActive, + filtertitle: ASC.Resources.Master.ResourceJS.SelectorEmail, + group: ASC.Resources.Master.ResourceJS.SelectorEmail, + groupby: "selected-activation-status-value", + options: [ + { value: "active", classname: "active", title: ASC.Resources.Master.ResourceJS.LblActive, def: true }, + { value: "pending", classname: "pending", title: ASC.Resources.Master.ResourceJS.LblPending } + ], + hashmask: "type/{0}" + }, + { + type: "combobox", + id: "selected-activation-status-pending", + title: ASC.Resources.Master.ResourceJS.LblPending, + filtertitle: ASC.Resources.Master.ResourceJS.SelectorEmail, + group: ASC.Resources.Master.ResourceJS.SelectorEmail, + groupby: "selected-activation-status-value", + options: [ + { value: "active", classname: "active", title: ASC.Resources.Master.ResourceJS.LblActive }, + { value: "pending", classname: "pending", title: ASC.Resources.Master.ResourceJS.LblPending, def: true } + ], + hashmask: "type/{0}" + }, + { + type: "combobox", + id: "selected-type-admin", + title: ASC.Resources.Master.Admin, + filtertitle: ASC.Resources.Master.ResourceJS.SelectorType, + group: ASC.Resources.Master.ResourceJS.SelectorType, + groupby: "selected-profile-type-value", + options: [ + { value: "admin", classname: "admin", title: ASC.Resources.Master.Admin, def: true }, + { value: "user", classname: "user", title: ASC.Resources.Master.User }, + { value: "visitor", classname: "visitor", title: ASC.Resources.Master.Guest } + ], + hashmask: "type/{0}" + }, + { + type: "combobox", + id: "selected-type-user", + title: ASC.Resources.Master.User, + filtertitle: ASC.Resources.Master.ResourceJS.SelectorType, + group: ASC.Resources.Master.ResourceJS.SelectorType, + groupby: "selected-profile-type-value", + options: [ + { value: "admin", classname: "admin", title: ASC.Resources.Master.Admin }, + { value: "user", classname: "user", title: ASC.Resources.Master.User, def: true }, + { value: "visitor", classname: "visitor", title: ASC.Resources.Master.Guest } + ], + hashmask: "type/{0}" + }, + { + type: "combobox", + id: "selected-type-visitor", + title: ASC.Resources.Master.Guest, + filtertitle: ASC.Resources.Master.ResourceJS.SelectorType, + group: ASC.Resources.Master.ResourceJS.SelectorType, + groupby: "selected-profile-type-value", + options: [ + { value: "admin", classname: "admin", title: ASC.Resources.Master.Admin }, + { value: "user", classname: "user", title: ASC.Resources.Master.User }, + { value: "visitor", classname: "visitor", title: ASC.Resources.Master.Guest, def: true } + ], + hashmask: "type/{0}" + }, + { + type: "group", + id: "selected-group", + title: ASC.Resources.Master.Department, + group: ASC.Resources.Master.ResourceJS.LblOther, + hashmask: "group/{0}" + }); + + ASC.UserQuotaController.advansedFilter = jq("#peopleFilter").advansedFilter({ + //zindex : true, + maxfilters: -1, + anykey: false, + store: false, + hintDefaultDisable: true, + sorters: + [ + { id: "firstname", title: ASC.Resources.Master.ResourceJS.FirstName, dsc: false, def: ASC.Resources.Master.userDisplayFormat == 1 }, + { id: "lastname", title: ASC.Resources.Master.ResourceJS.LastName, dsc: false, def: ASC.Resources.Master.userDisplayFormat == 2 } + ], + filters: filters + }) + .on("setfilter", ASC.UserQuotaController.setFilter) + .on("resetfilter", ASC.UserQuotaController.resetFilter) + .on("resetallfilters", ASC.UserQuotaController.resetAllFilters); + + }; + + var initButtonsEvents = function () { + + var $sizeQuotaSelect = jq("#peopleHeaderMenu").find(".edit-quota-val"); + var sizeNames = ASC.Resources.Master.FileSizePostfix ? ASC.Resources.Master.FileSizePostfix.split(',') : ["bytes", "KB", "MB", "GB", "TB"]; + + $sizeQuotaSelect.prop('title', sizeNames[0]); + $sizeQuotaSelect.text(sizeNames[0]); + + $sizeQuotaSelect.advancedSelector({ + height: 30 * sizeNames.length, + itemsSelectedIds: [0], + onechosen: true, + showSearch: false, + itemsChoose: sizeNames.map(function (item, index) { return { id: index, title: item } }), + sortMethod: function () { return 0; } + }) + .on("showList", + function (event, item) { + $sizeQuotaSelect.html(item.title).attr("title", item.title).attr('data-id', item.id); + }); + + jq("#peopleHeaderMenu").on("click", ".menuEditQuota.unlockAction", function () { + editUsersQuota(); + return false; + }); + + jq("#peopleHeaderMenu").on("click", ".menuNoQuota.unlockAction", function () { + setNoUsersQuota(); + return false; + }); + + jq("#peopleHeaderMenu").on("click", ".close-btn", function () { + closeEditUsersQuotaForm(); + return false; + }); + + jq("#peopleHeaderMenu").on("click", ".save-btn", function () { + var users = jq.extend(true, [], _selectedItems) + var userIds = users.map(function (user) { + return user.id; + }); + + var quotaLimit = parseInt(jq("#peopleHeaderMenu").find(".set-user-quota-form input").val()); + var quotaVal = jq("#peopleHeaderMenu").find(".edit-quota-val").attr("data-id"); + var quota = -1; + + switch (quotaVal) { + case '0': + quota = quotaLimit; + break; + case '1': + quota = quotaLimit * 1024; + break; + case '2': + quota = parseInt(quotaLimit * Math.pow(1024, 2)) + break; + case '3': + quota = parseInt(quotaLimit * Math.pow(1024, 3)) + break; + case '4': + quota = parseInt(quotaLimit * Math.pow(1024, 4)) + break; + } + saveUsersQuotaLimit(userIds, quota); + }); + + jq("#peopleHeaderMenu").on("click", "#mainDeselectAll", function () { + deselectAll(); + return false; + }); + + jq("#peopleHeaderMenu").on("click", ".on-top-link", function () { + window.scrollTo(0, 0); + document.querySelector('.mainPageContent').scrollTo(0, 0); + return false; + }); + + + //navigation panel + jq("#tableForPeopleNavigation").on("change", "select", function () { + changeCountOfRows(this.value); + }); + + }; + + function closeEditUsersQuotaForm() { + jq("#peopleHeaderMenu").find(".menuEditQuota, .menuNoQuota").addClass("unlockAction").addClass("menuAction").removeClass("display-none"); + jq("#peopleHeaderMenu").find(".editUsersQuotaForm").addClass("display-none"); + } + + return { + init: init, + setFilter: setFilter, + resetFilter: resetFilter, + moveToPage: moveToPage, + + resetAllFilters: resetAllFilters, + + selectAll: selectAll, + selectRow: selectRow, + selectCheckbox: selectCheckbox, + searchQuery: searchQuery + }; +})(); + +function onRenderProfiles(evt, params, data) { + jq('#peopleFilter').advansedFilter({ + nonetrigger: true, + hintDefaultDisable: true, + sorters: [ + { id: params.sortby, dsc: params.sortorder } + ], + filters: [ + { + id: 'text', + params: { value: params.query } + }, + { + id: 'selected-group', + params: params.groupId ? { id: params.groupId } : null + }, + { + id: 'selected-employee-status-active', + params: params.employeestatus ? { value: params.employeestatus } : null + }, + { + id: 'selected-employee-status-disabled', + params: params.employeestatus ? { value: params.employeestatus } : null + }, + { + id: 'selected-activation-status-active', + params: params.activationstatus ? { value: params.activationstatus } : null + }, + { + id: 'selected-activation-status-pending', + params: params.activationstatus ? { value: params.activationstatus } : null + }, + { + id: 'selected-type-admin', + params: params.type ? { value: params.type } : null + }, + { + id: 'selected-type-user', + params: params.type ? { value: params.type } : null + }, + { + id: 'selected-type-visitor', + params: params.type ? { value: params.type } : null + } + ] + }); + if (params.groupId || params.employeestatus || params.activationstatus || params.type) { + jq('#peopleFilter').addClass("has-filters"); + } +} + +jq(document).ready(function () { + var $peopleData = jq("#peopleData"); + if (!$peopleData.length) return; + + ASC.UserQuotaController.PageNavigator.init(); + ASC.UserQuotaController.init(); + + jq(window).on('people-render-profiles', onRenderProfiles); + $peopleData.on("click", ".check-list", ASC.UserQuotaController.selectRow); + $peopleData.on("click", ".checkbox-user", ASC.UserQuotaController.selectCheckbox); +}); diff --git a/web/studio/ASC.Web.Studio/UserControls/Statistics/TenantStatisticsProvider.cs b/web/studio/ASC.Web.Studio/UserControls/Statistics/TenantStatisticsProvider.cs index c031a9356..547a84ce9 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Statistics/TenantStatisticsProvider.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Statistics/TenantStatisticsProvider.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/VisitorsChart.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/VisitorsChart.ascx.cs index 01d6706be..fa57309fd 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/VisitorsChart.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/VisitorsChart.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/css/visitorschart_style.less b/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/css/visitorschart_style.less index 5cec34f05..bfd7ef561 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/css/visitorschart_style.less +++ b/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/css/visitorschart_style.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/js/tooltip.js b/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/js/tooltip.js index 3b80f2b0e..456093c59 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/js/tooltip.js +++ b/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/js/tooltip.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/js/visitorschart.js b/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/js/visitorschart.js index 25e2cdd5e..78c8a273b 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/js/visitorschart.js +++ b/web/studio/ASC.Web.Studio/UserControls/Statistics/VisitorsChart/js/visitorschart.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/AuthCommunications/AuthCommunications.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Users/AuthCommunications/AuthCommunications.ascx.cs index d405c732b..ed5d0c590 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/AuthCommunications/AuthCommunications.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Users/AuthCommunications/AuthCommunications.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/AuthCommunications/js/authcommunications.js b/web/studio/ASC.Web.Studio/UserControls/Users/AuthCommunications/js/authcommunications.js index dddbe60ba..ea00e4526 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/AuthCommunications/js/authcommunications.js +++ b/web/studio/ASC.Web.Studio/UserControls/Users/AuthCommunications/js/authcommunications.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/ResendInvitesControl/ResendInvitesControl.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Users/ResendInvitesControl/ResendInvitesControl.ascx.cs index 91e743614..2d66ac28a 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/ResendInvitesControl/ResendInvitesControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Users/ResendInvitesControl/ResendInvitesControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/ResendInvitesControl/js/resendinvitescontrol.js b/web/studio/ASC.Web.Studio/UserControls/Users/ResendInvitesControl/js/resendinvitescontrol.js index 9240ebb6f..30b539a90 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/ResendInvitesControl/js/resendinvitescontrol.js +++ b/web/studio/ASC.Web.Studio/UserControls/Users/ResendInvitesControl/js/resendinvitescontrol.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/TipsSettings/TipsSettings.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Users/TipsSettings/TipsSettings.ascx.cs index 81603f277..bbc5ef8a8 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/TipsSettings/TipsSettings.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Users/TipsSettings/TipsSettings.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/TipsSettings/css/tipssettings.less b/web/studio/ASC.Web.Studio/UserControls/Users/TipsSettings/css/tipssettings.less index ba731d42e..c9f19879a 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/TipsSettings/css/tipssettings.less +++ b/web/studio/ASC.Web.Studio/UserControls/Users/TipsSettings/css/tipssettings.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/TipsSettings/js/tipssettings.js b/web/studio/ASC.Web.Studio/UserControls/Users/TipsSettings/js/tipssettings.js index 98efa3292..66e48427a 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/TipsSettings/js/tipssettings.js +++ b/web/studio/ASC.Web.Studio/UserControls/Users/TipsSettings/js/tipssettings.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/UserConnections.ascx b/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/UserConnections.ascx index 65a3a3ed0..4bc65338a 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/UserConnections.ascx +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/UserConnections.ascx @@ -1,4 +1,4 @@ -<%@ Control Language="C#" Debug="true" AutoEventWireup="true" CodeBehind="UserConnections.ascx.cs" Inherits="ASC.Web.Studio.UserControls.Users.UserConnections" %> +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UserConnections.ascx.cs" Inherits="ASC.Web.Studio.UserControls.Users.UserConnections" %> <%@ Import Namespace="ASC.FederatedLogin.LoginProviders" %> <%@ Import Namespace="ASC.Web.Studio.PublicResources" %> <%@ Register TagPrefix="sc" Namespace="ASC.Web.Studio.Controls.Common" Assembly="ASC.Web.Studio" %> diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/UserConnections.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/UserConnections.ascx.cs index c764b0a30..8a07b8f08 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/UserConnections.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/UserConnections.ascx.cs @@ -1,24 +1,26 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web; using System.Web.UI; +using ASC.Web.Core.Utility; + namespace ASC.Web.Studio.UserControls.Users { public partial class UserConnections : UserControl @@ -38,8 +40,15 @@ protected override void OnInit(EventArgs e) { base.OnInit(e); - Page.RegisterBodyScripts("~/UserControls/Users/UserConnections/js/connections_manager.js") - .RegisterStyle("~/UserControls/Users/UserConnections/css/connections.less"); + Page.RegisterBodyScripts("~/UserControls/Users/UserConnections/js/connections_manager.js"); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Users/UserConnections/css/dark-connections.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Users/UserConnections/css/connections.less"); + } } } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/css/connections.less b/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/css/connections.less index 447f1db1a..407b04e2a 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/css/connections.less +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/css/connections.less @@ -1,26 +1,28 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../../../../skins/default/params.less"; #emptyDbipSwitcher { height: 18px; } table.tableBase tbody tr:hover { - background-color: #FFFFFF; + background-color: @body-color; } .platform, .browser, .country, .city, .this-connection { diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/css/dark-connections.less b/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/css/dark-connections.less new file mode 100644 index 000000000..087533459 --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/css/dark-connections.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "connections.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/js/connections_manager.js b/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/js/connections_manager.js index d12237041..d6d4f1bd3 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/js/connections_manager.js +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserConnections/js/connections_manager.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + jq(document).ready(function () { jq("#emptyDbipSwitcher").on("click", function () { jq(this).helper({ diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/AccountLinkControl.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/AccountLinkControl.ascx.cs index d8e688e1b..712ee097e 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/AccountLinkControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/AccountLinkControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/ConfirmationDeleteUser.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/ConfirmationDeleteUser.ascx.cs index bdf95cf6d..31f3ce7f0 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/ConfirmationDeleteUser.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/ConfirmationDeleteUser.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web; using System.Web.UI; diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/LoadPhotoControl.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/LoadPhotoControl.ascx.cs index 67dd5f928..5e7524b69 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/LoadPhotoControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/LoadPhotoControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ using ASC.Core.Users; using ASC.Web.Core.Users; +using ASC.Web.Core.Utility; namespace ASC.Web.Studio.UserControls.Users.UserProfile { @@ -57,9 +58,15 @@ protected override void OnInit(EventArgs e) MainImgUrl = UserPhotoManager.GetPhotoAbsoluteWebPath(User.ID); ThumbnailSettings = UserPhotoThumbnailSettings.LoadForUser(User.ID); } - - Page.RegisterStyle("~/UserControls/Users/UserProfile/css/loadphoto_style.less", - "~/UserControls/Users/UserProfile/css/jquery.jcrop.less") + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Users/UserProfile/css/dark-loadphoto_style.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Users/UserProfile/css/loadphoto_style.less"); + } + Page.RegisterStyle("~/UserControls/Users/UserProfile/css/jquery.jcrop.less") .RegisterBodyScripts("~/js/uploader/ajaxupload.js", "~/UserControls/Users/UserProfile/js/loadphoto.js", "~/UserControls/Users/UserProfile/js/jquery.jcrop.js"); diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/PwdTool.ascx b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/PwdTool.ascx index 70c0a09c5..2e6b69a0f 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/PwdTool.ascx +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/PwdTool.ascx @@ -18,6 +18,9 @@ @@ -129,4 +135,9 @@ { %> <% } %> + +<% if (CanImpersonateUser) + { %> + + <% } %> <% } %> \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileActions.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileActions.ascx.cs index 7ee30d242..e6dba1727 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileActions.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileActions.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,9 +22,11 @@ using ASC.Core; using ASC.Core.Users; +using ASC.Web.Core.Utility; using ASC.Web.Studio.Core.Notify; using ASC.Web.Studio.Core.Users; using ASC.Web.Studio.PublicResources; +using ASC.Web.Studio.UserControls.Management.ImpersonateUser; using ASC.Web.Studio.UserControls.Users.UserProfile; using LdapMapping = ASC.ActiveDirectory.Base.Settings.LdapSettings.MappingFields; @@ -48,6 +50,7 @@ public static string Location protected bool HasActions; protected bool IsAdmin; protected string SubscribeBtnText; + protected bool CanImpersonateUser; protected void Page_Load(object sender, EventArgs e) { @@ -76,6 +79,13 @@ Page is MyStaff ReassignDataLink = "Reassigns.aspx?user=" + HttpUtility.UrlEncode(ProfileHelper.UserInfo.UserName); + CanImpersonateUser = ImpersonationSettings.CanImpersonateUser(ProfileHelper.UserInfo.ID); + + if (CanImpersonateUser) + { + _confirmationImpersonateUser.Controls.Add(LoadControl(ImpersonateUserConfirmationPanel.Location)); + } + LdapFields = ASC.ActiveDirectory.Base.Settings.LdapSettings.GetImportedFields; if (Request.Params["email_change"] == "success") diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileActions.ascx.designer.cs b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileActions.ascx.designer.cs index 85a054735..ba2d8c3ac 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileActions.ascx.designer.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileActions.ascx.designer.cs @@ -7,11 +7,13 @@ // //------------------------------------------------------------------------------ -namespace ASC.Web.Studio.UserControls.Users { - - - public partial class UserProfileActions { - +namespace ASC.Web.Studio.UserControls.Users +{ + + + public partial class UserProfileActions + { + /// /// _phConfirmationDeleteUser control. /// @@ -20,5 +22,14 @@ public partial class UserProfileActions { /// To modify move field declaration from designer file to code-behind file. /// protected global::System.Web.UI.WebControls.PlaceHolder _phConfirmationDeleteUser; + + /// + /// _confirmationImpersonateUser control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.PlaceHolder _confirmationImpersonateUser; } } diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileControl.ascx b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileControl.ascx index d4bf8b13e..08b70ee8b 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileControl.ascx +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileControl.ascx @@ -7,6 +7,8 @@ <%@ Import Namespace="ASC.Web.Studio.UserControls.Users.UserProfile" %> <%@ Import Namespace="ASC.Web.Studio.Utility" %> <%@ Import Namespace="ASC.Web.Studio.PublicResources" %> +<%@ Import Namespace="ASC.Web.Core.Utility" %> +<%@ Import Namespace="ASC.Core" %> <%@ Register TagPrefix="sc" Namespace="ASC.Web.Studio.Controls.Common" Assembly="ASC.Web.Studio" %>
    @@ -48,6 +50,53 @@
    <% } %>
    + +
    + <%= Resource.QuotaUsed %> + <%= UsedSpace %> + + <% if (EnableUserQuota) + { %> +
    + <%= Resource.QuotaUsedOutOf %> + <%= QuotaLimit %> + +
    + <% } %> + +
    @@ -107,6 +156,14 @@
    <% } %> + <% if (Lead != null) + { %> +
    + <%= CustomNamingPeople.Substitute("UserLead").HtmlEncode() %>: + <%= Lead.DisplayUserName() %> +
    + <% } %> + <% if (Actions.AllowEdit && UserInfo.Status != EmployeeStatus.Terminated && UserInfo.ActivationStatus == EmployeeActivationStatus.Activated && !UserInfo.IsLDAP() && !UserInfo.IsSSO()) { %>
    @@ -249,6 +306,32 @@
    <% } %> + <% if (UserInfo.IsMe()) + { %> +
    +
    + <%= Resource.InterfaceTheme %> + <%= Resource.Show %> + +
    + + +
    + <% }%> <% if (!String.IsNullOrEmpty(UserInfo.Notes.HtmlEncode())) { %>
    diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileControl.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileControl.ascx.cs index 2626d7a8d..ed35a1add 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ using System; using System.Collections.Generic; -using System.Configuration; using System.Linq; using System.Web; using System.Web.UI; @@ -27,6 +26,7 @@ using ASC.Core.Users; using ASC.Web.Core; using ASC.Web.Core.Users; +using ASC.Web.Core.Utility; using ASC.Web.Studio.Core; using ASC.Web.Studio.Core.TFA; using ASC.Web.Studio.Core.Users; @@ -51,6 +51,8 @@ protected class RoleUser protected UserInfo UserInfo { get; set; } + protected UserInfo Lead { get; set; } + protected bool ShowSocialLogins { get; set; } protected bool EnableOauth { get; set; } @@ -70,6 +72,11 @@ protected class RoleUser protected bool IsAdmin { get; set; } protected bool IsVisitor { get; set; } + protected bool EnableUserQuota { get; set; } + + protected string QuotaLimit { get; set; } + protected string UsedSpace { get; set; } + protected int HappyBirthday { get; set; } @@ -96,15 +103,34 @@ public static string Location { get { return "~/UserControls/Users/UserProfile/UserProfileControl.ascx"; } } - + protected ModeThemeSettings ChosenMode { get; set; } protected void Page_Load(object sender, EventArgs e) { + ChosenMode = ModeThemeSettings.GetModeThemesSettings(); if (UserProfileHelper == null) { UserProfileHelper = new ProfileHelper(SecurityContext.CurrentAccount.ID.ToString()); } + UserInfo = UserProfileHelper.UserInfo; + + if (!IsPersonal && UserInfo.Lead.HasValue) + { + Lead = CoreContext.UserManager.GetUsers(UserInfo.Lead.Value); + } + + var quotaSettings = TenantUserQuotaSettings.Load(); + var userQuotaSettings = UserQuotaSettings.LoadForUser(UserInfo.ID); + + EnableUserQuota = quotaSettings.EnableUserQuota; + + + var quotaLimit = userQuotaSettings != null ? userQuotaSettings.UserQuota : quotaSettings.DefaultUserQuota; + QuotaLimit = FileSizeComment.FilesSizeToString(quotaLimit); + UsedSpace = FileSizeComment.FilesSizeToString(UserInfo.UsedSpace); + + ShowSocialLogins = UserInfo.IsMe(); EnableOauth = CoreContext.Configuration.Standalone || @@ -144,8 +170,15 @@ protected void Page_Load(object sender, EventArgs e) _deleteProfileContainer.Options.IsPopup = true; - Page.RegisterStyle("~/UserControls/Users/UserProfile/css/userprofilecontrol_style.less") - .RegisterBodyScripts(VirtualPathUtility.ToAbsolute("~/UserControls/Users/UserProfile/js/userprofilecontrol.js")); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Users/UserProfile/css/dark-userprofilecontrol_style.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Users/UserProfile/css/userprofilecontrol_style.less"); + } + Page.RegisterBodyScripts(VirtualPathUtility.ToAbsolute("~/UserControls/Users/UserProfile/js/userprofilecontrol.js")); if (Actions.AllowEdit) { @@ -194,7 +227,7 @@ protected void Page_Load(object sender, EventArgs e) } } - if (TfaAppAuthSettings.IsVisibleSettings && TfaAppAuthSettings.Enable && TfaAppUserSettings.EnableForUser(UserInfo.ID) && (UserInfo.IsMe() || IsAdmin)) + if (TfaAppAuthSettings.IsVisibleSettings && TfaAppAuthSettings.TfaEnabledForUser(UserInfo.ID) && TfaAppUserSettings.EnableForUser(UserInfo.ID) && (UserInfo.IsMe() || IsAdmin)) { ShowTfaAppSettings = true; diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileEditControl.ascx b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileEditControl.ascx index 53eef51af..33bf0e328 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileEditControl.ascx +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileEditControl.ascx @@ -4,6 +4,8 @@ <%@ Import Namespace="ASC.Web.Core.Utility" %> <%@ Import Namespace="ASC.Web.Studio.Core.Users" %> <%@ Import Namespace="ASC.Web.Studio.PublicResources" %> +<%@ Import Namespace="ASC.Core" %> +<%@ Import Namespace="ASC.Core.Users" %>
    @@ -119,7 +121,7 @@
    <% } %> @@ -146,17 +148,17 @@

    <%= Resource.TemporaryPasswordToAccess %>

    - +  
    @@ -219,6 +221,24 @@ <% } %> + <%--Lead--%> + <% if (!IsPersonal) { %> +
    + + + + <% } %> + <%--Location--%> diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileEditControl.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileEditControl.ascx.cs index 5707c2eec..e3cefc9ad 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileEditControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/UserProfileEditControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -78,6 +78,7 @@ protected class RoleUser protected string Position; protected string Place; protected string Login; + protected UserInfo Lead; protected string Comment; protected string ProfileGender; protected string PhotoPath = UserPhotoManager.GetDefaultPhotoAbsoluteWebPath(); @@ -92,10 +93,7 @@ protected class RoleUser protected string UserTypeSelectorGuestItemClass; protected string UserTypeSelectorUserItemClass; - protected int UserPasswordMinLength; - protected bool UserPasswordUpperCase; - protected bool UserPasswordDigits; - protected bool UserPasswordSpecSymbols; + protected PasswordSettings TenantPasswordSettings; protected string PageTitle = Resource.CreateNewProfile; protected string ButtonText = Resource.AddButton; @@ -242,6 +240,14 @@ private void RegisterBodyScript() { Page.RegisterBodyScripts("~/js/third-party/xregexp.js", "~/UserControls/Users/UserProfile/js/userprofileeditcontrol.js") .RegisterStyle("~/UserControls/Users/UserProfile/css/profileeditcontrol_style.less"); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Users/UserProfile/css/dark-profileeditcontrol_style.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Users/UserProfile/css/profileeditcontrol_style.less"); + } } public bool CanAddVisitor() @@ -299,12 +305,7 @@ private void InitUserTypeSelector() private void InitPasswordSettings() { - var passwordSettings = PasswordSettings.Load(); - - UserPasswordMinLength = passwordSettings.MinLength; - UserPasswordDigits = passwordSettings.Digits; - UserPasswordSpecSymbols = passwordSettings.SpecSymbols; - UserPasswordUpperCase = passwordSettings.UpperCase; + TenantPasswordSettings = PasswordSettings.Load(); } private void InitProfileFields(ProfileHelper profileHelper) @@ -314,6 +315,10 @@ private void InitProfileFields(ProfileHelper profileHelper) Email = Profile.Email.HtmlEncode(); Phone = Profile.MobilePhone.HtmlEncode(); Position = Profile.Title.HtmlEncode(); + if (!IsPersonal && Profile.Lead.HasValue) + { + Lead = CoreContext.UserManager.GetUsers(Profile.Lead.Value); + } Place = Profile.Location.HtmlEncode(); Login = Profile.UserName.HtmlEncode(); Comment = Profile.Notes.HtmlEncode(); diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/accountlink_style.less b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/accountlink_style.less index ac2a595f2..21adc6811 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/accountlink_style.less +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/accountlink_style.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/dark-loadphoto_style.less b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/dark-loadphoto_style.less new file mode 100644 index 000000000..e81a1b806 --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/dark-loadphoto_style.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "loadphoto_style.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/dark-profileeditcontrol_style.less b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/dark-profileeditcontrol_style.less new file mode 100644 index 000000000..a310b6ece --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/dark-profileeditcontrol_style.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "profileeditcontrol_style.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/dark-userprofilecontrol_style.less b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/dark-userprofilecontrol_style.less new file mode 100644 index 000000000..b91cdebe6 --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/dark-userprofilecontrol_style.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "userprofilecontrol_style.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/images/birthday.png b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/images/birthday.png deleted file mode 100644 index 339fd8391bc6999c567ceb9cf7f29a06895cb804..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 646 zcmV;10(t$3P)1uYGv2HDSCJZIm?7a$7Sg6HC|gBhi=uMVN-3nMgttIJd;G}IJH@eTU9#ko;`XVh$nTW8qnI{g@NGn z#ko`-aiyXF03qN(M}6+*TOG{!F{Gr(pI9v}{O{cL*1Ip=7lXeL*D4FR|E&HgaL18R zwxiH!4`?o_e%!7c3BZlR$D2q62)q>%%M)bnIf7nWh|G@lToOXGD9IIsg^~2*8Bk`+|7F zA+{oE>R42OQRA^wz-vaQ_92AD!Dm<05J?M=!V+4G4kVs0Fvb#wg1`u1k-G96lu`$-Sa<9Qx| z@8kPE#u$t-geJsVOBjX&7JJ6I_o&;k)=Gg$8uhLBk#D}PIO1P)vw + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/images/user-blocked.png b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/images/user-blocked.png deleted file mode 100644 index 45011a07f0c3990e46e584080b687b49dfba5456..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 931 zcmV;U16=%xP)~AY^agn`T-DpXPj)cSd9mEm==hB9@3|2vVO|5^Zhug)b zQk{KSS$evlAT6L4G`ph5(3Njl70Ai=3BO-Yp<<;H)L{Op8NG;j9R@q`4!GiW>&d*l zl!6-6qGoJa&aPBy>q&Svl9Qt+kfT(9+|c+&Eo!bR$3Q`cQaybxm%g8yn-Y*4Pxc;a zt@kp@0?H4HO!i~qxW{8F$VqN$0Pc04WPlf5)E*X@znGDs$B-{OKrV8Un;QRmrZX&l zOsqq_p1$C8>LGZ3H#0LS(3TwJBB!}{9RGV6JI%zp+6?ZONOev)UtN$7r70xrCyL;1_rRIVc?blzuCvJ-WA~`+R)bI+?&YC*Zegz zn}s{J3RhNJyHed + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/loadphoto_style.less b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/loadphoto_style.less index a8bc56912..3a18c4837 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/loadphoto_style.less +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/loadphoto_style.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ */ +@import "../../../../skins/default/params.less"; + #userPhotoDialog { .containerHeaderBlock table { width: 100%; @@ -24,8 +26,8 @@ text-align: center; height: 166px; padding-top: 84px; - background: #FCFCFC; - border: 1px solid #bfbfbf; + background: @user-photo-dialog; + border: 1px solid @user-photo-dialog-bor; .header-base { margin-bottom: 32px; @@ -51,7 +53,7 @@ .preview-image-container { position: relative; - + .empty-selection { color: white; background-color: rgba(0,0,0,0.7); diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/profileeditcontrol_style.less b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/profileeditcontrol_style.less index cf26526ec..b450dd392 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/profileeditcontrol_style.less +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/profileeditcontrol_style.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,12 +15,13 @@ */ -@border-color: #D1D1D1; -@active-color: #999999; +@import "../../../../skins/default/params.less"; +@border-color: @borderColor; +@active-color: @textColorBlackLight; @default-color: #EBEBEB; .profile-photo-block { - border: 1px solid #BFBFBF; + border: 1px solid @addition-info; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; @@ -56,7 +57,7 @@ } .action-block { - border-top: 1px solid #BFBFBF; + border-top: 1px solid @addition-info; cursor: pointer; padding: 8px 0; text-align: center; @@ -64,7 +65,7 @@ width: 200px; div { - color: #000; + color: @bg-a-activate; display: inline-block; font-weight: bold; margin-top: 6px; @@ -436,13 +437,13 @@ body.media-width-0-1200 { padding: 8px 12px 10px; box-shadow: 0 1px 5px rgba(0,0,0,0.5); position: relative; - background: white; + background: @bodyColor2; :before, :after { content: ''; position: absolute; - background: white; + background: @bodyColor2; left: -5px; top: 12px; width: 10px; @@ -484,7 +485,7 @@ body.media-width-0-1200 { .infoPanel { display: none; - background: white; + background: @bodyColor2; width: 178px; box-shadow: 0 1px 5px rgba(0,0,0,0.5); } @@ -523,9 +524,9 @@ body.media-width-0-1200 { } } - #passwordShowLabel::before { - content: "\00a0"; - } + #passwordShowLabel::before { + content: "\00a0"; + } } .settings-help-block { diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/userlanguages.less b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/userlanguages.less index 13e976944..510e43481 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/userlanguages.less +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/userlanguages.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/userprofilecontrol_style.less b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/userprofilecontrol_style.less index 84596b580..52fe25136 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/userprofilecontrol_style.less +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/css/userprofilecontrol_style.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,12 +16,10 @@ @import "../../../../skins/base.less"; - +@import "../../../../skins/default/params.less"; .userProfileCard { .additionInfo { - border: 1px solid #BFBFBF; - .borderRadius(3px); float: left; text-align: center; width: auto; @@ -31,7 +29,7 @@ } .action-block { - border-top: 1px solid #BFBFBF; + border-top: 1px solid @addition-info; cursor: pointer; padding: 8px 0; text-align: center; @@ -53,6 +51,10 @@ } } +.radio-but-theme{ + padding-bottom:12px; +} + .editUser { border-bottom: none; border-right: none; @@ -169,7 +171,7 @@ } .field-value, a { - color: #333; + color: @textColor; } } @@ -182,7 +184,7 @@ margin: -8px 0 -3px 8px; overflow: hidden; text-decoration: none; - color: #FFF !important; + color: @body-color !important; &:hover { background: url('../../../../skins/default/images/svg/people/pencilblue.svg') no-repeat 0 0 transparent; @@ -205,8 +207,8 @@ body.media-width-0-1200 { margin: 0 0 0 224px; } .profile-container .baseLinkAction { - border-color: #333; - color: #333; + border-color: @textColor; + color: @textColor; } .profile-contacts, .social-links { @@ -235,7 +237,7 @@ body.media-width-0-1200 { height: 16px; line-height: 16px; padding: 0 0 0 24px; - color: #000; + color: @bg-a-activate; text-decoration: none; overflow: hidden; text-overflow: ellipsis; @@ -247,7 +249,7 @@ body.media-width-0-1200 { .inner-text { display: block; - background: #FFF; + background: @body-color; overflow: hidden; text-overflow: ellipsis; } @@ -339,11 +341,10 @@ body.media-width-0-1200 { /* */ .social-logins ul.account-links { - height: 80px; li { margin: 0 32px 16px 0; - float: left; + display: inline-block; white-space: nowrap; span { @@ -360,8 +361,8 @@ body.media-width-0-1200 { } a { - border-bottom: 1px dotted #000000; - color: #000000; + border-bottom: 1px dotted @bg-a-activate; + color: @bg-a-activate; display: inline-block; margin: 4px 0 0; text-decoration: none; @@ -382,8 +383,8 @@ body.media-width-0-1200 { .borderRadius(3px); } - .opacity{ - opacity:0.5; + .opacity { + opacity: 0.5; } &.google .icon { @@ -445,7 +446,7 @@ body.media-width-0-1200 { .birthday-fest { - background: url("images/birthday.png") 0 0 no-repeat; + background: url("images/birthday.svg") 0 0 no-repeat; color: #ff9000; display: inline-block; margin: -4px 3px 0; @@ -456,54 +457,176 @@ body.media-width-0-1200 { a { color: #666; } -.profile-user-photo { - position: relative; +.user-quota-info.no-quota #editQuota { + display: none; +} +.user-quota-info { + margin-top: 16px; width: 200px; + text-align: left; - .profile-action-usericon { - width: 200px; - height: 200px; + #editQuota { + display: inline-block; + } - img { - border: none; - display: block; - margin: 0 auto; - max-height: 200px; - max-width: 200px; + .dotted { + border-bottom: 1px dotted; + position: relative; + + &:after { + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid #83888d; + content: ""; + height: 0; + position: absolute; + right: -10px; + top: 50%; + width: 0; + margin-top: -1px; } } .profile-status { - background: none repeat scroll 0 0 #FFFFFF; + background: none repeat scroll 0 0 @body-color; border: 1px solid #919191; display: none; - opacity: 0.6; - position: absolute; - text-align: center; - width: auto; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; + } - div { - font-weight: bold; - padding: 42px 16px 5px; + #setQuotaForm.show { + display: flex; + } + + .set-quota { + display: flex; + width: 100%; + margin-top: 7px; + + input { + width: 45px; + height: 20px; + margin-right: 3px; } - &.pending div { - background: url("images/user-waiting.png") no-repeat center 7px transparent; - color: #333; + .sizes { + width: auto; + padding-top: 1px; + margin-right: 8px; cursor: pointer; + + .val { + border: solid 1px #c7c7c7; + padding: 3px 22px 0px 4px; + height: 19px; + margin-top: -1px; + position: relative; + + &:after { + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid #83888d; + content: ""; + height: 0; + position: absolute; + right: 7px; + top: 50%; + width: 0; + margin-top: -1px; + } + } } - &.blocked div { - background: url("images/user-blocked.png") no-repeat center 7px transparent; - color: #A83200; + .save-btn { + position: relative; + cursor: pointer; + width: 23px; + height: 23px; + border: 1px solid #C4C4C4; + border-radius: 3px; + margin-right: 5px; + + .mark { + position: absolute; + width: 8px; + height: 5px; + right: 6px; + top: 6px; + border: 3px solid #83888D; + transform: rotate(-45deg); + border-width: 0 0 3px 3px; + } + } + + .close-btn { + position: relative; + cursor: pointer; + width: 23px; + height: 23px; + border: 1px solid #C4C4C4; + border-radius: 3px; + + .mark { + background: url('../../../../skins/default/images/svg/people/close.svg') center no-repeat; + background-size: contain; + display: block; + margin: 5px 0px 0px 6px; + width: 12px; + height: 12px; + } } } } -#studio_deleteProfileDialog .email { + .profile-user-photo { + border: 1px solid @user-photo-dialog-bor; + .borderRadius(3px); + position: relative; + width: 200px; + + .profile-action-usericon { + width: 200px; + height: 200px; + + img { + border: none; + display: block; + margin: 0 auto; + max-height: 200px; + max-width: 200px; + } + } + + .profile-status { + background: none repeat scroll 0 0 #FFFFFF; + border: 1px solid #919191; + display: none; + opacity: 0.6; + position: absolute; + text-align: center; + width: auto; + border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + + div { + font-weight: bold; + padding: 42px 16px 5px; + } + + &.pending div { + background: url("images/user-waiting.png") no-repeat center 7px transparent; + color: #333; + cursor: pointer; + } + + &.blocked div { + background: url("images/user-blocked.svg") no-repeat center 7px transparent; + color: #A83200; + } + } + } + + f #studio_deleteProfileDialog .email { padding-top:3px; } diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/accountlinker.js b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/accountlinker.js index efc1eb75f..317bc3c8b 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/accountlinker.js +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/accountlinker.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/deleteuser.js b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/deleteuser.js index e0fb96765..4b21905bc 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/deleteuser.js +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/deleteuser.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + var ProfileManager = new function () { this.RemoveUserEnterAction = function () { jq("#confirmationDeleteUserPanel .middle-button-container .remove-btn").trigger("click"); diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/loadphoto.js b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/loadphoto.js index fa67ef14e..7662b6d7e 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/loadphoto.js +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/loadphoto.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/pwdtool.js b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/pwdtool.js index 3b4e5b594..11dfbd6d8 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/pwdtool.js +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/pwdtool.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/userlanguage.js b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/userlanguage.js index 736280001..c8bbc0e41 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/userlanguage.js +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/userlanguage.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/userprofilecontrol.js b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/userprofilecontrol.js index bb0c4a700..7d12c0df7 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/userprofilecontrol.js +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/userprofilecontrol.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,6 +30,68 @@ jq(function () { ASC.Controls.LoadPhotoImage.showDialog(); }); + var $startModule = jq("#editQuotaVal"); + + + jq.dropdownToggle({ + switcherSelector: "#editQuota .link", + dropdownID: "editQuotaMenu", + addTop: 2, + addLeft: -2, + rightPos: true, + inPopup: true, + alwaysUp: false, + beforeShowFunction: function () { + + } + }); + + + if (jq(".user-quota-info").hasClass("no-quota")) { + jq.dropdownToggle({ + enableAutoHide: true, + switcherSelector: ".user-quota-info.no-quota .used-space.link", + dropdownID: "editNoQuotaMenu", + addTop: 2, + addLeft: -2, + rightPos: true, + inPopup: true, + alwaysUp: false, + beforeShowFunction: function () { + } + }); + } + jq(".dropdown-item.edit-quota").on('click', editQuota); + + jq(".dropdown-item.no-quota").on('click', resetQuota); + + jq("#setQuotaForm .save-btn").on('click', saveQuota); + jq("#setQuotaForm .close-btn").on('click', closeForm); + + + jq('#setQuotaForm input').on('input', function () { + this.value = this.value.replace(/[^0-9\.\,]/g, ''); + }); + + + var sizeNames = ASC.Resources.Master.FileSizePostfix ? ASC.Resources.Master.FileSizePostfix.split(',') : ["bytes", "KB", "MB", "GB", "TB"]; + $startModule.prop('title', sizeNames[0]); + $startModule.text(sizeNames[0]); + + $startModule.advancedSelector({ + height: 30 * sizeNames.length, + itemsSelectedIds: [0], + onechosen: true, + showSearch: false, + itemsChoose: sizeNames.map(function (item, index) { return { id: index, title: item } }), + sortMethod: function () { return 0; } + }) + .on("showList", + function (event, item) { + $startModule.html(item.title).attr("title", item.title).attr('data-id', item.id); + + }); + if (jq("#studio_emailChangeDialog").length == 0) { jq(".profile-status.pending div").css("cursor", "default"); } else { @@ -48,6 +110,7 @@ jq(function () { }); } + jq.switcherAction("#switcherTheme", "#ThemeContainer"); jq.switcherAction("#switcherAccountLinks", ".account-links"); jq.switcherAction("#switcherLoginSettings", "#loginSettingsContainer") jq.switcherAction("#switcherCommentButton", "#commentContainer"); @@ -58,6 +121,96 @@ jq(function () { }); +function editQuota() { + jq("#editQuotaMenu, #editNoQuotaMenu").hide(); + jq("#setQuotaForm").show(); +} +function saveQuota() { + jq("#editQuotaMenu, #editNoQuotaMenu").hide(); + var userId = jq("#studio_userProfileCardInfo").attr("data-id"); + + var quotaLimit = parseInt(jq("#setQuotaForm input").val()); + var quotaVal = jq("#editQuotaVal").attr('data-id'); + var quota = -1; + + switch (quotaVal) { + case '0': + quota = quotaLimit; + break; + case '1': + quota = quotaLimit * 1024; + break; + case '2': + quota = parseInt(quotaLimit * Math.pow(1024, 2)) + break; + case '3': + quota = parseInt(quotaLimit * Math.pow(1024, 3)) + break; + case '4': + quota = parseInt(quotaLimit * Math.pow(1024, 4)) + break; + } + + var data = { userIds: [userId], quota: quota }; + + Teamlab.updateUserQuota({}, data, + { + success: function (params, data) { + if (data[0].quotaLimit > 0) { + jq(".user-quota-info").removeClass("no-quota"); + jq(".user-quota-info .used-space").removeClass("link dotted"); + + var newQuotaLimit = window.FileSizeManager.filesSizeToString(data[0].quotaLimit); + jq("#editQuota .link").html(newQuotaLimit); + closeForm(); + toastr.success(ASC.Resources.Master.ResourceJS.QuotaEnabled); + } + }, + before: LoadingBanner.displayLoading, + after: LoadingBanner.hideLoading, + error: function (params, errors) { + closeForm(); + toastr.error(errors); + } + }); +} + +function resetQuota() { + jq("#editQuotaMenu, #editNoQuotaMenu").hide(); + closeForm(); + var userId = jq("#studio_userProfileCardInfo").attr("data-id"); + var data = { userIds: [userId], quota: -1 }; + + Teamlab.updateUserQuota({}, data, + { + success: function (params, data) { + jq(".user-quota-info").addClass("no-quota"); + jq(".user-quota-info .used-space").addClass("link dotted"); + + jq.dropdownToggle({ + enableAutoHide: true, + switcherSelector: ".user-quota-info.no-quota .used-space.link", + dropdownID: "editNoQuotaMenu", + addTop: 2, + addLeft: -2, + rightPos: true, + inPopup: true, + alwaysUp: false, + beforeShowFunction: function () { + } + }); + + }, + before: LoadingBanner.displayLoading, + after: LoadingBanner.hideLoading, + error: function (params, errors) { + toastr.error(errors); + } + }); +} +function closeForm() { + jq("#setQuotaForm").hide(); +} function initActionMenu() { var _top = jq(".profile-header").offset() == null ? 0 : -jq(".profile-header").offset().top, _left = jq(".profile-header").offset() == null ? 0 : -jq(".profile-header").offset().left, @@ -126,6 +279,32 @@ function initActionMenu() { if (jq(parent).hasClass("subscribe-tips")) { onChangeTipsSubscription(jq(this)); } + if (jq(parent).hasClass("impersonate-user")) { + ImpersonateManager.LoginAsUser(userId, displayName); + } + }); + + jq("input[name='typeTheme']").on("click", function () { + var theme = jq(this).val(); + var auto_mode = jq(this).attr("auto_mode"); + + if (theme == "interface_mode") { + var mode_theme = "light"; + if (window.matchMedia('(prefers-color-scheme: dark)').matches == true) { + mode_theme = "dark"; + } + theme = mode_theme; + } + Teamlab.setModeTheme(null, theme, auto_mode, { + success: function (params, response) { + if (auto_mode) { + jq.cookies.set("mode_theme_key", theme, { path: '/' }); + } else { + jq.cookies.del("mode_theme_key"); + } + window.location.reload(true); + } + }); }); } diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/userprofileeditcontrol.js b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/userprofileeditcontrol.js index 230830de2..072fa4c1d 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/userprofileeditcontrol.js +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserProfile/js/userprofileeditcontrol.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -141,7 +141,7 @@ window.EditProfileManager = (function () { edit = jq.getURLParam("action") == "edit"; - teamlab.getPortalPasswordSettings({}, + teamlab.getPasswordSettings({}, { success: function (params, data) { passwordSettings = data; @@ -302,6 +302,34 @@ window.EditProfileManager = (function () { ////// InitDatePicker(); + /// Lead + + $leadSelector = jq("#leadSelector"); + $leadManager = jq("#leadManager"); + $leadManagerName = $leadManager.find(".result-name"); + + $leadSelector.useradvancedSelector({ + onechosen: true, // list without checkbox, you can choose only one item + showGroups: true, + withGuests: false, + itemsDisabledIds: edit && window.userId ? [window.userId] : [] + }).on("showList", function (event, item) { + $leadManagerName.attr("data-id", item.id).html(item.title); + $leadManager.removeClass("display-none"); + $leadSelector.hide(); + }); + + $leadManager.find(".reset-icon").on("click", function () { + $leadManager.addClass("display-none"); + $leadManagerName.attr("data-id", "").text(""); + $leadSelector.show(); + }); + + if ($leadManagerName.attr("data-id") != "") { + $leadSelector.hide(); + $leadManager.removeClass("display-none"); + } + jq("#profileActionButton").on("click", function () { HideRequiredError(); @@ -319,7 +347,8 @@ window.EditProfileManager = (function () { sex, departments = [], contacts = [], - comment = $profileComment.val(); + comment = $profileComment.val(), + lead = $leadManagerName.attr("data-id"); isError = false; @@ -446,6 +475,7 @@ window.EditProfileManager = (function () { departments.push($depSelector.attr("data-id")); } } + var profile = { isVisitor: isVisitor, @@ -459,7 +489,8 @@ window.EditProfileManager = (function () { worksfrom: workFromDate, contacts: contacts, files: "", //pathname, - department: departments + department: departments, + lead: lead }; diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/UserSubscriptions.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/UserSubscriptions.ascx.cs index 36ebab9ba..334225114 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/UserSubscriptions.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/UserSubscriptions.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ using ASC.Notify.Recipients; using ASC.Web.Core; using ASC.Web.Core.Subscriptions; +using ASC.Web.Core.Utility; using ASC.Web.Studio.Core; using ASC.Web.Studio.Core.Notify; using ASC.Web.Studio.PublicResources; @@ -67,8 +68,15 @@ protected override void OnInit(EventArgs e) try { Page.RegisterBodyScripts("~/UserControls/Users/UserSubscriptions/js/subscription_manager.js") - .RegisterInlineScript("CommonSubscriptionManager.InitNotifyByComboboxes();") - .RegisterStyle("~/UserControls/Users/UserSubscriptions/css/subscriptions.less"); + .RegisterInlineScript("CommonSubscriptionManager.InitNotifyByComboboxes();"); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Users/UserSubscriptions/css/dark-subscriptions.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Users/UserSubscriptions/css/subscriptions.less"); + } } catch { @@ -418,7 +426,7 @@ protected bool IsVisibleSpamSubscription() private static IDbManager GetDb() { - return DbManager.FromHttpContext(TeamlabSiteDbId); + return new DbManager(TeamlabSiteDbId); } private static void UnsubscribeFromSpam(string email) diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/css/dark-subscriptions.less b/web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/css/dark-subscriptions.less new file mode 100644 index 000000000..2310c78dd --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/css/dark-subscriptions.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "subscriptions.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/css/img/hmenu-selected-dark.png b/web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/css/img/hmenu-selected-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..dca90298c71876129575ef388ba7c24157d1a081 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^+(69E!3HGnnNM^|t7HZD{Ea21H}_Q^vx`;vvROjLe$Ve@pk4+~S3j3^P6 .module { - border-right: 1px dotted #333; + border-right: 1px dotted @textColor; display: inline-block; cursor:pointer; padding-right: 5px; @@ -126,17 +128,17 @@ body.media-width-0-1200 { } .subscribe-link a { - color:#333; + color:@textColor; } .subs-only-button { - border-bottom: 1px solid #D1D1D1; + border-bottom: 1px solid @borderColor; margin-bottom:15px; padding-bottom:15px; } .module-settings, .subtabs { - border-bottom: 1px solid #D1D1D1; + border-bottom: 1px solid @borderColor; margin-bottom: 15px; padding-bottom: 8px; } diff --git a/web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/js/subscription_manager.js b/web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/js/subscription_manager.js index 96a16e47c..352c25a06 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/js/subscription_manager.js +++ b/web/studio/ASC.Web.Studio/UserControls/Users/UserSubscriptions/js/subscription_manager.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * */ + jq(document).ready(function () { jq('#switcherSubscriptionButton').one('click', function () { if (!jq('#subscriptionBlockContainer').hasClass('subsLoaded') && diff --git a/web/studio/ASC.Web.Studio/Utility/AjaxResponse.cs b/web/studio/ASC.Web.Studio/Utility/AjaxResponse.cs index e6e1a7c30..115d9d2ac 100644 --- a/web/studio/ASC.Web.Studio/Utility/AjaxResponse.cs +++ b/web/studio/ASC.Web.Studio/Utility/AjaxResponse.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/BBCodeParser/ExpressionReplacement.cs b/web/studio/ASC.Web.Studio/Utility/BBCodeParser/ExpressionReplacement.cs index cb1598c65..588babe59 100644 --- a/web/studio/ASC.Web.Studio/Utility/BBCodeParser/ExpressionReplacement.cs +++ b/web/studio/ASC.Web.Studio/Utility/BBCodeParser/ExpressionReplacement.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/BBCodeParser/ParserConfiguration.cs b/web/studio/ASC.Web.Studio/Utility/BBCodeParser/ParserConfiguration.cs index 8b21717be..d31ceaa19 100644 --- a/web/studio/ASC.Web.Studio/Utility/BBCodeParser/ParserConfiguration.cs +++ b/web/studio/ASC.Web.Studio/Utility/BBCodeParser/ParserConfiguration.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/BBCodeParser/RegularExpressionTemplate.cs b/web/studio/ASC.Web.Studio/Utility/BBCodeParser/RegularExpressionTemplate.cs index 5eef77c54..141cd2ee1 100644 --- a/web/studio/ASC.Web.Studio/Utility/BBCodeParser/RegularExpressionTemplate.cs +++ b/web/studio/ASC.Web.Studio/Utility/BBCodeParser/RegularExpressionTemplate.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/BBCodeParser/Smiles.cs b/web/studio/ASC.Web.Studio/Utility/BBCodeParser/Smiles.cs index 29ffdd736..2e26d1f9d 100644 --- a/web/studio/ASC.Web.Studio/Utility/BBCodeParser/Smiles.cs +++ b/web/studio/ASC.Web.Studio/Utility/BBCodeParser/Smiles.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/BBCodeParser/TagConfiguration.cs b/web/studio/ASC.Web.Studio/Utility/BBCodeParser/TagConfiguration.cs index 83af53855..1279fce6e 100644 --- a/web/studio/ASC.Web.Studio/Utility/BBCodeParser/TagConfiguration.cs +++ b/web/studio/ASC.Web.Studio/Utility/BBCodeParser/TagConfiguration.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/BBCodeParser/TagParamOption.cs b/web/studio/ASC.Web.Studio/Utility/BBCodeParser/TagParamOption.cs index 5e37dc5e1..27df9f7a6 100644 --- a/web/studio/ASC.Web.Studio/Utility/BBCodeParser/TagParamOption.cs +++ b/web/studio/ASC.Web.Studio/Utility/BBCodeParser/TagParamOption.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/CommonControlsConfigurer.cs b/web/studio/ASC.Web.Studio/Utility/CommonControlsConfigurer.cs index 166fca2ec..5e9e42159 100644 --- a/web/studio/ASC.Web.Studio/Utility/CommonControlsConfigurer.cs +++ b/web/studio/ASC.Web.Studio/Utility/CommonControlsConfigurer.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/CustomResourceHelper.cs b/web/studio/ASC.Web.Studio/Utility/CustomResourceHelper.cs index a587af926..51ff76e3a 100644 --- a/web/studio/ASC.Web.Studio/Utility/CustomResourceHelper.cs +++ b/web/studio/ASC.Web.Studio/Utility/CustomResourceHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/HeaderStringHelper.cs b/web/studio/ASC.Web.Studio/Utility/HeaderStringHelper.cs index 9e453bfaa..fe3471241 100644 --- a/web/studio/ASC.Web.Studio/Utility/HeaderStringHelper.cs +++ b/web/studio/ASC.Web.Studio/Utility/HeaderStringHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CLikeFormat.cs b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CLikeFormat.cs index a47630571..a56d3e8f9 100644 --- a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CLikeFormat.cs +++ b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CLikeFormat.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CSharpFormat.cs b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CSharpFormat.cs index 96c7654ba..9f137893a 100644 --- a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CSharpFormat.cs +++ b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CSharpFormat.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CodeFormat.cs b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CodeFormat.cs index 7e15a640b..ba7426a19 100644 --- a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CodeFormat.cs +++ b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CodeFormat.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CppFormat.cs b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CppFormat.cs index c209c5151..2cf437d2d 100644 --- a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CppFormat.cs +++ b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/CppFormat.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/HtmlFormat.cs b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/HtmlFormat.cs index 22b83a534..91ed97d14 100644 --- a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/HtmlFormat.cs +++ b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/HtmlFormat.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/JavaScriptFormat.cs b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/JavaScriptFormat.cs index f04c525b1..bd8c91eda 100644 --- a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/JavaScriptFormat.cs +++ b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/JavaScriptFormat.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/MshFormat.cs b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/MshFormat.cs index fa76dbd92..cbae4232d 100644 --- a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/MshFormat.cs +++ b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/MshFormat.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/SourceFormat.cs b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/SourceFormat.cs index 0017241ee..5ed4d83cb 100644 --- a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/SourceFormat.cs +++ b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/SourceFormat.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/TsqlFormat.cs b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/TsqlFormat.cs index b5b34aa73..3a20ee4ea 100644 --- a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/TsqlFormat.cs +++ b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/TsqlFormat.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/VisualBasicFormat.cs b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/VisualBasicFormat.cs index 379318104..0f1033e1c 100644 --- a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/VisualBasicFormat.cs +++ b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/CodeFormat/VisualBasicFormat.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/Highlighter.cs b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/Highlighter.cs index 414c72c97..f3798cb21 100644 --- a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/Highlighter.cs +++ b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/Highlighter.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/HtmlUtility.cs b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/HtmlUtility.cs index 054863769..3b52a84b3 100644 --- a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/HtmlUtility.cs +++ b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/HtmlUtility.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/LangType.cs b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/LangType.cs index 6b8c45241..b79efe663 100644 --- a/web/studio/ASC.Web.Studio/Utility/HtmlUtility/LangType.cs +++ b/web/studio/ASC.Web.Studio/Utility/HtmlUtility/LangType.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/RefererURL.cs b/web/studio/ASC.Web.Studio/Utility/RefererURL.cs index adce9319b..ac8e2e91d 100644 --- a/web/studio/ASC.Web.Studio/Utility/RefererURL.cs +++ b/web/studio/ASC.Web.Studio/Utility/RefererURL.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System.Web; namespace ASC.Web.Studio.Utility diff --git a/web/studio/ASC.Web.Studio/Utility/TenantExtra.cs b/web/studio/ASC.Web.Studio/Utility/TenantExtra.cs index 07802561d..87dafb9ef 100644 --- a/web/studio/ASC.Web.Studio/Utility/TenantExtra.cs +++ b/web/studio/ASC.Web.Studio/Utility/TenantExtra.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -92,15 +92,18 @@ public static Tariff GetCurrentTariff() { return CoreContext.PaymentManager.GetTariff(TenantProvider.CurrentTenantID); } - + public static TenantQuota GetTenantQuota(bool useCache) + { + return GetTenantQuota(TenantProvider.CurrentTenantID, useCache); + } public static TenantQuota GetTenantQuota() { return GetTenantQuota(TenantProvider.CurrentTenantID); } - public static TenantQuota GetTenantQuota(int tenant) + public static TenantQuota GetTenantQuota(int tenant, bool useCache = true) { - return CoreContext.TenantManager.GetTenantQuota(tenant); + return CoreContext.TenantManager.GetTenantQuota(tenant, useCache); } public static IEnumerable GetTenantQuotas() diff --git a/web/studio/ASC.Web.Studio/Utility/TenantLogoHelper.cs b/web/studio/ASC.Web.Studio/Utility/TenantLogoHelper.cs deleted file mode 100644 index a6795aff2..000000000 --- a/web/studio/ASC.Web.Studio/Utility/TenantLogoHelper.cs +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - -using ASC.Web.Core.WhiteLabel; - -namespace ASC.Web.Studio.Utility -{ - public class TenantLogoHelper - { - public static string GetLogo(WhiteLabelLogoTypeEnum type, bool general = true, bool isDefIfNoWhiteLabel = false) - { - var imgUrl = ""; - if (TenantLogoManager.WhiteLabelEnabled) - { - var _tenantWhiteLabelSettings = TenantWhiteLabelSettings.Load(); - return _tenantWhiteLabelSettings.GetAbsoluteLogoPath(type, general); - } - else - { - if (isDefIfNoWhiteLabel) - { - imgUrl = TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(type, general); - } - else - { - if (type == WhiteLabelLogoTypeEnum.Dark && !TenantLogoManager.IsVisibleWhiteLabelSettings) - { - /*** simple scheme ***/ - var _tenantInfoSettings = TenantInfoSettings.Load(); - imgUrl = _tenantInfoSettings.GetAbsoluteCompanyLogoPath(); - /***/ - } - else - { - imgUrl = TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(type, general); - } - } - } - - return imgUrl; - - } - } -} diff --git a/web/studio/ASC.Web.Studio/Utility/TransferResourceHelper.cs b/web/studio/ASC.Web.Studio/Utility/TransferResourceHelper.cs index 58864504e..433ac519d 100644 --- a/web/studio/ASC.Web.Studio/Utility/TransferResourceHelper.cs +++ b/web/studio/ASC.Web.Studio/Utility/TransferResourceHelper.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Utility/WhiteLabelHelper.cs b/web/studio/ASC.Web.Studio/Utility/WhiteLabelHelper.cs index 3ee76dbf4..939bfc960 100644 --- a/web/studio/ASC.Web.Studio/Utility/WhiteLabelHelper.cs +++ b/web/studio/ASC.Web.Studio/Utility/WhiteLabelHelper.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Globalization; using System.IO; diff --git a/web/studio/ASC.Web.Studio/VoipClient.aspx.cs b/web/studio/ASC.Web.Studio/VoipClient.aspx.cs index 316abdec3..895e6765f 100644 --- a/web/studio/ASC.Web.Studio/VoipClient.aspx.cs +++ b/web/studio/ASC.Web.Studio/VoipClient.aspx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Collections.Generic; using System.Globalization; diff --git a/web/studio/ASC.Web.Studio/Warmup.aspx.cs b/web/studio/ASC.Web.Studio/Warmup.aspx.cs index f45a7d652..402caf454 100644 --- a/web/studio/ASC.Web.Studio/Warmup.aspx.cs +++ b/web/studio/ASC.Web.Studio/Warmup.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/Web.config b/web/studio/ASC.Web.Studio/Web.config index ad0d801a7..046c9d758 100644 --- a/web/studio/ASC.Web.Studio/Web.config +++ b/web/studio/ASC.Web.Studio/Web.config @@ -25,7 +25,7 @@ - + diff --git a/web/studio/ASC.Web.Studio/Wizard.aspx.cs b/web/studio/ASC.Web.Studio/Wizard.aspx.cs index a86d40739..1a23f838f 100644 --- a/web/studio/ASC.Web.Studio/Wizard.aspx.cs +++ b/web/studio/ASC.Web.Studio/Wizard.aspx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/addons/calendar/ASC.Web.Calendar.csproj b/web/studio/ASC.Web.Studio/addons/calendar/ASC.Web.Calendar.csproj index 3f423b2d4..0413de290 100644 --- a/web/studio/ASC.Web.Studio/addons/calendar/ASC.Web.Calendar.csproj +++ b/web/studio/ASC.Web.Studio/addons/calendar/ASC.Web.Calendar.csproj @@ -39,6 +39,8 @@ prompt 4 false + ..\..\bin\ASC.Web.Calendar.xml + CS1591 none @@ -54,7 +56,7 @@ - 4.7.11 + 5.1.2 @@ -347,7 +349,7 @@ - + @@ -369,6 +371,18 @@ + + + + + + + + + + + + @@ -393,26 +407,36 @@ - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - @@ -426,7 +450,8 @@ - + + @@ -474,6 +499,7 @@ + n3ds% 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 literal 0 HcmV?d00001 diff --git a/web/studio/ASC.Web.Studio/skins/dark-img/mainmenu_upload.png b/web/studio/ASC.Web.Studio/skins/dark-img/mainmenu_upload.png new file mode 100644 index 0000000000000000000000000000000000000000..6197875293d8a2dead5fba8ebb15e47c046d65d1 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9>;M1%1HxjqJ4qb|iZGT0 z`2{mLJiCzw-J*Qk(@Ik;M!Q+`=Ht$S`Y;1W=H% zILO_JVcj{Imp~3nx}&cn1H;CC?mvmFKz_fci(^Oy3)Qwg~3uax{(c3?wPWQk!}+I7uLLE-8b8NC%4KerZaJBtnX%BoMh0vO6t<26`os`RRvDY z&@E*On#r8@=?Ygt@ylmbaT_#BUM4Tv)Z>w|E?Md$+okirWxlVll(mqp&-%do@Lkb~ RO+eQ$c)I$ztaD0e0su?!ws-&l literal 0 HcmV?d00001 diff --git a/web/studio/ASC.Web.Studio/skins/dark-img/rotate.svg b/web/studio/ASC.Web.Studio/skins/dark-img/rotate.svg new file mode 100644 index 000000000..eb83ae7bd --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark-img/rotate.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/studio/ASC.Web.Studio/skins/dark-img/switch_view.png b/web/studio/ASC.Web.Studio/skins/dark-img/switch_view.png new file mode 100644 index 0000000000000000000000000000000000000000..6f40877c380d8585cae8012afe847222ecdd976c GIT binary patch literal 826 zcmV-A1I7G_P)K3J00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yPsKN*d_7Kvv=auw8_NU>nd@#5dSnfQo{Tg6%j84bl<;1t39Y zER2Q(i}3su`APFD;+Ki?*Tc*(_J6PiNVnT<9S(;&F0-J{(z2|-jYi`a51OPM>2x~1 zM8QAJX7kAln5r!Zf*{<9ML$ZVQVS1t{A5D*&OJ*?alhXq_h(scEI8VAv)27UD$mux+ zl%b6!lSx{>u&`0uUj04enSKoFC8CAq42Q!ukDID32!bHof!j^?`+W;PRkb|p6^q3# zrd}p#M^Ugh7!2x;qq+zB-860Y88sb(1dZw7-E(9nY0HfoLp)H1WClY#P=~g3EdT%j literal 0 HcmV?d00001 diff --git a/web/studio/ASC.Web.Studio/skins/dark-img/top-studio-menu.png b/web/studio/ASC.Web.Studio/skins/dark-img/top-studio-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..a61291f40d562cccbec5281cc433a06eafdd3f0d GIT binary patch literal 2323 zcmV+u3GDWXP)U-E4pDKJ7Y65ClOG1VIo4K@bE%5CkC_#6o@xf;+V3QpQq5A!GEcwFuA$8qkL< z^7Y8lvj)*Oa;kcc7Nj$sm>$_=kmhTCD*40$Baf3DEng;9>v-A0{!&V6wJ+h)E!rPT zX|4999IL#cGedZq*%UilbR;|OeY5GPyx=t21O-SNPFG2Tj*O#-?Nnqqmz+2c;)Pk_CNF^Lv|WHgBwy}cfP#uKYC#?#i( zy1e#{%T7G$a0e@3`l|?#W}{!avap*;#yQ$2E^wKB`;*LWdX`Ih(5|GXfB<8ZGngif zj`T5uy} zE*{vJL2g$OAY+qS%aj;!+fpPW*d+7Q7!~)|j*W*Vx$q`_@;EW)L(3nhX?~w+L z#Y7HPUYPjNEN-PKF^ZK3Ja6RJ)kc(s=tP{D0O`p>R}XNfePT{i5gU~&1Hbx6S}B0vp8?W0G7gal~eU@z}8HtqvYrUCU+ECrXdAH7Tx>83|1 zF?#Eja%cBP zvXu*5VPAeK50K5BO0fs_mMIbe)7hEgIJ;uKlJ4yO!N%rUQ-90zJ_R=<+nj?>qNyGy zG0AL+w1|h0TesRFq%}90Lx>YJ<~3va46R7xHu}33Wk|PLiCZxv!>$VN7x; z!#D^qDRsaYuhN9E)U+I@S6_7$;8VupLOr`Uc#p`1=u#ud4$k&%Ld!61l2nGV(3-dG zHYhQ_Uv(=@(}JAP2$`l*!11N%t8d{4=u40Oo3Kh0O~O$;DfOq zy^xx%xO0>rbmDTxQ>4dOF4K-nGVIL6lxf7fOYpJO`(p&Q<7Q@4!jq(V^+Pgj{+LcW zEmZ13V~2;<)RJH(7b-yz1VIo4K@bE%5ClOG1VIo4K@bE%5ClOG1VIo4!37BUEeP(= zk$d@&m8{?cJ!>xl^nr$4NeRpJDABWqDk6}oo})FR_zr;g$YKXy^Ij|^$P&6cS{6_{ z1rGL^tf4m6khw+sb687ltmT}D|0ZG{Ke5``qATwaPPUuH!G1lPW6c)rcjs9CAOyX7EW3M)FPrsPoTJ}+ zz?XERr5@e%4Bn@am;9>vnEosVU@`slRW*H-!G8;zjq3q304SuMiUd~^#$fm4yA*(5 z>1nQaVS$Z;?UNut61xLcoXK{)OHJNod(Na%dBAzr6Mh1`0{EQPfn@YKaD~_7&&Sl{ zV>&uoudjXMvKMn4?qCJXwJHMaKqUYf%EAGB2UOBpxxi>JbThkYA(>1BLq-Y+5Y}@O z%@{+FF*MVw>p?lgRcrvmBGTE#^+}Er+vI;kN}r?3+O3j;VCR$ z_R+J@?yLr?Xs03oArbHZ5AU-KEblRxMoMup7%EdnfZx%YEcBtn97TC-8g8+V9t{%`poJ5>yw8UO`GSTtNU;>Wo};)NSj$DEvlh5QudH`= z|MqMEsyV{Qui7(uUI}~_cL@0mxY9cXS8nAL{I7=q>oE<03H}n~yFdht=RM^D_k*Dq z6L^nTmEs^Uj7pIRIEsB(MUYi`Wt6k~ZvtR}slP1&PXRXKec*Gt(L#@IdIsy+G14LA zDPGuWhmiI>V-6us(3DaD=F^THc#&(V>u8x_}~=?E<~?2f=qL^?+{vs>5!x{jD_~RW4FN?0E*m7)3l~C zGy+z#gL@yO8i1AN%HU84^-aP4oshK-oscE$z!QY=Bs;J~Il#{V?5t<+6Tqt#cNG;Z z*P}wuI`b~@g{uVVTcZ%&-xQ+zMlM7fzxhK;<`HD2Yab+3fLAGZ=*=>METu={tvCuj zS~)8KlsBBnnN$--HD|e%R9Fo_Lo*AYB12oO1XG|D7l8WQ9Pq)19=(v7t+>I;54Pn# zK4zsJA2OOWm1Nk5&p@RH?h>4ldVh?-Zam9RtYHp2c=bcFcn^T@$e^`KJ!tCi(3)Bj t%x0t#1VIo4K@bE%5ClOG1VQ+p@gMRr)xLkQQ=k9<002ovPDHLkV1iQ@M!o<5 literal 0 HcmV?d00001 diff --git a/web/studio/ASC.Web.Studio/skins/dark-img/top-studio-menu_retina.png b/web/studio/ASC.Web.Studio/skins/dark-img/top-studio-menu_retina.png new file mode 100644 index 0000000000000000000000000000000000000000..df56177b824678a5b27f70bca8c947adf3869a9a GIT binary patch literal 5042 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 F_%B}{w&nl; literal 0 HcmV?d00001 diff --git a/web/studio/ASC.Web.Studio/skins/dark-img/unfollow.png b/web/studio/ASC.Web.Studio/skins/dark-img/unfollow.png new file mode 100644 index 0000000000000000000000000000000000000000..4cf434788a0b5d967a4ea709e02f96499d922ed3 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDUwJust60+L4=@L*ce@T#E zFoS@CfkQw-K|}xi{pat$Us4mn1C+}3ba4#fkYzo%(U*yl!QtZhnGA|*7jDkjz$CnZ zk#p(BL{W1~vz>w)iWs?1tzKhbcYpP&hq-HBJ$1WU0EXkBiNkyZrFVdQ I&MBb@0EjPW6951J literal 0 HcmV?d00001 diff --git a/web/studio/ASC.Web.Studio/skins/dark-img/up.png b/web/studio/ASC.Web.Studio/skins/dark-img/up.png new file mode 100644 index 0000000000000000000000000000000000000000..00de4e858cbb36b2a4ca0571ed81de1613f1cb1e GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k2TvEr5RKsEAOHW`GaKc-doh*a z(NzVhSiY8xn)|qp{9kC&rWVtcDB&z@cQnFOFsNrC=i%TJTo<3VEn+M2k>_QIZ|Ime TPk2!b&@2W|S3j3^P6 +up + + diff --git a/web/studio/ASC.Web.Studio/skins/dark-pure-orange/dark-params.less b/web/studio/ASC.Web.Studio/skins/dark-pure-orange/dark-params.less new file mode 100644 index 000000000..e6abe8ce5 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark-pure-orange/dark-params.less @@ -0,0 +1,53 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +// ------------------------- +// Main parameters +// ------------------------- +@imagesBaseUrl: "../default/imagescss/"; +@img-change-url: "../dark-img/"; // for images of different color themes + +// Top Studio Panel +// ------------------------- +@bg-header: #1F1F1F; +@bg-header-icons: #033260; +@bg-button-hidden-tabs: rgba(255,255,255,0.2); + +@bg-header-icon-lable: #F58D31; +@defaultButtonTextColor: #333; + +@bg-main-container: #333; +// Left Navigation Menu +// ------------------------- +@color-active-item: #6EB3DB; + +@bg-is-new: #F58D31; +@bg-is-new-hover: #F8A359; + +// Buttons style +// ------------------------- + +@bg-create-new: #F58D31; +@bg-create-new-hover: #F8A359; +@bg-create-new-disable: #986436; + + +@bg-button-action: #CCCCCC; +@bg-button-action-hover: #FAFAFA; +@bg-button-action-active: #858585; +@bg-button-action-disable: #545454; + diff --git a/web/studio/ASC.Web.Studio/skins/dark-pure-orange/main.less b/web/studio/ASC.Web.Studio/skins/dark-pure-orange/main.less new file mode 100644 index 000000000..1d4607044 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark-pure-orange/main.less @@ -0,0 +1,39 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../base.less"; +@import "../default/params.less"; +@import "../dark-default/dark-params.less"; +@import "dark-params.less"; + +@import "../default/common.less"; + +@import "../default/buttons.less"; +@import "../default/links.less"; +@import "../default/headers.less"; +@import "../default/sidepanel.less"; +@import "../default/actionpanel.less"; +@import "../default/contentmenu.less"; +@import "../default/lists.less"; +@import "../default/dashboard.less"; +@import "../default/tl-combobox.less"; +@import "../default/common_style.wide-screen.less"; +@import "../default/topstudiopanel.less"; +@import "../default/voip.phone.less"; +@import "../default/whitelabel.less"; +@import "../default/jquery-advansedfilter-theme.less"; + diff --git a/web/studio/ASC.Web.Studio/skins/dark-wild-pink/dark-params.less b/web/studio/ASC.Web.Studio/skins/dark-wild-pink/dark-params.less new file mode 100644 index 000000000..e21b77c41 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark-wild-pink/dark-params.less @@ -0,0 +1,52 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +// ------------------------- +// Main parameters +// ------------------------- +@imagesBaseUrl: "../default/imagescss/"; +@img-change-url: "../dark-img/"; // for images of different color themes + +// Top Studio Panel +// ------------------------- +@bg-header: #1F1F1F; +@bg-header-icons: #033260; +@bg-button-hidden-tabs: rgba(255,255,255,0.2); + +@bg-header-icon-lable: #C6438A; +@defaultButtonTextColor: #333; + +@bg-main-container: #333; +// Left Navigation Menu +// ------------------------- +@color-active-item: #C6448A; + +@bg-is-new: #C6438A; +@bg-is-new-hover: #D769A4; +// Buttons style +// ------------------------- + +@bg-create-new: #C6438A; +@bg-create-new-hover: #D769A4; +@bg-create-new-disable: #986436; + + +@bg-button-action: #CCCCCC; +@bg-button-action-hover: #FAFAFA; +@bg-button-action-active: #858585; +@bg-button-action-disable: #545454; + diff --git a/web/studio/ASC.Web.Studio/skins/dark-wild-pink/main.less b/web/studio/ASC.Web.Studio/skins/dark-wild-pink/main.less new file mode 100644 index 000000000..43bcb2d6b --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark-wild-pink/main.less @@ -0,0 +1,38 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../base.less"; +@import "../default/params.less"; +@import "../dark-default/dark-params.less"; +@import "dark-params.less"; +@import "../default/common.less"; + +@import "../default/buttons.less"; +@import "../default/links.less"; +@import "../default/headers.less"; +@import "../default/sidepanel.less"; +@import "../default/actionpanel.less"; +@import "../default/contentmenu.less"; +@import "../default/lists.less"; + +@import "../default/dashboard.less"; +@import "../default/tl-combobox.less"; +@import "../default/common_style.wide-screen.less"; +@import "../default/topstudiopanel.less"; +@import "../default/voip.phone.less"; +@import "../default/whitelabel.less"; +@import "../default/jquery-advansedfilter-theme.less"; diff --git a/web/studio/ASC.Web.Studio/skins/dark/dark-codestyle.less b/web/studio/ASC.Web.Studio/skins/dark/dark-codestyle.less new file mode 100644 index 000000000..8c6e79268 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark/dark-codestyle.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/codestyle.less"; +@import "../dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/dark/dark-common_style.less b/web/studio/ASC.Web.Studio/skins/dark/dark-common_style.less new file mode 100644 index 000000000..c9ff63d76 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark/dark-common_style.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/common_style.less"; +@import "../dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/dark/dark-empty-screen-control.less b/web/studio/ASC.Web.Studio/skins/dark/dark-empty-screen-control.less new file mode 100644 index 000000000..9b76d8ec4 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark/dark-empty-screen-control.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/empty-screen-control.less"; +@import "../dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/dark/dark-groupselector.less b/web/studio/ASC.Web.Studio/skins/dark/dark-groupselector.less new file mode 100644 index 000000000..212d1ebd2 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark/dark-groupselector.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/groupselector.less"; +@import "../dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/dark/dark-helper.less b/web/studio/ASC.Web.Studio/skins/dark/dark-helper.less new file mode 100644 index 000000000..b8512ca43 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark/dark-helper.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/helper.less"; +@import "../dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/dark/dark-jquery-advansedfilter-fix.less b/web/studio/ASC.Web.Studio/skins/dark/dark-jquery-advansedfilter-fix.less new file mode 100644 index 000000000..cceadcd25 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark/dark-jquery-advansedfilter-fix.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/jquery-advansedfilter-fix.less"; +@import "../dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/dark/dark-jquery-advansedselector.less b/web/studio/ASC.Web.Studio/skins/dark/dark-jquery-advansedselector.less new file mode 100644 index 000000000..5d6387dd8 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark/dark-jquery-advansedselector.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/jquery-advansedselector.less"; +@import "../dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/dark/dark-jquery-emailadvansedselector.less b/web/studio/ASC.Web.Studio/skins/dark/dark-jquery-emailadvansedselector.less new file mode 100644 index 000000000..e8f1a63f0 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark/dark-jquery-emailadvansedselector.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/jquery-emailadvansedselector.less"; +@import "../dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/dark/dark-page-tabs-navigators.less b/web/studio/ASC.Web.Studio/skins/dark/dark-page-tabs-navigators.less new file mode 100644 index 000000000..e822ca8b3 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark/dark-page-tabs-navigators.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/page-tabs-navigators.less"; +@import "../dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/dark/dark-phonecontroller.less b/web/studio/ASC.Web.Studio/skins/dark/dark-phonecontroller.less new file mode 100644 index 000000000..ec5be627f --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark/dark-phonecontroller.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/phonecontroller.less"; +@import "../dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/dark/dark-toastr.less b/web/studio/ASC.Web.Studio/skins/dark/dark-toastr.less new file mode 100644 index 000000000..6f58c2f18 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark/dark-toastr.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/toastr.less"; +@import "../dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/dark/dark-userselector.less b/web/studio/ASC.Web.Studio/skins/dark/dark-userselector.less new file mode 100644 index 000000000..af0473c62 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/dark/dark-userselector.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/userselector.less"; +@import "../dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/deep-blue/img/name_action.png b/web/studio/ASC.Web.Studio/skins/deep-blue/img/name_action.png index b1c7498e03634d9ddaa89458254e3eeec32e2c8a..c4b5ce14b1157f45078c813af03649796a541bc3 100644 GIT binary patch delta 329 zcmV-P0k;0X0^2&}*eY{CY($WKX~3a`KhFaaa5 zLPnrY6YilHC6S%ztRR{^$x@Vie*XLuhiKIwWQ^HLYMO*9%YSmm?KI~risGE6=@Wim z25Rs`!yu$>+XpwxK_=wuW_{%L@%MpT25Rv1S4fc%qzkE)QirOlYKb53r!odGd7huN z*7xxsQjk!;?sYKZ3zKD;VUWw%7z+{rqN$9Hdq|Sx#+`65-9FDQ>(Ux*lXO|<6unJ> z0HTFJ#0S_DL_#qj_*`+1_y!$AHchj)*1k~l-ZSWkfY>vFa31hVp4q!>)ZlR-KbQ1( buqvcC6?)*b4RXMv00000NkvXXu0mjfdDf5! delta 293 zcmV+=0owlK0>1)~BYyz~Nklfi1X#J2-$8 zbQ_aFTMrz8@lb$%tc)VOGN^BXJ$QhHLu5(sod2P3M9P3lkbfCapE;E^8>gu*qjKt! zd7E*Ch@lVoWY%1o36&x|*2$Lnm~n`RAak+$E7oSmdM#y}%V>LWh=?F_w#TqGT_xia z5=8`=m1B=6YstLJ diff --git a/web/studio/ASC.Web.Studio/skins/deep-blue/main.less b/web/studio/ASC.Web.Studio/skins/deep-blue/main.less index e3266a2a7..9efc12493 100644 --- a/web/studio/ASC.Web.Studio/skins/deep-blue/main.less +++ b/web/studio/ASC.Web.Studio/skins/deep-blue/main.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/skins/deep-blue/params.less b/web/studio/ASC.Web.Studio/skins/deep-blue/params.less index f6bb97585..d34c298ef 100644 --- a/web/studio/ASC.Web.Studio/skins/deep-blue/params.less +++ b/web/studio/ASC.Web.Studio/skins/deep-blue/params.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -58,6 +58,13 @@ @bg-button-default-active: #e2e2e2; @bg-button-default-disable: #f7f7f7; +@popupContainerHeaderBlock: #e2e2e2; +@bg-progress-dialog-header: #e2e2e2; + +@bg-button-default-menuAction: #ebebeb; +@bg-button-default-hover-menuAction: #f5f5f5; +@bg-button-default-active-menuAction: #e2e2e2; +@bg-button-default-disable-menuAction: #f7f7f7; // Buttons border style // ------------------------- @@ -66,8 +73,12 @@ @border-button-default-hover: #d4d4d4; @border-button-default-active: #dadada; @border-button-default-disable: #ebebeb; +@border-button-default-item-row: @border-button-default; - +@border-button-default-menuAction: #c4c4c4; +@border-button-default-hover-menuAction: #d4d4d4; +@border-button-default-active-menuAction: #dadada; +@border-button-default-disable-menuAction: #ebebeb; // Entity menu colors // ------------------------- @entity-menu-color : #cecece; @@ -78,7 +89,7 @@ // ------------------------- @advfilter-combobox-btns : #888888; -@advfilter-combobox-bkgd : #EDF6FD; +@advfilter-combobox-bkgd : #fff; @advfilter-reset-btn : #CCCCCC; @advfilter-add-btn-plus : #50565c; @advfilter-add-btn-bkgd : #EBEBEB; diff --git a/web/studio/ASC.Web.Studio/skins/default/actionpanel.less b/web/studio/ASC.Web.Studio/skins/default/actionpanel.less index f7947cfe0..d3b93c52d 100644 --- a/web/studio/ASC.Web.Studio/skins/default/actionpanel.less +++ b/web/studio/ASC.Web.Studio/skins/default/actionpanel.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,8 @@ position: absolute; padding: 4px; z-index: 1999; + background-color: @body-color !important; + border-color: @bg-dropdown-separator !important; .borderRadius(4px); .boxShadow(); .noneSelect(); @@ -115,7 +117,7 @@ &:hover, &:hover a { text-decoration: none; - background-color: #e9e9e9; + background-color: @menu-selected-bg; .borderRadius(2px); } } @@ -125,7 +127,7 @@ position: relative; &:after { - content: url("/skins/default/images/svg/context/icon_arrow.svg"); + content: url("/skins/default/images/svg/context/@{icon-arrow}"); right: 4px; position: absolute; top: 8px; @@ -168,15 +170,15 @@ .dropdown-item-svg { width: 16px; height: 16px; - fill:#83888d; - } + fill: #83888d; + } .dropdown-item-icon { width: 16px; height: 16px; margin: 8px 5px 0 0; float: left; - } + } } } @@ -251,7 +253,7 @@ } .dropdown-item-seporator { - border-top: 1px solid #E4E4E4; + border-top: 1px solid @bg-dropdown-separator; width: 100%; margin: 2px 0; } @@ -288,6 +290,19 @@ background-repeat: no-repeat; background-position: 4px center; float: none; + position: relative; + + &::before { + content: ""; + top: 0; + left: 0; + width: 24px; + height: 100%; + position: absolute; + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: 4px center; + background-color: @action-panel-context-bg; + } &.with-toggle { padding-right: 0; @@ -308,9 +323,9 @@ &.off { text-align: left; - background: #CCCCCC; + background: @toggle-switcher-bg; } - + .switcher { width: 9px; height: 9px; @@ -322,235 +337,388 @@ } } - &.accept { - background-image: url("/skins/default/images/svg/context/icon_accept.svg"); + &.accept::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_accept.svg"); + mask-image: url("/skins/default/images/svg/context/icon_accept.svg"); } - &.access { - background-image: url("/skins/default/images/svg/context/icon_access.svg"); + + &.access::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_access.svg"); + mask-image: url("/skins/default/images/svg/context/icon_access.svg"); } - &.add-email { - background-image: url("/skins/default/images/svg/context/icon_add_email.svg"); + + &.add-email::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_add_email.svg"); + mask-image: url("/skins/default/images/svg/context/icon_add_email.svg"); } - &.block { - background-image: url("/skins/default/images/svg/context/icon_block.svg"); + + &.block::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_block.svg"); + mask-image: url("/skins/default/images/svg/context/icon_block.svg"); } - &.call { - background-image: url("/skins/default/images/svg/context/icon_call.svg"); + + &.call::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_call.svg"); + mask-image: url("/skins/default/images/svg/context/icon_call.svg"); } - &.case { - background-image: url("/skins/default/images/svg/context/icon_case.svg"); + + &.case::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_case.svg"); + mask-image: url("/skins/default/images/svg/context/icon_case.svg"); } - &.calendar { - background-image: url("/skins/default/images/svg/context/icon_calendar.svg"); + + &.calendar::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_calendar.svg"); + mask-image: url("/skins/default/images/svg/context/icon_calendar.svg"); } - &.chat { - background-image: url("/skins/default/images/svg/context/icon_chat.svg"); + + &.chat::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_chat.svg"); + mask-image: url("/skins/default/images/svg/context/icon_chat.svg"); } - &.closed-tasks-report { - background-image: url("/skins/default/images/svg/context/icon_closed_tasks_report.svg"); + + &.closed-tasks-report::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_closed_tasks_report.svg"); + mask-image: url("/skins/default/images/svg/context/icon_closed_tasks_report.svg"); } - &.create { - background-image: url("/skins/default/images/svg/context/icon_create.svg"); + + &.create::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_create.svg"); + mask-image: url("/skins/default/images/svg/context/icon_create.svg"); } - &.create-form { - background-image: url("/skins/default/images/svg/context/icon_create_form.svg"); + + &.create-form::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_create_form.svg"); + mask-image: url("/skins/default/images/svg/context/icon_create_form.svg"); } - &.delete { - background-image: url("/skins/default/images/svg/context/icon_delete.svg"); + + &.delete::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_delete.svg"); + mask-image: url("/skins/default/images/svg/context/icon_delete.svg"); } - &.disable-item { - background-image: url("/skins/default/images/svg/context/icon_disable.svg"); + + &.disable-item::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_disable.svg"); + mask-image: url("/skins/default/images/svg/context/icon_disable.svg"); } - &.document { - background-image: url("/skins/default/images/svg/context/icon_document.svg"); + + &.impersonate-item::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_user.svg"); + mask-image: url("/skins/default/images/svg/context/icon_user.svg"); } - &.download { - background-image: url("/skins/default/images/svg/context/icon_download.svg"); + + &.document::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_document.svg"); + mask-image: url("/skins/default/images/svg/context/icon_document.svg"); } - &.download-as { - background-image: url("/skins/default/images/svg/context/icon_download_as.svg"); + + &.download::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_download.svg"); + mask-image: url("/skins/default/images/svg/context/icon_download.svg"); } - &.download-as { - background-image: url("/skins/default/images/svg/context/icon_download_as.svg"); + + &.download-as::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_download_as.svg"); + mask-image: url("/skins/default/images/svg/context/icon_download_as.svg"); } - &.edit { - background-image: url("/skins/default/images/svg/context/icon_edit.svg"); + + &.edit::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_edit.svg"); + mask-image: url("/skins/default/images/svg/context/icon_edit.svg"); } - &.email { - background-image: url("/skins/default/images/svg/context/icon_email.svg"); + + &.email::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_email.svg"); + mask-image: url("/skins/default/images/svg/context/icon_email.svg"); } - &.email-v2 { - background-image: url("/skins/default/images/svg/context/icon_email_v2.svg"); + + &.email-v2::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_email_v2.svg"); + mask-image: url("/skins/default/images/svg/context/icon_email_v2.svg"); } - &.empty-recycle-bin { - background-image: url("/skins/default/images/svg/context/icon_empty_recycle_bin.svg"); + + &.empty-recycle-bin::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_empty_recycle_bin.svg"); + mask-image: url("/skins/default/images/svg/context/icon_empty_recycle_bin.svg"); } - &.enable-item { - background-image: url("/skins/default/images/svg/context/icon_enable.svg"); + + &.enable-item::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_enable.svg"); + mask-image: url("/skins/default/images/svg/context/icon_enable.svg"); } - &.export { - background-image: url("/skins/default/images/svg/context/icon_export.svg"); + + &.export::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_export.svg"); + mask-image: url("/skins/default/images/svg/context/icon_export.svg"); } - &.extrn-link { - background-image: url("/skins/default/images/svg/context/icon_extrn_link.svg"); + + &.extrn-link::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_extrn_link.svg"); + mask-image: url("/skins/default/images/svg/context/icon_extrn_link.svg"); } - &.extrn-link-v2 { - background-image: url("/skins/default/images/svg/context/icon_extrn_link_v2.svg"); + + &.extrn-link-v2::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_extrn_link_v2.svg"); + mask-image: url("/skins/default/images/svg/context/icon_extrn_link_v2.svg"); } - &.favorites { - background-image: url("/skins/default/images/svg/context/icon_favorite.svg"); + + &.favorites::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_favorite.svg"); + mask-image: url("/skins/default/images/svg/context/icon_favorite.svg"); } - &.fill-form { - background-image: url("/skins/default/images/svg/context/icon_fill_form.svg"); + + &.fill-form::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_fill_form.svg"); + mask-image: url("/skins/default/images/svg/context/icon_fill_form.svg"); } - &.filter { - background-image: url("/skins/default/images/svg/context/icon_filter.svg"); + + &.filter::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_filter.svg"); + mask-image: url("/skins/default/images/svg/context/icon_filter.svg"); } - &.form-filling { - background-image: url("/skins/default/images/svg/context/icon_form_filling.svg"); + + &.form-filling::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_form_filling.svg"); + mask-image: url("/skins/default/images/svg/context/icon_form_filling.svg"); } - &.forward { - background-image: url("/skins/default/images/svg/context/icon_forward.svg"); + + &.forward::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_forward.svg"); + mask-image: url("/skins/default/images/svg/context/icon_forward.svg"); } - &.history { - background-image: url("/skins/default/images/svg/context/icon_history.svg"); + + &.history::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_history.svg"); + mask-image: url("/skins/default/images/svg/context/icon_history.svg"); } - &.image { - background-image: url("/skins/default/images/svg/context/icon_image.svg"); + + &.image::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_image.svg"); + mask-image: url("/skins/default/images/svg/context/icon_image.svg"); } - &.invoice { - background-image: url("/skins/default/images/svg/context/icon_invoice.svg"); + + &.invoice::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_invoice.svg"); + mask-image: url("/skins/default/images/svg/context/icon_invoice.svg"); } - &.invoice-draft { - background-image: url("/skins/default/images/svg/context/icon_invoice_draft.svg"); + + &.invoice-draft::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_invoice_draft.svg"); + mask-image: url("/skins/default/images/svg/context/icon_invoice_draft.svg"); } - &.invoice-paid { - background-image: url("/skins/default/images/svg/context/icon_invoice_paid.svg"); + + &.invoice-paid::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_invoice_paid.svg"); + mask-image: url("/skins/default/images/svg/context/icon_invoice_paid.svg"); } - &.invoice-rejected { - background-image: url("/skins/default/images/svg/context/icon_invoice_rejected.svg"); + + &.invoice-rejected::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_invoice_rejected.svg"); + mask-image: url("/skins/default/images/svg/context/icon_invoice_rejected.svg"); } - &.invoice-send { - background-image: url("/skins/default/images/svg/context/icon_invoice_send.svg"); + + &.invoice-send::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_invoice_send.svg"); + mask-image: url("/skins/default/images/svg/context/icon_invoice_send.svg"); } - &.link { - background-image: url("/skins/default/images/svg/context/icon_link.svg"); + + &.link::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_link.svg"); + mask-image: url("/skins/default/images/svg/context/icon_link.svg"); } - &.mark-as-important { - background-image: url("/skins/default/images/svg/context/icon_mark_as_important.svg"); + + &.mark-as-important::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_mark_as_important.svg"); + mask-image: url("/skins/default/images/svg/context/icon_mark_as_important.svg"); } - &.mark-as-read { - background-image: url("/skins/default/images/svg/context/icon_mark_as_read.svg"); + + &.mark-as-read::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_mark_as_read.svg"); + mask-image: url("/skins/default/images/svg/context/icon_mark_as_read.svg"); } - &.move { - background-image: url("/skins/default/images/svg/context/icon_move.svg"); + + &.move::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_move.svg"); + mask-image: url("/skins/default/images/svg/context/icon_move.svg"); } - &.move-or-copy { - background-image: url("/skins/default/images/svg/context/icon_move_or_copy.svg"); + + &.move-or-copy::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_move_or_copy.svg"); + mask-image: url("/skins/default/images/svg/context/icon_move_or_copy.svg"); } - &.move-to-milestone { - background-image: url("/skins/default/images/svg/context/icon_move_to_milestone.svg"); + + &.move-to-milestone::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_move_to_milestone.svg"); + mask-image: url("/skins/default/images/svg/context/icon_move_to_milestone.svg"); } - &.new-opportunity { - background-image: url("/skins/default/images/svg/context/icon_new_opportunity.svg"); + + &.new-opportunity::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_new_opportunity.svg"); + mask-image: url("/skins/default/images/svg/context/icon_new_opportunity.svg"); } - &.new-tab { - background-image: url("/skins/default/images/svg/context/icon_new_tab.svg"); + + &.new-tab::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_new_tab.svg"); + mask-image: url("/skins/default/images/svg/context/icon_new_tab.svg"); } - &.new-task { - background-image: url("/skins/default/images/svg/context/icon_new_task.svg"); + + &.new-task::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_new_task.svg"); + mask-image: url("/skins/default/images/svg/context/icon_new_task.svg"); } - &.notify-responsible { - background-image: url("/skins/default/images/svg/context/icon_notify_responsible.svg"); + + &.notify-responsible::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_notify_responsible.svg"); + mask-image: url("/skins/default/images/svg/context/icon_notify_responsible.svg"); } - &.open-folder { - background-image: url("/skins/default/images/svg/context/icon_open_folder.svg"); + + &.open-folder::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_open_folder.svg"); + mask-image: url("/skins/default/images/svg/context/icon_open_folder.svg"); } - &.open-location { - background-image: url("/skins/default/images/svg/context/icon_open_location.svg"); + + &.open-location::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_open_location.svg"); + mask-image: url("/skins/default/images/svg/context/icon_open_location.svg"); } - &.open-mail { - background-image: url("/skins/default/images/svg/context/icon_open_mail.svg"); + + &.open-mail::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_open_mail.svg"); + mask-image: url("/skins/default/images/svg/context/icon_open_mail.svg"); } - &.open-tasks-report { - background-image: url("/skins/default/images/svg/context/icon_open_tasks_report.svg"); + + &.open-tasks-report::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_open_tasks_report.svg"); + mask-image: url("/skins/default/images/svg/context/icon_open_tasks_report.svg"); } - &.permissions { - background-image: url("/skins/default/images/svg/context/icon_permissions.svg"); + + &.permissions::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_permissions.svg"); + mask-image: url("/skins/default/images/svg/context/icon_permissions.svg"); } - &.phone { - background-image: url("/skins/default/images/svg/context/icon_phone.svg"); + + &.phone::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_phone.svg"); + mask-image: url("/skins/default/images/svg/context/icon_phone.svg"); } - &.preview { - background-image: url("/skins/default/images/svg/context/icon_preview.svg"); + + &.preview::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_preview.svg"); + mask-image: url("/skins/default/images/svg/context/icon_preview.svg"); } - &.print { - background-image: url("/skins/default/images/svg/context/icon_print.svg"); + + &.print::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_print.svg"); + mask-image: url("/skins/default/images/svg/context/icon_print.svg"); } - &.project { - background-image: url("/skins/default/images/svg/context/icon_project.svg"); + + &.project::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_project.svg"); + mask-image: url("/skins/default/images/svg/context/icon_project.svg"); } - &.reassign-data { - background-image: url("/skins/default/images/svg/context/icon_reassign_data.svg"); + + &.reassign-data::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_reassign_data.svg"); + mask-image: url("/skins/default/images/svg/context/icon_reassign_data.svg"); } - &.rename { - background-image: url("/skins/default/images/svg/context/icon_rename.svg"); + + &.rename::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_rename.svg"); + mask-image: url("/skins/default/images/svg/context/icon_rename.svg"); } - &.reply { - background-image: url("/skins/default/images/svg/context/icon_reply.svg"); + + &.reply::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_reply.svg"); + mask-image: url("/skins/default/images/svg/context/icon_reply.svg"); } - &.reply-all { - background-image: url("/skins/default/images/svg/context/icon_reply_all.svg"); + + &.reply-all::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_reply_all.svg"); + mask-image: url("/skins/default/images/svg/context/icon_reply_all.svg"); } - &.restore { - background-image: url("/skins/default/images/svg/context/icon_restore.svg"); + + &.restore::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_restore.svg"); + mask-image: url("/skins/default/images/svg/context/icon_restore.svg"); } - &.ringtone { - background-image: url("/skins/default/images/svg/context/icon_ringtone.svg"); + + &.ringtone::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_ringtone.svg"); + mask-image: url("/skins/default/images/svg/context/icon_ringtone.svg"); } - &.settings { - background-image: url("/skins/default/images/svg/context/icon_settings.svg"); + + &.settings::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_settings.svg"); + mask-image: url("/skins/default/images/svg/context/icon_settings.svg"); } - &.sign { - background-image: url("/skins/default/images/svg/context/icon_sign.svg"); + + &.sign::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_sign.svg"); + mask-image: url("/skins/default/images/svg/context/icon_sign.svg"); } - &.spam { - background-image: url("/skins/default/images/svg/context/icon_spam.svg"); + + &.spam::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_spam.svg"); + mask-image: url("/skins/default/images/svg/context/icon_spam.svg"); } - &.subtask { - background-image: url("/skins/default/images/svg/context/icon_subtask.svg"); + + &.subtask::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_subtask.svg"); + mask-image: url("/skins/default/images/svg/context/icon_subtask.svg"); } - &.subtask-v2 { - background-image: url("/skins/default/images/svg/context/icon_subtask_v2.svg"); + + &.subtask-v2::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_subtask_v2.svg"); + mask-image: url("/skins/default/images/svg/context/icon_subtask_v2.svg"); } - &.templates { - background-image: url("/skins/default/images/svg/context/icon_template.svg"); + + &.templates::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_template.svg"); + mask-image: url("/skins/default/images/svg/context/icon_template.svg"); } - &.track-time { - background-image: url("/skins/default/images/svg/context/icon_track_time.svg"); + + &.track-time::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_track_time.svg"); + mask-image: url("/skins/default/images/svg/context/icon_track_time.svg"); } - &.un-notify-responsible { - background-image: url("/skins/default/images/svg/context/icon_un_notify_responsible.svg"); + + &.un-notify-responsible::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_un_notify_responsible.svg"); + mask-image: url("/skins/default/images/svg/context/icon_un_notify_responsible.svg"); } - &.unlink { - background-image: url("/skins/default/images/svg/context/icon_unlink.svg"); + + &.unlink::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_unlink.svg"); + mask-image: url("/skins/default/images/svg/context/icon_unlink.svg"); } - &.unlink-v2 { - background-image: url("/skins/default/images/svg/context/icon_unlink_v2.svg"); + + &.unlink-v2::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_unlink_v2.svg"); + mask-image: url("/skins/default/images/svg/context/icon_unlink_v2.svg"); } - &.user { - background-image: url("/skins/default/images/svg/context/icon_user.svg"); + + &.user::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_user.svg"); + mask-image: url("/skins/default/images/svg/context/icon_user.svg"); } - &.user-active { - background-image: url("/skins/default/images/svg/context/icon_user_active.svg"); + + &.user-active::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_user_active.svg"); + mask-image: url("/skins/default/images/svg/context/icon_user_active.svg"); } - &.user-deactive { - background-image: url("/skins/default/images/svg/context/icon_user_deactive.svg"); + + &.user-deactive::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_user_deactive.svg"); + mask-image: url("/skins/default/images/svg/context/icon_user_deactive.svg"); } - &.user-new { - background-image: url("/skins/default/images/svg/context/icon_user_new.svg"); + + &.user-new::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_user_new.svg"); + mask-image: url("/skins/default/images/svg/context/icon_user_new.svg"); } - &.user-v2 { - background-image: url("/skins/default/images/svg/context/icon_user_v2.svg"); + + &.user-v2::before { + -webkit-mask-image: url("/skins/default/images/svg/context/icon_user_v2.svg"); + mask-image: url("/skins/default/images/svg/context/icon_user_v2.svg"); } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/app_install.less b/web/studio/ASC.Web.Studio/skins/default/app_install.less index 43fb0cfc7..07730990a 100644 --- a/web/studio/ASC.Web.Studio/skins/default/app_install.less +++ b/web/studio/ASC.Web.Studio/skins/default/app_install.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + .Container { margin: auto; padding-left: 0px; diff --git a/web/studio/ASC.Web.Studio/skins/default/buttons.less b/web/studio/ASC.Web.Studio/skins/default/buttons.less index 3617ebd49..fa0376d80 100644 --- a/web/studio/ASC.Web.Studio/skins/default/buttons.less +++ b/web/studio/ASC.Web.Studio/skins/default/buttons.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,7 +36,7 @@ outline: none; } .button { - &.display-none{ + &.display-none { display: none; } @@ -143,13 +143,13 @@ } &.white { - background-color: #fff; - color: #333333; + background-color: @body-color; + color: @textColor; .border-button-default (); &:hover { - background-color: #fff; - color: #333333; + background-color: @body-color; + color: @textColor; } } @@ -282,7 +282,7 @@ left: 0; position: absolute; width: 41px; - color: white; + color: @bodyColor2; font-size: 10px; border-radius: 3px; line-height: 14px; @@ -290,7 +290,7 @@ border-bottom-right-radius: 3px; top: 0px; content: "on"; - background-color: #3b72a7; + background-color: @on-off-on-button-before-bg; box-sizing: border-box; padding: 0 7px; text-align: left; @@ -301,8 +301,8 @@ &:after { height: 16px; width: 16px; - background-color: #f0f0f0; - border: 1px solid #cecece; + background-color: @on-off-on-button-after-bg; + border: 1px solid @on-off-on-button-after-bor; border-radius: 3px; content: ""; position: absolute; @@ -320,10 +320,10 @@ position: absolute; width: 41px; content: "off"; - color: white; + color: @on-off-off-button-before-color; font-size: 10px; border-radius: 3px; - background-color: #aeaeae; + background-color: @on-off-off-button-before-bg; box-sizing: border-box; padding: 0 7px; text-align: right; @@ -331,13 +331,14 @@ border-top-right-radius: 3px; border-bottom-right-radius: 3px; top: 0px; + border: @on-off-off-button-before-bor; } &:after { height: 16px; width: 16px; - background-color: #f0f0f0; - border: 1px solid #cecece; + background-color: @on-off-on-button-after-bg; + border: 1px solid @on-off-on-button-after-bor; border-radius: 3px; content: ""; position: absolute; @@ -369,10 +370,10 @@ position: absolute; width: 41px; content: "off"; - color: white; + color: @buttons-chackbox-off-color; font-size: 10px; border-radius: 3px; - background-color: #aeaeae; + background-color: @buttons-checkbox-off-bg; box-sizing: border-box; padding: 0 7px; text-align: right; @@ -380,13 +381,14 @@ border-top-right-radius: 3px; border-bottom-right-radius: 3px; top:0px; + border:@buttons-checkbox-off-bor; } .on-off-checkbox + label:after { height: 16px; width: 16px; - background-color: #f0f0f0; - border: 1px solid #cecece; + background-color: @buttons-checkbox-on-off-bg; + border: 1px solid @buttons-checkbox-on-off-color; border-radius: 3px; content: ""; position: absolute; @@ -398,12 +400,14 @@ .on-off-checkbox:checked + label:before { content: "on"; - background-color: #3b72a7; + background-color: @buttons-checkbox-on-bg; box-sizing: border-box; padding: 0 6px; text-align: left; border-top-right-radius: 8px; border-bottom-right-radius: 8px; + color:@buttons-checkbox-on-color; + border: none; } .on-off-checkbox:checked + label:after { left: 25px; @@ -497,6 +501,8 @@ body.custom-mode { &:hover { background-color: @bg-button-default-hover; + color: @itemRowButtonTextColor; + .borderButtons(@border-button-default-item-row); } &.__share:after { @@ -532,11 +538,11 @@ body.custom-mode { /******************************************************************************* Toggle switch buttons *******************************************************************************/ -@border-color: #C4C4C4; -@active-color: #999999; -@text-active-color: #FFFFFF; -@default-color: #EBEBEB; -@text-default-color: #666666; +@border-color: @border-button-default; +@active-color: @active-color-bg-button-group; +@text-active-color: @body-color; +@default-color: @bg-button-default; +@text-default-color: @button-span-default-color; .buttonGroup { position: relative; @@ -564,7 +570,7 @@ body.custom-mode { margin: -1px; background: @active-color; color: @text-active-color; - border: 1px solid @active-color; + border: 1px solid @active-color-button-group; &:first-of-type { border-radius: 3px 0 0 3px; diff --git a/web/studio/ASC.Web.Studio/skins/default/codestyle.css b/web/studio/ASC.Web.Studio/skins/default/codestyle.less similarity index 90% rename from web/studio/ASC.Web.Studio/skins/default/codestyle.css rename to web/studio/ASC.Web.Studio/skins/default/codestyle.less index 16e1b3eea..7c983860e 100644 --- a/web/studio/ASC.Web.Studio/skins/default/codestyle.css +++ b/web/studio/ASC.Web.Studio/skins/default/codestyle.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,68 +15,70 @@ */ -.codestyle, -.codestyle pre { - font-size: small; - color: black; - font-family: Consolas, "Courier New", Courier, Monospace; - background-color: #ffffff; - margin: 8px 0; -} -.codestyle ul, -.codestyle pre { - list-style-type: none; - margin: 0; -} -.codestyle table { - border: 1px none Black; - width: 100%; -} -.codestyle table td { - padding: 5px 3px; -} -.codestyle table td.lines { - border-right: 1px none black; - text-align: right; -} -.codestyle table td.tdcode pre { - width: 670px; - overflow-x: auto; - overflow-y: hidden; -} -.codestyle .rem { - color: #008000; -} -.codestyle .kwrd { - color: #0000ff; -} -.codestyle .str { - color: #006080; -} -.codestyle .op { - color: #0000c0; -} -.codestyle .preproc { - color: #cc6633; -} -.codestyle .asp { - background-color: #ffff00; -} -.codestyle .html { - color: #800000; -} -.codestyle .attr { - color: #ff0000; -} -.codestyle .alt { - background-color: #f4f4f4; - width: 100%; - margin: 0; -} -.codestyle .lnum { - color: #606060; -} -.codestyle ol li, -.codestyle ul li { - white-space: pre-wrap; -} +@import "params.less"; + +.codestyle, +.codestyle pre { + font-size: small; + color: black; + font-family: Consolas, "Courier New", Courier, Monospace; + background-color: @body-color; + margin: 8px 0; +} +.codestyle ul, +.codestyle pre { + list-style-type: none; + margin: 0; +} +.codestyle table { + border: 1px none Black; + width: 100%; +} +.codestyle table td { + padding: 5px 3px; +} +.codestyle table td.lines { + border-right: 1px none black; + text-align: right; +} +.codestyle table td.tdcode pre { + width: 670px; + overflow-x: auto; + overflow-y: hidden; +} +.codestyle .rem { + color: #008000; +} +.codestyle .kwrd { + color: #0000ff; +} +.codestyle .str { + color: #006080; +} +.codestyle .op { + color: #0000c0; +} +.codestyle .preproc { + color: #cc6633; +} +.codestyle .asp { + background-color: #ffff00; +} +.codestyle .html { + color: #800000; +} +.codestyle .attr { + color: #ff0000; +} +.codestyle .alt { + background-color: #f4f4f4; + width: 100%; + margin: 0; +} +.codestyle .lnum { + color: #606060; +} +.codestyle ol li, +.codestyle ul li { + white-space: pre-wrap; +} diff --git a/web/studio/ASC.Web.Studio/skins/default/comments-container.less b/web/studio/ASC.Web.Studio/skins/default/comments-container.less index 74479f4ac..a33837290 100644 --- a/web/studio/ASC.Web.Studio/skins/default/comments-container.less +++ b/web/studio/ASC.Web.Studio/skins/default/comments-container.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + div.comments-item-container { padding: 8px 5px 8px 15px; diff --git a/web/studio/ASC.Web.Studio/skins/default/common.less b/web/studio/ASC.Web.Studio/skins/default/common.less index 685a27d70..e7f85b1ad 100644 --- a/web/studio/ASC.Web.Studio/skins/default/common.less +++ b/web/studio/ASC.Web.Studio/skins/default/common.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,7 @@ html } .h_line { - background-color: #D1D1D1; + background-color: @borderColor; height: 1px; line-height: 1px; margin-bottom: 20px; @@ -74,8 +74,8 @@ html base markup *******************************************************************************/ body { - background-color: #fff; - color: #333333; + background-color: @body-color; + color: @textColor; font: normal 12px @baseFont; height: 100%; margin: 0px; @@ -91,7 +91,7 @@ body.desktop { MozUserSelect: none; } pre { - color: #333333; + color: @textColor; font-family: @baseFont; font-size: 12px; text-decoration: none; @@ -104,6 +104,10 @@ div { } input,textarea, select { font-family: @baseFont; + background-color: @back-ground-text; + color:@bg-a-activate; + accent-color: @checkbox-accent-color; + color-scheme: @checkbox-color-sheme; } .ui-datepicker { font-family: @baseFont !important; @@ -130,49 +134,6 @@ input,textarea, select { overflow: hidden; } -.mainPageTable { - float: none; - width: 100%; - height: 100%; - min-height:350px; - overflow: auto; - - .mainPageTableSidePanel { - border-bottom: medium none; - border-left: medium none; - border-top: medium none; - overflow: hidden; - .textOverflowEllipsis(); - min-width: 240px; - width: 240px; - padding-bottom: 24px; - padding-right: 24px; - vertical-align: top; - - &.ui-resizable { - overflow: visible; - - .ui-resizable-handle.ui-resizable-e { - cursor: col-resize; - } - } - } - - .mainPageContent { - padding-bottom: 24px; - vertical-align: top; - } - - &.with-mainPageTableSidePanel .mainPageContent { - padding-left: 24px; - - &.calendar{ - padding-left: 0; - padding-bottom: 0; - } - } -} - #studio_sidePanel { overflow: hidden; .textOverflowEllipsis(); @@ -201,17 +162,17 @@ input,textarea, select { border: none; .ui-datepicker-next.ui-corner-all.ui-state-hover, .ui-datepicker-prev.ui-corner-all.ui-state-hover { - border-color:#ddd !important; - background-color:#ddd !important; + border-color: @datepick-ui-bg !important; + background-color: @datepick-ui-bg !important; } } .ui-widget-header .ui-corner-all.ui-state-hover { - border-color:#ddd; - background-color:#ddd; + border-color: @datepick-ui-bg; + background-color: @datepick-ui-bg; } .ui-datepicker-title { .ui-datepicker-month, .ui-datepicker-year { - border: 1px solid #ffffff; + border: 1px solid @body-color; text-decoration: underline; text-decoration-style: dotted; font-weight: bold; @@ -219,7 +180,7 @@ input,textarea, select { cursor: pointer; padding-bottom: 0.1em; appearance: none; - background-color: transparent; + background-color: @body-color; width: auto; } } @@ -238,10 +199,10 @@ input,textarea, select { } .ui-datepicker a.ui-state-default { - border: 1px solid #ffffff; - background: #fff; + border: 1px solid @body-color; + background: @body-color; font-weight: normal; - color: #555555; + color: @textColor; text-align: center; border-radius: 3px; width: 16px; @@ -250,34 +211,34 @@ input,textarea, select { } .ui-datepicker-prev-hover.ui-corner-all { - border-color:#ddd !important; - background:#ddd !important; + border-color: @datepick-ui-bg !important; + background: @datepick-ui-bg !important; } .ui-datepicker-calendar a.ui-state-default { &.ui-state-hover { - border: 1px solid #ddd !important; - background: #ddd !important; + border: 1px solid @datepick-ui-bg !important; + background: @datepick-ui-bg !important; font-weight: normal; - color: #555555 !important; + color: @textColor !important; } } .ui-datepicker a.ui-state-default { &.ui-state-hover, &.ui-state-active, &.ui-state-highlight.ui-state-active, &.ui-state-highlight.ui-state-hover { - border: 1px solid #ddd !important; - background: #ddd !important; + border: 1px solid @datepick-ui-bg !important; + background: @datepick-ui-bg !important; font-weight: normal; - color: #555555 !important; + color: @textColor !important; } } .ui-datepicker a.ui-state-default { &.ui-state-highlight { - border: 1px solid #fefde9 !important; - background: #fefde9 !important; + border: 1px solid @ui-state-highlight !important; + background: @ui-state-highlight !important; font-weight: normal; - color: #555555 !important; + color: @textColor !important; } } @@ -289,8 +250,8 @@ input,textarea, select { } .ui-widget-header .ui-corner-all.ui-state-hover { - border-color: #ddd; - background: #ddd; + border-color: @datepick-ui-bg; + background: @datepick-ui-bg; } .ui-datepicker-title .ui-datepicker-month, .ui-datepicker-title .ui-datepicker-year { @@ -348,11 +309,14 @@ input,textarea, select { } .textEdit { - border: solid 1px #c7c7c7; + border: solid 1px @borderColor2; + background-color: @back-ground-text; + color: @bg-a-activate; font-size: 12px; height: 16px; .borderRadius(0); + &.with-error { border-color: #cc3300; } @@ -361,20 +325,22 @@ input,textarea, select { .pwdLoginTextbox { .borderRadius(3px); - background-color: #ffffff; - border: solid 1px #c7c7c7; - color: #434341; + background-color: @body-color; + border: solid 1px @borderColor2; + color: @pwdloginTextbox-col; font-size: 18px; padding: 8px 20px; width: 358px; } textarea { - border: 1px solid #c7c7c7; + border: 1px solid @borderColor2; + background-color: @back-ground-text; + color: @bg-a-activate; font-size: 12px; resize: vertical; scrollbar-width: thin; - scrollbar-color: #BFBFBF #F5F5F5; + scrollbar-color: #BFBFBF @bg-button-default-hover; &::-webkit-resizer { background-image: url("data:image/svg+xml,%3Csvg%20width%3D%229%22%20height%3D%229%22%20viewBox%3D%220%200%209%209%22%20fill%3D%22%23657077%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Crect%20width%3D%222%22%20height%3D%2210.2007%22%20rx%3D%221%22%20transform%3D%22matrix(-0.707107%20-0.707107%20-0.707107%200.707107%208.6272%201.41418)%22%20fill%3D%22%23C4C4C4%22%2F%3E%0A%3Crect%20width%3D%222%22%20height%3D%223.13727%22%20rx%3D%221%22%20transform%3D%22matrix(-0.707107%20-0.707107%20-0.707107%200.707107%208.63062%206.41077)%22%20fill%3D%22%23C4C4C4%22%2F%3E%0A%3C%2Fsvg%3E"); @@ -390,8 +356,10 @@ textarea { } .comboBox { - border: solid 1px #c7c7c7; + border: solid 1px @borderColor2; font-size: 12px; + background-color: @back-ground-text; + color: @bg-a-activate; } select.comboBox { height: 23px; @@ -404,18 +372,18 @@ select:focus { margin: 1px; } .comboBoxHiddenBorder:hover, .comboBoxHiddenBorderFocused { - border: solid 1px #c7c7c7; + border: solid 1px @borderColor2; margin: 0px; } :disabled, -input.disabled, +input.disabled, textarea.disabled, option.disabled, /* fix ie8 */ input[disabled="disabled"] { - background-color: #efefef; - color: #666562; + background-color: @disabled; + color: @input-disabled-col; } input:focus { outline: none; @@ -460,9 +428,9 @@ input[type="checkbox"][disabled="disabled"] { color: #74af00; } .okBox { - background-color: #E5EFD1; - border: 1px solid #dddddd; - color: #74af00; + background-color: @okBox-bg; + border: 1px solid @okBox-bor; + color: @okBox-col; font-weight: bolder; padding: 8px 11px; margin: 5px 0px; @@ -495,7 +463,7 @@ a:focus { } /*header link as common header*/ a.linkHeader, a.linkHeader:visited, a.linkHeader:hover, a.linkHeader:active { - color: #333333; + color: @textColor; font-size: 16px; font-weight: bolder; text-decoration: none; @@ -509,7 +477,7 @@ a.linkHeader:active { /*medium link font-size 12*/ a.linkHeaderMedium, a.linkHeaderMedium:visited, a.linkHeaderMedium:active { - color: #333333; + color: @textColor; font-size: 12px; font-weight: bold; text-decoration: none; @@ -517,7 +485,7 @@ a.linkHeaderMedium, a.linkHeaderMedium:visited, a.linkHeaderMedium:active } a.linkMedium, a.linkMedium:visited, a.linkMedium:active { - color: #333333; + color: @textColor; font-size: 12px; text-decoration: none; cursor: pointer; @@ -529,7 +497,7 @@ a.linkHeaderMedium:hover, a.linkMedium:hover /*---------gray profile and so on links----*/ a.linkDescribe, a.linkDescribe:visited ,a.linkDescribe:active { - color: #646567; + color: @a-link-describe; font-size: 11px; text-decoration: underline; } @@ -537,9 +505,9 @@ a.linkDescribe:hover { text-decoration: none; } -a.linkText, a.linkText:visited,a.linkText:active { +a.linkText, a.linkText:visited, a.linkText:active { font-size: 12px; - color: #333333; + color: @textColor; text-decoration: none; } a.linkText:hover { @@ -552,8 +520,8 @@ a.linkText:hover { white-space:nowrap; } -a.linkAction, a.linkAction:visited,a.linkAction:active { - color: #333; +a.linkAction, a.linkAction:visited, a.linkAction:active { + color: @textColor; font-size: 12px !important; text-decoration: underline; } @@ -565,13 +533,13 @@ a.linkAction:hover { /*-------------------------Backgrounds--------------------------*/ .tintLight { - background-color: #ffffff; + background-color: @body-color; } .tintGray { background-color: #f0f0f0; } .tintMedium { - background-color: #fff; + background-color: @bg-tint-medium; } .tintDangerous { background-color: #fff6df; @@ -613,7 +581,7 @@ a.linkAction:hover { /*----------------Borders and Corners------------------*/ .borderBase { - border: solid 1px #d1d1d1; + border: solid 1px @bg-border-base; } .borderLight @@ -624,20 +592,20 @@ a.linkAction:hover { /*----------------loaders------------------*/ .loader-text-block { - background: url("images/loader_32.gif") no-repeat scroll left center transparent; + background: url("images/@{loader-gif-32}") no-repeat scroll left center transparent; display:inline-block; color: @textColorGrayDark; font-size: 11px; padding:10px 0 10px 40px; text-decoration:none; } -.loading-link, .loading-link:hover{ - background: url("images/loader_16.gif") no-repeat scroll left center transparent; +.loading-link, .loading-link:hover { + background: url("images/@{loader-gif-16}") no-repeat scroll left center transparent; color: @textColorGrayDark; cursor: default; font-weight: bold; padding-left: 20px; - text-decoration:none; + text-decoration: none; } /*----------------Style Placeholder------------------*/ ::-webkit-input-placeholder { /* WebKit browsers */ @@ -676,4 +644,24 @@ a.linkAction:hover { left: 0; margin-top: -2px; } +} + +/*----------------Beta label------------------*/ + +.beta { + padding: 2px 4px 2px 4px; + line-height: 14px; + color: @beta-text; + background-color: @beta-background; + text-align: center; + border: none; + font-size: 10px; + margin: 0 0 0 12px; + border-radius: 2px; + width: 22px; + height: 14px; + + &:after { + content: "Beta"; + } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/common_style.de-de.css b/web/studio/ASC.Web.Studio/skins/default/common_style.de-de.css index 176655636..c8af36c5b 100644 --- a/web/studio/ASC.Web.Studio/skins/default/common_style.de-de.css +++ b/web/studio/ASC.Web.Studio/skins/default/common_style.de-de.css @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/skins/default/common_style.es-es.css b/web/studio/ASC.Web.Studio/skins/default/common_style.es-es.css index 55a793b81..c2934c730 100644 --- a/web/studio/ASC.Web.Studio/skins/default/common_style.es-es.css +++ b/web/studio/ASC.Web.Studio/skins/default/common_style.es-es.css @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/skins/default/common_style.fr-fr.css b/web/studio/ASC.Web.Studio/skins/default/common_style.fr-fr.css index a4af1f0f8..05fd7df61 100644 --- a/web/studio/ASC.Web.Studio/skins/default/common_style.fr-fr.css +++ b/web/studio/ASC.Web.Studio/skins/default/common_style.fr-fr.css @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/skins/default/common_style.it-it.css b/web/studio/ASC.Web.Studio/skins/default/common_style.it-it.css index d6721ebd8..cda392eca 100644 --- a/web/studio/ASC.Web.Studio/skins/default/common_style.it-it.css +++ b/web/studio/ASC.Web.Studio/skins/default/common_style.it-it.css @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/skins/default/common_style.less b/web/studio/ASC.Web.Studio/skins/default/common_style.less index e0db38009..071c444ac 100644 --- a/web/studio/ASC.Web.Studio/skins/default/common_style.less +++ b/web/studio/ASC.Web.Studio/skins/default/common_style.less @@ -1,21 +1,22 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @import "../base.less"; +@import "params.less"; /******************************************************************************* link styles *******************************************************************************/ @@ -64,10 +65,10 @@ span.addUserLink { width: 8px; position: relative; - &:after{ + &:after { border-left: 4px solid transparent; border-right: 4px solid transparent; - border-top: 4px solid #212121; + border-top: 4px solid @sort-down; content: ""; display: block; height: 0; @@ -79,7 +80,7 @@ span.addUserLink { } } .sort-down-gray:after { - border-top-color: #83888C; + border-top-color: @sort-down-gray; } /******************************************************************************* Splitters @@ -98,11 +99,11 @@ span.addUserLink { *******************************************************************************/ .userMiniPhoto { - border: solid 1px #C7C7C7; + border: solid 1px @borderColor2; } .userPhoto { display: block; - border: solid 1px #C7C7C7; + border: solid 1px @borderColor2; } /******************************************************************************* @@ -110,20 +111,20 @@ span.addUserLink { *******************************************************************************/ .popupContainerClass, .mainContainerClass .popupContainerClass { - background: none repeat scroll 0 0 #ffffff; - border: 1px solid #D1D1D1; -} - -.popupContainerClass .containerHeaderBlock, -.mainContainerClass .popupContainerClass .containerHeaderBlock, -.importAreaBlock .containerHeaderBlock { - vertical-align: middle; - background: #E2E2E2; - padding: 9px 23px 9px 24px; - color: #333333; - font-size: 18px; - font-weight: normal; - .borderRadiusTop(5px); + background: none repeat scroll 0 0 @body-color; + border: 1px solid @borderColor; +} + +.popupContainerClass .containerHeaderBlock, +.mainContainerClass .popupContainerClass .containerHeaderBlock, +.importAreaBlock .containerHeaderBlock { + vertical-align: middle; + background: @popupContainerHeaderBlock; + padding: 9px 23px 9px 24px; + color: @textColor; + font-size: 18px; + font-weight: normal; + .borderRadiusTop(5px); } .popupContainerClass .containerHeaderBlock .popupCancel, @@ -135,20 +136,20 @@ span.addUserLink { vertical-align: middle; } -.popupContainerClass .containerHeaderBlock .popupCancel .cancelButton, -.mainContainerClass .popupContainerClass .containerHeaderBlock .popupCancel .cancelButton, +.popupContainerClass .containerHeaderBlock .popupCancel .cancelButton, +.mainContainerClass .popupContainerClass .containerHeaderBlock .popupCancel .cancelButton, .popupContainerClass .cancelButton { font-size: 28px; - color: #333; + color: @textColor; cursor: pointer; - margin-left: 10px; + margin-left: 10px; } .popupContainerClass .containerBodyBlock, .mainContainerClass .popupContainerClass .containerBodyBlock { - background-color: #FFF; + background-color: @body-color; padding: 19px 24px 24px 24px; - color: #333; + color: @textColor; font-size: 12px; font-weight: normal; text-decoration: none; @@ -158,7 +159,7 @@ span.addUserLink { } .popupContainerClass .containerBodyBlock .exclamation { - background-image: url("images/exclamation.png"); + background-image: url("images/exclamation.svg"); height: 100px; width: 100px; } @@ -167,7 +168,7 @@ span.addUserLink { *******************************************************************************/ .loader-container, .popupContainerClass .loader-popup { - background: url("images/loader_16.gif") no-repeat scroll 0 0 transparent; + background: url("images/@{loader-gif-16}") no-repeat scroll 0 0 transparent; color: #999999; font-size: 11px; line-height: 18px; @@ -175,32 +176,35 @@ span.addUserLink { position: absolute; top: -24px; left: 0; - } - -.notify-panel { - .error-region, - .success-region, - .info-region { - font-size: 12px; - padding: 9px 10px 9px 35px; - } - - .error-region { - background: url("imagescss/toast_icon01.png") no-repeat scroll 7px 6px #ffbfaa; - } - - .success-region { - background: url("imagescss/toast_icon02.png") no-repeat scroll 7px 6px #cae796; - } - - .info-region { - background: url("imagescss/toast_icon01.png") no-repeat scroll 7px 6px #f5e1a2; - } + } + +.notify-panel { + .error-region, + .success-region, + .info-region { + font-size: 12px; + padding: 9px 10px 9px 35px; + } + + .error-region { + background: url("imagescss/toast_icon01.png") no-repeat scroll 7px 6px @notify-panel-error-bg; + border: @notify-panel-error-bor; + } + + .success-region { + background: url("imagescss/toast_icon02.png") no-repeat scroll 7px 6px @notify-panel-succes-bg; + border: @notify-panel-succes-bor; + } + + .info-region { + background: url("imagescss/toast_icon01.png") no-repeat scroll 7px 6px @notify-panel-info-bg; + border: @notify-panel-info-bor; + } } .error-container { background: url("imagescss/toast_icon01.png") no-repeat scroll 5px 0px #f5e1a2; - color: #333; + color: @textColor; position: absolute; padding: 4px 0; top:-29px; @@ -210,7 +214,7 @@ span.addUserLink { .success-container { background: url("imagescss/toast_icon02.png") no-repeat scroll 5px 0px #cbea95; - color: #333; + color: @textColor; position: absolute; padding: 4px 0; top:-29px; @@ -220,20 +224,21 @@ span.addUserLink { .error-container span, .success-container span { padding: 0 10px 0 30px; -} - -.error-popup { - background: url("imagescss/toast_icon01.png") no-repeat scroll 7px 6px #f5e1a2; - color: #333; - font-size: 12px; - padding: 9px 10px 9px 35px; - position: relative; +} + +.error-popup { + background: url("imagescss/toast_icon01.png") no-repeat scroll 7px 6px @error-popup-col; + color: @textColor; + font-size: 12px; + padding: 9px 10px 9px 35px; + position: relative; + border: @error-popup-bor; } .read-confirmation-popup { background: url('images/svg/mail/letter.svg') no-repeat scroll 10px 9px #d0eaf5; - color: #333; + color: @textColor; font-size: 12px; padding: 9px 10px 9px 35px; position: relative; @@ -241,7 +246,7 @@ span.addUserLink { .success-popup { background-color: #cbea95; - color: #333; + color: @textColor; font-size: 12px; padding: 9px 10px; position: relative; @@ -256,25 +261,25 @@ span.addUserLink { padding: 6px 10px 6px 35px; background-position: 7px 2px; } -} -.close-info-popup, .close-info-popup:hover { - cursor: pointer; - width: 10px; - height: 10px; - line-height: 10px; - position: absolute; - top: 50%; - margin-top: -4px; - right: 9px; - color: #9E9C61; - text-decoration: none; - font-size: 20px; - font-weight: 700; +} +.close-info-popup, .close-info-popup:hover { + cursor: pointer; + width: 10px; + height: 10px; + line-height: 10px; + position: absolute; + top: 50%; + margin-top: -4px; + right: 9px; + color: @error-popup-close-col; + text-decoration: none; + font-size: 20px; + font-weight: 700; } /*------------------Container----------------------*/ .mainContainerClass { - background-color: White; + background-color: @bodyColor2; a.delete { float: left; @@ -283,7 +288,7 @@ span.addUserLink { .containerHeaderBlock { overflow: hidden; - color: #333333; + color: @textColor; font-size: 24px; vertical-align: middle; max-width: 974px; @@ -316,7 +321,6 @@ span.addUserLink { } .containerBodyBlock { - color: #333333; font-size: 12px; font-weight: normal; text-decoration: none; @@ -365,7 +369,7 @@ span.addUserLink { } .even { - background-color: #fff; + background-color: @body-color; } /*--------------------Table in container------------------------------*/ @@ -418,7 +422,7 @@ table.tableBase { } tr:hover { - background-color: #E5E5E5; + background-color: @hoverTable; a { text-decoration: underline; @@ -427,13 +431,13 @@ table.tableBase { tr.selected, tr.selected:hover { - background-color: #f2f2f2; + background-color: @activeTable; } tr:hover img, tr.selected img, tr.selected:hover img { - background-color: #fff; + background-color: @body-color; } } @@ -445,23 +449,23 @@ table.tableBase { /*---------------Side panels ----------*/ .studioSideBox { - border: 1px solid #C7C7C7; + border: 1px solid @borderColor2; .borderRadius(10px); margin-bottom: 20px; padding: 10px; } .studioSideBoxContent { - background-color: #ffffff; + background-color: @body-color; } .studioSideBoxBody { padding-top: 5px; padding-bottom: 10px; } .studioSideBoxHeader { - color: #333333; + color: @textColor; font-size: 18px; padding-bottom: 10px; - border-bottom: solid 1px #c7c7c7; + border-bottom: solid 1px @borderColor2; } /*---------------Template for borders---------------*/ @@ -577,9 +581,9 @@ table.tableBase { /*---------------modal dialog-------------------------*/ div.blockMsg { - background-color: #fff; + background-color: @body-color; border: 1px solid #afb2b7; - color: #333; + color: @textColor; left: 50%; padding: 10px 15px; text-align: center; @@ -618,8 +622,8 @@ div.blockMsg { } .employeeFilterInputFocus, .employeeFilterInputGreyed { - background-color: #FFFFFF; - border: 0px solid White; + background-color: @body-color; + border: 0px solid @bodyColor2; color: #434341; font-size: 12px; width: 285px; @@ -651,7 +655,7 @@ input[type="text"].employeeFilterInputFocus { /*--------------FCKEditor----------------------*/ .asccut { background-color: #D2D2D2; - border: 1px dotted #333333; + border: 1px dotted @textColor; display: block; } @@ -709,8 +713,8 @@ input[type="text"].employeeFilterInputFocus { cursor: pointer; padding: 0px; margin: 0px; - border: solid 1px #c7c7c7; - background-color: #ffffff; + border: solid 1px @borderColor2; + background-color: @body-color; } .tagAutocompleteSelectedItem { background-color: #edf6fd; @@ -744,12 +748,12 @@ input[type="text"].employeeFilterInputFocus { width:14.3%; margin:0 auto; } -/* Progress bar style*/ -.asc-progress-wrapper { - background-color: #d1d1d1; - height: 14px; - overflow: hidden; - .borderRadius(2px); +/* Progress bar style*/ +.asc-progress-wrapper { + background-color: @progress-wrapper; + height: 14px; + overflow: hidden; + .borderRadius(2px); } .asc-progress-wrapper .asc-progress-value { background: #439CCD; @@ -770,7 +774,7 @@ progress { } @-moz-document url-prefix() { progress { - background-color: #d1d1d1; + background-color: @borderColor; border: none; border-radius: 2px; } @@ -783,7 +787,7 @@ progress { } &::-webkit-progress-bar { - background-color: #d1d1d1; + background-color: @borderColor; border-radius: 2px; } @@ -795,55 +799,63 @@ progress { /******************************************************************************* Autocomplete Widget -*******************************************************************************/ - -.ui-autocomplete { - position: absolute; - max-height: 200px; - overflow-y: auto; - overflow-x: hidden; - border: 1px solid #D1D1D1 !important; - border-top: none !important; - - .ui-menu-item { - list-style: none; - border-bottom: 1px solid #D1D1D1 !important; - background-color: #FFFFFF !important; - - .ui-state-hover, .ui-state-active { - background-color: #E5E5E5 !important; - border: none !important; - margin: 0 !important; - } - - a, a:hover { - color: black; - display: block; - padding: 3px; - text-decoration: none; - } - - &:last-child { - border-bottom: none !important; - } - } +*******************************************************************************/ + +.ui-autocomplete { + position: absolute; + max-height: 200px; + overflow-y: auto; + overflow-x: hidden; + border: 1px solid @borderColor !important; + border-top: none !important; + + .ui-menu-item { + list-style: none; + border-bottom: 1px solid @borderColor !important; + background-color: @body-color !important; + + .ui-state-hover, .ui-state-active { + background-color: @hoverTable !important; + border: none !important; + margin: 0 !important; + } + + a, a:hover { + color: @ui-autocomplete-a-col; + display: block; + padding: 3px; + text-decoration: none; + } + + &:last-child { + border-bottom: none !important; + } + } } .ui-menu { padding: 0px; -} - -.textEditCalendar { - background-image: url('images/svg/crm/calendar.svg'); - background-position: 75px center; - background-repeat: no-repeat; - border: 1px solid #AFB2B7; - font-size: 11px; - height: 18px; - line-height: 18px; - width: 70px; - padding-right: 18px; - padding-left: 5px; +} + +.textEditCalendar { + background-image: url('images/svg/crm/calendar.svg'); + background-position: 75px center; + background-repeat: no-repeat; + border: 1px solid @text-edit-calendar; + font-size: 11px; + height: 18px; + line-height: 18px; + width: 70px; + padding-right: 18px; + padding-left: 5px; + background-color: @back-ground-text; + color: @bg-a-activate; + + &.disabled, + &:disabled { + background-color: @disabled; + color: @textEditCalendarDisabled; + } } /************************************************************* @@ -908,88 +920,88 @@ span.requiredErrorText { font-size: 12px; .headerPanelSmall { - color: #333; + color: @textColor; margin: 0 0 5px; padding: 3px 0 1px 0; } } -/*************************************************************/ - -.userInfo { - .emailWarning { - vertical-align: middle; - background-repeat: no-repeat; - padding: 0px 10px 10px 20px !important; - color: #666668 !important; - background: url('imagescss/expl_16.png') 0 0 no-repeat transparent !important; - - .description { - font-size: 11px; - color: #9E9E9E; - } - - a.activate { - margin-left: 10px; - font-style: normal; - margin-top: 5px; - padding: 0px !important; - text-decoration: none; - color: #000 !important; - border-bottom: dotted 1px #000; - } - } - - .caption { - margin-top: 5px; - font-style: italic; - } +/*************************************************************/ + +.userInfo { + .emailWarning { + vertical-align: middle; + background-repeat: no-repeat; + padding: 0px 10px 10px 20px !important; + color: @email-warning !important; + background: url('imagescss/expl_16.png') 0 0 no-repeat transparent !important; + + .description { + font-size: 11px; + color: #9E9E9E; + } + + a.activate { + margin-left: 10px; + font-style: normal; + margin-top: 5px; + padding: 0px !important; + text-decoration: none; + color: @bg-a-activate !important; + border-bottom: dotted 1px @bg-a-activate; + } + } + + .caption { + margin-top: 5px; + font-style: italic; + } } /************************************************************* LoadingBanner -*************************************************************/ -body > div.loadingBanner { - cursor: wait; - left: 50%; - margin-left: -180px; - position: fixed; - text-align: center; - top: 9px; - width: 360px; - z-index: 256; - - .loader-block { - background-color: #FFFFFF; - background-image: url("images/loader_16.gif"); - background-position: 10px 50%; - background-repeat: no-repeat; - border: 1px solid #CACACA; - display: inline-block; - color: #999999; - font-size: 12px; - min-width: 80px; - max-width: 800px; - height: 28px; - text-align: left; - white-space: nowrap; - overflow: hidden; - padding: 0px 10px 0 33px; - line-height: 28px; - z-index: 2011; - .borderRadius(5px); - .shadow(8px); - - &.success { - background-image: url("imagescss/success12.png"); - background-position: 12px 50%; - } - - div { - display: inline-block; - font-size: 12px; - margin-left: 5px; - } - } +*************************************************************/ +body > div.loadingBanner { + cursor: wait; + left: 50%; + margin-left: -180px; + position: fixed; + text-align: center; + top: 9px; + width: 360px; + z-index: 256; + + .loader-block { + background-color: @body-color; + background-image: url("images/@{loader-gif-16}"); + background-position: 10px 50%; + background-repeat: no-repeat; + border: 1px solid #CACACA; + display: inline-block; + color: #999999; + font-size: 12px; + min-width: 80px; + max-width: 800px; + height: 28px; + text-align: left; + white-space: nowrap; + overflow: hidden; + padding: 0px 10px 0 33px; + line-height: 28px; + z-index: 2011; + .borderRadius(5px); + .shadow(8px); + + &.success { + background-image: url("imagescss/success12.png"); + background-position: 12px 50%; + } + + div { + display: inline-block; + font-size: 12px; + margin-left: 5px; + } + } } .loading, @@ -1026,7 +1038,7 @@ div.hintDescriptionPanel.help_bottom { .reportTypeRow img { margin-bottom: -1px; cursor:pointer;} .borderBaseShadow { - border: solid 1px #D1D1D1; + border: solid 1px @borderColor; } @@ -1130,54 +1142,54 @@ input[type=number] { margin: 0 0 8px 8px; width: 320px; } -} - -.settings-help-block { - color: #787878; - display: inline-block; - float: left; - font-size: 11px; - line-height: 16px; - padding-left: 28px; - margin-bottom: 25px; - min-height: 24px; - width: 301px; - position: relative; - - &:after { - background-color: #83888d; - .borderRadius(18px); - color: #ffffff; - content: "?"; - font-family: "Open Sans",sans-serif; - display: inline-block; - font-size: 14px; - font-weight: 600; - height: 18px; - left: 3px; - position: absolute; - text-align: center; - top: 3px; - width: 18px; - line-height: 18px; - padding: 0; - margin: 0; - border: 0 none; - } - - p { - color: #787878; - font-size: 11px; - margin: 0; - } - - a, - a:visited, - a:hover, - a:active { - color: #787878; - font-size: 11px; - } +} + +.settings-help-block { + color: @settings-help-block-p; + display: inline-block; + float: left; + font-size: 11px; + line-height: 16px; + padding-left: 28px; + margin-bottom: 25px; + min-height: 24px; + width: 301px; + position: relative; + + &:after { + background-color: #83888d; + .borderRadius(18px); + color: @body-color; + content: "?"; + font-family: "Open Sans",sans-serif; + display: inline-block; + font-size: 14px; + font-weight: 600; + height: 18px; + left: 3px; + position: absolute; + text-align: center; + top: 3px; + width: 18px; + line-height: 18px; + padding: 0; + margin: 0; + border: 0 none; + } + + p { + color: @settings-help-block-p; + font-size: 11px; + margin: 0; + } + + a, + a:visited, + a:hover, + a:active { + color: #787878; + font-size: 11px; + } } body.media-width-0-1200 .settings-help-block { @@ -1189,7 +1201,7 @@ body.media-width-0-1200 .settings-help-block { background: url('imagescss/exclamation.png') no-repeat left top; div, p, span { - color: #333; + color: @textColor; } a, @@ -1249,9 +1261,9 @@ body.media-width-0-1200 .settings-help-block { padding: 0; position: relative; } -.link-with-entity:after{ +.link-with-entity:after { background: url("images/link_16.png") no-repeat center center transparent; - color: #333333; + color: @textColor; content: " "; display: block; height: 16px; @@ -1267,9 +1279,9 @@ body.media-width-0-1200 .settings-help-block { welcome popup for Collaborator *******************************************************************************/ .welcome-to-teamlab-with-logo { - background: url("imagescss/welcometo_logo.png") 0 0 no-repeat; + background: url("imagescss/welcometo_logo.svg") 0 0 no-repeat; padding-left: 116px; - color: #333; + color: @textColor; .welcome { font-size: 14px; @@ -1326,7 +1338,7 @@ welcome popup for Collaborator z-index: 300; } .progress-dialog { - border: 1px solid #D1D1D1; + border: 1px solid @borderColor; display: none; margin-top: 16px; width: 500px; @@ -1341,8 +1353,8 @@ welcome popup for Collaborator } .progress-dialog-header { - background-color: #E2E2E2; - color: #333333; + background-color: @bg-progress-dialog-header; + color: @textColor; font-size: 18px; line-height: 32px; padding: 4px 24px; @@ -1353,7 +1365,7 @@ welcome popup for Collaborator margin: 12px 4px 10px 4px; } .progress-dialog-body { - background-color: #FFFFFF; + background-color: @body-color; padding: 0 24px 16px; } .progress-dialog .actions-container.maximize { @@ -1420,7 +1432,7 @@ welcome popup for Collaborator } .progress-label { - color: #FFFFFF; + color: @body-color; float: left; font-size: 10px; margin-left: -100px; @@ -1466,7 +1478,7 @@ welcome popup for Collaborator &.close { height: 14px; width: 14px; - color: #333; + color: @textColor; font-size: 26px; font-weight: 500; line-height: 10px; @@ -1480,11 +1492,11 @@ welcome popup for Collaborator &.minimize { border-top: 2px solid transparent; - border-bottom: 2px solid #333; + border-bottom: 2px solid @textColor; } &.maximize { - border-top: 2px solid #333; + border-top: 2px solid @textColor; border-bottom: 2px solid transparent; } } @@ -1541,10 +1553,10 @@ welcome popup for Collaborator .profile-user-photo.readonly .profile-role { bottom: 4px; -} - -.loader32 { - background: url("images/loader_32.gif") center center no-repeat #fff; +} + +.loader32 { + background: url("images/@{loader-gif-32}") center center no-repeat @body-color; } /* Set min-height for Ipad */ @@ -1667,19 +1679,29 @@ body.media-width-0-1250 { *******************************************************************************/ #studio_emailPwdReminder { - margin-top: 15px; + margin-top: 16px; width: 100%; } +#pswdRecoveryInfoText { + padding: 0 0 0 32px; + margin: 8px 0 0 0; + background-image: url(images/svg/exclamation.svg); + background-repeat: no-repeat; + background-position: 0 0px; + font-size: 11px; + line-height: 13px; +} + /******************************************************************************* LDAP icon -*******************************************************************************/ - -.ldap-lock::after, -.ldap-lock-big::after { - content: "LDAP"; - background-color: #FADB8F; - border-radius: 2px; +*******************************************************************************/ + +.ldap-lock::after, +.ldap-lock-big::after { + content: "LDAP"; + background-color: @ldap-color; + border-radius: 2px; } .ldap-lock::after { diff --git a/web/studio/ASC.Web.Studio/skins/default/common_style.ru-ru.css b/web/studio/ASC.Web.Studio/skins/default/common_style.ru-ru.css index b7acbdce9..8cfffa6e4 100644 --- a/web/studio/ASC.Web.Studio/skins/default/common_style.ru-ru.css +++ b/web/studio/ASC.Web.Studio/skins/default/common_style.ru-ru.css @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/skins/default/common_style.wide-screen.less b/web/studio/ASC.Web.Studio/skins/default/common_style.wide-screen.less index bbe810fd9..56a1d828b 100644 --- a/web/studio/ASC.Web.Studio/skins/default/common_style.wide-screen.less +++ b/web/studio/ASC.Web.Studio/skins/default/common_style.wide-screen.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,6 @@ input[type="button"]::-moz-focus-inner { Text style *******************************************************************************/ p { - color:@textColor; font-size: 12px; } @@ -103,7 +102,7 @@ blockquote { New label Banner *******************************************************************************/ .new-label-banner { - color: #fff; + color: @textColor; padding: 2px 8px; margin: 0 0 0 8px; .borderRadius(); @@ -155,7 +154,8 @@ blockquote { padding: 9px 12px 12px 40px; &.excl { - background: url('@{imagesBaseUrl}toast_icon01.png') no-repeat 9px 9px #F5E1A2; + background: url('@{imagesBaseUrl}toast_icon01.png') no-repeat 9px 9px @info-box-excl-bg; + border: @info-box-excl-bor; } .btn-close { @@ -165,7 +165,7 @@ blockquote { cursor: pointer; width: 8px; height: 8px; - background: url('@{imagesBaseUrl}close.png') no-repeat; + background: @info-box-excl-close no-repeat; } } @@ -175,7 +175,7 @@ blockquote { *******************************************************************************/ .header-with-menu { - color: #333; + color: @textColor; font-size: 24px; max-width: 900px; overflow: hidden; @@ -400,8 +400,8 @@ blockquote { &:active, &:hover, &:focus { - .bg-button-default(); - color: @grayButtonTextColor; + .bg-button-grey-phone(); + color: @greyPhoneButtonTextColor; } } body.media-width-0-1200 { @@ -428,7 +428,7 @@ body.media-width-0-1200 { cursor: pointer; display: inline-block; font-size: 11px; - margin: 0 0 3px 13px; + margin: 0 0 3px 12px; vertical-align: middle; } @@ -478,12 +478,12 @@ body.media-width-0-1200 { margin-top:16px; span { - background:url("../default/images/loader_16.gif") no-repeat left center transparent; + background: url("images/@{loader-gif-16}") no-repeat left center transparent; padding-left: 20px; } } .loader16 { - background:url("../default/images/loader_16.gif") no-repeat left center transparent; + background: url("images/@{loader-gif-16}") no-repeat left center transparent; position: absolute; height: 16px; width: 16px; diff --git a/web/studio/ASC.Web.Studio/skins/default/contentmenu.less b/web/studio/ASC.Web.Studio/skins/default/contentmenu.less index 08288f5b0..b91b3e9e3 100644 --- a/web/studio/ASC.Web.Studio/skins/default/contentmenu.less +++ b/web/studio/ASC.Web.Studio/skins/default/contentmenu.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ *******************************************************************************/ .contentMenu { - background: #fff; + background: @contentMenu; border-bottom: 1px solid @borderColor; color: @textColorBlackLight; display: none; @@ -33,8 +33,8 @@ li.menuActionSelectAll { - .bg-button-default (); - .border-button-default(); + .bg-button-default-menuAction (); + .border-button-default-menuAction(); color:@textColor; display: inline-block !important; min-width: 33px; @@ -69,8 +69,8 @@ li.menuActionSelectAll .noneSelect(); &.unlockAction { - .bg-button-default(); - .border-button-default(); + .bg-button-default-menuAction(); + .border-button-default-menuAction(); cursor: pointer; color: @grayButtonTextColor; diff --git a/web/studio/ASC.Web.Studio/skins/default/dashboard.less b/web/studio/ASC.Web.Studio/skins/default/dashboard.less index b4f5d30ec..4087ad339 100644 --- a/web/studio/ASC.Web.Studio/skins/default/dashboard.less +++ b/web/studio/ASC.Web.Studio/skins/default/dashboard.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,9 +15,11 @@ */ +@import "params.less"; + .backdrop { - background-color: #000; + background-color: @backdrop-bg; bottom: 0; filter: alpha(opacity=80); left: 0; @@ -30,7 +32,7 @@ .dashboard-center-box { padding: 40px; - background-color: #FFF; + background-color: @bg-dashboard; left: 50%; position: absolute; top: 10%; @@ -40,7 +42,7 @@ } .dashboard-center-box .close { - color: #C4C4C4; + color: @border-button-default; cursor: pointer; display: inline-block; float: right; @@ -86,6 +88,7 @@ font-size: 27px; font-weight: 600; margin: 18px 0; + color: @bg-dashboard-title; } a.link { @@ -107,13 +110,13 @@ .dashboard-center-box.community { .content .module-block { .img.share-news-and-knowledge { - background-image: url("images/dashboard/share-news-and-knowledge.png"); + background-image: url("images/dashboard/share-news-and-knowledge.svg"); } .img.discuss-with-team { - background-image: url("images/dashboard/discuss-with-team.png"); + background-image: url("images/dashboard/discuss-with-team.svg"); } .img.keep-your-team-posted { - background-image: url("images/dashboard/keep-your-team-posted.png"); + background-image: url("images/dashboard/keep-your-team-posted.svg"); } } } @@ -121,16 +124,16 @@ .dashboard-center-box.crm { .content .module-block { .img.create-clients-database { - background-image: url("images/dashboard/create-clients-database.png"); + background-image: url("images/dashboard/create-clients-database.svg"); } .img.track-sales { - background-image: url("images/dashboard/track-sales.png"); + background-image: url("images/dashboard/track-sales.svg"); } .img.communicate-with-clients { - background-image: url("images/dashboard/communicate-with-clients.png"); + background-image: url("images/dashboard/communicate-with-clients.svg"); } .img.customize-your-crm { - background-image: url("images/dashboard/customize-your-crm.png"); + background-image: url("images/dashboard/customize-your-crm.svg"); } } } @@ -138,16 +141,16 @@ .dashboard-center-box.files { .content .module-block { .img.work-with-office-docs { - background-image: url("images/dashboard/work-with-office-docs.png"); + background-image: url("images/dashboard/work-with-office-docs.svg"); } .img.share-files { - background-image: url("images/dashboard/share-files.png"); + background-image: url("images/dashboard/share-files.svg"); } .img.make-co-editing-comfy { - background-image: url("images/dashboard/make-co-editing-comfy.png"); + background-image: url("images/dashboard/make-co-editing-comfy.svg"); } .img.use-more-collaboration-tools { - background-image: url("images/dashboard/use-more-collaboration-tools.png"); + background-image: url("images/dashboard/use-more-collaboration-tools.svg"); } } } diff --git a/web/studio/ASC.Web.Studio/skins/default/empty-screen-control.less b/web/studio/ASC.Web.Studio/skins/default/empty-screen-control.less index 284c49115..e2b2f052a 100644 --- a/web/studio/ASC.Web.Studio/skins/default/empty-screen-control.less +++ b/web/studio/ASC.Web.Studio/skins/default/empty-screen-control.less @@ -1,22 +1,22 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @import "../base.less"; - +@import "params.less"; .noContentBlock { padding: 100px; @@ -84,7 +84,7 @@ } .clearFilterButton { - color: #333; + color: @textColor; clear: both; cursor: pointer; margin-left: 18px; @@ -108,7 +108,7 @@ &:after { cursor: pointer; content: "×"; - color: #fff; + color: @body-color; display: block; font-size: 15px; font-weight: 600; diff --git a/web/studio/ASC.Web.Studio/skins/default/filetype_style.css b/web/studio/ASC.Web.Studio/skins/default/filetype_style.less similarity index 98% rename from web/studio/ASC.Web.Studio/skins/default/filetype_style.css rename to web/studio/ASC.Web.Studio/skins/default/filetype_style.less index 0f48393de..bdf6a162c 100644 --- a/web/studio/ASC.Web.Studio/skins/default/filetype_style.css +++ b/web/studio/ASC.Web.Studio/skins/default/filetype_style.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,289 +15,289 @@ */ -.ftFile_21, -.ftFile_32, -.ftFolder_21, -.ftFolder_32 { - background-repeat: no-repeat; - background-position: 0 0; - background-color: transparent; -} -.ftFile_32, -.ftFolder_32 { - background-position: 0 0; - height: 32px; - width: 32px; -} -.ftFile_21, -.ftFolder_21, -.compact .ftFile_32, -.compact .ftFolder_32 { - background-position: 0 -39px; - height: 21px; - width: 21px; -} -.compact .ftFolder_32 { - background-position: 50% 50%; - background-size:100%; -} -/*folder default*/ -.ftFolder_21, -.ftFolder_32 { - background: url('images/svg/documents/folder.svg') no-repeat; - background-position: 50% 50%; - left: 1px; - background-size: 32px; -} -/*file default*/ -.ftFile_21, -.ftFile_32{ - background-image: url('images/filetype/file.png'); - background-size: 32px 60px; -} - -/*".zip", ".rar", ".ace", ".arc", ".arj", ".bh", ".cab", ".enc", ".gz", ".ha", ".jar", ".lha", ".lzh", ".pak", ".pk3", ".tar", ".tgz", ".uu", ".uue", ".xxe", ".z", ".zoo"*/ -.ft_Archive{background-image:url('images/filetype/file_archive.png');} -.ft_Avi{background-image:url('images/filetype/file_avi.png');} -.ft_Cal{background-image:url('images/filetype/file_cal.png');} -.ft_Csv{background-image:url('images/filetype/file_csv.png');} -.ft_Djvu{background-image:url('images/filetype/file_djvu.png');} -.ft_Doc{background-image:url('images/filetype/file_doc.png');} -.ft_Docm{background-image:url('images/filetype/file_docm.png');} -.ft_Doct{background-image:url('images/filetype/file_doct.png');} -.ft_Docx{background-image:url('images/filetype/file_docx.png');} -.ft_Docxf{background-image:url('images/filetype/file_docxf.png');} -.ft_Dot{background-image:url('images/filetype/file_dot.png');} -.ft_Dotm{background-image:url('images/filetype/file_dotm.png');} -.ft_Dotx{background-image:url('images/filetype/file_dotx.png');} -.ft_Dvd{background-image:url('images/filetype/file_dvd.png');} -/*.ft_Ebook{background-image:url('images/filetype/file_ebook.png');}*/ -.ft_Epub{background-image:url('images/filetype/file_epub.png');} -.ft_Fb2{background-image:url('images/filetype/file_fb2.png');} -.ft_Flv{background-image:url('images/filetype/file_flv.png');} -.ft_Fodp{background-image:url('images/filetype/file_fodp.png');} -.ft_Fods{background-image:url('images/filetype/file_fods.png');} -.ft_Fodt{background-image:url('images/filetype/file_fodt.png');} -.ft_Gdoc{background-image:url('images/filetype/file_gdoc.png');} -.ft_Gsheet{background-image:url('images/filetype/file_gsheet.png');} -.ft_Gslides{background-image:url('images/filetype/file_gslides.png');} -.ft_Htm{background-image:url('images/filetype/file_htm.png');} -.ft_Html{background-image:url('images/filetype/file_html.png');} -.ft_Iaf{background-image:url('images/filetype/file_iaf.png');} -.ft_Ics{background-image:url('images/filetype/file_ics.png');} -/*".bmp", ".cod", ".gif", ".ief", ".jpe", ".jpeg", ".jpg", ".jfif", ".tiff", ".tif", ".cmx", ".ico", ".png", ".pnm", ".pbm", ".ppm", ".rgb", ".xbm", ".xpm", ".xwd"*/ -.ft_Image{background-image:url('images/filetype/file_image.png');} -.ft_M2ts{background-image:url('images/filetype/file_m2ts.png');} -.ft_Mht{background-image:url('images/filetype/file_mht.png');} -.ft_Mkv{background-image:url('images/filetype/file_mkv.png');} -.ft_Mov{background-image:url('images/filetype/file_mov.png');} -.ft_Mp4{background-image:url('images/filetype/file_mp4.png');} -.ft_Mpg{background-image:url('images/filetype/file_mpg.png');} -.ft_Odp{background-image:url('images/filetype/file_odp.png');} -.ft_Ods{background-image:url('images/filetype/file_ods.png');} -.ft_Odt{background-image:url('images/filetype/file_odt.png');} -.ft_Oform{background-image:url('images/filetype/file_oform.png');} -.ft_Otp{background-image:url('images/filetype/file_otp.png');} -.ft_Ots{background-image:url('images/filetype/file_ots.png');} -.ft_Ott{background-image:url('images/filetype/file_ott.png');} -.ft_Pdf{background-image:url('images/filetype/file_pdf.png');} -.ft_Pot{background-image:url('images/filetype/file_pot.png');} -.ft_Potm{background-image:url('images/filetype/file_potm.png');} -.ft_Potx{background-image:url('images/filetype/file_potx.png');} -.ft_Pps{background-image:url('images/filetype/file_pps.png');} -.ft_Ppsm{background-image:url('images/filetype/file_ppsm.png');} -.ft_Ppsx{background-image:url('images/filetype/file_ppsx.png');} -.ft_Ppt{background-image:url('images/filetype/file_ppt.png');} -.ft_Pptm{background-image:url('images/filetype/file_pptm.png');} -.ft_Pptt{background-image:url('images/filetype/file_pptt.png');} -.ft_Pptx{background-image:url('images/filetype/file_pptx.png');} -.ft_Rtf{background-image:url('images/filetype/file_rtf.png');} -/*".mp3", ".wav", ".pcm", ".aiff", ".3gp", ".flac", ".fla", ".cda"*/ -.ft_Sound{background-image:url('images/filetype/file_sound.png');} -.ft_SoundUnk{background-image:url('images/filetype/file_soundunk.png');} -.ft_Svg{background-image:url('images/filetype/file_svg.png');} -.ft_Txt{background-image:url('images/filetype/file_txt.png');} -.ft_Video{background-image:url('images/filetype/file_video.png');} -.ft_VideoUnk{background-image:url('images/filetype/file_videounk.png');} -.ft_Xls{background-image:url('images/filetype/file_xls.png');} -.ft_Xlsm{background-image:url('images/filetype/file_xlsm.png');} -.ft_Xlst{background-image:url('images/filetype/file_xlst.png');} -.ft_Xlsx{background-image:url('images/filetype/file_xlsx.png');} -.ft_Xlt{background-image:url('images/filetype/file_xlt.png');} -.ft_Xltm{background-image:url('images/filetype/file_xltm.png');} -.ft_Xltx{background-image:url('images/filetype/file_xltx.png');} -.ft_Xml{background-image:url('images/filetype/file_xml.png');} -.ft_Xps{background-image:url('images/filetype/file_xps.png');} - -.thumbnails .thumb-img.ftFile_32, -.thumbnails .thumb-img.ftFolder_32 { - background-position: 50% 50%; - background-size: 0; -} -.thumbnails .thumb-img.ftFile_32 { - background-image: url('images/filetype/thumb/file.png'); -} -.thumbnails .thumb-img.ftFolder_32 { - background-image: url(images/filetype/thumb/folder.png); -} -.thumbnails .thumb-img:empty, -.thumbnails .thumb-img.ftFolder_21, -.thumbnails .thumb-img.ftFolder_32 { - background-size: 96px; -} - - -.thumbnails .thumb-img.ft_Archive{background-image:url('images/filetype/thumb/file_archive.png');} -.thumbnails .thumb-img.ft_Avi{background-image:url('images/filetype/thumb/file_avi.png');} -.thumbnails .thumb-img.ft_Cal{background-image:url('images/filetype/thumb/file_cal.png');} -.thumbnails .thumb-img.ft_Csv{background-image:url('images/filetype/thumb/file_csv.png');} -.thumbnails .thumb-img.ft_Djvu{background-image:url('images/filetype/thumb/file_djvu.png');} -.thumbnails .thumb-img.ft_Doc{background-image:url('images/filetype/thumb/file_doc.png');} -.thumbnails .thumb-img.ft_Docm{background-image:url('images/filetype/thumb/file_docm.png');} -.thumbnails .thumb-img.ft_Doct{background-image:url('images/filetype/thumb/file_doct.png');} -.thumbnails .thumb-img.ft_Docx{background-image:url('images/filetype/thumb/file_docx.png');} -.thumbnails .thumb-img.ft_Docxf{background-image:url('images/filetype/thumb/file_docxf.png');} -.thumbnails .thumb-img.ft_Dot{background-image:url('images/filetype/thumb/file_dot.png');} -.thumbnails .thumb-img.ft_Dotm{background-image:url('images/filetype/thumb/file_dotm.png');} -.thumbnails .thumb-img.ft_Dotx{background-image:url('images/filetype/thumb/file_dotx.png');} -.thumbnails .thumb-img.ft_Dvd{background-image:url('images/filetype/thumb/file_dvd.png');} -/*.thumbnails .thumb-img.ft_Ebook{background-image:url('images/filetype/thumb/file_ebook.png');}*/ -.thumbnails .thumb-img.ft_Epub{background-image:url('images/filetype/thumb/file_epub.png');} -.thumbnails .thumb-img.ft_Fb2{background-image:url('images/filetype/thumb/file_fb2.png');} -.thumbnails .thumb-img.ft_Flv{background-image:url('images/filetype/thumb/file_flv.png');} -.thumbnails .thumb-img.ft_Fodp{background-image:url('images/filetype/thumb/file_fodp.png');} -.thumbnails .thumb-img.ft_Fods{background-image:url('images/filetype/thumb/file_fods.png');} -.thumbnails .thumb-img.ft_Fodt{background-image:url('images/filetype/thumb/file_fodt.png');} -.thumbnails .thumb-img.ft_Gdoc{background-image:url('images/filetype/thumb/file_gdoc.png');} -.thumbnails .thumb-img.ft_Gsheet{background-image:url('images/filetype/thumb/file_gsheet.png');} -.thumbnails .thumb-img.ft_Gslides{background-image:url('images/filetype/thumb/file_gslides.png');} -.thumbnails .thumb-img.ft_Htm{background-image:url('images/filetype/thumb/file_htm.png');} -.thumbnails .thumb-img.ft_Html{background-image:url('images/filetype/thumb/file_html.png');} -.thumbnails .thumb-img.ft_Iaf{background-image:url('images/filetype/thumb/file_iaf.png');} -.thumbnails .thumb-img.ft_Ics{background-image:url('images/filetype/thumb/file_ics.png');} -.thumbnails .thumb-img.ft_Image{background-image:url('images/filetype/thumb/file_image.png');} -.thumbnails .thumb-img.ft_M2ts{background-image:url('images/filetype/thumb/file_m2ts.png');} -.thumbnails .thumb-img.ft_Mht{background-image:url('images/filetype/thumb/file_mht.png');} -.thumbnails .thumb-img.ft_Mkv{background-image:url('images/filetype/thumb/file_mkv.png');} -.thumbnails .thumb-img.ft_Mov{background-image:url('images/filetype/thumb/file_mov.png');} -.thumbnails .thumb-img.ft_Mp4{background-image:url('images/filetype/thumb/file_mp4.png');} -.thumbnails .thumb-img.ft_Mpg{background-image:url('images/filetype/thumb/file_mpg.png');} -.thumbnails .thumb-img.ft_Odp{background-image:url('images/filetype/thumb/file_odp.png');} -.thumbnails .thumb-img.ft_Ods{background-image:url('images/filetype/thumb/file_ods.png');} -.thumbnails .thumb-img.ft_Odt{background-image:url('images/filetype/thumb/file_odt.png');} -.thumbnails .thumb-img.ft_Oform{background-image:url('images/filetype/thumb/file_oform.png');} -.thumbnails .thumb-img.ft_Otp{background-image:url('images/filetype/thumb/file_otp.png');} -.thumbnails .thumb-img.ft_Ots{background-image:url('images/filetype/thumb/file_ots.png');} -.thumbnails .thumb-img.ft_Ott{background-image:url('images/filetype/thumb/file_ott.png');} -.thumbnails .thumb-img.ft_Pdf{background-image:url('images/filetype/thumb/file_pdf.png');} -.thumbnails .thumb-img.ft_Pot{background-image:url('images/filetype/thumb/file_pot.png');} -.thumbnails .thumb-img.ft_Potm{background-image:url('images/filetype/thumb/file_potm.png');} -.thumbnails .thumb-img.ft_Potx{background-image:url('images/filetype/thumb/file_potx.png');} -.thumbnails .thumb-img.ft_Pps{background-image:url('images/filetype/thumb/file_pps.png');} -.thumbnails .thumb-img.ft_Ppsm{background-image:url('images/filetype/thumb/file_ppsm.png');} -.thumbnails .thumb-img.ft_Ppsx{background-image:url('images/filetype/thumb/file_ppsx.png');} -.thumbnails .thumb-img.ft_Ppt{background-image:url('images/filetype/thumb/file_ppt.png');} -.thumbnails .thumb-img.ft_Pptm{background-image:url('images/filetype/thumb/file_pptm.png');} -.thumbnails .thumb-img.ft_Pptt{background-image:url('images/filetype/thumb/file_pptt.png');} -.thumbnails .thumb-img.ft_Pptx{background-image:url('images/filetype/thumb/file_pptx.png');} -.thumbnails .thumb-img.ft_Rtf{background-image:url('images/filetype/thumb/file_rtf.png');} -.thumbnails .thumb-img.ft_Sound{background-image:url('images/filetype/thumb/file_sound.png');} -.thumbnails .thumb-img.ft_SoundUnk{background-image:url('images/filetype/thumb/file_soundunk.png');} -.thumbnails .thumb-img.ft_Svg{background-image:url('images/filetype/thumb/file_svg.png');} -.thumbnails .thumb-img.ft_Txt{background-image:url('images/filetype/thumb/file_txt.png');} -.thumbnails .thumb-img.ft_Video{background-image:url('images/filetype/thumb/file_video.png');} -.thumbnails .thumb-img.ft_VideoUnk{background-image:url('images/filetype/thumb/file_videounk.png');} -.thumbnails .thumb-img.ft_Xls{background-image:url('images/filetype/thumb/file_xls.png');} -.thumbnails .thumb-img.ft_Xlsm{background-image:url('images/filetype/thumb/file_xlsm.png');} -.thumbnails .thumb-img.ft_Xlst{background-image:url('images/filetype/thumb/file_xlst.png');} -.thumbnails .thumb-img.ft_Xlsx{background-image:url('images/filetype/thumb/file_xlsx.png');} -.thumbnails .thumb-img.ft_Xlt{background-image:url('images/filetype/thumb/file_xlt.png');} -.thumbnails .thumb-img.ft_Xltm{background-image:url('images/filetype/thumb/file_xltm.png');} -.thumbnails .thumb-img.ft_Xltx{background-image:url('images/filetype/thumb/file_xltx.png');} -.thumbnails .thumb-img.ft_Xml{background-image:url('images/filetype/thumb/file_xml.png');} -.thumbnails .thumb-img.ft_Xps{background-image:url('images/filetype/thumb/file_xps.png');} - -/******************************************************************************* - For Retina -*******************************************************************************/ -@media only screen and (-webkit-min-device-pixel-ratio: 2), -only screen and ( min--moz-device-pixel-ratio: 2), -only screen and ( -o-min-device-pixel-ratio: 2/1), -only screen and ( min-device-pixel-ratio: 2), -only screen and ( min-resolution: 192dpi), -only screen and ( min-resolution: 2dppx) -{ -.ftFile_21, -.ftFile_32 { - background-image:url('images/filetype/retina/file.png'); -} -.ft_Archive{background-image:url('images/filetype/retina/file_archive.png');} -.ft_Avi{background-image:url('images/filetype/retina/file_avi.png');} -.ft_Cal{background-image:url('images/filetype/retina/file_cal.png');} -.ft_Csv{background-image:url('images/filetype/retina/file_csv.png');} -.ft_Djvu{background-image:url('images/filetype/retina/file_djvu.png');} -.ft_Doc{background-image:url('images/filetype/retina/file_doc.png');} -.ft_Docm{background-image:url('images/filetype/retina/file_docm.png');} -.ft_Doct{background-image:url('images/filetype/retina/file_doct.png');} -.ft_Docx{background-image:url('images/filetype/retina/file_docx.png');} -.ft_Docxf{background-image:url('images/filetype/retina/file_docxf.png');} -.ft_Dot{background-image:url('images/filetype/retina/file_dot.png');} -.ft_Dotm{background-image:url('images/filetype/retina/file_dotm.png');} -.ft_Dotx{background-image:url('images/filetype/retina/file_dotx.png');} -.ft_Dvd{background-image:url('images/filetype/retina/file_dvd.png');} -/*.ft_Ebook{background-image:url('images/filetype/retina/file_ebook.png');}*/ -.ft_Epub{background-image:url('images/filetype/retina/file_epub.png');} -.ft_Fb2{background-image:url('images/filetype/retina/file_fb2.png');} -.ft_Flv{background-image:url('images/filetype/retina/file_flv.png');} -.ft_Fodp{background-image:url('images/filetype/retina/file_fodp.png');} -.ft_Fods{background-image:url('images/filetype/retina/file_fods.png');} -.ft_Fodt{background-image:url('images/filetype/retina/file_fodt.png');} -.ft_Gdoc{background-image:url('images/filetype/retina/file_gdoc.png');} -.ft_Gsheet{background-image:url('images/filetype/retina/file_gsheet.png');} -.ft_Gslides{background-image:url('images/filetype/retina/file_gslides.png');} -.ft_Htm{background-image:url('images/filetype/retina/file_htm.png');} -.ft_Html{background-image:url('images/filetype/retina/file_html.png');} -.ft_Iaf{background-image:url('images/filetype/retina/file_iaf.png');} -.ft_Ics{background-image:url('images/filetype/retina/file_ics.png');} -.ft_Image{background-image:url('images/filetype/retina/file_image.png');} -.ft_M2ts{background-image:url('images/filetype/retina/file_m2ts.png');} -.ft_Mht{background-image:url('images/filetype/retina/file_mht.png');} -.ft_Mkv{background-image:url('images/filetype/retina/file_mkv.png');} -.ft_Mov{background-image:url('images/filetype/retina/file_mov.png');} -.ft_Mp4{background-image:url('images/filetype/retina/file_mp4.png');} -.ft_Mpg{background-image:url('images/filetype/retina/file_mpg.png');} -.ft_Odp{background-image:url('images/filetype/retina/file_odp.png');} -.ft_Ods{background-image:url('images/filetype/retina/file_ods.png');} -.ft_Odt{background-image:url('images/filetype/retina/file_odt.png');} -.ft_Oform{background-image:url('images/filetype/retina/file_oform.png');} -.ft_Otp{background-image:url('images/filetype/retina/file_otp.png');} -.ft_Ots{background-image:url('images/filetype/retina/file_ots.png');} -.ft_Ott{background-image:url('images/filetype/retina/file_ott.png');} -.ft_Pdf{background-image:url('images/filetype/retina/file_pdf.png');} -.ft_Pot{background-image:url('images/filetype/retina/file_pot.png');} -.ft_Potm{background-image:url('images/filetype/retina/file_potm.png');} -.ft_Potx{background-image:url('images/filetype/retina/file_potx.png');} -.ft_Pps{background-image:url('images/filetype/retina/file_pps.png');} -.ft_Ppsm{background-image:url('images/filetype/retina/file_ppsm.png');} -.ft_Ppsx{background-image:url('images/filetype/retina/file_ppsx.png');} -.ft_Ppt{background-image:url('images/filetype/retina/file_ppt.png');} -.ft_Pptm{background-image:url('images/filetype/retina/file_pptm.png');} -.ft_Pptt{background-image:url('images/filetype/retina/file_pptt.png');} -.ft_Pptx{background-image:url('images/filetype/retina/file_pptx.png');} -.ft_Rtf{background-image:url('images/filetype/retina/file_rtf.png');} -.ft_Sound{background-image:url('images/filetype/retina/file_sound.png');} -.ft_SoundUnk{background-image:url('images/filetype/retina/file_soundunk.png');} -.ft_Svg{background-image:url('images/filetype/retina/file_svg.png');} -.ft_Txt{background-image:url('images/filetype/retina/file_txt.png');} -.ft_Video{background-image:url('images/filetype/retina/file_video.png');} -.ft_VideoUnk{background-image:url('images/filetype/retina/file_videounk.png');} -.ft_Xls{background-image:url('images/filetype/retina/file_xls.png');} -.ft_Xlsm{background-image:url('images/filetype/retina/file_xlsm.png');} -.ft_Xlst{background-image:url('images/filetype/retina/file_xlst.png');} -.ft_Xlsx{background-image:url('images/filetype/retina/file_xlsx.png');} -.ft_Xlt{background-image:url('images/filetype/retina/file_xlt.png');} -.ft_Xltm{background-image:url('images/filetype/retina/file_xltm.png');} -.ft_Xltx{background-image:url('images/filetype/retina/file_xltx.png');} -.ft_Xml{background-image:url('images/filetype/retina/file_xml.png');} -.ft_Xps{background-image:url('images/filetype/retina/file_xps.png');} +.ftFile_21, +.ftFile_32, +.ftFolder_21, +.ftFolder_32 { + background-repeat: no-repeat; + background-position: 0 0; + background-color: transparent; +} +.ftFile_32, +.ftFolder_32 { + background-position: 0 0; + height: 32px; + width: 32px; +} +.ftFile_21, +.ftFolder_21, +.compact .ftFile_32, +.compact .ftFolder_32 { + background-position: 0 -39px; + height: 21px; + width: 21px; +} +.compact .ftFolder_32 { + background-position: 50% 50%; + background-size:100%; +} +/*folder default*/ +.ftFolder_21, +.ftFolder_32 { + background: url('images/svg/documents/folder.svg') no-repeat; + background-position: 50% 50%; + left: 1px; + background-size: 32px; +} +/*file default*/ +.ftFile_21, +.ftFile_32{ + background-image: url('images/filetype/file.png'); + background-size: 32px 60px; +} + +/*".zip", ".rar", ".ace", ".arc", ".arj", ".bh", ".cab", ".enc", ".gz", ".ha", ".jar", ".lha", ".lzh", ".pak", ".pk3", ".tar", ".tgz", ".uu", ".uue", ".xxe", ".z", ".zoo"*/ +.ft_Archive{background-image:url('images/filetype/file_archive.png');} +.ft_Avi{background-image:url('images/filetype/file_avi.png');} +.ft_Cal{background-image:url('images/filetype/file_cal.png');} +.ft_Csv{background-image:url('images/filetype/file_csv.png');} +.ft_Djvu{background-image:url('images/filetype/file_djvu.png');} +.ft_Doc{background-image:url('images/filetype/file_doc.png');} +.ft_Docm{background-image:url('images/filetype/file_docm.png');} +.ft_Doct{background-image:url('images/filetype/file_doct.png');} +.ft_Docx{background-image:url('images/filetype/file_docx.png');} +.ft_Docxf{background-image:url('images/filetype/file_docxf.png');} +.ft_Dot{background-image:url('images/filetype/file_dot.png');} +.ft_Dotm{background-image:url('images/filetype/file_dotm.png');} +.ft_Dotx{background-image:url('images/filetype/file_dotx.png');} +.ft_Dvd{background-image:url('images/filetype/file_dvd.png');} +/*.ft_Ebook{background-image:url('images/filetype/file_ebook.png');}*/ +.ft_Epub{background-image:url('images/filetype/file_epub.png');} +.ft_Fb2{background-image:url('images/filetype/file_fb2.png');} +.ft_Flv{background-image:url('images/filetype/file_flv.png');} +.ft_Fodp{background-image:url('images/filetype/file_fodp.png');} +.ft_Fods{background-image:url('images/filetype/file_fods.png');} +.ft_Fodt{background-image:url('images/filetype/file_fodt.png');} +.ft_Gdoc{background-image:url('images/filetype/file_gdoc.png');} +.ft_Gsheet{background-image:url('images/filetype/file_gsheet.png');} +.ft_Gslides{background-image:url('images/filetype/file_gslides.png');} +.ft_Htm{background-image:url('images/filetype/file_htm.png');} +.ft_Html{background-image:url('images/filetype/file_html.png');} +.ft_Iaf{background-image:url('images/filetype/file_iaf.png');} +.ft_Ics{background-image:url('images/filetype/file_ics.png');} +/*".bmp", ".cod", ".gif", ".ief", ".jpe", ".jpeg", ".jpg", ".jfif", ".tiff", ".tif", ".cmx", ".ico", ".png", ".pnm", ".pbm", ".ppm", ".rgb", ".xbm", ".xpm", ".xwd"*/ +.ft_Image{background-image:url('images/filetype/file_image.png');} +.ft_M2ts{background-image:url('images/filetype/file_m2ts.png');} +.ft_Mht{background-image:url('images/filetype/file_mht.png');} +.ft_Mkv{background-image:url('images/filetype/file_mkv.png');} +.ft_Mov{background-image:url('images/filetype/file_mov.png');} +.ft_Mp4{background-image:url('images/filetype/file_mp4.png');} +.ft_Mpg{background-image:url('images/filetype/file_mpg.png');} +.ft_Odp{background-image:url('images/filetype/file_odp.png');} +.ft_Ods{background-image:url('images/filetype/file_ods.png');} +.ft_Odt{background-image:url('images/filetype/file_odt.png');} +.ft_Oform{background-image:url('images/filetype/file_oform.png');} +.ft_Otp{background-image:url('images/filetype/file_otp.png');} +.ft_Ots{background-image:url('images/filetype/file_ots.png');} +.ft_Ott{background-image:url('images/filetype/file_ott.png');} +.ft_Pdf{background-image:url('images/filetype/file_pdf.png');} +.ft_Pot{background-image:url('images/filetype/file_pot.png');} +.ft_Potm{background-image:url('images/filetype/file_potm.png');} +.ft_Potx{background-image:url('images/filetype/file_potx.png');} +.ft_Pps{background-image:url('images/filetype/file_pps.png');} +.ft_Ppsm{background-image:url('images/filetype/file_ppsm.png');} +.ft_Ppsx{background-image:url('images/filetype/file_ppsx.png');} +.ft_Ppt{background-image:url('images/filetype/file_ppt.png');} +.ft_Pptm{background-image:url('images/filetype/file_pptm.png');} +.ft_Pptt{background-image:url('images/filetype/file_pptt.png');} +.ft_Pptx{background-image:url('images/filetype/file_pptx.png');} +.ft_Rtf{background-image:url('images/filetype/file_rtf.png');} +/*".mp3", ".wav", ".pcm", ".aiff", ".3gp", ".flac", ".fla", ".cda"*/ +.ft_Sound{background-image:url('images/filetype/file_sound.png');} +.ft_SoundUnk{background-image:url('images/filetype/file_soundunk.png');} +.ft_Svg{background-image:url('images/filetype/file_svg.png');} +.ft_Txt{background-image:url('images/filetype/file_txt.png');} +.ft_Video{background-image:url('images/filetype/file_video.png');} +.ft_VideoUnk{background-image:url('images/filetype/file_videounk.png');} +.ft_Xls{background-image:url('images/filetype/file_xls.png');} +.ft_Xlsm{background-image:url('images/filetype/file_xlsm.png');} +.ft_Xlst{background-image:url('images/filetype/file_xlst.png');} +.ft_Xlsx{background-image:url('images/filetype/file_xlsx.png');} +.ft_Xlt{background-image:url('images/filetype/file_xlt.png');} +.ft_Xltm{background-image:url('images/filetype/file_xltm.png');} +.ft_Xltx{background-image:url('images/filetype/file_xltx.png');} +.ft_Xml{background-image:url('images/filetype/file_xml.png');} +.ft_Xps{background-image:url('images/filetype/file_xps.png');} + +.thumbnails .thumb-img.ftFile_32, +.thumbnails .thumb-img.ftFolder_32 { + background-position: 50% 50%; + background-size: 0; +} +.thumbnails .thumb-img.ftFile_32 { + background-image: url('images/filetype/thumb/file.png'); +} +.thumbnails .thumb-img.ftFolder_32 { + background-image: url(images/filetype/thumb/folder.png); +} +.thumbnails .thumb-img:empty, +.thumbnails .thumb-img.ftFolder_21, +.thumbnails .thumb-img.ftFolder_32 { + background-size: 96px; +} + + +.thumbnails .thumb-img.ft_Archive{background-image:url('images/filetype/thumb/file_archive.png');} +.thumbnails .thumb-img.ft_Avi{background-image:url('images/filetype/thumb/file_avi.png');} +.thumbnails .thumb-img.ft_Cal{background-image:url('images/filetype/thumb/file_cal.png');} +.thumbnails .thumb-img.ft_Csv{background-image:url('images/filetype/thumb/file_csv.png');} +.thumbnails .thumb-img.ft_Djvu{background-image:url('images/filetype/thumb/file_djvu.png');} +.thumbnails .thumb-img.ft_Doc{background-image:url('images/filetype/thumb/file_doc.png');} +.thumbnails .thumb-img.ft_Docm{background-image:url('images/filetype/thumb/file_docm.png');} +.thumbnails .thumb-img.ft_Doct{background-image:url('images/filetype/thumb/file_doct.png');} +.thumbnails .thumb-img.ft_Docx{background-image:url('images/filetype/thumb/file_docx.png');} +.thumbnails .thumb-img.ft_Docxf{background-image:url('images/filetype/thumb/file_docxf.png');} +.thumbnails .thumb-img.ft_Dot{background-image:url('images/filetype/thumb/file_dot.png');} +.thumbnails .thumb-img.ft_Dotm{background-image:url('images/filetype/thumb/file_dotm.png');} +.thumbnails .thumb-img.ft_Dotx{background-image:url('images/filetype/thumb/file_dotx.png');} +.thumbnails .thumb-img.ft_Dvd{background-image:url('images/filetype/thumb/file_dvd.png');} +/*.thumbnails .thumb-img.ft_Ebook{background-image:url('images/filetype/thumb/file_ebook.png');}*/ +.thumbnails .thumb-img.ft_Epub{background-image:url('images/filetype/thumb/file_epub.png');} +.thumbnails .thumb-img.ft_Fb2{background-image:url('images/filetype/thumb/file_fb2.png');} +.thumbnails .thumb-img.ft_Flv{background-image:url('images/filetype/thumb/file_flv.png');} +.thumbnails .thumb-img.ft_Fodp{background-image:url('images/filetype/thumb/file_fodp.png');} +.thumbnails .thumb-img.ft_Fods{background-image:url('images/filetype/thumb/file_fods.png');} +.thumbnails .thumb-img.ft_Fodt{background-image:url('images/filetype/thumb/file_fodt.png');} +.thumbnails .thumb-img.ft_Gdoc{background-image:url('images/filetype/thumb/file_gdoc.png');} +.thumbnails .thumb-img.ft_Gsheet{background-image:url('images/filetype/thumb/file_gsheet.png');} +.thumbnails .thumb-img.ft_Gslides{background-image:url('images/filetype/thumb/file_gslides.png');} +.thumbnails .thumb-img.ft_Htm{background-image:url('images/filetype/thumb/file_htm.png');} +.thumbnails .thumb-img.ft_Html{background-image:url('images/filetype/thumb/file_html.png');} +.thumbnails .thumb-img.ft_Iaf{background-image:url('images/filetype/thumb/file_iaf.png');} +.thumbnails .thumb-img.ft_Ics{background-image:url('images/filetype/thumb/file_ics.png');} +.thumbnails .thumb-img.ft_Image{background-image:url('images/filetype/thumb/file_image.png');} +.thumbnails .thumb-img.ft_M2ts{background-image:url('images/filetype/thumb/file_m2ts.png');} +.thumbnails .thumb-img.ft_Mht{background-image:url('images/filetype/thumb/file_mht.png');} +.thumbnails .thumb-img.ft_Mkv{background-image:url('images/filetype/thumb/file_mkv.png');} +.thumbnails .thumb-img.ft_Mov{background-image:url('images/filetype/thumb/file_mov.png');} +.thumbnails .thumb-img.ft_Mp4{background-image:url('images/filetype/thumb/file_mp4.png');} +.thumbnails .thumb-img.ft_Mpg{background-image:url('images/filetype/thumb/file_mpg.png');} +.thumbnails .thumb-img.ft_Odp{background-image:url('images/filetype/thumb/file_odp.png');} +.thumbnails .thumb-img.ft_Ods{background-image:url('images/filetype/thumb/file_ods.png');} +.thumbnails .thumb-img.ft_Odt{background-image:url('images/filetype/thumb/file_odt.png');} +.thumbnails .thumb-img.ft_Oform{background-image:url('images/filetype/thumb/file_oform.png');} +.thumbnails .thumb-img.ft_Otp{background-image:url('images/filetype/thumb/file_otp.png');} +.thumbnails .thumb-img.ft_Ots{background-image:url('images/filetype/thumb/file_ots.png');} +.thumbnails .thumb-img.ft_Ott{background-image:url('images/filetype/thumb/file_ott.png');} +.thumbnails .thumb-img.ft_Pdf{background-image:url('images/filetype/thumb/file_pdf.png');} +.thumbnails .thumb-img.ft_Pot{background-image:url('images/filetype/thumb/file_pot.png');} +.thumbnails .thumb-img.ft_Potm{background-image:url('images/filetype/thumb/file_potm.png');} +.thumbnails .thumb-img.ft_Potx{background-image:url('images/filetype/thumb/file_potx.png');} +.thumbnails .thumb-img.ft_Pps{background-image:url('images/filetype/thumb/file_pps.png');} +.thumbnails .thumb-img.ft_Ppsm{background-image:url('images/filetype/thumb/file_ppsm.png');} +.thumbnails .thumb-img.ft_Ppsx{background-image:url('images/filetype/thumb/file_ppsx.png');} +.thumbnails .thumb-img.ft_Ppt{background-image:url('images/filetype/thumb/file_ppt.png');} +.thumbnails .thumb-img.ft_Pptm{background-image:url('images/filetype/thumb/file_pptm.png');} +.thumbnails .thumb-img.ft_Pptt{background-image:url('images/filetype/thumb/file_pptt.png');} +.thumbnails .thumb-img.ft_Pptx{background-image:url('images/filetype/thumb/file_pptx.png');} +.thumbnails .thumb-img.ft_Rtf{background-image:url('images/filetype/thumb/file_rtf.png');} +.thumbnails .thumb-img.ft_Sound{background-image:url('images/filetype/thumb/file_sound.png');} +.thumbnails .thumb-img.ft_SoundUnk{background-image:url('images/filetype/thumb/file_soundunk.png');} +.thumbnails .thumb-img.ft_Svg{background-image:url('images/filetype/thumb/file_svg.png');} +.thumbnails .thumb-img.ft_Txt{background-image:url('images/filetype/thumb/file_txt.png');} +.thumbnails .thumb-img.ft_Video{background-image:url('images/filetype/thumb/file_video.png');} +.thumbnails .thumb-img.ft_VideoUnk{background-image:url('images/filetype/thumb/file_videounk.png');} +.thumbnails .thumb-img.ft_Xls{background-image:url('images/filetype/thumb/file_xls.png');} +.thumbnails .thumb-img.ft_Xlsm{background-image:url('images/filetype/thumb/file_xlsm.png');} +.thumbnails .thumb-img.ft_Xlst{background-image:url('images/filetype/thumb/file_xlst.png');} +.thumbnails .thumb-img.ft_Xlsx{background-image:url('images/filetype/thumb/file_xlsx.png');} +.thumbnails .thumb-img.ft_Xlt{background-image:url('images/filetype/thumb/file_xlt.png');} +.thumbnails .thumb-img.ft_Xltm{background-image:url('images/filetype/thumb/file_xltm.png');} +.thumbnails .thumb-img.ft_Xltx{background-image:url('images/filetype/thumb/file_xltx.png');} +.thumbnails .thumb-img.ft_Xml{background-image:url('images/filetype/thumb/file_xml.png');} +.thumbnails .thumb-img.ft_Xps{background-image:url('images/filetype/thumb/file_xps.png');} + +/******************************************************************************* + For Retina +*******************************************************************************/ +@media only screen and (-webkit-min-device-pixel-ratio: 2), +only screen and ( min--moz-device-pixel-ratio: 2), +only screen and ( -o-min-device-pixel-ratio: 2/1), +only screen and ( min-device-pixel-ratio: 2), +only screen and ( min-resolution: 192dpi), +only screen and ( min-resolution: 2dppx) +{ +.ftFile_21, +.ftFile_32 { + background-image:url('images/filetype/retina/file.png'); +} +.ft_Archive{background-image:url('images/filetype/retina/file_archive.png');} +.ft_Avi{background-image:url('images/filetype/retina/file_avi.png');} +.ft_Cal{background-image:url('images/filetype/retina/file_cal.png');} +.ft_Csv{background-image:url('images/filetype/retina/file_csv.png');} +.ft_Djvu{background-image:url('images/filetype/retina/file_djvu.png');} +.ft_Doc{background-image:url('images/filetype/retina/file_doc.png');} +.ft_Docm{background-image:url('images/filetype/retina/file_docm.png');} +.ft_Doct{background-image:url('images/filetype/retina/file_doct.png');} +.ft_Docx{background-image:url('images/filetype/retina/file_docx.png');} +.ft_Docxf{background-image:url('images/filetype/retina/file_docxf.png');} +.ft_Dot{background-image:url('images/filetype/retina/file_dot.png');} +.ft_Dotm{background-image:url('images/filetype/retina/file_dotm.png');} +.ft_Dotx{background-image:url('images/filetype/retina/file_dotx.png');} +.ft_Dvd{background-image:url('images/filetype/retina/file_dvd.png');} +/*.ft_Ebook{background-image:url('images/filetype/retina/file_ebook.png');}*/ +.ft_Epub{background-image:url('images/filetype/retina/file_epub.png');} +.ft_Fb2{background-image:url('images/filetype/retina/file_fb2.png');} +.ft_Flv{background-image:url('images/filetype/retina/file_flv.png');} +.ft_Fodp{background-image:url('images/filetype/retina/file_fodp.png');} +.ft_Fods{background-image:url('images/filetype/retina/file_fods.png');} +.ft_Fodt{background-image:url('images/filetype/retina/file_fodt.png');} +.ft_Gdoc{background-image:url('images/filetype/retina/file_gdoc.png');} +.ft_Gsheet{background-image:url('images/filetype/retina/file_gsheet.png');} +.ft_Gslides{background-image:url('images/filetype/retina/file_gslides.png');} +.ft_Htm{background-image:url('images/filetype/retina/file_htm.png');} +.ft_Html{background-image:url('images/filetype/retina/file_html.png');} +.ft_Iaf{background-image:url('images/filetype/retina/file_iaf.png');} +.ft_Ics{background-image:url('images/filetype/retina/file_ics.png');} +.ft_Image{background-image:url('images/filetype/retina/file_image.png');} +.ft_M2ts{background-image:url('images/filetype/retina/file_m2ts.png');} +.ft_Mht{background-image:url('images/filetype/retina/file_mht.png');} +.ft_Mkv{background-image:url('images/filetype/retina/file_mkv.png');} +.ft_Mov{background-image:url('images/filetype/retina/file_mov.png');} +.ft_Mp4{background-image:url('images/filetype/retina/file_mp4.png');} +.ft_Mpg{background-image:url('images/filetype/retina/file_mpg.png');} +.ft_Odp{background-image:url('images/filetype/retina/file_odp.png');} +.ft_Ods{background-image:url('images/filetype/retina/file_ods.png');} +.ft_Odt{background-image:url('images/filetype/retina/file_odt.png');} +.ft_Oform{background-image:url('images/filetype/retina/file_oform.png');} +.ft_Otp{background-image:url('images/filetype/retina/file_otp.png');} +.ft_Ots{background-image:url('images/filetype/retina/file_ots.png');} +.ft_Ott{background-image:url('images/filetype/retina/file_ott.png');} +.ft_Pdf{background-image:url('images/filetype/retina/file_pdf.png');} +.ft_Pot{background-image:url('images/filetype/retina/file_pot.png');} +.ft_Potm{background-image:url('images/filetype/retina/file_potm.png');} +.ft_Potx{background-image:url('images/filetype/retina/file_potx.png');} +.ft_Pps{background-image:url('images/filetype/retina/file_pps.png');} +.ft_Ppsm{background-image:url('images/filetype/retina/file_ppsm.png');} +.ft_Ppsx{background-image:url('images/filetype/retina/file_ppsx.png');} +.ft_Ppt{background-image:url('images/filetype/retina/file_ppt.png');} +.ft_Pptm{background-image:url('images/filetype/retina/file_pptm.png');} +.ft_Pptt{background-image:url('images/filetype/retina/file_pptt.png');} +.ft_Pptx{background-image:url('images/filetype/retina/file_pptx.png');} +.ft_Rtf{background-image:url('images/filetype/retina/file_rtf.png');} +.ft_Sound{background-image:url('images/filetype/retina/file_sound.png');} +.ft_SoundUnk{background-image:url('images/filetype/retina/file_soundunk.png');} +.ft_Svg{background-image:url('images/filetype/retina/file_svg.png');} +.ft_Txt{background-image:url('images/filetype/retina/file_txt.png');} +.ft_Video{background-image:url('images/filetype/retina/file_video.png');} +.ft_VideoUnk{background-image:url('images/filetype/retina/file_videounk.png');} +.ft_Xls{background-image:url('images/filetype/retina/file_xls.png');} +.ft_Xlsm{background-image:url('images/filetype/retina/file_xlsm.png');} +.ft_Xlst{background-image:url('images/filetype/retina/file_xlst.png');} +.ft_Xlsx{background-image:url('images/filetype/retina/file_xlsx.png');} +.ft_Xlt{background-image:url('images/filetype/retina/file_xlt.png');} +.ft_Xltm{background-image:url('images/filetype/retina/file_xltm.png');} +.ft_Xltx{background-image:url('images/filetype/retina/file_xltx.png');} +.ft_Xml{background-image:url('images/filetype/retina/file_xml.png');} +.ft_Xps{background-image:url('images/filetype/retina/file_xps.png');} } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/groupselector.css b/web/studio/ASC.Web.Studio/skins/default/groupselector.less similarity index 90% rename from web/studio/ASC.Web.Studio/skins/default/groupselector.css rename to web/studio/ASC.Web.Studio/skins/default/groupselector.less index c4255bd20..97ebc1936 100644 --- a/web/studio/ASC.Web.Studio/skins/default/groupselector.css +++ b/web/studio/ASC.Web.Studio/skins/default/groupselector.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,50 +15,52 @@ */ -.groupSelectorContainer -{ - display:none; - position:absolute; - z-index:99; - width:300px; - height:230px; - padding: 10px; -} -.groupSelectorContainer.groupSelectorContainerMobile -{ - height: auto; - width: auto; -} -.groupSelectorContainer .filterBox -{ - padding:2px; -} - -.groupSelectorContainer .filterBox input -{ - float:left; - width:170px; - margin-right:10px; -} - -.groupSelectorContainer .grpselector_groupList { - display: block; - height: 200px; - overflow-x: hidden; - overflow-y: auto; - margin:10px 0px; -} -.groupSelectorContainer .grpselector_groupList .group { - padding:4px; - cursor:pointer; -} -.groupSelectorContainer .grpselector_groupList .group:hover -{ - background-color:#f2f2f2; -} -.groupSelectorBox { - position: relative; -} -.groupSelectorBox .mobileSelectList { - width: 230px; +@import "params.less"; + +.groupSelectorContainer +{ + display:none; + position:absolute; + z-index:99; + width:300px; + height:230px; + padding: 10px; +} +.groupSelectorContainer.groupSelectorContainerMobile +{ + height: auto; + width: auto; +} +.groupSelectorContainer .filterBox +{ + padding:2px; +} + +.groupSelectorContainer .filterBox input +{ + float:left; + width:170px; + margin-right:10px; +} + +.groupSelectorContainer .grpselector_groupList { + display: block; + height: 200px; + overflow-x: hidden; + overflow-y: auto; + margin:10px 0px; +} +.groupSelectorContainer .grpselector_groupList .group { + padding:4px; + cursor:pointer; +} +.groupSelectorContainer .grpselector_groupList .group:hover +{ + background-color:@activeTable; +} +.groupSelectorBox { + position: relative; +} +.groupSelectorBox .mobileSelectList { + width: 230px; } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/headers.less b/web/studio/ASC.Web.Studio/skins/default/headers.less index 3c6fb65aa..e1d8d9001 100644 --- a/web/studio/ASC.Web.Studio/skins/default/headers.less +++ b/web/studio/ASC.Web.Studio/skins/default/headers.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/skins/default/helper.less b/web/studio/ASC.Web.Studio/skins/default/helper.less index 9351298aa..04b33b5b7 100644 --- a/web/studio/ASC.Web.Studio/skins/default/helper.less +++ b/web/studio/ASC.Web.Studio/skins/default/helper.less @@ -1,34 +1,35 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @import "../base.less"; +@import "../default/params.less"; .popup_helper { display: none; - background-color: #FFF8DC; + background-color: @popup-bg-color; width: 280px; padding: 15px; -ms-word-wrap: break-word; word-wrap: break-word; z-index: 255; white-space: normal; - border: 1px solid #efede8; + border: 1px solid @popup-helper-bor; .borderRadius(8px); - color: Black; + color: @popup-helper-col; text-align: left; font-size: 12px; font-weight: normal; @@ -108,7 +109,7 @@ left: 36px; &:before { - border-color: transparent transparent transparent #EDEDED; + border-color: transparent transparent transparent @corner-help-block-before; border-style: solid; border-width: 16px 0 0 24px; content: ""; @@ -120,7 +121,7 @@ } &:after { - border-color: transparent transparent transparent #FFF8DC; + border-color: transparent transparent transparent @corner-help-block; border-style: solid; border-width: 16px 0 0 24px; content: ""; @@ -137,7 +138,7 @@ right: 55px; &:before { - border-color: transparent transparent #EDEDED transparent; + border-color: transparent transparent @corner-help-block-before transparent; border-style: solid; border-width: 0 0 16px 24px; content: ""; @@ -149,7 +150,7 @@ } &:after { - border-color: transparent transparent #FFF8DC transparent; + border-color: transparent transparent @corner-help-block transparent; border-style: solid; border-width: 0 0 16px 24px; content: ""; @@ -166,7 +167,7 @@ left: 36px; &:before { - border-color: transparent transparent transparent #b8b8b8; + border-color: transparent transparent transparent @corner-help-block-before-2; border-style: solid; border-width: 0 0 16px 24px; content: ""; @@ -178,7 +179,7 @@ } &:after { - border-color: transparent transparent transparent #FFF8DC; + border-color: transparent transparent transparent @corner-help-block; border-style: solid; border-width: 0 0 16px 24px; content: ""; @@ -195,7 +196,7 @@ right: 56px; &:before { - border-color: transparent #b8b8b8 transparent transparent; + border-color: transparent @corner-help-block-before-2 transparent transparent; border-style: solid; border-width: 0 24px 16px 0; content: ""; @@ -207,7 +208,7 @@ } &:after { - border-color: transparent #FFF8DC transparent transparent; + border-color: transparent @corner-help-block transparent transparent; border-style: solid; border-width: 0 24px 16px 0; content: ""; @@ -232,19 +233,19 @@ position: relative; &:after { - background-color: #83888d; + background-color: @menu-item-svg; .borderRadius(12px); - color: #ffffff; + color: @body-color; content: "?"; font-family: "Open Sans",sans-serif; display: inline-block; font-size: 11px; font-weight: 900; height: 12px; - left: 3px; + left: 2px; position: absolute; text-align: center; - top: 3px; + top: 2px; width: 12px; line-height: 12px; padding: 0; diff --git a/web/studio/ASC.Web.Studio/skins/default/images/common_search_icon.png b/web/studio/ASC.Web.Studio/skins/default/images/common_search_icon.png deleted file mode 100644 index 28341c4d2aef3752e3455f403d450d07aee51515..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 891 zcmV->1BCpEP)8s>BIv??sF1ju{oZ!l=}bGF+0MML2ag_o{(;}=5n5~hPiC=L z#I|khM1mj;ajMnZ^ZEQ}p)dcm)z&sBr9^76M0OG=h3)r?z zqRpb&4Bp+gWy?EuCi7oPYY?!uS~}#1;b5v{GoLKHRx$*MUXH<-4E8ag`vO zZYS27#hQn$VxHVQ%v}S0uZvQ7z-!cB6ha`i)@ZGt-8M3E;Lqg}r>AF;T|H#Fb2wU3 z))JlWV%civqwyJjyg5rY-}8b}YG2K9kZ8@&VBu)ciaG!H66su?R;(yDLoCyx)rxRE zk7qXYFw~pl=)@eWb)Q16`-l(%skGkFm(TZKo?Rfe+iAuvYOR>M0v#zH?(gEg2e)!- zN0Q%HE7TM1oSdG)?(9rPQM6a;IDSN$7Bg;uGEM61F@Z3-JF4)Q<#7LSFP4-X{&@;d z83@DVmy!!nMBq0bkdEVIwbs-l@M8^z#is5K9;#la_ryUe<3(f19+R9rrO;vm;m5<^7PwW46QVF`ij zc@?v~R=rfORv7L`b7j#*MGc;s_>8%!-zYx+7MC{fVLD2nq$W_B)mFsb4V}{r zlnvj%cx`gBbZ>7bQLO1-n&w>1;H5psIKBI2YPmr?0ijYj8cY=X?;K+C#*KB?^S+UW zVesqtwO4d?g?+bla5Yun$oBn2Lz|eZR+uQQ5edPv(v-q=-rqVzq1B{#@64FIy?rAa+hWRIjgfqY9RpeB{g6QuKD}p{=Xw%+a^ln%RmVHlX!wY+ zu`#sP#BoHntNVk;ci%Uf9T*_n+fT#y(L#_;CMhk<<18=m)%QOfc3k(hR4V=N3qlA0 zq%<%r>y6L9K65;G+Z|)sT<%fTW@j{Dgh9QuvUGm_kEu5cg~GUDm`EuB_y>mbo9E!G RY~ug`002ovPDHLkV1jG0z0Cjs diff --git a/web/studio/ASC.Web.Studio/skins/default/images/common_search_icon.svg b/web/studio/ASC.Web.Studio/skins/default/images/common_search_icon.svg new file mode 100644 index 000000000..78d4e978c --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/common_search_icon.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/community150.png b/web/studio/ASC.Web.Studio/skins/default/images/community150.png deleted file mode 100644 index c06561acf25376ebb514fd80e10a713b70f22834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22492 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dark-checkboxes.png b/web/studio/ASC.Web.Studio/skins/default/images/dark-checkboxes.png new file mode 100644 index 0000000000000000000000000000000000000000..a9edd37bfa8978ad447dfeb98c045b8c38f9a4e7 GIT binary patch literal 666 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/create-clients-database.png b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/create-clients-database.png deleted file mode 100644 index 03a8e04836dc2f5617277d455adc5bc44b03ede2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9736 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/customize-your-crm.png b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/customize-your-crm.png deleted file mode 100644 index 97f035fd2780730776372e65fc33ed770f1a34cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12297 zcmbt)RZ|>H*X`i$?ykXu3>q}JySqzpm%(Om4ek;G!QI^*g8RS_EWv_nzUTb~=i*#+ z_eFQr-qpKn)#|lZtcIFA7CJdP006*JRFKvBZ-xACpd$Y_iybTdw?PX~l$Fx)&p!{* zcQ-lCIP&v42Jm~**6(CH`D2 zN&H#5SoRmof2PxNx!^@^X*W>oey%(V~Ydg`2trSwSk^ z*x!8#dw4w#Wj3BjiiWv4jufumEwCDDKvxp2{(Xs+IQ~_eP_FVvoCOa+QHveJ9Q?>(!Up8{F?d~9avJX^XOhZKsc5re6(bn`JHIzbmR0)Fa{|p9Qh5!_Gul_8lTmD|H z{cv~pfvZJ8MNN%9YkClNSK8J_Y?h3Ii})22;agg)=f>bR{zBaWj{@aPLLvh$cB!?D zsB_Lr3K0TI)sp$^0SPep5AaqRufmp|9R1*WoM!yoZyVb&gKNMOZG#{^UAyP8(ExMb zeSL>`3R*kN=bCMYX1f*6kTM29L}evsW*+;ze^+_(`_lNj_E57RC?yGYh1`@#|7c`eTI=H$-lux)w&#(a?=NMqcQF)J6#gdfq&L#VOjOWIHo6UyN z%oXEK?^FEu(--dR9Z9f$4s{#WxUUIlA(}mlmsdEtsP~y10d~=S310hcIyY=2NJnAq z?@t<6TH4qL7r{8#+FVUTkD z_O{{-^u8tipuW|l$*07VfNy+iw|8MXg?pc-uq&< zyu8eDN5|EP3z#dENVH&#DE@?4W)mKRvB_8CDQDfV>Mc-7o2IWdl4|{ZL4!ud{ur!# zr*xEVdrdR>d%ew-qA>JT-LTh=kL>>Rt~7kZ20e`t*7rg^kd*huSCO_G(=fG|72n1X zT>7K3%5`A3_k~AXyq6NvQO?K93%As!N#HCy*|ss~zJAh125k9dK*T96sw9y&o;p0f zu(AQJtD6%*!{o4sCK5l*iCzvc;E03LY#DOqECh2TYbuD7LryhsT{jW8njX2d6s%d% z2@RtwCsG*EsFT4*_gFyB!-?EIs|i#r#K@}vu?7{43hSGDOVLL}N*nVHN>R9`PWYxO zv7!BiCMtrE=vKgjnRR zZ1`_nGAXu*uXM`-tiW?V8Tk)`ZQqEjY+`eI&CIPg5WbwBpFf^`R3AKku!N1xqCz5h;*fO=?XV>? zY+{-)4Lzi!jMK_1apiK_a}*dO8mDDcdegy%&e9hmu8Fy8DC2@T!znQb__Ftk9O$`{ z-sjlHP$U954Ab77_5MqSgoK3Bva*oLBuEbpJThJ);dL+dc?*5MfCq`+`~>H9FLZoKZLO=z8e*?k^J7V=$$6Zb5-*tW2*RU0%%GAidFci-D-Y%zj5O z_M0mEE^}_rpQ}|Zj?C=o(~FCt&X32BYUb#4oPvUaW5$83gkx7%Cq5y&aiB=ze|;|( zGF<6Vd&jnEF`!~LbQ|69tk5-n)*lcogQ7JA-SiFjI|ph+2FnrHbp~+RnRseCg)wnb zoCKA4Ds$Mv!g$zY!{UV?Yt=Hj)_{Lu`zPw`Z+otjz-SP!h{zNrI^3`a$3&C2Y1??5 zTsJFyz%f<(FzXQ+YVMCl!t{v!S79H>j<0H3j*QTU`sNc8L_Bfv9nxO0h>hQXPp+M^8%vpT zb^WH-*(Y1D>rv-zBCKe)-5#Z34BRYA}clbF{i&cxmX%vhAR#kUpNB1Q>iB5 zUpbrRjSR8vYIH}eKmdLKtZuAe1@@f4Sm>$v>`kO!+Y< z;u7Wx-7pJ3C5NZ87*cQ?c2ANryKXM7qAL<__z<%fFRV8c0PSrWx2}KKtb6Z zp*&oUUVW1)$8Y}AhKvvz6&!jbYBRY)nfoVjE7Nx9H^#wwqxJL<7RToaWjggK4$YoQ z)LtD~y|sN*c)lurY#OnMoa+FEXrif@zAYStK zhKJ!^QVNQqhoI9}G}2gEcq%HYgT57w{JjLrYFAcFtWj zeBlssx!#zHF+2X&mg2g)BmuNhmJ=v?AY54)3>7@Az=Z!Qw!vMkD!N3axZ&yz89O8Q z-y&o}Dsey@CgDDKtV*wulGU_a%LK`a#nh2N@17f83cDK`zoRfsAKWm?Y=a}KV$oER z)ajuQrTzWM%@cJ!ZX?z+Gb+}@V6`Y|x_cc1QD7a5Y?hp!4rZbFyz$QJ`4+KHtsdt~ zK6WO&XTiIgx7*2Kdbj&Nyjp?C=#PfRsvLn>$Bh{pS!*9udHO3y^2_Gqxgz;5>hnK- z>6co`EFR3v%nb3nu4f{|5If<5ZH>9EnIZ7HCtIAh`IWKn zH{U5{(+1|p%IYeqiI2tI2D-g7)(chy;qt+A6DNp!qj4OK=Zx`0t=zFa3oQ-SFl$PO zgq1a!@)oJBBZ>&j+lr&lveI-WJ-~$PYhJYgQc_^F>f2joeYG_gQl(7}np-AnV{5s< zpR`FKa>v3^zG-K^>a5_q)SL6YcpX%F`x@uokeDz|Pvr1jeT%+}NgmnEQd{ z-Q5s4;{_kVOvlTjq;b6JM5~w8*%_aOGq%zZ;cwmq3a{;`{cEbRV!=>=8qFs(`NI{a zPb5rJ0c?bLRk2ntwL%Pf`jBS(`I6>pirU%PI*Qq`3WU_3@G*7YV+21js;JFN;uGB? zlYDUg>=kTuQf_3F>v098!-f!`(4*qZ(vQbrXc9S4(^N3CJh?GpHIYjXtT!Kr%?-=NIL&s^cx1Mf&x;qz7dkX)>fa<w++Ol#PrR|`meeFVY$Eg3Mp8U_)i+v>u%u0$D{cLTmWbt( z9m@hFl@~({;Ho3W+i{iG%N9e}Bb;^fmDtWVZmXQC6F;aRMJLkf*u~JF@xWBJbN##3 zzBig=?Dm;MFUa(`or^s-Ffi~c8geNgY)77+zN9eEoHAXm$(qvuZGcHmYH zak^R$l_LVc#6pm=U0gsh@If>T^#m^kRm{!IDMw1G$misWmv9zeWOJ+T<#n~^D4XCw zB8HLz=r!kq*EzS$6r>QDLPvas#N+K4^B<;+;~K{-PzAk?umuO7ke2TAI62eL*b+7g zmwOjnIu#x5ry(}Q+Sw7H$_<^IImmP6MQbjT5tjbhq-!~`QEufI8a&2nnBC9axERX% z@Gt6<2(o^7%6$oECi|b=fCoSSzp?Tgv%O}9LQvWgK}4HaoO}rc!>@GdpEHSK2%oc< z9)rov*D*-A_#jOtcii42G$O%>mmwWl(>xqYvdS{z5hbWKX=vR#(rp^h?!p7o!?7kilHj*-RXrBLLCZ$&%ZvLXp3M)@%wzl4C`GNW}8SY@-}Ez=Iq+kRvU^I(meItqd!Z61-GCsL z{%<98l;Q|D8XMi=YuGrMN>gx%nJDK}I0A%+PjC`XR}nv;(cyO&zc(BTHcgbH=(bad z{V=k>PNI}@i$7nU99Nco9XLUw36F1svVs7u{HI~L7Fqd6!&PAE)^PNOUQ_MF#0XJ{ zsO*sfBC=GK&HlhRjb&gUJa_Qh6Vu-3HBO+0qS;(|dWUzwjBA!GNmin6^i!1kz&wV> zpA+7e_V!MaKs;%|u__n~FNL}eed9$b5&~Sla1ip#r+3tlycgl*gOMt@xgUG$JEQl= z;o%@TfZ}nJO2%}l@^@|NlqwRTnzcb;T_`AMx{0dl zs`RNU9{8jjy)8p)Shvcr2aIl=s6&?l)ny|SO^C21d|1{;RulbW{H*Y0udZsTqIQ)51cS!@~MFmA0vzBamM*}H2PQvd0kf-mnWhn z)k^%f_&e)>d6QNyR+y3Y^RyW%#Z`@kSn5CXr`d#NID*h+d#_iGvkR4Ip?9TqCD=ZR zsxixB8U%m6M56{j9;YbHKBg)YI+3urCY}G{OhGW1-|Bq#ak7&A_w z;_HC|Pv63hTxG~!($@&rn2Sok$l4_$RAcaVg@u5PKXn}ZyLQhiIFLBB9%uIME=E9z zfw)?VmGZy@^6@)L%5+6%=8+PXG={YlNKbR|<^J5>kDn5~`>s1KLW2i{^Kd?{9{Q}k z-4gIIOkONiwk_pYo;gE~pL|I5%~;a1(OV>XLj|0(1o6B4Y^+RxSr${f)!zJ_mt`cw zM)5{xQ*t)dyc9|-qsimesn|Q8MuASr_*MJqDDR846?1Iy{P31SO(#*~rjhIr-0mI@ zjTm5B(Bogo!*ysuD7ib=#dPA@(uwqyz;Q z?Kx%ckcU?!DQ8hr@NmMl96utj?Od|X!GjtJ4kp_KC=f&08jN8oTW=*x;szLVyQ|h$ z0Q$FX{*#5c|3#b|w+~i3DSXprCG;W0Kq_ZDWhESO74`MRZEzrWgHNL^E~_Fk4|^9z zoZwk$@j<}cj>)xFtEi~BdZze7o4ShkH$d2@zpyR)IZ)P$cYqb@cl?=mKbiiA;t7VM z1`?d(*Eff2omPF zlPZ~LBJBFbfUS6LvE+)1F#&hEI#ajx-DBD2u+voeb<%>EagV11xr9VaYvv58&XloO z7qrWPWSn%QgfnKlcw!qVkUDV=h+b`FX*;?(Ywkd(zJJVHXl0X;Kv9r?=}F8kz1gJP zd(YIbtWI!D5McxLHhEJ~%>Uno4+iG;$$4$nEG(<Pr7AF8<&CNJ6u=|LA@iC< z!RPC9lygGb)AFRropC*xZkRCc0^tld;tyx|G1)&fxE!J*9c;Ki)O9cZ+)WB@1T|TE zjbwW&w!7>`ZGGu?#maxXo9vGrdsLmB?KrL)zn%|L--jtsAbVphs1CH4f-2GPGpMq^ z_S$AG9%bO^GTKm~Ov=IwFGi+u4zx^7ki`G7+Vvej$4pQW9JV1oUsxVwUDZfNx#+dm zRc6jqdRGNSx?Cjx#YQF<^=Qz5Ke5bq!;G9FQD&xnbl2d~WXSp%I_-Td8gdEUndcy<+m>*)fZ z2(%M9ed`&t&a7p)1ukn4dOH#v%MJWJlaH7&k0ntvYX+x68|eJ)ZGC$OOEfP+4NbTS zemI3LNX-9m9|D{_`J75YO&MXmAEtihkV;5G+WATY8YGe@s^BZAd!-&3)PY0o*uN~= zeaPbS*TFj3i%I0f18U-kwM8F<`_X;V%3i&BY##6LsKJ8j$^0)n&XDSY@l(&3>OHA9 zepJHpXSP0RqVrRwc4_$86Wg;r#1?NrqR#-8Xrp1qLfzEKLsjLC0_p_4$S|DBrz_T^ zz6VjUfQNGj2a|rT-@%^4kqo4<2XrBn^#Smpz-UfMWQMyJ1znLn4MWLbe1&;$U`PSr|Rzn+wzqN}z90a|F-v!v)@;WGGK+FK>8G71{A_EOqH!vCh z(_6&Q9Qw_jv23^ftaQT!LM75k;vCan%|q}q<-g~@)0Jo_sX2v5%OTSwBVpu$H1?4D z;T~_~*jUZwAe#$VM)Lf?>B-=3Avd6pR$~T%`ImQGohADRNmGL2sR0-CY;qJEv|}oY zFTSg=YjPUjC~^OgDI~m6-9QHFZPaHN7-3x9?42%`oFY|`nJ$2T;8xn#X(4NV;Pnx~ zgqmF1oDuVbJe6;p#+1lRiMHhUj${YYhAb_^fx4-Z$OA{qtz@FUXYdy%i$1&C?Q zq#C+Wa(LYg)GpW#VSpIGEqLu=gl*elYpUKX1Sv65RjgC8W)1%MG?dfloQc**j)9Wxyq4Q(8k4K#lKZt|#vwP3V|Ktk`!8kLs( z+=0Gp{#|to5PA(^;paVVM;}4l}p^J`Up5 zVj}_2%aJg#wxB^wf-pt^f+<5N>?gAzCJ8*)q&*y4ZHE^Zg4@7!zY@3T`DqEv84`t& z-3Ai1xL$e{V8d_qS!U&B9SaK#@8|XU3#Z2w)@J$it>w^t%u-c+n~$c#N(4cv3)aBzGAI8=s&V| zHPO&~+~FWhiso^SI{LFpFVn85r`sM!4Le_2-=2l!BZ+E!dJLO>BtO`4bDNKCdjT5A zaMvoig`CCCGH?6)T+$lFB5weyNXrX@FV`5DmtXQ{u7ooVG_mvXB>z-2a}ZpDs7pvn z`-xoHy42x7r)j`idM)q2$R>UMu?*k#bII$}b#00EB>`~#IA31xsVId*;djJ)-R7@L zCqu@u3Y`FTy5G81lG^O}`P(Jq5EqFxOasM>d|+%;oCBN>fJSB#+T$d+Ds;`v>3#WO zM=^D-v-4^B z&D6L(dGS}u@PU{+AUD#J-@j!ZDpYZM;SguwYh-BX)sb!O#TQnwY_#i;bCfy&8{Qvr zV>-&$p9mzmU~MuJN7p|oCA&6FD}2~vFUK)RIgL;!`FW*AaO8hdCU>Urt`6v$WY<)C zPI!w%?(ci}BS<-z&7P-XhYO&z76m{3qOttfm%OO1YCdgyp=-oJwr!qI-lXZQq=dcO zRfQw8*AhKVpxQn1rdoE5*HZ&oSYJ)>XGC1!iP|80h-VwxTSZi$E;ewNlA)zDi~2)3 zJmP`z_}LmT&QHVh5#x*^fRtX)iH}?-77MCvh+rCu1lIjrYk#h-@*9~_r-uJCXVEa7 z|Et+tpJ$M@e{mIh=v5?*)jxTfvM}vWB}-8 zy{y+$CxLxWiO1Kq@)yH(^S<_|A0D6qm-L^J9Jchi>%Y&o))rOm3jX&udkuhW@W`emx{Y zY98TIuE~8by;)cLeZA|e{W%m}6@P{6WS0`@A0|s(uKekvFOmesp06Tj@{g2}zpyQX z5-~S6g0cPf{s9X8_vPwz$}WaP>CGNpQTm&0h4#L-;ahRI;GMW2DJ4}4PYBZCK=@Ia za5G#e;jd^Yb|#$`005kk|9Jr-AG5R9RH(@?ifdA_sH5Td>kZtm}XA>GI1>-=|o}e4P(w3 z0cSFc-JKK-!5$iSG>>e3F)|#dH(KuOf}f_%kH*-&4pQZ|wT~f&O;;tg9e@d4fL11` zj#xhuH(n`#w%l+6c^^c@0|(_Mk64$t+*F}fR34~7^!|Zv^&<)mUSappz5jEf(;BVh zDhE)(dIY9;aV|#%a%>^lK%?gROnj~W?-gI-5&E#+7((&T8k3$VrJe3w04E*2KoE-78TvM?06L;-a}WtXZQNl4`LrL)WLf%N20W2##coaJ&CwKp={8|(4{?q9={03|g( z^6-K!0Hk37Eo~1WM^>$Az+^V|0sYl1823K)JdKlfAC*TAj*~q@B8HSLx8ti{J1Lek z4y`jj<#Mx?ui$_6$EA(b*4C`psO6tC!N2~A6B;ERbkDAb|v^6~v2Ml2uo8AyxeKIo8XdL0SD5BDc% zPLMXk&r9+rTKj{wYQoNTlqCZvfSVuOu;(r?(J@OCX9pj{zArr}+v8BO^W8o9q1C3m zPS{-ordL`OLT@1-&Y3y(ujlwrm>4Y}& zmE%oXL|i_#C66o#ba^t`k6!0L^bf=M+sRC>NT8maQxynmq<{6B9+PM6|JN z4H1RSY>LGNVkukslCayolFG43yaKfhT^EVVzxQN3ba@RfjO^Wk09%twlMXBTfijC(w$vjM94vKVg%?`}wy*kpt)|SKY z2yvZhG$w%3S|lW^(`L-l4G=K&Y6z?Wzjo}Df;t04FAP-v;(Li<$Fq9#N#050HCGYt zrS3hCVTipsc(czfl~gJAO71*Pgf9DtU9XqL=dv!4UqLSgSN12zXcxAAA7vhW99Sm} zVq2GcqN(L-l@K|}6xIPWeQ5&?M#T2hf;6%UUEqT3{sO;x&3~V-w@{ZJ|E+DPW>Mkl z(rUZX{+~S}5mf9-M_L=bR_)=P(IW{TJtT83>qexCY!xgRPQape)q}UQuwlv+7tEd$ z^cw{;3{(miPJ3xf5=Z=6^}NQkuD4%`eiHDRp=60 z*SCzCWY_ppkO63G6TeKmdf-tYwqNPe&6s6Nmo>j1T`%6w0TXa&>|4kGyxPR;v`NbL z055aAV%Saioe!(n>u!Wb~M*@7|8S?2eSkKpI_t3vPQH zpKtf&lFv|!dnO0~98*=)Ac~Q`iS%3a-==QqA@X00#1zBZzMkd)3qubYZE3JOm=5In znPKJ_%r2A1}WAg;9(xDauhW{(+@P;%hf;nk; z;tF*@W%3B9GU%;woT~4la~2m7>C3Z8j6T|=>=}@uj><*u;CHqRct8#LPaX647y0lJ zw-ST4wZ5WFDGSW?S4Ai{&xuTK?ugHIt?q!U!yz7#WKqL<%c47k6y@d$=^7JrYuDZi11V zbUHH~eY{DYs4l;7cLL`6uS_B&6tWUFs}D#>X-DDm8SIf!a%vO8-cVfogguY7f-oDP z*5#ZePfSh@St!+;>TuEIbV+UWfFxi)7QxoS(+=71KPY(%$F*wdUyKi{s)*gahLgx$OKeQipO*mn~1o zzA$!kF`5&lxjCfPxV`4EsxhT0tWG@c-;ypYqNK00DT5KT?^xW7w%#$DxQh=|qbco? zZc3H4N-4fF8AV3&q!XWV`fOREKmPT{TMiA(aK@2n_zY_0pkX=oIm^;hZ z9s`sTSx>}3`kG=z!j`#zB_`EM@>SV+uULsG^1Y1F32Y|$)dl?zF>q=R9p6%M%U-PX zIsI5(DFP#UDo)WJ80ANmnl#XWe%rMdpL`Z-YZ#~*>tO|+WIL8PT<$|nk>P2xOj$ab zS=HW#Zui_fhgI|G|CI&@#-cUlQS4wQD7(|WN5vq8Wfn`7I1byU_pBpou_R?Z#6W$1 z>&T~&rls_dcla3vH%>K>r}Evfy616dO|RFIf{8G!x;s-D|NZ;UA165Y7}_p0DV^Wa zmZ11d4BVfzZ|y(VS!jPl;qO?=PB*v2*b_ z>`&I-JqPDMXQ?m;To}@49LV`$d4)sHO)0x3h@A1{V6h39{HWU~`~|A}_3y8F&K2qA z8X4Dq#^gYbf9(~pqmrNhwK1X&IJeq6dOvX$AXki=khF(Ej91ioDU6YN$o&}THE@+T z540QTIy{j!Kd5c5t*%Ob-!0&`-0%cur5~_=CEVU#9J6LkqWJ{g@b8hfGt4f`9fVwl zfl?QFFK$kC96YArI7#K0rwap~Cz+^j+X)Y{m|pM3L|(JzSQl201VJV5)*}^a-$2G+ zkT-=ql~K65%SUWC!7*|DR#!#xgbT3r#_o%M>Iz0`h939{n9AdAJQBju4#1INyGj=j zex$%`d|_e;DWw>sH|T*^R}JBo_3Z5Wv7w|oOBg4fq1pDZYSvpUT%I}*ms3^sLkK$t z{@<~8UoY{$zGVNV&)|^fI{+o4-*Y~Qe(@1NT{{rr;sKr-LS5xDkd{Bt`;NocBj~9|BSU2X#VW1HCdfX=>$oda1WZ-EjBMk+`!4aWL@NJOU!^Ai1!zCe_P&MDX zrwn2H$m@sD?P@_SYa1KF@5poiS<9%gtF=p$20d`oceMHV3!0R}wOI>4hh_z|bw`(; zHWjHR@`~L(S}P0M_;p4b@x9(nI`)XC&c|I=1bM3Ej(F>Ngbt=AnPD zeO8pZJ|2$lJ&dNbQT<`tlZ9288igcbvsh?cK=!5!aLjkM8=M9Pj7Z0103|tB67@xp zqwFMvbmRjAW{z}_WmgY`L6V!u(E3q~yzl8?ZO!%O$&cmZIu z?E0JhYRJu#c>?3LP-HW(NU%eh?!h`4>3UCa8M-Cj8WX4&R&Anf-NQN#8(OeUP)T5r zQ1n29w8{X<6HTf9a}Amy$anGo-E=_zqH=uQ-I5d(N&O1JO4Z%@EWzpQIYwby z!lKP)C+8?yS5-R*PD=U|IGX_p`E~h$XwD2D57A_fIJKSfR$fmc=h&%<9a>ypKK`A= zv+ww5#3O$`_I> z)DHbKWCJbt89yQO-(DC2=PTGjbl+Pw+=Gc7>h1CVkxF_&JG$=kaQyXO`bVcCOg84b zF^+@YjY7>Qoa^ty;-B8l + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/discuss-with-team.png b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/discuss-with-team.png deleted file mode 100644 index 4f0f369ce2bde754da62e5bdd64e714a668ff189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10613 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 Na#G5Yb>crm{||tduV(-N diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/discuss-with-team.svg b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/discuss-with-team.svg new file mode 100644 index 000000000..24b9b83be --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/discuss-with-team.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/keep-your-team-posted.png b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/keep-your-team-posted.png deleted file mode 100644 index 190e369e1fd511710c94265f9a0450e6d736ca8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16877 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/make-co-editing-comfy.png b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/make-co-editing-comfy.png deleted file mode 100644 index 4aa4fdcfa18827ac9a298fee643dd4cf394d0a5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9514 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 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/make-co-editing-comfy.svg b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/make-co-editing-comfy.svg new file mode 100644 index 000000000..407bef21f --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/make-co-editing-comfy.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/share-files.png b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/share-files.png deleted file mode 100644 index ac717d8a88e7f67e3e5a41b7c58be0c990ac758c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9438 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 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/share-files.svg b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/share-files.svg new file mode 100644 index 000000000..7e7562a8d --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/share-files.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/share-news-and-knowledge.png b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/share-news-and-knowledge.png deleted file mode 100644 index a3afa4e2854d14dd5dc87b7e5c49658ce350102b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11064 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 A)&Kwi diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/share-news-and-knowledge.svg b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/share-news-and-knowledge.svg new file mode 100644 index 000000000..5e1e35f98 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/share-news-and-knowledge.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/track-sales.png b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/track-sales.png deleted file mode 100644 index 4b0963b2dfc4ed74e9f6d601d92eb03633c21ee7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9884 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 Ll_cuKj6?n(^>qed diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/track-sales.svg b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/track-sales.svg new file mode 100644 index 000000000..fa74bcefd --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/track-sales.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/use-more-collaboration-tools.png b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/use-more-collaboration-tools.png deleted file mode 100644 index 88427e8652e6dcd46c94d18ae89f51924ab04ea1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4010 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 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/use-more-collaboration-tools.svg b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/use-more-collaboration-tools.svg new file mode 100644 index 000000000..9909103e8 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/use-more-collaboration-tools.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/dashboard/work-with-office-docs.png b/web/studio/ASC.Web.Studio/skins/default/images/dashboard/work-with-office-docs.png deleted file mode 100644 index ace7c375d613392764ae0258e8923582cdfee3da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6404 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/default_user_photo_dark_size_200-200.png b/web/studio/ASC.Web.Studio/skins/default/images/default_user_photo_dark_size_200-200.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8033e2d20dc6d1d8628fbb4fcfacaeab3a093a GIT binary patch literal 2629 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 I<4&^v1#aV}DF6Tf literal 0 HcmV?d00001 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/default_user_photo_dark_size_32-32.png b/web/studio/ASC.Web.Studio/skins/default/images/default_user_photo_dark_size_32-32.png new file mode 100644 index 0000000000000000000000000000000000000000..614c64931d8678f93c0bec959c7cd20de9a8a0d3 GIT binary patch literal 490 zcmV6cBou#FhFCgCHPH(}XrMk^&HQIe?Q*SSbKh zMO?FI!kBF36gFVPO}r=!?ORaH{0*eZaous9NQ%V%H4 z8vvZbxr*Z>p`pQpb$#DoB6A9WZdRrL<7n-c0f54`YD+@&eOEc(3qJNe<_3Ttice|p gYXkVi?vH$Z0dxAjfy&%lqW}N^07*qoM6N<$f?FEVo&W#< literal 0 HcmV?d00001 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/default_user_photo_dark_size_360-360.png b/web/studio/ASC.Web.Studio/skins/default/images/default_user_photo_dark_size_360-360.png new file mode 100644 index 0000000000000000000000000000000000000000..ede12c8704384d0d28ff177a9e95bef1716c356d GIT binary patch literal 4933 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 literal 0 HcmV?d00001 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/default_user_photo_dark_size_82-82.png b/web/studio/ASC.Web.Studio/skins/default/images/default_user_photo_dark_size_82-82.png new file mode 100644 index 0000000000000000000000000000000000000000..cc6c8e4d62b9c72059a681fece1487d2f1fd6447 GIT binary patch literal 1142 zcmV-+1d02JP)GX~u`KtW?Z=@i-CyT=cv02BKWSe(pZ1V!bzHDUaa2kiCMi&GR~ZKS3u zY9K4AfvltkvXUCeN@^f0se!Dd2C|a2Qc!(;edX)>``>(Fb8|CoY{VS<5Fml|@$r#f zUS87M+go~nfBz5QPXTg!dplpdySw?{(P)&sFFtbetr)68?5y8^)+7) z4-eT&4-O9Uh7m*HUI6vBaC3o19eC!aDga2F^+*AW14%;?RUrLj~rd zF?gs8O6iv!!l7VCssImZ_RfL+Q1c@TKH!i)DQ$!Rg zd++S*B&DPvBTW<4VMYp4*+`vLYLL>qW07ZPXL;`JwVCSp_&B?@I?TwYh`au^yPcB8opNURQUToF%v74e*0fCVJ3U#lav5J;?#hr)H2 z?OY9Ul#8z$;Q9bv#7gG^$pcVoC{LSO2?HqJ1W*>s=IKt&^cVanS(hJO#gkna2Hr&* zZq}aWV35G`s?jV}zSjm&taIqLn_iG458T-EODP^ADe>JPGCWKA&7LSK zmB{(|dFTJ@#9YdSbr;o1ABRqmtB{pzsgFeiIZ%CHjF}3uG#Q%y3is}+Sf+xE^v#|q z>S`QM1=-yCx4M{21R3osQc=|9-V;HR>Q{XRGmoezr**gf0F2Zzw{N^(@c;k-07*qo IM6N<$g0~A20RR91 literal 0 HcmV?d00001 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/documents150.png b/web/studio/ASC.Web.Studio/skins/default/images/documents150.png deleted file mode 100644 index f2f11a043ec0bc94fa4fe16643ef88039bfabdc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23868 zcmV(wKDl)cgBi?V2S@+}H<5DDl4z5bt+K3&QN;!#Kb`&Mi5{H(=hzm%9#6l1|W&q3pvtahMXQpR*@7Hg+f4=Yh|Gn?N*Y~}C zy$lG7^T6hGzvaGr?|=StzVn^USZn3Zw{*7bmzdLvCT$*5|2}|@hzo_xG=*yGOr@fDlYNfI+o6pP8 z&?>%*pYs34-?YTrX_xp}BRoxas$7KVdK->s8ot6N@6Aezg<10Pc)v$RM)>dcN6P12MA1*uUu7qU*-l~@c4Uo$CA(_FP3;on2yZ7Thyg%+|cR7m6R zwv9zhXo@9jtflGNm5SHerW>VQ^OvU0lIzNU7t&U3309heo;;8`xjDmW`Rwx6q6a@#@3j(-jbwSnRbP0(Hd*1-e0rN zhIV1O%4dRQeb;7+vYNv7~Y%WCne%nOQO#Kew{WgI~vD9Y%vFna&+T37ff#*#f z%xDydR+guk=4ypSS6r|b`b^_VH=eNm?O(4#!a`e(ce>hfyp+#n<(sFj$>EU+sp7ee zae5%|{~Es*@eNBpCyD18-lJ=1<0X)7tGeV<+g3@nT2)~;{y_1~V8tc{PNcJtldrsbUjCaOoRlzd zOfJ{U+QjCLHBrs9n1nQ$1$MbwK1gt21Nn^yx5{sRXq%Kv)tXQx7G^Ok8hMo;j7R!f zq?xmYsG{ig2)r*FV=Y!|wU5VQ+QBcR`!}C4a&~N1e*d+z(%qR=O*J!Dk)Aw$51cI7 zCOg!o;J3OPVEyOue{(jJu3S!!|CPfR;F#Ts>R4+ zQ~%Y@x4>!0%%nI9$-hHt{}fQ3hLsuxsF~Sp#!KE7Q`ia|HoE})Q;tD%;%hS5tX!F# zl<9I+vW1M8ik07aY>#|$$FSNk>&>OufN)o#!Nk0obf?@m0Q(R)t-h#RBkgU7Nd zdoy(2Vdy0;W7050Yceva+f0h$;d5EO3v@$ttr-Z_)bx}byKq77y6Y~dv2Y@DbF=z^ z@v(7Pvv!T#8oR}7l+Bwq$>j8mba!{_7gTU87foC;Q@i(Is89l3VwX6ag z_{~+CE8)ARW!2E2T)%N$W@lz)=eFtu%l4;2+rXn5Z3D4+}u?N+tILE{d1hpvkUa}mWf+!hl7%rO4Dg8vJ#7zxt&YU@;TBO7q`Rw2#>U5`udh$W#>QmJ=FM{H(q&-Gj2y%3vp8-po0HMeQJI;U(fh%BJviWm z?yNu7haYAOlAwi?!I;+1UZ>VLpYQuv99Yht_=y zAN@nzi9=nTombLW_r;V7wym+!1x$umYQGzWoNE7Q;>v&C8BL)p9cZkfaL!>dag1`QgwOTJ@bIuqO-{$7yDd>qg3#oryc z(11G1YX`Sc%&3o4gCspW@eqPq z;qdvJa%83`9l4CYNI}XKt1<)O2_T?fd*{4-`9*;6&Rk5ePtKI2r?()V-?ve|e)6hJ z7z(O!$QHj(j1^U=Iy1)GR1>cbu1^LA24Ip_IZiAl28~yAwU{C?*6^xfJgU(2S*!Pi=R?o4zrWvyjv`MsgdnZ<8=)*anBU|%Ju>);qr}#65!QRPX8k%nCw_mD zJ2OcRZ*o*}5Kx(&lBr`Cv6;$}=^qaAgR3OlHz*bx6uK&fs`iXt15os5@as zKZo@w;kXy8W?W5*>3bMl2x{l32wi6AzAw+;|haAO(P z`CtCt!}6u?9FZfVle%-a^%dk_ee7=8HrOrGrHcH)i>IWgD=*#oY@N2vLqKR+K6hZF z{K?Tv;KFkH+AMgnfA)#H<+06!^3Ai?ofn#j^YNN8nT%)NMKy)PNdYuO1(>HA3s;=> zL+qr~34|?l$0!ssu?FGs6h}cb)ntVxJg0vYaBfqRQ>rcbT5+x@y*)j=qk4Rr)@&{t zM<>KbA;N|*PLg+3^YW4eE0+o0fsh2aSd+_T zRV&q{QFzwK0Z>O~;tev3|0qZoM~}(nTPNlEoIaztDwppNUi;+a1U$t&v|@)$O-#zek36i} z;?UtkYOdD6Jn=mQ?p1Kdzt&(M%`@3IjFnlvdRSd$X&@pqK~CLX;`1^D=GOEjXrmKy`r2D^@x}?cbp5Q% zm8YF2q;7hL^mGi%n!c^Fd1$Y!@7>wlZMDuTOva5Xq4yp&w&=7OHP2UmctSez8Alhy zw6*)E69V|o$hds_)QEJ!Oe)@+tI9ule3#RtrRqF3lGii~e01sZCB-`dgo^?*2@kLv z!axnhMb%TJslrOa>yir>FF=SYvTofvIeq$+ZZ_hqT`+G~0OF~M`tUw}mYb8>W)j}# zx%1~C9NQJ7_w@F}JU-t?95n?D)(rt8z8e5=zjF18^z{$GBOTX`p4^v>#>sQN>i7g5 zU1B;NJyDq&lkwM{lJS?nC7D8p^l#oF{d=L!?t{SZJ|L#IPeNcx3Yx)2%XIZhI5%gB zi=mZGAzzU3iE*NVp1+`iZ$4a&_#ioV$Kl&Rlz2u1}qlVtEEaSV33> z-dZ&)J%u$g+`CEE5AKmogS%u+?>3mLJ~g2;#i;~o)j*lZ94wp)_Q7jGU31=iilE-~Kbn;5s|D-7Q^v4@%GdPfEw8tzvqJ z4IK%`bEPKczFdx1c%nF4JkUjsCep4!Ufw+Sw0!HxAIfZLLZb#1Tzo#$DZQPmWmVS( z+0egN`g5CPbq@ro(5GgyQY`^=mt?jKfvOnK!E~wiu??A?p(LZu5(`!&gaz2g)1%Y! zhY&2qRn_@GGLM^ZeX=O81Ne7i*YU=d=gRVhM|Z-F4^)sM`ojf}{VvDfo$&JL;qiAm z2dkmEym5wU%)9ueKkrB=oc1s(m^>TsLjd(dYQ95K1AaSW{$rqQ!t&^zWVPZ1EE^~%U_bAPkl~oY0gJYO1w8mmmyg4G=STIZqx14 zQZv9#7vwMB_#d%2IGJog`ts{!|Ar@Ie#q0yd#H%QMhmti2gEDx<8l+W%5 zu~?$p?mfHEd2uEI-l+w~K!6exU4W^g##jgb>f)t~vTfTo)heM+)4euwO$I?|(mW7w z(;FmBaTVt8+Q?P#SDR(z+K6gA;woyuY&NI3=G3Xva^HRT!Hk{znnQqBm_nCLCCTZ z?rezua?!6|yCSEt=+truMFCrN%ZcMBq<^4aNl;=c3f%-S5HZ)yn>UrKo0^`K{rmUJ zj_up!z4uPaRS>5a@P5tOfL7pVXhMmd2BFbr!E;eih|SKPJ156cZg=3o0qNe>CFd`k z*K?uSSq)0!3XU~6IHLf|FQIU4a?;0ga_d@4xQjM1L+6L1tBXc_R42F<-*OA^5(_opwUL;SAOcZ z(gj+PvG?$-Nnk9PhOCtvGbLvx0wWS*jgYm9i7W%_b{+nlnXSnEYy0GHQ(KiQ^_r2p zJ+u-rLEMdGxAy=i@tSg87$UxirjWmPz*LdQB<|wE(maqTHO6VYy&4>i$8tGf4g`Z&^{$itjx}<1@~m2ZdYzF_kx|b9gB4(U%DIZ%nm8{b;}?*n zdAD@tyJ3!|+cP1UBX^$9zz?eY4PuwDOTj~-?LF(x^z=Urb}Mn zYDs@{vnBZgv{e_}bAskL+cSc34XGp4ENcPWmEN!}e%KhwqWPg|Ys}M%z%+@^$m>-> zz&Wvo(j=1Q`g{9T15qG*db+)kxJU&Z2p79_;V1%oUQ<_RSKY!Z#%ki9+0go1hUiV1V^t*p1fAr#S%fEU4U&{aa@|X2z zW^P*Ey7+>O&yGqTOsDbWsWhP*=mAob1PR|c61eyWf6oC!ZRsk=fAr`sukaHfN`ab-w}IXxFNd)^ z)pB7~~Zv3vjHP*t=4KY#7_5H>*sz5))U z47U^~*3&U4XK%hI|N7bA(i_{E>s1aaXX>+y=3&p+945$E8`kM+YKUpX2Y>Zr`()!l z7r=AbF{-APhfk!z_d2$BqH#TmXMGr5@iLZg3~G z#U#kl&09br+`Uhpd+u3K25W%9y5z05--5v0fGJxCj%QLyQ4*~b9O5u#y8+P2lg(k* zZ$u37$k8K;;mC3IboYYzoKaJmFXW{kpqv`<^y$+wFgSp$iZR7ib0A|W%=B7G);@Uu z1CjgRB-U#^JcUU^=qX?#1oS#>&HSmxZAe|xno3xpPMCF}_gd8rHHT-vYL=Vx z4j$zgOxzXh)GfS0JowgC2XVu?<@)ppT>A4WXxs2J(7jf!;qSf<08=}M5OYa6mrlHQ zsyL~FKnI{=%W?ivdiI%&>iCQ^pFxefm<1jFvp;IHo(i%tcY3XEl%a8lw_p#38L^&2np0DRO7jG51}wMnYv%GW>ZvqODn(nUn&|*^Q^aCgtL|m-29_LE*`8&w3ezM|frYJvlde9D;^8ROgWV z`ltRU`RW`0T3$T;Z7J9;z3{N=RC*v;?-@orsCk)6{ii>37l_&%sE^V-T7%~hR^4%nl`#HpV#U3C_bHyp(*(>5$XC=< zeF&hN;G3y5K_*D7Q1pJEg{r2|r3r6bzL3W$asFUU6@_PEQ3x><7;`)0JK#2eg z@*HU5@$Xa1&Tfe8C{E%#u&uv{-vU0>o$p6zW|N#pF!}7wWAda1tmo7N{6~-ehHOE| z=1*Sy11XX(0$8ja#|as4ZZ+xCM&Tl{b>Q7(YCwGgLNo!wvz!aOwyMg#tNY}apV*_H zui!J|lQ4B4KZ!dS?s;V6koN!0_XtF1I~!U8Sk1<;8OBYG zEg(ZfvCLPpsK(e*W2EDcDfwgISZv?vP5mkGq3-o|^tz;U$)2gS(;xv}6{xx>#G;VTlRCl*+ z)qZ*7!ZUIST5AqCizbc%<|%|~KDzs}vaWl({K2>WJGn7Ff{1yy%LMiAFZryhZK%JC z*=6G(PaVHx<>w#RCXen|t7NC9#Q>Cl{=Uu7lsOHj4B_8jePXxIegPp0ZS{G4rW4G3 zu~bgY4tEhFAD6UIfq@G`GgwSL8~D`Kk{6&E?0&`&C&5KgfUaD=jC7Y>au$hy1z@E? z;34j8Zj4@-o7L(anl@^4O!EYN|9Y(1QiW>%F+ytXiK6WOl`qNMm2)z6=9F}8+ba{t zUII1K+2D28`%)T_KI*rg_fy#Xs=I{|@A3`X~imP(i z(Kn{9$p~=OhJl?@s<_=b0bXk>UjOw^{+|5XXTK~bt{nj}*;xmlY-)fjk-4ZCsU)N0 zGy2+>K7C;R&BxYLz>fE>@9UJW{K8|6{&u=hxsqiWgNCD5S%*=4?$vwmol**bV0sSc z!4M5`7CpcLV5oQBc~@C+y88tBOli3VqLjI4*5_K?xN*Y^Rx^P~sgRymV%Baai23g+ zA)9sRiBC)S?t}97fAx>0Z~uKVaQ|a6`pPrvP;h5C`3P$HUeS$!AZ1st1NXH>J#=Pp z0587<+N81~b%oIZ%GJvEkV*Ln!xiMS)*-k&(78@7O`HPhd0Mu@{LM+x2TO@rpv5vd zu&YJAP0kux|GSNI+3W8|&4lm+S+L|^{>EXsd&7`y9q#tm?r*wrK%k=#G%u3U*Yl~@ zb!lu`zWmL@s*yqpS0boO4(X#G{iyyPvE>~d1@$WVH^2XrpZtWn`vrJcMNNsx#Z*Ne z@6|l@Cf?fOM8wR43noR&HP$=w(Y0l#Z2ZK}$knI*LV6B9BFOJWPS(BBdoSpNYp0>5 z;Y7_+8_hV_(b*mMut0LW41D-e;46fT03{rSQhFv>puB$3#T39Pe+3)+CE%AV7rwjD zFYEfZ$c3?!a`ML8^7!u0Bnpx&a9FSW;L6kT-i@QulO2e`I*(cP!O+Hp{jbYI+g8J*)&jC7`q$LdH^WRpWGqaa)*g3`(PTYR5D=p8p16X-Sb*B@ zf=s}yuIuTnadP^>Ky$M+2@fWY*GwUbs1PKN<5)S};TNzB1uY4a+ zVorn7A)J}syAHTuHyk$5El6@Lf0fls%dRU-l3+OKYtUFXu#4A4gkSp^1dtcW~QY939ypWYCQ()k;-Zak3T7~vFxNTTIjGylwM|=z>j=Ajr z{*AM>aE)dc#978E3zjsii5;IvuJ1%3y94;^I=sn8x2~3h+t>JTPa^Hsdv!JuR;uUP zYB4!UR6@r(#M(B6W+AlHj+RSYyI=Hc-~F15{@`1>L2SikafBdvcmC3UCIg!{%DKP# zzhwhrjr}l>8$R<7<<_B>QByH=nD_ zmCG*!b9}Y{^HPD}Y=ikL0B4ONL~~{0oNON01#hhg!n7NN>2s(qKBmCEgay;Gc9_LY z1KZ{PjgQDvZ+$KGW>-SyT4m+m{_4l&U;O)*<>hlX;wB>2CK3+4J0E&Yp}$Kgja?hE zK@fun8&^lWIzaL?kKesf{)d0~nDj%?=HfV_X(0&nducUqTO_iSwv|gSa;-1_o*B6) zbKukR1HEx46cbeC^#Ab{+5d$vNzaCDa{PDyIg$V~5TXZU*FXJj>DYXiOdWqkdUqU< z+}aIv;nfV{-aL!AY1r7|Z`r0$!Cl#*_ivWL?)7s1)_Zc{))^&9O@(>b zRe9?8SK*O$Dgz%0z;tn19^UkXJh|s@$-0hBDGAAL=TQ(h4s^=D`@$#X#^kJOyhuG+ z+nAJK8z`>&h0iwhU8ry6U}4U?wPtaa34ATRtwiu~o)FjtgmI-Ft#z4gjAHYrvygAAFzji))D#0uFs&7rb`Z8 zcwUZQKdMCISm_oBx{7jKyN374JsTdB(aCGFs%LFWbxv;$>P^*Nr@;0Frd4aq_BCCcd6Z~WLdV8OLMg*eqQ9Q=MgU2OGTz*#Sx zc^b_38EBeWB)oMZ4+=qBNd5M~-LijRovi8DAe;KP${>Qz8a#zpS*ny8xZ?TlwPtMq z#8>CNN0zWq(!!;0MY1$N)=0ay>q5cgEaabbhU8UPIqOPLTCLLw(+#pvU`DLZC zt8(@0e<}tJN(Pyw7QyKN|Mu+MtI2`%j6pRVgEMm_N*!7@kJTt#{e8Wqsp*+l0CMlo z6CE@h?xnN?vT4q|;_Hj``6 zDDxMLu6-iMTAc$5B|oCMSJruObQUU=a-DEm8}&(W&O}tB7#BkOI!0=&#$2-29@iq< zI;}`sanqDEZRHheghR1s)D{6hL=_p|o{mu+WC90$c@HPBi2(_Q?tMh^gTt!sSgboW zGxKa$S4Y@xHFTT#SoOV>KoWijQTAU$f?GhMbo0=58R}Xq=f+PX#B&;e9tmlgJW^{m zAaMPA|}L9 zP)3k?LczNQaLSBTW(#D1ACz-qh=m#!H-&-XB2sopbhGfh}_8)+u@8 z@=Nk@0P~>gT5R`q_DZp{C?$|^S8rVez&{Htc0$fvKY{GYqCAA1VN(_=y2w+f-_u&V z8>2ThZH3y4jW}44FbMX$x33p@wUsrJ$WPsH??hdzVMOom~Y ztIh~Lg^lI!yO5Q+X3c5{Rw?BinrSc7hUeG(Z_^Z`*#$gJ)0|$IcP>6d;-^0^g9jg$ zne(S*^3=OBh1~km7^JQA|2_PF$;Ws9wB~7@zW$!PaP%2DdgiEH zzIjQep*eVhB?PR83u_ZMXg(&QJwJ%Zdg0*?)ldwNjG#E-u040DU@^*1Ew***HuX>$ zyW6&X2lAA9HQj~r!*j?Ze*o3LG`+0TV{IMlN-;F+a@ET8ESB_a78kTF zgr;3AWtx6t_trhqzvqCg|HRKqd4jp?$mPF!M&vAD(~S`+qEMBUNEv2KFbiVi9_d2K z7d02NI3QTB3=Iz4Y8-*GVr`6~$Hon7E!zCN2r2%wGRrU{yVu_>_7Lg~vmNsPy!l69 zwf|a+Dn@5-$mC5_>Wm}nU@il$XaFT)>k$6gCR_S;w7iKV9oMegAmX_xCcCjludAyw z?xPTuRT-^!^V}3(V~Zb}yPZ3CXs(k>j|sJoFEFkrf(az9dZkzN1EZ)y=M z`#dnI5FK`2>gX)g#f}@v^JNjFNt`uTDt{Z2{Lhj3m?=YL?ikuFd)C||hcCS<104eZ z@>iA1>O(2mhPB&e7|k&@bZrH&-y(xut5AcO$MsGxxCqAA?J-$U<94~6f^A|W;;N|q zHD6-`74458EI9NWe6DAeTQ(kp4LUNu%qq@=@XgKwPq>C! z;cZ+PDdXBrN*yK*eG;qF>d|6kbIxUtQiy_ijr^^T*VWnw@w);O%=5@9l}hY**g9=j ziyY7kcj-A1pogbNZVOywZfKpX`{ZY3J$}mAh%7zhjthZJnL`FFjoVlGI{Qns)8Bnb z8Y}rblG=^~*IYpP(KdQ{7M+Lx=@b7_{^aogj_}S2F!0;t;Q9w;*U%oxSJ4OR<}FRv zErEG2!!s;jgCXs2w%#vgU^J)}Qut5it_cZ8?n|krm zC9N%-#_JTqerQlG92=#v?0r4XkySLrbxb|h0#={pz=T2aK`i_o!F#&_s#)Emm=)2;9%3sn&^hLHn{yAs^kH9iuRZufh~u(%=(+cK3TYMV#_VZGhNt7CHi0}lW=*r4b>*>d%z-8R>ZLS_!d%q3jpzbzLyn+s1qiDTJ2-VY&dlI zO%+56EOX6?$!>Zl;yUo&fqM>U?$ygLzk)z^H!$F+Y6jvs_FCA1{#v{b@4WL4Dyutn zp$;58pbguobvJI@pc?h;*>kamrC>8Phe2(YoiRm+wThqmsZYzvlkdsZkt=H2c`oeN zwQ*D6?`gV;96@k>68$OGbb+(V7_A`BYfGt&_6mz{wAZvs-(<78Fu0!vYy1MDEVJ=z zKEdy{HMiw~r@?LDM*ch_{zjAcTudqOy_($a^7zM_s5+^)VM|P*$$RkdSS-r7PofD1 zbD|hs-+#|N`d!Q=r&e1H&yJPI%vI+Ck#6|AfA{lhCMTfr;J~UzVBR~McMOAe*mw6{ z%|GW}C#AuH240Jn{zG8zLE$O0L5nl9zBfY{2eOIvSS(6m-o0xVjz6GUhJvmd5$Bi# zPsj7wbJreiqNeu-3$qt_@$_u@95vDA&4@1G_jlfXSDS)t!m*hL&l*H(DQ2=VJ$e9S z=D=V-UhCD|c>Z0jhAAPj+UA_Y8eEyK$VAm>*s2FL8u@B&DQ$-qPWs6VmfY+sHs|S z?^b>7AS$4>PSGzQO@H98iI{I2s;dJ}@=`Msch&W6h+U8bF2tXCrdj(K=`=RSb+l3o zP!*0Kjr1X|+lN%|!CcS)NDMS3%6u!;AF$148s1)(DQwMg$*Gy?*`sI}d2ih*B?ta+ z(bz&KFtM*mJ=o1N06K@}i%>0M2G2R2c~*9`JH$|YCB*wNt% zR0#>#>WE2*JeGR4O=yQmyfVi97=KJ^C}$1>#aTCDCX0j#xqMP%={*L%dJP%D7dsX? zplQ)wVdJB-BU>cLfd#mitsuqQ;3%FHiwAo_v6D)|K0CooHgA*EaL!TG-4Up7K@ZLm zG~eK2@urTA-Gu4u(85nP)i?{>#XblWo-uSac3~c)=Iw#|??=TW=pxZAZ+<766Pkl*{F&7>k)5*}xU!Mg>n9A0~@5ejl!#`@WhOdcbqQ zrg^!qyQA6&VOC`N*FpzCbJuSoH1cZ%tJa^ny7mcmNm5n}Q;3Pl*#CgV4=e^91>jx_kB#3)GL#F$^W*3E z9D7nQFCINOl{j4ofg$!H5NA;+7oLxM58mr~H2}-8s~&}xi?ba~)3oahguDwvM-Ous zdN%NysPSkrsp%L2AXZw7dd0xkDe_qQ{nU)CJ%nbYHq85$NPIs%LoLj}xv(Du9RUg| zJJLjaUb8HU9C|hWC8*P3ck70ZPXeKtz z71e@#EC1!OXri`n-Vo|Iv8T!4H& zr9Iv?^B`=AQ(4hefN)g}e~fR`5@>x}=$oq0TeSX~qCJlFxrS>w+C~?K+oQ425%}!% z^vql6Ci!ICTfIRma|d#VxUPV{)(!$NfE}o}#3lwDC6A2@Wq*ULH=``OVl^?j9`0y* zMeK(V6@jw6omi*C*Z86M!}Sc!=WB#z=!D0%2+R<>B{Q-r{_HBg2USCtA2nC{Z#9wQ zRjxE0CS0ym>Ubx9E|+t;^X0g=L^`w1jy;PBBe4WCmvIsvB%1cJ3lO(pmi_TF_1$Xt z8}QW|(4<$Es&H0hmJXbU=YbiXdb`7>}1)(90JAs zch%l_y;u9*Lp%Fcpu8;Jx9MW>hm9U!JKkWt-YX$kSm>vTXA(L5&R!?xzi{DQzjM0s ztYiVVa{BrCrZAEHOAnGI<>Zz+p@rB>J?ghWCc77SNHGvNs2ig?;+sj}CLVGK zz04_8&WkfDTqG}Bb!SPH4wE8ki^;cZcc8;^LXl1L8`+a$PW%86<-~Fxmhf$z8B>>R zse%Pp5Loo7wA87#E!j#47TDsW$dft?H-1|zC%)Ia^_oHZz9XbUZzxv)Fh;r9+~nov zL1^ERm~9rxJ87JZF+rxnWOJSi3l$gKfLB%mCBQa|d~X;=lh$2YEd@GiC>y0Bx4qy? zDVJ$=?9@?bl0JlSsppX_m)9OCCFdD(ZcxU<5)-Hy?8*k31ei&b%wsK22R1wzwvp*_ zTbTF6+`(%&nRiwjv(463{?}I*(-e`4=tP`s;@AsX#k}C6c&1nRor=Vr^IXn4p2vR! z0JIdk2pdJy#HwC^N~N&IuStu6L#-CQ;khWIqG^ObGD(fDxvl5=;%TMQdg@l1S!z$P z9U@d}#RNK2NSl`sTQLslTMQ_*>h1N^%=BRZ_gl+RHbJ{Wv`~gA1na4CLsK)8FgaAc zS-mKXMG2>528n)>>1=HoOrQbYNn}6fyeVbaNW(Vyd}4-->pUERdGAY$o2tF54l{a(M!3evb<#yXzq}pjc7~#3_Am#!tV{xT5BWWt0?l zU6idKKj#Edk6Fljk~eUHcox5UZYgT#tsbHuArp-_(H2tP%gtu9ZJJdR3$F20gIW?? zYgfj3iTby=0Sfe55fuOSa;;c)v0AFx-!M_H;wF`|dN&guhG%^PAMnhh2(mJM9928l z(KK~i%iYc!|MDxZ$OSY%+l!v(yxG)NI=l&s%f%;QdGO#t5QQ5RXOVqpLyy zcTqFg9dT5~H&`>8?JqOAtHAJLa;A3S4RDV>)FUGk@ zGB1Q$yD8kAYY|+29AndlhFlPtSqS{0R$^lg@>kRx(X1IBm(MXs%!Of&JGEWK542?L zkyHRl)&Y2j{F@;jGU?>Sc%8lIRZv2s5i;Jc(83M8cEDQLuh{q!#JFN4W_AaO}r zmNW#@fp(9hN~|&pK;ksgOo|Pwp&pxmko;wn74{XqiF4q2@!D>HIw4iUYheRiZUTpc zjI!-y`q|+x;s#scIyAf%H$Wp$frs8wDyP%)SG6_Lnu52%jU9hqHCC%frBcE<%^pUy ze}COPXn(zd58(2q-IVJgNRW1L9Fx3gZW z1f|0~`=DVoRHL~~71bETXX;_rbLZ@f+odD28(M;<1Sf8G3 zYT2K)Oih=}7r_yiDeB^bZWf}6F(MNQd1Lu~aT;&nF_5<8&eaH0FPOal9olMJ;^7K4 zkS(fZz5gLmu|hPumz#pFzr%ITw5~(%QWXT4`>5kGO&GN*O*ZeAwjQ!p%_$QB!$h55 zqjRAf9!p%TBIZea8BH`(Z53#6+G;Rb;<0uJ&wXPhWMM@G3qtiKFvBDkrnhk?X;=qp zIL~Pi7~CYLmiB8?ePxHEj=cT0-gu6$y@W2tOlLvU69w=ZDE4g=sl`qpNStGnwc?xu zq+Ebp*6~*`CwmaTJ96}>hDB(8h;L{{Nw6{rkm)xUk*hThO~XFy%=cz>5QVf4_(-!4 z{7k{4M~W;5jlMY}>Z2z8Iu&S4OR;5R+t@Ojh+`99kpI z5LH+jpWco8aSIWV!yh=oD$UKljWVkf2(>)em@6KcmRyE`uyRA^<9XXnUys@YjRL!{ z#LFd_1qwiEn&!}dfSH^GzXZ;gE?-eC!S9qo(!YHWP4pJMSgsNFp z({T0=Q=cI`qnIeh#pR}9mIZ~3qkc!=6b!04?$ExZ6gW(4_RJ zq!tM@@>Z!eu4)mbpr^ztn_cjJbdp!#8tD@wv7s9y@8{tmv2hv&a6ddWPI#aI(nI8& znQlM3hJ~!WgAYCUU_6-8HKTQcOiz-gfY}r48O$a=;|xD-yynWxn7+f{IWrC(dhh{< zr#w*`x$E(@W&$6_%<6H8xolLs=LbBw&pVgDfK+R0V9q&Y>P|*`Y`H9ujT<*<2j$2c zjru2Xqeea7>#$V zorY^xR13I)V;$g<6aZIC9hGqKP zy^Q+}BTa_6*tO?JLE!pkErZSWKKdQ%|Qfq*ugzl!^M;OPsb-_j}kP9+^^<&5WQZ z&4(#8IVK+FvT@R16sdr=x&*KJjSs9~%@t>^VxfJv;KMUlb%_ur=^;YpYbog;{C_|CiUD7ZZZ(9S!>Bsua}ET^ZC@NWjL-+J>c&8Z@0 zp^4;iS$;)9B%w(TYBdCwJQRb}_kwT@GMTnx$1U>g7D#(&Gw5uVaI9GC+nT0h^a9$m z;EB;%VxOUNbEHx(jeTGROL5lp>{C$XPu2|~x3#{WoxN)`PG}ccI&wvu!Jcz61Gg9P z6HNk54_~`=YYg7gDit7huAx?=xg#i#66^TGCbTq%oFBLj*_+Hdr8h_>ei%u8Ml&=+ zcx7Akc{ltrv;2Vb2jG$OSq*H7xv{TDHuQ8jd{xImR@g`58!P#}w?(jK=ZY`G99EE3 znhhh`!Mpy&GC~QMVqs+A=3NxVuAZ*CsqGs01#n<7!p4p3m8B+A9syCS)8Gq;33a8pN*t_?uojOK#ZMi;58`9%_4pCK z`WYi}t)>e==bWQatb*)27*;Wb^6px;9a&P zw^Ife$aX=6fgMulS_3Yo(%h^V=aIeo>Z?ix96;9@7CxK?c}NecA8|rX4A7sJe1H0gP+^oN!$tK-$rojSR6;?^lntgKf%+VT2oN9TDE)oIucfa#p zU3iXpK|5e7u3jBcaR1~-o=}10Vp3Q&YXM9*1&O3)6xLy{h5@kO{9eA7Sq-e3 z9*01Y-9L8xm&B2eVt><)+h{X|6L978$ti>3%?kl}rEDTW|ZU zki2Rydd2K1!SmX_ZM#-Y#}!d2_pk^7E^$yPLtvWg9yCNt%Iqfdy_H^nvryK;4}bW> zrD?6u9N2r;?iUfR=&n|3@ho=V8=C~H{MKK|+fV<`@^ioOl-A~zOXbugIrf1dW6hiI za+VxvNya+RjDs;Pi;8w(#rL|3y3j;b(KMUXQp^(2I3@8LO4g#uT3l?NgOZiNZzNS2 z&*Q@Lc?Pf}PKyL7$DObf;3lL_^P0%5@%!j;GQ>hbr8bN5v*-}O>x%g=YOynC&!Yds ze!U)=az1zJ^eL3~-=p8JTgzXA`0^6&Z!W>3{{O!Jyo{HvY)7=< zp}TgVLv*iB&4_Zd#>OXZ9zTBK!-26Uma@)|J@(l9tFf>UCoqWn6hbTq!+3s`t45($ z+qo7E)w3s6(Ipj}TO3*=-z z7s!u=Da54sIgGLWE^f@hxGc;w*?D*>li42W+xFp9Zz$e%oYd|y3WK@CHoUo{8Q6S{ z0ojbk{K^WBxd;s75ZqtGkV*;|bG8UviC0daIjxn_+5sjV+2WuBrjxtA;Ik97Hz^yP z0Jl*?68tmgsp7p(Eh*!GOgJFaV#HGXJ~|`}^$>^A)L*%BRW%_)Fzif297X#PGw~a_EegsLPduR@o; zQGLyhHg6y!c8FCRCciL&SFcC^NfSbGx#cc-Nzj5UQ{dze+BT0DpeYkWrq^@Gpl zvw{3r2^NIlg^9_jYhcRPy9O5S!Cg;`G^;5lX(XdF7&JNiF?U%<>Eiti$DBWZUX%N@ zu^PNPZdTPcT8LWJozGp*)Ryi1E_$NS5*ycV)YtjlOh4hgW%ef}0A7u1TV{vS8zbk% zvVLk84Is1i5Htrd)3JAtt6ApayFREHJui-p(&ugZT(^NWqSZ(N|9JxKUXA973 z>j!##Zhfs9eQaX#0-M(6vxOfo!Rqbq#D=}~ERyJc!6aN^nyvnUJ~?@OCdN{!{jsoE zOx;y33GZPThJ6>}Hi_DOE>jyU?m@enKvqfnex%eoOc0E|fjRGdem8`Nf*4iX5UkUy zq}Q0qM2p%J6RrEvFUw`5mNhqB2OdG7*(-tzNv##Nb>z7dT*pCp{6~Q^KKL9Z14j3R z-=o|dHqq+gHHnG!&SRu@<#Xte6<=pm-j)hd<8D8gKn5Y~@9KyH&QXB{(x0E{?kp5< z$J*ak!Q$iQ*!cHQmh}rRtF%_W#NDThQ+FS1-ObS+4=`Vm2Skk%Ro0B6dmfYQ!m#WK z(jYG7r#8EGeNqLHT7~XE@maU#s#oK*BmST-l_L=N3+!C4I_7^LDcf#YdY!&Q?;|7>BG)W|Ez&w#h>W9#x($6Vyh)Tpt~M zVbwtI_1m@Xw_UI{t{Dzd{`5?_yz@y-vh&(Xi$r~ugSF`clBj9uQbz>{$@@pl5iers z+d|@Z*4xc5EwgplqBdE+xt_7MekG&tk0#m2opf4et=M@%>Q-&q7ml5#@G?z46ao2h zw1TW;3USI3|0UIOee~wDL%rR%ZQTQTA0D`fzeX!=8)2Ks-6dNc2W4&Yr&eJd`1Uhw zEK7V8YWqj)`?^<@X^(=_G>dMeN!c~B_5C?1cse@HKNo9G|D)Q|pIcOk9RCEyR~-jF zK<#jtd(IC!GTI=>w~q{BuPpl81-b*DieuuGWLNf;RZlQ#JsJHdDH^5j`1=s&v_&m> zw2ypr&q5F8Lv;Xb?16Vmzb}Y&l}8y+AY*e#8T!WUT=VSvAz0|K{tk%4ccEqW)qrqD zive2gOa_$S14l$aPTnWVaA4bO27_q=8R=)`OwQ+FMNQtKZa2hXtDyBr7cgg@$6}v$ zlBgM5VhYs{$l1Tg@VGb1EjJpAyG-rqU(#V3{(bvu%`i-jHMTXR znoQs2d*1jGRVzqNJ}Pn z^~B?k%US%**dD!2y8oKitlpq+pBS)*))wWTSWeGApKqZAZBR2Lj23LLgp9=OBM&{S z8Lbo`_U5A2av2Mbp^x~fk39Z_UI)wjd7d49a5>L`LTsd#hQsUOd68X@C=T|Je**#R zh!1mZ9OuxIe7|gh=`Z=78Ob!TXh6U)Xq{vyMGEcZtJj{n=dN9IKlXyf$CZ(*-++tz zYxM4nZ$uFljyhhZnwa@4ah!}Ts>xR|Lx3)_W;38!EpH|pyfO=P-@g5x&#|g4XcCzv z%H!=rKlrK1Y1xb*EbIKJae5FYA#pkbg4Xrf>UHEPwAMSv-qG`;m$?RUNH(&)2ZI9m zU~(Zf4J&zebnMi8`=Oz-njm&np5@#b-yANh=TXs23^e3NlHpbqepsDCp`8iA&$%9} z!>+F>j>`%lK3CIHMFfe*l^GzqL0-Nz^hPNC&S#_>W- z@A&qbRRi)jLa-)himzU{eC7K7y?a(i1C?BflhwA7+Wx(6%Q-%03!2tODxNo+rSdK~ zj1D)f<70*>cCqWJ?h@iCka<6Dge{Jk_s-Ynw2pAt`JecEIB;0UCdQ>baQ_2(JnaDJ z$B;0CA!=t$ZApz5k(^AOiA<4VI<^P$vvN#OBVHMPp=RPWaTDcpg(z6B1*^77r(&?K zf2zw82^Aml9BPW)B^OpTBcl{MCN*ckosZL;d6yx>U!` z0}3?9ps(c8V=@0-Trx}j@k&ePaARYQ4Mca35(=xB9Se52QD^S3B z(KK=P%^?J}2LQO&BX-CjG0hd*2XAdk2P7m_xnI6N$JPJk-xB*NYd%|>CCz{tCfWhvTja|jdYex48^w24A4_zK-M)KtD+q2k`_f!>rhki zrjdE)@5DpIa9k{%Qi0DCqig~`am_tMi(2_UY7T~YSW2dCy@yt*=f*f91(Kd46Z$AX zoMOTB7@iL&ZV?wTM8(#W;!=AxXG@Dgah{q$=n5nCe2C$6(ipTH%_N--euwtv!h1Gv z-W1crb4aHtqPZ+J9R<+!ndnjhrq*Mrnj4@nrW~J(FQ)m`jt8WGJFJyQedWm1_~iIA z@5frduYv`zeEi&ni?6R=xAr6Axg8y0;#GL#gTlw`(wK>7zbpiZnF*>RO?(kT)V7hg zvybU0QB2P|%A(?r&*ygR?2AnY2S8Cf62FALK|i%Y)S)l*J=AA?gSLksek9HTGyZ(E zSs6?twHzmV)y-B;^cJH48{d~+P~e#ct^K!rb#}!MTv+EJgu|Mf zJa1Q#x?a1!Lvus~a}z}#;rWXfUnmyK7yiZx)~7!DMEUf^%P%~1|G|$afcF?GO89T2 zp{=bauZb0AAyBT>PzSKkEj5o^bZU~KZ?qO_IH;p_&>djWcQ+i1{dx-r?Z@AqRl_vp@Bb4_E)j36^F%jNW|e*4V^v z4#5+WAQG(Te$`i1Pz$_w>ZAhfs?T{J^Ih!Nru#UG6}qw5G!IPP8wa*=u6|YvSb5W# zq^C86_@QR$^wTh?$!0L@-1^iCYN(r-Ur29_EshArDNNm+-3ru)ecH;jj!h{mFSZ64 zh>=cD& zn5364xI81KiO}4TA*+|)H=`ss&VM6L3K4iiLB54zkGG%7(Vmv`?b#RyT*Frp$En;T)h0s-FNNT z9d)vcev;eJ`mT3-_Uv^$ldneM?u)=Q@zo{*c^mo|p2IKn6mOt`*)TN9DuiO9JSyww zOIuH-GIOFXzsb~cuB^vz^vt3eJoLh%o>Iotyw~K&HIdp(X6=0A1+y_5r!jUsf8c{{ zo!DSyev5+oQP6Rqy;7#rbNTzAd}jZ~3Kk!uw{HFwc%@&=`Yg@J95z<;a{am217Gdz zhJ{x(loJmq1HAWwI;x}fe zX#nflt0qdqf=SaBtwE(6{)``1(KwqjhLG zOeMiO9Ryc$@AA_5-q4r0XM75f6ZSw!RyH})dPS|k$+>xr8P|874dZxjZnT@bY?87R zs+`ZX4fJ^KyZHI655Q|y1*^opV-RP9NPT9A>xgLSe9VBvy^0o_hu+UM{*h=bRI;AG zbouJx!GZpdx5_;tJ~{W!8B`iyR3J>e!+0!kDUVr^{5Qn>5yssCP$7pLrT!f5O z&0VKJ>_n9gxv&z<;~RMYb`p(6H!+pCODmYMnB%v`6^k)QOhKVGVHp<5Sn^W&T!$_^ zxh0l^X?irkezyjdJ9PuF`yks+Dz61oO%L_#`LkNW)sGzf00k7$>_cKl$7xMznCU8_ z1Ed#g@Yosq-$Q{IPhKb^>2L`^f$Gj=Z01 z{3Fp=nxl2==GSJ6#n^7xIJd#Z0F}Fa9kNH+^OIVHi^zVR*uH7GS>y=1xUddV|HBti2fbfKT={LQhkuf5;voBdG<7BJQe zxZwnooeHaM3PFk+&1?iNpwaot)^~~t7606;Rm0GLs7iK2yfby}j!2}ECZHCg!0p|4 zw=M=}^^v2x|A7bN9`kAn12>wkq65u`WevJ0JF>OG)i*V4WK3;{B(;b-3%(ql$2@>= zkj@bDec`Fy=-Ij~3|GahNqCtxvM~&O;cZnu{Mh5V$vEg!W2)YBW@qKVm)+~;E0trI zA8}sEMufmtlZcPL_!A>obEWd@n0b6EpUvEp8k2}vWIy#we7O|e{irXg8$wWZ1gBrv zs3e`<;U0`h;f;@`ml6j>P4lxst_F~Oh9-02*+|4lt#xA*c&?S@hjDOMpJPu_dR($(x-}k9f4P$^`YM45C6a#V~1(u7_^H8nF9G~L=~#gap#nRO*;&a0*AUA<-)KWpnt<3*ZwH*DJV z(585dQmZ10ctDuJmmWT_-~Pl1mNzAApYvZd!v}7F_caBt48&H)$8|tA1&dgR3lvmKCy!Xq}a~@-X^sG z8;*>jV@%b*hGfNf916kr1U)(0atPPt)R@%Hz4cQ;*PIMh77g=jmL7(_hEUjs0BKhrn{NM*au>07bpi-H4H)-;&A-9Qw zK#z@aIW8KBPYv^gzWZ^+{TP?-tels}J;wOSS>k#rF#W_zeM?8z)7>41tUAFvn{e!a zmebCB(HIp!SDD|V{ndSsb`3Xax{LewGq3Q>cM`P?<)A>a7^nnnp{V-jXCe_568O>=>4pQbv1}J zq4GJWMv|O%y!0+*xf*}Qnq+xwvQRZ}8Ku=q!f8lQ+J34;JV1P2!`s^Ti0|2;AUx`U z%1z=Ke2J%H=ZdniQ(+FzLwI4;g57pKM;bIuFMyBabCz{{%jtTW@8%P zZKFs_t+9xoU(!G=BvqnGZ`hxDo~C{}SJ3d;#$z>@KS@vsPR>nz%sHx}W&G0f3^w|n zpLD?r5;r1V`mi>6&NdOMd0L}M__h@mamQ#VYp%DA^-l&30?`-%t~(d&LU>6)IXbBx}TF?R&Z zVW7l9+9d8UiQX=zHVxEO14kg;Ht;weW7!1sjhjE1g#8QCO=WxzrrzX6<7{Yo61l); z-T9FQ~O+Cby3JT&?d_J#M{Y3VC}HV>q1Yh+8KoJiLT=mRJxY z$vmipMKTTQtnqIf)M>&xb7E@WpA>B8f7w{g*g8OF>$ZtW+U!&zGWA%j;pJvnu}+Yz z6TBpM6@&Vpc)`*{x}YU$ubGMZ7D7Q=!&9WSU!TNLK};AWLL|*PVAUkR+L-gM6P9@( zy#>}w{aA_^)}TS>NF3=?#PBxs6+HnAQz)s30+`p6e}M3Q0a z%y&(gY&7pV=F@!QAipE50ec(TpB%w5X1;=c{`u$S?YG~SJCFD8p4<0<6>pn)H;Xsg zrp@P8jP7d2WGvB8E*AZU%Q)A?vYE>j47=RpEhIPD6<%nw!h(`^e6xs~Vix$G7DL^Z z=7Y3x?6h+a+PnvLiGpDlxo&p3LY!TuK$#U5K(hp43l=G;c8Q-|j#da;oWnw&wTsx0 zwoQIxA)zsC3h0UmmRaN?m==O)TI`gxITb<54Ki(F`o320 zPt&kV#&X$Z2$fkt1DPhOI7s@S;8hWDLcHHcs@*dk4>C+wS~rtK9fzsSB*lKO$b+X{7};KF_ND% zO$4fSaB~GQmPye>?U*jppjk30Lea{!1}!v^XHhRtqM1geoP30GRM7P{F%n*iT5 z0oKj1Rj`0CNfYhV3{$m(3xh>&w6F=l4I4C>X<~YVCfXpAB3zAvl+wBxqL7T*rO=Fa2C|FJAjIlD|@O52@5i}$7BjD@g5V@94ye6HG{eQW{*rvdmz z)ovPgWY7S17fTX`O}?iY;n~dOwK9d$0xLE1Ol=FZy%4X~ipp3q!D$;wGCG zo{Y3OwoNg0)h3K|8deAwa4;IZwdxYVdm08=NT_U^0=1BUEJR5x^xbI!WMqi}>!oO{ zP}0*P(=IS*ILTJ7f1_*ONDG)27n{^P)h3=^&;~DNW%)#D<2hEFc#B~RzAIcnBR1aa zW;Dh^uPt=kR-b8YM;DPc(=7ZFEWn1#0u+Iy2%C}l41GHUY#Q*j3kcRiAbzPZVIeaU zHf*Sc2-h?r44VjTGr?KNY^D*cHcjg;l+%@6!VQxY&L)ug0nwm|d1x^Ta-Jr%O|V+9 z0Kb-Iy2B>Ui%rp5OA)X%^KIL3&)W^@*k+5|hCtf|gvquz){-2xl?dsW7J$z*5sa{f zS85U_q?tCUN_t>>u|ep?W^63gTefWg{zd^ZZ7jBx_JYvOFsm%UwY@Jv=w{)RW*62@ zkhs}*w2JB37ROA>x2m>z9zV*onO6B)Hs$^=6oWKvkhmgCPv~3mAhcb?VziSo(oRB} zU4%fGHqW7%P?}}#RMUpZF^jw}3kj%Mgvnb92e~BSTP}~)Zl1VZft|2a!mi!Vy&oE@ z9e^&k;dAyjAAiL$mMoys7g{{Kh{d)`xIw`JpR+3{Xv;ZP_&x~nVl0Pz&;)C_Cu^2) zj8==<3~NT=nb P00000NkvXXu0mjfYPR%F diff --git a/web/studio/ASC.Web.Studio/skins/default/images/documents150.svg b/web/studio/ASC.Web.Studio/skins/default/images/documents150.svg new file mode 100644 index 000000000..faf1d806e --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/documents150.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/empty_screen_filter.png b/web/studio/ASC.Web.Studio/skins/default/images/empty_screen_filter.png deleted file mode 100644 index e79ba5e56fbdac7a2db5720d9ed998233ad82856..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7586 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 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/empty_screen_filter.svg b/web/studio/ASC.Web.Studio/skins/default/images/empty_screen_filter.svg new file mode 100644 index 000000000..6cd8bf6ac --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/empty_screen_filter.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/empty_search.png b/web/studio/ASC.Web.Studio/skins/default/images/empty_search.png deleted file mode 100644 index fcbc69e35ab6d0d151329a81b5655e0e41c8e32d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12200 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 + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/event_66.png b/web/studio/ASC.Web.Studio/skins/default/images/event_66.png index aea2c999909307325311b7061c9c754271fcda9f..111efce598159a2aed43e2f8c68889c2a7c9a13d 100644 GIT binary patch delta 2252 zcmV;-2s8J#H`fu6BYyx1a7bBm000XU000XU0RWnu7ytkO0drDELIAGL9O(c600d`2 zO+f$vv5yP9}-@rDt`$Agdncy2R zp`bXZm0ILLqa@Dp{O-khd_FtIJ{O1j*Iu5NJ3n{--~Hd7=k9 z{85vp?luZ~9yf^iPM}1D2`~RN3V1x8|B9-b&5txqn;IJ%yDif(!j8|2B7i)Q<$2DE zq7m8SR6HKvKYuM&Zvhvv7&3OBgmQr^K z0XNSx_hk$tZw=iy@Jx>?XsH2*AqwvZ04jp%c?vy;jZ6=9qVqx&GS_Gba|6Puzw<)jrPQwBe>o`KQlTys#xt( z_%u->!i3kU^YQybxcqq(s~ziZ@#Emhfvk>oB;w%7L0oSrnTClH5hirgxbsF__b6$E zi4qYeN<^3_5n-Z4gozRnCQ3w@@FGu$sVoKu2lX-A=OWDUh62tA-v12%V_;ALHo|u@x(9jUR37VUm zT_qwX(;x|l4joD&fm%>oTdS8crl+UT+1Z)U7AH87xe|OnAKXMv8X*g1slQn1O4{Gk z(}PGPqPHn%cXxNz>QACq0!eohIT68&px_kF>3@RQM{}Si&^!p1B*d;U>Bhg-$jLOQ z0ld2_U2r&@yvUl#JicudG<@2fSuVcdTA`ps6tm!V6qE?NDYzN#+(zCBRVGYMPA2Lk zAsa_YP?Kh7XA|vf;XDgUL|E^pS(a$h^z}^=E=k>UohJw0f~uSxq`NU2lX``G~cAa zC)(`e+Z2;mG)#ZBgwxY;j9iK%c;~$-CV!;}$m6@N5uAw0CUM}v0k{Eb&Dhu&B5w?# zz21xVI&VU79V{Pt33z(9Ag2uVYZa&)JbM4&r*9$r>(`*}+M_3VPEOlZAHh3j%@arh zv(IcJMJA9~YMF21bqw5FiSXS&OeI0al4kVj{R%?co6*}+iPDTx46VO}16$Xi+A9dy`6uAkMra9PO$cpBA!qAPfu9{jZB-e%8rPuB zcTqPJzA`1B#}y(9MFRbeMMC)Y@@3&(`8#lxd4}1cNgHhC%!j~>|1cWje|U4bPKL+h z85U$DUKYul2qzNU${;yzu;OAe34biVm;pZjNGQGHEWC`Fj}0;;kc{?#H{kVpyR5#v zh>%Gjy1KetBY`Gydf)|gZYfU{Zmp?p=}6EVwx#4Y$?$pbR}o%S{v>B2oJhzeX`=c& zP0l!WhtP!Dh9=-)5e;sxGlZxRD^riW2yFkoabPAg^ioUi+aShy_<2;fmiP61Fps{eh5gt3xrSY9 zXil=0aIu$Zwd(g69Wn{>9iBKNSbWf^-~WHZZ)kE9v5_E;k=Unc_0?s}GS!?+gV`eU z`&=Mv13~A?B#av~M~+J({5L2_5y0N27El{@9Rxa`15W)5_~1no4L3m38~Mcz>7#+%XVujQfE{9s2>&sBJk9Zv>5vFfjV(fH9ll!RkNp1dlCcp^ zj!zDcmhdDb?eUW7Jod7}P0v(O;Dwod5S!Of&6Jr)=kTCqju7dxP2%6bGHb>xv?w)# z&U1DiNJ*V7w`n=Nbbqk_&avcJiZU6~!_at964B7mfYFQb)E#niq_?Hg$(g1rjk?b2 z^i{p_Nl_BP$TIPTnJ{Q@&UXEjFX(>{aMCk8V+_4S)=YJLr5`H4qALgX_NV+>6 z6|>CfN15jv#7+@eHZ@`}x`^nUc7mTY6=fbla8dTrKR$$kot3ac+{z9R8S)0H4_wpK z(0O(apMAM_8;PJsTq(v!bMzB!zube~iG}Q6z#lb!*bh+5NjQ;w$3;n%g6N!5(c6RQ}KAb+d7wLvt8eR%0E0K06S45Kz~!j3KY*=$)2+bI#Y*~n#&;Ve;pn;f zDd8Yng*MDshwH}2g-rAFKNUp)5zZbEH|K=a=Jl18m46L~HhKe{o7bTB_H7!@oi!YX z> zvwOK;WR9_gCG>x~sBf`F?Ma%0AmNIA>{UesVQO!;Amn%3#1vY+*#m#20i?y4igf@v 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 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/exclamation.png b/web/studio/ASC.Web.Studio/skins/default/images/exclamation.png deleted file mode 100644 index f4f9b48cdd2fd3d3d16e57f0830a90eb6d2b0bd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3569 zcmV$h~jp6QDhy6?O9+_T)X+;i`11v68v zM5kyq7Sse%D>fzW7eMCNZ!1p3ZzKol*hMDM-Cmp&s(PwEw)^)~gajCe%M zWL2O{y!GIQ*qlW}@s2*?$%E6(QJ>L%@)+V?^Sq`lZT=PkcZm)6>t@ zXSCrN`sjT_$0=AJq*a~4V%i*^cQa8ULGse)*E~lXo}mx=mI0sH8)Z%Gc&J~*>qnA3 zcN35Ax1P>iOjlf>z9>wb8q`k*hygp8A~TD4C7+&>>0iZ#wl zCFb6sLfj7=Z2|hAFUDYOcss+0`H*rsbA+nudfdj4!r7+(WU%mindlkQ{$6 zrvYx4pw!1;EMVxcg7zT+#{^XnW$|!w@$DosUl3nDUAjq8V=xvl04wToZ=^Nk?3)h{ ziu(4A^$WkGob&?)^}sh;siwZW)oMOWJasH(FpzdyF2u5IB^ zqO+GWCtkIMJ@Dg8IP*~di2`Lp{b7-PzT+ne%dv9&14_*QhH~-?hsIue^v$lX-v4w2 z$d6W(HTv44G4<)G<`rL2&i7r#wJWx{s_fZNHe)K`v-PUJOH_wEmx7HsFc;>;+}@+C znVRio+T7566U7p0l}{dV&gSMrP9*?=dKID03k7pvF3gF!XUsl?16U;||Mr-E@YJ~M z4$7R}<7!`_&kb#WqsAYl75JWAweI#Nmasa)*~bmzooEd%dYL;{tjbxq~Nn<76f;2w6zUXHAiMo+$wb9Av4vfrFQW ztQn;t$6x*BNd5ek19gq{Bqt8KUeyHw$ZWKgkFc@}mb0f6CBVYmzyY`br&*agIsTW& zdxTcErDerkBv0=t@!)CNZ*a~`k(32($@&*A?I26x09=3*aI4ha;EHL8V(4)5vh}2; z$A~YTEKxgh%$NC^^(F8j*(O;!JcR>r0ZzcJ1Uh`xNcfP?UwM2m*3i1KvFAogpV{j< zT$V+(&@MBc;Q<%m1l)jQb@~u**Dq78tG`S<{(knNG<#Ulc_%K5YcBj{_5@SEu&r>iQ!~d?_jd6gXH*syhmp+Q!<;wW#ff4>3zupC*TGgfos?s;}A5& z{R%w#@)NDfYi?~@eHUd;zn!}%Ej?;TCRgQECTvvEXsC*-q)vX$knoQ`t2{t>VqiJ*%m%E=}^>p+HtH70xvB{v)p-(}DYe)G zKRwy6)g?#TuU}7@v0Wj&1~7dNVtjcf$hm+!XaFssDdHPL`-7*pRkspd{Dk<@SYWHx zn25}qDr3ShFl_|xiU!bPJjkk=DC>VOJUvu5=epFKMN27jYIoq*d1P+CA&XKcx?ora z5@lVZC5i^n0-8WuHRiHXo&9$zr?@9~QCbGOYOgUD(;G!14tze)09rs3*@VFnxVd<3 z`S^urMw%8aA4oRW>35()IY`KdyoEnkua7Y11TCNmw1LJTZb1cpQH~9s>Eq|0?a|_O zTRPU8``{zCeQ{NL2IO=tV4f%b}-)5vaz-AdXl5Ng16(v z`vaN1v6xGm6bXhxomZb*(FPhptJ1{5h^61JzCqG?)9u7(_Jwj$y0|9maF>^sMWaruqB&ANBwr5x;kn_a1&arpI$CM!lUIYkg={DXwxpdE zH^h=T^By%VT}4gv7Y|MzKZ=8_N2B3G6y^W@{d4-kQ`g$tC^Nc4HBANnUPt7rq7k%$ zX3(zIUu%^1AtUW8)=-?!keoPN_MdF3R0XY|8MJ5L$cn%|K9zQ_x@>!Z~g%!<0(GDIQ+qE69T<`D$&zC^n z{o#@g4V`m`S{BTusgGX^-H{iUt_>=R)8CmA*_WsU{uKqkc4AvY*>K5>?WUH#A!@j8 z?$E_kqi?FFr_1it_x)gre(*H!7C7>q**Bib`rC5Z*V(XH*O!4P+NF~yFD{C9@Bq93 zPt>}MmEWl|Z*E_Z?BL;E#7eC!_n!B2NiMfiWlGsc%xeS%lB(Q%8}3QznN(A5b>qaGMlRD z(?R2Tge=yQO5g-uD4yuN(XXPGA(yrH`@KWSwvJTWlEo_I+ZlS^$hy+>{oaCh$SjSL zD~1<%0^Wc}3caE5eTb6$f?L)rC$`JqFZB4$C*_xyZm~q+HEH5$(^Zj*gDk}x@W_>x z_z}pS`+G)OdzTC}vnej~0&~S@ErJ z6P3EAR}w0}lg9oxJnCp5f;1?!o5HCd!QMt*!i$Z$0iM@D4mQGhHPK zZWTgo?Owl5?Lz;dAf#(6zvN$fNb9@<55Y?%g;qbQlT_#G)fDGbB+q?P!em{0-4Dvm)ieNJz@eekFIh*yE=Vqz!yB5KEfjmtN!f58aSnk*`bY1 z;F`fKb)_>Gj-=f&Lj=fV;b1yT#Y2?9U@oyQmk5hp%*7_SLm(V?AV}D(GT|T)VHhWD z`f4RIU3jzzTmmyuq)j^;p0UFm#XMt^?}e~exFFovCT!Y-$vCSqX2PIT-{ZZ3Jh;Q5Jn?1HaiyAfg1* zWTrKmh3PU1g)9W1*_b|*Sb#pn%5(`6<_Z(7(oCM`t7alxVKSd_F5xzH!anV`6LW+C zInBcKNJE(EHNs*G0kMt4Wsjk3sakuD$uf)Ug_U|4+N2>0E7k-yFj6y&XTx_h^O*mf zu`sP}7+~kT*|4&Wrim;}n3F$oD^#}95Vl~rnc%GY7Bf`ZIBsF_%r3%mvqxcg7T}a9n0wISWfGmVz<-j$cW`b?}icwI~Vw`jku9cvi ze3>o~E2raR_t`>A+%i@;Y!;n%_rj;mW)}{hUF_JUi;bu2-F{H16LMiv+%niN4xSyV z52iY4p{x0eQzv#E-PmO>Ni`8N(}NZk2PkyQe(?YS`z2h2JYUe76w26mnFtUS6ns<# rX3nVE0adh0?FhFfkXo@T{}*5Yfoe997{4-&00000NkvXXu0mjf<5v8F diff --git a/web/studio/ASC.Web.Studio/skins/default/images/exclamation.svg b/web/studio/ASC.Web.Studio/skins/default/images/exclamation.svg new file mode 100644 index 000000000..f1f56888c --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/exclamation.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/jstree/throbber-dark-12.svg b/web/studio/ASC.Web.Studio/skins/default/images/jstree/throbber-dark-12.svg new file mode 100644 index 000000000..45d44804a --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/jstree/throbber-dark-12.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/images/lastadded_widget.png b/web/studio/ASC.Web.Studio/skins/default/images/lastadded_widget.png deleted file mode 100644 index 1170101693e1691d82460bb490c011dbde1886d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1589 zcmV-52Fm$~P)BK4&RQDG@iiI0b>h@wac!~+Nk z34v6Bgm^%FJR;GDs!?exmGTgTT1qV?G)dL3IK)Yt)QRIbj@Rqm+4;El@G!IS`h#`e z!bnH6Gk5l$bI<>O{^wp%Rc_>ExWU&A55QmZ=EeKK1BC2ua)^uopvDnfupQ`>DzGF1 zMG-s!Ty9oD0h>Q-ZsR9?IfCD0@IJAi9xWIh~ZwcPx#r`|TO=UA8f?BsZRr9P(<2YWNI;-*Q zZnaF{nDi9_Z`uFG5Om%cA#x6fZWUwx?w3cldxaWS!Sl;_!4NdhKzjypmVyZ&*!H{( zjDiZzfm#mPsPT;`X@w=z1x?QYB+G(|;;bTm>5rx1J=={JKs1M!E&>5GPD1I! zZIg7oetDXBX`y!jRskveE*ReXU~y&NintMI}YOg;-cz60~`!|*5!j%G`~ z?X%Fg1x9wjd(Y8~uqZ$B(y%uK&Ve!hQ-xxGmgd$aSU8@oCRxfb9@q{8cfpQtWyS6+ z9DW*heG`Uu!udC0%LDM~Z^P`nXt+q~2o+|$pwc@4waEx^<1w#tN6voD(&}_s$*%qf zre1_oe}<)5NJ3DB+4o@d0381V1U1-s049Eg2=o=GE=KZw8M^0t8*rdd6~6|pi_0y{ zb+uFr9Q`@ma{#`21fDzt`+ky*oqrulH8}sTEDMm`6+9z|@wVXwy`{MM>I0a;y&nZv zCbpVuYNyL=Pa|l|LDJ4v-4P&UrOvNX_-3Ls+WfjQa_0~Fzx&Sr&VV>jYo87ywKnP0 zcitRY^RO@tQG2EGsjTdBtDL6_VN3}8-q^5r6%+-K(kqto=fYV3mL{65cHv`aUd?9H zRn9d>OV>J&EL>^oq*eBdaJpQs^bWwc5rIY&`tO=Z6ZvVgJ_q$_NaN*IuGbIN*<42! z7DD|CaIYs!3{`x*!8mieY2R9E^DQwxt zY7(vuz$sk$0QvB*XcE?C@a|_CZD^;0vr23;1l9|}bv-8zS}}Ftw|@UEu=OD@1-N)* zgI=(B4$>5pDn(8c58eN>F!A0G)8y;G!)iGZc0>84 zvle}!R2za#_h(`y0)7di23$M}X?xuaNUy`Gh?IdcPy&j%m9uRzMWE2lK_Ja70@^?e nXs#MdRW + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-12.svg b/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-12.svg new file mode 100644 index 000000000..45d44804a --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-12.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-16.svg b/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-16.svg new file mode 100644 index 000000000..520cf5be1 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-16.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-24.svg b/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-24.svg new file mode 100644 index 000000000..bbf0e7b53 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-24.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-32.svg b/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-32.svg new file mode 100644 index 000000000..54fd23fe1 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-32.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-48.svg b/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-48.svg new file mode 100644 index 000000000..cd81f3323 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-48.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-64.svg b/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-64.svg new file mode 100644 index 000000000..f3320d07b --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/loader-dark-64.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/images/logo/about_dark.png b/web/studio/ASC.Web.Studio/skins/default/images/logo/about_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..44fa6598cbbdc5531e46a55bf8ed244b57436dec GIT binary patch literal 5999 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 literal 0 HcmV?d00001 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/logo/about_dark_general.png b/web/studio/ASC.Web.Studio/skins/default/images/logo/about_dark_general.png new file mode 100644 index 0000000000000000000000000000000000000000..6f6997b1dce742fa852086a62115f3a432c8206f GIT binary patch literal 3355 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 literal 0 HcmV?d00001 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/logo/light.png b/web/studio/ASC.Web.Studio/skins/default/images/logo/light.png new file mode 100644 index 0000000000000000000000000000000000000000..9e6c10fbd407d7f9d1d07bb1d8761c2449101c2c GIT binary patch literal 5426 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 literal 0 HcmV?d00001 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/mail.png b/web/studio/ASC.Web.Studio/skins/default/images/mail.png deleted file mode 100644 index ace0be0540166dffaa7028ed59eb7fc7cd8cc453..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1701 zcmV;W23q-vP)9ll;g;4AO!P2w^Dk9|}(Kfu)fD%8N=#Rz(Fc1@B08NN~7>v;$ zl@AidD2n>wBhiGYB$_~59^p|+Tj-RwFw^P0+v#*(ckW!zKJ?a^mO>#IK0L|EnS1X! zXRp2X+WVXlR8_^pY$6_V)8{^1x^xMOqF}nLtU4Q+z9CV7Q51C!vvGw%6qdzg7=<-i8oGSKwyg=6bq$hBeJUc2^+V^GfJD)psQg_plu)k&wv*t+2kL2 z0Q7qOT{o?*t^N1m?4NnxQrjDeQ9+C5%GPRO>+yOiXwh=4`ZfDj~3TW zL_IfRMQZvno7v=<=MCAC?;_}fBt;*_4Oeb45Ff<0tSO&TE^q?I7H^D)?0>RIJ(M- zPhBCzA!PRI2zRj2P1 z0_tSkCj;eX16M;v(7~(&uDZR*g#6f%ya<2glQCaPfiR;mAAqUx6~uo3ihDGB_G~zv zPBb?+!|(U=&8KQqypqWzWLZWwn?-M2hSQkE!S(@coLh`tiynb39zk8a51TeT$Jb;n zHV76g@eZ`p{rYvBKYt#> z!^8Z$)@UAipGYJS3WdVck_^3xNreoU0pnFtE#H-<)F;OuR_eE;q!XnG$?p|Z54K+12aZystNu(tuC0M_HJ^l*BaV9j18O%A? zO*b+@Ki=Q+3@QDVSWg^-aS1E5qVD$h0ll*pg=;sD10dtn(&;pMdV1h+IIv*B0{(8r ziWMA`*X!lQOA$o;>=s!8R+%QEhraI-`Wk=a3ZhH zlZR9p7cN}LYeR0Usj0!zrAv7sI_6EFJC=rBP|?rk3qwKdZCuF>YgyGZ9LJFk_taOi zZO&30x_o0iy@+m7d1YlK7h!Ir?-W<6gdsVLBc3=)Sk8z1J|qKPyjov_GFt(6faVd1 zAG*C*Q&u=0|4AWO>agMYxpVmfN-ZkK)QO4QN=VNHjNVarei}?5!$yasqP_1r?5d1+ zUwRhy0t>?7Fb6>b-cwtSD_2IC+NZb^QiY>}5{X1OVycRCy4~*ZA;a{I^8Rn%2xclt z1l)co!(r@yu>pED%fFLhI!|Z~9c&XXJ9z+D9v^44Z_q?TRV}w3Xcdq=Ck7}T32={J z#(a~A{(uiF%j~FROq@D(Do;z=O^b!>_?-Z3)Y6X@Xf;1KBkJqxHSI`LpI9$9>^pSM zWU-6MRO;~6XlU2&=4+{5MS@T|hvmF<$D>@h*ZZGv3l#w{jP)(zlGQ7#wl;l!`M{0~ z&i4*yJsCE|Uc!#of;_=JC;%FBy0QBofsyG{F8tuTY$C(XdCQDj)lR(orTcyv5OR!X z$9mpIrKP1PFE2-Rbv5eh>acU?&glVQ`9hD00000NkvXXu0mjfvTQIs diff --git a/web/studio/ASC.Web.Studio/skins/default/images/mail.svg b/web/studio/ASC.Web.Studio/skins/default/images/mail.svg new file mode 100644 index 000000000..32f03091c --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/mail.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/demo-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/demo-100.png index e6096c48d819e210b327d08fee9e25dd8e507c7f..278bdec1e6b53feb8365b76f8cf1b3cdefd6a8db 100644 GIT binary patch delta 3078 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 UOlA6#=l}o!07*qoM6N<$f+uLEt^fc4 literal 3552 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 O=dwXMAnut5B>fA&P%5SX diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/mailus-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/mailus-100.png index 5fa3fe54cc35ab4c550911a1ddc969387ba850d9..3c979749679f4444dd6e9e7cbcb81add08aaa1e4 100644 GIT binary patch delta 2745 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 literal 3648 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 L)*Vysc!={a6%btt diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/social-blog-40.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/social-blog-40.png index 0e4d4e6305f7ef882de340f56188af2460be4540..3fd0e5850081818d5ced16ca3e770de772960a6d 100644 GIT binary patch delta 1136 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 eZ!`J~0pNcc!^s5Pmb$S30000Px#1ZP1_ zK>z@;j|==^1poj7`bk7VRCoc+nY)hKKoo`#=30P6L`UT`v`ZxVI1L>|o*<#&Qn5Ti z*e3|7xHQmFriNzOHy}?Cr=qn)!=0Spu`NTqUSmeap9CJ;SbzTYpP4f=hY0zk*Xt># z)2SGZMnCdtkw01E1GGpaqVj$9cs%~%^Lew`oRbeC*Zg=i8fEwUeT!fEXcOZVl||1F zhr<(#RlPpsNg#x6x7%;rd?W#|(6LvcZwed^hb<0Ohpu<*Ef9W)9J~F+W*W0h%bbl0xknVQ7pX{7M0l*<&#N+W#)oN9{yeBz5z~Y{R5(khCV2IPb{{$ke zcz^;1h8SJyjI$7PZu=@p(unR$oBL$fJh23_IGM#gb5o}Kq9qcE_hx^zLd-J)@|;Zf z$IQ7px`T#$zv)KO=`<;dLb+UylF6igjbBFN@tCfKU4MKB7j*{>_ih$fsZ=PR&s*Y* z7m**<>$RSLb%7#MN~u($OeRC3;E1+xjA2zm0{R}pYDZO7J-n;cihPoVwiq`Q5`aCF z5H_35=vLUpqQw30fdsSJY)Ay?dNKZz$tSWbTh7@X#2_gY3VIuEBHVu9Ir;%1mdPjO za@p}Z#D5~)nDCN~e3Hc|7QN0BNminegAilR^X1}XGSL$>KuFCzh<-PnPObJ0Xg3K& zj&sU$7{$xwk_4biSj|#M;SBRf;%(#$g%lRJ2(^RETrzh28ifxP+VnKT`_ms3GEjxU zQ5Tp>rMe^#5pyvr4>($Tl77G6Wz{VT0Vs{sYJasV+SW|M6MTol(HB+IJzxnmc2Q4s zXN-D{YM!6X#n_K>?z!85!MiVuNshG{ULFNn`p|`NKIVS+;qtoUYK99rpZO420%tSk zC>}Z8b1lCGF|rZXMx*g+iO+RChzGgTVz{d$9t_I1n>gU91dPf9A3D6t`a%MLYe;KO z^+&)u(5l2_hCO>IEaz@81xA Y0UumNvB?|-#Q*>R07*qoM6N<$f=?ZYMgRZ+ literal 1685 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m^Cs(B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuU&_u!9QqR!T z%-qskN5Kfl*Eg`xH!{#Qu(UEYwlXkMfC43;ZAB?*RzWUqP`iLUTcwPWk^(Dz{qpj1 zy>er{{GxPyLrY6beFGzXBO_g)3fZE`@j@w*YQzUNJP7fB~jokyxN_sAmB35=^15FMg%Dxp39RB|)hO_hL1;IHa;5 zRX-@TIKQ+g85nVC${?!>telHd6HD@oLh|!-V4)b0kzbNuoRMFk;OqX$Y%oHm_BU581ClgC^6ITO6LswHrBUdLUHxmO> zXERGfb4OE{UYGpj(%jU%5}4i;gkDFSdO-;yw*Y9fOKMSOS!#+~QGTuh*yC22Slr_3 zXl7#MVr*h=;^KzgEfBpaxZPrb(=GZy$LNEi7b&`7LclZxV!{(IkONQtsd>OOUj$6t zrY7O@fq916)5S5Q;?|i+@BAP~5xM*fPc0TDy^I{yB^Q=)n|ahb?9R*T={$DaOZ?jN zsNTZG(%+?yN`%{mtEn98-B_4CkyqOL(uM;;93D)r%-cO5|GZVqDRS#vt;752HJo>L z7N0XOPU9HBhlbANAa9c@)6HRoR0$Y{(HwLr*(Kf5-OazW9jvY&d+}*ADMl` z`^d-Id&NTig33oW|Iu-;@vd?Evo>8VMX z>EMD7zyI3aR@h+sG~w`!10qf~S&s$!ofhn#FXy#%(#&^x?Gxi}=7c@@{PUU=Py6Au z+p6~7+xTqN)m1AQogTEk`55i|J3m`N;Du0!O@^SEz@t*>^#@BiVm59(AjrFNx^(?5k2$AiMX6``JlB@ytXZqO`&;~^ z_L!?Ly>9ioCGR%46reZ#Y}aq+nhUE}IUip8ZIVBmg{8U>r*`^#zU-HgJ07o7sq0u+ z>seEN;VhHe1PhkJ50%l+UNKw0VETBP;b?8z{8c>;59B|7X*k3ypMGQc1W}HhuDPoX zd)C}xPux&Bu{P)3*GXr1waw0%d~9_+8Iu})*+|m)qG43XFX1EVNzd8h^{?%C&vJWG zSJypd`%Tt*hu#+-v_GEuT1EWUEm@Db_s@PPd^g+Rhxw6uMmC1G<$FrQs+ZpaRTQ4C KelF{r5}E)^Je9%# diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/social-inst-40.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/social-inst-40.png index 2c57d7c839161c4cd14777254f024711d5c75904..db9752f7e944e21dac9b2868c0d85e56bee5ad8b 100644 GIT binary patch delta 1116 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 f{-MWzL;O1cePx#1ZP1_ zK>z@;j|==^1poj8$Vo&&RCoc+nY~WqKoG|#PJk33!G|-$QA&`*ZETG7DZvK0*<$nan-ZdfNCpnJoUHPAx z+1cGmghH~ty`8Mr>(kL_^b223^O0yAz=}j7COb(6)KvYn&^LRhI(+TgEi)B#xNzO2wdfqQ#z5mFYzM>jK-2j*imI%#1h} zi$%)k^K^Q8N-r-j;@V|+3=Iv@?Ch)%0D+cedA6IMpBJK9vG3j7+|c0QAl={J zQvmUWg@1)343Z=%0HLr@GMN-Fasw;jc{?ByA#!~n7O;Vb6f?t z;V?~891jlodFDplamuM!@L2LSJvZV zHGjkV(=DF&HvC#+1R{@(jg5(!10o?7U`d4q1lmBhS6;vT`76Rk(c-Fm&Z3l!P z*uw<8DyTf*ED|+Vt{jkC^g%#r#4d|CGYL;&8B)xN?}TYv4>$rFyQod-F^zhSXR5|FSf_BXH}=%1YZ!o9}uM9XV)I{MDq+gF(6OCk{xJfKhqiQ-)`o@6-WcHKaAK zdSEL`MRb=?RQ7dJ!@`t`SxZJ3g%Rim8-6}v(?7+BPX7fve?zd9AmW@w9btrq{TCbJ YAGc-5VU6kmRR91007*qoM6N<$g8z%^LjV8( literal 1810 zcmaJ?X;2eq7>-mBxdg-$smp>0D%l(aOiV;_aA^=BXi&l!k`-2xY{)K>Kt=>a<JWE~X943TTxI6~@wXz+qk%u{Rz=ATaEL$8*4c zk`fC;0UoM>0S4LIQ%0eB0X|GJmErBf^jQSZ2pgg-hG-N|3X{d4vnVuR2AASfv*iJU|yqncQV%49Mj3Js#sJP8j^OsB%7T2B?`GRnY*F_{KY z;|Qt(jEvG4G!f^3M5h0gpj401s<4qZ5eQf8Rg88qG!Dg4EDluzJl=5E0C%BOhNz5( z9>XZ1kQJoDaH&cL2k|)|!9zw6Ig3hT(79YMzK@rHLZu2Ael!7>>+eNj@VuE+A3w$@ zmXFF3m9PpQ#mc{81><6kf>5f7$b49XY=Y(f8dM1k7tTV)&xJcK-w0MdelEOmu@I3A zWE}6m#yxsOXvnx76E9(m$sbk`n%5BG-fMU2Bynf91o8bu+LpRVNnoDTVd<`_YYsOm zdSl6^3EwyEtap6-x{#M^p1rxG3+#Sd?OR=ZuqP*qzh-aZG|OWbFWK7t@&|VobEdn; z!E^j3i$b9Az0NIO**b8zp{hG=lDu``a=WhK(~E&i?c!-xX1`8cbSt`OZYM8!kIJxW z^N?dzb}mrsd~*-|mZaGEbnoZs25ZB-qJZ`qm%vGVu6>KXe3<&l?2}a$_-?DkA$Ed; z?&h*6XRTI|->#Xy{3X*c#gJHJZDZruAixg$?pS8=1v8`+S!Pcuc<=PIEZFoh=nHIr z)l03b*cf5jxbepBj8K-c<~=O5wfgF*829OM;f$Kh~Z_9vI`o|VbTXl{<&f8@v-M!QQ|p?w;L zVPCYxB_$!25;uJ(UcEo%Y##TS>nuC-iMXI6b6;6ajVJX9-{j44XSdP=*9Qly4gJYE z53f9Y=%7$2_S^3ZKAwO1!Lz7C`BqIWE$LZVlf}`|(=BuPV54)8{mi^wr;3a3duKmP z!9y+WT+(tHR~a}Kh$)a@O70xnbD;mwCol? zrE7?q(jIfjrmHk6(DAkGb}i0JU=^;t-N<8qyS=j$c~??zf)xC$S<=Rs@u(V*@%sv% zb`Py|&kA<6zl}7IijWK0DRj@McQbyZKxXa{<#{taBYX6bem-4m4h#u5x#@QN6)~YL z@M?x$FqKmoIl%;tU9!MuMtG^K*gpZs_9J9 X{4BFH*<-ET_?HS2gz!ta>(l=RZ|KNk diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/social-vk-40.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/social-vk-40.png index b4ff61d61dbbd340a59c7f779ece666686c120b4..8351a0033d61d171a1e54461e52a4f357b502cf9 100644 GIT binary patch delta 1067 zcmV+`1l0S%4!{VIB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj8)k#D_RCoc+nZHllKorMcoB|m@qGAFG$t*}9A*f()vM|9=n3&ou z{FnlNLBrOq>BNsEY;1IZ1s2Q#6A~30OPvK+P$RMMo4)VWXMg!u?6Vt^e5Axa-zEO$ zy?5`BVn=U)VsA95cA5szsVGj=vU-@*I>HrJfQWY90aC39Bz^*D%e2YZ^ z_e11X*q~5>8-E)c->FVk3!${Iu&`3AGf*I0`uOmM@NTf-{0R;rBWfoFkIi$+uKWheSNNLx3{-+ad8oN zU-oE$55*LACD!B!WOjB|2yn8yyGvJBSK=JvXJ%$>ff8OKUG2HKIoA)B0=KufsTRBx z=HTKig@15*T~ut9JEL^y%F@RGo- zPMqz|&Q2O1ANPGPJW$KM5`><{Z#qSAe0=P?=Cq>Mz20#_uJy)f5WGf@!o_;jKm@&v zISDK{GBP60IVHIIq+s;Jy-EX4phZf|cdQY6A*XJ;pHoT^C9Fcpm-BabL1xG6-2 z<$p0u1Uasj$XqT*5dzO*ThJ*IxeQAcgklmo`=lr-GGXi*V!Op#?LSoi$IAc3|8k@TgHkgjmWZyy^`?yS)`ab@r^L0^?)tV zdWu@5CS%oWOxbp=#dscVrmJypZ!sybHh;t0^@f%{gb>ch^Yil`yw?MFGhE2|#D_!) zJPB+J1I44DzR>d9`uci_e_4Uv5V&=5aj|BJFLXbM4|34v`P8KPgGsp(CJrc-fKhqi zLy@1dK2sfl)sWVL>VaNj7113+QQ6li9#t%|V^K$#p-KOS_zOx=$EGXF74-lB002ovPDHLkV1lRn|L6b! literal 1857 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 M07*qoM6N<$f}VENWdHyG literal 1996 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m^Cs(B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuU&_u!9QqR!T z%-qskN5Kfl*Eg`xH!{#Qu(UEYwlXkMfC43;ZAB?*RzWUqP`iLUTcwPWk^(Dz{qpj1 zy>er{{GxPyLrY6beFGzXBO_g)3fZE`@j@w*YQzUNJP7fB~jokyxN_sAmB35=^15FMg%Dxp39RB|)hO_hL1;IHa;5 zRX-@TIKQ+g85nVC${?!>telHd6HD@oLh|!-V4)b0kzbNuoRMFk;OqX$Y%oHmlH%m7I7Z(F_6ITO6LswHrBUdLUHxmO> zXERGfb4OE{UYGpj(%jU%5}4i;gkD3OdO-;yw*Y9fOKMSOS!#+~QGTuh*yC22INjpx ziqkx(-V~f}adyM0S0CsYeNglwMK??cn1(=1c;W?e;K@HV518hQfQh?{siJ~`fyK(x z#WAGf)|p6epI}Fky#g96(F%XKLp)lTI9nK0S;D69N(UwTnAC;s64;-e+#`K=$90Wk zJ3j56G(m!yd-wKI$CO4^PL^%~EygaktfW2ZGp5^&-*DH? zyVvjF^I!RybeiN+`4^wJ$|$>sCNO^1EuLZ2pJ*A@7}!`bJN%5Il?Bg9!{Q!}ngd@h z96YRi+)qoO`X@Q{Q2|A$BGp@cFdULr@r&$wo zzkM@{)DbJPkO>J6cDA;*ekszyP;VahAn=*%)VOEQpRZiArsqwWb*qzNR(7^<*xT2y zg})cB1q#NA7CL5iaqT&CCiG=uS=qE#uU@sNGB+}mmX==p^2Oxp_3PY@0{u%D#EMST zHsx%5P#*WlI+?-@4WGp@6EY>XuELl$h*S=IK}beeq(&h8>PKrUcb-%$Yg!=Hs1n=gzIZ^9w=M>)ToP&-j{j;Q8mk>S}9WKff+*0Uowi=Y+k7 z9(8wjAG&S0x3{-f>u!DH0e{1#iBStGjgBb3`SRt} zMm;+?$3OMxd;t#8j{J@DB;;3oJ>*eeU;o8;&QXSWna|BPnx2$>)}P|<>*MpLGk?|X zJ6Enu5lnAvyIr+BdPkwJ*agn+r5`_jT+$emy?kkmT7mMlfRELN=e&NMy>cu~SGryO z%=DFhVjtL&+b7s2pLy-pXQ#AjSABiMqkAU}mEHWe*BSO3yYo579J5e79%3c`N4Njj zhqQ$}9M1F8pGxcxJE`1p z@oj0YU#G}llx2UoJ>{Ui!s)Q(K4xp8eD!a$rC5D$^!dm8F}#71L7Xo)Snu0YH&FfR M>FVdQ&MBb@0MvmYT>t<8 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tech-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tech-100.png index 8341dc128892c723a1a311ba954b693a9da3ff74..1b94a7462284dfd6d7a55e9564dc804b65919692 100644 GIT binary patch delta 3571 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 G$NdNB3-EdX diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-comfort-3rdparty-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-comfort-3rdparty-100.png index 6e11b51cb525247a723fbd6815544ea5dd807626..9a353c770e97f69756d1c249ab59b46150f2040c 100644 GIT binary patch literal 5005 zcmV;86LRc{P)4sAl?b?qijkfrrNo7B*HJrg8DLM%(ddhR{>|8vi|d+xsP z?!D5L<8S89eZS6k{`cLp09W8EFj$0$^qmdO&eXRA7~5n3k1${%03H%M86<#161Tr( zq#%Csp@t+ZA}lIGh=|l&eFx{P#Uh{xkgV8j%II7y#4H*@w)MW#h9pEwB|--WNOItv z-`~>^1D|725VGy-Z+8GEGAaaP(G!2TsuO$+-xJ~*845lp#n*&<{J=;H53)XR8Jxqu z|Ju8{3w($G_!PGu7zrCe){(h=b3-+JW7pNtdh^n}=Ps)Wi2cvsw-Qz_3uf(SjCGKM z06s(&_!Pllpo0Mqt97%Hm%yiPTq4#ttgM2&uB(In|2YPUky-0JBJAf?@8!8^&U*j81g6{nwzO>$Au{P48BxZBpp>jc2=!tHgYCjeq##0{rV;NBod?u z%f$Kd6!ZJ!Q*t>@xtqq zLORka%LGOG;4}DAWo`TV`62A`O}X}MxVj4V|MvUfcycCZBNLX@Frm8cYOJ#nmI-|M zc=*<3sM2c0F^}W+A@r!8_|8S)VSPMY zThPnm0d^RC24C6`$}`Q)E;(Ds=u)ogQy*G_swnp>kiDR(5av>Rz26E~zEoKvoxzRn zV#nnpVV+eyk!cC?QQvO_42Iwj9N2XXd`DnyD_zH|0B*dOz8P;~92=RMux+ z{6#_Opb8?Db@gpG-+XfmKF3*_!vbPKR2C8u4hDl%=LlgceBZ#pKs?uRAL|)zXDsmL zV%JmdE*bw9(ETk219)q$a;_w!1D`38N~QKC5{V?tGv=KTd}*q2vw=$AzJ7Ve8zUFnQ+d#1_uY{wYoTOglJL$*!xFll zJa>~lCq$~K7Q--hVK1vFGN!^+FaS{`_QBH5V8UA?2ceQe)GfE%LQ--F7h_(lFi#25 z$Z%EUi5Mzk@nB#FFf8+0*gpkXT34t`e(8$QhF>n#CM(Q%+RyO0ZBSV4SjouL#ThI%OfQxWVWl8;dbUuCdg$8+FNDRI6 zX1CtiH3=ayP>j2ORmdQ``s%9*if>fF>jqqr5NX827&x_phd?Q8k}t15f}ntJ6z`o> z>onmysg#SfjPp^oT^=Kjb+hA8f)tblc~_~=yX`DPp0_9bP8x1n@X|qDFe&4v~JER%{x3kXI^W|7Mdk7w%A2I z9V!5&f=EMPTf{0Qx?(~o-$P>SR*%EpMo~DWIC2)Jw%>?k7+estyqdA)!5}m&t(V(S z;tgC7bMqLSIHq@LySc8mARh9koQal-`OuW<@rH($)CBO(?1{ za1YUg2M@+E=LMOQfWfs1(v8mLGN?Hbp$H(7


    _9N&E15>C$#E&$s=bfQYVu8Ig@ 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 X4}u6J|LqTt00000NkvXXu0mjfS80f( literal 4081 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 bc91COzeB)8p>Ik5qCCJr$3(kY(<$aZQnbCp diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-comfort-answers-100 .png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-comfort-answers-100 .png index d853fb821dc2a2c37229c5c4d0f82bca2e6cff73..73f88d0face5e6c0b48a116b42f8f43575d7ad4c 100644 GIT binary patch literal 5036 zcmV;d6I1MoP)gMZizV4EbYnqyxoP1o(a8n#0W(i>u?1_nqv$#QX_!N!r zB2MkwY~fvC&egYiV!p? zOTkKRxO_gX=6xmaomEv;P6`v5nVEJbCWp6K{9NLFA*6@NaZwB*CJ137Y~14u&|pkR z2^mB}AdDS5HiO9k>3O_u_jE(@0!P-{~>>VNk|066%&<}oQ*(I%yn-bGd=c|CjfJg{NI2J6h3Gbt%4NnD3odj0j+>794pA?`_( zo}P{`PksCLC3ZLIv(G-Gx8HtS+zVn93>!9#rcImHl~q{|KbLB2Ybz;+aplStXKHHd zP5zB#X=!Pf`TPEjqJ&lw!er#IZKx7x6TOL z@#Dv-p`n5B46S4-&)~g-C8dyJ9Eu9#!|l=fzMcHPK(AiCK6&e{x4P<)!DP|6apQWhOi;ir%zY!!#(U2!06k1_wHTEJ<&xm4F272?wotsrWCWp zSfe4?3EC638OPXOSp99ljvYH_@ZiBTa^%QX58!x#Dk>`I&Ye3gu0x9I>gt63&;rk1 zw{9H*vohI@j%mP#uv?tPhYO*~DZ)?*89jRRLhijbcv4zGI$#^n!2W=Gs;Q}=Ns}hg z(W6IOy*_2i6hS6zj~1{ma28n73MdYsA*C2WB}EV_AuN^!FTVIdGPm!74mK*LEmCB9Y^Tkjc;j@4!AV!Ivftl%adX$I0tXM@rKwVF3}o#4!C?2KB`%_ z=SDLb2(OF3djX`xr~$P$2>}o@fDDiVqumxj#+z@xN#npS z0HCs5@Q8u|QUc?=ckf=&>p7zD9QBrqy*?u5xd)9LxbjIQ*RX!m(9*Gp{fEodebh5`)E(f>{3KNMaSVBn+ z>vd}=qk(V$=FFKR$Ux&O#vUFO)EU$oJSSZ=6QFaHYF1yKCL`?7JptqKMj3ZuL-=9k9Q>_>tq28Zd`Jkkc0rF2t-VNjfDO<; zh`u>zQSbSDpG3y@M`&z@e81Pnd#@yQK3|7b(8$IeIWB9swE-eh2g8WQ{j;(PaQ%Z1 zJ`jc-`?m1XOE1yJjT?nW)dEU`YV8Lk!z&x?yWbLZVKvpguXGQ#&fTQ<-n=Fob#Yx* zUEb#BbeMdoaB@55P?!*efMIU*5~RwtKx!Q%JUj0>I(yYkqKN2-EDNSCVBn5oWu>X<2%n_LYnM{dP zNoA3!e4~y8YZ(k)g`EOY-Cp+L9o+k8aS&%ibPnVF_0@k+_H!@Lyp7FC#6JDf=!>+CQQz-F&V>XKV5P&0FkK`S4u*vmf#J!MC#%_oTb0tiXW0)X*aN;PZO{

    @O_Tr3cX`TiFG^+Uy7@ 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 As{jB1 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-comfort-training-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-comfort-training-100.png index 58967a0aa75493f2f48067592432680568749b4f..cbeabdb85a2ca85848796aa5fe47bc7fdf592854 100644 GIT binary patch literal 5533 zcmV;O6=Ld%P)_=7m4eY zy$cDoCZfy3Tgon=yGm&$w^Z(GLI4qq@Ro%{a3K(oN0RA#e&2M@^vv{Rx+g=D3-hBo z{qE`S{J!s;^PTT}jYLs`!{KmRt=1B3@{&w37=cTc<#%`P+*z$2uu&8+Y0{*UjEs!Z zl9Ce2%*>>uq$G-=bF{X$Qf+Omv$C?%$-B2ODP=e=Q5V5v6fhZ86%`efo}NxIm_t)j z6BQK|QFC*1UR__>8bzt8sp9;hLx&6Fuq>`Rv}rL?p(zw-wV z9u(w^966Hs8d|hy5xw``d!hwh^M1-zUM`bH*t{W2%33+()?6P*kQ{JMkH9{3&0)A> zsFLy6V~^Q+2|ABf@zhgK(fjYePyPG%_dB<4-8$O7eLKZEkD-y1lSB3O^^#$u-WeGH zgbv$*bs%uhj2SaTj}#$;7(&AkA&6DYnl&pV8J~XoDec|6SG0f~J9g0S-MfRX!M(TL zb{lQjuz_L-jj)73RdINv6!t(5P*rFZAOjto^73*K3c&F|!0v3^xG~mBIzd=M*rRfC z>j*O70EAv#TuciWF7(<4gaMW>UoMUZl7eSUm@t91ZQDjM=p!s42p;C<<^~=A>Z`AW zO@JYvKYza8IrKr$8gLHRX@O^PsF`BWM_9L)qmXuO>wtZLiaLGzG_75`Rt<~=0i@s@ zS_(*k4Z(A`?;?n6+s9Oz=#FJfDEWVwO4Nj z(pS|)wN*q@3P_&zI9;y@+YjOJhYb7RbUMX?a7ZKo3G3Idr^d!c_}ldDx8It&UwWNG z{B0x_`PEv#bK1~NZvf=AWy=;*_o)4luotq+d*tNFlXA4MfB$}&)tT&eyUi_Myd%pm zOqJcAy<`5~zkmf5AM!S$vUaf$?a}ICGr6JzX&O#eRlHp92BLV`AaDzE`C>wEw&!0apbB9p4xhGDX=$dN?xA(>C z-|dYkb1^$RyA+9C@Rrb7gd3}dP*79ZO%|O$1QF-Wn`fw3f1^X~7)G2*3P$tu^M&xy z`_=+Y7M>IcG20`*QK1sjrDSW2d#F%#IEHW4)({J`n}=aSFx`O1My7Gk-NEY05qLh7 zD+}h;)S%I$M|UY6b|WAxA?m!3q&Uer`!*|O4Y9~$Qmj(`)=Ojrb&vF=re9j<#_f*<3vM0V z;`4VCbbIO`W6A9{N3kQG$xy^7`!CNq;>6gwUd_ZY3`mt^$NLTjWCDWZ;t2^w z{^18i@Lb;o)Aw(e{7(Peika6q^dg21#;j43Q2PDIJR5+e-^3`t*xtrS!ivr zPiiy))9-ro09l}y<;)x?k(UHd_P9cX4jCGuR!mI{$Rby!14zNw>fNv1FU*XieD1px zu6S9*#LP}A1qp}}V05x^_fDFBi;ZRvuuy9o4+E^Ir3)7>h!|UMgjcw1KOAER$2F|K zFHw8mM}VXVxHI(??S0c>io=#*Syo4Y=l{rx3bOj1nD>zBhR03VuP{zBneT^IJcTVyhbE3xc;(sp8 zbG19lsm0TDuxv_yEJsg-UySg?%7 zb8cGjg6zpbZ~)ZX3M^i~xlFKnCH*DgF4FGNQ| z3aXLnt#025S@|PrTM`lJdsCkK^J{tuutHmX5p~LoxQT{M#$i%A9!FYe-Rg zkJ^${^&n~Ig!?@ ESt@aL4Rp^+1PBZwytHB#;74fM{QI_h)2nKJuZMQch=w215d z9>lAYm(dd3ymm7IZaQo2PvfWDM>&Q0^uWkWO6>QSm0S@(2<(PM(jI^cYHfpIRyrVF z`=LnHb4NOT_lspPHDU{d9y$+Ii}v*bhX?@N`NU znjutC!Nlxduad&SO9)r`~T(u-yCL z0vcqXg6!pIFvOo=l_e`=cIW#-&WQ&UqZAt8aTT)9F& z{qz%k_uY52aQAVV+V27tjf`j2<7`d((f?kdiplXl z+rl_-&MiOJa77w6E{pEH_g?Wbp@5e}e%6tlU(?Eo3EXNdw6&?7-adVku7Qh0C^z4H zv-sXhpiqt?hm7;>E01-_G8);K{DYcwxE~~4n zE5&g?hde7Q>n&z#G1M0s!2S2%Pj}pLhwh8$y(k3q$tRysv;ZQE3MFtha90qGafE_=qDG=dKsbSb5J!(5ZRh7KBa={s zQo};gB?G{ehaZ3ZQTKO2qTB7>jOUO^bXU1e6M`{!sEJVc=%bHl@#4jzS%3cd=epP6 zetyogW(Cuem7%-JZHf@KF>|>|+6N9CsCyoQxa+RFMDPxY4-kr;?jAaHD4I2LzZ_%& zJyjXHv)rZ#!I+7jenid0q#V25?w5d#M1@nQP6yn8s}Cm`L{C8GC#`T&k96nriU@Au$?4|=}~X|^&@HVxSjhIe=go8KUc*F3_C`|6bg1Lss203x!1cZE!OrWPK1JIM@4hbaEVSZsWfVqcw zp3&dF^Ugb~old8?k88e|zi1X)wrugvdF0=I%jj=+XSq$;5Z1f@36`Ug>WO?SexA$d z^{irCsGXQs66u^p)KuI*X3QAu8txo+XSq!gf*vNnl&h=XO~n2DoN9jFQKR?tWM$~i za!1lr{|7uc(g`x^XPP*KP-f=7o~#T&PnFvcSO+fS<}aK5Y!j}B{>HRwiU2t|IS$y7 zNIw^){yySi6ajjw+=hUMn|V3)J6Tyjh-I)?exIGjU*Rh0&u`gJ#K({ZV zeocbiU4-2+?qJx}4To!0?x@{V0GTS0{g-jU#BtIxgsxDMcwwTbot^1 z-P(zuUQY&e7l9&CSg% zot2wIG}RA1^pG7vN^WVy#CWd(Ar~)R3|a0oXU>QZM*}G-DPp_^gmRG6aqQT!WrGI~ z4k~x2gg`CuK+b=UyT>_q>B-5Gm-{{>L9aqTjr>%8x(*&lx!( ziyY2bboNw})7EiyE(_>Wt$iM#S+mn*C^;kPyXrquqX+5x$ z9=3~F!SY~!b!Vzg${%5)1dHT2*hfM zA_e9C;DZn7rI%jvBM`uI5OK!HB}bi|Y-9Y&ZS8~%BozEG=c!`*oTbIOM5utURZ>z0 zB#Gdi%jKfC*Q}+d-l*s_y%YC3oHOBGq#gOL0WbG1zuaY2D9#M)+=}Uml$&aW5Ir}^ zzQvhgqw;Ov1d#%veE9Fbr+>XWL1qFa&m<$9k)#CP%^GB-S$uEPCE0m(V47DbYPp|y z;tBhcPd=$jgbD~-C1t>X0p4@v62^_fDNU6`N`M_U-eQJ0u}E$+h#ZhYYvd z$K>QvIH;uj{L;$^D1Cy_GxSbX`&0n;mR@61#y5&+X1T0~8K7w$32J$(3Z zJBR$kzPC!siWMsm@1iwp*3k3MKTmu=837Fb_uqdn%8mU_RTjVCe;wbycb-I2vNl6K z6hKPG$T764>_z(9<)uO;8Nv4VE9tX!6-U_<`Ww_zwKCWTNOrUgQs-BrmXlvrrAT{C zij!n#noTO(_&G^^lBn|SH>rH0MD~6b-|QWA?uweD>`j@KBxKF=;uQ+Y&2IEOBn(2m zgab&q_10VIwbxz~M%>6f0Ors0;w`u5<-!1}gPE_Hxv0oKW0A3`U}}D?5opNB(|R4s z=b;*kZjZMYj*asrf9tgrg_wHwq>BD@g;r)Ih$+$ftxEkUg6CM}p*E^GbXD*7MY(zG z#s27{kCG96SaJ+Y3O2uqU!4 zdx3k=OY!^=zuN-6-f%|#m8-d9>^(QxB;jHC*#dRqkmuuS36h_^k^H9MDchK3wS3PN z+Sb(JQpjlTtlWM3_LX={+`+sif)t~zKnt{<&6_uaj24b2ge-R?xxI)Vm9k1&JT7;d z=pY)gFNb&6)7~8}(TQZ0R&BPYu6&yI*}~Cr$+L&sC?k>lr%M2`@}(l}$JTuFT&T6p zEpIs9A#FU~-qPAZrh<)XxtWZ`FyeW6d4_BSj5ZP^zWCw`kP^1s5yyBGb>c)8Ad}-z z=VSEI*p9QOPSTm?CUxG1i?6M1Z*PAq(mW@X z^t7#zc{}-Nf2(f-Ls|&ud0LduiWs#Koi<%63|V1PUTm5EEC!4Ta@c8l)@&iBy2@+R8guujMn!bd!Nm2vYo}cBkYpix*>F1=QU-x$_0HMBvkIcwtd!mjM({ zr}{y=&83~5Q}4_rx@kqhp!n&c0-$3?O*SqUen-Vnd$7bB9hLy>+|KSB;&UG-tuQ2 z!VTw^Z*HDsiAiPl*Nkj$16ai?gKhC8P5ew1Uc>O~pCe>W@tq zTWtSGh=3?ZSV81eA(%{;3{g2TA6V1%W`nE#?7T;=4Os1W!C*Ufy8A(zj_9YE3=d)B zO}kwc>@w$SYRD_^kfiWJSVqEf>aV`UA=8LlX`;K!9m7G_pKKbEUdB(X(nRU&IrNJ4 z@3yMeNvP7Ks7w7-o}gO46W4!7SQ<*n)GXH|l$v!{Z?iwLjA7kBaC&8J_cBwAiT8Ch zQ9f!GO;HY_(hOem{dmmZ2?ZHHzu~a+OZM20%ABL*pf610s#oc5<>XnCbe4M5oN`TR z077y{U8z{!Vc7A4|9rHfl~B;!wLk7I`cc|xxZ=m8Y9iq-5rs z8r_#2uR(%Wh%d)20{QJ!7+ow+Hn z{Ln{`cJl}G(W9X1+s4w3HCPtH9y+B-Ef0tGa_Ek|oZXavsDJPh3(RmnQ?^9>Kq;J} z?7MbP4b+)@r~m%Dc&%Arh&<_hu?vyUCab^v_Q071t>t8K7k^yabN^U0M5kt&cL?THi7v2kO5JQ0UMXf zdWhq@QS4#Cg1#Wy3BH1(2XPxT!s2C0p^k~JO=hzKIkdPVBoe*oVTjP|?H!m)&B*V; zZ!4_y43>Hb6&;U{y!@bQ(H|aZjL$v5s<=#UweIw^mkfbt8a5$(s?R$znF!&@i*nic zJ=^a`q(LhL-Tbo9lp=^;nA+T~6{i>s@?-VrjeY%r|Di?Hkb+$3RsTC@cS7k9T+p)+ zb9#W~qI$DA6UC*wmbmxq9e{poI~Rp-zJizanI!EyMq2;`qRWNf>XzOTxAqYwb)d-) z`)LN7fukq0nus60EPNl?FalRk<)E3A_`tW!_cA#lE{l&Lf8wmQ#D70l{H-EG-MZ1j z7uuc1ey=KQ9jes52cS7k>lhNte<+T(Fre(6zI) z#)ANlOuCemF_6=u6o9Q(*gfq{KeAD_%49KEEhMsQW#>pw!tLp`icp8{go7D9XDsoT zSBNINL(~;_kp+izpxXJbpjL8{@rpBi@7iy@%6P2M!L$3oDDM zyhC!3sz87_9L+SS!f0Uq3TCzp?RnV+>|A!ub~{+>XdK#TCS34=IdjbmhzU?g=W=W) zS)nAD&wDGf@p~^{hK!ORzE5G+G|1RJUxV)O0abSfuGHRgZ5vhC{)(l#Kr`Oa^2H2+ zpAKUZ&BFj(Q47x1X3ytc_l&v_LJpkVYy_`!&jIXIWwDyTx4^MsS_D$zvu#4g;is*N z6qZnxqlNcGl*Z+0A%MPRzm634>zNRKw2oCkyJ9r9`fQBhzyzG4^YQdhvShaOUvuah zp+e{5{6@4T=*G}t`|6mi&PN^*b2hz}c%I*=N{%gGTnhCwK2LPQC5r`OEOa}Z@uI-oXEgo|>5)Dt z#Va6od4=3l9zNNWT=Wyi$=D7uS8{;ueJfgQ64MC|UsZ8aFxURM<@jFIQ0M-*bApEJ zR`nQFu9OqmEn-*qPq=50A%m}W%h}s!s`6Z3mlj`=r*`s#mjBKAT3Ecc%%-tr;N}|W zqofNAxnT8H`?`)>kyX*SJhpgP-7q~JkuA$TOK zKd!`0+K_J08%dg31djUZQR7Jn%b-DU07$Dw81-=ZyHQe6qN=2?cxK6z*F+ox&7Vql zZiT%&E{&=xbDZCQXa#j7G=#;$1DR$kmWZyI=|52u*aZiq#}=G_IZEocw7cl-#7(*8 zI$+_%(WEc4t@4uq#>qa<2mY4sLL7lq@wFN*8+zxkw8}Xn$Bd^>g0*j^D&Bk>M%{b) zC%bl==u>n5Ypg0Pv~4NY=IBddy+{DQ&ojlyOKr5BMC#djg9`a}KLJx(7xGQPN6U`y zi#s$Y#%RPK>01zt^qfXxD-+dPb+Jf#3E?f%9<{vk@ZhSQ;l-!PN?*8-m=+ZY#DPE` zq;@OFlJI4Xw*JwXyxkpM=1QP+3%HUYBSB$v-dSmAk zHr+LtsltccmA;kDRh)y1olh|GpyOa)A-1^+}SOYv~`b?k+UdoEB1Q&Bon~IbeThmP*=^OLhKgklzL1$+a{B5(gT3DEum*Dz5&5eJ(HCwl_ zT!l*+(6@2w^y(~vkw(`k=>NE7yrczcE^~j0$n^5(bba#rDWW4w8FbAbklF6$Nv3vg)_g+EAhzA*SaYswhC?*j3x7)@W|=fkJK8onWvM$ i);DS?37wN%yAfjT?olx|14-Ann8HXOtXHE0i~J9?B#v|d diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-customize-3rdparty-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-customize-3rdparty-100.png index d4bec7f0356331985a75f7d5426615f6a6532fff..44cdcb6304c60a65dc9c9212711d6da763f65233 100644 GIT binary patch literal 6495 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 z zvId>R>lFL&Y*E1l`Lrw}Va%Eaj7G zkP$fh>#CIY1ZRbD&@$tFKKlC?0s%YPMD?In)ZWfloYhImmjoo|28p2)r!@unFR9w8 zpK9wtE=J(H%``mvK~PxngYPio*=lcO8v)nNM7QZ}V!%mshRINBW9ANv!KyTOR{s6U zvibBDwH~WgjOBROmdj=ZH*x7lyG)nIjz`*W+6fd4W zYs9aQ!=N|VbB3-338ihyYcy_8J$kGch|4OR_|Hzhtm3beMOnhWtRsiW@Uxs_olAet zePG_3ntuO{`DyUCK=Up!6qL_iSYmgpNLF%lT~NA4aUKgo_P`BeydbRcu6)50*++mc zVW0tEj{s@>V#-m&6367q#MA~=cm87LCIyYYMxqr z7_Jdb=BA&YANa7rJnWX_r$l-*`QY98S%F6y4B1X=KwpS`O1wapNSk;ox)M8HEZq+@ z4kH4R%Sw>jU2 zku|J=fBDvHKy=wBSe|*?gD{?*kT0Z9zNq>`K_S$PXE@vd?ych!DpoI$&EVTDN^E7H zXyrMyflvje%|E*~BMx?l_YVcqrp>E5WmDhbB0h$%Nj4)UNaT35$(p@lo3^z8cJ9Q8=nd2)l`BNh=kD2DDSjg~8WGRIF!q6wxxAf8 zyBmA+qN`;pFF;gr2DqJ2mPY8`Rq`yX9oc?r(O-Ywx3(JBUiSS21&cnSbj>(B7Z2+* zh^o{Z-Rk%l|F_3?0wM}Ce)GRfX!%dR*#FtIrhQNG%ddiNCLQG+>8C?KO1`8i(``9g|`zEU(mQ;~t%4W4DofEpp$xgIVFHUyfs8-7r+y zHv(i@J=B}Fq70Ihv3Al5CrubzVUG;y_@gVT*bFMzKRgtw?vZ2s->RC6YU!fDFQsge zdamK!Sr^*TuEpgHzFX>&a)L8qx8yIpgouB|0Rm_5O=r)&xU#%m04R5!Z1~JY#C7@g z?i3{*<5<1Khay=%!}I9G{x6CnY34TyR==MLfEwF)VW8^L;y;&NcLi+7z-+7BIQr9w z%k9FsAIyftl9KJPJF?yu1snjZ(}ZpI3dl(b-08OE;0N7_@bfP=C`lr_>3z` zuhYByVX*Bt@j%{>^9~KQp?pwJhb$A*4Val2zQ|KkFnAf>+svF+;-Y~kLr~~CB~@eH)iadj`|l_y6Sf1qLZE zC)@gBp7)0bu1$PfBXq})9kV`5O6=0>UNZemd36QPo^ zpnHZ)YgRShn@FNB7+21#SMY*A%h-`019=i-M;N+HAuqlAc+=&*W^L8BFwIY}QO!Pv zQ1+RVY;?>oC5w0|$~p8Mq*wjLXrDSsxq`wgnd_?HWT}Ezc3)|%l9yUp^s(z$3 zHrl_j{iH8979PpQu{G1%HrSuZ;V?_Kp;&A$TEAN>#mB;V%I{2D*3)aW;U2 zoMt}b^z}_@kx6J)o6&*TJ0slPJ>aHXVVr~hO;W%AFpUMLsZSQ>ZyD<#(L-A&Fe zs+WW4wMx$?TX;5QhE-FfeG%@Jj4x?vXR}ku%CeFrnva|H7B;&6zE6**XTrouEi|qd z*al0NDTs7M#L$(*)B%U zpi83MUxsM{FtX6(uXO@-4kfX+dM0=Tu0}w}HPMAHvf#2X1}!t@3$+W+=c7-v<O$)_7`R>?3tz+Ll_W};smdU-FF#DbAAcWG*gRU<@i;MCDX z(O~!F>A7P0&dh3puqc+>>4@;qY<^xef?Oxaw?c^>*1SHfRPc-c{J0kHaoYJzqxCuo zmedNYHVQ%beJ#N~xlS9@p!h{u6}mB?PsVKRcqcx>&z>M_8PnuI?5t@7Qj5mDwfHc0 zs`lr3Yb$m=-QaJE?H;k62a9EW<2s$SFuiqLB4q273mMf|4ByiZvzA?Y ztth%Ao3kq-PRVt!_J?I$!og9A`4<61CnALdP6{aVD*u+;d(UxVJ$xG(>RH}r38KWA ztjp%0icnLYu8zQV5ejJi(V1Zc!B~xR0JO``9FiU|cG8a}{L-o8m?L4!`*r45VmQ}G zCyjTvri&wyk$YMV$u<*x%rdC*v9$nd-@oRP)hQ>gA?AfjG|gB`VRD3l5mbc$SceiY)p)p z|N5Wv=mP&0m*y85VYwdm)gQGuyLtiaUOxRmV1H}7lgT+wE?VtnM;0!~tD=l|i&qG> zjvysudKQ#r>H+}j3p$+0NiC4KsAqc`>uY&Ru(Q~OKFZb=TAp7!5b~*LC@{P?B(v7k z!jXr>3_X#_Jvji)?b!E(>O!aWP}CiTcnykRH%TOcC)nQJKf;b}$@iD}3=U{+l$}+W z>6e#^Z_HapR8|{o24m-o3H-+_pv)NYSN$g2>**tP;`_az6upS3=cZkk?Q@5_mg^7U kL!8C&??(PlpgmI{i`-cu5R$L|{vjx8O4^FG@>UW51DmCQ$^ZZW literal 3647 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 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-customize-brand-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-customize-brand-100.png index ebe2e23f8edd6310e00c99ee1692a89cbf24df8b..4c4c9b7b0ec8cd4892c6f876b376e2480ae949a5 100644 GIT binary patch literal 5620 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 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-customize-customize-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-customize-customize-100.png index bf6b25901b213e74826ddb9bbfc58e3269baef9c..145dfe0de74791b8df478b92adf0553c4fb0d1c9 100644 GIT binary patch delta 2181 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 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-customize-modules-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-customize-modules-100.png index 843f0cb56bb44c8db884b201fd2b4269f21bfaf5..c2f5604150f40a3d0fb213c6d117ea0c0299357d 100644 GIT binary patch delta 3446 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 Y2Z9C<609T0KmY&$07*qoM6N<$g29B4*Z=?k literal 3681 zcmaJ^c{r5o`=_!rOo(g^#t2c&7{)YXpBc-@(6K~X$IQ@#8O;nc_JoLJkIYH75E4R` z$dawda+IY=X%VHem2AJ^oX+|FanA3(uJ?VO=f3XG=U$%sy081ae8kog2#^Qx@$mui zRycd!O5S{h1$keeH>r-iMUG|e!g8Ryv)Duih0lykccXyu-b4?IJ%vd2Ki@?$*;--!^$J>X8=HoLo;rI|qo)i|?jp9M289~0(KZJm(WFv?(f&e4< zU@2#*Rsjr(Lx8O#DZrD2B124!!G;_(kHDM4B7!;IUNk0}V+7gaMf3KXVkiW>rNZ(w zg8b=}3*iVDOJ`8P2yJ~W5==)Aj6`YcAoP(auS>(9#9<=3I&D1p>VhsPeY68Ph$}|S~RB0 zF9sZiNn%iaSX4RIx z&(eLsSnO8T!21bA5|y?o)Yw812xvTw$s*E76gG7<}e){ zbA%b(9D}jYgCVf`C>^93;ujW2C;56)XslmY@;_MIe_}Ta!rO;u8AoAI{U~G$2HhLH z6*!vuFTNo3QE&tTZt({{UD$tOp*&}xo7ek4*ZoVxtD(*9-^I&2{9XPO z8n5OVyyBh)JniG-1N7o?W{#ZEPbYUeI$BCM^nEJ!f`E&KA)5O%t={;Z*d5mnN|TF2 zOC}$R)}7735%e-}3h2|U?fL@IO@RMoPBh*yIoPIJSEC?Y z5D`(MgKF95GIbj({)B8OsVadnn!E_kZI$TQH<+-7v`omB5q8^cYxEWrsADySh5BR) zYZS}%37{1zIIGmY@b#u6g{I;Vu&_jgurOwa^0tfOX3-bGxGj-*1W!~MmY5Q^1`6gs z?iUjK>GvQ!eV}<p-WfCIWaRaJXgr%d0pI)w3jKyP18bbFCS7y z-SOyAegD!Ht1u~wT40mgkCoTGf~4h^>t$8tDb8XV2kl?K!>fFoUXa<>fG3euf~r@1 zxT7_R30Gt+fGtIoyOkxDW7cmXB9_FOy6%-1l6yZ-Q|_IiX1~aUEX&&emVK$Q`s4JQ z;WtdDBK!6EMY+i`a1g+DO+L!^xBB1g?bU87=JaOiU~`{W{zOm94bEK7x^Y?|ETih% zQj*C`caX0q!(f^LwIuCAol*fJeQ8;?zm z-Ed^jen}D!*iDCt6&BdB)6->VR=+QE>dp-7HU|Yk-f^#Id>yJPtEikXVSirZmnW#! z4ZCLBLFo~O3Kt|jw6WQ+M=J;1pWIBqMunQ)i{B)IW62iJg1shSprhp@HDx) zx_Y4fDxi&CzSE`5O~lyMK&B&PS;@J3p(_`*0Zo2!r$FDm!sg0MaqDoWaM=1du(W}* ztfo15Zh1EYin@_(W^|_icasU*q$G)oof1!q)C2xdyXxf(cXg}CV779(A7>ECMh{Mw zvsW}}X*(OoX~UHv#?NsfVP@L{?i;xR@?cIuyg}pY z2Wwe54fLbpz(I0Vo@L+i=dfMAfd(;GsxuDiILN3K6LbKb*#u(6g6NGFvcDg@eVv{w z!TcBy-YW$V2$es8NZo(8@WO4pFW&l?KWcs>j#vnLYnNk@OC9viua4|Gr}|tw6jK(H66h3^E-WJ{sDmjkYi*30m-uPB&^{Vex08vH-Z8Wtqw@*$(W~(o%!wd~vCA@AJ=|2narZWb+}o;-jU zP$YkJGKfQ`)D`J;69G3K21(A2+qFh{zIW@)3RyIculI}E5CtsUVXrPMAK);1^xwPJ zxy`?lX=#3Hk+kCPyDs>$ksH(BD%5g^J1LnA$_NSo0<&#;TgsDVUJvCO_<5gFR=R)R z@0Qlw7z)^V_DZxX&vZ}0X^;iKCsq@4ZQWN>KP2FSx_0G0V4=o6%b`X0tHJ_!$}{Ya z1=bOntuC}f`Jy<#Su_~8)vWsIte8Em#Y2+*Ipd$}t?#(G#2I&8x-|81vKFesQ{i33y0VG*OG_{SGCFv`X$&&?BvYE`KXVp$QQI&$Y_8%WwI47g>-nUtWsaW=Q z^^%ma6$~JlTdFEV9_EG1SUdwu%&|wkg>i1!kwtYB!nPML8>Tr1>O29@Ve`@jr zz#;kh+T#iaqEt0c*{Imm6BFa48ni0Av8tOCg0uz~d!BNVB!dwV|f^5eZ{rJC`orKHu?E?3{w5&`b`YtI9D? z6H7fNFfDBb6ix4?T^JaMd9RBYuD$kN4W^5*@QBQd*snY1W1w-5;C*C|L)J|ZuRA?2 z%=y`~`8io-vZoZa%R;@@)`@ZI{`i;5G*}(GQn__Vu+u2w&1u zq^6#aU&W>521JQgkE_K*!+m>1@tb-HG9~32aW1xXdM-u?DEw$Gg=GT>jZdS+%gF)6kRJY$18wcwEVRmM zd*YC7MS!j^ant?yr44oYS3&G;Yuf^07u%m3bX0Lw#$69>FL>Ja`Vg0I3HY@+?;G~r z;b;LS5npM3EiFZNLm=bni<{v z({AbO&{JE#VdljCyV99@A;Mg&+{EL>dJglm-<7=zmkxY;=HE%&zOuT@=D8%KGDZD( zLo8KWCyR630*%}7nSVcR?9Zu{(Yja@j(Q4dW!uC)e@L^*f|i_9dMa9 zcp6|76)to|s!}N;zT4}S5&2x8aPs`lo{C+Pd6ltEy7XMFc}dD%JO?Mzkn?6cedcqMw>Xjf|!bX&p?A<#JD7$;Y_r zIXI`L%wN9sc3veCBkgT%9UULFeRmQ(k+VS@E6?IX4v)Cb3FObP6@B7wqhy9#du->R z8A;bP{JFPF2)B{hi75#*+v>8aYE%D6c>(iVzst%Gc3nAHdmBeQuMuQ)qekR~%iFZZ z-y`KlJgGMgt#Mfx1^XL=_+5>=g%o_R`C=kY#MoV`k5ypIIqfIr7v8@q0{T3tgnoD=!6Taw%!&b#ctNCBW?`a_F8XIcH8P&uHLq z9;a9XdwCNUED|H|PkR%V_}`AVHH&3wDZj%21HvJYw@H2B{LMj diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-customize-regional-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-customize-regional-100.png index d3dbd994af2c031bea6381522953aa397c7fe408..8d9fda43645672934c3329bc621f7e74d7e2d68f 100644 GIT binary patch literal 5424 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 Ym=TY@8wXip5n|Yo2H>)lLKL7v# diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-documents-3rdparty-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-documents-3rdparty-100.png index d4bec7f0356331985a75f7d5426615f6a6532fff..00cbe0aaa0c4de62a0b19d29d8d48de6af31208d 100644 GIT binary patch literal 6542 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 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-documents-apps-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-documents-apps-100.png index 8c07a3d2bc5c463fb394906b2f0fb7aaabdae7b7..9437d5de942c7614c30acfafd50db61a8876d26a 100644 GIT binary patch literal 1392 zcmeAS@N?(olHy`uVBq!ia0vp^DIm``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&di46Ll4E{-7;jBoGy`^+wtIsVcAX!EiK2O7OR zw>Ta0eG$ahw&TgefczQLQqoM9T1>xE6xwt1=z`9J%oi8O`oErk+=sdf?W~QO$^rcH6v;FYGpMUCn{QR73+C+15 za~HE`er3UkNUf=p61TZdDONhAt8t07 zwXLmfA2(a`E%)jAhhH5#b}ZoX*L%`SFWt7bwl36Il*2!NtvLgNPv`)pZmTVv6o(L}q z59=xYw7})Uf{s%P>n2VVOm^f8E@EE$?CCqX7h7j-{PTe0BCBf%TcY{_$Bu^zM+yXz zEI15hS|s?Kc-R%&ngtFc37>iKkuCH?6a10o^dkr&_32W z(JD#QVa{A<>yF^f5iv0?VRNP!X>;vVe4WwrVQ1Wy%MTtXOq)La1RtLb>#1FE?Vm!Lvfz`%o@$PM`Obrmx6XGwv=VZz z7kK=R(W-Z)V~<3BheYyvrvIg7JSVp(@F(BdE5F#(=cK~-S7+yI{;BS`crma<=yKnt zS%z`qhWDzT*7c-K`0Jjeb8knpgF=H}(k(fq_{P)XwHxjKRXzG{E5~p5*NVaS@&!+y zxz4w~a^3Mdv2S{*PW)bdwZ*YEoBv&J(63{1y~gMCrN2t*&o^tdFjB0(VQp)B*JkOe zrpqsnyn3ajp(LG>o69@5qg@9YqVukFKJ=U`A-4${&J{uGZR({-6(^LS!3>lHsZs2P z20lmlF^1E4$)X!=A|0o!2o+0++j}HSkH}|P?m2+BZnoit4vhT6+ z`)L8o&MMwZkhmGbBd%B1P&@b7yi0o~ZmL*x;{I8kWqz-U4xhbK(FJlCYT`gjGtU3^ z?e$*x()f462D^6Qa3PcbCwH~hOwjH;_iK4J&^3W#OD<;QglmZ=-^|$;!tyWXdKQ9h&h!i;a z_~V-2HFmm2_WjQtwWd00&D;~FA)@CvQBUJZfkmC(R4;MYulF{7ER2|WXLtRcy4v3# zK76?J?%g|GjYTFMKaPG+opSc<*?l=?uiuF|H(a@YpI>_dyJ}I#-?U6lRzsIgiQuD2 zA6e!r6xVpQuUY(Lj*{9h{-e%2SMNw<{FLG4_u!HCx~y{*cm9X_JTB(RRjdIPkPM!# KelF{r5}E**5QM-0 literal 4220 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 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-documents-attach-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-documents-attach-100.png index 8e68b5a4d59ecd5570057bb82c8cb4f2086c7907..16d7e6fa47a40f80ac80d9e5ccc7827eaafe1550 100644 GIT binary patch literal 1791 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 SrvG^q0F5WQuqtKisQ&<-svT?q diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-documents-coediting-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-documents-coediting-100.png index 7583a5c5d9f811426e76b3e4d79b012a0188d37c..faf663bd1781ef52f13eece6bcd5c971c57a0368 100644 GIT binary patch literal 4280 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 ab>aUvw}G6GY#;Ri0000np&b42BRMMG2wIm=ya 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 Hu0mjfWyR@t literal 1112 zcmeAS@N?(olHy`uVBq!ia0vp^sX&~J)XhxL28YI%Ho=ciB1AStb(Sj`ISrg>(uEiCm7eM&(JlaytS z_xVO>vpuqie19gUL_K1YYEEKh?en>BDtF1QPdhg!{oP*U)x|awi~C|@*!D53V~ABa zXrZ^Q@%MrL1ECMjohvN!{wek2RK79q!I#YP%=b5XpIUxkyYf^v+oA`~_C9F=|Jv-8lIXIrxXkBJ&%{hNPP9_FqFToF)>+3?kkT*QV@%wX44E2N1rYQHCKVj zN*$hpN0x99E9@a>`E%T%Yzd3_q4mKSR|A1$#d^xV^;l%8BFYhG}E`xK$) zCw@sDY27g;>(S=uBr?4N^!$=pS<^HYUCe4)KP6;c+R1LOtjkT_n%ti@&AInTORwvX zy&IqGp?@xdm4P3&*e`ggtvq>2k7>$T@r6r&IPJ0ME2#9#&wLx1x^#rg2*s7prd4qK$TP5i)K&ZLUJZZG|GxK!R!MKItue6ow&(XqTuF7DK~Zbf^3R`_t&}faU>5X;`S}m-+(wT+`QK9`1ZGa$^mWPk zL;0(x9y2IUTUIk|m6W7r|Mp)xI{)G_d5kZs`<}|X^;T_t>EG@zt9l(7B{d(_iz3+J1730z~Khk{T kZT>PBi0+7$+iH+O!V~begnH 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 Be-How literal 1984 zcma)-dpOgJ1IE8XHjS7?B-V+;7%OS!G9h4@a&`<+vwKQHn8%)y`Dz zm!ag&m@{&}M#}xzadJ6{U;q4`=l49nf6gE8`~LCy^L?K8O?A0sCnK#Q4FG_QgT1xe z_w@fR3h3~6XTkS_06;3)!P?S2in+%0qQfp9?>sQg$#0q&f90K>=B-lL4gy)KyO0?c zj6bYf@2a4VIvQFQ33ul1ingdE_kt*k^fwj^AigLy2jr@73|0@*P9#l~G^|ZW(x{!x z!S$NN;HPE&Z$kS~Pr@4-&Y8x>#R?+zXVUo01xrwpv+G`j#6!$u2w^{6n#vwf(7-->l?LCBm(wEfZkzAcTax8|Ytv zb_Xplj=Kv|k(f)pm_a*!_~3+eBAg#~F=Gs*dO8v8paHFpr)%iv9Jvq5e{a-jkAO*g zrxa;##5BnmQ_WeQtMzmEqFg9spsOYqs(Ct@<(r0>8@j@*#_v?%qP z(qHy4cBTR^u;mO)JJrBFI;w+JiB!Ao96`K^ONt?EC#7~#3@B}*I+`^1jdd0RlA|+H zC)MECsyacnMN&jMGg-3wv^%d&S0=Lb0Yp zbyFd6y%dA)M0X;|v#1RQt-hYO@^a$W zLuR9mAWW_fxqnPGrjjQ^i=M~WI@-0})8kuhaG`H2dpT7ZZy#tPGlL$lWR?HPkae;O z32&cVOydcaZ;+jx6~D%A7M?p)k5)b9AMD-w%SmF{H7=2W$veBTua4LspPpu{-IQ`| z?vRW#i)moZC@hvwh^O%USC?z9tL(?XQ6<-a>r!c7Cb2;w$! zO#aBR3$enFygJqcFFrt@-^{lHmh^I+kfo#skm7y}R*!gP5(E6Zy;Fl&riY}!j zfQ-j?=@IeVE3pMjyNjbB^?DSMWOBMOsaJ&9dHVJ?%9*BhQmfR#^L)))5Ba_k8P|ND z{^es#0qz=;^wXc}2iW)v$vut3z1zANL(eur))Un^wnC4R1M zOiOrYqMJmQtN+H5XC4=dCQ6_YOx(ztj*<+w#+;>%HaBLV;iggV@kg)(@kohdr6EI6 z_!r(=PACr~BP#qcpNl&i6}Z{mh%V3Jo@c8mA{TiABR{j)0a^RV)Uht6==}pZRzj(i z0vUIo(=yjP!6h@$v#jilRYP)q8sXjSEWH0K$xx^AAO^0t(7Aso6H)4-BuSgj_mOjf z-}^SV?bC%nppFDwDrW}<1O{?Ss>a0v5lA&gD7DI{nuotg!!@u^h$^?sZalJ^__inN z7q?M$e)xRK?h&PJKD4T)re$7axOl=_{iBw~(W9_voL}DvU$^BrA`fHc(z0GapW2=o zEBesgE@r+1;TQ-g5JrS!FVu+X^W1cfx4UNkk6)9=P*CeI%KbB)k z=iWtMv#t_a&dqQPYSf)K>*h67PbD5(^7tHvc_=K8CIXv#(rSU*n=gB?wdqF2#!c}} zpEog4XK&eL_JJ`$#yg%B>9r3WCdZaLeDu_i5Sr|8yzh3pFBUCj9 z^Dgb5Oeg<0-+bi}w*NE8FWn5S_?6j$_A3ak7nbo6f2ZN9p^6r%7KRo?QI`USpZS!j zOY&u6i>GKbS6s_hXwN@&QY+(Tj7wZWwOOSspW(XlNpnIf_1$URtQVh{l=?B-zu)|u zz5oA*NN@-pZa;BwD-G8pq@pBAdkYmvUC6Ae(`vxh0K6Ft@CkTju?^eGoWo+C@k6?+ zRtrIe2e4*SG71!8zDmmbEVfEx_2#}#rIpDxUja^x`Y)1|#-*uJ5ziBEi7~`yu@PRl d{jgUu!DS5|)U{{bCHlHvdW diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-documents-formatting-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-documents-formatting-100.png index 0ba539d3f8183c9e508dd2cacaac889fc9056658..ef8b8fc6b2d6a62d3dc4b27ed0d5ad4053943a4b 100644 GIT binary patch literal 1601 zcmZ{kdpHw%7{{lk#w3@_QjID1g?1cNBBP@r({gLVmT_{4b=1y^<;iVQC}ZNdN9I1| zmP@f%hlE^rCN>=8GR(S2%30^sU+3w0zMtRwyx-sZ{GR9cyzlegbat}aA*&_}004HN zPugN7k@ywRHpxkvOmmS08PdtKVE_PF`72U@%q*zHlnTSzp#YUVd*>tx@K@_o)&M|t zGI)a^4FE_FqiwBSC{n^~jN^V+XzSAe_(NW1ls53Tp`i?Ij9C8w*6pwSxV7Y$iGsA& zrM6uo(LsGfi&9{3$CwljQ6}{QI}Gc#jp`Q{x9>N+nt-XlC+n%irAGx_410A6F92mY+3zBDb&Qb6*~O ztrQKSi>B?oDMP|-7(8&1eALCDlc=P57Zf2PSiOy~kS*eDn8-X9sz;T18#PG7hvb`} z$6(28pL$}{x$2anypkPfKWo_|53t15WGmSsRAOV#g^D^f2zm0mOst>~->@*{I2w)M z=XatRQ?-jXI!eIf0hyU^m#Mz@6twRb7jJKDY{ZjD3c;p(T(*RVhqG8L4Vb6yu70ls zf-8f+OdB8fezUMp2Hh=3MvRS(O~!KUpN>Pdi2(sJM~)uN#}cp}uH|NNG9_^h3`Jo9 z0mb9-@MJPXUu8In#qkQ23mT+a=5kl6kEFYLr42G4fiH%HI0X;B;~2vim!gF$TrTu> za{(T{xlkmH^g`Vfr1`;%+c7{7bq_{OqOPQnFz>-QXHjzQ<9w{1@7az?^mLcIk>l>~@0`9{ zjri$#-y8J4-3NeQHE2`@WcolfB_JhWC7{0LO8Gv$BC8FrJ zf#&ApmYW3vn97~FDU*OsO9!zcBRr?#5HTWN(q?nZ19T;F4jn$I7do^*`AEZ$#$hymC9V7MD)OH|0;46 zVj=;-AL)r1Th=@u^4aly#Ncep z!FAeS#-Ff=n5`=2*-o^v)0>}~%xvTjRxv9f+|e2<;T0WZMmJbQiSRcwH%#DhXscY z{%m3z-7=x4k>sJw<4$*gUcZk_;qu2GH#Rq0Kmx%uLoA+Ds0%j;9wG=0q7G>wv{M+)IZ_B_bdPa literal 1745 zcmbtVc~BE)6c1=iWB@ZNoq`N*q7)rTHk%NVEQy39#Dp5ukSdqeklh^Q*qAI$2xFy) zAPNE&unuUectF)y=%}?&@T>}s)Y?|As;EG%R|Q)g9oufW^pB4JbZ2(I_ujnsd%y1; zv&GAj76yM(k+T$qr(W{?Jq zy5J@uZH!ckav31O>?put#L%@&C>r4M84xFi%jZS`EJ6pFJdnktGx;!w4KrE5_(LPI z*%2MAlFG(&5t@)@z;PQ4f=;KC;bb!~yB>u2d_Krzfh-oC@Sr<#thmNSw>sudAV^V% z)^4=nM$8I$5jB}uHZG(QOvkQZu_=|4z*fh2p@@=!E{zR@7);P&@!o6H+kvalS2X_9 z+o8^}p`Z$NVA*yp(GT6+iD063Z%*WOB-p@GOq*>%t++xeq!AVdVnkpb#7*FFC0s6t z$AO>(PJ9fXFJ+4%Hebe%=80t!u?njL*I2daM6B^uY|I;DVTm2p;Fw*FVdjbMEi+&^ z<}hG3Kq49K7BF9_(HgB@;{tDi$N8dm<3}hWvtt%uv_i1)H5OwNf?!&LiERQ9<}f)B zo5y3)GZDUy4nbTVoriD`Is)mUA&3>t&CKM{#?gq_$$I<`G>{++dPm^3k(e+MbLJH% z2b@qQR|K^ZdtoOQV8iZSVjHK-R!HO3uAcj~&DNRADI&c^8+$s9ze(-cP4l017N14l zO`1dUopps2v0AL$A{w5a_u~&DpK0QGpQxXBGS-Cn#oh5^|KgGM=Ra%Abvm|2HwIsP zY)E>zGxkH%caL3BJ~^fO(5D=Rv2tp)BK@|!ZvSId9oF{5ml|ApJal_Qa#Wb1@8|j& zN_t4{g-tsprCGA|f`r1EW`m$HcsTX*jJoiouS{Zhyrk&a-5upnwyh{2LPQ3pQu8PU zBr(O898V~ee2Pf!e<9&z;f7P9w8PbS^QyHkKV9EBvNt7a^P?BrIueqTt@7|^Zca;rwY%DRaeuA#!boxWLDm7iX=|Seyp#IbQ*!lwV>OanbXSZL@qAo1s z__^gLpPy)HsoynJc}}*GA|g93sD{do>@$ZPB@0Iu?|DtWb^K68-THg#%hap7!qlO6 zR}Pky%iDU>k6eo^t4fSmeh_MJ;iGHszg562igE_+@Vhp+Regy%aC-`MYLCqN>HdDlxt6Y{wv_N!}BS z-RV5wjI4=-A6zuGuyYpt>ONV0RQ~OYIl7N6Lmjzp^4^S1f99vAo^Ws2-)cxqpMLo0 z(qoK!fsw}F_1N|IODT+gxSA_02p{Vnl^u3hfDIeC*$RJ+NAs{@MyAt;bw4OpQ9k2( z;BPnjk~u}Tnw0Ye1*&f`x=Nl;Z@qJE96UWZ~fkfQ(P)3?H!~E(C%x^2SYnKtyy8ob^9D) iKlNm_hVaVUd;>^wgu8f!&t{(YC!e`?!D)( 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 literal 1143 zcmeAS@N?(olHy`uVBq!ia0vp^sUXb31|&mjbk8#|u-JLJIEGZrd3)D8UpiE#?c?$3 zDrG&zODAm6VimmArJBUp!CQSqN>Nd<<%Yr!h7Cza(-Y2{C$#Q*&9svHR49jL>y$}a zhM7sn3)6D?-#Q-e2@GL%y8P>m^~e9)vqD!EoAjTb^Vsv)xub<=3|Af4`S{;K8zbfg zY%Smaw;xrmKgXEQEYGN~Qg8nFD*HO-`Ha{9aZWrlh3Nz9hh?rFu5(&`9+9<~-}4}t zdy-ap=r4(i_LOC77^EFCi_UlU=suVFc|8uh%xdKRmDN z^v6d@^PWHFitB&<^;79;$&b#9pMRdff7G_4B6+*}^7=QzSCSu_o(j95+;L=m^!Jlb zKffvc(|0pl}m z!28|_)rr%!z54?_e`fBVtMF)hmBaSw@7@_))lhyX^f5Pges}THhi6Vc{S$ZO_TCv^ z_c}`@KKZ)iznc=*$u&D4r}T$oo$|A-TSRzZLp$ns>+LRKkHVX zZ2c)T{h9ZZ;>VG>->mEPpS-Kcda`Ijj;s0i+i%(gr%%^9bJk{817}y10LO zsx0nl$-9GPxs;20DZ6};1aHK8 z_BY)+Pt;Gkh%A@o{jss^Kvrp6x>%a#pZ>d_70!KhH%{3sX>{V4?S+MBTqFzgUwylE zvEZ7{zvF9GZm<5cOIqODrqcDjI&Otl7aQhhv9D3tysRSS+K#VDiv@$SU+Mu3PMIRO zz4;cm^0jGNI@7yzw(mMTH`KpI(cW{}VvBdvPMoio3z&6^|N7j`56=AQ`L~AUU|pfp zWL(MViRq~jyV>_A2Y;~1SsyrWt(fumudY{L+B`p1_x^TO?E4P6TTGs1;E6&iSr-ViCtC zjV7Hgg>EIXnBq(AUaC9#oOb=0cj4TlzxBYyx1a7bBm000XU000XU0RWnu7ytkO0drDELIAGL9O(c600d`2 zO+f$vv5yPI8?K+26w4zeo zN>v@T7o${F9WHfp3XNUVn|E&&*edCzbq{UQN{yh0{=HPF5`R+FQ@j?SB7wmMF6;IH z7{%a#!~2+dGvCZN^WHj`g!Oy7^F!W!Z~pH4e)IjCc>q8{LPA19LPA19LPA19LPA19 zLPEl)0Lq(It96cu9z(>VFkE;;J=ew6)zuDE9FCA?v$=5J9gX(FgSSEJ^9_Iokow0H zhD7QEO&5KsKY#QMmqSFaxaYnk%SzhncBI<5I(3iSPt4=S1XHAcryS4xb~CE#-PjXY*7}8j93_%c~r8LkRyYIAo`e!ybXyq{GHbm zxz-sXm-?{;gIvaBm~k;|Z+|=4#iG8)??hPo`fd6d&woM1(Gb^1#}7B`gW3nq^f!q| zwJVqk<4`UHv_f;j2H)M3nKl_~7I;FPHj?P8=OWWH?@N}*T%G*5!6$2u{jG)+xPL5v z)T2;wG@^SeY!*67fq^wA1rZchDN18Uk>+HkPHGki?INKiw!0mT0`jCel@oA(CZ~J> zRTd#3`F|ru0(2|hY74JaQx`rgYeVM541wKeQbV&Pgv)anX_|JY7U$p?nx$+7Xni9j65=Gh+)*DA08aU!PcvV|+ynia1ra*(m*s*5RgqEVo zl3yHB5s~vNUWAd;hv=cL!YEK0F82Lq!e+cR@e} zY=Wbu#RQ=D5rG5mvm!ZP$dQ>47rDQ&OCl%`7a2u^K zw|xasrXjrY+=s364~ufO32phv-Gf`XUVrdnEW{{bgxq->LQQ|UQ{YWgJQ9T4DJ5jq z42KFOYzC0CWHefUY!Xz_`KJNK?kyV+`&^gZ->CnM>)-t!z^|rlZUk)lbe8U(#1UKz zgH<$HK4LN7QLT%LssrA$GG1P2ImPX2fhfx2WX;-O7e5KxtuEuSbJ%C6I3BB5PldHZC80WrIcw?E$!?7RhK`VekW#bcn2n^^amxi0`5B(GmQEe97?Jpp(TAKIS>;tWlJR|QW^enIk>(>H2Pzihml?ALxY5p;LY@BO0_H7_DwqkUQDKSX)Hc9BWYC-w9Z1SWyoM zL!VL;9O_%+6oD@?a(i0y&*-rClZ3T=9tvCS zg+HNJk!_b_XA!#`L2>k?r+<@9x^QACj(B}xt&VYvPCd5C(j2%bsGtfMIAIedQ-MU@ zhA9fihR_%~>R<~UWD+QTS3DPnW4h~#?J)E~pS`T$!kPo=OUUFOrq1T!eCU)3V!(%} zc|Z3GQD{PfS0~tKOX-8x2#`I^>6IDHnO1b?I2^^r0b+&GC(05ha(~XJxCbV{KG9N^ z`Sx~)&$kKepqmI>>LxZYGa{RaNA_~Yxlu=#%J0^hfkTdh`AH02E?($4DY>P1-? z?`5$M4NVM(yAYAV?X##2*vy^7PBv3KwrOSC@km%8=JNV3{PwLcz|7(zj32)rh6%m( zwWF6hbH8ggVNAYFS$}lu(mr$8Yrf4#PzRwoV*{37ktjhFgfWEXi4na<=9)3HFnnZa z=x3T~FX_i!kmbcZL|$XGCm|gtM^C|Z5CO5UW5LV0{Eiq!4zB8n6kfzMUsKB9W*q);%q9`dOo6r%&TQhNjIzo_yblNX} z2y5G!&p85(aDP`2)a9k*O;r#Wh}^~12@MJbF9QUC5j9>e59xNhe`z+GkDj`+v#`g% z(zf4K>-@*c<}NDOV(coA+fTz2e30`ROru1W3x z?&3ds*Pm01p`#YZb3wlm!XY>a2;Xw`I>FM*IT@D}5r3y)#4%Vxg6$GT#xB9^$_KD^ zHA`ezG+u4ytZBr-e(M~FB(Va<4T8??W83=$j$s3B&HW%HUMqpQiF z&dSP48xjHx%7<+AcCxYUj}Y50DKg$mWc0&82+;>IQ~%jn(ASMdLzD5D{?`=V{{JRC zv)G1>7k|5O_dVlq^2~Yo(pMi2+Wh;^m*Lqz{06SQcNJQb--VNB=iv6w-R0_cRQaX$ zygs*p+wZ&!zV`i7@R0hG*m$7}e_dXJP1WYu11*@IZ^My$z6dviN+(}B4|(FBE3jWI zKRyfVN>~gn(4YPOZ%*Kvu%G{ED(IsHK6Pf!-G4v5*n#e|e-GNsKCukPzuaq|cRUQxsSgg442_-btI&IG&E0RjP$c=as84U>l|q|$6bb&i z7m$&U`(hVv7DGu0uVThwr5Q)=9e4M4i)+Sx(Lvbp2U>fMs}GkB3lpbttfbF=F_eT% z&wsU@@brn}>Gq=XCEm7cVQZhE%d}AWUSjfxKZc1(W7c$=lV|3FF|-++o?mcfdW=Vu z54l+kr4OkSM#6{G8HtdJArVqBBtj~NL`cPu2&otnAr(U+q+&>fR1ArbilOR+Z0$rl zs>6hJvpf8}EUPpj>R{`FJ|ucuYzW!TPMmm95&etS-|nu3XW!`x{_hot-&(_Iz-reoz=$LKys#-sZ+DGqdVE{GdrmVJ{d`dU@+> z7nXlI3kMz5B|1U0TP7qVBqSsxBqSsxBqSsxBqSsxBqSsxBqSsp2tEe3`S-skzg|D6Bzyq$FS(~j!E13&-(pnmG)3D57Q z{4c7?-#hYkzBd4%OgnXg=p9qCQaTlZ@X;RVW==Y{t_1qgFE-^n*B}h`o0Eboj&CW1 zZl)_?Zx+ekJXhHU?5M(7-n}_U(qRuXdPTa2t$I?yFXqOM`d3H|vu0n4<{sD4A~^@MS4hu@%IW`@fIc zyYdlVLEPI4+SfoGGF?z}5WG|w(H_mQGy;dHS7Op4PJ$*&z_Ty2^n;1d{Y3@F@&C|( z3u}mg)~lch4svq6PBU-V30teM%(&F!oIS$|?X#^)$!@4*y;JHSwmj3o%-PZy^n?cK(3e?nW; zW>$L;cNO6RCM-*!Q~E;Q;1k~9<7d=_G0NbKySZe=ereH>6HAG=DM~i4L*3{b7s9vRh=)hm4UE~yASbfYe?Ht8)7B!c4w!gse+4qeOX|-s zwAP!K?yOyVNYBSWk8qN$g_=2IY z>cIYDaqS@1$^;k_NX=Kqb+DmP5wm~cr9pNvJr_K-P$@zxH<8IjZlt*QQ2%LcC?13d zyIR=m=%UjgDu%9{n>tswTf|sSEhMdgGWZbQnRgO?Q%5Vg*!8ZBQWT$_7&7|E(y$&o zG3mP&iyup&{AexfbSss|@mv}H-5RrzsU9ijGrG;tyCj@T_ z50h?a@3By{%f(NV6nJ4inbV@{DjWX53l0&f%XYvIjwNjTL4|dqsNA>vMGyxp8h0+&1d>F^$pnn6pwZ<~_)) zL8`VVq4dP3jfnf){&L4c*DF8lkG*r7-n?5(P-889V1^qwpygNlBP&f(rT(5b{uDm> z*)GIoM*AQsI%<*4cGK<9Zu;Xx#C`~U(SN^Ck9}`_U~xuvZ@C&th_bmtg<%X2jWtFD zAZFxXwW08YIFsJZ*!i&B>Nb6>3Vv>)%V<91j=(a8;7rFI=Re4ESJL0I{K<)HY5bec zXcB&6ucNfF^lLlib?kffp90e!)%O+NMw0)8&FZbL>DX|lIFzA;ASO8Tmc)H|?FyL` zVv#xx(F=(`6dLXrDjZL!Rg{mL3BvAw^hoJ!C31f#Sna{czE-+*diRcW@?A}qvIXd- z9q8sf1yU(qe>i!m%CY*D3R!}BBtN+L^etI#nz{2Wr{;2w?GRn}w>?Cz9*dy#>~BI8 zS{X8{k(>(sH`u9OzCG19h%!tmc~h@v$A|tZ5Hk~@j(w%v*Jfq3UN8SkHkP^{I*XKy zoH#}2TD5xGd7?e-B`S^1ZSJe>&1YN$aay*J1ROw0Xen=jjX%TfvQm(-sxR-B1sO6I W2)wr2gzwJ-IAwqOL<8wu(tiO2#RGEy diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-documents-share-100.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-documents-share-100.png index 912f7d9effbb7311c00154dddf12d6058de431ad..e9d4a56dcd5a4f5b8e742fb2f61700e83d42d223 100644 GIT binary patch delta 2827 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 Hu0mjfChTVc literal 2065 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 delta 1665 zcmV-{27dX76Oj#&BYy^1Nkl z6>_5%&V(~^RUt~v;^Y~G+DO_J>V(uZ_41%ck5Zx6lfgaQFPDpMxtepet-+@>NRx7Bfqh39f&^8!em86YXr8UeAORMCn6Vw&_IN--WC^}m1Ygeri;jGSffO7B z6;PUV#E^XiM8L;YT@58bWG9%P;fCE z9)^F?-KON3kfMCZJ`TR6&1IcAq1A*+JsI@%ouFt@douL_2`Rj-k#r^`>&j%^ zEa~dGa%6p(+9v0m+mt*L;$Po|D+#(!xnjAZd#+Cit|+MGA5Ha{X)>bY*I_4)JbN@=QojIK++732|hn3L{?%y$dS$nh7ng)U4Gq7NWa6 zAR+1q_kJ0|+kmaKtP+82aB?kuY^bT)2n?SGeiqj@?gP*FT7khZ{&Ppl6kSztiV0_w zi4w{e#Qt-jU93lRyxTO!#KMG4j+7}no4Z#`IDb9Y7EPXh9fr;X!N(&i-XE;g=7)cV zCH)*??%KV%$YS>2xU$tj;)l|kGup|izGIe5f?o=uw zaepBsP6c0Mm2_RTCq&iF+H{Ah>!CplM<&uk*4!*{5e%7DWg@8Z8PVf-8hkVoa?gNK z07;vP(W@YS1o(J=IMt(iuY*ndw#J{8Pwf0)-==!sefs3OUSO&{iN(UNbwyjB{mzs?B2)jed*jU z%<>BgIe6qm^~+Y=z*9*Rm9`1V%IWi&O3sZuC93C8rQ48k%9ZSEiX=&PL$WL@k|dWI z-MnMBl8`)2v0AP6-!@S!tE-~)yZWiNwSSjoMHEGMs3~qOuc9PV-`|hhg~i;um48oU zcnGp0u>bI1{C)NkQ^pKq%Z?NTUtb3GjkC9rB#9DH#AXxOnR<}*Kkg(VG>Eq+kHXJv zV*aw#h@yna=u2{9UmAr5GkeJjii(OE*e8|&y?a)Qn_I4>Zl#`!>&~xx50SF(D4pB2 z#?NfT-`~R8ExX9fy2{coHz7-Mg?~n7lZkT|vzYtgD#i|bo*M;4e7t%i+fw#uc3QDv z+izr?xxk9`KOo66Ndw|}clp{%b8|b`TQ&{n^o7e@%ezH%^QQJ$if9zVqb-`UH~koa zfdRyJ?O3rBgMrMe*O3hZaos!f%oFW7cIqtYC(aTR9mSCT@kE3*;>z`#Y=2KXLc)`s zNa)$sJ^^pN+;K?(Y z#6-8mY%V`2i8dQ|N^FFM27e)mB5O8oWlPF_dUS~)F`)-XGtM$&{xYuR<`EeYLSpZ3 ze7`e|FE;#C(MA6QZUy_C@xzIXXw0jLeJ~r1L^cUy?xbWI1_lrk6i9Hx0J^kmRbeE1 zbbX9~01K@jj$-*cQ`o#CmEPStlAPGjp2GV--Hpd%9%1LcKkcqG`g+Ad6cpXzQq~og z%$`tbZdJ0^x|v_V_}TAalO)!DFbA`#atEf2Gv}GLcm?5&L%4J~hc)lNMT5Wqk2utA z8fzNrgw!G_04>5XIg+7f$nIdr>AF(R5qPXX9jI!Q<9|Tp-|}IKRtpVEIXY} zDI5+u@+=^@j+yCzJ5>O#tpba6{;Gl-gO5QJu)_>@2i)@zC#Zf}!0+ zZJif*xO0CD&URbC>-7Q)s7_>IVF9iU4wdY?K4^u-#eYR$0o94%Ld6J_f}y>$qJ>-z zR3~CGnc(+MX=k@KBD9|cR43Bc*9S}UGbQ_$=DoC^1ym%K5U)E?p3p9et(ChW!@pz~@%{_L~HG$I!Bk_pXv7Z^p2Iaq7%2+HWO-xKk#2MTt z(;C}omw(%i%Khz=j=^Vee+zvRe z8o+dl7~(15n*qkUPlM%PlUagO3RxnU;D#=ed3}&1BuF_(034=BNrJV#fmwo63Rxn! zSb051BT+1bP$CVT%{pcYPAO!GpyEV-#<7pm54<&GKBw+2#c~ufzQ5j#t!DW?kn<%3ZOie%|uT&Y!dPPBJ$vG?d ze1AUL#v0pdWofF6ms)e{FsF>UduvB|%BYD`6sn9ZTv6il%9uoDp4IlOPB#a(Xwc^`AN6Qs6jlIuHoBpw{pQvG=EKJ7EuA00000Ne4wv IM6N<$f?iSD8UO$Q delta 1460 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 delta 1426 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 k?0%r=5(5pF diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-welcome-telephony-50.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-welcome-telephony-50.png index b2f9feb4e4a44184e5a81adc2779d9de1b08422e..74cee642a6d868e90c149ffaa33a3ae98585a8bb 100644 GIT binary patch delta 2180 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 diff --git a/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-welcome-usertrack-50.png b/web/studio/ASC.Web.Studio/skins/default/images/notification/tips-welcome-usertrack-50.png index bcfeac5ba58a55e0bc751955aa18f187fb7d19e9..c9cc4b5891851f44d731466e493ef3fa39339504 100644 GIT binary patch delta 1911 zcmV--2Z;Fe5QPtrBYyx1a7bBm000XU000XU0RWnu7ytkO0drDELIAGL9O(c600d`2 zO+f$vv5yP(;Gtd3kxXYSk(VWK2y>MKm`zSMv#fLz1Ml;o;#wmY^d( zKE5I&Bcr6EqJM&df`TZ}0UeW*lj-8ci=mT~lU9qx(yK=YXJ*dL&83G8&>6a;t(RqS zYuB!&hYhi@v3QHXi=G}4JTgQKBK{#flXa6%|EENl7A5 zLqkK!pYR(ID1G3-0lIYQ5@ly+Q&CY7ty{N_j7FpA=YN@nZrr#*U0q#NRaHeBHf*5c z;$puM@(U4I;KYd&l#`P~b#-+V931R1283`WBqWH>4Gj&nYu7G8#vd8eXCh5aO?3M7 zX`z@h`!h2$)YjHUy}i9OK0YpF(b3UlGMNNfptQ79wDAsi1R-DG6A@SfBwXkSw%96A{eZ`Sa(+>^q~gvwu@$BLz2a-lU$M9=d-0It>gAsB)y= z!NEb7dl5g#c!(D*&_v|ixpUZPddLyja3RD)e}6x4_rQoiNhSNZW8c1gLP^9)M@I*xrltzlfwd6KAluT?;`Lr62P~vopebwd z?SC_cg@utfMc{7ATHy|m#|5IbwY47oNYPpYUXw-O$Id~n00iJh_XAdU#DqIAIm(vi zzrwGZMkt4E$i2v*4;ER>HMK&MYvCx2HN)L12v{guP*5NUL0MP{YX)KieRyweZT0$G z+@tk`s)-0TdShc_Ufl~a_&P`-4wNkl2!BBiWxd@8U~;q`@H7#@$qep+jN}f;VFC12 zR#v+7DZ5{c@s<$Khc!kEG{p$gD85wLW?&{U`)O%uRQv93vi$ms+UE?h*v-#U!~5l8 zY;|?DxK{xdO`KP>K$At_$B~hdYEXBzA0tzgfjUwR6l_>dT~`*Urlv+@A-EICWPf2H zQ-py^pIb_nxdj@y@;#O2e@h9QvV<$f#KdSmpJ?9w;&6oXL~6)9b!0B*1bD5F@eUhN z_Otx4wmV{Th)pGw6x;ToTT~jgRE#k$*HeyB$FC=;cJw>yxV21-)e6l-FmpIVd~@_u znzb&aU^pq0F9I1}GGkUj1{N%R=6^TJS#2j_AHzi3GS8@YS|amKvrnf*pUxwQ75IHw zdo$H1EhFQTdRH>5`QzCgVvLgrGuTPU9B_@#FsdAxr!DzKKA#eOJ|V&?m~j)|))$0X zh5xH$_?2y3;`l5RnYl~UHhGs?rk~)J*c}*0T>y$8+wgiUz5YWt#Xr4-yMK{^qJwm5 z>{$M0GM4*(QG0+`~}6KwMj@g4HS&l5B^Hz)eB8^D;@ zv{-89#Qj}k_Iq6m%ECeqx|aO7WEyCAOeE0Y5$xUF-E{EaK{eY18j$_WW;3Oyr@P2K zh@j|p%p6X}U~DJ&3T9*WOMl{R=G0c?>Sgn6OU!afEoNdL_Y%w8 zp?)>X*g@=*v&7O%Tyq=YcyPqW#2)g|I%<%I7uzB-l8hHD8 zIY<`?a>hLU+&v+<2esrT^8tx{f047kyau52un0DDmOt-!lCU`w@)EcTLCH;V$>seQ@5XO@m%;!5002ovPDHLkV1o9Usp0?t delta 2152 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/quickview.png b/web/studio/ASC.Web.Studio/skins/default/images/quickview.png deleted file mode 100644 index 3d24d50881df2b80f177443c512b3a7c1c29f997..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1036 zcmW;Kd05g17zc1n-OB5Ers z71(1V!$|YmqfS6YM|l7$-fFagS3j%@o zLeo;xmi?(XgGq4Zpf z>??@+`$jaiFoudw8z40e4$+2&>BGOo4b$kfn@4ECq%ml824iG&bd1SF$4*X7PfgEE zm&eUk#Lu>ry|^9EsyfQ5N@TOxYz~Lb;c_?}Ze;?m>Ijd=Pzk8g|=g(n2pTmCf z5~!MFL2a6VNfCgA0)a>%6bk=<3UM$Xg(9)2?kiDOm572BiNs?3X)zuyu1AQuQxZa! zq*M;vQx0O3gIMJdP&LZo`%30hB}k>B z)v7>hm0GQ4;M5~^Kx)S7HDix88jW_MQ9JQetJS`q`SUeMr<-Zh&9>`wtE;TPRzYiP zT=Kts%KFRxbpdr<@Jz4Q8^pr~3Ef~YY{*78=EpY-hE2d0$Y?a0Os4JaZL`_@24t~V zb^unZ)n?tX*=+W0z1?iE1B>0hYccNb?mBE1hkeK4a5#5uPKVv;bh?}lm&*yfL1=-@ z7kCc0B6!9bNRn3m1F-i&Q<4#hobOPr{scT}Vvf(JJUkviFKv2Ml)J&WInpMC7nA#5 zgr%vAv$2H*_mCwTXef%*RY%w#fm(>al2Ox>qzm2Wlc0ras!6aM@3-m@Crs^~ZQ*Hn zga2(d<(q{_@!=+#$Jf7|>gtGwmFp4SoJ@Rbm)8z@8i_I{G^nP~RsjsvG8^}H%!LL{ z+=H?}KTp#~XVo*amm(lJf}s*CV|7Flz9o1kgm4xToCimqZfNv>FE~hf-KR+Xsn2!n zeh9C2ueZ^%FTnFw05WO%#ui+d)!I6{`IXvANy{awi5i^J)b{3Kbc>O3tSCe z$6>-~(cMiVY8h49N+S5C$5wYUyv7fIiU0OM?m%qR1y2u7R`eyDIPO8do_K?E4)fX1 z2O{!Wgs_q~_+#J4O!j_|eJ-6B(NCo>hLnYu1VSrw^0k=YGQ3~j5Mncz-FT(gk~JSl zVP5n;nwfeFjT{{>Jv86moPLHE)!DvS?&jx7&QE-P**xjK^sb7XS6C<)7n{w89)F05 y&VH7=_J}3f+Uh;1AhBaUf!*hp1_Z%FknWJ3tHk7PH(EMyNC-4FBc=BQs`5X|L~98E diff --git a/web/studio/ASC.Web.Studio/skins/default/images/quickview.svg b/web/studio/ASC.Web.Studio/skins/default/images/quickview.svg new file mode 100644 index 000000000..159f529f5 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/quickview.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/recent_activity.svg b/web/studio/ASC.Web.Studio/skins/default/images/recent_activity.svg new file mode 100644 index 000000000..678b14370 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/recent_activity.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/svg/context/icon_arrow_light.svg b/web/studio/ASC.Web.Studio/skins/default/images/svg/context/icon_arrow_light.svg new file mode 100644 index 000000000..7a6419048 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/svg/context/icon_arrow_light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/svg/crm/uploadlight.svg b/web/studio/ASC.Web.Studio/skins/default/images/svg/crm/uploadlight.svg new file mode 100644 index 000000000..fe6c91544 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/svg/crm/uploadlight.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/svg/documents-icons.svg b/web/studio/ASC.Web.Studio/skins/default/images/svg/documents-icons.svg index d1a9f0f46..4f60442b5 100644 --- a/web/studio/ASC.Web.Studio/skins/default/images/svg/documents-icons.svg +++ b/web/studio/ASC.Web.Studio/skins/default/images/svg/documents-icons.svg @@ -45,5 +45,9 @@ + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/svg/exclamation.svg b/web/studio/ASC.Web.Studio/skins/default/images/svg/exclamation.svg new file mode 100644 index 000000000..2042474bf --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/svg/exclamation.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/svg/people/close.svg b/web/studio/ASC.Web.Studio/skins/default/images/svg/people/close.svg new file mode 100644 index 000000000..e79fe61fc --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/svg/people/close.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/svg/settings/recalculate_quota.svg b/web/studio/ASC.Web.Studio/skins/default/images/svg/settings/recalculate_quota.svg new file mode 100644 index 000000000..7fb2de48c --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/svg/settings/recalculate_quota.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/svg/share/lifetime.svg b/web/studio/ASC.Web.Studio/skins/default/images/svg/share/lifetime.svg new file mode 100644 index 000000000..70858158c --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/svg/share/lifetime.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/svg/share/password.svg b/web/studio/ASC.Web.Studio/skins/default/images/svg/share/password.svg new file mode 100644 index 000000000..1063bb313 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/svg/share/password.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/svg/share/trash.svg b/web/studio/ASC.Web.Studio/skins/default/images/svg/share/trash.svg new file mode 100644 index 000000000..f0752660a --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/svg/share/trash.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/svg/share/user_avatar_dark.svg b/web/studio/ASC.Web.Studio/skins/default/images/svg/share/user_avatar_dark.svg new file mode 100644 index 000000000..d3319c84d --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/svg/share/user_avatar_dark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/talk.svg b/web/studio/ASC.Web.Studio/skins/default/images/talk.svg new file mode 100644 index 000000000..52fb19601 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/talk.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/to_left.png b/web/studio/ASC.Web.Studio/skins/default/images/to_left.png deleted file mode 100644 index cb881aa3091b25495578e2a3e301dca0dbc8896c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 946 zcmV;j15NyiP)>&nQkDTMn>eB-WB-&2NOL*xdz)kKgsUFT!R^E zm(d?Mgv}k8qiR;R8eHFU2WF`Qs^!gmUO)ff;*dW8B(Vc%5D@=i*~ z3t>uzO*Txe7QX3A4+a%|j~q(^y@Quf=iufhG6;1^{_$!;+KDHV%Z2UwG+b~LMh&ZYOFyW3uC2tMnIYC zEpw%>HK&4|OW#Xd)kVEltdSdcIg$F;BP{X)gCB_;yL&MMg<{^TSpmXr?T=}GnsUf0?&Fg=(%bB4{XmylZ+VUXNH zQWmU+8JCGl)V6bh`F)o^R~AZ5WRDRdWM)oe7o91%Ks8p`qR8Os1a?IWRjYRp-OTkY zcm!bB+w^osDsQ1O0CQ(v*{lGY-6%~+8E{?yRE3zrCU`MnGh;cyXY$QS)r@wW*teMC z*-)*{feg2@6!}BplSwENjb7xP3+yVftj;jWfveTFDzQ9AZ<%0MH_33w0AEvC;pgtX znq%XeQYbUmJd@@0mju`~O;WI7vjvVsBH?iO@bK{9;9!4$e`jZBYiny`W5ev6t7(+f zG)lc*@8;&__V)JP-X3~_!5}V4`4VLe=Ba+a-{$K#>s5wP8E_sYr& zlBl8woiR2;zc4r& + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/to_right.png b/web/studio/ASC.Web.Studio/skins/default/images/to_right.png deleted file mode 100644 index 3f4f308449df419a78c5a2ba826fe0aa7e0f0d0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 959 zcmV;w13>(VP)ZrwOdgCMyjvNvvj)F2)Qv4ljqU=-^1!@&{e# zgoq#*n{p;$`poT1!%hHq=%3E4O0-iFy;C5bt)JniI%mxP%j(XxJa(>NCrQ~!z>lVv zC2EI6JDn5VcYG`E&?T~k;No`eLx-2{pO9$SPR$gNc1mc3Vk=2~tR=>tx;wsD(k^5R z!KLlmd-f%o8JDOhvlZ}BbIbAtE61~i;IcQGyJHIy#zsyXJs(-A9rS=B7J=udY>GE= zVzYc>v}W>#d9JKYlN#KnzG<1K6&7yw+=v-39+<$&?v)=Y!R2l0I_YUJXj*?p_W*i4aC5TRDXn~Q95^Ad|{)E$k zOL3LDP2z-C!;DeNG4dgl#Nf0zaiV+8P?3DJ@@0S0 zy(R}&wlKGiv!X;PtSs0{sCYp=raHZ|s)b2IO}^u*W(FhC3w}g|6X*FXD@^MRE&`Sl zJOnDrQk`&0Fly0|D1RuN7(_k5bvh@9(B`a`*eL(g5{l~}0SbcMIb8T(S z>-B=l7_B~^Z)0NvL3|WsQG?3#?7YmkizgHc0e^aWddxlt2M54l_ZZ=^R|Jto4Jx@7 h^3!njAAw5+{{=0YI0X;9sg3{u002ovPDHLkV1f+Vx8eW* diff --git a/web/studio/ASC.Web.Studio/skins/default/images/to_right.svg b/web/studio/ASC.Web.Studio/skins/default/images/to_right.svg new file mode 100644 index 000000000..7662fdea6 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/images/to_right.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/images/ui-icons_cccccc_256x240.png b/web/studio/ASC.Web.Studio/skins/default/images/ui-icons_cccccc_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..c5b59324dca486c95bfb24070fd5c15f3300874b GIT binary patch literal 7086 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 G&;$TPkuS;s literal 0 HcmV?d00001 diff --git a/web/studio/ASC.Web.Studio/skins/default/imagescss/name_action.png b/web/studio/ASC.Web.Studio/skins/default/imagescss/name_action.png index b1c7498e03634d9ddaa89458254e3eeec32e2c8a..c4b5ce14b1157f45078c813af03649796a541bc3 100644 GIT binary patch delta 329 zcmV-P0k;0X0^2&}*eY{CY($WKX~3a`KhFaaa5 zLPnrY6YilHC6S%ztRR{^$x@Vie*XLuhiKIwWQ^HLYMO*9%YSmm?KI~risGE6=@Wim z25Rs`!yu$>+XpwxK_=wuW_{%L@%MpT25Rv1S4fc%qzkE)QirOlYKb53r!odGd7huN z*7xxsQjk!;?sYKZ3zKD;VUWw%7z+{rqN$9Hdq|Sx#+`65-9FDQ>(Ux*lXO|<6unJ> z0HTFJ#0S_DL_#qj_*`+1_y!$AHchj)*1k~l-ZSWkfY>vFa31hVp4q!>)ZlR-KbQ1( buqvcC6?)*b4RXMv00000NkvXXu0mjfdDf5! delta 293 zcmV+=0owlK0>1)~BYyz~Nklfi1X#J2-$8 zbQ_aFTMrz8@lb$%tc)VOGN^BXJ$QhHLu5(sod2P3M9P3lkbfCapE;E^8>gu*qjKt! zd7E*Ch@lVoWY%1o36&x|*2$Lnm~n`RAak+$E7oSmdM#y}%V>LWh=?F_w#TqGT_xia z5=8`=m1B=6YstLJ diff --git a/web/studio/ASC.Web.Studio/skins/default/imagescss/security.png b/web/studio/ASC.Web.Studio/skins/default/imagescss/security.png deleted file mode 100644 index e510bdddd895adefdf3b4c0a8e219174d03bc8b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1398 zcmV-+1&R8JP)12+)%CCc z|Gif=qeKLNufN+z(o&X%N~J)hNLgt>rPG%660kvxS!|46CL$nm3^=1;A0j`b62$iMEuSZ!&!Ln;jNn!#m)B~w<-YH441Dh>s7=6` zJ1v;H3(&2I^yl-rp6+>Fy`#SGg`l^vH&%W^5CjB4aI{n^ zQ5qk|tJiT|cY*7=bi420zMP(0{0razx}?LcRJeY9gkrJC$8Z1aDFA(Yo!@%qQvmOy zA2%>OJWR1zZYOTW$7cJX_s;>zPRa9e%G{skvtfff| z0kJ#r$_0!TjI;u-gI^1!39jxzl@5mkI+S=S!E}?f30cEd63+_qk3-jbbR4EujB9m; zj+m=B#zuwU3C5CO+uUz%m4q(bg0a?6aRuLp!bPYID@+}tBL$?~L^H%u;R3GBl}8Qdy7vUDS=whBx@N;Q{@G|1d|@~fuUD^kvE{K{oK|5m_;!BRyQ zOjd>3>2L6F96<$D(ttumb(u&e3G=SGtdx?d4S}7GMdTh_$7mS@2B!g^IM3!Ym)*|~ zo$jBnf(fMRfsvc($@Js!&L*TXBdE56R7Q)}YE?E*yB1YKru%6zUh;=P4#-6A0Cvyu11*abIjo>i^sR1xOYO;+uq|DgXcg07*qoM6N<$ Ef)gB{4FCWD diff --git a/web/studio/ASC.Web.Studio/skins/default/imagescss/security.svg b/web/studio/ASC.Web.Studio/skins/default/imagescss/security.svg new file mode 100644 index 000000000..2cf1c984a --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/imagescss/security.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/imagescss/upload.png b/web/studio/ASC.Web.Studio/skins/default/imagescss/upload.png deleted file mode 100644 index 1d06c86b694909e938cd734d04ae9784c7e17db2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 829 zcmV-D1H$}?P)u3mm=oiXMF` z)1&~7+<8fJ3IQ&6_x}9^4t2et&VrBWIUgN44@d95q`w9@aO)X$=6w`A7d>H&g6p6o z>*8?NbDD6#z8g=evk;)*x%d<%_!e_~u5si&7c;Ux4&Hi369(9O?J>>%)x5WsppQ!o zNR2)&>kuCHUw@Js!O}j4d#*g9xy2lcfsZc(2_m7O>(0$EhQKmV@@$l&0lce(IJRa9 zYYAZYrH3?cN*=|)$LCsta76QZMAkA;@*R}J2=6Nqj;~+J#s%1Q@d3@Bl1DKcpf`#e zHXn(Y?mH+)HN2~YII&?F8xvs1h5NK%Y5~P;fSxEumH)YUJtAit=niqJz`E1dsZq?n>%#W@R2YLX@PQg?aoljuwe73fsP=(Xr>@e>QVIQB zHl3TdP4s;IirYKaHr)rzv{7=Uk;yP5S~tG|GYnkmRCQAWgi=tNkfbQAG(jlUS^!rX zToV%2e95?`iAX?0XbqlX353=VEeHH6n&!%euq{u3(_p+!mw@nJCP0vyAW|eCH9;t9 zEkJ4wNhtwDkgZN&2q0;a07?^HcfUl3F00000NkvXX Hu0mjf%>jE^ diff --git a/web/studio/ASC.Web.Studio/skins/default/imagescss/upload.svg b/web/studio/ASC.Web.Studio/skins/default/imagescss/upload.svg new file mode 100644 index 000000000..d54bbf404 --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/imagescss/upload.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/imagescss/welcometo_logo.png b/web/studio/ASC.Web.Studio/skins/default/imagescss/welcometo_logo.png deleted file mode 100644 index 2311b849dbb2c8ec56d8f6e0a37b29a138e1c8c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9300 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/skins/default/jquery-advansedfilter-fix.less b/web/studio/ASC.Web.Studio/skins/default/jquery-advansedfilter-fix.less index 82a88a457..2a72bc70a 100644 --- a/web/studio/ASC.Web.Studio/skins/default/jquery-advansedfilter-fix.less +++ b/web/studio/ASC.Web.Studio/skins/default/jquery-advansedfilter-fix.less @@ -1,19 +1,21 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "params.less"; .advansed-filter { margin-bottom: 32px; @@ -112,4 +114,84 @@ body.media-width-0-1030 div.advansed-filter { body.media-width-0-1024 div.advansed-filter { max-width: 687px; +} + +.ui-widget.ui-widget-content { + border-color: @border-ui-datepicker !important; +} + +.ui-widget-content { + background: @body-color !important; + color: @textColor !important; +} + +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default, .ui-button, html .ui-button.ui-state-disabled:hover, html .ui-button.ui-state-disabled:active { + border-color: @border-ui-datepicker-dark !important; + background-color: @bg-ui-datepicker-dark !important; + color: @color-ui-datepicker-dark !important; +} + +div.advansed-filter div.advansed-item-list ul.item-list li.item-item:hover { + background-color: @menu-selected-bg-filter !important; +} +div.advansed-filter div.advansed-filter-container { + background-color: @back-ground-text !important; +} +div.advansed-filter-container div.advansed-filter-filters div.btn-show-hidden-filters, div.advansed-filter-container div.advansed-filter-filters div.filter-item { + border-color: @bor-col-adv-fil !important; +} + +div.advansed-filter-container span.custom-combobox div.combobox-container { + background-color: @body-color !important; + border-color: @borderColor !important; +} + +div.advansed-filter-container span.custom-combobox div.combobox-container ul.combobox-options li.option-item { + background-color: @body-color !important; +} +div.advansed-filter-container span.custom-combobox div.combobox-container ul.combobox-options li.option-item:hover { + background-color: @menu-selected-bg-filter !important; +} + + +div.advansed-filter-container div.advansed-filter-filters div.filter-item span.group-selector span.custom-value span.inner-text, div.advansed-filter-container div.advansed-filter-filters div.filter-item span.group-selector span.default-value span.inner-text, div.advansed-filter-container div.advansed-filter-filters div.filter-item span.person-selector span.custom-value span.inner-text, div.advansed-filter-container div.advansed-filter-filters div.filter-item span.person-selector span.default-value span.inner-text { + color: @jquery-custom-color !important; +} + +div.advansed-filter-container span.custom-combobox span.combobox-title .inner-text { + border-bottom-color: @jquery-custom-color !important; +} +div.advansed-filter-container span.custom-combobox span.combobox-title { + color: @jquery-custom-color !important; +} +.ui-widget-header .ui-icon { + background-image: url("images/@{jquery-icons-light}") !important; +} +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon, .ui-buttton:hover .ui-icon, .ui-button:focus .ui-icon, .ui-state-default .ui-icon { + background-image: url("images/@{jquery-icons-light-hover}") !important; +} +div.advansed-filter label.advansed-filter-hint::after { + color: @body-color !important; + background-color: @menu-item-svg !important; +} + +div.advansed-filter-container div.advansed-filter-filters div.filter-item span.daterange-selector span.advansed-filter-datepicker-container { + background: @body-color !important; + border-color: @borderColor !important; +} + +.asc-datepicker .ui-widget-header { + background: @body-color url("images/@{asc-datepicker-bg}") 50% 50% repeat-x !important; +} + +.asc-datepicker .ui-state-default, .asc-datepicker .ui-widget-content .ui-state-default, .asc-datepicker .ui-widget-header .ui-state-default { + background: @body-color url("images/@{asc-datepicker-bg}") 50% 50% repeat-x !important; +} + +div.advansed-filter-container div.advansed-filter-filters div.filter-item span.daterange-selector span.advansed-filter-dateselector-date span.btn-show-datepicker-container span.btn-show-datepicker-title { + border-bottom-color: @jquery-custom-color !important; +} + +div.advansed-filter-container div.advansed-filter-filters div.filter-item span.daterange-selector span.advansed-filter-dateselector-date span.btn-show-datepicker-container { + color: @jquery-custom-color !important; } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/jquery-advansedfilter-theme.less b/web/studio/ASC.Web.Studio/skins/default/jquery-advansedfilter-theme.less index da406c2f5..187ba9b96 100644 --- a/web/studio/ASC.Web.Studio/skins/default/jquery-advansedfilter-theme.less +++ b/web/studio/ASC.Web.Studio/skins/default/jquery-advansedfilter-theme.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + div.advansed-filter label.advansed-filter-state:before{content: " "; position: absolute; width: 7px; height: 7px; border: 2px solid @advfilter-loupe; .borderRadius(7px); top: 1px; left: 1px; } div.advansed-filter label.advansed-filter-state:after{content: " "; position: absolute; width: 0; height: 6px; border-right: 2px solid @advfilter-loupe; top: 9px; left: 11px; .rotateTransform(135deg); } @@ -28,7 +28,7 @@ div.advansed-filter-container div.advansed-filter-filters div.filter-item{backgr div.advansed-filter-container div.advansed-filter-filters div.filter-item span.btn-delete{display:block; height:16px; line-height:16px; width:16px; margin:-8px 0 0; position:absolute; right:2px; top:50%; z-index:1; text-align:center; cursor:pointer; font-size: 18px; font-weight: 700; color:@advfilter-combobox-btns;} -div.advansed-filter-container div.advansed-filter-input label.advansed-filter-reset{display:none; width:15px; height:15px; line-height:14px; margin:-8px 0 0; position:absolute; right:-18px; top:50%; z-index:1; cursor:pointer;background-color:@advfilter-reset-btn; .borderRadius(15px); color: #fff; font-size:18px; font-weight:700; text-align: center;} +div.advansed-filter-container div.advansed-filter-input label.advansed-filter-reset{display:none; width:15px; height:15px; line-height:14px; margin:-8px 0 0; position:absolute; right:-18px; top:50%; z-index:1; cursor:pointer;background-color:@advfilter-reset-btn; .borderRadius(15px); color: @back-ground-text; font-size:18px; font-weight:700; text-align: center;} div.advansed-filter-container div.advansed-filter-button{.borderRadius(2px);} div.advansed-filter-container div.advansed-filter-button div.inner-text{position: relative;} @@ -41,3 +41,13 @@ div.advansed-filter-container div.advansed-filter-button div.inner-text:before{b div.advansed-filter-container div.advansed-filter-button div.inner-text span.text{background-color:@advfilter-add-btn-bkgd; color:@advfilter-add-btn-plus;border: 1px solid @border-button-default; border-right: 0 none;.borderRadius(2px);} div.advansed-filter-container span.custom-combobox span.combobox-title:after{border-left: 4px solid transparent; border-right: 4px solid transparent; border-top: 4px solid @advfilter-combobox-btns; content: ""; height: 0; position: absolute; right: 1px; top: 50%; width: 0; margin-top: -1px;} + +div.advansed-filter div.advansed-filter-container{border-color: @advansed-filter-container-bor !important;} + +div.advansed-filter-container div.advansed-filter-filters div.filter-item span.title {color: @filter-item-span-title !important;} + +div.advansed-filter-container div.advansed-filter-filters div.filter-item span.daterange-selector span.label {color: @filter-item-span-title !important;} +div.advansed-filter-container div.advansed-filter-input input {color: @advfilter-color !important;} + +div.advansed-filter div.advansed-item-list ul.item-list {background: @advfilter-combobox-bkgd !important; border-color: @advansed-filter-container-bor !important;} +div.advansed-filter div.advansed-item-list ul.item-list li.item-item.selected { color: @linkColor !important;} \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/jquery-advansedfilter.css b/web/studio/ASC.Web.Studio/skins/default/jquery-advansedfilter.css index 77181ae68..234ce43f2 100644 --- a/web/studio/ASC.Web.Studio/skins/default/jquery-advansedfilter.css +++ b/web/studio/ASC.Web.Studio/skins/default/jquery-advansedfilter.css @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/skins/default/jquery-advansedselector.less b/web/studio/ASC.Web.Studio/skins/default/jquery-advansedselector.less index b94d10abf..7b0ae6d3f 100644 --- a/web/studio/ASC.Web.Studio/skins/default/jquery-advansedselector.less +++ b/web/studio/ASC.Web.Studio/skins/default/jquery-advansedselector.less @@ -1,21 +1,22 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @import "../base.less"; +@import "params.less"; .advanced-selector-select { display: inline-block; @@ -94,11 +95,11 @@ .advanced-selector-add-text, .advanced-selector-add-new-text { - border-bottom: 1px dotted #333; + border-bottom: 1px dotted @textColor; } .advanced-selector-block { - border-bottom: 1px solid #d1d1d1; + border-bottom: 1px solid @borderColor; position: relative; } @@ -118,9 +119,9 @@ margin: 0 0 12px 0; position: relative; } -input[type="text"].advanced-selector-search-field, +input[type="text"].advanced-selector-search-field, input[type="text"].advanced-selector-search-field:focus { - border: solid 1px #c7c7c7; + border: solid 1px @borderColor2; font-size: 12px; height: 21px; padding: 0 25px 0 5px; @@ -171,11 +172,11 @@ input[type="text"].advanced-selector-search-field:focus { text-align: left; &.selected { - background-color: #f2f2f2; + background-color: @activeTable; } &:hover, &.active { - background-color: #e5e5e5; + background-color: @hoverTable; } &.disabled { @@ -195,34 +196,34 @@ input[type="text"].advanced-selector-search-field:focus { border-radius: 50%; margin: 0 8px 0 0; } -} - -.div-check() { - div { - background-color: transparent; - background-image: url("images/checkboxes.png"); - background-position: 0px 0px; - background-repeat: no-repeat; - margin: 0 8px 0 0; - height: 14px; - width: 14px; - border: 0 none; - padding: 0; - - &.checked { - background-position: -14px 0px; - } - - &.indeterminate { - background-position: -28px 0px; - } - } - - label { - display: block; - flex: 1; - .text-overflow(); - } +} + +.div-check() { + div { + background-color: transparent; + background-image: url("images/@{checkboxes-img}"); + background-position: 0px 0px; + background-repeat: no-repeat; + margin: 0 8px 0 0; + height: 14px; + width: 14px; + border: 0 none; + padding: 0; + + &.checked { + background-position: -14px 0px; + } + + &.indeterminate { + background-position: -28px 0px; + } + } + + label { + display: block; + flex: 1; + .text-overflow(); + } } .advanced-selector-list-items, @@ -245,7 +246,7 @@ input[type="text"].advanced-selector-search-field:focus { align-items: center; &:hover { - background-color: #e5e5e5; + background-color: @hoverTable; } input { @@ -262,14 +263,14 @@ input[type="text"].advanced-selector-search-field:focus { /*********Add New Container *********/ .advanced-selector-add-new-block { - border-right: 1px solid #d1d1d1; + border-right: 1px solid @borderColor; float: left; height: 260px; padding: 10px 10px 13px 10px; width: 195px; &.right-position { - border-left: 1px solid #d1d1d1; + border-left: 1px solid @borderColor; border-right: none; } } @@ -304,7 +305,7 @@ input[type="text"].advanced-selector-search-field:focus { top: 0; } .advanced-selector-field { - border: solid 1px #c7c7c7; + border: solid 1px @borderColor2; font-size: 12px; height: 21px; margin-bottom: 3px; @@ -347,16 +348,16 @@ select.advanced-selector-field { .advanced-selector-list-groups li.chosen label, .advanced-selector-all-select.chosen label { font-weight: bold; -} - -.advanced-selector-loader-list { - background: url(./images/loader_32.gif) no-repeat 0 0 transparent; - height: 32px; - width: 32px; - position: absolute; - top: 50%; - left: 50%; - margin: -16px 0 0 -16px; +} + +.advanced-selector-loader-list { + background: url("images/@{loader-gif-32}") no-repeat 0 0 transparent; + height: 32px; + width: 32px; + position: absolute; + top: 50%; + left: 50%; + margin: -16px 0 0 -16px; } .advanced-selector-no-results, @@ -371,7 +372,7 @@ select.advanced-selector-field { } .advanced-selector-loader { - background: url("images/loader_16.gif") no-repeat scroll 0 0 transparent; + background: url("images/@{loader-gif-16}") no-repeat scroll 0 0 transparent; color: #999999; font-size:11px; line-height: 18px; @@ -399,7 +400,7 @@ select.advanced-selector-field { } .advanced-selector-field-list { - background-color: #fff; + background-color: @body-color; border: 1px solid #ccc; display: none; max-height: 70px; @@ -420,11 +421,11 @@ select.advanced-selector-field { .text-overflow(); &.selected { - background-color: #f2f2f2; + background-color: @activeTable; } &:hover, &.active { - background-color: #e5e5e5; + background-color: @hoverTable; } } } @@ -435,7 +436,7 @@ select.advanced-selector-field { top:2px; left:2px; height: 16px; - background: url("images/loader_16.gif") no-repeat left center transparent; + background: url("images/@{loader-gif-16}") no-repeat left center transparent; } .advanced-selector-list-results { diff --git a/web/studio/ASC.Web.Studio/skins/default/jquery-emailadvansedselector.css b/web/studio/ASC.Web.Studio/skins/default/jquery-emailadvansedselector.less similarity index 80% rename from web/studio/ASC.Web.Studio/skins/default/jquery-emailadvansedselector.css rename to web/studio/ASC.Web.Studio/skins/default/jquery-emailadvansedselector.less index 204e3d1be..a4000c214 100644 --- a/web/studio/ASC.Web.Studio/skins/default/jquery-emailadvansedselector.css +++ b/web/studio/ASC.Web.Studio/skins/default/jquery-emailadvansedselector.less @@ -1,22 +1,24 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "params.less"; .emailselector { - border: 1px solid #C7C7C7; + border: 1px solid @borderColor2; cursor: text; display: block; margin: 0; @@ -26,6 +28,7 @@ overflow-y: auto; padding: 0; position: relative; + background-color: @back-ground-text; } .emailselector-hidden-input { @@ -36,8 +39,8 @@ .emailselector-item { border: 1px solid; - border-color: #e9e9e9; - background-color: #e9e9e9; + border-color: @menu-selected-bg; + background-color: @menu-selected-bg; display: inline-block; font-size: 12px; height: 16px; @@ -48,25 +51,26 @@ padding: 0 20px 0 6px; position: relative; white-space: nowrap; - - text-overflow: ellipsis; -o-text-overflow: ellipsis; -moz-text-overflow: ellipsis; -webkit-text-overflow: ellipsis; - + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + -moz-text-overflow: ellipsis; + -webkit-text-overflow: ellipsis; vertical-align: middle; cursor: pointer; float: left; -} - -.emailselector-item:hover { - border-color: #83888d; -} - -.emailselector-item.error { - background-color: #ffbfaa; - border-color: #ffbfaa; -} - -.emailselector-item.selected { - border-color: #83888d; +} + +.emailselector-item:hover { + border-color: @emailselector-item-hover; +} + +.emailselector-item.error { + background-color: @emailselector-item-error; + border-color: @emailselector-item-error; +} + +.emailselector-item.selected { + border-color: @emailselector-item-hover; } .emailselector-item.edit { @@ -82,12 +86,12 @@ } .emailselector-item-close { - background-color: #fff; + background-color: @body-color; border: 0 none; - border-radius: 12px; + border-radius: 12px; -moz-border-radius: 12px; -webkit-border-radius: 12px; - color: #666; + color: @textColorBlackDark; cursor: pointer; font-size: 12px; font-weight: 100; diff --git a/web/studio/ASC.Web.Studio/skins/default/jstree/themes/default/dark-style.less b/web/studio/ASC.Web.Studio/skins/default/jstree/themes/default/dark-style.less new file mode 100644 index 000000000..62950680c --- /dev/null +++ b/web/studio/ASC.Web.Studio/skins/default/jstree/themes/default/dark-style.less @@ -0,0 +1,7 @@ +/* jsTree default theme */ +@import "style.less"; + +@clicked-gradient-color-1: #3D3D3D; +@clicked-gradient-color-2: #3D3D3D; +@clicked-bg-color: #3D3D3D; +@throbber-gif: url("@{image-path}throbber-dark-12.svg"); \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/jstree/themes/default/style.less b/web/studio/ASC.Web.Studio/skins/default/jstree/themes/default/style.less index ce00b1bd5..67b656314 100644 --- a/web/studio/ASC.Web.Studio/skins/default/jstree/themes/default/style.less +++ b/web/studio/ASC.Web.Studio/skins/default/jstree/themes/default/style.less @@ -17,6 +17,7 @@ @responsive: true; @image-path: "/skins/default/images/jstree/"; @base-height: 32px; +@throbber-gif: url("@{image-path}throbber.gif"); @import "../mixins.less"; @import "../base.less"; diff --git a/web/studio/ASC.Web.Studio/skins/default/jstree/themes/mixins.less b/web/studio/ASC.Web.Studio/skins/default/jstree/themes/mixins.less index 325eefa9a..c4aed1ded 100644 --- a/web/studio/ASC.Web.Studio/skins/default/jstree/themes/mixins.less +++ b/web/studio/ASC.Web.Studio/skins/default/jstree/themes/mixins.less @@ -80,7 +80,7 @@ } .jstree-themeicon-custom { background-color:transparent; background-image:none; background-position:0 0; } - > .jstree-container-ul .jstree-loading > .jstree-ocl { background:url("@{image-path}throbber.gif") center center no-repeat; } + > .jstree-container-ul .jstree-loading > .jstree-ocl { background:@throbber-gif center center no-repeat; } .jstree-file { background:url("@{image}") -(@image-height * 3 + @correction) -(@image-height * 2 + @correction) no-repeat; } .jstree-folder { background:url("@{image}") -(@image-height * 8 + @correction) -(@correction) no-repeat; } diff --git a/web/studio/ASC.Web.Studio/skins/default/layout-desktop.less b/web/studio/ASC.Web.Studio/skins/default/layout-desktop.less index f336b533c..8daf2bd5e 100644 --- a/web/studio/ASC.Web.Studio/skins/default/layout-desktop.less +++ b/web/studio/ASC.Web.Studio/skins/default/layout-desktop.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + body { overflow: hidden; } diff --git a/web/studio/ASC.Web.Studio/skins/default/layout-media.less b/web/studio/ASC.Web.Studio/skins/default/layout-media.less index ca117a284..21b16f8cb 100644 --- a/web/studio/ASC.Web.Studio/skins/default/layout-media.less +++ b/web/studio/ASC.Web.Studio/skins/default/layout-media.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @media (min-width: 1200px) { body { overflow: hidden; diff --git a/web/studio/ASC.Web.Studio/skins/default/layout.less b/web/studio/ASC.Web.Studio/skins/default/layout.less index e0c6dd595..1caac546b 100644 --- a/web/studio/ASC.Web.Studio/skins/default/layout.less +++ b/web/studio/ASC.Web.Studio/skins/default/layout.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + html { height: 100%; } diff --git a/web/studio/ASC.Web.Studio/skins/default/links.less b/web/studio/ASC.Web.Studio/skins/default/links.less index 613d651c4..7f8a19f62 100644 --- a/web/studio/ASC.Web.Studio/skins/default/links.less +++ b/web/studio/ASC.Web.Studio/skins/default/links.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -75,7 +75,7 @@ a { vertical-align: middle; &:after { - color: #83888d; + color: @link-plus-after; content: "+"; cursor: pointer; display: block; diff --git a/web/studio/ASC.Web.Studio/skins/default/lists.less b/web/studio/ASC.Web.Studio/skins/default/lists.less index 3f95bab15..25653c207 100644 --- a/web/studio/ASC.Web.Studio/skins/default/lists.less +++ b/web/studio/ASC.Web.Studio/skins/default/lists.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/skins/default/main-page-container.less b/web/studio/ASC.Web.Studio/skins/default/main-page-container.less index 5ccad7552..acb6ab94c 100644 --- a/web/studio/ASC.Web.Studio/skins/default/main-page-container.less +++ b/web/studio/ASC.Web.Studio/skins/default/main-page-container.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @import "../base.less"; /*---------------- container for main page ------------------------*/ diff --git a/web/studio/ASC.Web.Studio/skins/default/main-title-icon.less b/web/studio/ASC.Web.Studio/skins/default/main-title-icon.less index e6d2e47c3..409948d89 100644 --- a/web/studio/ASC.Web.Studio/skins/default/main-title-icon.less +++ b/web/studio/ASC.Web.Studio/skins/default/main-title-icon.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + .main-title-svg { width:inherit; height:inherit; diff --git a/web/studio/ASC.Web.Studio/skins/default/main.less b/web/studio/ASC.Web.Studio/skins/default/main.less index 38a6352b3..2306b40d4 100644 --- a/web/studio/ASC.Web.Studio/skins/default/main.less +++ b/web/studio/ASC.Web.Studio/skins/default/main.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/skins/default/page-tabs-navigators.less b/web/studio/ASC.Web.Studio/skins/default/page-tabs-navigators.less index 3be820fea..b7f0e0686 100644 --- a/web/studio/ASC.Web.Studio/skins/default/page-tabs-navigators.less +++ b/web/studio/ASC.Web.Studio/skins/default/page-tabs-navigators.less @@ -1,27 +1,29 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "params.less"; /*--------------------PAGE NAVIGATOR------------------------------*/ .pagerNavBaseCSSClass() { - background-color: #FFF; + background-color: @body-color; display: inline-block; text-align: center; text-decoration: none; - color: #666666; + color: @textColorBlackDark; font-size: 12px; } @@ -33,7 +35,7 @@ margin: 3px 8px 4px 8px; } .pagerNavigationLinkCSSClass:hover { - color: #666666; + color: @textColorBlackDark; text-decoration: underline; } @@ -54,8 +56,8 @@ } .pagerPrevButtonCSSClass:hover, .pagerNextButtonCSSClass:hover { - color: #666666; - text-decoration:underline; + color: @textColorBlackDark; + text-decoration: underline; } .pagerPrevButtonCSSClass, .pagerPrevButtonCSSClass:visited, @@ -96,9 +98,9 @@ width: 0; } .pagerCurrentPosition { - background-color: #E9E9E9; + background-color: @menu-selected-bg; border: none; - color: #666666; + color: @textColorBlackDark; display: inline-block; font-weight: bolder; font-size: 12px; @@ -136,9 +138,9 @@ .tabsNavigationLink:hover, .tabsNavigationLink:active, .tabsNavigationLink:visited { - background-color: #FFFFFF; + background-color: @body-color; cursor: pointer; - color: #333333; + color: @textColor; display: inline-block; font-size: 12px; margin: 5px 8px; @@ -147,7 +149,7 @@ text-decoration: none; &:hover { - color: #333333; + color: @textColor; text-decoration: underline; } } @@ -155,14 +157,14 @@ .tabsNavigationLink.selectedTab, .tabsNavigationLink.selectedTab:active, .tabsNavigationLink.selectedTab:visited { - color: #333333; + color: @textColor; cursor: default; font-weight: bold; margin: 5px 8px; text-decoration: none; &:hover { - color: #333333; + color: @textColor; text-decoration: none; } } diff --git a/web/studio/ASC.Web.Studio/skins/default/params.less b/web/studio/ASC.Web.Studio/skins/default/params.less index b7745a38d..a5f6ae289 100644 --- a/web/studio/ASC.Web.Studio/skins/default/params.less +++ b/web/studio/ASC.Web.Studio/skins/default/params.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,14 +39,17 @@ @defaultButtonTextColor: #fff; @grayButtonTextColor: @textColorBlackDark; +@itemRowButtonTextColor: @grayButtonTextColor; @grayButtonTextColorDisable: @textColorBlackLight; @tablePadding: 8px; @borderColor: #D1D1D1; @hoverTable: #e5e5e5; @activeTable: #f2f2f2; - +@borderColor2: #c7c7c7; @plusOnGrayBtn: #50565c; +@ui-state-highlight: #fefde9; +@greyPhoneButtonTextColor: @textColorBlackDark; // Top Studio Panel // ------------------------- @bg-header: #3d4a6b; @@ -55,6 +58,54 @@ @bg-header-icon-lable: #4ca5d6; +@bodyColor2: white; +@body-color: #FFF; +@bg-dashboard: #FFF; +@bg-container: #FFF; +@menu-selected-bg: #E9E9E9; +@bg-settings-block:#333; +@bg-dashboard-title:#333; +@bg-dropdown-separator: #E4E4E4; +@bg-main-container:#FFF; +@bg-border-base:#d1d1d1; +@bg-tint-medium: #FFF; +@bg-a-activate: #000; +@contentMenu:#FFF; +@pageTitle:#333; +@backdrop-bg: #000; + +@buttons-checkbox-on-color: white; +@buttons-chackbox-off-color: white; +@buttons-checkbox-on-bg: #3b72a7; +@buttons-checkbox-off-bg: #aeaeae; +@buttons-checkbox-off-bor: none; +@buttons-checkbox-on-off-color: #cecece; +@buttons-checkbox-on-off-bg: #f0f0f0; + +@addition-info: #BFBFBF; +@popup-bg-color: #FFF8DC; +@popup-helper-col: #333; +@popup-helper-bor: #efede8; +@corner-help-block: #FFF8DC; +@corner-help-block-before: #EDEDED; +@corner-help-block-before-2: #b8b8b8; +@datepick-ui-bg: #ddd; + +@back-ground-text: #fff; +@text-edit-calendar: #AFB2B7; +@disabled: #efefef; +@invite-border: #DFDFDF; +@switcher: #F3F3F3; + +@user-photo-dialog:#FCFCFC; +@user-photo-dialog-bor: #bfbfbf; + +@border-ui-datepicker: #c5c5c5; +@border-ui-datepicker-dark: #fff; +@bg-ui-datepicker-dark: #f6f6f6; +@color-ui-datepicker-dark: #454545; +@menu-selected-bg-filter: #e9e9e9; + .bg-header-icon-lable() { background-color: @bg-header-icon-lable; } @@ -132,6 +183,7 @@ @bg-button-default: #ebebeb; @bg-button-default-hover: #f5f5f5; @bg-button-default-active: #e2e2e2; +@bg-progress-dialog-header: #e2e2e2; @bg-button-default-disable: #f7f7f7; @@ -151,6 +203,27 @@ } } +@bg-button-default-menuAction: #ebebeb; +@bg-button-default-hover-menuAction: #f5f5f5; +@bg-button-default-active-menuAction: #e2e2e2; +@bg-button-default-disable-menuAction: #f7f7f7; + +.bg-button-default-menuAction () { + background-color: @bg-button-default-menuAction; + + &:hover { + background-color: @bg-button-default-hover-menuAction; + } + + &:active { + background-color: @bg-button-default-active-menuAction; + } + + &.disable { + background-color: @bg-button-default-disable-menuAction; + } +} + @bg-button-action: #4ca5d6; @bg-button-action-hover: #54b2e6; @bg-button-action-active: #81BFE2; @@ -173,12 +246,33 @@ } } +@bg-button-grey-phone: #ebebeb; +@bg-button-grey-phone-hover: #f5f5f5; +@bg-button-grey-phone-active: #e2e2e2; +@bg-button-grey-phone-disable: #f7f7f7; + +.bg-button-grey-phone() { + background-color: @bg-button-grey-phone; + + &:hover { + background-color: @bg-button-grey-phone-hover; + } + + &:active { + background-color: @bg-button-grey-phone-active; + } + + &.disable { + background-color: @bg-button-grey-phone-disable; + } +} // Buttons border style // ------------------------- @border-button-default: #c4c4c4; @border-button-default-hover: #d4d4d4; @border-button-default-active: #dadada; @border-button-default-disable: #ebebeb; +@border-button-default-item-row: @border-button-default; .border-button-default (){ .borderButtons(@border-button-default); @@ -196,6 +290,27 @@ } } +@border-button-default-menuAction: #c4c4c4; +@border-button-default-hover-menuAction: #d4d4d4; +@border-button-default-active-menuAction: #dadada; +@border-button-default-disable-menuAction: #ebebeb; + +.border-button-default-menuAction () { + .borderButtons(@border-button-default-menuAction); + + &:hover { + .borderButtons(@border-button-default-hover-menuAction); + } + + &:active { + .borderButtons(@border-button-default-active-menuAction); + } + + &.disable { + .borderButtons(@border-button-default-disable-menuAction); + } +} + // Entity menu colors // ------------------------- @entity-menu-color : #cecece; @@ -206,10 +321,162 @@ // ------------------------- @advfilter-combobox-btns : #888888; -@advfilter-combobox-bkgd : #EDF6FD; +@advfilter-combobox-bkgd : #fff; @advfilter-reset-btn : #CCCCCC; @advfilter-add-btn-plus : #50565c; @advfilter-add-btn-bkgd : #EBEBEB; @advfilter-loupe : #83888d; +@advansed-filter-container-bor: #A5A5A5; +@filter-item-span-title: #333; +@advfilter-color: #333; + +@bor-col-adv-fil: #D4E4EC; + +//toastr +@toast-container-success-bg: #bcdf7e; +@toast-container-warning-bg: #eeb97b; +@toast-container-error-bg: #ffa98d; +@toast-container-info-bg: #eed27b; + +@toast-bg: #030303; +@toast-success: #cae796; +@toast-error: #ffbfaa; +@toast-info: #f1da92; +@toast-warning: #f1ca92; + +@toast-bg-bor: none; +@toast-success-bor: none; +@toast-error-bor: none; +@toast-info-bor: none; +@toast-warning-bor: none; + +@toast-success-hover: none; +@toast-error-hover: none; +@toast-info-hover: none; +@toast-warning-hover: none; + +@toast-bg-color: #000; +@toast-success-color: #000; +@toast-error-color: #000; +@toast-info-color: #000; +@toast-warning-color: #000; + +@toast-success-color-hover: #000; +@toast-error-color-hover: #000; +@toast-info-color-hover: #000; +@toast-warning-color-hover: #000; + +@active-color-button-group: #999999; +@active-color-bg-button-group: #999999; +// Beta label +//-------------------------- +@beta-background: #E6E6E6; +@beta-text: #83888D; + +@checkboxes-img: "checkboxes.png"; +@hmenu-selected-img: "hmenu-selected.png"; + +@border-line-profile: #d1d1d1; + +@menu-item-svg: #83888d; + + +@checkbox-accent-color: auto; +@checkbox-color-sheme: light; + +@corner-img: "corner.png"; +@jquery-custom-color: #1A6DB3; +@jquery-icons-light: "ui-icons_444444_256x240.png"; +@jquery-icons-light-hover: "ui-icons_555555_256x240.png"; +@sort-down: #212121; +@sort-down-gray: #83888C; +@tl-combobox-container-hover: #e9e9e9; + +@help-center-notelist-bg: #EFEFEF; +@help-center-notelist-color: #808080; +@help-center-content-a-col: #3D4A6B; +@asc-datepicker-bg: "ui-bg_flat_100_ffffff_40x100.png"; +@button-span-default-color: #666666; + +@loader-gif-32: "loader_32.gif"; +@loader-gif-16: "loader_16.gif"; +@loader-gif-48: "loader_48.gif"; +@loader-managament-16: "loader_16.gif"; +@on-off-on-button-before-bg: #3b72a7; +@on-off-on-button-after-bg: #f0f0f0; +@on-off-on-button-after-bor: #cecece; + +@on-off-off-button-before-bg: #aeaeae; +@on-off-off-button-before-color: white; +@on-off-off-button-before-bor: none; +@studio-top-panel-svg: #CFD9E3; +@product-menu-active-icon: #cfd9e3; +@top-item-box-hover: #fff; +@link-plus-after: #83888d; +@a-link-describe: #646567; +@menu-addblock-color: #83888D; + +@info-box-excl-bg: #F5E1A2; +@info-box-excl-bor: none; + +@info-box-excl-close: url('@{imagesBaseUrl}close.png'); + +// Loader style +// ------------------------- + +//ronb red +@loader-romb-red-col: #de7a59; +@loader-romb-red-col10: #F2CBBF; +@loader-romb-red-col20: #E6E4E4; +@loader-romb-red-col30: #D2D2D2; + +//romb green +@loader-romb-green-col: #a1cb5c; +@loader-romb-green-col10: #CBE0AC; +@loader-romb-green-col25: #EFEFEF; +@loader-romb-green-col30: #E6E4E4; + +//romb blue +@loader-romb-blue-col: #55bce6; +@loader-romb-blue-col10: #BFE8F8; +@loader-romb-blue-col45: #EFEFEF; + +@loader-page-text-color: #888; + + +@subscription-dscr: #F5F5F5; +@saas-tariffs-line: #D7D7D7; +@subscription-period-bor: #BEBEBE; + + +@progress-wrapper: #d1d1d1; +@textEditCalendarDisabled: #666562; +@popupContainerHeaderBlock: #e2e2e2; + +@error-popup-col: #f5e1a2; +@error-popup-bor: none; +@error-popup-close-col: #9E9C61; +@ui-autocomplete-a-col: black; +@input-disabled-col: #666562; +@okBox-bg: #E5EFD1; +@okBox-col: #74af00; +@okBox-bor: #dddddd; +@notify-panel-info-bg: #f5e1a2; +@notify-panel-error-bg: #ffbfaa; +@notify-panel-succes-bg: #cae796; +@notify-panel-info-bor: none; +@notify-panel-error-bor: none; +@notify-panel-succes-bor: none; +@icon-arrow: "icon_arrow.svg"; +@toggle-switcher-bg: #CCCCCC; +@pwdloginTextbox-col: #434341; +@action-panel-context-bg: #767676; +@user-avatar-svg: "user_avatar.svg"; +@EmptyDocumentPanel-a: #116d9d; +@emailselector-item-error: #ffbfaa; +@emailselector-item-hover: #83888d; +@ldap-color: #FADB8F; +@jqCron-selector-title-bor: #c1c1c1;@settings-help-block-p: #787878; +@email-warning: #666668; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/phonecontroller.css b/web/studio/ASC.Web.Studio/skins/default/phonecontroller.less similarity index 97% rename from web/studio/ASC.Web.Studio/skins/default/phonecontroller.css rename to web/studio/ASC.Web.Studio/skins/default/phonecontroller.less index 5445598bb..5318a1f52 100644 --- a/web/studio/ASC.Web.Studio/skins/default/phonecontroller.css +++ b/web/studio/ASC.Web.Studio/skins/default/phonecontroller.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,427 +15,429 @@ */ -span.phoneControlContainer { - display: inline-block; - position: relative; -} -span.phoneControlContainer .phoneControlSwitherWrapper { - border: 1px solid #999; - border-right: none; - display: block; - height: 34px; - line-height: 34px; - padding: 0; -} -span.phoneControlContainer .phoneControlSwitherWrapper { - border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 4px; - -webkit-border-top-right-radius: 3px 0 0 3px; -} -span.phoneControlContainer .phoneControlInputContainer { - border: 1px solid #999; - border-left: none; - height: 34px; - line-height: 34px; - padding: 0 5px 0 0; -} -span.phoneControlContainer .phoneControlInputContainer { - border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - -webkit-border-top-right-radius: 0 3px 3px 0; -} -span.phoneControlContainer.error .phoneControlSwitherWrapper, -span.phoneControlContainer.error .phoneControlInput, -span.phoneControlContainer.error .phoneControlInputContainer { - border-color: #BF3703; -} -span.phoneControlContainer .phoneControlSwither { - cursor: pointer; - border: none; - position: relative; -} -.dataItem.dataItemPhone .phoneControlSwither:hover { - background-color: #EEE; -} - -span.phoneControlContainer .phoneControlSwither:after { - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 4px solid #333; - content: ""; - height: 0; - margin-top: -2px; - position: absolute; - right: 8px; - top: 50%; - width: 0; -} - -span.phoneControlContainer .phoneControlInput { - border: none; - padding: 7px 10px 7px 5px; - margin-left: 0; - max-height: 20px; - width: 250px; -} -span.phoneControlContainer .phoneControlInput { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - -moz-border-radius-topleft: 0; - -moz-border-radius-bottomleft: 0; - -webkit-border-top-left-radius: 0; - -webkit-border-bottom-left-radius: 0; -} - -#phoneControlDropDown { - padding-left: 10px; -} -#phoneControlDropDown ul.dropdown-content { - max-height: 260px; - max-width: 280px; -} - -#phoneControlDropDown ul.dropdown-content li{ - min-height: 23px; - padding: 0; -} -#phoneControlDropDown ul.dropdown-content a.dropdown-item { - color: #333; - display: block; - line-height: 15px; - margin: 2px 0 2px 8px; - padding: 1px 1px 1px 2px; - white-space: normal; -} -#phoneControlDropDown ul.dropdown-content li.selected { - background-color: #EEE; -} -#phoneControlDropDown ul.dropdown-content li div.fg-item, -.phoneControlSwitherWrapper .phoneControlSwither .selectedPhoneCountry { - background-image: url("imagescss/flags.gif"); - background-color: transparent; - background-repeat: no-repeat; - height: 11px; - vertical-align: middle; - width: 16px; -} -#phoneControlDropDown ul.dropdown-content li div.fg-item { - background-position: 0 15px; - display: inline-block; - float: left; - line-height: 15px; - margin: 5px 0 3px 10px; -} -.phoneControlSwitherWrapper .phoneControlSwither .selectedPhoneCountry { - display: inline-block; - line-height: 15px; - margin: 10px 0 0 10px; -} - -.fg_AL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AL { background-position: 0 -1034px; } -.fg_AU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AU { background-position: 0 -1716px; } -.fg_AT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AT { background-position: 0 -1331px; } -.fg_AZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AZ { background-position: 0 -1243px; } -.fg_DZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_DZ { background-position: 0 -528px; } -.fg_AS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AS { background-position: 0 -1562px; } -.fg_AI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AI { background-position: 0 -1980px; } -.fg_AO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AO { background-position: 0 -1947px; } -.fg_AD, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AD { background-position: 0 -594px; } -.fg_AG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AG { background-position: 0 -869px; } -.fg_AR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AR { background-position: 0 -2377px; } -.fg_AM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AM { background-position: 0 -176px; } -.fg_AW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AW { background-position: 0 -792px; } -.fg_AF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AF { background-position: 0 -2311px; } -.fg_BS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BS { background-position: 0 -363px; } -.fg_BD, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BD { background-position: 0 -1771px; } -.fg_BB, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BB { background-position: 0 -1573px; } -.fg_BH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BH { background-position: 0 -1496px; } -.fg_BY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BY { background-position: 0 -1100px; } -.fg_BZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BZ { background-position: 0 -484px; } -.fg_BE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BE { background-position: 0 0; } -.fg_BJ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BJ { background-position: 0 -1298px; } -.fg_BM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BM { background-position: 0 -1914px; } -.fg_BG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BG { background-position: 0 -2586px; } -.fg_BO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BO { background-position: 0 -1650px; } -.fg_BQ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BQ { background-position: 0 -2719px; } -.fg_BA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BA { background-position: 0 -1584px; } -.fg_BW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BW { background-position: 0 -2707px; } -.fg_BR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BR { background-position: 0 -770px; } -.fg_IO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IO { background-position: 0 -55px; } -.fg_VG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_VG { background-position: 0 -1408px; } -.fg_BN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BN { background-position: 0 -1683px; } -.fg_BF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BF { background-position: 0 -726px; } -.fg_BI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BI { background-position: 0 -1892px; } -.fg_BT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BT { background-position: 0 -1848px; } -.fg_VU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_VU { background-position: 0 -1265px; } -.fg_VA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_VA { background-position: 0 -2322px; } -.fg_GB, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GB { background-position: 0 -55px; } -.fg_HU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_HU { background-position: 0 -682px; } -.fg_VE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_VE { background-position: 0 -1056px; } -.fg_VI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_VI { background-position: 0 -1782px; } -.fg_VN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_VN { background-position: 0 -968px; } -.fg_GA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GA { background-position: 0 -880px; } -.fg_HT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_HT { background-position: 0 -319px; } -.fg_GY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GY { background-position: 0 -803px; } -.fg_GM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GM { background-position: 0 -627px; } -.fg_GH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GH { background-position: 0 -2112px; } -.fg_GP, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GP { background-position: 0 -407px; } -.fg_GT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GT { background-position: 0 -935px; } -.fg_GN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GN { background-position: 0 -2575px; } -.fg_GW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GW { background-position: 0 -1925px; } -.fg_DE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_DE { background-position: 0 -2509px; } -.fg_GI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GI { background-position: 0 -275px; } -.fg_HN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_HN { background-position: 0 -2156px; } -.fg_HK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_HK { background-position: 0 -2696px; } -.fg_GD, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GD { background-position: 0 -2399px; } -.fg_GL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GL { background-position: 0 -1760px; } -.fg_GR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GR { background-position: 0 -165px; } -.fg_GE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GE { background-position: 0 -858px; } -.fg_GU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GU { background-position: 0 -2366px; } -.fg_DK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_DK { background-position: 0 -1386px; } -.fg_CD, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CD { background-position: 0 -1518px; } -.fg_DJ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_DJ { background-position: 0 -2101px; } -.fg_DM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_DM { background-position: 0 -2432px; } -.fg_DO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_DO { background-position: 0 -1529px; } -.fg_EG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_EG { background-position: 0 -2201px; } -.fg_ZM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ZM { background-position: 0 -1595px; } -.fg_ZW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ZW { background-position: 0 -2046px; } -.fg_IL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IL { background-position: 0 -341px; } -.fg_IN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IN { background-position: 0 -1694px; } -.fg_ID, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ID { background-position: 0 -1958px; } -.fg_JO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_JO { background-position: 0 -1463px; } -.fg_IQ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IQ { background-position: 0 -649px; } -.fg_IR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IR { background-position: 0 -2013px; } -.fg_IE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IE { background-position: 0 -1969px; } -.fg_IS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IS { background-position: 0 -1991px; } -.fg_ES, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ES { background-position: 0 -1155px; } -.fg_IT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IT { background-position: 0 -143px; } -.fg_YE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_YE { background-position: 0 -1672px; } -.fg_KZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KZ { background-position: 0 -1210px; } -.fg_KY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KY { background-position: 0 -308px; } -.fg_KH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KH { background-position: 0 -242px; } -.fg_CM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CM { background-position: 0 -2057px; } -.fg_CA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CA { background-position: 0 -1375px; } -.fg_QA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_QA { background-position: 0 -462px; } -.fg_KE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KE { background-position: 0 -2630px; } -.fg_CY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CY { background-position: 0 -561px; } -.fg_KG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KG { background-position: 0 -1617px; } -.fg_KI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KI { background-position: 0 -374px; } -.fg_CN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CN { background-position: 0 -825px; } -.fg_CO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CO { background-position: 0 -330px; } -.fg_KM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KM { background-position: 0 -1430px; } -.fg_CG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CG { background-position: 0 -1793px; } -.fg_CR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CR { background-position: 0 -2090px; } -.fg_CI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CI { background-position: 0 -1661px; } -.fg_CU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CU { background-position: 0 -748px; } -.fg_KW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KW { background-position: 0 -2487px; } -.fg_CW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CW { background-position: 0 -2729px; } -.fg_LA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LA { background-position: 0 -451px; } -.fg_LV, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LV { background-position: 0 -1936px; } -.fg_LS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LS { background-position: 0 -2190px; } -.fg_LR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LR { background-position: 0 -2068px; } -.fg_LB, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LB { background-position: 0 -1254px; } -.fg_LY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LY { background-position: 0 -132px; } -.fg_LT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LT { background-position: 0 -1122px; } -.fg_LI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LI { background-position: 0 -979px; } -.fg_LU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LU { background-position: 0 -1474px; } -.fg_MU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MU { background-position: 0 -2179px; } -.fg_MR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MR { background-position: 0 -253px; } -.fg_MG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MG { background-position: 0 -1287px; } -.fg_MO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MO { background-position: 0 -2597px; } -.fg_MK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MK { background-position: 0 -1353px; } -.fg_MW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MW { background-position: 0 -2145px; } -.fg_MY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MY { background-position: 0 -1870px; } -.fg_ML, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ML { background-position: 0 -2520px; } -.fg_MV, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MV { background-position: 0 -616px; } -.fg_MT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MT { background-position: 0 -1551px; } -.fg_MA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MA { background-position: 0 -2333px; } -.fg_MQ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MQ { background-position: 0 -198px; } -.fg_MH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MH { background-position: 0 -1144px; } -.fg_MX, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MX { background-position: 0 -2024px; } -.fg_MZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MZ { background-position: 0 -638px; } -.fg_MD, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MD { background-position: 0 -2685px; } -.fg_MC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MC { background-position: 0 -913px; } -.fg_MN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MN { background-position: 0 -2553px; } -.fg_MS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MS { background-position: 0 -583px; } -.fg_MM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MM { background-position: 0 -11px; } -.fg_NA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NA { background-position: 0 -1881px; } -.fg_NR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NR { background-position: 0 -1749px; } -.fg_NP, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NP { background-position: 0 -110px; } -.fg_NE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NE { background-position: 0 -550px; } -.fg_NG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NG { background-position: 0 -2476px; } -.fg_NL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NL { background-position: 0 -1441px; } -.fg_NI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NI { background-position: 0 -154px; } -.fg_NU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NU { background-position: 0 -2079px; } -.fg_NZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NZ { background-position: 0 -1540px; } -.fg_NC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NC { background-position: 0 -1276px; } -.fg_NO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NO { background-position: 0 -836px; } -.fg_AE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AE { background-position: 0 -2223px; } -.fg_TC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TC { background-position: 0 -1309px; } -.fg_BL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BL { background-position: 0 -1012px; } -.fg_SH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SH { background-position: 0 -495px; } -.fg_OM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_OM { background-position: 0 -2454px; } -.fg_CV, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CV { background-position: 0 -2652px; } -.fg_CK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CK { background-position: 0 -2267px; } -.fg_AC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AC { background-position: 0 -55px; } -.fg_NF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NF { background-position: 0 -209px; } -.fg_MF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MF { background-position: 0 -55px; } -.fg_PK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PK { background-position: 0 -2035px; } -.fg_PW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PW { background-position: 0 -231px; } -.fg_PS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PS { background-position: 0 -1199px; } -.fg_PA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PA { background-position: 0 -847px; } -.fg_PG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PG { background-position: 0 -1485px; } -.fg_PY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PY { background-position: 0 -2344px; } -.fg_PE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PE { background-position: 0 -946px; } -.fg_PL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PL { background-position: 0 -1177px; } -.fg_PT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PT { background-position: 0 -517px; } -.fg_PR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PR { background-position: 0 -473px; } -.fg_KR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KR { background-position: 0 -2245px; } -.fg_RE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_RE { background-position: 0 -264px; } -.fg_RU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_RU { background-position: 0 -660px; } -.fg_RW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_RW { background-position: 0 -2674px; } -.fg_RO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_RO { background-position: 0 -671px; } -.fg_SV, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SV { background-position: 0 -1639px; } -.fg_WS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_WS { background-position: 0 -2300px; } -.fg_SM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SM { background-position: 0 -2123px; } -.fg_ST, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ST { background-position: 0 -2388px; } -.fg_SA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SA { background-position: 0 -33px; } -.fg_SZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SZ { background-position: 0 -2278px; } -.fg_KP, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KP { background-position: 0 -1804px; } -.fg_MP, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MP { background-position: 0 -704px; } -.fg_SC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SC { background-position: 0 -1045px; } -.fg_SN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SN { background-position: 0 -2134px; } -.fg_PM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PM { background-position: 0 -1078px; } -.fg_VC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_VC { background-position: 0 -2619px; } -.fg_KN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KN { background-position: 0 -99px; } -.fg_LC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LC { background-position: 0 -1397px; } -.fg_RS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_RS { background-position: 0 -2465px; } -.fg_SG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SG { background-position: 0 -22px; } -.fg_SX, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SX { background-position: 0 -2773px; } -.fg_SY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SY { background-position: 0 -1826px; } -.fg_SK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SK { background-position: 0 -2212px; } -.fg_SI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SI { background-position: 0 -1221px; } -.fg_SB, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SB { background-position: 0 -1067px; } -.fg_SO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SO { background-position: 0 -1364px; } -.fg_SD, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SD { background-position: 0 -352px; } -.fg_SR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SR { background-position: 0 -2663px; } -.fg_US, #phoneControlDropDown ul.dropdown-content .fg-item.fg_US { background-position: 0 -44px; } -.fg_SL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SL { background-position: 0 -737px; } -.fg_TJ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TJ { background-position: 0 -187px; } -.fg_TH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TH { background-position: 0 -957px; } -.fg_TW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TW { background-position: 0 -506px; } -.fg_TZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TZ { background-position: 0 -2289px; } -.fg_TL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TL { background-position: 0 -2784px; } -.fg_TG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TG { background-position: 0 -605px; } -.fg_TK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TK { background-position: 0 -2751px; } -.fg_TO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TO { background-position: 0 -1089px; } -.fg_TT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TT { background-position: 0 -440px; } -.fg_TV, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TV { background-position: 0 -286px; } -.fg_TN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TN { background-position: 0 -539px; } -.fg_TM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TM { background-position: 0 -2542px; } -.fg_TR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TR { background-position: 0 -1606px; } -.fg_UG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_UG { background-position: 0 -1166px; } -.fg_UZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_UZ { background-position: 0 -1001px; } -.fg_UA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_UA { background-position: 0 -2002px; } -.fg_WF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_WF { background-position: 0 -1012px; } -.fg_UY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_UY { background-position: 0 -2608px; } -.fg_FO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_FO { background-position: 0 -1111px; } -.fg_FM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_FM { background-position: 0 -1738px; } -.fg_FJ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_FJ { background-position: 0 -1859px; } -.fg_PH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PH { background-position: 0 -1815px; } -.fg_FI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_FI { background-position: 0 -1903px; } -.fg_FK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_FK { background-position: 0 -2762px; } -.fg_FR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_FR { background-position: 0 -1012px; } -.fg_GF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GF { background-position: 0 -2234px; } -.fg_PF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PF { background-position: 0 -1705px; } -.fg_HR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_HR { background-position: 0 -902px; } -.fg_CF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CF { background-position: 0 -1837px; } -.fg_TD, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TD { background-position: 0 -814px; } -.fg_ME, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ME { background-position: 0 -2167px; } -.fg_CZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CZ { background-position: 0 -2256px; } -.fg_CL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CL { background-position: 0 -1342px; } -.fg_CH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CH { background-position: 0 -1320px; } -.fg_SE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SE { background-position: 0 -385px; } -.fg_LK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LK { background-position: 0 -2641px; } -.fg_EC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_EC { background-position: 0 -1188px; } -.fg_GQ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GQ { background-position: 0 -1507px; } -.fg_ER, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ER { background-position: 0 -715px; } -.fg_EE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_EE { background-position: 0 -2410px; } -.fg_ET, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ET { background-position: 0 -2443px; } -.fg_ZA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ZA { background-position: 0 -2355px; } -.fg_SS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SS { background-position: 0 -2741px; } -.fg_JM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_JM { background-position: 0 -1727px; } -.fg_JP, #phoneControlDropDown ul.dropdown-content .fg-item.fg_JP { background-position: 0 -429px; } - -/* styled selector ----------------------------------- */ -.styled-select-container .tl-combobox { - height: 32px; - line-height: 32px; - border: 1px solid #999; - padding: 0; - width: 100%; - max-width: 100%; -} - -.styled-select-container .tl-combobox, -.styled-select-container .tl-combobox .combobox-container, -.styled-select-container .tl-combobox .combobox-container .combobox-options { - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -.styled-select-container .tl-combobox .combobox-container { - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -.styled-select-container .tl-combobox .combobox-container { - border-color: #999; - left: -1px; - margin: 0; - max-width: none; - padding: 0; - right: auto; -} - -.styled-select-container .tl-combobox .combobox-container .container-corner { - display: none; - width: 0; - height: 0; -} - -.styled-select-container .tl-combobox .combobox-title .inner-text { - margin-left: 10px; -} - -.styled-select-container .tl-combobox .combobox-title { - color: #333; -} - -.styled-select-container .tl-combobox .combobox-container .combobox-options .option-item { - padding: 7px 10px; - background-color: #FFF; -} - -.styled-select-container .tl-combobox .combobox-container .combobox-options .option-item.in-focus { - text-decoration: none; - background-color: #E6E6E6; -} - -.styled-select-container .tl-combobox .combobox-wrapper { - bottom: -2px; - display: block; - height: 1px; - line-height: 1px; - position: absolute; - left: 0; - width: 1px; - z-index: 2; -} - -.dataItem .styled-select-container { - margin-left: -10px; -} +@import "params.less"; + +span.phoneControlContainer { + display: inline-block; + position: relative; +} +span.phoneControlContainer .phoneControlSwitherWrapper { + border: 1px solid @textColorBlackLight; + border-right: none; + display: block; + height: 34px; + line-height: 34px; + padding: 0; +} +span.phoneControlContainer .phoneControlSwitherWrapper { + border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 4px; + -webkit-border-top-right-radius: 3px 0 0 3px; +} +span.phoneControlContainer .phoneControlInputContainer { + border: 1px solid @textColorBlackLight; + border-left: none; + height: 34px; + line-height: 34px; + padding: 0 5px 0 0; +} +span.phoneControlContainer .phoneControlInputContainer { + border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + -webkit-border-top-right-radius: 0 3px 3px 0; +} +span.phoneControlContainer.error .phoneControlSwitherWrapper, +span.phoneControlContainer.error .phoneControlInput, +span.phoneControlContainer.error .phoneControlInputContainer { + border-color: #BF3703; +} +span.phoneControlContainer .phoneControlSwither { + cursor: pointer; + border: none; + position: relative; +} +.dataItem.dataItemPhone .phoneControlSwither:hover { + background-color: #EEE; +} + +span.phoneControlContainer .phoneControlSwither:after { + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid @textColor; + content: ""; + height: 0; + margin-top: -2px; + position: absolute; + right: 8px; + top: 50%; + width: 0; +} + +span.phoneControlContainer .phoneControlInput { + border: none; + padding: 7px 10px 7px 5px; + margin-left: 0; + max-height: 20px; + width: 250px; +} +span.phoneControlContainer .phoneControlInput { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-topleft: 0; + -moz-border-radius-bottomleft: 0; + -webkit-border-top-left-radius: 0; + -webkit-border-bottom-left-radius: 0; +} + +#phoneControlDropDown { + padding-left: 10px; +} +#phoneControlDropDown ul.dropdown-content { + max-height: 260px; + max-width: 280px; +} + +#phoneControlDropDown ul.dropdown-content li{ + min-height: 23px; + padding: 0; +} +#phoneControlDropDown ul.dropdown-content a.dropdown-item { + color: @textColor; + display: block; + line-height: 15px; + margin: 2px 0 2px 8px; + padding: 1px 1px 1px 2px; + white-space: normal; +} +#phoneControlDropDown ul.dropdown-content li.selected { + background-color: #EEE; +} +#phoneControlDropDown ul.dropdown-content li div.fg-item, +.phoneControlSwitherWrapper .phoneControlSwither .selectedPhoneCountry { + background-image: url("imagescss/flags.gif"); + background-color: transparent; + background-repeat: no-repeat; + height: 11px; + vertical-align: middle; + width: 16px; +} +#phoneControlDropDown ul.dropdown-content li div.fg-item { + background-position: 0 15px; + display: inline-block; + float: left; + line-height: 15px; + margin: 5px 0 3px 10px; +} +.phoneControlSwitherWrapper .phoneControlSwither .selectedPhoneCountry { + display: inline-block; + line-height: 15px; + margin: 10px 0 0 10px; +} + +.fg_AL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AL { background-position: 0 -1034px; } +.fg_AU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AU { background-position: 0 -1716px; } +.fg_AT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AT { background-position: 0 -1331px; } +.fg_AZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AZ { background-position: 0 -1243px; } +.fg_DZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_DZ { background-position: 0 -528px; } +.fg_AS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AS { background-position: 0 -1562px; } +.fg_AI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AI { background-position: 0 -1980px; } +.fg_AO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AO { background-position: 0 -1947px; } +.fg_AD, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AD { background-position: 0 -594px; } +.fg_AG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AG { background-position: 0 -869px; } +.fg_AR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AR { background-position: 0 -2377px; } +.fg_AM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AM { background-position: 0 -176px; } +.fg_AW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AW { background-position: 0 -792px; } +.fg_AF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AF { background-position: 0 -2311px; } +.fg_BS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BS { background-position: 0 -363px; } +.fg_BD, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BD { background-position: 0 -1771px; } +.fg_BB, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BB { background-position: 0 -1573px; } +.fg_BH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BH { background-position: 0 -1496px; } +.fg_BY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BY { background-position: 0 -1100px; } +.fg_BZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BZ { background-position: 0 -484px; } +.fg_BE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BE { background-position: 0 0; } +.fg_BJ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BJ { background-position: 0 -1298px; } +.fg_BM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BM { background-position: 0 -1914px; } +.fg_BG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BG { background-position: 0 -2586px; } +.fg_BO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BO { background-position: 0 -1650px; } +.fg_BQ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BQ { background-position: 0 -2719px; } +.fg_BA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BA { background-position: 0 -1584px; } +.fg_BW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BW { background-position: 0 -2707px; } +.fg_BR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BR { background-position: 0 -770px; } +.fg_IO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IO { background-position: 0 -55px; } +.fg_VG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_VG { background-position: 0 -1408px; } +.fg_BN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BN { background-position: 0 -1683px; } +.fg_BF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BF { background-position: 0 -726px; } +.fg_BI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BI { background-position: 0 -1892px; } +.fg_BT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BT { background-position: 0 -1848px; } +.fg_VU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_VU { background-position: 0 -1265px; } +.fg_VA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_VA { background-position: 0 -2322px; } +.fg_GB, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GB { background-position: 0 -55px; } +.fg_HU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_HU { background-position: 0 -682px; } +.fg_VE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_VE { background-position: 0 -1056px; } +.fg_VI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_VI { background-position: 0 -1782px; } +.fg_VN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_VN { background-position: 0 -968px; } +.fg_GA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GA { background-position: 0 -880px; } +.fg_HT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_HT { background-position: 0 -319px; } +.fg_GY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GY { background-position: 0 -803px; } +.fg_GM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GM { background-position: 0 -627px; } +.fg_GH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GH { background-position: 0 -2112px; } +.fg_GP, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GP { background-position: 0 -407px; } +.fg_GT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GT { background-position: 0 -935px; } +.fg_GN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GN { background-position: 0 -2575px; } +.fg_GW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GW { background-position: 0 -1925px; } +.fg_DE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_DE { background-position: 0 -2509px; } +.fg_GI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GI { background-position: 0 -275px; } +.fg_HN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_HN { background-position: 0 -2156px; } +.fg_HK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_HK { background-position: 0 -2696px; } +.fg_GD, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GD { background-position: 0 -2399px; } +.fg_GL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GL { background-position: 0 -1760px; } +.fg_GR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GR { background-position: 0 -165px; } +.fg_GE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GE { background-position: 0 -858px; } +.fg_GU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GU { background-position: 0 -2366px; } +.fg_DK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_DK { background-position: 0 -1386px; } +.fg_CD, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CD { background-position: 0 -1518px; } +.fg_DJ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_DJ { background-position: 0 -2101px; } +.fg_DM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_DM { background-position: 0 -2432px; } +.fg_DO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_DO { background-position: 0 -1529px; } +.fg_EG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_EG { background-position: 0 -2201px; } +.fg_ZM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ZM { background-position: 0 -1595px; } +.fg_ZW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ZW { background-position: 0 -2046px; } +.fg_IL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IL { background-position: 0 -341px; } +.fg_IN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IN { background-position: 0 -1694px; } +.fg_ID, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ID { background-position: 0 -1958px; } +.fg_JO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_JO { background-position: 0 -1463px; } +.fg_IQ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IQ { background-position: 0 -649px; } +.fg_IR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IR { background-position: 0 -2013px; } +.fg_IE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IE { background-position: 0 -1969px; } +.fg_IS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IS { background-position: 0 -1991px; } +.fg_ES, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ES { background-position: 0 -1155px; } +.fg_IT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_IT { background-position: 0 -143px; } +.fg_YE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_YE { background-position: 0 -1672px; } +.fg_KZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KZ { background-position: 0 -1210px; } +.fg_KY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KY { background-position: 0 -308px; } +.fg_KH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KH { background-position: 0 -242px; } +.fg_CM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CM { background-position: 0 -2057px; } +.fg_CA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CA { background-position: 0 -1375px; } +.fg_QA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_QA { background-position: 0 -462px; } +.fg_KE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KE { background-position: 0 -2630px; } +.fg_CY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CY { background-position: 0 -561px; } +.fg_KG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KG { background-position: 0 -1617px; } +.fg_KI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KI { background-position: 0 -374px; } +.fg_CN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CN { background-position: 0 -825px; } +.fg_CO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CO { background-position: 0 -330px; } +.fg_KM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KM { background-position: 0 -1430px; } +.fg_CG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CG { background-position: 0 -1793px; } +.fg_CR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CR { background-position: 0 -2090px; } +.fg_CI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CI { background-position: 0 -1661px; } +.fg_CU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CU { background-position: 0 -748px; } +.fg_KW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KW { background-position: 0 -2487px; } +.fg_CW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CW { background-position: 0 -2729px; } +.fg_LA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LA { background-position: 0 -451px; } +.fg_LV, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LV { background-position: 0 -1936px; } +.fg_LS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LS { background-position: 0 -2190px; } +.fg_LR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LR { background-position: 0 -2068px; } +.fg_LB, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LB { background-position: 0 -1254px; } +.fg_LY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LY { background-position: 0 -132px; } +.fg_LT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LT { background-position: 0 -1122px; } +.fg_LI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LI { background-position: 0 -979px; } +.fg_LU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LU { background-position: 0 -1474px; } +.fg_MU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MU { background-position: 0 -2179px; } +.fg_MR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MR { background-position: 0 -253px; } +.fg_MG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MG { background-position: 0 -1287px; } +.fg_MO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MO { background-position: 0 -2597px; } +.fg_MK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MK { background-position: 0 -1353px; } +.fg_MW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MW { background-position: 0 -2145px; } +.fg_MY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MY { background-position: 0 -1870px; } +.fg_ML, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ML { background-position: 0 -2520px; } +.fg_MV, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MV { background-position: 0 -616px; } +.fg_MT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MT { background-position: 0 -1551px; } +.fg_MA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MA { background-position: 0 -2333px; } +.fg_MQ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MQ { background-position: 0 -198px; } +.fg_MH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MH { background-position: 0 -1144px; } +.fg_MX, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MX { background-position: 0 -2024px; } +.fg_MZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MZ { background-position: 0 -638px; } +.fg_MD, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MD { background-position: 0 -2685px; } +.fg_MC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MC { background-position: 0 -913px; } +.fg_MN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MN { background-position: 0 -2553px; } +.fg_MS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MS { background-position: 0 -583px; } +.fg_MM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MM { background-position: 0 -11px; } +.fg_NA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NA { background-position: 0 -1881px; } +.fg_NR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NR { background-position: 0 -1749px; } +.fg_NP, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NP { background-position: 0 -110px; } +.fg_NE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NE { background-position: 0 -550px; } +.fg_NG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NG { background-position: 0 -2476px; } +.fg_NL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NL { background-position: 0 -1441px; } +.fg_NI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NI { background-position: 0 -154px; } +.fg_NU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NU { background-position: 0 -2079px; } +.fg_NZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NZ { background-position: 0 -1540px; } +.fg_NC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NC { background-position: 0 -1276px; } +.fg_NO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NO { background-position: 0 -836px; } +.fg_AE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AE { background-position: 0 -2223px; } +.fg_TC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TC { background-position: 0 -1309px; } +.fg_BL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_BL { background-position: 0 -1012px; } +.fg_SH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SH { background-position: 0 -495px; } +.fg_OM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_OM { background-position: 0 -2454px; } +.fg_CV, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CV { background-position: 0 -2652px; } +.fg_CK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CK { background-position: 0 -2267px; } +.fg_AC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_AC { background-position: 0 -55px; } +.fg_NF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_NF { background-position: 0 -209px; } +.fg_MF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MF { background-position: 0 -55px; } +.fg_PK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PK { background-position: 0 -2035px; } +.fg_PW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PW { background-position: 0 -231px; } +.fg_PS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PS { background-position: 0 -1199px; } +.fg_PA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PA { background-position: 0 -847px; } +.fg_PG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PG { background-position: 0 -1485px; } +.fg_PY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PY { background-position: 0 -2344px; } +.fg_PE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PE { background-position: 0 -946px; } +.fg_PL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PL { background-position: 0 -1177px; } +.fg_PT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PT { background-position: 0 -517px; } +.fg_PR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PR { background-position: 0 -473px; } +.fg_KR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KR { background-position: 0 -2245px; } +.fg_RE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_RE { background-position: 0 -264px; } +.fg_RU, #phoneControlDropDown ul.dropdown-content .fg-item.fg_RU { background-position: 0 -660px; } +.fg_RW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_RW { background-position: 0 -2674px; } +.fg_RO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_RO { background-position: 0 -671px; } +.fg_SV, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SV { background-position: 0 -1639px; } +.fg_WS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_WS { background-position: 0 -2300px; } +.fg_SM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SM { background-position: 0 -2123px; } +.fg_ST, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ST { background-position: 0 -2388px; } +.fg_SA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SA { background-position: 0 -33px; } +.fg_SZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SZ { background-position: 0 -2278px; } +.fg_KP, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KP { background-position: 0 -1804px; } +.fg_MP, #phoneControlDropDown ul.dropdown-content .fg-item.fg_MP { background-position: 0 -704px; } +.fg_SC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SC { background-position: 0 -1045px; } +.fg_SN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SN { background-position: 0 -2134px; } +.fg_PM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PM { background-position: 0 -1078px; } +.fg_VC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_VC { background-position: 0 -2619px; } +.fg_KN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_KN { background-position: 0 -99px; } +.fg_LC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LC { background-position: 0 -1397px; } +.fg_RS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_RS { background-position: 0 -2465px; } +.fg_SG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SG { background-position: 0 -22px; } +.fg_SX, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SX { background-position: 0 -2773px; } +.fg_SY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SY { background-position: 0 -1826px; } +.fg_SK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SK { background-position: 0 -2212px; } +.fg_SI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SI { background-position: 0 -1221px; } +.fg_SB, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SB { background-position: 0 -1067px; } +.fg_SO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SO { background-position: 0 -1364px; } +.fg_SD, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SD { background-position: 0 -352px; } +.fg_SR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SR { background-position: 0 -2663px; } +.fg_US, #phoneControlDropDown ul.dropdown-content .fg-item.fg_US { background-position: 0 -44px; } +.fg_SL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SL { background-position: 0 -737px; } +.fg_TJ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TJ { background-position: 0 -187px; } +.fg_TH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TH { background-position: 0 -957px; } +.fg_TW, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TW { background-position: 0 -506px; } +.fg_TZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TZ { background-position: 0 -2289px; } +.fg_TL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TL { background-position: 0 -2784px; } +.fg_TG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TG { background-position: 0 -605px; } +.fg_TK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TK { background-position: 0 -2751px; } +.fg_TO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TO { background-position: 0 -1089px; } +.fg_TT, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TT { background-position: 0 -440px; } +.fg_TV, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TV { background-position: 0 -286px; } +.fg_TN, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TN { background-position: 0 -539px; } +.fg_TM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TM { background-position: 0 -2542px; } +.fg_TR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TR { background-position: 0 -1606px; } +.fg_UG, #phoneControlDropDown ul.dropdown-content .fg-item.fg_UG { background-position: 0 -1166px; } +.fg_UZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_UZ { background-position: 0 -1001px; } +.fg_UA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_UA { background-position: 0 -2002px; } +.fg_WF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_WF { background-position: 0 -1012px; } +.fg_UY, #phoneControlDropDown ul.dropdown-content .fg-item.fg_UY { background-position: 0 -2608px; } +.fg_FO, #phoneControlDropDown ul.dropdown-content .fg-item.fg_FO { background-position: 0 -1111px; } +.fg_FM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_FM { background-position: 0 -1738px; } +.fg_FJ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_FJ { background-position: 0 -1859px; } +.fg_PH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PH { background-position: 0 -1815px; } +.fg_FI, #phoneControlDropDown ul.dropdown-content .fg-item.fg_FI { background-position: 0 -1903px; } +.fg_FK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_FK { background-position: 0 -2762px; } +.fg_FR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_FR { background-position: 0 -1012px; } +.fg_GF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GF { background-position: 0 -2234px; } +.fg_PF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_PF { background-position: 0 -1705px; } +.fg_HR, #phoneControlDropDown ul.dropdown-content .fg-item.fg_HR { background-position: 0 -902px; } +.fg_CF, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CF { background-position: 0 -1837px; } +.fg_TD, #phoneControlDropDown ul.dropdown-content .fg-item.fg_TD { background-position: 0 -814px; } +.fg_ME, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ME { background-position: 0 -2167px; } +.fg_CZ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CZ { background-position: 0 -2256px; } +.fg_CL, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CL { background-position: 0 -1342px; } +.fg_CH, #phoneControlDropDown ul.dropdown-content .fg-item.fg_CH { background-position: 0 -1320px; } +.fg_SE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SE { background-position: 0 -385px; } +.fg_LK, #phoneControlDropDown ul.dropdown-content .fg-item.fg_LK { background-position: 0 -2641px; } +.fg_EC, #phoneControlDropDown ul.dropdown-content .fg-item.fg_EC { background-position: 0 -1188px; } +.fg_GQ, #phoneControlDropDown ul.dropdown-content .fg-item.fg_GQ { background-position: 0 -1507px; } +.fg_ER, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ER { background-position: 0 -715px; } +.fg_EE, #phoneControlDropDown ul.dropdown-content .fg-item.fg_EE { background-position: 0 -2410px; } +.fg_ET, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ET { background-position: 0 -2443px; } +.fg_ZA, #phoneControlDropDown ul.dropdown-content .fg-item.fg_ZA { background-position: 0 -2355px; } +.fg_SS, #phoneControlDropDown ul.dropdown-content .fg-item.fg_SS { background-position: 0 -2741px; } +.fg_JM, #phoneControlDropDown ul.dropdown-content .fg-item.fg_JM { background-position: 0 -1727px; } +.fg_JP, #phoneControlDropDown ul.dropdown-content .fg-item.fg_JP { background-position: 0 -429px; } + +/* styled selector +---------------------------------- */ +.styled-select-container .tl-combobox { + height: 32px; + line-height: 32px; + border: 1px solid @textColorBlackLight; + padding: 0; + width: 100%; + max-width: 100%; +} + +.styled-select-container .tl-combobox, +.styled-select-container .tl-combobox .combobox-container, +.styled-select-container .tl-combobox .combobox-container .combobox-options { + border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; +} + +.styled-select-container .tl-combobox .combobox-container { + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.styled-select-container .tl-combobox .combobox-container { + border-color: @textColorBlackLight; + left: -1px; + margin: 0; + max-width: none; + padding: 0; + right: auto; +} + +.styled-select-container .tl-combobox .combobox-container .container-corner { + display: none; + width: 0; + height: 0; +} + +.styled-select-container .tl-combobox .combobox-title .inner-text { + margin-left: 10px; +} + +.styled-select-container .tl-combobox .combobox-title { + color: @textColor; +} + +.styled-select-container .tl-combobox .combobox-container .combobox-options .option-item { + padding: 7px 10px; + background-color: @body-color; +} + +.styled-select-container .tl-combobox .combobox-container .combobox-options .option-item.in-focus { + text-decoration: none; + background-color: #E6E6E6; +} + +.styled-select-container .tl-combobox .combobox-wrapper { + bottom: -2px; + display: block; + height: 1px; + line-height: 1px; + position: absolute; + left: 0; + width: 1px; + z-index: 2; +} + +.dataItem .styled-select-container { + margin-left: -10px; +} diff --git a/web/studio/ASC.Web.Studio/skins/default/sidepanel.less b/web/studio/ASC.Web.Studio/skins/default/sidepanel.less index d652bf91a..b28afd510 100644 --- a/web/studio/ASC.Web.Studio/skins/default/sidepanel.less +++ b/web/studio/ASC.Web.Studio/skins/default/sidepanel.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,8 +19,7 @@ Common Navigation Side Panel *******************************************************************************/ -@menu-selected-bg: #E9E9E9; -@menu-addblock-color: #83888D; + .page-menu .studio-action-panel .dropdown-content { max-height: 500px; .dropdown-item { @@ -184,7 +183,7 @@ white-space: nowrap; a { - color: #333333; + color: @textColor; display: inline-block; max-width: 185px; overflow: hidden; @@ -292,7 +291,7 @@ .menu-item-svg { width: 16px; height: 16px; - fill: #83888d; + fill: @menu-item-svg; &-green { fill: #7ca52f; @@ -399,7 +398,7 @@ text-decoration: none; .menu-item-label.inner-text { - border-bottom-color: #333333; + border-bottom-color: @textColor; } } } @@ -476,7 +475,7 @@ &:after { border-left: 4px solid transparent; border-right: 4px solid transparent; - border-top: 4px solid #ffffff; + border-top: 4px solid @body-color; content: ""; height: 0; margin-top: -1px; @@ -513,7 +512,7 @@ font-weight: bold; padding: 1px 16px 1px 8px; position: relative; - text-shadow: 0 1px 0 #fff; + text-shadow: 0 1px 0 @body-color; &.btn_other-actions:after { border-color: @grayButtonTextColor transparent transparent; @@ -523,14 +522,14 @@ height: 0; margin-top: -2px; position: absolute; - right: 1px; + left: 30px; top: 50%; width: 0; } &.mail { background: url('@{img-change-url}rotate.svg') center 3px no-repeat; - background-size:70%; + background-size: 70%; } } } @@ -603,7 +602,7 @@ &:after { border-left: 4px solid transparent; border-right: 4px solid transparent; - border-top: 4px solid #ffffff; + border-top: 4px solid @body-color; content: ""; height: 0; margin-top: -1px; @@ -640,7 +639,7 @@ &:after { border-left: 4px solid transparent; border-right: 4px solid transparent; - border-top: 4px solid #ffffff; + border-top: 4px solid @body-color; content: ""; height: 0; margin-top: -1px; @@ -658,7 +657,7 @@ *******************************************************************************/ .banner-link { background: no-repeat 0 0 transparent; - border: 1px solid #d1d1d1; + border: 1px solid @borderColor; display: block; height: 54px; margin: 20px 0 0; @@ -731,7 +730,7 @@ only screen and ( min-resolution: 2dppx) { height: 9px; width: 9px; border-radius: 5px; - background: #FFFFFF; + background: @body-color; top: 2px; left: 2px; position: absolute; diff --git a/web/studio/ASC.Web.Studio/skins/default/tl-combobox.less b/web/studio/ASC.Web.Studio/skins/default/tl-combobox.less index 34ace19cc..3141230d7 100644 --- a/web/studio/ASC.Web.Studio/skins/default/tl-combobox.less +++ b/web/studio/ASC.Web.Studio/skins/default/tl-combobox.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,11 +47,11 @@ white-space: nowrap; z-index: 1; cursor: pointer; - color: #333; + color: @textColor; .textOverflowEllipsis(); &:after { - .arrow-down(4px, #212121); + .arrow-down(4px, @sort-down); right: 9px; margin-top: -2px; } @@ -59,7 +59,7 @@ .inner-text { display: block; margin: 0 24px 0 0; - border-bottom: 1px dotted #333; + border-bottom: 1px dotted @textColor; overflow: hidden; white-space: nowrap; .textOverflowEllipsis(); @@ -80,8 +80,8 @@ .combobox-container { display: none; - background-color: #FFF; - border: 1px solid #d1d1d1; + background-color: @body-color; + border: 1px solid @borderColor; width: auto; max-width: 350px; margin: -1px 8px 0 0; @@ -118,7 +118,7 @@ .option-item { text-decoration: none; - background: #FFF url(images/blank.gif); + background: @body-color url(images/blank.gif); line-height: 24px; margin: 0; padding: 0 12px; @@ -143,7 +143,7 @@ &:hover { text-decoration: none; - background-color: #e9e9e9; + background-color: @tl-combobox-container-hover; .borderRadius(2px); } } diff --git a/web/studio/ASC.Web.Studio/skins/default/toastr.less b/web/studio/ASC.Web.Studio/skins/default/toastr.less index 8562fec0a..e9e8ebc87 100644 --- a/web/studio/ASC.Web.Studio/skins/default/toastr.less +++ b/web/studio/ASC.Web.Studio/skins/default/toastr.less @@ -1,21 +1,22 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @import "../base.less"; +@import "params.less"; .toast-close-button { padding: 0; @@ -26,8 +27,8 @@ right: -2px; top: -8px; float: right; - color: #fff; - text-shadow: 0 1px 0 #fff; + color: @body-color; + text-shadow: 0 1px 0 @body-color; opacity: .8; } @@ -39,11 +40,11 @@ word-wrap: break-word; label { - color: #000; + color: @bg-a-activate; } a { - color: #000; + color: @bg-a-activate; &:hover { text-decoration: underline; @@ -79,19 +80,29 @@ } .toast { - background-color: #030303; + background-color: @toast-bg; + border: @toast-bg-bor; + color: @toast-bg-color; } .toast-success { - background-color: #cae796; + background-color: @toast-success; + border: @toast-success-bor; + color: @toast-success-color; } .toast-error { - background-color: #ffbfaa; + background-color: @toast-error; + border: @toast-error-bor; + color: @toast-error-color; } .toast-info { - background-color: #f1da92; + background-color: @toast-info; + border: @toast-info-bor; + color: @toast-info-color; } .toast-warning { - background-color: #f1ca92; + background-color: @toast-warning; + border: @toast-warning-bor; + color: @toast-warning-color; } #toast-container { @@ -99,23 +110,31 @@ z-index: 999999; .toast-success:hover { - background-color: #bcdf7e; + background-color: @toast-container-success-bg; + color: @toast-success-color-hover; + border: @toast-success-hover; } .toast-error:hover { - background-color: #ffa98d; + background-color: @toast-container-error-bg; + color: @toast-error-color-hover; + border: @toast-error-hover; } .toast-info:hover { - background-color: #eed27b; + background-color: @toast-container-info-bg; + color: @toast-info-color-hover; + border: @toast-info-hover; } .toast-warning:hover { - background-color: #eeb97b; + background-color: @toast-container-warning-bg; + color: @toast-warning-color-hover; + border: @toast-warning-hover; } > :hover { - .shadowFullCustomizable(1px, 2px, 4px, #D1D1D1); + .shadowFullCustomizable(1px, 2px, 4px, @borderColor); cursor: pointer; .toast-close-button { @@ -129,7 +148,6 @@ background-position: 15px center; background-repeat: no-repeat; .borderRadius(3px); - color: #000; margin: 0 0 6px; padding: 15px 15px 15px 50px; width: 300px; @@ -163,7 +181,7 @@ margin-top: 6px; .toast-message { - color: #333; + color: @textColor; } } diff --git a/web/studio/ASC.Web.Studio/skins/default/topstudiopanel.less b/web/studio/ASC.Web.Studio/skins/default/topstudiopanel.less index 7c72418c5..b878b3874 100644 --- a/web/studio/ASC.Web.Studio/skins/default/topstudiopanel.less +++ b/web/studio/ASC.Web.Studio/skins/default/topstudiopanel.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,17 +36,17 @@ float: left; } } - /******************************************************************************* + /******************************************************************************* button hidden tabs *******************************************************************************/ - .studio-top-button-hidden-tabs{ - background: @bg-button-hidden-tabs; - } + .studio-top-button-hidden-tabs { + background: @bg-button-hidden-tabs; + } /******************************************************************************* top logo *******************************************************************************/ .studio-top-logo { - margin: 8px 24px 0 0; + margin: 8px 24px 0 0; .top-logo { display: block; @@ -99,7 +99,7 @@ } .usr-prof { - text-decoration:none; + text-decoration: none; .text-overflow(); display: inline-block; max-width: 220px; @@ -137,31 +137,31 @@ svg { width: 16px; height: 16px; - fill: #CFD9E3; + fill: @studio-top-panel-svg; position: absolute; top: 8px; left: 8px; - } + } &:hover svg { - fill: #FFFFFF; + fill: @top-item-box-hover; } } - &.has-led .inner-label, - .inner-text.has-led .inner-label { - .borderRadius(); - .bg-header-icon-lable(); - display: block; - } + &.has-led .inner-label, + .inner-text.has-led .inner-label { + .borderRadius(); + .bg-header-icon-lable(); + display: block; + } &.tariffs .inner-text .inner-label { - font-size: 9px; - max-width: 40px; - min-width: 30px; - right: -2px; - text-align: center; - } + font-size: 9px; + max-width: 40px; + min-width: 30px; + right: -2px; + text-align: center; + } &.signin { margin: 8px 0 0 20px; @@ -189,7 +189,7 @@ body.desktop .studio-top-panel { margin: 6px 24px 0 0; .active-icon-svg{ - fill: #cfd9e3; + fill: @product-menu-active-icon; width: 16px; height: 16px; } @@ -284,6 +284,7 @@ body.desktop .studio-top-panel { #studio_searchPopupPanel { width: 290px; padding: 8px 12px; + right: 24px; .header-base.small { margin-bottom: 10px; @@ -298,19 +299,19 @@ body.desktop .studio-top-panel { .search-input { float: left; - height: 20px; + height: 24px; margin-right: 4px; padding: 1px; width: 238px; } - .search-btn { + .search-btn { height: 24px; position: relative; width: 40px; - &:before{content: " "; position: absolute; width: 6px; height: 6px; border: 2px solid #fff; .borderRadius(6px); top: 5px; left: 13px; } - &:after{content: " "; position: absolute; width: 0; height: 7px; border-right: 2px solid #fff; top: 12px; left: 22px; .rotateTransform(135deg); } + &:before{content: " "; position: absolute; width: 6px; height: 6px; border: 2px solid @body-color; .borderRadius(6px); top: 5px; left: 13px; } + &:after{content: " "; position: absolute; width: 0; height: 7px; border-right: 2px solid @body-color; top: 12px; left: 22px; .rotateTransform(135deg); } } } } @@ -425,13 +426,13 @@ body.desktop .studio-top-panel { .header { .action { - color: #333; + color: @textColor; font-weight: bold; } .title { .limitedSingleText(330px); - color: #333; + color: @textColor; cursor: pointer; font-size: 12px; text-decoration: none; @@ -657,7 +658,7 @@ only screen and ( min-resolution: 2dppx) overflow-y: auto; span { - border: 1px solid #d1d1d1; + border: 1px solid @borderColor; display: inline-block; float: left; height: 40px; @@ -715,7 +716,7 @@ only screen and ( min-resolution: 2dppx) } .btn-box { - border-top: 0.5px solid #D1D1D1; + border-top: 0.5px solid @borderColor; height: 48px; display: flex; align-items: center; diff --git a/web/studio/ASC.Web.Studio/skins/default/userselector.less b/web/studio/ASC.Web.Studio/skins/default/userselector.less index 571e16e19..bc4e1290a 100644 --- a/web/studio/ASC.Web.Studio/skins/default/userselector.less +++ b/web/studio/ASC.Web.Studio/skins/default/userselector.less @@ -1,31 +1,33 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "params.less"; .us-popup-dialog { position: absolute; - border: 1px solid #D1D1D1; - background: #FFFFFF; + border: 1px solid @borderColor; + background: @body-color; border-radius: 5px; box-sizing: border-box; box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.35); padding: 16px; display: none; width: 430px; - z-index: 2; + z-index: 677; } .us-dialog { @@ -67,191 +69,195 @@ float: right; } } -} - -.us-list-parent { - height: 240px; - overflow: auto; - user-select: none; - position: relative; - scrollbar-width: thin; - scrollbar-color: #BFBFBF transparent; - - &::-webkit-scrollbar-track { - background: transparent; - } - - .us-list { - } - - .us-show-more-row { - height: 32px; - padding-left: 4px; - display: flex; - align-items: center; - } - - .us-name { - height: 32px; - padding-left: 4px; - cursor: pointer; - display: flex; - align-items: center; - - .us-avatar { - background-image: url(./images/svg/share/user_avatar.svg); - background-position: left center; - background-repeat: no-repeat; - background-size: 24px; - display: inline-block; - width: 24px; - height: 24px; - margin-right: 8px; - border-radius: 12px; - position: relative; - vertical-align: middle; - } - - .us-name-text { - overflow: hidden; - position: relative; - padding-right: 30px; - flex: 1; - - span { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - display: inline-block; - width: 100%; - } - } - - .us-access { - margin-left: auto; - position: relative; - width: 36px; - height: 24px; - - &:not(.uneditable):after { - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 5px solid #696969; - border-bottom: none; - content: ""; - position: absolute; - top: 10px; - right: 4px; - } - } - - input[type=checkbox] { - margin-right: 8px; - vertical-align: middle; - cursor: pointer; - } - - &:not(.disabled):not(.selected):not(.unselectable):hover { - .us-avatar:before { - width: 24px; - height: 24px; - content: ""; - position: absolute; - top: 0; - left: 0; - opacity: 0.2; - background: #000; - border-radius: 12px; - } - - .us-avatar:after { - border-right: 2px solid #fff; - border-bottom: 2px solid #fff; - opacity: 0.7; - width: 4px; - height: 8px; - transform: rotate(45deg); - content: ""; - position: absolute; - top: 6px; - left: 10px; - } - - .us-avatar:hover:before { - opacity: 0.4; - } - } - - &.disabled { - cursor: default; - opacity: 0.5; - } - - &.selected { - .us-avatar:before { - width: 24px; - height: 24px; - content: ""; - position: absolute; - top: 0; - left: 0; - opacity: 0.5; - background: #000; - border-radius: 12px; - } - - .us-avatar:after { - border-right: 2px solid #fff; - border-bottom: 2px solid #fff; - width: 4px; - height: 8px; - transform: rotate(45deg); - content: ""; - position: absolute; - top: 6px; - left: 10px; - } - } - - &.us-groupname { - .us-avatar { - background-image: url(./images/svg/share/group_avatar.svg); - } - } - } - - .us-group { - .us-group-items { - padding-left: 22px; - display: none; - } - } - - &:not(.rootonly) { - .us-group { - .us-groupname:not(.unopenable) .us-name-text:after { - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 5px solid #696969; - border-bottom: none; - content: ""; - position: absolute; - top: 6px; - right: 16px; - } - - &.opened:not(.unopenable) { - .us-group-items { - display: block; - } - - .us-groupname .us-name-text:after { - border-top: none; - border-bottom: 5px solid #696969; - } - } - } - } +} + +.us-list-parent { + height: 240px; + overflow: auto; + user-select: none; + position: relative; + scrollbar-width: thin; + scrollbar-color: #BFBFBF transparent; + + &::-webkit-scrollbar-track { + background: transparent; + } + + .us-list { + } + + .us-show-more-row { + height: 32px; + padding-left: 4px; + display: flex; + align-items: center; + } + + .us-name { + height: 32px; + padding-left: 4px; + cursor: pointer; + display: flex; + align-items: center; + + .us-avatar { + background-image: url("./images/svg/share/@{user-avatar-svg}"); + background-position: left center; + background-repeat: no-repeat; + background-size: 24px; + display: inline-block; + width: 24px; + height: 24px; + margin-right: 8px; + border-radius: 12px; + position: relative; + vertical-align: middle; + } + + .us-name-text { + overflow: hidden; + position: relative; + padding-right: 30px; + flex: 1; + + span { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: inline-block; + width: 100%; + } + } + + .us-access { + margin-left: auto; + position: relative; + width: 36px; + height: 24px; + + &.static { + margin-left: 20px; + } + + &:not(.uneditable):after { + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid; + border-bottom: none; + content: ""; + position: absolute; + top: 10px; + right: 4px; + } + } + + input[type=checkbox] { + margin-right: 8px; + vertical-align: middle; + cursor: pointer; + } + + &:not(.disabled):not(.selected):not(.unselectable):hover { + .us-avatar:before { + width: 24px; + height: 24px; + content: ""; + position: absolute; + top: 0; + left: 0; + opacity: 0.2; + background: #000; + border-radius: 12px; + } + + .us-avatar:after { + border-right: 2px solid @body-color; + border-bottom: 2px solid @body-color; + opacity: 0.7; + width: 4px; + height: 8px; + transform: rotate(45deg); + content: ""; + position: absolute; + top: 6px; + left: 10px; + } + + .us-avatar:hover:before { + opacity: 0.4; + } + } + + &.disabled { + cursor: default; + opacity: 0.5; + } + + &.selected { + .us-avatar:before { + width: 24px; + height: 24px; + content: ""; + position: absolute; + top: 0; + left: 0; + opacity: 0.5; + background: #000; + border-radius: 12px; + } + + .us-avatar:after { + border-right: 2px solid @body-color; + border-bottom: 2px solid @body-color; + width: 4px; + height: 8px; + transform: rotate(45deg); + content: ""; + position: absolute; + top: 6px; + left: 10px; + } + } + + &.us-groupname { + .us-avatar { + background-image: url(./images/svg/share/group_avatar.svg); + } + } + } + + .us-group { + .us-group-items { + padding-left: 22px; + display: none; + } + } + + &:not(.rootonly) { + .us-group { + .us-groupname:not(.unopenable) .us-name-text:after { + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid; + border-bottom: none; + content: ""; + position: absolute; + top: 6px; + right: 16px; + } + + &.opened:not(.unopenable) { + .us-group-items { + display: block; + } + + .us-groupname .us-name-text:after { + border-top: none; + border-bottom: 4px solid; + } + } + } + } } .us-access-rights-dialog { @@ -260,7 +266,7 @@ cursor: pointer; &:hover { - background: #E9E9E9; + background: @tl-combobox-container-hover; } div { @@ -313,6 +319,10 @@ &.access-8 { background-image: url(./images/svg/share/access_filter.svg); } + + &.access-remove { + background-image: url(./images/svg/share/trash.svg); + } } .us-search { @@ -346,3 +356,48 @@ } } } + +.us-settings { + margin-left: auto; + width: 56px; + height: 24px; + + .us-settings-item { + display: inline-block; + width: 24px; + height: 24px; + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-position: center center; + mask-position: center center; + background-color: #CECECE; + + &:not(:first-child) { + margin-left: 8px; + } + } + + .us-settings-lifetime { + -webkit-mask-image: url(./images/svg/share/lifetime.svg); + mask-image: url(./images/svg/share/lifetime.svg); + } + + .us-settings-password { + -webkit-mask-image: url(./images/svg/share/password.svg); + mask-image: url(./images/svg/share/password.svg); + } +} + +.us-name:not(.disabled) .us-settings .us-settings-item { + &.enabled { + background-color: #3B72A7; + } + + &.warning { + background-color: #DA5353; + } + + &:hover { + background-color: #3B72A7; + } +} \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/voip.phone.less b/web/studio/ASC.Web.Studio/skins/default/voip.phone.less index 0f35a426c..e168454c0 100644 --- a/web/studio/ASC.Web.Studio/skins/default/voip.phone.less +++ b/web/studio/ASC.Web.Studio/skins/default/voip.phone.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/skins/default/whitelabel.less b/web/studio/ASC.Web.Studio/skins/default/whitelabel.less index d3595eb4d..c968f5b6b 100644 --- a/web/studio/ASC.Web.Studio/skins/default/whitelabel.less +++ b/web/studio/ASC.Web.Studio/skins/default/whitelabel.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + #studio_whiteLabelLogoText { width: 350px; } @@ -33,7 +33,7 @@ } canvas:not(.theme-background) { - background-color: #fff; + background-color: @body-color; } canvas { @@ -74,6 +74,9 @@ .logo-img-container img.docs-style3-background, #canvas_logo_4_3 { background-color: #aa5252; } +.logo-img-container img.docs-style4-background, #canvas_logo_4_4 { + background-color: #404040; +} #studio_whiteLabelSettings { .logo_0, #canvas_logo_0 { @@ -92,21 +95,31 @@ max-width: 216px; max-height: 35px; padding: 10px; + background-color: #fff; } #canvas_logo_2 { width: 216px; height: 35px; padding: 10px; + background-color: #fff; + } + + .logo_6, #canvas_logo_6 { + max-width: 216px; + max-height: 35px; + padding: 10px; + background-color: #333; } .logo_3, #canvas_logo_3 { width: 16px; height: 16px; + background-color: #fff; } .logo_4, - #canvas_logo_4_1, #canvas_logo_4_2, #canvas_logo_4_3 { + #canvas_logo_4_1, #canvas_logo_4_2, #canvas_logo_4_3, #canvas_logo_4_4 { width: 86px; height: 20px; padding: 10px; @@ -127,9 +140,15 @@ top: 0; } + #canvas_logo_4_4 { + left: 333px; + top: 0; + } + .logo_5, #canvas_logo_5 { width: 86px; height: 20px; padding: 10px; + background-color: #fff; } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/skins/default/wizard.less b/web/studio/ASC.Web.Studio/skins/default/wizard.less index 31d12e3e6..98aa6a5e1 100644 --- a/web/studio/ASC.Web.Studio/skins/default/wizard.less +++ b/web/studio/ASC.Web.Studio/skins/default/wizard.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @import "../base.less"; .wizardContent { diff --git a/web/studio/ASC.Web.Studio/skins/page_default.less b/web/studio/ASC.Web.Studio/skins/page_default.less index 48b5f91c8..2fe8a1634 100644 --- a/web/studio/ASC.Web.Studio/skins/page_default.less +++ b/web/studio/ASC.Web.Studio/skins/page_default.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/skins/pure-orange/img/name_action.png b/web/studio/ASC.Web.Studio/skins/pure-orange/img/name_action.png index b1c7498e03634d9ddaa89458254e3eeec32e2c8a..c4b5ce14b1157f45078c813af03649796a541bc3 100644 GIT binary patch delta 329 zcmV-P0k;0X0^2&}*eY{CY($WKX~3a`KhFaaa5 zLPnrY6YilHC6S%ztRR{^$x@Vie*XLuhiKIwWQ^HLYMO*9%YSmm?KI~risGE6=@Wim z25Rs`!yu$>+XpwxK_=wuW_{%L@%MpT25Rv1S4fc%qzkE)QirOlYKb53r!odGd7huN z*7xxsQjk!;?sYKZ3zKD;VUWw%7z+{rqN$9Hdq|Sx#+`65-9FDQ>(Ux*lXO|<6unJ> z0HTFJ#0S_DL_#qj_*`+1_y!$AHchj)*1k~l-ZSWkfY>vFa31hVp4q!>)ZlR-KbQ1( buqvcC6?)*b4RXMv00000NkvXXu0mjfdDf5! delta 293 zcmV+=0owlK0>1)~BYyz~Nklfi1X#J2-$8 zbQ_aFTMrz8@lb$%tc)VOGN^BXJ$QhHLu5(sod2P3M9P3lkbfCapE;E^8>gu*qjKt! zd7E*Ch@lVoWY%1o36&x|*2$Lnm~n`RAak+$E7oSmdM#y}%V>LWh=?F_w#TqGT_xia z5=8`=m1B=6YstLJ diff --git a/web/studio/ASC.Web.Studio/skins/pure-orange/main.less b/web/studio/ASC.Web.Studio/skins/pure-orange/main.less index e3266a2a7..9efc12493 100644 --- a/web/studio/ASC.Web.Studio/skins/pure-orange/main.less +++ b/web/studio/ASC.Web.Studio/skins/pure-orange/main.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/skins/pure-orange/params.less b/web/studio/ASC.Web.Studio/skins/pure-orange/params.less index bc7960fda..c266808b8 100644 --- a/web/studio/ASC.Web.Studio/skins/pure-orange/params.less +++ b/web/studio/ASC.Web.Studio/skins/pure-orange/params.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,7 +59,13 @@ @bg-button-default-active: #e2e2e2; @bg-button-default-disable: #f7f7f7; +@popupContainerHeaderBlock: #e2e2e2; +@bg-progress-dialog-header: #e2e2e2; +@bg-button-default-menuAction: #ebebeb; +@bg-button-default-hover-menuAction: #f5f5f5; +@bg-button-default-active-menuAction: #e2e2e2; +@bg-button-default-disable-menuAction: #f7f7f7; // Buttons border style // ------------------------- @@ -67,8 +73,12 @@ @border-button-default-hover: #d4d4d4; @border-button-default-active: #dadada; @border-button-default-disable: #ebebeb; +@border-button-default-item-row: @border-button-default; - +@border-button-default-menuAction: #c4c4c4; +@border-button-default-hover-menuAction: #d4d4d4; +@border-button-default-active-menuAction: #dadada; +@border-button-default-disable-menuAction: #ebebeb; // Entity menu colors // ------------------------- @entity-menu-color : #cecece; @@ -79,7 +89,7 @@ // ------------------------- @advfilter-combobox-btns : #888888; -@advfilter-combobox-bkgd : #EDF6FD; +@advfilter-combobox-bkgd : #fff; @advfilter-reset-btn : #CCCCCC; @advfilter-add-btn-plus : #50565c; @advfilter-add-btn-bkgd : #EBEBEB; diff --git a/web/studio/ASC.Web.Studio/skins/wild-pink/img/name_action.png b/web/studio/ASC.Web.Studio/skins/wild-pink/img/name_action.png index 8052dfab7fb3a9d6075ee4fc40d20466f536dc48..bbab136297f4f610eb0573835d5f70ba988ea9d9 100644 GIT binary patch delta 222 zcmV<403rY90{Q`vB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj5k4Z#9RCodHRlyB_APnpXj=+Yp0c^@Bl|D?62(%~aLoey8*W-E# zK=k7UF!O@+EC;w;tAZDDCE+(Tq!$Q9AtLY{-cs-mhANE&C0BGJ;;ej=hQvRJRb`|z zr#9l1u{tuKn%8Muj&-J)hM}28?0WDfVQ3?87Vd+ + @@ -44,7 +45,7 @@ - + @@ -67,7 +68,7 @@ - + diff --git a/web/studio/ASC.Web.Studio/web.consumers.config b/web/studio/ASC.Web.Studio/web.consumers.config index 6f12bb06c..64a35bf8c 100644 --- a/web/studio/ASC.Web.Studio/web.consumers.config +++ b/web/studio/ASC.Web.Studio/web.consumers.config @@ -6,249 +6,199 @@ - + +

    +
    ${jq.format(ASC.Resources.Master.AccessRightsAccessToProduct, Name)}:
    _%#9DwC6dNB{r;xvGkS4vxP3uM!d9+Fl=qT^zx) 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 o0U>b#0rk2imjA=xla%Lg_1Efh>m;e9( diff --git a/web/studio/ASC.Web.Studio/ThirdParty/plugin/wordpress/icon.svg b/web/studio/ASC.Web.Studio/ThirdParty/plugin/wordpress/icon.svg new file mode 100644 index 000000000..91fa98d54 --- /dev/null +++ b/web/studio/ASC.Web.Studio/ThirdParty/plugin/wordpress/icon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/ActivateEmailPanel.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/ActivateEmailPanel.ascx.cs index c56507705..42ec28f23 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/ActivateEmailPanel.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/ActivateEmailPanel.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/Attachments.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/Attachments.ascx.cs index 306cc6b94..c9b40f597 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/Attachments.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/Attachments.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ using System.Web.UI; using ASC.Web.Core.Files; +using ASC.Web.Core.Utility; using ASC.Web.Studio.Controls.Common; using ASC.Web.Studio.PublicResources; using ASC.Web.Studio.Utility; @@ -69,8 +70,15 @@ public Attachments() private void InitScripts() { - Page.RegisterStyle("~/UserControls/Common/Attachments/css/attachments.less") - .RegisterBodyScripts("~/UserControls/Common/Attachments/js/attachments.js"); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Common/Attachments/css/dark-attachments.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Common/Attachments/css/attachments.less"); + } + Page.RegisterBodyScripts("~/UserControls/Common/Attachments/js/attachments.js"); } private void CreateEmptyPanel() @@ -81,7 +89,7 @@ private void CreateEmptyPanel() var emptyParticipantScreenControl = new EmptyScreenControl { - ImgSrc = VirtualPathUtility.ToAbsolute("~/UserControls/Common/Attachments/images/documents-logo.png"), + ImgSrc = VirtualPathUtility.ToAbsolute("~/UserControls/Common/Attachments/images/documents-logo.svg"), Header = UserControlsCommonResource.EmptyListDocumentsHead, Describe = String.Format(FileUtility.ExtsWebEdited.Any() ? UserControlsCommonResource.EmptyListDocumentsDescr.HtmlEncode() : UserControlsCommonResource.EmptyListDocumentsDescrPoor.HtmlEncode(), //create diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/css/attachments.less b/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/css/attachments.less index 342c714c2..fc0669792 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/css/attachments.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/css/attachments.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,8 @@ @import "../../../../skins/base.less"; +@import "../../../../skins/default/params.less"; + /*-----Attachments control---------*/ /*----question window----*/ @@ -48,7 +50,7 @@ padding: 0; position: relative; text-align: center; - color: #116d9d; + color: @EmptyDocumentPanel-a; } } @@ -104,7 +106,7 @@ a#createFirstDocument:after { display: none; .baseLinkAction { - color: #333; + color: @textColor; } > span { @@ -152,7 +154,7 @@ a#createFirstDocument:after { } span.version { - color: #FFFFFF; + color: @body-color; font-size: 10px; margin: 1px 0 0 5px; max-width: 40px; @@ -182,14 +184,14 @@ span.version { display: none; td { - border-top: 1px solid #D1D1D1; + border-top: 1px solid @borderColor; &:first-child { padding-top: 5px; width: 69%; a { - color: #333333; + color: @textColor; display: inline-block; margin-left: 5px; max-width: 500px; @@ -226,14 +228,14 @@ span.version { } &:hover { - background-color: #F2F2F2; + background-color: @activeTable; } &.noAttach td { - color: #333; + color: @textColor; text-align: left; background-image: none; - background-color: #fff; + background-color: @body-color; cursor: default; } @@ -311,7 +313,7 @@ tr.newDoc { .information-upload-panel { clear: both; font-size: 11px; - color: #666; + color: @textColorBlackDark; div { float: left; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/css/dark-attachments.less b/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/css/dark-attachments.less new file mode 100644 index 000000000..5c8438373 --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/css/dark-attachments.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "attachments.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/images/documents-logo.png b/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/images/documents-logo.png deleted file mode 100644 index 3debeaeb47d743fa5a96a6f1832ad8119ecd20b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24348 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%0A6Q@&bLsDRV^zO}Nkg<% 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 be+3u-C|hB8eU61D00000NkvXXu0mjfv$~gN diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/images/documents-logo.svg b/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/images/documents-logo.svg new file mode 100644 index 000000000..b17f14bbe --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/images/documents-logo.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/js/attachments.js b/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/js/attachments.js index 6e68db5a8..06cc58770 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/js/attachments.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Attachments/js/attachments.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/Authorize.ascx b/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/Authorize.ascx index ef45a5612..509c6d314 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/Authorize.ascx +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/Authorize.ascx @@ -28,7 +28,7 @@ <%--password--%>
    - " maxlength="<%= PasswordSettings.MaxLength %>" placeholder="<%= Resource.Password %>" /> + " maxlength="<%= PasswordSettings.LimitMaxLength %>" placeholder="<%= Resource.Password %>" autocomplete="current-password" />
    <%--buttons--%> diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/Authorize.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/Authorize.ascx.cs index bd16da5e3..e5a8c88e2 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/Authorize.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/Authorize.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ using ASC.IPSecurity; using ASC.MessagingSystem; using ASC.Web.Core; +using ASC.Web.Core.Utility; using ASC.Web.Studio.Core; using ASC.Web.Studio.Core.SMS; using ASC.Web.Studio.Core.TFA; @@ -188,8 +189,15 @@ protected void Page_Init(object sender, EventArgs e) protected void Page_Load(object sender, EventArgs e) { - Page.RegisterStyle("~/UserControls/Common/Authorize/css/authorize.less") - .RegisterBodyScripts("~/UserControls/Common/Authorize/js/authorize.js"); + if (ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Common/Authorize/css/dark-authorize.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Common/Authorize/css/authorize.less"); + } + Page.RegisterBodyScripts("~/UserControls/Common/Authorize/js/authorize.js"); if (RecaptchaEnable) { @@ -267,8 +275,10 @@ private bool AuthProcess(LoginProfile thirdPartyProfile, bool withAccountLink) { var authMethod = AuthMethod.Login; var tfaLoginUrl = string.Empty; - var loginCounter = 0; - ShowRecaptcha = false; + var requestIp = MessageSettings.GetFullIPAddress(Request); + var bruteForceLoginManager = new BruteForceLoginManager(cache, Login, requestIp); + var bruteForceSuccessAttempt = false; + try { if (thirdPartyProfile != null) @@ -317,37 +327,24 @@ private bool AuthProcess(LoginProfile thirdPartyProfile, bool withAccountLink) if (string.IsNullOrEmpty(HashId) && !SetupInfo.IsSecretEmail(Login)) { - int.TryParse(cache.Get("loginsec/" + Login), out loginCounter); - - loginCounter++; + bruteForceSuccessAttempt = bruteForceLoginManager.Increment(out ShowRecaptcha); - if (!RecaptchaEnable) + if (!bruteForceSuccessAttempt) { - if (loginCounter > SetupInfo.LoginThreshold) + if (!RecaptchaEnable) { throw new BruteForceCredentialException(); } - } - else - { - if (loginCounter > SetupInfo.LoginThreshold - 1) - { - ShowRecaptcha = true; - } - if (loginCounter > SetupInfo.LoginThreshold) + else { - var ip = Request.Headers["X-Forwarded-For"] ?? Request.UserHostAddress; - var recaptchaResponse = Request["g-recaptcha-response"]; if (String.IsNullOrEmpty(recaptchaResponse) - || !ValidateRecaptcha(recaptchaResponse, ip)) + || !ValidateRecaptcha(recaptchaResponse, requestIp)) { throw new RecaptchaException(); } } } - - cache.Insert("loginsec/" + Login, loginCounter.ToString(CultureInfo.InvariantCulture), DateTime.UtcNow.Add(TimeSpan.FromMinutes(1))); } var userInfo = GetUser(out authMethod); @@ -360,18 +357,18 @@ private bool AuthProcess(LoginProfile thirdPartyProfile, bool withAccountLink) var tenant = CoreContext.TenantManager.GetCurrentTenant(); var settings = IPRestrictionsSettings.Load(); - if (settings.Enable && userInfo.ID != tenant.OwnerId && !IPSecurity.IPSecurity.Verify(tenant)) + if (settings.Enable && userInfo.ID != tenant.OwnerId && !IPSecurity.IPSecurity.Verify(tenant, userInfo.Email)) { throw new IPSecurityException(); } if (StudioSmsNotificationSettings.IsVisibleAndAvailableSettings - && StudioSmsNotificationSettings.Enable) + && StudioSmsNotificationSettings.TfaEnabledForUser(userInfo.ID)) { tfaLoginUrl = Studio.Confirm.SmsConfirmUrl(userInfo); } else if (TfaAppAuthSettings.IsVisibleSettings - && TfaAppAuthSettings.Enable) + && TfaAppAuthSettings.TfaEnabledForUser(userInfo.ID)) { tfaLoginUrl = Studio.Confirm.TfaConfirmUrl(userInfo); } @@ -452,9 +449,9 @@ private bool AuthProcess(LoginProfile thirdPartyProfile, bool withAccountLink) return false; } - if (loginCounter > 0) + if (bruteForceSuccessAttempt) { - cache.Insert("loginsec/" + Login, (--loginCounter).ToString(CultureInfo.InvariantCulture), DateTime.UtcNow.Add(TimeSpan.FromMinutes(1))); + bruteForceLoginManager.Decrement(); } if (!string.IsNullOrEmpty(tfaLoginUrl)) diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/css/authorize.less b/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/css/authorize.less index aaa0fad6d..7f4d781cf 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/css/authorize.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/css/authorize.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ */ +@import "../../../../skins/default/params.less"; + .auth-form { float:left; @@ -77,7 +79,7 @@ span { font-size: 13px; - background-color: #ffffff; + background-color: @body-color; padding: 0 10px; color: grey; } diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/css/dark-authorize.less b/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/css/dark-authorize.less new file mode 100644 index 000000000..53ddde54b --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/css/dark-authorize.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "authorize.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/js/authorize.js b/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/js/authorize.js index aaa1aa2bc..bafa2533b 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/js/authorize.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/js/authorize.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/js/desktop.js b/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/js/desktop.js index b2787bb94..640b057aa 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/js/desktop.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/js/desktop.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/js/recaptchacontroller.js b/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/js/recaptchacontroller.js index 5255f3f12..2a57b27cb 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/js/recaptchacontroller.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Authorize/js/recaptchacontroller.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/AuthorizeDocs.ascx b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/AuthorizeDocs.ascx index 6b888e630..65ca02c88 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/AuthorizeDocs.ascx +++ b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/AuthorizeDocs.ascx @@ -239,7 +239,7 @@
    - +
    diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/AuthorizeDocs.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/AuthorizeDocs.ascx.cs index f06279fc8..51ea35d0d 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/AuthorizeDocs.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/AuthorizeDocs.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ using System; using System.Configuration; -using System.Globalization; using System.Security.Authentication; using System.Web; using System.Web.UI; @@ -27,6 +26,7 @@ using ASC.FederatedLogin.Profile; using ASC.MessagingSystem; using ASC.Web.Core; +using ASC.Web.Core.Utility; using ASC.Web.Studio.Core; using ASC.Web.Studio.PublicResources; using ASC.Web.Studio.UserControls.Users.UserProfile; @@ -67,11 +67,28 @@ protected void Page_Load(object sender, EventArgs e) { LoginMessage = Auth.GetAuthMessage(Request["am"]); - Page.RegisterStyle("~/UserControls/Common/AuthorizeDocs/css/authorizedocs.less", "~/UserControls/Common/AuthorizeDocs/css/slick.less") + var theme = ModeThemeSettings.GetModeThemesSettings().ModeThemeName; + + if (theme == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Common/AuthorizeDocs/css/dark-authorizedocs.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Common/AuthorizeDocs/css/authorizedocs.less"); + } + Page.RegisterStyle("~/UserControls/Common/AuthorizeDocs/css/slick.less") .RegisterBodyScripts("~/js/third-party/lodash.min.js", "~/js/third-party/masonry.pkgd.min.js", "~/UserControls/Common/AuthorizeDocs/js/reviews.js", "~/UserControls/Common/AuthorizeDocs/js/review_builder_script.js", "~/UserControls/Common/AuthorizeDocs/js/authorizedocs.js", "~/UserControls/Common/Authorize/js/authorize.js", "~/js/third-party/slick.min.js"); if (CoreContext.Configuration.CustomMode) - Page.RegisterStyle("~/UserControls/Common/AuthorizeDocs/css/custom-mode.less"); + if (theme == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Common/AuthorizeDocs/css/dark-custom-mode.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Common/AuthorizeDocs/css/custom-mode.less"); + } ThirdpartyEnable = SetupInfo.ThirdPartyAuthEnabled && AccountLinkControl.IsNotEmpty; if (Request.DesktopApp() @@ -106,8 +123,10 @@ protected void Page_Load(object sender, EventArgs e) if (IsPostBack) { - var loginCounter = 0; - ShowRecaptcha = false; + var requestIp = MessageSettings.GetFullIPAddress(Request); + var bruteForceLoginManager = new BruteForceLoginManager(cache, Login, requestIp); + var bruteForceSuccessAttempt = false; + try { Login = Request["login"].Trim(); @@ -126,43 +145,29 @@ protected void Page_Load(object sender, EventArgs e) if (!SetupInfo.IsSecretEmail(Login)) { - int.TryParse(cache.Get("loginsec/" + Login), out loginCounter); - - loginCounter++; + bruteForceSuccessAttempt = bruteForceLoginManager.Increment(out ShowRecaptcha); - if (!RecaptchaEnable) + if (!bruteForceSuccessAttempt) { - if (loginCounter > SetupInfo.LoginThreshold) + if (!RecaptchaEnable) { throw new Authorize.BruteForceCredentialException(); } - } - else - { - if (loginCounter > SetupInfo.LoginThreshold - 1) + else { - ShowRecaptcha = true; - } - if (loginCounter > SetupInfo.LoginThreshold) - { - var ip = Request.Headers["X-Forwarded-For"] ?? Request.UserHostAddress; - var recaptchaResponse = Request["g-recaptcha-response"]; if (String.IsNullOrEmpty(recaptchaResponse) - || !Authorize.ValidateRecaptcha(recaptchaResponse, ip)) + || !Authorize.ValidateRecaptcha(recaptchaResponse, requestIp)) { throw new Authorize.RecaptchaException(); } } } - - cache.Insert("loginsec/" + Login, loginCounter.ToString(CultureInfo.InvariantCulture), DateTime.UtcNow.Add(TimeSpan.FromMinutes(1))); } var session = string.IsNullOrEmpty(Request["remember"]); CookiesManager.AuthenticateMeAndSetCookies(Login, passwordHash, MessageAction.LoginSuccess, session); - cache.Insert("loginsec/" + Login, (--loginCounter).ToString(CultureInfo.InvariantCulture), DateTime.UtcNow.Add(TimeSpan.FromMinutes(1))); } catch (InvalidCredentialException ex) { @@ -208,9 +213,9 @@ protected void Page_Load(object sender, EventArgs e) return; } - if (loginCounter > 0) + if (bruteForceSuccessAttempt) { - cache.Insert("loginsec/" + Login, (--loginCounter).ToString(CultureInfo.InvariantCulture), DateTime.UtcNow.Add(TimeSpan.FromMinutes(1))); + bruteForceLoginManager.Decrement(); } Response.Redirect(Context.GetRefererURL()); diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/AuthorizeDocsCustomMode.ascx b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/AuthorizeDocsCustomMode.ascx index acd619f62..ff2398b9e 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/AuthorizeDocsCustomMode.ascx +++ b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/AuthorizeDocsCustomMode.ascx @@ -194,7 +194,7 @@
    - + <%if (Request.DesktopApp()){ %> diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/authorizedocs.less b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/authorizedocs.less index 1d93efbd9..834271be6 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/authorizedocs.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/authorizedocs.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,8 +14,10 @@ * */ + @orangeMain: #FF6F3D; @retina: ~"only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 120dpi)"; +@import "../../../../skins/default/params.less"; .ai_center { -webkit-box-align: center; @@ -196,7 +198,7 @@ body { } a { - background-color: #FFFFFF; + background-color: @body-color; .border-radius(3px); -webkit-box-shadow: 0px 0px 1px #e6e6e6, 0px 1px 1px #d4d4d4; box-shadow: 0px 0px 1px #e6e6e6, 0px 1px 1px #d4d4d4; @@ -229,7 +231,7 @@ body { } .auth-input-wrapper { - background: #FFFFFF; + background: @body-color; border: 1px solid #AAAAAA; border-radius: 3px; .box-sizing(); @@ -238,14 +240,14 @@ body { width: 100%; &:hover { - border-color: #666666; + border-color: @textColorBlackDark; } input { background: transparent; border: none; .box-sizing(); - color: #333333; + color: @textColor; font-size: 16px; height: auto; line-height: 20px; @@ -255,8 +257,8 @@ body { width: 100%; &:-webkit-autofill { - .box-shadow-for-autofill(inset, 0, 0, 0, 28px, #FFFFFF); - color: #333333; + .box-shadow-for-autofill(inset, 0, 0, 0, 28px, @body-color); + color: @textColor; font-size: 16px; & + label { @@ -294,7 +296,7 @@ body { transform: translateY(0); }*/ &:focus + label { - color: #333333; + color: @textColor; font-size: 12px; transform: translateX(2px) translateY(-12px); } @@ -316,18 +318,18 @@ body { &.focus, &.error, &.valid { label { - color: #333333; + color: @textColor; font-size: 12px; transform: translateX(2px) translateY(-12px); } } &.focus { - background: #FFFFFF; - border-color: #666666; + background: @body-color; + border-color: @textColorBlackDark; input:-webkit-autofill { - .box-shadow-for-autofill(inset, 0, 0, 0, 28px, #FFFFFF); + .box-shadow-for-autofill(inset, 0, 0, 0, 28px, @body-color); } } @@ -353,7 +355,7 @@ body { } label { - color: #666666; + color: @textColorBlackDark; } } } @@ -365,7 +367,7 @@ body { .button.gray { background: #444444; border-color: transparent; - color: #FFFFFF; + color: @body-color; font-size: 13px; font-weight: 600; letter-spacing: 0.04em; @@ -377,7 +379,7 @@ body { &:hover { background: #555555; border-color: transparent; - color: #FFFFFF; + color: @body-color; } } @@ -403,7 +405,7 @@ body { } &:hover + span { - border-color: #666666; + border-color: @textColorBlackDark; } &:checked + span { @@ -412,7 +414,7 @@ body { &:before { content: ""; - border: 0 solid #fff; + border: 0 solid @body-color; border-width: 0 2px 2px 0; display: block; height: 11px; @@ -430,7 +432,7 @@ body { padding-bottom: 12px; label { - color: #666666; + color: @textColorBlackDark; display: inline-block; font-size: 14px; line-height: 160%; @@ -604,7 +606,7 @@ body { border: none; .border-radius(3px); .box-sizing(); - color: #FFFFFF; + color: @body-color; cursor: pointer; font-size: 14px; font-weight: bold; @@ -777,7 +779,7 @@ main { a { color: #444444; - border: 1px solid #333333; + border: 1px solid @textColor; .border-radius(3px); .box-sizing(); display: block; @@ -805,7 +807,7 @@ main { } .prebtn { - color: #333333; + color: @textColor; display: inline-block; font-size: 16px; line-height: 160%; @@ -830,7 +832,7 @@ main { width: 543px; .auth-form-with_form { - background-color: #fff; + background-color: @body-color; border: 1px solid #CCCCCC; .border-radius(5px); .box-shadow(0px, 20px, 50px, rgba(85, 85, 85, 0.15)); @@ -942,7 +944,7 @@ main { } &:hover { - background: #FFFFFF; + background: @body-color; .box-shadow(0px, 20px, 50px, rgba(85, 85, 85, 0.15)); &:after { @@ -996,7 +998,7 @@ main { &.spreadsheet { background-image: url("images/screenshots/en/spreadsheet.png"); - + @media @retina { background-image: url("images/screenshots/en/spreadsheet@2x.png"); } @@ -1004,7 +1006,7 @@ main { &.presentation { background-image: url("images/screenshots/en/presentation.png"); - + @media @retina { background-image: url("images/screenshots/en/presentation@2x.png"); } @@ -1012,7 +1014,7 @@ main { &.collaboration { background-image: url("images/screenshots/en/collaboration.png"); - + @media @retina { background-image: url("images/screenshots/en/collaboration@2x.png"); } @@ -1021,7 +1023,7 @@ main { } &.auth-form-extend { - background: #ffffff; + background: @body-color; padding: 112px 0; h3 { @@ -1273,7 +1275,7 @@ main { width: 544px; p { - color: #333333; + color: @textColor; font-size: 13px; line-height: 160%; @@ -1311,7 +1313,7 @@ main { } .auth-form-container { - color: #333333; + color: @textColor; margin: 0 auto; width: 100%; @@ -1335,8 +1337,8 @@ main { min-height: 380px; &.d-apps { - background-image: -o-linear-gradient(349.21deg, #666666 23.25%, #444444 78.7%); - background-image: linear-gradient(100.79deg, #666666 23.25%, #444444 78.7%); + background-image: -o-linear-gradient(349.21deg, @textColorBlackDark 23.25%, #444444 78.7%); + background-image: linear-gradient(100.79deg, @textColorBlackDark 23.25%, #444444 78.7%); margin-bottom: 0; .auth-download-img { @@ -1360,7 +1362,7 @@ main { background-color: transparent; background-position: center; background-repeat: no-repeat; - border: 1px solid #FFFFFF; + border: 1px solid @body-color; width: 170px; &:hover { @@ -1382,7 +1384,7 @@ main { } &.d-chrome-extension { - background-color: #FFFFFF; + background-color: @body-color; .auth-download-img { background-image: url("images/screenshots/en/online.png"); @@ -1393,7 +1395,7 @@ main { } .auth-download-txt { - color: #333333; + color: @textColor; a { background-color: transparent; @@ -1431,8 +1433,8 @@ main { order: 1; a { - border-color: #FFFFFF; - color: #FFFFFF; + border-color: @body-color; + color: @body-color; display: inline-block; font-size: 13px; line-height: 133%; @@ -1457,7 +1459,7 @@ main { } .auth-download-txt { - color: #FFFFFF; + color: @body-color; font-size: 22px; letter-spacing: -0.02em; line-height: 160%; @@ -1545,7 +1547,7 @@ main { position: relative; .review_block { - background: #FFFFFF; + background: @body-color; border: 1px solid #CCCCCC; .border-radius(5px); .box-sizing(); @@ -1564,7 +1566,7 @@ main { } .review_block_author_name { - color: #333333; + color: @textColor; font-weight: bold; font-size: 13px; line-height: 120%; @@ -1676,7 +1678,7 @@ main { &.spreadsheet { background-image: url("images/screenshots/de/spreadsheet.png"); - + @media @retina { background-image: url("images/screenshots/de/spreadsheet@2x.png"); } @@ -1684,7 +1686,7 @@ main { &.presentation { background-image: url("images/screenshots/de/presentation.png"); - + @media @retina { background-image: url("images/screenshots/de/presentation@2x.png"); } @@ -1692,7 +1694,7 @@ main { &.collaboration { background-image: url("images/screenshots/de/collaboration.png"); - + @media @retina { background-image: url("images/screenshots/de/collaboration@2x.png"); } @@ -1772,7 +1774,7 @@ main { &.spreadsheet { background-image: url("images/screenshots/fr/spreadsheet.png"); - + @media @retina { background-image: url("images/screenshots/fr/spreadsheet@2x.png"); } @@ -1780,7 +1782,7 @@ main { &.presentation { background-image: url("images/screenshots/fr/presentation.png"); - + @media @retina { background-image: url("images/screenshots/fr/presentation@2x.png"); } @@ -1788,7 +1790,7 @@ main { &.collaboration { background-image: url("images/screenshots/fr/collaboration.png"); - + @media @retina { background-image: url("images/screenshots/fr/collaboration@2x.png"); } @@ -1904,7 +1906,7 @@ main { &.spreadsheet { background-image: url("images/screenshots/ru/spreadsheet.png"); - + @media @retina { background-image: url("images/screenshots/ru/spreadsheet@2x.png"); } @@ -1912,7 +1914,7 @@ main { &.presentation { background-image: url("images/screenshots/ru/presentation.png"); - + @media @retina { background-image: url("images/screenshots/ru/presentation@2x.png"); } @@ -1920,7 +1922,7 @@ main { &.collaboration { background-image: url("images/screenshots/ru/collaboration.png"); - + @media @retina { background-image: url("images/screenshots/ru/collaboration@2x.png"); } diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/custom-mode.less b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/custom-mode.less index 3668e4acb..4f85bce11 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/custom-mode.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/custom-mode.less @@ -1,19 +1,21 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../../../../skins/default/params.less"; body.custom-mode { background-color: transparent; @@ -54,7 +56,7 @@ body.custom-mode { &.auth-form-access{ - background: #fff; + background: @body-color; .auth-form-access-container{ padding-bottom: 143px; @@ -80,7 +82,7 @@ body.custom-mode { body.custom-mode.desktop{ #loginPopup{ display: block; - background-color: #fff; + background-color: @body-color; .default-personal-popup_closer{ display: none; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/dark-authorizedocs.less b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/dark-authorizedocs.less new file mode 100644 index 000000000..508225d1c --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/dark-authorizedocs.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "authorizedocs.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/dark-custom-mode.less b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/dark-custom-mode.less new file mode 100644 index 000000000..e093ba59d --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/css/dark-custom-mode.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "custom-mode.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/js/authorizedocs.js b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/js/authorizedocs.js index a47c695d4..32add1073 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/js/authorizedocs.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/js/authorizedocs.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/js/review_builder_script.js b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/js/review_builder_script.js index acc047be4..9a70523e4 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/js/review_builder_script.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/js/review_builder_script.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + function reviewBuilder(reviewArray, reviewLocaleArray, templateID) { if(typeof reviewLocaleArray != "undefined") { reviewArray = _.merge(reviewArray,reviewLocaleArray); diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/js/reviews.js b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/js/reviews.js index 9519d185e..f7b70ca7a 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/js/reviews.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/AuthorizeDocs/js/reviews.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + var order = [1, 5, 8, 3, 7, 4, 2, 6], randomizeOrder = 1, reviewsDataObjectLocale = {}, diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/ChooseTimePeriod/ChooseTimePeriod.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/ChooseTimePeriod/ChooseTimePeriod.ascx.cs index affceba4f..4fa5caf3d 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/ChooseTimePeriod/ChooseTimePeriod.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/ChooseTimePeriod/ChooseTimePeriod.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/ChooseTimePeriod/css/choosetimeperiod.less b/web/studio/ASC.Web.Studio/UserControls/Common/ChooseTimePeriod/css/choosetimeperiod.less index 6e4ead4ab..c98561285 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/ChooseTimePeriod/css/choosetimeperiod.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/ChooseTimePeriod/css/choosetimeperiod.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/ChooseTimePeriod/js/choosetimeperiod.js b/web/studio/ASC.Web.Studio/UserControls/Common/ChooseTimePeriod/js/choosetimeperiod.js index 503c9e1da..cdd60ee56 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/ChooseTimePeriod/js/choosetimeperiod.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/ChooseTimePeriod/js/choosetimeperiod.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Comments/CommentInfo.cs b/web/studio/ASC.Web.Studio/UserControls/Common/Comments/CommentInfo.cs index 8b2684a67..4dfeb0fdc 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Comments/CommentInfo.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Comments/CommentInfo.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,47 +34,61 @@ public class Attachment [DataContract] public class CommentInfo { + ///12261949-db62-43c2-b956-91e12c412d5a [DataMember(Name = "commentID")] public string CommentID { get; set; } + ///15985c13-ad91-4f2c-9286-cf991448e796 [DataMember(Name = "userID")] public Guid UserID { get; set; } + ///null [DataMember(Name = "userPost")] public string UserPost { get; set; } + ///Administrator [DataMember(Name = "userFullName")] public string UserFullName { get; set; } + ///\/Products\/People\/Profile.aspx?user=administrator [DataMember(Name = "userProfileLink")] public string UserProfileLink { get; set; } + ///\/skins\/default\/images\/default_user_photo_size_82-82.png [DataMember(Name = "userAvatarPath")] public string UserAvatarPath { get; set; } + ///

    das

    \u000a
    [DataMember(Name = "commentBody")] public string CommentBody { get; set; } + ///false [DataMember(Name = "inactive")] public bool Inactive { get; set; } + ///true [DataMember(Name = "isRead")] public bool IsRead { get; set; } + ///true [DataMember(Name = "isEditPermissions")] public bool IsEditPermissions { get; set; } + ///true [DataMember(Name = "isResponsePermissions")] public bool IsResponsePermissions { get; set; } public DateTime TimeStamp { get; set; } + ///15:39 Today [DataMember(Name = "timeStampStr")] public string TimeStampStr { get; set; } + ///null [DataMember(Name = "commentList")] public IList CommentList { get; set; } + ///null [DataMember(Name = "attachments")] public IList Attachments { get; set; } } diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Comments/Comments.cs b/web/studio/ASC.Web.Studio/UserControls/Common/Comments/Comments.cs index 3a70da92a..cf87d0624 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Comments/Comments.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Comments/Comments.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Comments/css/codehighlighter/vs.less b/web/studio/ASC.Web.Studio/UserControls/Common/Comments/css/codehighlighter/vs.less index 15bfed24a..d80bb9fef 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Comments/css/codehighlighter/vs.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Comments/css/codehighlighter/vs.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + /* Visual Studio-like style based on original C# coloring by Jason Diamond */ diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Comments/js/comments.js b/web/studio/ASC.Web.Studio/UserControls/Common/Comments/js/comments.js index 3f62fb269..9187a372b 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Comments/js/comments.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Comments/js/comments.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -276,14 +276,14 @@ var CommentsManagerObj = new function() { function redraw() { oddcnt = jq('#mainCommentsContainer div[id^=comment_]:even') - .css({ 'border-top': '1px solid #DDD', 'border-bottom': '1px solid #DDD' }) + .css({ 'border-top': ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? '1px solid #DDD' : '1px solid #474747', 'border-bottom': ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? '1px solid #DDD' : '1px solid #474747' }) .length; evencnt = jq('#mainCommentsContainer div[id^=comment_]:odd') .css({ 'border-top': '', 'border-bottom': '' }) .length; if (oddcnt == evencnt) { - jq('#mainCommentsContainer').css('border-bottom', '1px solid #DDD'); + jq('#mainCommentsContainer').css('border-bottom', ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? '1px solid #DDD' : '1px solid #474747'); } else { jq('#mainCommentsContainer').css('border-bottom', ''); } @@ -400,8 +400,8 @@ var CommentsManagerObj = new function() { scrollToElement(obj, 500); - obj.css({ "background-color": "#ffffcc" }); - obj.animate({ backgroundColor: '#ffffff' }, 1000); + obj.css({ "background-color": ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? "#ffffcc" : "rgba(204, 184, 102, 0.2)" }); + obj.animate({ backgroundColor: ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? "#ffffff" : "#333" }, 1000); CommentsManagerObj.comments.push(comment); @@ -425,8 +425,8 @@ var CommentsManagerObj = new function() { scrollToElement(obj, 500); - obj.css({ "background-color": "#ffffcc" }); - obj.animate({ backgroundColor: '#ffffff' }, 1000); + obj.css({ "background-color": ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? "#ffffcc" : "rgba(204, 184, 102, 0.2)" }); + obj.animate({ backgroundColor: ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? "#ffffff" : "#333" }, 1000); CommentsManagerObj.CallFCKComplete(); }; @@ -554,7 +554,7 @@ var CommentsManagerObj = new function() { if (hash.indexOf("#comment_") == 0) { setTimeout(function () { scrollToElement(hash, 500); - jq(hash).css({ "background-color": "#ffffcc" }).animate({ backgroundColor: '#ffffff' }, 1000); + jq(hash).css({ "background-color": ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? "#ffffcc" : "rgba(204, 184, 102, 0.2)" }).animate({ backgroundColor: ASC.Resources.Master.ModeThemeSettings.ModeThemeName == 0 ? "#ffffff" : "#333" }, 1000); }, 1000); } } diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Confirm/Confirm.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/Confirm/Confirm.ascx.cs index 4f7b56182..27f8907bf 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Confirm/Confirm.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Confirm/Confirm.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Confirm/js/confirm.js b/web/studio/ASC.Web.Studio/UserControls/Common/Confirm/js/confirm.js index 72456d30b..ade1a3c4c 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Confirm/js/confirm.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Confirm/js/confirm.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/HelpCenter.ascx b/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/HelpCenter.ascx index 81cbd13af..53a78352e 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/HelpCenter.ascx +++ b/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/HelpCenter.ascx @@ -12,7 +12,7 @@ diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/HelpCenter.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/HelpCenter.ascx.cs index 947614f73..95e4a662e 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/HelpCenter.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/HelpCenter.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ using System.Web.UI; using ASC.Web.Core; +using ASC.Web.Core.Utility; using ASC.Web.Studio.Core.HelpCenter; using ASC.Web.Studio.UserControls.Common.VideoGuides; using ASC.Web.Studio.Utility; @@ -48,8 +49,14 @@ protected void Page_Load(object sender, EventArgs e) { return; } - - Page.RegisterStyle("~/UserControls/Common/HelpCenter/css/help-center.less"); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Common/HelpCenter/css/dark-help-center.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Common/HelpCenter/css/help-center.less"); + } string module; string mainLink; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/css/dark-help-center.less b/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/css/dark-help-center.less new file mode 100644 index 000000000..b7294f924 --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/css/dark-help-center.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "help-center.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/css/help-center.less b/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/css/help-center.less index e892f428a..0f8147f9b 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/css/help-center.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/css/help-center.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,8 +15,10 @@ */ +@import "../../../../skins/default/params.less"; + .help-center-content h6 { - color: #3D4A6B; + color: @help-center-content-a-col; font-size: 15px; font-weight: 500; margin: 20px 0 0; @@ -28,7 +30,7 @@ } .help-center-content a { - color: #3D4A6B; + color: @help-center-content-a-col; } .help-center-content ol, .help-center-content ul { @@ -52,10 +54,10 @@ width: 350px; } -.help-center-content .notehelp, +.help-center-content .notehelp, .help-center-content .noteportalhelp { - background: #EFEFEF; - color: #808080; + background: @help-center-notelist-bg; + color: @help-center-notelist-color; display: block; font-size: 11px; line-height: 1.3em; @@ -138,8 +140,8 @@ } .help-center-content a.see_also { background: none repeat scroll 0 0 transparent; - border-bottom: 1px dotted #3D4A6B; - color: #3D4A6B; + border-bottom: 1px dotted @help-center-content-a-col; + color: @help-center-content-a-col; display: inline; font-size: 13px; margin: 0; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/js/help-center.js b/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/js/help-center.js index a4d27337e..58bb9fbf5 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/js/help-center.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/HelpCenter/js/help-center.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/InviteLink/InviteLink.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/InviteLink/InviteLink.ascx.cs index f97823c51..ef53ffe54 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/InviteLink/InviteLink.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/InviteLink/InviteLink.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/InviteLink/js/invitelink.js b/web/studio/ASC.Web.Studio/UserControls/Common/InviteLink/js/invitelink.js index c89c38d08..bc212de68 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/InviteLink/js/invitelink.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/InviteLink/js/invitelink.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + jq(document).ready(function () { try { var inviteLinkShow = true; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/LoaderPage/LoaderPage.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/LoaderPage/LoaderPage.ascx.cs index 8d7ff869d..4d471b0c8 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/LoaderPage/LoaderPage.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/LoaderPage/LoaderPage.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ using System.Web.UI; using ASC.Core; +using ASC.Web.Core.Utility; using ASC.Web.Core.WhiteLabel; namespace ASC.Web.Studio.UserControls.Common.LoaderPage @@ -38,7 +39,14 @@ protected void Page_Load(object sender, EventArgs e) { DefaultSettings = !CoreContext.Configuration.CustomMode && CompanyWhiteLabelSettings.Instance.IsDefault; - Page.RegisterStyle("~/UserControls/Common/LoaderPage/css/loaderpage.less"); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Common/LoaderPage/css/dark-loaderpage.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Common/LoaderPage/css/loaderpage.less"); + } } } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/LoaderPage/css/dark-loaderpage.less b/web/studio/ASC.Web.Studio/UserControls/Common/LoaderPage/css/dark-loaderpage.less new file mode 100644 index 000000000..f87be794a --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/LoaderPage/css/dark-loaderpage.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "loaderpage.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/LoaderPage/css/loaderpage.less b/web/studio/ASC.Web.Studio/UserControls/Common/LoaderPage/css/loaderpage.less index 487e63ecd..f65960705 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/LoaderPage/css/loaderpage.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/LoaderPage/css/loaderpage.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ +@import "../../../../skins/default/params.less"; /******************************************************************************* Page loader *******************************************************************************/ @@ -43,7 +44,7 @@ font-size: 14px; margin-left: 80px; margin-top: 125px; - color: #888; + color: @loader-page-text-color; white-space: nowrap; } @@ -71,7 +72,7 @@ position: absolute; } .romb.blue { - background: #55bce6; + background: @loader-romb-blue-col; z-index: 3; -webkit-animation-name: blue; -moz-animation-name: blue; @@ -80,7 +81,7 @@ animation-name: blue; } .romb.red { - background: #de7a59; + background: @loader-romb-red-col; z-index:1; -webkit-animation-name: red; -moz-animation-name: red; @@ -89,7 +90,7 @@ animation-name: red; } .romb.green { - background: #a1cb5c; + background: @loader-romb-green-col; z-index: 2; -webkit-animation-name: green; -moz-animation-name: green; @@ -99,72 +100,72 @@ } @-webkit-keyframes red { - 0% {top:120px; background: #de7a59;} - 10% {top:120px; background: #F2CBBF;} - 14% { background: #fff; top:120px;} - 15% { background: #fff; top:0;} - 20% {background: #E6E4E4; } - 30% {background: #D2D2D2;} + 0% {top:120px; background: @loader-romb-red-col;} + 10% {top:120px; background: @loader-romb-red-col10;} + 14% { background: @body-color; top:120px;} + 15% { background: @body-color; top:0;} + 20% {background: @loader-romb-red-col20; } + 30% {background: @loader-romb-red-col30;} 40% { top:120px; } - 100% { top:120px; background: #de7a59;} + 100% { top:120px; background: @loader-romb-red-col;} } @keyframes red { - 0% {top:120px; background: #de7a59;} - 10% {top:120px; background: #F2CBBF;} - 14% { background: #fff; top:120px;} - 15% { background: #fff; top:0;} - 20% {background: #E6E4E4; } - 30% {background: #D2D2D2;} + 0% {top:120px; background: @loader-romb-red-col;} + 10% {top:120px; background: @loader-romb-red-col10;} + 14% { background: @body-color; top:120px;} + 15% { background: @body-color; top:0;} + 20% {background: @loader-romb-red-col20; } + 30% {background: @loader-romb-red-col30;} 40% { top:120px; } - 100% { top:120px; background: #de7a59;} + 100% { top:120px; background: @loader-romb-red-col;} } @-webkit-keyframes green { - 0% {top:110px; background: #a1cb5c;opacity:1;} - 10% {top:110px; background: #CBE0AC; opacity:1;} - 14% { background: #fff; top:110px; opacity:1;} - 15% { background: #fff; top:0;opacity:1;} - 20% {background: #ffffff; top:0; opacity:0;} - 25% {background: #EFEFEF; top:0; opacity:1; } - 30% {background:#E6E4E4; } + 0% {top:110px; background: @loader-romb-green-col;opacity:1;} + 10% {top:110px; background: @loader-romb-green-col10; opacity:1;} + 14% { background: @body-color; top:110px; opacity:1;} + 15% { background: @body-color; top:0;opacity:1;} + 20% {background: @body-color; top:0; opacity:0;} + 25% {background: @loader-romb-green-col25; top:0; opacity:1; } + 30% {background:@loader-romb-green-col30; } 70% { top:110px;} - 100% { top:110px; background: #a1cb5c;} + 100% { top:110px; background: @loader-romb-green-col;} } @keyframes green { - 0% {top:110px; background: #a1cb5c;opacity:1;} - 10% {top:110px; background: #CBE0AC; opacity:1;} - 14% { background: #fff; top:110px; opacity:1;} - 15% { background: #fff; top:0;opacity:1;} - 20% {background: #ffffff; top:0; opacity:0;} - 25% {background: #EFEFEF; top:0; opacity:1; } - 30% {background:#E6E4E4; } + 0% {top:110px; background: @loader-romb-green-col;opacity:1;} + 10% {top:110px; background: @loader-romb-green-col10; opacity:1;} + 14% { background: @body-color; top:110px; opacity:1;} + 15% { background: @body-color; top:0;opacity:1;} + 20% {background: @body-color; top:0; opacity:0;} + 25% {background: @loader-romb-green-col25; top:0; opacity:1; } + 30% {background:@loader-romb-green-col30; } 70% { top:110px;} - 100% { top:110px; background: #a1cb5c;} + 100% { top:110px; background: @loader-romb-green-col;} } @-webkit-keyframes blue { - 0% {top:100px; background: #55bce6;opacity:1;} - 10% {top:100px; background: #BFE8F8; opacity:1;} - 14% { background: #fff; top:100px; opacity:1;} - 15% { background: #fff; top:0;opacity:1;} - 20% {background: #ffffff; top:0; opacity:0;} - 25% {background: #ffffff; top:0; opacity:0;} - 45% {background: #EFEFEF; top:0;opacity:0,2;} - 100% { top:100px;background: #55bce6;} + 0% {top:100px; background: @loader-romb-blue-col;opacity:1;} + 10% {top:100px; background: @loader-romb-blue-col10; opacity:1;} + 14% { background: @body-color; top:100px; opacity:1;} + 15% { background: @body-color; top:0;opacity:1;} + 20% {background: @body-color; top:0; opacity:0;} + 25% {background: @body-color; top:0; opacity:0;} + 45% {background: @loader-romb-blue-col45; top:0;opacity:0,2;} + 100% { top:100px;background: @loader-romb-blue-col;} } @keyframes blue { - 0% {top:100px; background: #55bce6;opacity:1;} - 10% {top:100px; background: #BFE8F8; opacity:1;} - 14% { background: #fff; top:100px; opacity:1;} - 15% { background: #fff; top:0;opacity:1;} - 20% {background: #ffffff; top:0; opacity:0;} - 25% {background: #ffffff; top:0; opacity:0;} - 45% {background: #EFEFEF; top:0;opacity:0,2;} - 100% { top:100px;background: #55bce6;} + 0% {top:100px; background: @loader-romb-blue-col;opacity:1;} + 10% {top:100px; background: @loader-romb-blue-col10; opacity:1;} + 14% { background: @body-color; top:100px; opacity:1;} + 15% { background: @body-color; top:0;opacity:1;} + 20% {background: @body-color; top:0; opacity:0;} + 25% {background: @body-color; top:0; opacity:0;} + 45% {background: @loader-romb-blue-col45; top:0;opacity:0,2;} + 100% { top:100px;background: @loader-romb-blue-col;} } .loader-page.static .romb { @@ -182,15 +183,15 @@ .loader-page.static .romb.blue { top: 100px; - background: #55bce6; + background: @loader-romb-blue-col; } .loader-page.static .romb.red { top: 120px; - background: #de7a59; + background: @loader-romb-red-col; } .loader-page.static .romb.green { top: 110px; - background: #a1cb5c; + background: @loader-romb-green-col; } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/LoginWithThirdParty.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/LoginWithThirdParty.ascx.cs index bf7c71a78..718b73843 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/LoginWithThirdParty.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/LoginWithThirdParty.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -157,7 +157,7 @@ public static UserInfo GetUserByThirdParty(LoginProfile loginProfile) try { const string _databaseID = "com"; - using (var db = DbManager.FromHttpContext(_databaseID)) + using (var db = new DbManager(_databaseID)) { db.ExecuteNonQuery(new SqlInsert("template_unsubscribe", false) .InColumnValue("email", userInfo.Email.ToLowerInvariant()) diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/MediaPlayer.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/MediaPlayer.ascx.cs index cd5a0d368..47e8b0702 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/MediaPlayer.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/MediaPlayer.ascx.cs @@ -1,24 +1,26 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web; using System.Web.UI; +using ASC.Web.Core.Utility; + namespace ASC.Web.Studio.UserControls.Common { public partial class MediaPlayer : UserControl @@ -34,8 +36,16 @@ protected void Page_Load(object sender, EventArgs e) "~/UserControls/Common/MediaViewer/imageviewer.js", "~/UserControls/Common/MediaViewer/tiff.min.js", "~/js/third-party/jquery/jquery.jplayer.js", - "~/js/third-party/jquery/jquery.mousewheel.js") - .RegisterStyle("~/UserControls/Common/MediaViewer/mediaplayer.css"); + "~/js/third-party/jquery/jquery.mousewheel.js"); + + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Common/MediaViewer/dark-mediaplayer.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Common/MediaViewer/mediaplayer.less"); + } } } } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/dark-mediaplayer.less b/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/dark-mediaplayer.less new file mode 100644 index 000000000..976a89d1b --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/dark-mediaplayer.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "mediaplayer.less"; +@import "../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/imageviewer.js b/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/imageviewer.js index 70a364097..b307c6c04 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/imageviewer.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/imageviewer.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + window.ASC.Files.ImageViewer = (function () { var scalingInProcess = false; var currentFileName; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/mediaplayer.js b/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/mediaplayer.js index b87d3be68..69fd415b0 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/mediaplayer.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/mediaplayer.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -367,7 +367,7 @@ window.ASC.Files.MediaPlayer = (function () { options.onMediaChangedAction(fileId); } - if (options.deleteAction && options.canDelete && options.canDelete(currentFileId)) { + if (options.deleteAction && options.canDelete && options.canDelete(currentFileId) && ASC.Resources.Master.IsAuthenticated) { jq("#videoDelete").show(); } else { jq("#videoDelete").hide(); @@ -652,7 +652,7 @@ window.ASC.Files.MediaPlayer = (function () { }; var deleteFile = function () { - if (!options.canDelete || !options.canDelete(currentFileId) || !options.deleteAction) { + if (!options.canDelete || !options.canDelete(currentFileId) || !options.deleteAction || !ASC.Resources.Master.IsAuthenticated) { return; } diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/mediaplayer.css b/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/mediaplayer.less similarity index 93% rename from web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/mediaplayer.css rename to web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/mediaplayer.less index 94fe28d47..d8c556dbb 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/mediaplayer.css +++ b/web/studio/ASC.Web.Studio/UserControls/Common/MediaViewer/mediaplayer.less @@ -1,19 +1,21 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../../../skins/default/params.less"; .scroll-fix { overflow: hidden !important; @@ -24,8 +26,8 @@ top: 50%; left: 0; width: 100%; - color: white; - z-index: 400; + color: @bodyColor2; + z-index: 400; text-align: center; } @@ -46,7 +48,7 @@ #mediaPlayer { display: none; - color: #d1d1d1; + color: @borderColor; } #videoViewerOverlay { @@ -249,19 +251,19 @@ } .jp-pos { - background-color: #d1d1d1; + background-color: @borderColor; text-align: right; pointer-events: none; } .jp-pos > span, .jp-volume-bar-value > span { - width: 12px; - height: 12px; - background: white; - display: inline-block; - border-radius: 50%; - margin-top: -3px; - margin-right: -3px; + width: 12px; + height: 12px; + background: @bodyColor2; + display: inline-block; + border-radius: 50%; + margin-top: -3px; + margin-right: -3px; } .jp-pos > span, .jp-volume-bar-value > span { @@ -298,7 +300,7 @@ } .jp-volume-bar-value { - background-color: #d1d1d1; + background-color: @borderColor; position: absolute; bottom: 0; pointer-events: none; @@ -347,7 +349,7 @@ -webkit-border-radius: 3px; border-radius: 3px; background-color: #303030; - color: #FFFFFF; + color: @body-color; display: none; font-size: 15px; font-weight: bold; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/MigrationPortal/MigrationPortal.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/MigrationPortal/MigrationPortal.ascx.cs index 2e07ba9e3..5733b01cf 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/MigrationPortal/MigrationPortal.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/MigrationPortal/MigrationPortal.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web.UI; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/MigrationPortal/css/migrationportal.less b/web/studio/ASC.Web.Studio/UserControls/Common/MigrationPortal/css/migrationportal.less index 932f28512..eacfa0013 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/MigrationPortal/css/migrationportal.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/MigrationPortal/css/migrationportal.less @@ -1,19 +1,21 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../../../../skins/default/params.less"; html, body, div, span, p { margin: 0; @@ -81,7 +83,7 @@ html { display: inline-block; margin: 0 auto; width: 200px; - background-color: #d1d1d1; + background-color: @borderColor; height: 14px; overflow: hidden; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/MigrationPortal/js/migrationportal.js b/web/studio/ASC.Web.Studio/UserControls/Common/MigrationPortal/js/migrationportal.js index 002302866..10eae7b95 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/MigrationPortal/js/migrationportal.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/MigrationPortal/js/migrationportal.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + window.MigrationPortal = new function () { this.init = function () { showProgress(0); diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/PersonalFooter.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/PersonalFooter.ascx.cs index dd9299217..7ebe16a92 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/PersonalFooter.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/PersonalFooter.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ using System.Web; using System.Web.UI; +using ASC.Web.Core.Utility; using ASC.Web.Studio.Utility; namespace ASC.Web.Studio.UserControls.Common.PersonalFooter @@ -40,8 +41,15 @@ public static string LocationCustomMode protected void Page_Load(object sender, EventArgs e) { - Page.RegisterStyle("~/UserControls/Common/PersonalFooter/css/personalfooter.less") - .RegisterBodyScripts("~/UserControls/Common/PersonalFooter/js/personalfooter.js"); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Common/PersonalFooter/css/dark-personalfooter.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Common/PersonalFooter/css/personalfooter.less"); + } + Page.RegisterBodyScripts("~/UserControls/Common/PersonalFooter/js/personalfooter.js"); HelpLink = GetHelpLink(); } diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/css/dark-personalfooter.less b/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/css/dark-personalfooter.less new file mode 100644 index 000000000..5cac42c62 --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/css/dark-personalfooter.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "personalfooter.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/css/personalfooter.less b/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/css/personalfooter.less index 910a5ba4e..10eadada6 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/css/personalfooter.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/css/personalfooter.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,24 +15,26 @@ */ +@import "../../../../skins/default/params.less"; + .personal-footer { - background-color: #f7f7f7; + background-color: @bg-button-default-disable; font-size: 12px; - height: auto; - position:absolute; - bottom:0; + position: absolute; + bottom: 0; width: 100%; + a { - color: #000; + color: @bg-a-activate; text-decoration: none; - } + } } .personal-footer_w { width: 955px; margin: 0 auto; padding: 25px 0 18px; - background: #f7f7f7; + background: @bg-button-default-disable; } .personal-footer_rights { float: right; @@ -50,12 +52,12 @@ position: relative; span { - border-bottom: 1px dotted #666; + border-bottom: 1px dotted @textColorBlackDark; } &:after { content: ""; - border-top: 4px solid #666; + border-top: 4px solid @textColorBlackDark; border-left: 4px solid transparent; border-right: 4px solid transparent; position: absolute; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/js/personalfooter.js b/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/js/personalfooter.js index 1b830f27d..439a1807b 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/js/personalfooter.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/PersonalFooter/js/personalfooter.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/PollForm.cs b/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/PollForm.cs index c3521db9a..15183ed5d 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/PollForm.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/PollForm.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/PollFormMaster.cs b/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/PollFormMaster.cs index bd13ab72f..1f522658a 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/PollFormMaster.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/PollFormMaster.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -141,7 +141,7 @@ protected override void OnLoad(EventArgs e) { base.OnLoad(e); Page.RegisterBodyScripts("~/UserControls/Common/PollForm/js/pollform.js") - .RegisterStyle("~/UserControls/Common/PollForm/css/style.css"); + .RegisterStyle("~/UserControls/Common/PollForm/css/style.less"); } protected override void OnInit(EventArgs e) diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/css/style.css b/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/css/style.less similarity index 91% rename from web/studio/ASC.Web.Studio/UserControls/Common/PollForm/css/style.css rename to web/studio/ASC.Web.Studio/UserControls/Common/PollForm/css/style.less index 8cd622f85..8e6dd565d 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/css/style.css +++ b/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/css/style.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,44 +15,44 @@ */ -span[class^='poll_remove_span'] -{ - display:block; - background-image: url("img/delete.png"); - background-repeat: no-repeat; - background-position: center; - float:right; - font-size: 14px; - font-weight: bold; - margin: 3px 3px 0 3px; - cursor: pointer; - width: 16px; - height: 16px; -} - -.poll_clearFix:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; -} - -/* MSIE7- */ -.poll_clearFix { - zoom: 1; - display:block; -} - -.poll_variantLabel -{ - top:4px; - position:relative; -} - -.poll_variantDiv -{ - height:16px; - padding-bottom:12px; - width: 600px; +span[class^='poll_remove_span'] +{ + display:block; + background-image: url("img/delete.png"); + background-repeat: no-repeat; + background-position: center; + float:right; + font-size: 14px; + font-weight: bold; + margin: 3px 3px 0 3px; + cursor: pointer; + width: 16px; + height: 16px; +} + +.poll_clearFix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* MSIE7- */ +.poll_clearFix { + zoom: 1; + display:block; +} + +.poll_variantLabel +{ + top:4px; + position:relative; +} + +.poll_variantDiv +{ + height:16px; + padding-bottom:12px; + width: 600px; } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/js/pollform.js b/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/js/pollform.js index 06cfbb30d..7be7cb26f 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/js/pollform.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/PollForm/js/pollform.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/PortalEncryption/PortalEncryption.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/PortalEncryption/PortalEncryption.ascx.cs index 4f6eb2b74..3da31edbf 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/PortalEncryption/PortalEncryption.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/PortalEncryption/PortalEncryption.ascx.cs @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + using System; using System.Web.UI; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/PortalEncryption/css/portalencryption.less b/web/studio/ASC.Web.Studio/UserControls/Common/PortalEncryption/css/portalencryption.less index 5a792f04c..b26684321 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/PortalEncryption/css/portalencryption.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/PortalEncryption/css/portalencryption.less @@ -1,20 +1,21 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../../../../skins/default/params.less"; html, body, div, span, p { margin: 0; padding: 0; @@ -78,7 +79,7 @@ html { display: inline-block; margin: 0 auto; width: 200px; - background-color: #d1d1d1; + background-color: @borderColor; height: 14px; overflow: hidden; border-radius: 2px; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/PortalEncryption/js/portalencryption.js b/web/studio/ASC.Web.Studio/UserControls/Common/PortalEncryption/js/portalencryption.js index 291cbf50f..c81ca7462 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/PortalEncryption/js/portalencryption.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/PortalEncryption/js/portalencryption.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + window.PortalEncryption = new function () { this.init = function () { showProgress(0); diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/PreparationPortal.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/PreparationPortal.ascx.cs index 75312d3f3..b67cdc81e 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/PreparationPortal.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/PreparationPortal.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/css/preparationportal.css b/web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/css/preparationportal.less similarity index 99% rename from web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/css/preparationportal.css rename to web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/css/preparationportal.less index 5362db9a3..60591d0d7 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/css/preparationportal.css +++ b/web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/css/preparationportal.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,107 +15,109 @@ */ -html, body, div, span, p { - margin: 0; - padding: 0; - border: 0; - vertical-align: baseline; - background: transparent; -} - -body { - background: #DFDFDF url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAUAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQAAgICAgICAgICAgMCAgIDBAMCAgMEBQQEBAQEBQYFBQUFBQUGBgcHCAcHBgkJCgoJCQwMDAwMDAwMDAwMDAwMDAEDAwMFBAUJBgYJDQsJCw0PDg4ODg8PDAwMDAwPDwwMDAwMDA8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgDrgABAwERAAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A+vFM3zz1LqYFXYpbwJX0wIpdhSupgSuwKvoMCW6YrS6h8MKV+RVdTFK7Aq+mKV2BK6mKV9MC0voMUrsCV9BgtV1MU0voMbVdgTS+gwJXUOKqlMC03Q4pX4ErqHFK/Aq6hxSvyKV9MVXYpXUwJX4FXUxTa/FV9BgS3gWm6HwxSqYq3Q4Er8Ct4sqX4ELsKV1MCV1MC03Q4pX0wKuwpb4++C1XYFbxTTdD4YqvyKXYVbxSupii3cvbAlbirsVdiqnirsVW8jiq3FWuQxVZirqjxxVTxV2KqeKuqPHFVPFXYqp1PjiqzkcVaxVbyOKrajxxVTxVrkMVWYqsqcVW1GKrMVW8vbFVuKrKnFVtRiqzFVvL2xVbUeOKqeKrKnFWsVU8VaqMVWYqt5e2KrcVU8VW8jiq3FVlT44q1iqnirsVU8VdUeOKqeKrORxVrFVvL2xVSq/8v44q/wD/2Q==') 0 0 repeat-x; - font-family: sans-serif; - font-size: 14px; - cursor: default; - min-height: 100%; - position: relative; -} - -html { - height: 100%; -} - -* html body { - height: 100%; -} - -#wrapper { - background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA7gAAAKGCAMAAABX4McAAAAB7FBMVEUAAAD////x9/v2+vz////////////8/f7s9fn////////o8vj////////////y+Pv////////v9vr////v9vv5/P7s9fr3+/3////////0+fz1+f36/P3////+///3+v3////l8Pf////8/f/+///y9/r0+fz////8/v/t9fry+Pv////q8/n////+/v/p7/L+///v9fn+/v/8/v79/v/9/v/o8vjq8/n+///3+/3z+fvw8/Xx9vn3+/35+/3+///9/v/+///5+/3o8vj8/f7x8/T4+/3n8vju8vTe4uT1+vzy+Pvo7fHn8ff7/f73+vz2+vz1+fzi6Oz4+/30+Pv2+vzm6er1+fve39/8/f7y9/rj6/Dq8vjV29/y9/rn8fjs7u/r8/jZ4ebr7vDi5ebh5+rx9/vs7/Hq8/jP0NHs7e64ubrV2dzr7OzO1NjZ29zs9Pnw8/Tf4+Tq8vjHysvU1tfHyMjq7O3q8fXQ0tPp8ffJzdDBw8Px9PXr7/Hc3uDm6eu+wMHv8PG1t7jo6+ypq63m6ezk5ufd4OLCxcfFx8rZ3N3d3+HNz9HZ3d/k5+no6uvQ09T////6/P33+v3v9vvq9Pny+Pvk8Pfv8/X19/je5+3r8fTs7u/i6u/a4ebn7fHo6ura6/bT3ONbkV4RAAAAknRSTlMACuHiJB0X4OESL+FLKjXvOkTrP+XU6u5bYenckH9o3VXfe8PK9OaWhYV+UuVyiO1t27qkqZ1+jYvyhe6O0vN3r7Pngtvif9r057Z445T1u7DC4snQo+X2mumY45rmntOawOTwoO7N9Mej5a/ik+Wny+nds7PbqI2trqTkstbc2dm707/Pxqb68N/Ey7vNr8i7vDlyMAUAAU/LSURBVHja7Jptb9swDITDLwb0///wstnLM/ZMU4cAQ53q8tJikXgUxROprI+FhYWFhYWFhYWFhYWFhTnE7+fCt8d/36S4JP3Oq4v0sOHONdneN3IMiiVeH5Ef/iifrLPiM/pW/OHvr843l1wyjYY+DPcdspoT2jZcS7oOYmp7jd0wybzBJpiHAty087lqh33X1fvw5vPCo24CP+KtcOeCWtAlPhht4h+meQ00UQZBdHOgfbaCSgY2fpmry1lZQDndJlMcf7NP4C2e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") center 0 no-repeat; - width: 100%; - height: 310px; - padding: 315px 0 0; - margin-top: -325px; - position: absolute; - left: 0; - top: 50%; - z-index: 1; -} - -#container { - width: 380px; - margin: 0 auto; - padding-left: 38px; - text-align: center; - position: relative; -} -#container p { - color: #275678; -} -#container #logo { - left: 112px; - position: absolute; - top: -101px; -} - -#content p { - font-size: 20px; - margin-bottom: 5px; -} - -.asc-progress-wrapper { - display: inline-block; - margin: 0 auto; - width: 200px; -} - -.asc-progress_percent { - color: #83888d; - display: inline-block; - margin-top: -10px; - vertical-align: middle; - width: 30px; - font-size: 14px; -} - -#progress-line { - margin: 20px auto; -} - -#progress-error { - display: none; - color: #cc3300; - font-size: 14px; - margin: 20px 0; -} -/* Progress bar style*/ -.asc-progress-wrapper { - background-color: #d1d1d1; - height: 14px; - overflow: hidden; - - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; -} -.asc-progress-wrapper .asc-progress-value { - background: #439CCD; - height: inherit; - width: 0; - - background: linear-gradient(top, #57aedf, #439CCD 50%, #3B95C6 51%, #237faf); - background: -o-linear-gradient(top, #57aedf, #439CCD 50%, #3B95C6 51%, #237faf); - background: -moz-linear-gradient(top, #57aedf, #439CCD 50%, #3B95C6 51%, #237faf); - background: -webkit-linear-gradient(top, #57aedf, #439CCD 50%, #3B95C6 51%, #237faf); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#57aedf', EndColorStr='#237faf')"; +@import "../../../../skins/default/params.less"; + +html, body, div, span, p { + margin: 0; + padding: 0; + border: 0; + vertical-align: baseline; + background: transparent; +} + +body { + background: #DFDFDF url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAUAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQAAgICAgICAgICAgMCAgIDBAMCAgMEBQQEBAQEBQYFBQUFBQUGBgcHCAcHBgkJCgoJCQwMDAwMDAwMDAwMDAwMDAEDAwMFBAUJBgYJDQsJCw0PDg4ODg8PDAwMDAwPDwwMDAwMDA8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgDrgABAwERAAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A+vFM3zz1LqYFXYpbwJX0wIpdhSupgSuwKvoMCW6YrS6h8MKV+RVdTFK7Aq+mKV2BK6mKV9MC0voMUrsCV9BgtV1MU0voMbVdgTS+gwJXUOKqlMC03Q4pX4ErqHFK/Aq6hxSvyKV9MVXYpXUwJX4FXUxTa/FV9BgS3gWm6HwxSqYq3Q4Er8Ct4sqX4ELsKV1MCV1MC03Q4pX0wKuwpb4++C1XYFbxTTdD4YqvyKXYVbxSupii3cvbAlbirsVdiqnirsVW8jiq3FWuQxVZirqjxxVTxV2KqeKuqPHFVPFXYqp1PjiqzkcVaxVbyOKrajxxVTxVrkMVWYqsqcVW1GKrMVW8vbFVuKrKnFVtRiqzFVvL2xVbUeOKqeKrKnFWsVU8VaqMVWYqt5e2KrcVU8VW8jiq3FVlT44q1iqnirsVU8VdUeOKqeKrORxVrFVvL2xVSq/8v44q/wD/2Q==') 0 0 repeat-x; + font-family: sans-serif; + font-size: 14px; + cursor: default; + min-height: 100%; + position: relative; +} + +html { + height: 100%; +} + +* html body { + height: 100%; +} + +#wrapper { + background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA7gAAAKGCAMAAABX4McAAAAB7FBMVEUAAAD////x9/v2+vz////////////8/f7s9fn////////o8vj////////////y+Pv////////v9vr////v9vv5/P7s9fr3+/3////////0+fz1+f36/P3////+///3+v3////l8Pf////8/f/+///y9/r0+fz////8/v/t9fry+Pv////q8/n////+/v/p7/L+///v9fn+/v/8/v79/v/9/v/o8vjq8/n+///3+/3z+fvw8/Xx9vn3+/35+/3+///9/v/+///5+/3o8vj8/f7x8/T4+/3n8vju8vTe4uT1+vzy+Pvo7fHn8ff7/f73+vz2+vz1+fzi6Oz4+/30+Pv2+vzm6er1+fve39/8/f7y9/rj6/Dq8vjV29/y9/rn8fjs7u/r8/jZ4ebr7vDi5ebh5+rx9/vs7/Hq8/jP0NHs7e64ubrV2dzr7OzO1NjZ29zs9Pnw8/Tf4+Tq8vjHysvU1tfHyMjq7O3q8fXQ0tPp8ffJzdDBw8Px9PXr7/Hc3uDm6eu+wMHv8PG1t7jo6+ypq63m6ezk5ufd4OLCxcfFx8rZ3N3d3+HNz9HZ3d/k5+no6uvQ09T////6/P33+v3v9vvq9Pny+Pvk8Pfv8/X19/je5+3r8fTs7u/i6u/a4ebn7fHo6ura6/bT3ONbkV4RAAAAknRSTlMACuHiJB0X4OESL+FLKjXvOkTrP+XU6u5bYenckH9o3VXfe8PK9OaWhYV+UuVyiO1t27qkqZ1+jYvyhe6O0vN3r7Pngtvif9r057Z445T1u7DC4snQo+X2mumY45rmntOawOTwoO7N9Mej5a/ik+Wny+nds7PbqI2trqTkstbc2dm707/Pxqb68N/Ey7vNr8i7vDlyMAUAAU/LSURBVHja7Jptb9swDITDLwb0///wstnLM/ZMU4cAQ53q8tJikXgUxROprI+FhYWFhYWFhYWFhYWFhTnE7+fCt8d/36S4JP3Oq4v0sOHONdneN3IMiiVeH5Ef/iifrLPiM/pW/OHvr843l1wyjYY+DPcdspoT2jZcS7oOYmp7jd0wybzBJpiHAty087lqh33X1fvw5vPCo24CP+KtcOeCWtAlPhht4h+meQ00UQZBdHOgfbaCSgY2fpmry1lZQDndJlMcf7NP4C2e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") center 0 no-repeat; + width: 100%; + height: 310px; + padding: 315px 0 0; + margin-top: -325px; + position: absolute; + left: 0; + top: 50%; + z-index: 1; +} + +#container { + width: 380px; + margin: 0 auto; + padding-left: 38px; + text-align: center; + position: relative; +} +#container p { + color: #275678; +} +#container #logo { + left: 112px; + position: absolute; + top: -101px; +} + +#content p { + font-size: 20px; + margin-bottom: 5px; +} + +.asc-progress-wrapper { + display: inline-block; + margin: 0 auto; + width: 200px; +} + +.asc-progress_percent { + color: #83888d; + display: inline-block; + margin-top: -10px; + vertical-align: middle; + width: 30px; + font-size: 14px; +} + +#progress-line { + margin: 20px auto; +} + +#progress-error { + display: none; + color: #cc3300; + font-size: 14px; + margin: 20px 0; +} +/* Progress bar style*/ +.asc-progress-wrapper { + background-color: @borderColor; + height: 14px; + overflow: hidden; + + border-radius: 2px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; +} +.asc-progress-wrapper .asc-progress-value { + background: #439CCD; + height: inherit; + width: 0; + + background: linear-gradient(top, #57aedf, #439CCD 50%, #3B95C6 51%, #237faf); + background: -o-linear-gradient(top, #57aedf, #439CCD 50%, #3B95C6 51%, #237faf); + background: -moz-linear-gradient(top, #57aedf, #439CCD 50%, #3B95C6 51%, #237faf); + background: -webkit-linear-gradient(top, #57aedf, #439CCD 50%, #3B95C6 51%, #237faf); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#57aedf', EndColorStr='#237faf')"; } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/js/preparationportal.js b/web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/js/preparationportal.js index 5112507c3..4328df192 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/js/preparationportal.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/PreparationPortal/js/preparationportal.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Search/SearchResults.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/Search/SearchResults.ascx.cs index b889d0119..332d5cc4e 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Search/SearchResults.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Search/SearchResults.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ using System.Web.UI; using System.Web.UI.WebControls; +using ASC.Web.Core.Utility; using ASC.Web.Studio.Core.Search; namespace ASC.Web.Studio.UserControls.Common.Search @@ -38,8 +39,15 @@ public static string Location protected void Page_Load(object sender, EventArgs e) { - Page.RegisterStyle("~/UserControls/Common/Search/css/searchresults.less") - .RegisterBodyScripts("~/UserControls/Common/Search/js/searchresults.js"); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Common/Search/css/dark-searchresults.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Common/Search/css/searchresults.less"); + } + Page.RegisterBodyScripts("~/UserControls/Common/Search/js/searchresults.js"); results.ItemDataBound += ResultsItemDataBound; results.DataSource = SearchResultsData; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Search/css/dark-searchresults.less b/web/studio/ASC.Web.Studio/UserControls/Common/Search/css/dark-searchresults.less new file mode 100644 index 000000000..fded273a0 --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Search/css/dark-searchresults.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "searchresults.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Search/css/searchResults.less b/web/studio/ASC.Web.Studio/UserControls/Common/Search/css/searchResults.less index b3fc1a4b5..920a45619 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Search/css/searchResults.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Search/css/searchResults.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ */ +@import "../../../../skins/default/params.less"; + .search-results-block { padding: 10px; @@ -30,7 +32,7 @@ .showAllLink { border-bottom: 1px dotted; - color: #333333; + color: @textColor; cursor: pointer; text-decoration: none; } @@ -46,7 +48,7 @@ &:after { border-right: 6px solid transparent; border-left: 6px solid transparent; - border-top: 6px solid #666666; + border-top: 6px solid @textColorBlackDark; content: " "; height: 0; left: 0; @@ -61,7 +63,7 @@ &:after { border-bottom: 6px solid transparent; - border-left: 6px solid #666666; + border-left: 6px solid @textColorBlackDark; border-top: 6px solid transparent; border-right: 0 none; left: 3px; @@ -76,7 +78,7 @@ overflow: hidden; div.item, div.universalitem { - border-top: 1px solid #d1d1d1; + border-top: 1px solid @borderColor; min-height: 40px; a { @@ -145,7 +147,7 @@ div.projItem { padding: 5px 10px 5px 10px; - border-top: 1px solid #d1d1d1; + border-top: 1px solid @borderColor; min-height: 40px; overflow: hidden; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Search/js/searchresults.js b/web/studio/ASC.Web.Studio/UserControls/Common/Search/js/searchresults.js index adc5d678a..aab209f64 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Search/js/searchresults.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Search/js/searchresults.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/SharingSettings.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/SharingSettings.ascx.cs index c25ca9d1e..c3f2b7cf5 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/SharingSettings.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/SharingSettings.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/bright-blue/sharingsettingsparams.less b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/bright-blue/sharingsettingsparams.less index 76c904f51..9f906f5e0 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/bright-blue/sharingsettingsparams.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/bright-blue/sharingsettingsparams.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @import "../default/baseparams.less"; @shareGetLinkImage: url("images/link.svg"); diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-bright-blue/sharingsettingsparams.less b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-bright-blue/sharingsettingsparams.less new file mode 100644 index 000000000..8c50cab1f --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-bright-blue/sharingsettingsparams.less @@ -0,0 +1,23 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/baseparams.less"; + +@import "../default/sharingsettings.less"; + +@border-color: #474747; +@body-color: #333; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-dark-green/sharingsettingsparams.less b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-dark-green/sharingsettingsparams.less new file mode 100644 index 000000000..8c50cab1f --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-dark-green/sharingsettingsparams.less @@ -0,0 +1,23 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/baseparams.less"; + +@import "../default/sharingsettings.less"; + +@border-color: #474747; +@body-color: #333; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-deep-blue/sharingsettingsparams.less b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-deep-blue/sharingsettingsparams.less new file mode 100644 index 000000000..8c50cab1f --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-deep-blue/sharingsettingsparams.less @@ -0,0 +1,23 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/baseparams.less"; + +@import "../default/sharingsettings.less"; + +@border-color: #474747; +@body-color: #333; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-default/sharingsettingsparams.less b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-default/sharingsettingsparams.less new file mode 100644 index 000000000..676148a6b --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-default/sharingsettingsparams.less @@ -0,0 +1,23 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/baseparams.less"; + +@import "../default/sharingsettings.less"; + +@border-color: #474747; +@body-color: #333; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-green/sharingsettingsparams.less b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-green/sharingsettingsparams.less index d3ff97682..36e8ff7f7 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-green/sharingsettingsparams.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-green/sharingsettingsparams.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @import "../default/baseparams.less"; @import "../default/sharingsettings.less"; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-pure-orange/sharingsettingsparams.less b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-pure-orange/sharingsettingsparams.less new file mode 100644 index 000000000..8c50cab1f --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-pure-orange/sharingsettingsparams.less @@ -0,0 +1,23 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/baseparams.less"; + +@import "../default/sharingsettings.less"; + +@border-color: #474747; +@body-color: #333; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-wild-pink/sharingsettingsparams.less b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-wild-pink/sharingsettingsparams.less new file mode 100644 index 000000000..8c50cab1f --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/dark-wild-pink/sharingsettingsparams.less @@ -0,0 +1,23 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "../default/baseparams.less"; + +@import "../default/sharingsettings.less"; + +@border-color: #474747; +@body-color: #333; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/deep-blue/sharingsettingsparams.less b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/deep-blue/sharingsettingsparams.less index d3ff97682..36e8ff7f7 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/deep-blue/sharingsettingsparams.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/deep-blue/sharingsettingsparams.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @import "../default/baseparams.less"; @import "../default/sharingsettings.less"; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/default/baseparams.less b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/default/baseparams.less index 7eb025abb..8ec2a52d9 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/default/baseparams.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/default/baseparams.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @shareGetLinkImage: url("images/link.svg"); @shareDefaultActionImage: url("images/default-action.png"); diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/default/sharingsettings.less b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/default/sharingsettings.less index f0c2a84ec..c85ccb174 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/default/sharingsettings.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/default/sharingsettings.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,9 @@ */ +@body-color: #fff; +@border-color: #d1d1d1; + #studio_sharingSettingsDialog { display: none; } @@ -22,7 +25,7 @@ #sharingSettingsDialogBody { #sharingSettingsItems { - border-top: 1px solid #d1d1d1; + border-top: 1px solid @border-color; height: 318px; min-height: 318px; overflow: auto; @@ -314,8 +317,8 @@ body.mobile #sharingSettingsItems { white-space: nowrap; } #studio_sharingSettingsDialog div.action ul.options { - background: #FFFFFF; - border: 1px solid #D1D1D1; + background: @body-color; + border: 1px solid @border-color; list-style: none; margin: -7px -5px; padding: 0; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/default/sharingsettingsparams.less b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/default/sharingsettingsparams.less index 20d3270d9..71c45c1b8 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/default/sharingsettingsparams.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/default/sharingsettingsparams.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @import "baseparams.less"; @import "sharingsettings.less"; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/pure-orange/sharingsettingsparams.less b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/pure-orange/sharingsettingsparams.less index d3ff97682..36e8ff7f7 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/pure-orange/sharingsettingsparams.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/pure-orange/sharingsettingsparams.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @import "../default/baseparams.less"; @import "../default/sharingsettings.less"; diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/wild-pink/sharingsettingsparams.less b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/wild-pink/sharingsettingsparams.less index 76c904f51..9f906f5e0 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/wild-pink/sharingsettingsparams.less +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/css/wild-pink/sharingsettingsparams.less @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + @import "../default/baseparams.less"; @shareGetLinkImage: url("images/link.svg"); diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/js/sharingsettings.js b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/js/sharingsettings.js index b8b3518fb..39dde3a48 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/js/sharingsettings.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SharingSettings/js/sharingsettings.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/SmallChat.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/SmallChat.ascx.cs index 453fbd0cd..d4cc87f14 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/SmallChat.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/SmallChat.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ using System.Web.UI; using ASC.Data.Storage; +using ASC.Web.Core.Utility; namespace ASC.Web.Studio.UserControls.Common.SmallChat { @@ -39,9 +40,16 @@ protected void Page_Load(object sender, EventArgs e) { SoundPath = WebPath.GetPath("UserControls/Common/SmallChat/css/sounds/chat"); + if(ModeThemeSettings.GetModeThemesSettings().ModeThemeName == ModeTheme.dark) + { + Page.RegisterStyle("~/UserControls/Common/SmallChat/css/dark-smallchat.less"); + } + else + { + Page.RegisterStyle("~/UserControls/Common/SmallChat/css/smallchat.less"); + } Page .RegisterStyle( - "~/UserControls/Common/SmallChat/css/smallchat.css", "~/UserControls/Common/SmallChat/css/jquery.cssemoticons.css") .RegisterBodyScripts( "~/js/third-party/jquery/jquery.linkify.js", diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/dark-smallchat.less b/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/dark-smallchat.less new file mode 100644 index 000000000..4a3b8f3a9 --- /dev/null +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/dark-smallchat.less @@ -0,0 +1,19 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + +@import "smallchat.less"; +@import "../../../../skins/dark-default/dark-params.less"; \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/jquery.cssemoticons.css b/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/jquery.cssemoticons.css index 89e852384..10c64a279 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/jquery.cssemoticons.css +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/jquery.cssemoticons.css @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + /* * jQuery CSSEmoticons plugin 0.2.9 * diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/smallchat.css b/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/smallchat.less similarity index 92% rename from web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/smallchat.css rename to web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/smallchat.less index b979836c6..3401bd6ca 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/smallchat.css +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/css/smallchat.less @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,68 +15,70 @@ */ -.display_block { - display: block !important; -} - -.small_chat_main_window { - position: fixed; - width: inherit; - background-color: white; - bottom: 0; - top: auto; - z-index: 99; - outline: none; -} - -.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { - display: none!important; -} -.small_chat_main_window.small_chat_main_window_full { - position: fixed; -} -.noty_text { - font-weight: bold; -} - -.mobile .small_chat_main_window { - position: absolute !important; -} - -.small_chat_main_window_full { - height: 110px; - padding-bottom: 90px; -} - -.mobile .small_chat_main_window_full { - height: 200px !important; -} - -.small_chat_main_window .ui-resizable-n { - top: -3px; - height: 12px; -} - -.small_chat_contact_not_found_record { - position: absolute; - overflow: hidden; - top: 40%; - left: 25px; - width: 176px; - height: 50px; - color: #b2b2b2; - margin-top: 9px; -} - -.not_read_message { - background-color: #ebebeb; -} - -.contact_container { - overflow-y: scroll; - overflow-x: hidden; - height: 100%; - width: 100%; +@import "../../../../skins/default/params.less"; + +.display_block { + display: block !important; +} + +.small_chat_main_window { + position: fixed; + width: inherit; + background-color: @bodyColor2; + bottom: 0; + top: auto; + z-index: 99; + outline: none; +} + +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { + display: none!important; +} +.small_chat_main_window.small_chat_main_window_full { + position: fixed; +} +.noty_text { + font-weight: bold; +} + +.mobile .small_chat_main_window { + position: absolute !important; +} + +.small_chat_main_window_full { + height: 110px; + padding-bottom: 90px; +} + +.mobile .small_chat_main_window_full { + height: 200px !important; +} + +.small_chat_main_window .ui-resizable-n { + top: -3px; + height: 12px; +} + +.small_chat_contact_not_found_record { + position: absolute; + overflow: hidden; + top: 40%; + left: 25px; + width: 176px; + height: 50px; + color: #b2b2b2; + margin-top: 9px; +} + +.not_read_message { + background-color: #ebebeb; +} + +.contact_container { + overflow-y: scroll; + overflow-x: hidden; + height: 100%; + width: 100%; } .chat_contact_loader { @@ -86,664 +88,664 @@ left: 96px; width: 48px; height: 48px; - background: url(images/loader_48.gif) no-repeat transparent; + background: url(images/@{loader-gif-48}) no-repeat transparent; margin-top: 9px; -} - -.chat_messages_loading { - position: absolute; - left: 1px; - right: 18px; - height: 22px; - background-color: white; - top: 32px; - font-style: italic; - color: #b2b2b2; - padding: 3px 0 0 0; -} - -.chat_messages_loader { - overflow: hidden; - float: left; - margin: 1px 5px 0 96px; - width: 16px; - height: 16px; - background: url(images/loader16.gif) no-repeat transparent; -} - -.chat_messages_loading + div.small_chat_message { - margin-top: 20px; -} - -.chat_messages_loading.display-none + div.small_chat_message { - margin-top: 0px; -} - -.small_chat_down_panel, .small_chat_top_panel { - border-top: solid 1px #d1d1d1; - height: 30px; - padding-top: 8px; - outline: none; -} - -.small_chat_down_panel { - background: white; - width: inherit; - position: absolute; - bottom: 0; - padding: 5px 0 5px 0; -} - -.message_of_user { - font-size: 12px; - color: black; -} - -.mobile .small_chat_down_panel { - position: absolute !important; -} - -.small_chat_top_panel { - width: 100%; - margin-bottom: 5px; - overflow: visible; - border-collapse: separate; - border-spacing: 2px; -} - -.small_chat_image_status { - float: left; - width: 11px; - height: 11px; - margin: 8px 4px; - background: url(images/status_sprite.png) -7px -7px no-repeat transparent; -} - -.small_chat_text_status.image_online { - background-position: -7px -4px !important; -} - -.small_chat_text_status.image_away { - background-position: -7px -28px !important; -} - -.small_chat_text_status.image_not_available { - background-position: -7px -52px !important; -} - -.small_chat_text_status.image_offline { - background-position: -7px -76px !important; -} - -.small_chat_text_status { - width: 48px; - float: left; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-size: 10px; - cursor: pointer; - background: url(images/status_sprite.png) no-repeat transparent; - padding-left: 15px; - margin: 6px 0 0 6px; -} - -.small_chat_text_status:after { - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid #cbcbcc; - content: ""; - height: 0; - position: absolute; - right: 0; - top: 22px; - width: 0; - margin-right: 5px; -} - -.user_list li:hover { - cursor: pointer; - background-color: #e6e6e6; -} - -.message_dialog_close_item_icon:hover, .smile:hover, .extend_chat_icon:hover, -.show_small_chat_icon:hover, .small_chat_option_icon:hover { - cursor: pointer; -} - -.contact_block { - padding: 0 10px; - height: 34px; - line-height: 34px; -} - -.contact_record { - width: 180px; - height: 34px; - float: left; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.chat_user_state { - background: url(images/status_sprite.png) no-repeat transparent; - width: 11px; - height: 11px; - margin: 12px 5px 0 0; - float: right; -} - -.user_status { - clear: both; - overflow: visible; -} - -#smallChatPopupID { - width: 98px; - overflow: visible !important; - top: 35px; - right: 14px; -} - -.image_online { - background-position: -7px -7px !important; -} - -.image_away { - background-position: -7px -31px !important; -} - -.image_not_available { - background-position: -7px -55px !important; -} - -.image_offline { - background-position: -7px -79px !important; -} - -.small_chat_image_state { - float: left; - background: url(images/status_sprite.png) no-repeat transparent; - width: 11px; - height: 11px; - margin: 6px 5px 0 0; -} -.small_chat_search_field_container { - position: relative; - padding: 0 32px 0 0; -} -.small_chat_status_menu_container { - width: 1%; - padding: 0; -} -.small_chat_search_field { - float: left; - height: 25px !important; - width: 100%; - padding: 0 25px 0 5px; - -webkit-appearance: none; - -moz-appearance: none; -} - -.small_chat_status_menu { - height: 25px; - width: 80px; - border: solid 1px #d1d1d1; -} - -.user_list { - list-style-type: none; - padding: 0; - margin: 0; -} - -.extend_chat_icon { - background: url(images/expand.svg) no-repeat; - background-position:50%; - opacity:0.8; -} - -.extend_chat_icon:hover { - opacity: 1 -} - -.show_small_chat_icon { - background: url(images/talk.svg) no-repeat; - opacity:0.8; - background-position: 50%; -} - -.small_chat_option_icon { - background: url(images/settings.svg) no-repeat; - background-position:50%; - opacity:0.8; -} - -.small_chat_option_icon:hover { - opacity: 1 -} - -.small_chat_icon_white:hover { - opacity: 1 -} - -.small_chat_icon_white { - /*background-position: 2px 2px;*/ -} - -.small_chat_icon_green { - background: url(images/talk_green.svg) no-repeat; - background-position: 50%; -} - -#smallChatOptionsPopupID { - padding-left: 5px; - min-width: 270px; -} - -.down_panel_icon { - height: 28px; - width: 28px; - float: left; -} - -.down_panel_right_icon { - padding: 6px; - height: 16px; - width: 16px; - float: right; -} - -.small_chat_close_all_windows, .small_chat_minimize_all_windows, .small_chat_restore_all_windows { - margin-left: 22px !important; -} - -.small_chat_checkbox { - width: 17px; - height: 17px; - float: left; - background: no-repeat white -170px -3px; - margin-right: 5px; -} - -.small_chat_checkbox_enabled { - background: url(images/main_icons_sprite.png) -170px 0 no-repeat transparent; -} - -.small_chat_checkbox_disabled { - background: none; -} - -.icon_ch_size { - position: absolute; - top: 3px; - left: 50%; - margin-left: -6px; - width: 12px; - height: 8px; - background: url(images/icon_ch-size.png) no-repeat transparent; -} - -.smile_icon { - background: url(images/main_icons_sprite.png) -144px -21px no-repeat transparent; - z-index: 1; - position: absolute; - width: 24px; - height: 29px; - cursor: pointer; -} - -.smiles_menu_padding { - padding :10px 15px 15px 15px; -} - -.smile { - float: left; - width: 20px; - height: 20px; - text-align: center; - vertical-align: middle; -} - -.smile_first_row { - margin-left: 0 !important; -} - -.smile_last_row { - margin-right: 0 !important; -} - -.smile_first_line { - margin: 0 3px 3px 3px; -} - -.smile_second_line { - margin: 3px 3px 3px 3px; -} - -.smile_last_line { - margin: 3px 3px 0 3px; -} - -.clear_text_image { - background: url(images/main_icons_sprite.png) 3px -46px no-repeat transparent; -} - -.search_icon_image { - background: url(images/main_icons_sprite.png) -141px 3px no-repeat transparent; -} - -.search_icon { - cursor: pointer; - position: absolute; - top: 0; - right: 0; - width: 28px; - height: 28px; -} - -.detail_user_list { - z-index: 1000; - clear: both; - min-width: 250px; - max-width: 600px; - min-height: 100px; - padding: 8px 20px 8px 8px; - position: fixed; - cursor: default; - overflow: visible; - background-color: white; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5); - -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5); - -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5); -} - -.text_underline { - text-decoration: underline; -} - -#messageDialogPopupID { - bottom: 40px; - top: auto !important; - position: fixed !important; - width: 180px; -} - -.small_chat_card { - float: left; - display: table-cell; - margin: 4px 0 0 0; -} - -.small_chat_user, .small_chat_deps, .small_chat_mail, .small_chat_post { - display: block; - max-width: 300px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - word-wrap: break-word; -} - -.small_chat_contact_photo { - display: table-cell; - float: left; - overflow: hidden; - border: none; - margin: 4px 12px 0 4px; -} - -.small_chat_character { - display: table-row; -} - -.characteristic-text { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.characteristic { - display: table-cell; - color: #83888d; - padding: 0 10px 3px 0; -} - -.conversation_block { - z-index: 100; - width: 270px; - height: 300px; - overflow: visible; - position: fixed; - padding-bottom: 61px; - bottom: 10px; -} - -.header_of_conversation_block { - padding: 8px; - height: 16px; - color: white; - cursor: pointer; -} - -.conversation_block_user_state { - background: url(images/status_sprite.png) no-repeat transparent; - float: left; - width: 11px; - height: 11px; - margin: 3px 5px 0 0; -} - -.text_of_header_of_conversation_block { - width: 173px; - float: left; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - margin-top: -1px; -} - -.notification_close { - float: right; - width: 12px; - height: 12px; - cursor: pointer; - position: absolute; - top: 8px; - right: 10px; - background: url(images/main_icons_sprite.png) -126px -6px no-repeat transparent; -} - -.typing_message_notification { - font-size: 10px; - position: absolute; - color: #83888d; - font-style: italic; - text-align: center; - position: absolute; - text-overflow: ellipsis; - white-space: nowrap; - overflow-y: visible; - overflow-x: hidden; - padding: 0 15px 0 15px; - background: white; -} - -.close_conversation_block { - background: url("images/main_icons_sprite.png") -122px -26px no-repeat transparent; -} - -.minimize_conversation_block { - background: url("images/main_icons_sprite.png") -26px -49px no-repeat transparent; -} - -.restore_conversation_block { - background: url("images/main_icons_sprite.png") -49px -49px no-repeat transparent; -} - -.extend_conversation_block { - background: url("images/main_icons_sprite.png") -171px -26px no-repeat transparent; -} - -.close_conversation_block, .extend_conversation_block, .minimize_restore_conversation_block { - margin: -3px -5px 0 3px; - float: right; - width: 20px; - height: 20px; - cursor: pointer; -} - -.mobile .close_conversation_block { - width: 23px !important; - height: 31px !important; - margin: -7px -8px 0 0 !important; - background: url("images/main_icons_sprite.png") -121px -21px no-repeat transparent !important; -} - -.unselect_text { - -moz-user-select:-moz-none; - -moz-user-select: none; - -o-user-select:none; - -khtml-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.message_bus_container { - border-left: 1px solid #667497; - border-right: 1px solid #667497; - height: 100%; - overflow-y: scroll; - overflow-x: hidden; - border-top: 1px solid #e6e6e6; - background-color: white; -} - -.message_input_area { - max-height: 97px; - outline: none; - width: 100%; - padding: 5px 5px 5px 22px; - margin: 0; - resize: none; - overflow: auto; - background-color: #fff; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - word-wrap: break-word; - height: 29px; - border-color: #667497; - border-radius: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - -webkit-appearance: none; - -moz-appearance: none; -} - -.small_chat_message { - padding: 0 3px 12px 12px; - min-height: 50px; - clear: both; -} - -.message_of_current_user { - text-align: right; - word-wrap: break-word; -} - -.header_of_message_of_current_user { - color: #b2b2b2; - font-style: italic; - float: right; - padding: 0 2px 3px 0; - text-align: right; - width: 100%; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.current_user_interval { - text-align: right; - color: #83888d; -} - -.other_user_interval { - text-align: left; - color: #83888d; -} - -.user_interval { - font-size: 10px; -} - -.message_of_other_user { - text-align: left; - word-wrap: break-word; -} - -.header_of_message_of_other_user { - color: #b2b2b2; - font-style: italic; - float: left; - padding-bottom: 3px; - width: 100%; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.notification_username { - color: #b2b2b2; - font-style: italic; -} - -.notification_username, .notification_text { - text-align: left; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.message_dialog_btn { - position: fixed; - bottom: 10px; - background: #3d4a6b; - color: white; - height: 22px; - width: 40px; - text-align: right; - cursor: pointer; - padding: 6px 6px 0 0; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; -} - -.message_dialog_menu_icon { - background: url(images/main_icons_sprite.png) -101px -31px no-repeat transparent; - height: 11px; - width: 12px; - margin: 4px 0 0 6px; - float: left; -} - -.message_dialog_item { - text-align: left; -} - -.message_dialog_item_text { - overflow: hidden; - text-overflow: ellipsis; -} - -.message_dialog_close_item_icon { - float: right; - height: 12px; - width: 11px; - margin: 6px 0 0 10px; - background: url(images/main_icons_sprite.png) -102px -6px no-repeat transparent; +} + +.chat_messages_loading { + position: absolute; + left: 1px; + right: 18px; + height: 22px; + background-color: @bodyColor2; + top: 32px; + font-style: italic; + color: #b2b2b2; + padding: 3px 0 0 0; +} + +.chat_messages_loader { + overflow: hidden; + float: left; + margin: 1px 5px 0 96px; + width: 16px; + height: 16px; + background: url(images/loader16.gif) no-repeat transparent; +} + +.chat_messages_loading + div.small_chat_message { + margin-top: 20px; +} + +.chat_messages_loading.display-none + div.small_chat_message { + margin-top: 0px; +} + +.small_chat_down_panel, .small_chat_top_panel { + border-top: solid 1px @borderColor; + height: 30px; + padding-top: 8px; + outline: none; +} + +.small_chat_down_panel { + background: @bodyColor2; + width: inherit; + position: absolute; + bottom: 0; + padding: 5px 0 5px 0; +} + +.message_of_user { + font-size: 12px; + color: black; +} + +.mobile .small_chat_down_panel { + position: absolute !important; +} + +.small_chat_top_panel { + width: 100%; + margin-bottom: 5px; + overflow: visible; + border-collapse: separate; + border-spacing: 2px; +} + +.small_chat_image_status { + float: left; + width: 11px; + height: 11px; + margin: 8px 4px; + background: url(images/status_sprite.png) -7px -7px no-repeat transparent; +} + +.small_chat_text_status.image_online { + background-position: -7px -4px !important; +} + +.small_chat_text_status.image_away { + background-position: -7px -28px !important; +} + +.small_chat_text_status.image_not_available { + background-position: -7px -52px !important; +} + +.small_chat_text_status.image_offline { + background-position: -7px -76px !important; +} + +.small_chat_text_status { + width: 48px; + float: left; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 10px; + cursor: pointer; + background: url(images/status_sprite.png) no-repeat transparent; + padding-left: 15px; + margin: 6px 0 0 6px; +} + +.small_chat_text_status:after { + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid #cbcbcc; + content: ""; + height: 0; + position: absolute; + right: 0; + top: 22px; + width: 0; + margin-right: 5px; +} + +.user_list li:hover { + cursor: pointer; + background-color: #e6e6e6; +} + +.message_dialog_close_item_icon:hover, .smile:hover, .extend_chat_icon:hover, +.show_small_chat_icon:hover, .small_chat_option_icon:hover { + cursor: pointer; +} + +.contact_block { + padding: 0 10px; + height: 34px; + line-height: 34px; +} + +.contact_record { + width: 180px; + height: 34px; + float: left; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.chat_user_state { + background: url(images/status_sprite.png) no-repeat transparent; + width: 11px; + height: 11px; + margin: 12px 5px 0 0; + float: right; +} + +.user_status { + clear: both; + overflow: visible; +} + +#smallChatPopupID { + width: 98px; + overflow: visible !important; + top: 35px; + right: 14px; +} + +.image_online { + background-position: -7px -7px !important; +} + +.image_away { + background-position: -7px -31px !important; +} + +.image_not_available { + background-position: -7px -55px !important; +} + +.image_offline { + background-position: -7px -79px !important; +} + +.small_chat_image_state { + float: left; + background: url(images/status_sprite.png) no-repeat transparent; + width: 11px; + height: 11px; + margin: 6px 5px 0 0; +} +.small_chat_search_field_container { + position: relative; + padding: 0 32px 0 0; +} +.small_chat_status_menu_container { + width: 1%; + padding: 0; +} +.small_chat_search_field { + float: left; + height: 25px !important; + width: 100%; + padding: 0 25px 0 5px; + -webkit-appearance: none; + -moz-appearance: none; +} + +.small_chat_status_menu { + height: 25px; + width: 80px; + border: solid 1px @borderColor; +} + +.user_list { + list-style-type: none; + padding: 0; + margin: 0; +} + +.extend_chat_icon { + background: url(images/expand.svg) no-repeat; + background-position:50%; + opacity:0.8; +} + +.extend_chat_icon:hover { + opacity: 1 +} + +.show_small_chat_icon { + background: url(images/talk.svg) no-repeat; + opacity:0.8; + background-position: 50%; +} + +.small_chat_option_icon { + background: url(images/settings.svg) no-repeat; + background-position:50%; + opacity:0.8; +} + +.small_chat_option_icon:hover { + opacity: 1 +} + +.small_chat_icon_white:hover { + opacity: 1 +} + +.small_chat_icon_white { + /*background-position: 2px 2px;*/ +} + +.small_chat_icon_green { + background: url(images/talk_green.svg) no-repeat; + background-position: 50%; +} + +#smallChatOptionsPopupID { + padding-left: 5px; + min-width: 270px; +} + +.down_panel_icon { + height: 28px; + width: 28px; + float: left; +} + +.down_panel_right_icon { + padding: 6px; + height: 16px; + width: 16px; + float: right; +} + +.small_chat_close_all_windows, .small_chat_minimize_all_windows, .small_chat_restore_all_windows { + margin-left: 22px !important; +} + +.small_chat_checkbox { + width: 17px; + height: 17px; + float: left; + background: no-repeat @bodyColor2 -170px -3px; + margin-right: 5px; +} + +.small_chat_checkbox_enabled { + background: url(images/main_icons_sprite.png) -170px 0 no-repeat transparent; +} + +.small_chat_checkbox_disabled { + background: none; +} + +.icon_ch_size { + position: absolute; + top: 3px; + left: 50%; + margin-left: -6px; + width: 12px; + height: 8px; + background: url(images/icon_ch-size.png) no-repeat transparent; +} + +.smile_icon { + background: url(images/main_icons_sprite.png) -144px -21px no-repeat transparent; + z-index: 1; + position: absolute; + width: 24px; + height: 29px; + cursor: pointer; +} + +.smiles_menu_padding { + padding :10px 15px 15px 15px; +} + +.smile { + float: left; + width: 20px; + height: 20px; + text-align: center; + vertical-align: middle; +} + +.smile_first_row { + margin-left: 0 !important; +} + +.smile_last_row { + margin-right: 0 !important; +} + +.smile_first_line { + margin: 0 3px 3px 3px; +} + +.smile_second_line { + margin: 3px 3px 3px 3px; +} + +.smile_last_line { + margin: 3px 3px 0 3px; +} + +.clear_text_image { + background: url(images/main_icons_sprite.png) 3px -46px no-repeat transparent; +} + +.search_icon_image { + background: url(images/main_icons_sprite.png) -141px 3px no-repeat transparent; +} + +.search_icon { + cursor: pointer; + position: absolute; + top: 0; + right: 0; + width: 28px; + height: 28px; +} + +.detail_user_list { + z-index: 1000; + clear: both; + min-width: 250px; + max-width: 600px; + min-height: 100px; + padding: 8px 20px 8px 8px; + position: fixed; + cursor: default; + overflow: visible; + background-color: @bodyColor2; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5); + -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5); +} + +.text_underline { + text-decoration: underline; +} + +#messageDialogPopupID { + bottom: 40px; + top: auto !important; + position: fixed !important; + width: 180px; +} + +.small_chat_card { + float: left; + display: table-cell; + margin: 4px 0 0 0; +} + +.small_chat_user, .small_chat_deps, .small_chat_mail, .small_chat_post { + display: block; + max-width: 300px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + word-wrap: break-word; +} + +.small_chat_contact_photo { + display: table-cell; + float: left; + overflow: hidden; + border: none; + margin: 4px 12px 0 4px; +} + +.small_chat_character { + display: table-row; +} + +.characteristic-text { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.characteristic { + display: table-cell; + color: #83888d; + padding: 0 10px 3px 0; +} + +.conversation_block { + z-index: 100; + width: 270px; + height: 300px; + overflow: visible; + position: fixed; + padding-bottom: 61px; + bottom: 10px; +} + +.header_of_conversation_block { + padding: 8px; + height: 16px; + color: @bodyColor2; + cursor: pointer; +} + +.conversation_block_user_state { + background: url(images/status_sprite.png) no-repeat transparent; + float: left; + width: 11px; + height: 11px; + margin: 3px 5px 0 0; +} + +.text_of_header_of_conversation_block { + width: 173px; + float: left; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + margin-top: -1px; +} + +.notification_close { + float: right; + width: 12px; + height: 12px; + cursor: pointer; + position: absolute; + top: 8px; + right: 10px; + background: url(images/main_icons_sprite.png) -126px -6px no-repeat transparent; +} + +.typing_message_notification { + font-size: 10px; + position: absolute; + color: #83888d; + font-style: italic; + text-align: center; + position: absolute; + text-overflow: ellipsis; + white-space: nowrap; + overflow-y: visible; + overflow-x: hidden; + padding: 0 15px 0 15px; + background: @bodyColor2; +} + +.close_conversation_block { + background: url("images/main_icons_sprite.png") -122px -26px no-repeat transparent; +} + +.minimize_conversation_block { + background: url("images/main_icons_sprite.png") -26px -49px no-repeat transparent; +} + +.restore_conversation_block { + background: url("images/main_icons_sprite.png") -49px -49px no-repeat transparent; +} + +.extend_conversation_block { + background: url("images/main_icons_sprite.png") -171px -26px no-repeat transparent; +} + +.close_conversation_block, .extend_conversation_block, .minimize_restore_conversation_block { + margin: -3px -5px 0 3px; + float: right; + width: 20px; + height: 20px; + cursor: pointer; +} + +.mobile .close_conversation_block { + width: 23px !important; + height: 31px !important; + margin: -7px -8px 0 0 !important; + background: url("images/main_icons_sprite.png") -121px -21px no-repeat transparent !important; +} + +.unselect_text { + -moz-user-select:-moz-none; + -moz-user-select: none; + -o-user-select:none; + -khtml-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.message_bus_container { + border-left: 1px solid #667497; + border-right: 1px solid #667497; + height: 100%; + overflow-y: scroll; + overflow-x: hidden; + border-top: 1px solid #e6e6e6; + background-color: @bodyColor2; +} + +.message_input_area { + max-height: 97px; + outline: none; + width: 100%; + padding: 5px 5px 5px 22px; + margin: 0; + resize: none; + overflow: auto; + background-color: @body-color; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + word-wrap: break-word; + height: 29px; + border-color: #667497; + border-radius: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + -webkit-appearance: none; + -moz-appearance: none; +} + +.small_chat_message { + padding: 0 3px 12px 12px; + min-height: 50px; + clear: both; +} + +.message_of_current_user { + text-align: right; + word-wrap: break-word; +} + +.header_of_message_of_current_user { + color: #b2b2b2; + font-style: italic; + float: right; + padding: 0 2px 3px 0; + text-align: right; + width: 100%; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.current_user_interval { + text-align: right; + color: #83888d; +} + +.other_user_interval { + text-align: left; + color: #83888d; +} + +.user_interval { + font-size: 10px; +} + +.message_of_other_user { + text-align: left; + word-wrap: break-word; +} + +.header_of_message_of_other_user { + color: #b2b2b2; + font-style: italic; + float: left; + padding-bottom: 3px; + width: 100%; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.notification_username { + color: #b2b2b2; + font-style: italic; +} + +.notification_username, .notification_text { + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.message_dialog_btn { + position: fixed; + bottom: 10px; + background: #3d4a6b; + color: @bodyColor2; + height: 22px; + width: 40px; + text-align: right; + cursor: pointer; + padding: 6px 6px 0 0; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; +} + +.message_dialog_menu_icon { + background: url(images/main_icons_sprite.png) -101px -31px no-repeat transparent; + height: 11px; + width: 12px; + margin: 4px 0 0 6px; + float: left; +} + +.message_dialog_item { + text-align: left; +} + +.message_dialog_item_text { + overflow: hidden; + text-overflow: ellipsis; +} + +.message_dialog_close_item_icon { + float: right; + height: 12px; + width: 11px; + margin: 6px 0 0 10px; + background: url(images/main_icons_sprite.png) -102px -6px no-repeat transparent; } \ No newline at end of file diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/js/smallchat.js b/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/js/smallchat.js index ad0fab00b..4589a0862 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/js/smallchat.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/js/smallchat.js @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Support/Support.ascx b/web/studio/ASC.Web.Studio/UserControls/Common/Support/Support.ascx index ae1fd6f42..841c8ef69 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Support/Support.ascx +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Support/Support.ascx @@ -14,7 +14,7 @@ - " href="/skins/default/images/svg/top-studio-menu.svg#svgTopStudioMenusupport"> + " href="/skins/default/images/svg/top-studio-menu.svg#svgTopStudioMenusupport" xlink:href="/skins/default/images/svg/top-studio-menu.svg#svgTopStudioMenusupport"> <%= Resource.FeedbackSupport %> diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Support/Support.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/Support/Support.ascx.cs index 750dbcb5e..b195ac15b 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Support/Support.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Support/Support.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Support/SupportChat.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/Support/SupportChat.ascx.cs index 7ab016ace..3004a52be 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Support/SupportChat.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Support/SupportChat.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/Support/livechat.js b/web/studio/ASC.Web.Studio/UserControls/Common/Support/livechat.js index a108739aa..7a9b72e1e 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/Support/livechat.js +++ b/web/studio/ASC.Web.Studio/UserControls/Common/Support/livechat.js @@ -1,20 +1,20 @@ -/* - * - * (c) Copyright Ascensio System Limited 2010-2021 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * -*/ - - +/* + * + * (c) Copyright Ascensio System Limited 2010-2023 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + + if (typeof (ASC) === 'undefined') { ASC = {}; } diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/TopStudioPanel/TopStudioPanel.ascx b/web/studio/ASC.Web.Studio/UserControls/Common/TopStudioPanel/TopStudioPanel.ascx index ed8b957be..5e71d2ec6 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/TopStudioPanel/TopStudioPanel.ascx +++ b/web/studio/ASC.Web.Studio/UserControls/Common/TopStudioPanel/TopStudioPanel.ascx @@ -16,9 +16,15 @@ { %>try-welcome-top<% } %>">
    <% } %> diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/TopStudioPanel/TopStudioPanel.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/TopStudioPanel/TopStudioPanel.ascx.cs index 2ecc2d0b3..fd1de2188 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/TopStudioPanel/TopStudioPanel.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/TopStudioPanel/TopStudioPanel.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,6 +50,7 @@ public static string Location protected UserInfo CurrentUser; protected bool DisplayModuleList; protected bool UserInfoVisible; + protected bool IsImpersonator; public bool? DisableUserInfo; @@ -85,19 +86,13 @@ protected string ConfirmationLogoStyle WebImageSupplier.GetAbsoluteWebPath("personal_logo/logo_personal_about.svg")); var general = !TenantLogoManager.IsRetina(Request); - var height = TenantWhiteLabelSettings.logoDarkSize.Height / 2; - var width = TenantWhiteLabelSettings.logoDarkSize.Width / 2; - - if (CoreContext.Configuration.Standalone) - { - return String.Format("height:{0}px; width: {1}px; background: url('{2}') no-repeat; background-size: {1}px {0}px;", - height, width, TenantLogoManager.GetLogoDark(general)); - } + var theme = ModeThemeSettings.GetModeThemesSettings().ModeThemeName; + var path = theme == ModeTheme.light ? TenantLogoManager.GetLogoAboutDark(general) : TenantLogoManager.GetLogoAboutLight(general); return String.Format("height:{0}px; width: {1}px; background: url('{2}') no-repeat; background-size: {1}px {0}px;", - height, width, TenantWhiteLabelSettings.GetAbsoluteDefaultLogoPath(WhiteLabelLogoTypeEnum.Dark, general)); + height, width, path); } } @@ -307,6 +302,8 @@ protected void Page_Load(object sender, EventArgs e) } Startup = !CoreContext.Configuration.CustomMode && TenantExtra.Saas && TenantExtra.GetTenantQuota().Free; + + IsImpersonator = ImpersonationSettings.IsImpersonator(); } #region currentProduct diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/TopStudioPanel/VoipPhoneControl.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/TopStudioPanel/VoipPhoneControl.ascx.cs index 111ccc3da..0b0936f82 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/TopStudioPanel/VoipPhoneControl.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/TopStudioPanel/VoipPhoneControl.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -54,6 +54,10 @@ public StyleBundleData GetStaticStyleSheet() { return null; } + public StyleBundleData GetStaticDarkStyleSheet() + { + return null; + } } public class ClientTemplateResources : ClientScriptTemplate diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/UserForum/UserForum.ascx.cs b/web/studio/ASC.Web.Studio/UserControls/Common/UserForum/UserForum.ascx.cs index 0ec9d469d..e8c9d4232 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/UserForum/UserForum.ascx.cs +++ b/web/studio/ASC.Web.Studio/UserControls/Common/UserForum/UserForum.ascx.cs @@ -1,6 +1,6 @@ /* * - * (c) Copyright Ascensio System Limited 2010-2021 + * (c) Copyright Ascensio System Limited 2010-2023 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/studio/ASC.Web.Studio/UserControls/Common/VideoGuides/VideoGuides.ascx b/web/studio/ASC.Web.Studio/UserControls/Common/VideoGuides/VideoGuides.ascx index 28865961b..ac7765748 100644 --- a/web/studio/ASC.Web.Studio/UserControls/Common/VideoGuides/VideoGuides.ascx +++ b/web/studio/ASC.Web.Studio/UserControls/Common/VideoGuides/VideoGuides.ascx @@ -22,7 +22,7 @@
    <%= Resource.MobilePhone %> -
    <%= IsLdapField(LdapSettings.MappingFields.MobilePhoneAttribute) ? "" : "+" %><%= SmsSender.GetPhoneValueDigits(Phone) %>
    +
    +<%= SmsSender.GetPhoneValueDigits(Phone) %>
    <%= CustomNamingPeople.Substitute("UserLead").HtmlEncode() %> + <% if (CurrentUserIsPeopleAdmin) { %> + <%: CustomNamingPeople.Substitute("AddLeadButton").HtmlEncode() %> + + <% } else { %> + " autocomplete="off" disabled="" title="<%= CustomNamingPeople.Substitute("UserLead").HtmlEncode()%>" /> + <% } %> +
    <%= Resource.Location %>

    T|DF0 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 BCG-FQ diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_tasks.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_tasks.svg new file mode 100644 index 000000000..f1592a749 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_tasks.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_taxes.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_taxes.png deleted file mode 100644 index be2e3ce0dfa3a6d5bbd02cfdd204599b09c98c96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10939 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 z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_twitter.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_twitter.png deleted file mode 100644 index e5c53193ad52775413841dea63de4d9698b16fd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13773 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 DGo{e0 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_twitter.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_twitter.svg new file mode 100644 index 000000000..c747c24e3 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_twitter.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_userfields.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_userfields.png deleted file mode 100644 index 1e895e4bee1f2a9162d9829f5a6b27263aad917b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9721 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 Hu0mjfrt}jX diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_userfields.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_userfields.svg new file mode 100644 index 000000000..eaee99f5c --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_userfields.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_voip_settings.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_voip_settings.png deleted file mode 100644 index 31e2529a3d964e422be12689d2d6cf75a209d1f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6789 zcmai(Ra6uJv&ZS~j-?yvTo91%E=gIIlv+|6>0XwSZV)L62~k42Ll&eYmhSGpe&^hK zU+%+wnE5}}XMSzwkIMfv74E+`lEzRoz{r=B^_P&!!k}9ee ztaMDsB&o8DL|kYDx>RgQbUOpQSwhTNeGSDfZ}ZAjxpn;2^g~7xsvi-aY(@Pc|*w@YK+Vh;@`s^VibS9c%kqxyAu(uZybX5(LYWH(GgA_=3QIv45>#(9wL?*BQ zM)(gt+Wd5woalK*eIR^#yqf#f0XZosbPsJeC5JTV(t;PA83GUM=y9FbuG&_X@l}%O zqZqOJqPwt&063h|sHk#bffH1Qt_|~z*;;cJ4>x)^1Sn27s)1L9W!?@E1)PeL?fvHP}j_BR^C6|L#;NMx7k80 z!fep8H%c`4Ohd-cNIB31dd%>Fx{QWn#S1LG0DoBzMJp5nGz=JNb<<_@SzO#z(Dx?p zl_@lpe9GC)Y+(m9A|f(uAXy+0exi&w;W!Q6v_M$*WK`=PC;VsOns{GD9|F0X_97I6 zyxopr`lo#Wr@jT~R3w|k+=$BBoye#fwS!9*gq(^T*851uXaaAFpml4te%jNKSr{n{ z?&ySl&ngcWFfp#1LuJMf4IAS&?e>k)>+j#Zg)Eig2(wHL5>&CujDLUMotT>aOnZR5 zXd>X>x$IFaVX)oJs+3BKLRD}8h$G-(qh%_jxw(u~H#ten@|ULuM? z&3_tR7*oyo#Z*Q{ETnC=6s^6&xU8~^5n>vL|IyhTA9|LB6U%%62ddYu1)l$98t{6I zHhvZUp$&iB{^G3-bikncZQZ>FK~ei@Ob(S7cNEEXI_-O09yypU{WOgJ)Zs}=* z1g3R!``6NVFAcW*Rh=N&9VxqLxR!yX#er#6b9AWO1Ht6OH<*m%c@!#UNW2?9kN_<8HT~4Ghpm9KqY06G` zD9$xjnF}dSHHb3VU-ko2UVlYv%o`3gHmCJS^f0oMIvPIUSbR6*XaAx24De5A8a;4O zy<7Mq!W)3r;F8Y?B5Eu`O*Q_YOp+h9*JHstl_XA@3dS{`2h zng*sFh@oP?k`bRGQX~#BlQZk6h(T-^nTst^IZoQ}DuI=3NriBUHx4#NNjKD`s{&sZ znXEEvAYCFD3oaCK!p@TXZ&6b($|-vQh=72o@8(wR&{?s*JC_~%N>+vM;Y~6 zu`)&VUf;*oEBiBuAw*Y3A~p?oBjy~$Vpc5Nc<=Pca4oSf#2TG2*eSGR6JBN&$VozX zA@3-*K`Zu$0)6T`muJ3hbZTt;=}490H14~ndVc43gKMY5(z=D44{W~{$0!gOZLO3dS5=Fe`PeHZaIMGN1L*;}?#5^p)e#H~blk#3u$R>&d66Q00 za-jk;l`DzF&Iy>|QxsZIg)}-Me}{P)a7!e*F+~IT4@x1rm+lzyh3cxyc2(z`GTNFV zEsbu>S)61#Q_(I~@wf(5p>;tOnph?Dd&*e#h>w8l^&g7Ud-Z7=SEn<3^GY66>?wQPpYgW&BJOtI~Eb92#j1HfKl@8^vT{8*}3c30+QuK>`MbmxKnW3iA*DTXMV$bT?N zvgsRpM{9x1XX052JoDc07UM_J*kNlC_yF>^Nwh(qqOB?0q{*i<`-YF}Rx1<_lOcOF zf04=uinDeuj_JIyY*uCnHf32|SBo$>m1zKO2F9}{mAFNn#SbLWC0;=D7OvbC*j?8o z&CGA+J@J6OPU4%Klc1FjR7m5DZA@`!y^47p{Uzw8?xfnAZOj7HW_azR3&Zh=kS*Tqz5}+_B2w|P1 z_=Y0b)G;So_j)2pOXM3vIR!Uc{hIVk-_5G_#PZV>Ev4d4mh*TV4%sQXje&?_nJK~AdYB?csWL(3)||kIF`I=Nk7|nz)4M~ zw&h&UjG2YXq)8{5&v$-8-mZ&40`G;Q)b2Ecndlx0K}Y#dC|x&jF{FyaIXCs&W_12%{+xraB!qheRh7dcm?n ztd0$6;Yp;kI3&_s?0Q>CLSTCiVlwZa$mi$Xk`B_vEz2aWC5bE7Y4u69{%=Wly7ZX4+z z3_VW8r@_lSS#Yp{OXoy^D~AE!kuNxIt$_?Nlrw2vKZY!^d{yv1WzSv7m+x!dJ#eni zjJBHk-qd4`GWKc)&3=A@r;u5U9e(4vDWW!M^KOf&c`zrVYGWKJx^{S2ioi~nXAFQu zKcK3$N6p4LIP@8pQE;ak4hQb_;arT!2+GNNt_z7mqbp23aHRT>Nh6ZHMb|eZ^58?$ z;ut-E-yU5s=Uv8O+nyQ1s;fBa6yVf_ZkA}>SHksrn?`~YYi!|h67D(8$zem`n=~om z{-8ZpHAdZ>AK!km@YoS_(4_LrIpkXmDg>9JU|c?_JY`?0z0;4N<-0Fj*&`e5u#Vdmw~SQ0+3=n8+Mwi4;x zvUPLnqpCv9Mx8|cZ{T8q{yG;L*1t>1V@3d)5AE`{q$S&Ev?!g7Ua{U@Vx+Xw1_q}) zR)J&_JE02nCmlO0sZ`xr1-rP>cL1Jg39cc)j6kt@xpzGjCroV(l+fp)!*VxzJP- zwcO;rGWHx`n$|K&au`>cnM>TU^HJnD72Q@d! zgH=X(W7I-$Sm&H2sv+&pEpuCG_YyJ03vv1~`Va)DR$1$TLJ1AVVu@_Pf4L{WM2 zB_{E#%D|W@ zASBaq;n3xFuZcq-h_gcDCB8@pp)VFXrC;zjRTYkADO8|*J$^996Z7Kt)R8oqzoC94 zE$)I~lXUnzrD0LNzAxbOq~(6A^5&2#vt=8!y~5v(4We7H?Rzk;p?)=t#$3{l?#%Ds zC-`u^ny%##f*oau*J`xbwl?l3le(z_IgD1$q;@_6MrYmtBLDKYIf6W3QqRGRHXHe? znd1Ghj!T|M-=&4K=}fS`foI;v{rlpq(oBx=7VsKLmH81Q5MzccP9wLm$HPKpJ1c)9 zaXL?hr9pGTJkC#BetI$26~JwB5&+|WQCf%pSg0-iq*r6RL9!EwxAI$15w}wC zo*NPi>Yk1F^#iR4bn`LP@+R6I)!r!bRNs=v(SG0l*~!1sYnDPTo}Xkr#>W#iVeK8_ zQ;?xs59xp1n#GohIA?cbFXIKiS|4+=TG)RJ{}QbQruL2DUA6mUN@dE_eJIO+miG9u5z?cv z`jGS@{fS$@4*hfw5=^W4NhE1e%vxA%KlqhfWB(gk)(3ojPQ zk5*;i>*ADm{2rgPs1+^JC=4ig(Y+im4IGjV88IHRCUz?vE_@pVfrTgmtn#pM3IoDh za?Asj&>zo)CdXA6y{koEjA*V8{TbLf20-8vWYUcSXdy&I9(Xyb5Vii(bWgn2B0brZ zv_15bqab}-5XLLY3rq8exen32^R?O94wQF6cSf%-`j8|tpNJt$OZNxjy%vpse3!Oe zM!}j8iwl)^7C%BNg7|+hPgcAtyS`Ky8k3>TV=)q&eB&Av--bsTbk{uB2ky%sh_zwr zXgiQL=?KsYYpwnocn=#*HND;qM|S1%$j&%B4T4=mGKK88ix?Sj7e#S>4RKd){i#bIYC zG-6IWBLz2^3$(9R{iQW&my=}9^W$d@uTS9;Ssyz-SqsIycOPZ06y8#~z=PDwp# zlC@}yzGTQ`ji{Ep!=Uwunwi6RLpg(tsG+w|g3*6+cZktFY(4~AwK9a9Z!iR^xE~--@7_Ka$1r?Y|5mVGvhH}j za!oI8XuLRoZooV{&O4n-vmhy>s$s{!l;Xgp1)HleMTJS-J2ITi=~!?+S`^#J?u+Pz zMrHgf=+Jv7>rLECK*OCMm5#@~PKbj_+KgLiJrfp*Su zt=Vhm?+fl|CjZInW425SuvXvkYrfSlwH)xR35{;R4h=24SFC@N#}3}tU!HVQH%qv5 z{meg8JC8EV*EV3V8@ij_DVr*lW)q8YJS#!F5s461eDJ3UK|l7u=P1hJ*$P}tVSlen zz1m-A1G)81e?A8f=4YGQZGBd?@VD$V2S8g*tP8|7f;>2Hpydz(q0skh;Mn{-Jk{wV zyLz4KKSGY#a1@3wLMNht!|_Npk%}^gnS1tBlYtCe zI0UZx+L^z>U~8MTcifEB#0qU6+LbKtw0%SMWRjgc0_}nqF8Dq%z zAq_>2!8w!+AM8PQG@y?J!;bN0Wl{fm^A%AN5GkvY`O%Q4@Y9j`9xq?B+rGG)6Tb1& zE5YfaG{d@8YYpo8q%+3O#q$kRN9w9_jZZw(&RW;=!Oa%f z8tmGi-5?aj|1}4xQj9O0S#+jYiF)7&v-}4|f=Y3ZISjsG& zJRYC)Hcm<{cbf~6(t&Q4Uu4<8zFTi$!MQRs0rJs1KVh1payVu72+F`8TpGC+ckDk6 z#T(7WI0`CPZ3Cli7TKD=u;q%=c`h%$vR?jqRZw1%g2#^rNd3}5mn^f6qrr~*5Kwy< zho9!P%^h3A17<_0zVvrTxSxHqbBaSVO;-H6#5$st5Y{Q;VzXcRL#j-2&ZQ-_))k+_ zml5wm#BRsAY4&}C%=+x@cfkv|^HSgM{>?71aJ+S5}$ zJX}p&Yum*WPU$5pw3)02+W{ABuEAjPHbFdFR8yZVlYEx8Y5P2jfhar~iSjC)T+Xqd z8qTo&ASdtU>p$>f4wab&a}r6Sh?-FbM+gX_Oey9L!kS(XOhDnkk;6&}X^%yF7Kuyr zRpc!yuF`rH*{7E4@g^mdmP~zS*4-9d$VUuVBta*BGuaU_!9i^(gaZ=5?VQHb*;-2h z>1HYl9lmf32Qrj^?raqL#O`<5SZ`)H945Mkr@w@`dkA$G+C_UjFG+aUH6fUsj}F_P z->&$eARV*v?LD+FyWu8BUb$~(&fFruoItMX8qPcjVg+M=)2Z2$-%6ir)-9g1G59(WJ^u_plDhz>s)6JgG8pV2bFz@2Dyy%WP+$6z3dxM%w zf{7dkOUcG_T8&J;yE)gtEl@FF0QUbr{dJ?(B8%?PjDQ?ta_|+=x1L0V)!UXf1j*F5 zbSlIu>gbjxd9pkGv={4ezSJcDGWiwyM3FcS{8g`ZmP{&}CKm*j7Y=MQl<8C;=ZB|O zGHHxI9M7{r?q_IYE)&a!+ZdPa>>B;5$A|ZrzPs%V7REv4%a7?;fG`8yKCV-3b3|x& z2S!2Da-gbqP^Qn%xVISwvQ4-^#|eM&T3np{ywZZ5bqZQUksZch&^)7it?w&D5h?-& zc8eu7CKmuAu!2rhkB@oj(E9~>Y)ECehsurO5$x(RB8YMM98q8evfC-OxI`H&8Is7o zn5peQ^6kUY2-ZKR(Zdr|g~E)~-7kOE)9hWmgWH%X#S}I0;p_$ZWQMHECCQJBU?f@3 zC(eiB+*)81LaR-}6*vcR0OY_4{C|vvy8C}Q%m1*H|3)hRM{Zw8o^?WzksgP%nFg19 Se*EJ~NNP&jina2f@c#nMMCNV) diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_voip_settings.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_voip_settings.svg new file mode 100644 index 000000000..87c96ef59 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/empty_screen_voip_settings.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/export_data.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/export_data.png deleted file mode 100644 index 3beee447cb50d7ba9061829a1f606f56bc52414d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4646 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-cases.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-cases.png deleted file mode 100644 index 12423cc066911a94a20298211b42ef24a0967a0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13286 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 diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-cases.svg b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-cases.svg new file mode 100644 index 000000000..95b6591d2 --- /dev/null +++ b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-cases.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-opportunities.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-opportunities.png deleted file mode 100644 index 07baa5693971d6b0714306c2f2b3e76ac085a44e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15997 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%0D2D!r^n z%T%KxV>2(XW1&rl2u=*?eE=UyTZW?IY140iTZ!6<=#jD}{eT=Pa8{?+{+)=-?VcN{ z5eA#{ERwE;4RUA^;4$KB6XD_U4eL}$+<|u`HkAe|dE+g?6~iJF#ZrJNJRhMlWuSg~ zsXip*L)KSSro1c(JRh68*MQ0Vz3;;n(kCSe|2}13%gCBKrB{2SJ28L`~>SC%@3KWfL6Jw85? z^AlkeEYlyx&D1-kvi~ApQZ&{vE+(YY5WfUJMf9xcvJPV zBQ`rncD0|PMh?I3yjK|-IDXE40-Zm_Zck0b;X5~~Mhwthi7(E63KgH8moqJyVl|E# zv&Pqj!{)y9)Y2F2d@&;_-Zrf~o2VK|pjl+j_s3r;S3g{S?!J2raBy&70f=9XzTwtc z?=gtpPah*P{mNbC9%ja2h6;H468I;iFO6@gJ<(6b1jisJ;x-OW7WS`!9DV zhLmsJcH0xa@5GDUj4|gsbl19vE{+o{= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-tasks.png b/web/studio/ASC.Web.Studio/Products/CRM/App_Themes/default/images/import-tasks.png deleted file mode 100644 index 8387580fc1e5bc66f246906dfa3ee947fabb01ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15152 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