yx lin 6 months ago
committed by GitHub
parent
commit
599ff79361
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      .github/workflows/release.yml
  2. 7
      Directory.Packages.props
  3. 6
      apps/vben5/.husky/commit-msg
  4. 3
      apps/vben5/.husky/post-merge
  5. 7
      apps/vben5/.husky/pre-commit
  6. 20
      apps/vben5/.lintstagedrc.mjs
  7. 6
      apps/vben5/packages/@abp/settings/src/components/settings/SettingForm.vue
  8. 1
      apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoDrawer.vue
  9. 3
      aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/FodyWeavers.xml
  10. 20
      aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN.Abp.AspNetCore.Auditing.csproj
  11. 19
      aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingHeaderOptions.cs
  12. 17
      aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingModule.cs
  13. 51
      aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AspNetCoreRecordHeaderAuditLogContributor.cs
  14. 19
      aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/README.md
  15. 196
      aspnet-core/framework/dynamic-queryable/LINGYUN.Linq.Dynamic.Queryable/System/Linq/Expressions/ObjectQueryableExtensions.cs
  16. 6
      aspnet-core/modules/account/LINGYUN.Abp.Account.Application/LINGYUN/Abp/Account/MyProfileAppService.cs
  17. 2
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Domain/LINGYUN/Abp/Identity/AbpIdentityDomainModule.cs
  18. 71
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Domain/LINGYUN/Abp/Identity/Session/IdentitySessionCacheItemSynchronizer.cs
  19. 28
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Domain/LINGYUN/Abp/Identity/Session/IdentitySessionCleanupBackgroundWorker.cs
  20. 19
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IFileAppService.cs
  21. 14
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IPrivateFileAppService.cs
  22. 18
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IPublicFileAppService.cs
  23. 2
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileAppServiceBase.cs
  24. 4
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi.Client/ClientProxies/LINGYUN/Abp/OssManagement/PrivateFilesClientProxy.Generated.cs
  25. 4
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi.Client/ClientProxies/LINGYUN/Abp/OssManagement/PublicFilesClientProxy.Generated.cs
  26. 182
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi.Client/ClientProxies/oss-management-generate-proxy.json
  27. 9
      aspnet-core/modules/platform/LINGYUN.Platform.Application/LINGYUN/Platform/Menus/MenuAppService.cs
  28. 1
      aspnet-core/modules/platform/LINGYUN.Platform.Domain.Shared/LINGYUN/Platform/Localization/Resources/en.json
  29. 1
      aspnet-core/modules/platform/LINGYUN.Platform.Domain.Shared/LINGYUN/Platform/Localization/Resources/zh-Hans.json
  30. 4
      aspnet-core/modules/platform/LINGYUN.Platform.Domain.Shared/LINGYUN/Platform/PlatformErrorCodes.cs
  31. 20
      aspnet-core/modules/platform/LINGYUN.Platform.Domain/LINGYUN/Platform/Messages/EmailMessageManager.cs
  32. 4
      aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/INotificationRepository.cs
  33. 4
      aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/IUserNotificationRepository.cs
  34. 13
      aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/NotificationStore.cs
  35. 3
      aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.EntityFrameworkCore/LINGYUN/Abp/Notifications/EntityFrameworkCore/EfCoreNotificationRepository.cs
  36. 9
      aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.EntityFrameworkCore/LINGYUN/Abp/Notifications/EntityFrameworkCore/EfCoreUserNotificationRepository.cs
  37. 2
      aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Templating/LINGYUN.Abp.Notifications.Templating.csproj
  38. 4
      aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/INotificationStore.cs
  39. 4
      aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/NullNotificationStore.cs
  40. 6
      aspnet-core/modules/task-management/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/NotificationCleanupJob.cs
  41. 5
      aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobInfo.cs
  42. 6
      aspnet-core/services/LY.MicroService.Applications.Single/package.json
  43. 5
      aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/AuthServerHttpApiHostModule.Configure.cs
  44. 31
      aspnet-core/services/LY.MicroService.AuthServer/AuthServerModule.Configure.cs
  45. 3
      aspnet-core/services/LY.MicroService.AuthServer/AuthServerModule.cs
  46. 97
      aspnet-core/services/LY.MicroService.AuthServer/DataSeeder/AuthServerDataSeedContributor.cs
  47. 4
      aspnet-core/services/LY.MicroService.AuthServer/appsettings.json
  48. 6
      aspnet-core/services/LY.MicroService.AuthServer/package.json
  49. 2
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.css
  50. 2
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.css.map
  51. 2
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.min.css
  52. 2
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.min.css.map
  53. 2
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.rtl.css
  54. 2
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.rtl.css.map
  55. 2
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.rtl.min.css
  56. 2
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.rtl.min.css.map
  57. 6
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/js/bootstrap.bundle.js
  58. 2
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/js/bootstrap.bundle.js.map
  59. 4
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/js/bootstrap.bundle.min.js
  60. 2
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/js/bootstrap.bundle.min.js.map
  61. 13
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/datatables.net-bs5/css/dataTables.bootstrap5.css
  62. 4
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/datatables.net/js/dataTables.min.js
  63. 226
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/luxon/luxon.js
  64. 2
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/luxon/luxon.js.map
  65. 2
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/luxon/luxon.min.js
  66. 2
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/luxon/luxon.min.js.map
  67. BIN
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/moment/locale/de-ch.js
  68. 91
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/moment/locale/en-au.js
  69. 35
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.all.js
  70. 6
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.all.min.js
  71. 104
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.css
  72. 35
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.esm.all.js
  73. 6
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.esm.all.min.js
  74. 33
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.esm.js
  75. 4
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.esm.min.js
  76. 33
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.js
  77. 2
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.min.css
  78. 4
      aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.min.js
  79. 5
      aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/BackendAdminHttpApiHostModule.Configure.cs
  80. 5
      aspnet-core/services/LY.MicroService.IdentityServer.HttpApi.Host/IdentityServerHttpApiHostModule.Configure.cs
  81. 6
      aspnet-core/services/LY.MicroService.IdentityServer/package.json
  82. 1879
      aspnet-core/services/LY.MicroService.IdentityServer/wwwroot/libs/jquery/jquery.js
  83. 4
      aspnet-core/services/LY.MicroService.IdentityServer/wwwroot/libs/select2/js/i18n/nb.js
  84. BIN
      aspnet-core/services/LY.MicroService.IdentityServer/wwwroot/libs/timeago/locales/jquery.timeago.rs.js
  85. BIN
      aspnet-core/services/LY.MicroService.IdentityServer/wwwroot/libs/timeago/locales/jquery.timeago.sk.js
  86. 31
      aspnet-core/services/LY.MicroService.IdentityServer/wwwroot/libs/timeago/locales/jquery.timeago.th.js
  87. 5
      aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LocalizationManagementHttpApiHostModule.Configure.cs
  88. 5
      aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/PlatformManagementHttpApiHostModule.Configure.cs
  89. 5
      aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.Configure.cs
  90. 5
      aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.Configure.cs
  91. 5
      aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/WebhooksManagementHttpApiHostModule.Configure.cs
  92. 5
      aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/WechatManagementHttpApiHostModule.Configure.cs
  93. 5
      aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/WorkflowManagementHttpApiHostModule.Configure.cs
  94. 4
      common.props

2
.github/workflows/release.yml

@ -14,4 +14,4 @@ jobs:
with: with:
repo_token: "${{ secrets.GITHUB_TOKEN }}" repo_token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: false prerelease: false
automatic_release_tag: "9.2.1" automatic_release_tag: "9.2.3"

7
Directory.Packages.props

@ -3,8 +3,8 @@
<DotNetCoreCAPPackageVersion>8.3.5</DotNetCoreCAPPackageVersion> <DotNetCoreCAPPackageVersion>8.3.5</DotNetCoreCAPPackageVersion>
<ElsaPackageVersion>2.15.2</ElsaPackageVersion> <ElsaPackageVersion>2.15.2</ElsaPackageVersion>
<ElsaNextPackageVersion>3.3.5</ElsaNextPackageVersion> <ElsaNextPackageVersion>3.3.5</ElsaNextPackageVersion>
<VoloAbpPackageVersion>9.2.1</VoloAbpPackageVersion> <VoloAbpPackageVersion>9.2.3</VoloAbpPackageVersion>
<LINGYUNAbpPackageVersion>9.2.1</LINGYUNAbpPackageVersion> <LINGYUNAbpPackageVersion>9.2.3</LINGYUNAbpPackageVersion>
<MicrosoftExtensionsPackageVersion>9.0.4</MicrosoftExtensionsPackageVersion> <MicrosoftExtensionsPackageVersion>9.0.4</MicrosoftExtensionsPackageVersion>
<MicrosoftAspNetCorePackageVersion>9.0.4</MicrosoftAspNetCorePackageVersion> <MicrosoftAspNetCorePackageVersion>9.0.4</MicrosoftAspNetCorePackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>9.0.4</MicrosoftEntityFrameworkCorePackageVersion> <MicrosoftEntityFrameworkCorePackageVersion>9.0.4</MicrosoftEntityFrameworkCorePackageVersion>
@ -12,7 +12,7 @@
</PropertyGroup> </PropertyGroup>
<!-- Abp Framework --> <!-- Abp Framework -->
<ItemGroup> <ItemGroup>
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite" Version="4.2.1" /> <PackageVersion Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite" Version="4.2.3" />
<PackageVersion Include="Volo.Abp.Core" Version="$(VoloAbpPackageVersion)" /> <PackageVersion Include="Volo.Abp.Core" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Application" Version="$(VoloAbpPackageVersion)" /> <PackageVersion Include="Volo.Abp.Account.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Application.Contracts" Version="$(VoloAbpPackageVersion)" /> <PackageVersion Include="Volo.Abp.Account.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
@ -309,6 +309,7 @@
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.12.0" /> <PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.12.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.12.0-beta.2" /> <PackageVersion Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.12.0-beta.2" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.12.0" /> <PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.12.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.SqlClient" Version="1.12.0-beta.1" />
<PackageVersion Include="Polly" Version="8.5.2" /> <PackageVersion Include="Polly" Version="8.5.2" />
<PackageVersion Include="QRCoder" Version="1.5.1" /> <PackageVersion Include="QRCoder" Version="1.5.1" />
<PackageVersion Include="Quartz.Serialization.Json" Version="3.14.0" /> <PackageVersion Include="Quartz.Serialization.Json" Version="3.14.0" />

6
apps/vben5/.husky/commit-msg

@ -1,6 +0,0 @@
echo Start running commit-msg hook...
# Check whether the git commit information is standardized
pnpm exec commitlint --edit "$1"
echo Run commit-msg hook done.

3
apps/vben5/.husky/post-merge

@ -1,3 +0,0 @@
# 每次 git pull 之后, 安装依赖
pnpm install

7
apps/vben5/.husky/pre-commit

@ -1,7 +0,0 @@
# update `.vscode/vben-admin.code-workspace` file
pnpm vsh code-workspace --auto-commit
# Format and submit code according to lintstagedrc.js configuration
pnpm exec lint-staged
echo Run pre-commit hook done.

20
apps/vben5/.lintstagedrc.mjs

@ -1,20 +0,0 @@
export default {
'*.md': ['prettier --cache --ignore-unknown --write'],
'*.vue': [
'prettier --write',
'eslint --cache --fix',
'stylelint --fix --allow-empty-input',
],
'*.{js,jsx,ts,tsx}': [
'prettier --cache --ignore-unknown --write',
'eslint --cache --fix',
],
'*.{scss,less,styl,html,vue,css}': [
'prettier --cache --ignore-unknown --write',
'stylelint --fix --allow-empty-input',
],
'package.json': ['prettier --cache --write'],
'{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': [
'prettier --cache --write--parser json',
],
};

6
apps/vben5/packages/@abp/settings/src/components/settings/SettingForm.vue

@ -71,7 +71,7 @@ async function onSubmit() {
const input = toValue(settingsUpdateInput); const input = toValue(settingsUpdateInput);
await props.submitApi(input); await props.submitApi(input);
emits('change', input); emits('change', input);
message.success($t('AbpSettingManagement.SuccessfullySaved')); message.success($t('AbpSettingManagement.SavedSuccessfully'));
} finally { } finally {
submiting.value = false; submiting.value = false;
} }
@ -142,8 +142,8 @@ onMounted(onGet);
v-if="detail.slot" v-if="detail.slot"
:change=" :change="
detail.valueType === ValueType.Boolean detail.valueType === ValueType.Boolean
? onCheckChange(detail) ? onCheckChange
: onValueChange(detail) : onValueChange
" "
:detail="detail" :detail="detail"
:name="detail.slot" :name="detail.slot"

1
apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoDrawer.vue

@ -94,6 +94,7 @@ const [Drawer, drawerApi] = useVbenDrawer({
if (isOpen) { if (isOpen) {
try { try {
formModel.value = { formModel.value = {
args: {},
beginTime: formatToDate(new Date()), beginTime: formatToDate(new Date()),
isEnabled: true, isEnabled: true,
jobType: JobType.Once, jobType: JobType.Once,

3
aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/FodyWeavers.xml

@ -0,0 +1,3 @@
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ConfigureAwait ContinueOnCapturedContext="false" />
</Weavers>

20
aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN.Abp.AspNetCore.Auditing.csproj

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\..\configureawait.props" />
<Import Project="..\..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<AssemblyName>LINGYUN.Abp.AspNetCore.Auditing</AssemblyName>
<PackageId>LINGYUN.Abp.AspNetCore.Auditing</PackageId>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore" />
</ItemGroup>
</Project>

19
aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingHeaderOptions.cs

@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace LINGYUN.Abp.AspNetCore.Auditing;
public class AbpAspNetCoreAuditingHeaderOptions
{
/// <summary>
/// 是否在审计日志中记录Http请求头,默认: true
/// </summary>
public bool IsEnabled { get; set; }
/// <summary>
/// 要记录的Http请求头
/// </summary>
public IList<string> HttpHeaders { get; }
public AbpAspNetCoreAuditingHeaderOptions()
{
IsEnabled = true;
HttpHeaders = new List<string>();
}
}

17
aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingModule.cs

@ -0,0 +1,17 @@
using Volo.Abp.AspNetCore;
using Volo.Abp.Auditing;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.AspNetCore.Auditing;
[DependsOn(typeof(AbpAspNetCoreModule))]
public class AbpAspNetCoreAuditingModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpAuditingOptions>(options =>
{
options.Contributors.Add(new AspNetCoreRecordHeaderAuditLogContributor());
});
}
}

51
aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AspNetCoreRecordHeaderAuditLogContributor.cs

@ -0,0 +1,51 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System.Collections.Generic;
using System.Collections.Immutable;
using Volo.Abp.Auditing;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.AspNetCore.Auditing;
public class AspNetCoreRecordHeaderAuditLogContributor : AuditLogContributor, ITransientDependency
{
private const string HttpHeaderRecordKey = "HttpHeaders";
public AspNetCoreRecordHeaderAuditLogContributor()
{
}
public override void PreContribute(AuditLogContributionContext context)
{
var options = context.ServiceProvider.GetRequiredService<IOptions<AbpAspNetCoreAuditingHeaderOptions>>();
if (!options.Value.IsEnabled)
{
return;
}
var httpContext = context.ServiceProvider.GetRequiredService<IHttpContextAccessor>().HttpContext;
if (httpContext == null)
{
return;
}
if (context.AuditInfo.HasProperty(HttpHeaderRecordKey))
{
return;
}
var headerRcords = new Dictionary<string, string>();
var httpHeaders = httpContext.Request.Headers.ToImmutableDictionary();
foreach (var headerKey in options.Value.HttpHeaders)
{
if (httpHeaders.TryGetValue(headerKey, out var headers))
{
headerRcords[headerKey] = headers.JoinAsString(";");
}
}
context.AuditInfo.SetProperty(HttpHeaderRecordKey, headerRcords);
}
}

19
aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/README.md

@ -0,0 +1,19 @@
# LINGYUN.Abp.AspNetCore.Auditing
审计日期扩展模块, 用于在审计日志中加入特定的Http请求头记录
## 模块引用
```csharp
[DependsOn(typeof(AbpAspNetCoreAuditingModule))]
public class YouProjectModule : AbpModule
{
// other
}
```
## 配置项
* AbpAspNetCoreAuditingHeaderOptions.IsEnabled 是否在审计日志中记录Http请求头,默认: true
* AbpAspNetCoreAuditingHeaderOptions.HttpHeaders 需要在审计日志中记录的Http请求头列表

196
aspnet-core/framework/dynamic-queryable/LINGYUN.Linq.Dynamic.Queryable/System/Linq/Expressions/ObjectQueryableExtensions.cs

@ -41,38 +41,30 @@ public static class ObjectQueryableExtensions
// For example(MySql): // For example(MySql):
// ...Other (Field <> Value) // ...Other (Field <> Value)
exp = Expression.NotEqual( exp = Expression.NotEqual(
leftParamter, leftParamter,
Expression.Convert(Expression.Constant(paramter.Value), propertyType)); GetValue(paramter, propertyType));
break; break;
case DynamicComparison.LessThan: case DynamicComparison.LessThan:
// For example(MySql): // For example(MySql):
// ...Other (Field < Value) // ...Other (Field < Value)
exp = Expression.LessThan( exp = BuildLessThanExpression(paramter, leftParamter, propertyType);
leftParamter,
Expression.Convert(Expression.Constant(paramter.Value), propertyType));
break; break;
case DynamicComparison.LessThanOrEqual: case DynamicComparison.LessThanOrEqual:
// For example(MySql): // For example(MySql):
// ...Other (Field <= Value) // ...Other (Field <= Value)
exp = Expression.LessThanOrEqual( exp = BuildLessThanOrEqualExpression(paramter, leftParamter, propertyType);
leftParamter,
Expression.Convert(Expression.Constant(paramter.Value), propertyType));
break; break;
case DynamicComparison.GreaterThan: case DynamicComparison.GreaterThan:
// For example(MySql): // For example(MySql):
// ...Other (Field > Value) // ...Other (Field > Value)
exp = Expression.GreaterThan( exp = BuildGreaterThanExpression(paramter, leftParamter, propertyType);
leftParamter,
Expression.Convert(Expression.Constant(paramter.Value), propertyType));
break; break;
case DynamicComparison.GreaterThanOrEqual: case DynamicComparison.GreaterThanOrEqual:
// For example(MySql): // For example(MySql):
// ...Other (Field >= Value) // ...Other (Field >= Value)
exp = Expression.GreaterThanOrEqual( exp = BuildGreaterThanOrEqualExpression(paramter, leftParamter, propertyType);
leftParamter,
Expression.Convert(Expression.Constant(paramter.Value), propertyType));
break; break;
case DynamicComparison.StartsWith: case DynamicComparison.StartsWith:
// For example(MySql): // For example(MySql):
@ -80,7 +72,7 @@ public static class ObjectQueryableExtensions
exp = Expression.Call( exp = Expression.Call(
leftParamter, leftParamter,
typeof(string).GetMethod(nameof(String.StartsWith), new[] { typeof(string) }), typeof(string).GetMethod(nameof(String.StartsWith), new[] { typeof(string) }),
Expression.Convert(Expression.Constant(paramter.Value), propertyType)); GetValue(paramter, propertyType));
// TODO: 单元测试通过 // TODO: 单元测试通过
// For example(MySql): // For example(MySql):
@ -106,7 +98,7 @@ public static class ObjectQueryableExtensions
Expression.Call( Expression.Call(
leftParamter, leftParamter,
typeof(string).GetMethod(nameof(String.StartsWith), new[] { typeof(string) }), typeof(string).GetMethod(nameof(String.StartsWith), new[] { typeof(string) }),
Expression.Convert(Expression.Constant(paramter.Value), propertyType))); GetValue(paramter, propertyType)));
// TODO: 单元测试通过 // TODO: 单元测试通过
// For example(MySql): // For example(MySql):
@ -129,7 +121,7 @@ public static class ObjectQueryableExtensions
exp = Expression.Call( exp = Expression.Call(
leftParamter, leftParamter,
typeof(string).GetMethod(nameof(String.EndsWith), new[] { typeof(string) }), typeof(string).GetMethod(nameof(String.EndsWith), new[] { typeof(string) }),
Expression.Convert(Expression.Constant(paramter.Value), propertyType)); GetValue(paramter, propertyType));
// TODO: 单元测试通过 // TODO: 单元测试通过
// For example(MySql): // For example(MySql):
@ -153,7 +145,7 @@ public static class ObjectQueryableExtensions
Expression.Call( Expression.Call(
leftParamter, leftParamter,
typeof(string).GetMethod(nameof(String.EndsWith), new[] { typeof(string) }), typeof(string).GetMethod(nameof(String.EndsWith), new[] { typeof(string) }),
Expression.Convert(Expression.Constant(paramter.Value), propertyType))); GetValue(paramter, propertyType)));
// TODO: 单元测试通过 // TODO: 单元测试通过
// For example(MySql): // For example(MySql):
@ -176,7 +168,7 @@ public static class ObjectQueryableExtensions
exp = Expression.Call( exp = Expression.Call(
leftParamter, leftParamter,
typeof(string).GetMethod(nameof(String.Contains), new[] { typeof(string) }), typeof(string).GetMethod(nameof(String.Contains), new[] { typeof(string) }),
Expression.Convert(Expression.Constant(paramter.Value), propertyType)); GetValue(paramter, propertyType));
// TODO: 单元测试通过 // TODO: 单元测试通过
// For example(MySql): // For example(MySql):
@ -200,7 +192,7 @@ public static class ObjectQueryableExtensions
Expression.Call( Expression.Call(
leftParamter, leftParamter,
typeof(string).GetMethod(nameof(String.Contains), new[] { typeof(string) }), typeof(string).GetMethod(nameof(String.Contains), new[] { typeof(string) }),
Expression.Convert(Expression.Constant(paramter.Value), propertyType))); GetValue(paramter, propertyType)));
// TODO: 单元测试通过 // TODO: 单元测试通过
// For example(MySql): // For example(MySql):
// ...Other ((Field IS NULL) OR (Field NOT LIKE '%Value%')) // ...Other ((Field IS NULL) OR (Field NOT LIKE '%Value%'))
@ -223,16 +215,14 @@ public static class ObjectQueryableExtensions
// 非空字段设定为比对默认值 // 非空字段设定为比对默认值
exp = Expression.Equal(leftParamter, exp = Expression.Equal(leftParamter,
Expression.Convert( Expression.Constant(GetDefaultValue(propertyType)));
Expression.Constant(GetDefaultValue(propertyType)), propertyType));
break; break;
case DynamicComparison.NotNull: case DynamicComparison.NotNull:
// For example(MySql): // For example(MySql):
// ...Other (Field IS NOT NULL) // ...Other (Field IS NOT NULL)
exp = Expression.NotEqual(leftParamter, exp = Expression.NotEqual(leftParamter,
Expression.Convert( Expression.Constant(GetDefaultValue(propertyType)));
Expression.Constant(GetDefaultValue(propertyType)), propertyType));
break; break;
default: default:
case DynamicComparison.Equal: case DynamicComparison.Equal:
@ -240,8 +230,8 @@ public static class ObjectQueryableExtensions
// ...Other (Field = Value) // ...Other (Field = Value)
exp = Expression.Equal( exp = Expression.Equal(
leftParamter, leftParamter,
Expression.Convert(Expression.Constant(paramter.Value), propertyType)); GetValue(paramter, propertyType));
break; break;
} }
expressions.Push(exp); expressions.Push(exp);
@ -267,6 +257,160 @@ public static class ObjectQueryableExtensions
return Expression.Lambda<T>(expressions.Pop(), condition.Parameters.ToArray()); return Expression.Lambda<T>(expressions.Pop(), condition.Parameters.ToArray());
} }
private static Expression BuildLessThanExpression(DynamicParamter paramter, MemberExpression member, Type propertyType)
{
if (propertyType == typeof(string))
{
// 字符串比较: Field < Value
return Expression.LessThan(
Expression.Call(
member,
typeof(string).GetMethod("CompareTo", new[] { typeof(string) }),
Expression.Constant(Convert.ToString(paramter.Value))),
Expression.Constant(0));
}
if (propertyType.IsNullableType())
{
// 可空类型比较: Field < Value
var underlyingType = Nullable.GetUnderlyingType(propertyType);
var hasValue = Expression.Property(member, "HasValue");
var value = Expression.Property(member, "Value");
return Expression.AndAlso(
hasValue,
Expression.LessThan(
value,
GetValue(paramter, underlyingType)));
}
else
{
// 数值比较: Field < Value
return Expression.LessThan(
member,
GetValue(paramter, propertyType));
}
}
private static Expression BuildLessThanOrEqualExpression(DynamicParamter paramter, MemberExpression member, Type propertyType)
{
if (propertyType == typeof(string))
{
// 字符串比较: Field <= Value
return Expression.LessThanOrEqual(
Expression.Call(
member,
typeof(string).GetMethod("CompareTo", new[] { typeof(string) }),
Expression.Constant(Convert.ToString(paramter.Value))),
Expression.Constant(0));
}
if (propertyType.IsNullableType())
{
// 可空类型比较: Field <= Value
var underlyingType = Nullable.GetUnderlyingType(propertyType);
var hasValue = Expression.Property(member, "HasValue");
var value = Expression.Property(member, "Value");
return Expression.AndAlso(
hasValue,
Expression.LessThanOrEqual(
value,
GetValue(paramter, underlyingType)));
}
else
{
// 数值比较: Field <= Value
return Expression.LessThanOrEqual(
member,
GetValue(paramter, propertyType));
}
}
private static Expression BuildGreaterThanExpression(DynamicParamter paramter, MemberExpression member, Type propertyType)
{
if (propertyType == typeof(string))
{
// 字符串比较: Field > Value
return Expression.GreaterThan(
Expression.Call(
member,
typeof(string).GetMethod("CompareTo", new[] { typeof(string) }),
Expression.Constant(Convert.ToString(paramter.Value))),
Expression.Constant(0));
}
if (propertyType.IsNullableType())
{
// 可空类型比较: Field > Value
var underlyingType = Nullable.GetUnderlyingType(propertyType);
var hasValue = Expression.Property(member, "HasValue");
var value = Expression.Property(member, "Value");
return Expression.AndAlso(
hasValue,
Expression.GreaterThan(
value,
GetValue(paramter, underlyingType)));
}
else
{
// 数值比较: Field > Value
return Expression.GreaterThan(
member,
GetValue(paramter, propertyType));
}
}
private static Expression BuildGreaterThanOrEqualExpression(DynamicParamter paramter, MemberExpression member, Type propertyType)
{
if (propertyType == typeof(string))
{
// 字符串比较: Field >= Value
return Expression.GreaterThanOrEqual(
Expression.Call(
member,
typeof(string).GetMethod("CompareTo", new[] { typeof(string) }),
Expression.Constant(Convert.ToString(paramter.Value))),
Expression.Constant(0));
}
if (propertyType.IsNullableType())
{
// 可空类型比较: Field >= Value
var underlyingType = Nullable.GetUnderlyingType(propertyType);
var hasValue = Expression.Property(member, "HasValue");
var value = Expression.Property(member, "Value");
return Expression.AndAlso(
hasValue,
Expression.GreaterThanOrEqual(
value,
GetValue(paramter, underlyingType)));
}
else
{
// 数值比较: Field >= Value
return Expression.GreaterThanOrEqual(
member,
GetValue(paramter, propertyType));
}
}
private static ConstantExpression GetValue(DynamicParamter paramter, Type propertyType)
{
object typedValue;
if (propertyType.IsNullableType())
{
propertyType = Nullable.GetUnderlyingType(propertyType);
}
typedValue = Convert.ChangeType(paramter.Value, propertyType);
return Expression.Constant(typedValue, propertyType);
}
private static object GetDefaultValue(Type type) private static object GetDefaultValue(Type type)
{ {
// TODO: 非空字段此处返回默认值 // TODO: 非空字段此处返回默认值

6
aspnet-core/modules/account/LINGYUN.Abp.Account.Application/LINGYUN/Abp/Account/MyProfileAppService.cs

@ -75,12 +75,12 @@ public class MyProfileAppService : AccountApplicationServiceBase, IMyProfileAppS
public async virtual Task<PagedResultDto<IdentitySessionDto>> GetSessionsAsync(GetMySessionsInput input) public async virtual Task<PagedResultDto<IdentitySessionDto>> GetSessionsAsync(GetMySessionsInput input)
{ {
var user = await GetCurrentUserAsync(); var userId = CurrentUser.GetId();
var totalCount = await IdentitySessionRepository.GetCountAsync( var totalCount = await IdentitySessionRepository.GetCountAsync(
user.Id, input.Device, input.ClientId); userId, input.Device, input.ClientId);
var identitySessions = await IdentitySessionRepository.GetListAsync( var identitySessions = await IdentitySessionRepository.GetListAsync(
input.Sorting, input.MaxResultCount, input.SkipCount, input.Sorting, input.MaxResultCount, input.SkipCount,
user.Id, input.Device, input.ClientId); userId, input.Device, input.ClientId);
return new PagedResultDto<IdentitySessionDto>(totalCount, return new PagedResultDto<IdentitySessionDto>(totalCount,
identitySessions.Select(session => new IdentitySessionDto identitySessions.Select(session => new IdentitySessionDto

2
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Domain/LINGYUN/Abp/Identity/AbpIdentityDomainModule.cs

@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.AutoMapper; using Volo.Abp.AutoMapper;
using Volo.Abp.BackgroundWorkers; using Volo.Abp.BackgroundWorkers;
using Volo.Abp.DistributedLocking;
using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.Domain.Entities.Events.Distributed;
using Volo.Abp.Identity; using Volo.Abp.Identity;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
@ -14,6 +15,7 @@ namespace LINGYUN.Abp.Identity;
[DependsOn( [DependsOn(
typeof(AbpIdentityDomainSharedModule), typeof(AbpIdentityDomainSharedModule),
typeof(AbpDistributedLockingAbstractionsModule),
typeof(Volo.Abp.Identity.AbpIdentityDomainModule))] typeof(Volo.Abp.Identity.AbpIdentityDomainModule))]
public class AbpIdentityDomainModule : AbpModule public class AbpIdentityDomainModule : AbpModule
{ {

71
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Domain/LINGYUN/Abp/Identity/Session/IdentitySessionCacheItemSynchronizer.cs

@ -4,6 +4,7 @@ using Microsoft.Extensions.Logging.Abstractions;
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.DistributedLocking;
using Volo.Abp.Domain.Entities.Events; using Volo.Abp.Domain.Entities.Events;
using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.Domain.Entities.Events.Distributed;
using Volo.Abp.EventBus; using Volo.Abp.EventBus;
@ -22,15 +23,18 @@ public class IdentitySessionCacheItemSynchronizer :
{ {
public ILogger<IdentitySessionCacheItemSynchronizer> Logger { protected get; set; } public ILogger<IdentitySessionCacheItemSynchronizer> Logger { protected get; set; }
protected ISettingProvider SettingProvider { get; } protected ISettingProvider SettingProvider { get; }
protected IAbpDistributedLock DistributedLock { get; }
protected IIdentitySessionCache IdentitySessionCache { get; } protected IIdentitySessionCache IdentitySessionCache { get; }
protected IIdentitySessionStore IdentitySessionStore { get; } protected IIdentitySessionStore IdentitySessionStore { get; }
public IdentitySessionCacheItemSynchronizer( public IdentitySessionCacheItemSynchronizer(
ISettingProvider settingProvider, ISettingProvider settingProvider,
IAbpDistributedLock distributedLock,
IIdentitySessionCache identitySessionCache, IIdentitySessionCache identitySessionCache,
IIdentitySessionStore identitySessionStore) IIdentitySessionStore identitySessionStore)
{ {
SettingProvider = settingProvider; SettingProvider = settingProvider;
DistributedLock = distributedLock;
IdentitySessionCache = identitySessionCache; IdentitySessionCache = identitySessionCache;
IdentitySessionStore = identitySessionStore; IdentitySessionStore = identitySessionStore;
@ -45,34 +49,71 @@ public class IdentitySessionCacheItemSynchronizer :
[UnitOfWork] [UnitOfWork]
public async virtual Task HandleEventAsync(EntityCreatedEto<IdentitySessionEto> eventData) public async virtual Task HandleEventAsync(EntityCreatedEto<IdentitySessionEto> eventData)
{ {
await RefreshSessionCache(eventData.Entity); var lockKey = $"{nameof(IdentitySessionCacheItemSynchronizer)}_{nameof(EntityCreatedEto<IdentitySessionEto>)}";
await CheckConcurrentLoginStrategy(eventData.Entity); await using (var handle = await DistributedLock.TryAcquireAsync(lockKey))
{
Logger.LogInformation($"Lock is acquired for {lockKey}");
if (handle == null)
{
Logger.LogInformation($"Handle is null because of the locking for : {lockKey}");
return;
}
await RefreshSessionCache(eventData.Entity);
await CheckConcurrentLoginStrategy(eventData.Entity);
}
} }
[UnitOfWork]
public async virtual Task HandleEventAsync(IdentitySessionChangeAccessedEvent eventData) public async virtual Task HandleEventAsync(IdentitySessionChangeAccessedEvent eventData)
{ {
var idetitySession = await IdentitySessionStore.FindAsync(eventData.SessionId); var lockKey = $"{nameof(IdentitySessionCacheItemSynchronizer)}_{nameof(IdentitySessionChangeAccessedEvent)}";
if (idetitySession != null) await using (var handle = await DistributedLock.TryAcquireAsync(lockKey))
{ {
if (!eventData.IpAddresses.IsNullOrWhiteSpace()) Logger.LogInformation($"Lock is acquired for {lockKey}");
if (handle == null)
{ {
idetitySession.SetIpAddresses(eventData.IpAddresses.Split(",")); Logger.LogInformation($"Handle is null because of the locking for : {lockKey}");
return;
} }
idetitySession.UpdateLastAccessedTime(eventData.LastAccessed);
await IdentitySessionStore.UpdateAsync(idetitySession); var idetitySession = await IdentitySessionStore.FindAsync(eventData.SessionId);
} if (idetitySession != null)
else {
{ if (!eventData.IpAddresses.IsNullOrWhiteSpace())
// 数据库中不存在会话, 清理缓存, 后续请求会话失效 {
await IdentitySessionCache.RemoveAsync(eventData.SessionId); idetitySession.SetIpAddresses(eventData.IpAddresses.Split(","));
}
idetitySession.UpdateLastAccessedTime(eventData.LastAccessed);
await IdentitySessionStore.UpdateAsync(idetitySession);
}
else
{
// 数据库中不存在会话, 清理缓存, 后续请求会话失效
await IdentitySessionCache.RemoveAsync(eventData.SessionId);
}
} }
} }
public async virtual Task HandleEventAsync(EntityDeletedEventData<IdentityUser> eventData) public async virtual Task HandleEventAsync(EntityDeletedEventData<IdentityUser> eventData)
{ {
// 用户被删除, 移除所有会话 var lockKey = $"{nameof(IdentitySessionCacheItemSynchronizer)}_{nameof(EntityDeletedEventData<IdentityUser>)}";
await IdentitySessionStore.RevokeAllAsync(eventData.Entity.Id); await using (var handle = await DistributedLock.TryAcquireAsync(lockKey))
{
Logger.LogInformation($"Lock is acquired for {lockKey}");
if (handle == null)
{
Logger.LogInformation($"Handle is null because of the locking for : {lockKey}");
return;
}
// 用户被删除, 移除所有会话
await IdentitySessionStore.RevokeAllAsync(eventData.Entity.Id);
}
} }
protected async virtual Task RefreshSessionCache(IdentitySessionEto session) protected async virtual Task RefreshSessionCache(IdentitySessionEto session)

28
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Domain/LINGYUN/Abp/Identity/Session/IdentitySessionCleanupBackgroundWorker.cs

@ -1,20 +1,25 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.BackgroundWorkers; using Volo.Abp.BackgroundWorkers;
using Volo.Abp.DistributedLocking;
using Volo.Abp.Threading; using Volo.Abp.Threading;
namespace LINGYUN.Abp.Identity.Session; namespace LINGYUN.Abp.Identity.Session;
public class IdentitySessionCleanupBackgroundWorker : AsyncPeriodicBackgroundWorkerBase public class IdentitySessionCleanupBackgroundWorker : AsyncPeriodicBackgroundWorkerBase
{ {
protected IAbpDistributedLock DistributedLock { get; }
protected IdentitySessionCleanupOptions Options { get; } protected IdentitySessionCleanupOptions Options { get; }
public IdentitySessionCleanupBackgroundWorker( public IdentitySessionCleanupBackgroundWorker(
AbpAsyncTimer timer, AbpAsyncTimer timer,
IServiceScopeFactory serviceScopeFactory, IServiceScopeFactory serviceScopeFactory,
IOptions<IdentitySessionCleanupOptions> options) IOptions<IdentitySessionCleanupOptions> options,
IAbpDistributedLock distributedLock)
: base(timer, serviceScopeFactory) : base(timer, serviceScopeFactory)
{ {
DistributedLock = distributedLock;
Options = options.Value; Options = options.Value;
timer.Period = Options.CleanupPeriod; timer.Period = Options.CleanupPeriod;
} }
@ -26,9 +31,22 @@ public class IdentitySessionCleanupBackgroundWorker : AsyncPeriodicBackgroundWor
return; return;
} }
await workerContext await using (var handle = await DistributedLock.TryAcquireAsync(nameof(IdentitySessionCleanupBackgroundWorker)))
.ServiceProvider {
.GetRequiredService<IdentitySessionCleanupService>() Logger.LogInformation($"Lock is acquired for {nameof(IdentitySessionCleanupBackgroundWorker)}");
.CleanAsync();
if (handle != null)
{
await workerContext
.ServiceProvider
.GetRequiredService<IdentitySessionCleanupService>()
.CleanAsync();
Logger.LogInformation($"Lock is released for {nameof(IdentitySessionCleanupBackgroundWorker)}");
return;
}
Logger.LogInformation($"Handle is null because of the locking for : {nameof(IdentitySessionCleanupBackgroundWorker)}");
}
} }
} }

19
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IFileAppService.cs

@ -1,19 +0,0 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Content;
namespace LINGYUN.Abp.OssManagement;
public interface IFileAppService : IApplicationService
{
Task<OssObjectDto> UploadAsync(UploadFileInput input);
Task<IRemoteStreamContent> GetAsync(GetPublicFileInput input);
Task<ListResultDto<OssObjectDto>> GetListAsync(GetFilesInput input);
Task UploadChunkAsync(UploadFileChunkInput input);
Task DeleteAsync(GetPublicFileInput input);
}

14
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IPrivateFileAppService.cs

@ -1,10 +1,22 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Content;
namespace LINGYUN.Abp.OssManagement; namespace LINGYUN.Abp.OssManagement;
public interface IPrivateFileAppService : IFileAppService public interface IPrivateFileAppService : IApplicationService
{ {
Task<OssObjectDto> UploadAsync(UploadFileInput input);
Task<IRemoteStreamContent> GetAsync(GetPublicFileInput input);
Task<ListResultDto<OssObjectDto>> GetListAsync(GetFilesInput input);
Task UploadChunkAsync(UploadFileChunkInput input);
Task DeleteAsync(GetPublicFileInput input);
Task<FileShareDto> ShareAsync(FileShareInput input); Task<FileShareDto> ShareAsync(FileShareInput input);
Task<ListResultDto<MyFileShareDto>> GetShareListAsync(); Task<ListResultDto<MyFileShareDto>> GetShareListAsync();

18
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IPublicFileAppService.cs

@ -1,5 +1,19 @@
namespace LINGYUN.Abp.OssManagement; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Content;
public interface IPublicFileAppService : IFileAppService namespace LINGYUN.Abp.OssManagement;
public interface IPublicFileAppService : IApplicationService
{ {
Task<OssObjectDto> UploadAsync(UploadFileInput input);
Task<IRemoteStreamContent> GetAsync(GetPublicFileInput input);
Task<ListResultDto<OssObjectDto>> GetListAsync(GetFilesInput input);
Task UploadChunkAsync(UploadFileChunkInput input);
Task DeleteAsync(GetPublicFileInput input);
} }

2
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileAppServiceBase.cs

@ -14,7 +14,7 @@ using Volo.Abp.Validation;
namespace LINGYUN.Abp.OssManagement; namespace LINGYUN.Abp.OssManagement;
public abstract class FileAppServiceBase : OssManagementApplicationServiceBase, IFileAppService public abstract class FileAppServiceBase : OssManagementApplicationServiceBase
{ {
protected IFileUploader FileUploader { get; } protected IFileUploader FileUploader { get; }
protected IFileValidater FileValidater { get; } protected IFileValidater FileValidater { get; }

4
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi.Client/ClientProxies/LINGYUN/Abp/OssManagement/PrivateFilesClientProxy.Generated.cs

@ -15,8 +15,8 @@ using Volo.Abp.Http.Modeling;
namespace LINGYUN.Abp.OssManagement; namespace LINGYUN.Abp.OssManagement;
[Dependency(ReplaceServices = true)] [Dependency(ReplaceServices = true)]
[ExposeServices(typeof(IFileAppService), typeof(PrivateFilesClientProxy))] [ExposeServices(typeof(IPrivateFileAppService), typeof(PrivateFilesClientProxy))]
public partial class PrivateFilesClientProxy : ClientProxyBase<IFileAppService>, IFileAppService public partial class PrivateFilesClientProxy : ClientProxyBase<IPrivateFileAppService>, IPrivateFileAppService
{ {
public virtual async Task<OssObjectDto> UploadAsync(UploadFileInput input) public virtual async Task<OssObjectDto> UploadAsync(UploadFileInput input)
{ {

4
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi.Client/ClientProxies/LINGYUN/Abp/OssManagement/PublicFilesClientProxy.Generated.cs

@ -15,8 +15,8 @@ using Volo.Abp.Http.Modeling;
namespace LINGYUN.Abp.OssManagement; namespace LINGYUN.Abp.OssManagement;
[Dependency(ReplaceServices = true)] [Dependency(ReplaceServices = true)]
[ExposeServices(typeof(IFileAppService), typeof(PublicFilesClientProxy))] [ExposeServices(typeof(IPublicFileAppService), typeof(PublicFilesClientProxy))]
public partial class PublicFilesClientProxy : ClientProxyBase<IFileAppService>, IFileAppService public partial class PublicFilesClientProxy : ClientProxyBase<IPublicFileAppService>, IPublicFileAppService
{ {
public virtual async Task<OssObjectDto> UploadAsync(UploadFileInput input) public virtual async Task<OssObjectDto> UploadAsync(UploadFileInput input)
{ {

182
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi.Client/ClientProxies/oss-management-generate-proxy.json

@ -1694,97 +1694,6 @@
} }
} }
] ]
},
{
"type": "LINGYUN.Abp.OssManagement.IFileAppService",
"name": "IFileAppService",
"methods": [
{
"name": "UploadAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.UploadFileInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.UploadFileInput",
"typeSimple": "LINGYUN.Abp.OssManagement.UploadFileInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "LINGYUN.Abp.OssManagement.OssObjectDto",
"typeSimple": "LINGYUN.Abp.OssManagement.OssObjectDto"
}
},
{
"name": "GetAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.GetPublicFileInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"typeSimple": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "Volo.Abp.Content.IRemoteStreamContent",
"typeSimple": "Volo.Abp.Content.IRemoteStreamContent"
}
},
{
"name": "GetListAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.GetFilesInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.GetFilesInput",
"typeSimple": "LINGYUN.Abp.OssManagement.GetFilesInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "Volo.Abp.Application.Dtos.ListResultDto<LINGYUN.Abp.OssManagement.OssObjectDto>",
"typeSimple": "Volo.Abp.Application.Dtos.ListResultDto<LINGYUN.Abp.OssManagement.OssObjectDto>"
}
},
{
"name": "UploadChunkAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.UploadFileChunkInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.UploadFileChunkInput",
"typeSimple": "LINGYUN.Abp.OssManagement.UploadFileChunkInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "System.Void",
"typeSimple": "System.Void"
}
},
{
"name": "DeleteAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.GetPublicFileInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"typeSimple": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "System.Void",
"typeSimple": "System.Void"
}
}
]
} }
], ],
"actions": { "actions": {
@ -2317,97 +2226,6 @@
} }
} }
] ]
},
{
"type": "LINGYUN.Abp.OssManagement.IFileAppService",
"name": "IFileAppService",
"methods": [
{
"name": "UploadAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.UploadFileInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.UploadFileInput",
"typeSimple": "LINGYUN.Abp.OssManagement.UploadFileInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "LINGYUN.Abp.OssManagement.OssObjectDto",
"typeSimple": "LINGYUN.Abp.OssManagement.OssObjectDto"
}
},
{
"name": "GetAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.GetPublicFileInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"typeSimple": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "Volo.Abp.Content.IRemoteStreamContent",
"typeSimple": "Volo.Abp.Content.IRemoteStreamContent"
}
},
{
"name": "GetListAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.GetFilesInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.GetFilesInput",
"typeSimple": "LINGYUN.Abp.OssManagement.GetFilesInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "Volo.Abp.Application.Dtos.ListResultDto<LINGYUN.Abp.OssManagement.OssObjectDto>",
"typeSimple": "Volo.Abp.Application.Dtos.ListResultDto<LINGYUN.Abp.OssManagement.OssObjectDto>"
}
},
{
"name": "UploadChunkAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.UploadFileChunkInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.UploadFileChunkInput",
"typeSimple": "LINGYUN.Abp.OssManagement.UploadFileChunkInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "System.Void",
"typeSimple": "System.Void"
}
},
{
"name": "DeleteAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.GetPublicFileInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"typeSimple": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "System.Void",
"typeSimple": "System.Void"
}
}
]
} }
], ],
"actions": { "actions": {

9
aspnet-core/modules/platform/LINGYUN.Platform.Application/LINGYUN/Platform/Menus/MenuAppService.cs

@ -210,8 +210,15 @@ public class MenuAppService : PlatformApplicationServiceBase, IMenuAppService
{ {
menu.Component = input.Component; menu.Component = input.Component;
} }
if (menu.ParentId != input.ParentId)
{
if (input.ParentId == menu.Id)
{
throw new BusinessException(PlatformErrorCodes.CannotSetSelfParentMenu, "The current menu cannot be the same as the upper-level menu!");
}
menu.ParentId = input.ParentId;
}
menu.ParentId = input.ParentId;
menu.IsPublic = input.IsPublic; menu.IsPublic = input.IsPublic;
await MenuManager.UpdateAsync(menu); await MenuManager.UpdateAsync(menu);

1
aspnet-core/modules/platform/LINGYUN.Platform.Domain.Shared/LINGYUN/Platform/Localization/Resources/en.json

@ -6,6 +6,7 @@
"Platform:02001": "The same menu exists in the sibling directory: {Name}!", "Platform:02001": "The same menu exists in the sibling directory: {Name}!",
"Platform:02002": "You are not allowed to delete menu nodes when there are other submenus!", "Platform:02002": "You are not allowed to delete menu nodes when there are other submenus!",
"Platform:02003": "The menu level has reached the specified maximum: {Depth}!", "Platform:02003": "The menu level has reached the specified maximum: {Depth}!",
"Platform:02004": "The current menu cannot be the same as the upper-level menu!",
"Platform:02101": "The menu metadata is missing the necessary element :{Name}, which is defined in the data dictionary :{DataName}!", "Platform:02101": "The menu metadata is missing the necessary element :{Name}, which is defined in the data dictionary :{DataName}!",
"Platform:03001": "The metadata format does not match!", "Platform:03001": "The metadata format does not match!",
"Platform:04400": "The user favorites the menu repeatedly!", "Platform:04400": "The user favorites the menu repeatedly!",

1
aspnet-core/modules/platform/LINGYUN.Platform.Domain.Shared/LINGYUN/Platform/Localization/Resources/zh-Hans.json

@ -6,6 +6,7 @@
"Platform:02001": "同级目录下存在相同的菜单: {Name}!", "Platform:02001": "同级目录下存在相同的菜单: {Name}!",
"Platform:02002": "在有其他子菜单的情况下,不允许删除菜单节点!", "Platform:02002": "在有其他子菜单的情况下,不允许删除菜单节点!",
"Platform:02003": "菜单层级已达到规定最大值: {Depth}!", "Platform:02003": "菜单层级已达到规定最大值: {Depth}!",
"Platform:02004": "当前菜单不能与上级菜单相同!",
"Platform:02101": "菜单元数据缺少必要的元素: {Name},此选项在数据字典:{DataName} 中定义!", "Platform:02101": "菜单元数据缺少必要的元素: {Name},此选项在数据字典:{DataName} 中定义!",
"Platform:03001": "元数据格式不匹配!", "Platform:03001": "元数据格式不匹配!",
"Platform:04400": "用户重复收藏菜单!", "Platform:04400": "用户重复收藏菜单!",

4
aspnet-core/modules/platform/LINGYUN.Platform.Domain.Shared/LINGYUN/Platform/PlatformErrorCodes.cs

@ -22,6 +22,10 @@ public static class PlatformErrorCodes
/// </summary> /// </summary>
public const string MenuAchieveMaxDepth = Namespace + ":02003"; public const string MenuAchieveMaxDepth = Namespace + ":02003";
/// <summary> /// <summary>
/// 当前菜单不能与上级菜单相同
/// </summary>
public const string CannotSetSelfParentMenu = Namespace + ":02004";
/// <summary>
/// 菜单元数据缺少必要的元素 /// 菜单元数据缺少必要的元素
/// </summary> /// </summary>
public const string MenuMissingMetadata = Namespace + ":02101"; public const string MenuMissingMetadata = Namespace + ":02101";

20
aspnet-core/modules/platform/LINGYUN.Platform.Domain/LINGYUN/Platform/Messages/EmailMessageManager.cs

@ -65,24 +65,19 @@ public class EmailMessageManager : DomainService, IEmailMessageManager
else else
{ {
var match = Regex.Match(message.From, FromAddressPattern); var match = Regex.Match(message.From, FromAddressPattern);
if (match.Success) from = match.Success ? new MailAddress(match.Value) : new MailAddress(message.From);
{
from = new MailAddress(match.Value);
}
else
{
from = new MailAddress(message.From);
}
} }
var to = new MailAddress(message.Receiver);
var mailMessage = new MailMessage(from, to) var mailMessage = new MailMessage
{ {
From = from,
Subject = message.Subject, Subject = message.Subject,
Body = message.Content, Body = message.Content,
IsBodyHtml = message.IsBodyHtml, IsBodyHtml = message.IsBodyHtml,
}; };
mailMessage.To.Add(message.Receiver);
if (!message.CC.IsNullOrWhiteSpace()) if (!message.CC.IsNullOrWhiteSpace())
{ {
mailMessage.CC.Add(message.CC); mailMessage.CC.Add(message.CC);
@ -103,7 +98,8 @@ public class EmailMessageManager : DomainService, IEmailMessageManager
foreach (var header in message.Headers) foreach (var header in message.Headers)
{ {
mailMessage.Headers.Add(header.Key, header.Value); var sanitizedValue = header.Value?.Replace(",", "") ?? "";
mailMessage.Headers.Add(header.Key, sanitizedValue);
} }
foreach (var attachment in message.Attachments) foreach (var attachment in message.Attachments)
@ -119,7 +115,7 @@ public class EmailMessageManager : DomainService, IEmailMessageManager
return null; return null;
} }
catch(Exception ex) catch (Exception ex)
{ {
Logger.LogWarning("Failed to send a email message, error: {message}", ex.ToString()); Logger.LogWarning("Failed to send a email message, error: {message}", ex.ToString());

4
aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/INotificationRepository.cs

@ -1,4 +1,5 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Repositories;
@ -13,5 +14,6 @@ public interface INotificationRepository : IBasicRepository<Notification, long>
Task<List<Notification>> GetExpritionAsync( Task<List<Notification>> GetExpritionAsync(
int batchCount, int batchCount,
DateTime expritionTime,
CancellationToken cancellationToken = default); CancellationToken cancellationToken = default);
} }

4
aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/IUserNotificationRepository.cs

@ -29,6 +29,10 @@ public interface IUserNotificationRepository : IBasicRepository<UserNotification
int maxResultCount = 10, int maxResultCount = 10,
CancellationToken cancellationToken = default); CancellationToken cancellationToken = default);
Task<List<UserNotification>> GetListByNotificationIdssync(
IEnumerable<long> notificationIds,
CancellationToken cancellationToken = default);
Task<int> GetCountAsync( Task<int> GetCountAsync(
Guid userId, Guid userId,
string filter = "", string filter = "",

13
aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/NotificationStore.cs

@ -102,15 +102,24 @@ public class NotificationStore : INotificationStore
} }
} }
public async virtual Task DeleteNotificationAsync( public async virtual Task DeleteExpritionNotificationAsync(
Guid? tenantId,
int batchCount, int batchCount,
DateTime expritionTime,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
using (var unitOfWork = _unitOfWorkManager.Begin()) using (var unitOfWork = _unitOfWorkManager.Begin())
using (_currentTenant.Change(tenantId))
{ {
var notitications = await _notificationRepository.GetExpritionAsync(batchCount, cancellationToken); var notitications = await _notificationRepository.GetExpritionAsync(
batchCount, expritionTime, cancellationToken);
var userNotitications = await _userNotificationRepository.GetListByNotificationIdssync(
notitications.Select(notification => notification.Id));
// 清理过期通知
await _notificationRepository.DeleteManyAsync(notitications); await _notificationRepository.DeleteManyAsync(notitications);
// 清理用户通知
await _userNotificationRepository.DeleteManyAsync(userNotitications);
await unitOfWork.CompleteAsync(cancellationToken); await unitOfWork.CompleteAsync(cancellationToken);
} }

3
aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.EntityFrameworkCore/LINGYUN/Abp/Notifications/EntityFrameworkCore/EfCoreNotificationRepository.cs

@ -21,10 +21,11 @@ public class EfCoreNotificationRepository : EfCoreRepository<INotificationsDbCon
public async Task<List<Notification>> GetExpritionAsync( public async Task<List<Notification>> GetExpritionAsync(
int batchCount, int batchCount,
DateTime expritionTime,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return await (await GetDbSetAsync()) return await (await GetDbSetAsync())
.Where(x => x.ExpirationTime < DateTime.Now) .Where(x => x.ExpirationTime < expritionTime)
.OrderBy(x => x.ExpirationTime) .OrderBy(x => x.ExpirationTime)
.Take(batchCount) .Take(batchCount)
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));

9
aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.EntityFrameworkCore/LINGYUN/Abp/Notifications/EntityFrameworkCore/EfCoreUserNotificationRepository.cs

@ -74,6 +74,15 @@ public class EfCoreUserNotificationRepository : EfCoreRepository<INotificationsD
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
} }
public async virtual Task<List<UserNotification>> GetListByNotificationIdssync(
IEnumerable<long> notificationIds,
CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.Where(x => notificationIds.Contains(x.NotificationId))
.ToListAsync(GetCancellationToken(cancellationToken));
}
public async virtual Task<List<UserNotificationInfo>> GetNotificationsAsync( public async virtual Task<List<UserNotificationInfo>> GetNotificationsAsync(
Guid userId, Guid userId,
NotificationReadState? readState = null, NotificationReadState? readState = null,

2
aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Templating/LINGYUN.Abp.Notifications.Templating.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\..\common.props" /> <Import Project="..\..\..\..\common.props" />
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0</TargetFrameworks> <TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0</TargetFrameworks>
<AssemblyName>LINGYUN.Abp.Notifications.Templating</AssemblyName> <AssemblyName>LINGYUN.Abp.Notifications.Templating</AssemblyName>
<PackageId>LINGYUN.Abp.Notifications.Templating</PackageId> <PackageId>LINGYUN.Abp.Notifications.Templating</PackageId>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute> <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>

4
aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/INotificationStore.cs

@ -66,8 +66,10 @@ public interface INotificationStore
NotificationInfo notification, NotificationInfo notification,
CancellationToken cancellationToken = default); CancellationToken cancellationToken = default);
Task DeleteNotificationAsync( Task DeleteExpritionNotificationAsync(
Guid? tenantId,
int batchCount, int batchCount,
DateTime expritionTime,
CancellationToken cancellationToken = default); CancellationToken cancellationToken = default);
Task InsertUserNotificationAsync( Task InsertUserNotificationAsync(

4
aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/NullNotificationStore.cs

@ -46,8 +46,10 @@ public class NullNotificationStore : INotificationStore, ISingletonDependency
return Task.CompletedTask; return Task.CompletedTask;
} }
public Task DeleteNotificationAsync( public Task DeleteExpritionNotificationAsync(
Guid? tenantId,
int batchCount, int batchCount,
DateTime expritionTime,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return Task.CompletedTask; return Task.CompletedTask;

6
aspnet-core/modules/task-management/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/NotificationCleanupJob.cs

@ -1,6 +1,8 @@
using LINGYUN.Abp.BackgroundTasks; using LINGYUN.Abp.BackgroundTasks;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Timing;
namespace LINGYUN.Abp.Notifications.Jobs; namespace LINGYUN.Abp.Notifications.Jobs;
@ -24,8 +26,10 @@ public class NotificationCleanupJob : IJobRunnable
public async virtual Task ExecuteAsync(JobRunnableContext context) public async virtual Task ExecuteAsync(JobRunnableContext context)
{ {
var count = context.GetJobData<int>(PropertyBatchCount); var count = context.GetJobData<int>(PropertyBatchCount);
var clock = context.GetRequiredService<IClock>();
var store = context.GetRequiredService<INotificationStore>(); var store = context.GetRequiredService<INotificationStore>();
var currentTenant = context.GetRequiredService<ICurrentTenant>();
await store.DeleteNotificationAsync(count); await store.DeleteExpritionNotificationAsync(currentTenant.Id, count, clock.Now);
} }
} }

5
aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobInfo.cs

@ -146,7 +146,10 @@ public class BackgroundJobInfo : AuditedAggregateRoot<string>, IMultiTenant
// TODO: 是否需要将参数挪到另一个实体? // TODO: 是否需要将参数挪到另一个实体?
// 任务参数的建议是尽量最小化, 仅存储关键信息 // 任务参数的建议是尽量最小化, 仅存储关键信息
Args = new ExtraPropertyDictionary(); Args = new ExtraPropertyDictionary();
Args.AddIfNotContains(args); if (args != null)
{
Args.AddIfNotContains(args);
}
} }
public void SetPeriodJob(string cron) public void SetPeriodJob(string cron)

6
aspnet-core/services/LY.MicroService.Applications.Single/package.json

@ -1,9 +1,9 @@
{ {
"version": "9.2.0", "version": "9.2.3",
"name": "my-app-single", "name": "my-app-single",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@abp/aspnetcore.mvc.ui.theme.leptonxlite": "4.2.0", "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "4.2.3",
"@abp/qrcode": "9.2.0" "@abp/qrcode": "9.2.3"
} }
} }

5
aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/AuthServerHttpApiHostModule.Configure.cs

@ -484,6 +484,11 @@ public partial class AuthServerHttpApiHostModule
options.TokenValidationParameters.ValidIssuers = validIssuers; options.TokenValidationParameters.ValidIssuers = validIssuers;
options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator; options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator;
} }
var validAudiences = configuration.GetSection("AuthServer:ValidAudiences").Get<List<string>>();
if (validAudiences?.Count > 0)
{
options.TokenValidationParameters.ValidAudiences = validAudiences;
}
}); });
if (!isDevelopment) if (!isDevelopment)

31
aspnet-core/services/LY.MicroService.AuthServer/AuthServerModule.Configure.cs

@ -29,6 +29,8 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Logging; using Microsoft.IdentityModel.Logging;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using OpenIddict.Server;
using OpenIddict.Server.AspNetCore;
using OpenIddict.Validation.AspNetCore; using OpenIddict.Validation.AspNetCore;
using StackExchange.Redis; using StackExchange.Redis;
using System; using System;
@ -111,7 +113,7 @@ public partial class AuthServerModule
}); });
} }
private void PreConfigureAuth() private void PreConfigureAuthServer()
{ {
PreConfigure<OpenIddictBuilder>(builder => PreConfigure<OpenIddictBuilder>(builder =>
{ {
@ -139,7 +141,7 @@ public partial class AuthServerModule
PreConfigure<OpenIddictServerBuilder>(builder => PreConfigure<OpenIddictServerBuilder>(builder =>
{ {
builder.AddProductionEncryptionAndSigningCertificate("openiddict.pfx", "e1c48393-0c43-11f0-9582-4aecacda42db"); builder.AddProductionEncryptionAndSigningCertificate(configuration["App:SslFile"], configuration["App:SslPassword"]);
}); });
} }
@ -367,6 +369,31 @@ public partial class AuthServerModule
} }
}); });
} }
private void ConfigureAuthServer(IConfiguration configuration)
{
Configure<OpenIddictServerAspNetCoreBuilder>(builder =>
{
builder.DisableTransportSecurityRequirement();
});
Configure<OpenIddictServerAspNetCoreOptions>(options =>
{
options.DisableTransportSecurityRequirement = true;
});
Configure<OpenIddictServerOptions>(options =>
{
var lifetime = configuration.GetSection("OpenIddict:Lifetime");
options.AuthorizationCodeLifetime = lifetime.GetValue("AuthorizationCode", options.AuthorizationCodeLifetime);
options.AccessTokenLifetime = lifetime.GetValue("AccessToken", options.AccessTokenLifetime);
options.DeviceCodeLifetime = lifetime.GetValue("DeviceCode", options.DeviceCodeLifetime);
options.IdentityTokenLifetime = lifetime.GetValue("IdentityToken", options.IdentityTokenLifetime);
options.RefreshTokenLifetime = lifetime.GetValue("RefreshToken", options.RefreshTokenLifetime);
options.RefreshTokenReuseLeeway = lifetime.GetValue("RefreshTokenReuseLeeway", options.RefreshTokenReuseLeeway);
options.UserCodeLifetime = lifetime.GetValue("UserCode", options.UserCodeLifetime);
});
}
private void ConfigureSecurity(IServiceCollection services, IConfiguration configuration, bool isDevelopment = false) private void ConfigureSecurity(IServiceCollection services, IConfiguration configuration, bool isDevelopment = false)
{ {
services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme);

3
aspnet-core/services/LY.MicroService.AuthServer/AuthServerModule.cs

@ -84,10 +84,10 @@ public partial class AuthServerModule : AbpModule
var configuration = context.Services.GetConfiguration(); var configuration = context.Services.GetConfiguration();
var hostingEnvironment = context.Services.GetHostingEnvironment(); var hostingEnvironment = context.Services.GetHostingEnvironment();
PreConfigureAuth();
PreConfigureWrapper(); PreConfigureWrapper();
PreConfigureFeature(); PreConfigureFeature();
PreForwardedHeaders(); PreForwardedHeaders();
PreConfigureAuthServer();
PreConfigureApp(configuration); PreConfigureApp(configuration);
PreConfigureCAP(configuration); PreConfigureCAP(configuration);
PreConfigureCertificate(configuration, hostingEnvironment); PreConfigureCertificate(configuration, hostingEnvironment);
@ -110,6 +110,7 @@ public partial class AuthServerModule : AbpModule
ConfigureUrls(configuration); ConfigureUrls(configuration);
ConfigureTiming(configuration); ConfigureTiming(configuration);
ConfigureAuditing(configuration); ConfigureAuditing(configuration);
ConfigureAuthServer(configuration);
ConfigureMultiTenancy(configuration); ConfigureMultiTenancy(configuration);
ConfigureJsonSerializer(configuration); ConfigureJsonSerializer(configuration);
ConfigureMvc(context.Services, configuration); ConfigureMvc(context.Services, configuration);

97
aspnet-core/services/LY.MicroService.AuthServer/DataSeeder/AuthServerDataSeedContributor.cs

@ -1,8 +1,4 @@
using LINGYUN.Abp.Identity; using Microsoft.Extensions.Configuration;
using LINGYUN.Abp.OpenIddict.LinkUser;
using LINGYUN.Abp.OpenIddict.Sms;
using LINGYUN.Abp.OpenIddict.WeChat;
using Microsoft.Extensions.Configuration;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -11,8 +7,6 @@ using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
using Volo.Abp.Identity;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
using Volo.Abp.OpenIddict.Applications; using Volo.Abp.OpenIddict.Applications;
using Volo.Abp.OpenIddict.Scopes; using Volo.Abp.OpenIddict.Scopes;
@ -22,6 +16,30 @@ namespace LY.MicroService.AuthServer.DataSeeder;
public class ServerDataSeedContributor : IDataSeedContributor, ITransientDependency public class ServerDataSeedContributor : IDataSeedContributor, ITransientDependency
{ {
public static HashSet<string> InitializeScopes = new HashSet<string>
{
// obsolete! microservice should be allocated separately
"lingyun-abp-application",
// admin service
"ams",
// identity service
"ids",
// localization service
"lts",
// platform service
"pts",
// message service
"mgs",
// task service
"tks",
// webhook service
"wks",
// workflow service
"wfs",
// wechat service
"was"
};
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
private readonly ICurrentTenant _currentTenant; private readonly ICurrentTenant _currentTenant;
private readonly IOpenIddictApplicationManager _applicationManager; private readonly IOpenIddictApplicationManager _applicationManager;
@ -54,33 +72,37 @@ public class ServerDataSeedContributor : IDataSeedContributor, ITransientDepende
{ {
using (_currentTenant.Change(context.TenantId)) using (_currentTenant.Change(context.TenantId))
{ {
await CreateScopeAsync("lingyun-abp-application"); await CreateScopeAsync(InitializeScopes);
await CreateApplicationAsync("lingyun-abp-application");
await CreateApplicationAsync(InitializeScopes);
} }
} }
private async Task CreateScopeAsync(string scope) private async Task CreateScopeAsync(IEnumerable<string> scopes)
{ {
if (await _scopeRepository.FindByNameAsync(scope) == null) foreach (var scope in scopes)
{ {
await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor() if (await _scopeRepository.FindByNameAsync(scope) == null)
{ {
Name = scope, await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor()
DisplayName = scope + " access",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "Abp API 应用程序访问",
[CultureInfo.GetCultureInfo("en")] = "Abp API Application Access"
},
Resources =
{ {
scope Name = scope,
} DisplayName = scope + " access",
}); DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "Abp API 应用程序访问",
[CultureInfo.GetCultureInfo("en")] = "Abp API Application Access"
},
Resources =
{
scope
}
});
}
} }
} }
private async Task CreateApplicationAsync(string scope) private async Task CreateApplicationAsync(IEnumerable<string> scopes)
{ {
var configurationSection = _configuration.GetSection("OpenIddict:Applications"); var configurationSection = _configuration.GetSection("OpenIddict:Applications");
@ -91,7 +113,7 @@ public class ServerDataSeedContributor : IDataSeedContributor, ITransientDepende
if (await _applicationRepository.FindByClientIdAsync(vueClientId) == null) if (await _applicationRepository.FindByClientIdAsync(vueClientId) == null)
{ {
await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor var application = new OpenIddictApplicationDescriptor
{ {
ClientId = vueClientId, ClientId = vueClientId,
ClientSecret = configurationSection["VueAdmin:ClientSecret"], ClientSecret = configurationSection["VueAdmin:ClientSecret"],
@ -138,9 +160,14 @@ public class ServerDataSeedContributor : IDataSeedContributor, ITransientDepende
OpenIddictConstants.Permissions.Scopes.Email, OpenIddictConstants.Permissions.Scopes.Email,
OpenIddictConstants.Permissions.Scopes.Address, OpenIddictConstants.Permissions.Scopes.Address,
OpenIddictConstants.Permissions.Scopes.Phone, OpenIddictConstants.Permissions.Scopes.Phone,
OpenIddictConstants.Permissions.Prefixes.Scope + scope
} }
}); };
foreach (var scope in scopes)
{
application.Permissions.AddIfNotContains(OpenIddictConstants.Permissions.Prefixes.Scope + scope);
}
await _applicationManager.CreateAsync(application);
var vueClientPermissions = new string[1] var vueClientPermissions = new string[1]
{ {
@ -155,7 +182,7 @@ public class ServerDataSeedContributor : IDataSeedContributor, ITransientDepende
{ {
if (await _applicationRepository.FindByClientIdAsync(internalServiceClientId) == null) if (await _applicationRepository.FindByClientIdAsync(internalServiceClientId) == null)
{ {
await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor var application = new OpenIddictApplicationDescriptor
{ {
ClientId = internalServiceClientId, ClientId = internalServiceClientId,
ClientSecret = configurationSection["InternalService:ClientSecret"], ClientSecret = configurationSection["InternalService:ClientSecret"],
@ -193,9 +220,14 @@ public class ServerDataSeedContributor : IDataSeedContributor, ITransientDepende
OpenIddictConstants.Permissions.Scopes.Email, OpenIddictConstants.Permissions.Scopes.Email,
OpenIddictConstants.Permissions.Scopes.Address, OpenIddictConstants.Permissions.Scopes.Address,
OpenIddictConstants.Permissions.Scopes.Phone, OpenIddictConstants.Permissions.Scopes.Phone,
OpenIddictConstants.Permissions.Prefixes.Scope + scope
} }
}); };
foreach (var scope in scopes)
{
application.Permissions.AddIfNotContains(OpenIddictConstants.Permissions.Prefixes.Scope + scope);
}
await _applicationManager.CreateAsync(application);
var internalServicePermissions = new string[2] var internalServicePermissions = new string[2]
{ {
@ -247,9 +279,12 @@ public class ServerDataSeedContributor : IDataSeedContributor, ITransientDepende
OpenIddictConstants.Permissions.Scopes.Email, OpenIddictConstants.Permissions.Scopes.Email,
OpenIddictConstants.Permissions.Scopes.Address, OpenIddictConstants.Permissions.Scopes.Address,
OpenIddictConstants.Permissions.Scopes.Phone, OpenIddictConstants.Permissions.Scopes.Phone,
OpenIddictConstants.Permissions.Prefixes.Scope + scope
} }
}; };
foreach (var scope in scopes)
{
application.Permissions.AddIfNotContains(OpenIddictConstants.Permissions.Prefixes.Scope + scope);
}
oauthClientRootUrls.ForEach(url => oauthClientRootUrls.ForEach(url =>
{ {

4
aspnet-core/services/LY.MicroService.AuthServer/appsettings.json

@ -2,7 +2,9 @@
"App": { "App": {
"Branding": { "Branding": {
"AppName": "Auth Server" "AppName": "Auth Server"
} },
"SslFile": "openiddict.pfx",
"SslPassword": "e1c48393-0c43-11f0-9582-4aecacda42db"
}, },
"Clock": { "Clock": {
"Kind": "Local" "Kind": "Local"

6
aspnet-core/services/LY.MicroService.AuthServer/package.json

@ -1,9 +1,9 @@
{ {
"version": "9.2.0", "version": "9.2.3",
"name": "my-app-authserver", "name": "my-app-authserver",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@abp/aspnetcore.mvc.ui.theme.leptonxlite": "4.2.0", "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "4.2.3",
"@abp/qrcode": "9.2.0" "@abp/qrcode": "9.2.3"
} }
} }

2
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.css

@ -1,6 +1,6 @@
@charset "UTF-8"; @charset "UTF-8";
/*! /*!
* Bootstrap v5.3.6 (https://getbootstrap.com/) * Bootstrap v5.3.7 (https://getbootstrap.com/)
* Copyright 2011-2025 The Bootstrap Authors * Copyright 2011-2025 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */

2
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.css.map

File diff suppressed because one or more lines are too long

2
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.min.css

File diff suppressed because one or more lines are too long

2
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.min.css.map

File diff suppressed because one or more lines are too long

2
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.rtl.css

@ -1,6 +1,6 @@
@charset "UTF-8"; @charset "UTF-8";
/*! /*!
* Bootstrap v5.3.6 (https://getbootstrap.com/) * Bootstrap v5.3.7 (https://getbootstrap.com/)
* Copyright 2011-2025 The Bootstrap Authors * Copyright 2011-2025 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */

2
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.rtl.css.map

File diff suppressed because one or more lines are too long

2
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.rtl.min.css

File diff suppressed because one or more lines are too long

2
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/css/bootstrap.rtl.min.css.map

File diff suppressed because one or more lines are too long

6
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/js/bootstrap.bundle.js

@ -1,5 +1,5 @@
/*! /*!
* Bootstrap v5.3.6 (https://getbootstrap.com/) * Bootstrap v5.3.7 (https://getbootstrap.com/)
* Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
@ -647,7 +647,7 @@
* Constants * Constants
*/ */
const VERSION = '5.3.6'; const VERSION = '5.3.7';
/** /**
* Class definition * Class definition
@ -4805,7 +4805,6 @@
* *
* Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38 * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38
*/ */
// eslint-disable-next-line unicorn/better-regex
const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i; const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;
const allowedAttribute = (attribute, allowedAttributeList) => { const allowedAttribute = (attribute, allowedAttributeList) => {
const attributeName = attribute.nodeName.toLowerCase(); const attributeName = attribute.nodeName.toLowerCase();
@ -5349,6 +5348,7 @@
if (trigger === 'click') { if (trigger === 'click') {
EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => { EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {
const context = this._initializeOnDelegatedTarget(event); const context = this._initializeOnDelegatedTarget(event);
context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK]);
context.toggle(); context.toggle();
}); });
} else if (trigger !== TRIGGER_MANUAL) { } else if (trigger !== TRIGGER_MANUAL) {

2
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/js/bootstrap.bundle.js.map

File diff suppressed because one or more lines are too long

4
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/js/bootstrap.bundle.min.js

File diff suppressed because one or more lines are too long

2
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/bootstrap/js/bootstrap.bundle.min.js.map

File diff suppressed because one or more lines are too long

13
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/datatables.net-bs5/css/dataTables.bootstrap5.css

@ -5,17 +5,18 @@
--dt-row-stripe: 0, 0, 0; --dt-row-stripe: 0, 0, 0;
--dt-row-hover: 0, 0, 0; --dt-row-hover: 0, 0, 0;
--dt-column-ordering: 0, 0, 0; --dt-column-ordering: 0, 0, 0;
--dt-header-align-items: center;
--dt-html-background: white; --dt-html-background: white;
} }
:root.dark { :root.dark {
--dt-html-background: rgb(33, 37, 41); --dt-html-background: rgb(33, 37, 41);
} }
table.dataTable td.dt-control { table.dataTable tbody td.dt-control {
text-align: center; text-align: center;
cursor: pointer; cursor: pointer;
} }
table.dataTable td.dt-control:before { table.dataTable tbody td.dt-control:before {
display: inline-block; display: inline-block;
box-sizing: border-box; box-sizing: border-box;
content: ""; content: "";
@ -24,7 +25,7 @@ table.dataTable td.dt-control:before {
border-bottom: 5px solid transparent; border-bottom: 5px solid transparent;
border-right: 0px solid transparent; border-right: 0px solid transparent;
} }
table.dataTable tr.dt-hasChild td.dt-control:before { table.dataTable tbody tr.dt-hasChild td.dt-control:before {
border-top: 10px solid rgba(0, 0, 0, 0.5); border-top: 10px solid rgba(0, 0, 0, 0.5);
border-left: 5px solid transparent; border-left: 5px solid transparent;
border-bottom: 0px solid transparent; border-bottom: 0px solid transparent;
@ -151,7 +152,7 @@ table.dataTable tfoot > tr > td div.dt-column-header,
table.dataTable tfoot > tr > td div.dt-column-footer { table.dataTable tfoot > tr > td div.dt-column-footer {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: var(--dt-header-align-items);
gap: 4px; gap: 4px;
} }
table.dataTable thead > tr > th div.dt-column-header span.dt-column-title, table.dataTable thead > tr > th div.dt-column-header span.dt-column-title,
@ -409,6 +410,10 @@ table.dataTable tbody td.dt-body-nowrap {
white-space: nowrap; white-space: nowrap;
} }
:root {
--dt-header-align-items: flex-end;
}
/*! Bootstrap 5 integration for DataTables /*! Bootstrap 5 integration for DataTables
* *
* ©2020 SpryMedia Ltd, all rights reserved. * ©2020 SpryMedia Ltd, all rights reserved.

4
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/datatables.net/js/dataTables.min.js

File diff suppressed because one or more lines are too long

226
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/luxon/luxon.js

@ -1270,6 +1270,11 @@ var luxon = (function (exports) {
format = false; format = false;
} }
return listStuff(this, length, months, function () { return listStuff(this, length, months, function () {
// Workaround for "ja" locale: formatToParts does not label all parts of the month
// as "month" and for this locale there is no difference between "format" and "non-format".
// As such, just use format() instead of formatToParts() and take the whole string
var monthSpecialCase = _this2.intl === "ja" || _this2.intl.startsWith("ja-");
format &= !monthSpecialCase;
var intl = format ? { var intl = format ? {
month: length, month: length,
day: "numeric" day: "numeric"
@ -1278,9 +1283,12 @@ var luxon = (function (exports) {
}, },
formatStr = format ? "format" : "standalone"; formatStr = format ? "format" : "standalone";
if (!_this2.monthsCache[formatStr][length]) { if (!_this2.monthsCache[formatStr][length]) {
_this2.monthsCache[formatStr][length] = mapMonths(function (dt) { var mapper = !monthSpecialCase ? function (dt) {
return _this2.extract(dt, intl, "month"); return _this2.extract(dt, intl, "month");
}); } : function (dt) {
return _this2.dtFormatter(dt, intl).format();
};
_this2.monthsCache[formatStr][length] = mapMonths(mapper);
} }
return _this2.monthsCache[formatStr][length]; return _this2.monthsCache[formatStr][length];
}); });
@ -2311,13 +2319,25 @@ var luxon = (function (exports) {
return Math.floor(f); return Math.floor(f);
} }
} }
function roundTo(number, digits, towardZero) { function roundTo(number, digits, rounding) {
if (towardZero === void 0) { if (rounding === void 0) {
towardZero = false; rounding = "round";
}
var factor = Math.pow(10, digits);
switch (rounding) {
case "expand":
return number > 0 ? Math.ceil(number * factor) / factor : Math.floor(number * factor) / factor;
case "trunc":
return Math.trunc(number * factor) / factor;
case "round":
return Math.round(number * factor) / factor;
case "floor":
return Math.floor(number * factor) / factor;
case "ceil":
return Math.ceil(number * factor) / factor;
default:
throw new RangeError("Value rounding " + rounding + " is out of range");
} }
var factor = Math.pow(10, digits),
rounder = towardZero ? Math.trunc : Math.round;
return rounder(number * factor) / factor;
} }
// DATE BASICS // DATE BASICS
@ -2419,7 +2439,7 @@ var luxon = (function (exports) {
function asNumber(value) { function asNumber(value) {
var numericValue = Number(value); var numericValue = Number(value);
if (typeof value === "boolean" || value === "" || Number.isNaN(numericValue)) throw new InvalidArgumentError("Invalid unit value " + value); if (typeof value === "boolean" || value === "" || !Number.isFinite(numericValue)) throw new InvalidArgumentError("Invalid unit value " + value);
return numericValue; return numericValue;
} }
function normalizeObject(obj, normalizer) { function normalizeObject(obj, normalizer) {
@ -2622,10 +2642,11 @@ var luxon = (function (exports) {
for (var i = 0; i < fmt.length; i++) { for (var i = 0; i < fmt.length; i++) {
var c = fmt.charAt(i); var c = fmt.charAt(i);
if (c === "'") { if (c === "'") {
if (currentFull.length > 0) { // turn '' into a literal signal quote instead of just skipping the empty literal
if (currentFull.length > 0 || bracketed) {
splits.push({ splits.push({
literal: bracketed || /^\s+$/.test(currentFull), literal: bracketed || /^\s+$/.test(currentFull),
val: currentFull val: currentFull === "" ? "'" : currentFull
}); });
} }
current = null; current = null;
@ -2689,10 +2710,13 @@ var luxon = (function (exports) {
_proto.resolvedOptions = function resolvedOptions(dt, opts) { _proto.resolvedOptions = function resolvedOptions(dt, opts) {
return this.dtFormatter(dt, opts).resolvedOptions(); return this.dtFormatter(dt, opts).resolvedOptions();
}; };
_proto.num = function num(n, p) { _proto.num = function num(n, p, signDisplay) {
if (p === void 0) { if (p === void 0) {
p = 0; p = 0;
} }
if (signDisplay === void 0) {
signDisplay = undefined;
}
// we get some perf out of doing this here, annoyingly // we get some perf out of doing this here, annoyingly
if (this.opts.forceSimple) { if (this.opts.forceSimple) {
return padStart(n, p); return padStart(n, p);
@ -2701,6 +2725,9 @@ var luxon = (function (exports) {
if (p > 0) { if (p > 0) {
opts.padTo = p; opts.padTo = p;
} }
if (signDisplay) {
opts.signDisplay = signDisplay;
}
return this.loc.numberFormatter(opts).format(n); return this.loc.numberFormatter(opts).format(n);
}; };
_proto.formatDateTimeFromString = function formatDateTimeFromString(dt, fmt) { _proto.formatDateTimeFromString = function formatDateTimeFromString(dt, fmt) {
@ -2969,33 +2996,44 @@ var luxon = (function (exports) {
}; };
_proto.formatDurationFromString = function formatDurationFromString(dur, fmt) { _proto.formatDurationFromString = function formatDurationFromString(dur, fmt) {
var _this2 = this; var _this2 = this;
var invertLargest = this.opts.signMode === "negativeLargestOnly" ? -1 : 1;
var tokenToField = function tokenToField(token) { var tokenToField = function tokenToField(token) {
switch (token[0]) { switch (token[0]) {
case "S": case "S":
return "millisecond"; return "milliseconds";
case "s": case "s":
return "second"; return "seconds";
case "m": case "m":
return "minute"; return "minutes";
case "h": case "h":
return "hour"; return "hours";
case "d": case "d":
return "day"; return "days";
case "w": case "w":
return "week"; return "weeks";
case "M": case "M":
return "month"; return "months";
case "y": case "y":
return "year"; return "years";
default: default:
return null; return null;
} }
}, },
tokenToString = function tokenToString(lildur) { tokenToString = function tokenToString(lildur, info) {
return function (token) { return function (token) {
var mapped = tokenToField(token); var mapped = tokenToField(token);
if (mapped) { if (mapped) {
return _this2.num(lildur.get(mapped), token.length); var inversionFactor = info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1;
var signDisplay;
if (_this2.opts.signMode === "negativeLargestOnly" && mapped !== info.largestUnit) {
signDisplay = "never";
} else if (_this2.opts.signMode === "all") {
signDisplay = "always";
} else {
// "auto" and "negative" are the same, but "auto" has better support
signDisplay = "auto";
}
return _this2.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay);
} else { } else {
return token; return token;
} }
@ -3009,8 +3047,14 @@ var luxon = (function (exports) {
}, []), }, []),
collapsed = dur.shiftTo.apply(dur, realTokens.map(tokenToField).filter(function (t) { collapsed = dur.shiftTo.apply(dur, realTokens.map(tokenToField).filter(function (t) {
return t; return t;
})); })),
return stringifyTokens(tokens, tokenToString(collapsed)); durationInfo = {
isNegativeDuration: collapsed < 0,
// this relies on "collapsed" being based on "shiftTo", which builds up the object
// in order
largestUnit: Object.keys(collapsed.values)[0]
};
return stringifyTokens(tokens, tokenToString(collapsed, durationInfo));
}; };
return Formatter; return Formatter;
}(); }();
@ -3085,11 +3129,11 @@ var luxon = (function (exports) {
} }
// ISO and SQL parsing // ISO and SQL parsing
var offsetRegex = /(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/; var offsetRegex = /(?:([Zz])|([+-]\d\d)(?::?(\d\d))?)/;
var isoExtendedZone = "(?:" + offsetRegex.source + "?(?:\\[(" + ianaRegex.source + ")\\])?)?"; var isoExtendedZone = "(?:" + offsetRegex.source + "?(?:\\[(" + ianaRegex.source + ")\\])?)?";
var isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/; var isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/;
var isoTimeRegex = RegExp("" + isoTimeBaseRegex.source + isoExtendedZone); var isoTimeRegex = RegExp("" + isoTimeBaseRegex.source + isoExtendedZone);
var isoTimeExtensionRegex = RegExp("(?:T" + isoTimeRegex.source + ")?"); var isoTimeExtensionRegex = RegExp("(?:[Tt]" + isoTimeRegex.source + ")?");
var isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/; var isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/;
var isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/; var isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/;
var isoOrdinalRegex = /(\d{4})-?(\d{3})/; var isoOrdinalRegex = /(\d{4})-?(\d{3})/;
@ -3730,9 +3774,13 @@ var luxon = (function (exports) {
* @param {string} fmt - the format string * @param {string} fmt - the format string
* @param {Object} opts - options * @param {Object} opts - options
* @param {boolean} [opts.floor=true] - floor numerical values * @param {boolean} [opts.floor=true] - floor numerical values
* @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs
* @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2"
* @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002"
* @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000"
* @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat("d s", { signMode: "all" }) //=> "+6 +2"
* @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "all" }) //=> "-6 -2"
* @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "negativeLargestOnly" }) //=> "-6 2"
* @return {string} * @return {string}
*/ */
_proto.toFormat = function toFormat(fmt, opts) { _proto.toFormat = function toFormat(fmt, opts) {
@ -3752,12 +3800,14 @@ var luxon = (function (exports) {
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options
* @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`. * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.
* @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor. * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.
* @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero
* @example * @example
* ```js * ```js
* var dur = Duration.fromObject({ days: 1, hours: 5, minutes: 6 }) * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 })
* dur.toHuman() //=> '1 day, 5 hours, 6 minutes' * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes'
* dur.toHuman({ listStyle: "long" }) //=> '1 day, 5 hours, and 6 minutes' * dur.toHuman({ listStyle: "long" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes'
* dur.toHuman({ unitDisplay: "short" }) //=> '1 day, 5 hr, 6 min' * dur.toHuman({ unitDisplay: "short" }) //=> '1 mth, 0 wks, 5 hr, 6 min'
* dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes'
* ``` * ```
*/; */;
_proto.toHuman = function toHuman(opts) { _proto.toHuman = function toHuman(opts) {
@ -3766,9 +3816,10 @@ var luxon = (function (exports) {
opts = {}; opts = {};
} }
if (!this.isValid) return INVALID$2; if (!this.isValid) return INVALID$2;
var showZeros = opts.showZeros !== false;
var l = orderedUnits$1.map(function (unit) { var l = orderedUnits$1.map(function (unit) {
var val = _this.values[unit]; var val = _this.values[unit];
if (isUndefined(val)) { if (isUndefined(val) || val === 0 && !showZeros) {
return null; return null;
} }
return _this.loc.numberFormatter(_extends({ return _this.loc.numberFormatter(_extends({
@ -4145,6 +4196,19 @@ var luxon = (function (exports) {
}, true); }, true);
} }
/**
* Removes all units with values equal to 0 from this Duration.
* @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 }
* @return {Duration}
*/;
_proto.removeZeros = function removeZeros() {
if (!this.isValid) return this;
var vals = removeZeroes(this.values);
return clone$1(this, {
values: vals
}, true);
}
/** /**
* Get the years. * Get the years.
* @type {number} * @type {number}
@ -4960,7 +5024,8 @@ var luxon = (function (exports) {
} }
/** /**
* Returns the end of the Interval * Returns the end of the Interval. This is the first instant which is not part of the interval
* (Interval is half-open).
* @type {DateTime} * @type {DateTime}
*/ */
}, { }, {
@ -6045,39 +6110,55 @@ var luxon = (function (exports) {
forceSimple: true forceSimple: true
}).formatDateTimeFromString(dt, format) : null; }).formatDateTimeFromString(dt, format) : null;
} }
function _toISODate(o, extended) { function _toISODate(o, extended, precision) {
var longFormat = o.c.year > 9999 || o.c.year < 0; var longFormat = o.c.year > 9999 || o.c.year < 0;
var c = ""; var c = "";
if (longFormat && o.c.year >= 0) c += "+"; if (longFormat && o.c.year >= 0) c += "+";
c += padStart(o.c.year, longFormat ? 6 : 4); c += padStart(o.c.year, longFormat ? 6 : 4);
if (precision === "year") return c;
if (extended) { if (extended) {
c += "-"; c += "-";
c += padStart(o.c.month); c += padStart(o.c.month);
if (precision === "month") return c;
c += "-"; c += "-";
c += padStart(o.c.day);
} else { } else {
c += padStart(o.c.month); c += padStart(o.c.month);
c += padStart(o.c.day); if (precision === "month") return c;
} }
c += padStart(o.c.day);
return c; return c;
} }
function _toISOTime(o, extended, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone) { function _toISOTime(o, extended, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision) {
var c = padStart(o.c.hour); var showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0,
if (extended) { c = "";
c += ":"; switch (precision) {
c += padStart(o.c.minute); case "day":
if (o.c.millisecond !== 0 || o.c.second !== 0 || !suppressSeconds) { case "month":
c += ":"; case "year":
} break;
} else { default:
c += padStart(o.c.minute); c += padStart(o.c.hour);
} if (precision === "hour") break;
if (o.c.millisecond !== 0 || o.c.second !== 0 || !suppressSeconds) { if (extended) {
c += padStart(o.c.second); c += ":";
if (o.c.millisecond !== 0 || !suppressMilliseconds) { c += padStart(o.c.minute);
c += "."; if (precision === "minute") break;
c += padStart(o.c.millisecond, 3); if (showSeconds) {
} c += ":";
c += padStart(o.c.second);
}
} else {
c += padStart(o.c.minute);
if (precision === "minute") break;
if (showSeconds) {
c += padStart(o.c.second);
}
}
if (precision === "second") break;
if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) {
c += ".";
c += padStart(o.c.millisecond, 3);
}
} }
if (includeOffset) { if (includeOffset) {
if (o.isOffsetFixed && o.offset === 0 && !extendedZone) { if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {
@ -6258,8 +6339,9 @@ var luxon = (function (exports) {
} }
function diffRelative(start, end, opts) { function diffRelative(start, end, opts) {
var round = isUndefined(opts.round) ? true : opts.round, var round = isUndefined(opts.round) ? true : opts.round,
rounding = isUndefined(opts.rounding) ? "trunc" : opts.rounding,
format = function format(c, unit) { format = function format(c, unit) {
c = roundTo(c, round || opts.calendary ? 0 : 2, true); c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? "round" : rounding);
var formatter = end.loc.clone(opts).relFormatter(opts); var formatter = end.loc.clone(opts).relFormatter(opts);
return formatter.format(c, unit); return formatter.format(c, unit);
}, },
@ -7359,10 +7441,13 @@ var luxon = (function (exports) {
* @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'
* @param {boolean} [opts.extendedZone=false] - add the time zone format extension * @param {boolean} [opts.extendedZone=false] - add the time zone format extension
* @param {string} [opts.format='extended'] - choose between the basic and extended format * @param {string} [opts.format='extended'] - choose between the basic and extended format
* @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.
* @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'
* @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00' * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'
* @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'
* @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'
* @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z'
* @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z'
* @return {string|null} * @return {string|null}
*/; */;
_proto.toISO = function toISO(_temp4) { _proto.toISO = function toISO(_temp4) {
@ -7376,14 +7461,17 @@ var luxon = (function (exports) {
_ref5$includeOffset = _ref5.includeOffset, _ref5$includeOffset = _ref5.includeOffset,
includeOffset = _ref5$includeOffset === void 0 ? true : _ref5$includeOffset, includeOffset = _ref5$includeOffset === void 0 ? true : _ref5$includeOffset,
_ref5$extendedZone = _ref5.extendedZone, _ref5$extendedZone = _ref5.extendedZone,
extendedZone = _ref5$extendedZone === void 0 ? false : _ref5$extendedZone; extendedZone = _ref5$extendedZone === void 0 ? false : _ref5$extendedZone,
_ref5$precision = _ref5.precision,
precision = _ref5$precision === void 0 ? "milliseconds" : _ref5$precision;
if (!this.isValid) { if (!this.isValid) {
return null; return null;
} }
precision = normalizeUnit(precision);
var ext = format === "extended"; var ext = format === "extended";
var c = _toISODate(this, ext); var c = _toISODate(this, ext, precision);
c += "T"; if (orderedUnits.indexOf(precision) >= 3) c += "T";
c += _toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone); c += _toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision);
return c; return c;
} }
@ -7391,18 +7479,22 @@ var luxon = (function (exports) {
* Returns an ISO 8601-compliant string representation of this DateTime's date component * Returns an ISO 8601-compliant string representation of this DateTime's date component
* @param {Object} opts - options * @param {Object} opts - options
* @param {string} [opts.format='extended'] - choose between the basic and extended format * @param {string} [opts.format='extended'] - choose between the basic and extended format
* @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'.
* @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'
* @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'
* @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05'
* @return {string|null} * @return {string|null}
*/; */;
_proto.toISODate = function toISODate(_temp5) { _proto.toISODate = function toISODate(_temp5) {
var _ref6 = _temp5 === void 0 ? {} : _temp5, var _ref6 = _temp5 === void 0 ? {} : _temp5,
_ref6$format = _ref6.format, _ref6$format = _ref6.format,
format = _ref6$format === void 0 ? "extended" : _ref6$format; format = _ref6$format === void 0 ? "extended" : _ref6$format,
_ref6$precision = _ref6.precision,
precision = _ref6$precision === void 0 ? "day" : _ref6$precision;
if (!this.isValid) { if (!this.isValid) {
return null; return null;
} }
return _toISODate(this, format === "extended"); return _toISODate(this, format === "extended", normalizeUnit(precision));
} }
/** /**
@ -7423,10 +7515,12 @@ var luxon = (function (exports) {
* @param {boolean} [opts.extendedZone=true] - add the time zone format extension * @param {boolean} [opts.extendedZone=true] - add the time zone format extension
* @param {boolean} [opts.includePrefix=false] - include the `T` prefix * @param {boolean} [opts.includePrefix=false] - include the `T` prefix
* @param {string} [opts.format='extended'] - choose between the basic and extended format * @param {string} [opts.format='extended'] - choose between the basic and extended format
* @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.
* @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'
* @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'
* @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'
* @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z' * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'
* @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z'
* @return {string} * @return {string}
*/; */;
_proto.toISOTime = function toISOTime(_temp6) { _proto.toISOTime = function toISOTime(_temp6) {
@ -7442,12 +7536,15 @@ var luxon = (function (exports) {
_ref7$extendedZone = _ref7.extendedZone, _ref7$extendedZone = _ref7.extendedZone,
extendedZone = _ref7$extendedZone === void 0 ? false : _ref7$extendedZone, extendedZone = _ref7$extendedZone === void 0 ? false : _ref7$extendedZone,
_ref7$format = _ref7.format, _ref7$format = _ref7.format,
format = _ref7$format === void 0 ? "extended" : _ref7$format; format = _ref7$format === void 0 ? "extended" : _ref7$format,
_ref7$precision = _ref7.precision,
precision = _ref7$precision === void 0 ? "milliseconds" : _ref7$precision;
if (!this.isValid) { if (!this.isValid) {
return null; return null;
} }
var c = includePrefix ? "T" : ""; precision = normalizeUnit(precision);
return c + _toISOTime(this, format === "extended", suppressSeconds, suppressMilliseconds, includeOffset, extendedZone); var c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? "T" : "";
return c + _toISOTime(this, format === "extended", suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision);
} }
/** /**
@ -7736,12 +7833,13 @@ var luxon = (function (exports) {
/** /**
* Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your
* platform supports Intl.RelativeTimeFormat. Rounds down by default. * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default.
* @param {Object} options - options that affect the output * @param {Object} options - options that affect the output
* @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.
* @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow"
* @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds"
* @param {boolean} [options.round=true] - whether to round the numbers in the output. * @param {boolean} [options.round=true] - whether to round the numbers in the output.
* @param {string} [options.rounding="trunc"] - rounding method to use when rounding the numbers in the output. Can be "trunc" (toward zero), "expand" (away from zero), "round", "floor", or "ceil".
* @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.
* @param {string} options.locale - override the locale of this DateTime * @param {string} options.locale - override the locale of this DateTime
* @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this
@ -8624,7 +8722,7 @@ var luxon = (function (exports) {
} }
} }
var VERSION = "3.6.1"; var VERSION = "3.7.1";
exports.DateTime = DateTime; exports.DateTime = DateTime;
exports.Duration = Duration; exports.Duration = Duration;

2
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/luxon/luxon.js.map

File diff suppressed because one or more lines are too long

2
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/luxon/luxon.min.js

File diff suppressed because one or more lines are too long

2
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/luxon/luxon.min.js.map

File diff suppressed because one or more lines are too long

BIN
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/moment/locale/de-ch.js

Binary file not shown.

91
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/moment/locale/en-au.js

@ -1,12 +1,79 @@
:"2025-07-05 11:31:41 [DBG] [Microsoft.AspNetCore.Server.Kestrel.Connections] [1] [135] - Connection id \"0HNDQQATBSFQF\" completed keep alive response.\n","stream":"stderr","time":"2025-07-05T03:31:41.530579165Z"} //! moment.js locale configuration
{"log":"2025-07-05 11:31:41 [INF] [Microsoft.AspNetCore.Hosting.Diagnostics] [1] [135] - Request finished HTTP/1.1 GET http://localhost/healthz - 500 0 null 3.1038ms\n","stream":"stderr","time":"2025-07-05T03:31:41.530631619Z"} //! locale : English (Australia) [en-au]
{"log":"2025-07-05 11:31:41 [DBG] [Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets] [1] [95] - Connection id \"0HNDQQATBSFQF\" received FIN.\n","stream":"stderr","time":"2025-07-05T03:31:41.530770288Z"} //! author : Jared Morse : https://github.com/jarcoal
{"log":"2025-07-05 11:31:41 [DBG] [Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets] [1] [95] - Connection id \"0HNDQQATBSFQF\" sending FIN because: \"The Socket transport's send loop completed gracefully.\"\n","stream":"stderr","time":"2025-07-05T03:31:41.5309084Z"}
{"log":"2025-07-05 11:31:41 [DBG] [Microsoft.AspNetCore.Server.Kestrel.Connections] [1] [95] - Connection id \"0HNDQQATBSFQF\" disconnecting.\n","stream":"stderr","time":"2025-07-05T03:31:41.530921423Z"} ;(function (global, factory) {
{"log":"2025-07-05 11:31:41 [DBG] [Microsoft.AspNetCore.Server.Kestrel.Connections] [1] [135] - Connection id \"0HNDQQATBSFQF\" stopped.\n","stream":"stderr","time":"2025-07-05T03:31:41.531023048Z"} typeof exports === 'object' && typeof module !== 'undefined'
{"log":"2025-07-05 11:31:51 [DBG] [Microsoft.AspNetCore.Server.Kestrel.Connections] [1] [100] - Connection id \"0HNDQQATBSFQG\" accepted.\n","stream":"stderr","time":"2025-07-05T03:31:51.593587844Z"} && typeof require === 'function' ? factory(require('../moment')) :
{"log":"2025-07-05 11:31:51 [DBG] [Microsoft.AspNetCore.Server.Kestrel.Connections] [1] [135] - Connection id \"0HNDQQATBSFQG\" started.\n","stream":"stderr","time":"2025-07-05T03:31:51.593608909Z"} typeof define === 'function' && define.amd ? define(['../moment'], factory) :
{"log":"2025-07-05 11:31:51 [INF] [Microsoft.AspNetCore.Hosting.Diagnostics] [1] [135] - Request starting HTTP/1.1 HEAD http://localhost/healthz - null null\n","stream":"stderr","time":"2025-07-05T03:31:51.593735211Z"} factory(global.moment)
{"log":"2025-07-05 11:31:51 [DBG] [Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware] [1] [135] - AbpCultureMapRequestCultureProvider returned the following unsupported cultures '[]'.\n","stream":"stderr","time":"2025-07-05T03:31:51.594228126Z"} }(this, (function (moment) { 'use strict';
{"log":"2025-07-05 11:31:51 [DBG] [Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware] [1] [135] - AbpCultureMapRequestCultureProvider returned the following unsupported UI Cultures '[]'.\n","stream":"stderr","time":"2025-07-05T03:31:51.594231565Z"}
{"log":"2025-07-05 11:31:51 [DBG] [Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware] [1] [135] - The request path /healthz does not match a supported file type\n","stream":"st //! moment.js locale configuration
var enAu = moment.defineLocale('en-au', {
months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
'_'
),
monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
'_'
),
weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
longDateFormat: {
LT: 'h:mm A',
LTS: 'h:mm:ss A',
L: 'DD/MM/YYYY',
LL: 'D MMMM YYYY',
LLL: 'D MMMM YYYY h:mm A',
LLLL: 'dddd, D MMMM YYYY h:mm A',
},
calendar: {
sameDay: '[Today at] LT',
nextDay: '[Tomorrow at] LT',
nextWeek: 'dddd [at] LT',
lastDay: '[Yesterday at] LT',
lastWeek: '[Last] dddd [at] LT',
sameElse: 'L',
},
relativeTime: {
future: 'in %s',
past: '%s ago',
s: 'a few seconds',
ss: '%d seconds',
m: 'a minute',
mm: '%d minutes',
h: 'an hour',
hh: '%d hours',
d: 'a day',
dd: '%d days',
M: 'a month',
MM: '%d months',
y: 'a year',
yy: '%d years',
},
dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
ordinal: function (number) {
var b = number % 10,
output =
~~((number % 100) / 10) === 1
? 'th'
: b === 1
? 'st'
: b === 2
? 'nd'
: b === 3
? 'rd'
: 'th';
return number + output;
},
week: {
dow: 0, // Sunday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
});
return enAu;
})));

35
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.all.js

File diff suppressed because one or more lines are too long

6
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.all.min.js

File diff suppressed because one or more lines are too long

104
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.css

@ -9,41 +9,56 @@
--swal2-border-radius: 0.3125rem; --swal2-border-radius: 0.3125rem;
--swal2-background: white; --swal2-background: white;
--swal2-color: #545454; --swal2-color: #545454;
--swal2-footer-border-color: #eee;
--swal2-show-animation: swal2-show 0.3s; --swal2-show-animation: swal2-show 0.3s;
--swal2-hide-animation: swal2-hide 0.15s forwards; --swal2-hide-animation: swal2-hide 0.15s forwards;
--swal2-icon-zoom: 1; --swal2-icon-zoom: 1;
--swal2-icon-animations: true; --swal2-icon-animations: true;
--swal2-title-padding: 0.8em 1em 0; --swal2-title-padding: 0.8em 1em 0;
--swal2-html-container-padding: 1em 1.6em 0.3em; --swal2-html-container-padding: 1em 1.6em 0.3em;
--swal2-input-border: 1px solid #d9d9d9;
--swal2-input-border-radius: 0.1875em; --swal2-input-border-radius: 0.1875em;
--swal2-input-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent; --swal2-input-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;
--swal2-input-background: transparent; --swal2-input-background: transparent;
--swal2-input-transition: border-color 0.1s, box-shadow 0.1s; --swal2-input-transition: border-color 0.2s, box-shadow 0.2s;
--swal2-input-hover-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;
--swal2-input-focus-border: 1px solid #b4dbed;
--swal2-input-focus-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px $swal2-outline-color;
--swal2-progress-step-background: #add8e6; --swal2-progress-step-background: #add8e6;
--swal2-validation-message-background: #f0f0f0; --swal2-validation-message-background: #f0f0f0;
--swal2-validation-message-color: #666; --swal2-validation-message-color: #666;
--swal2-footer-border-color: #eee;
--swal2-footer-background: transparent;
--swal2-footer-color: inherit;
--swal2-close-button-position: initial; --swal2-close-button-position: initial;
--swal2-close-button-inset: auto; --swal2-close-button-inset: auto;
--swal2-close-button-font-size: 2.5em; --swal2-close-button-font-size: 2.5em;
--swal2-close-button-color: #ccc; --swal2-close-button-color: #ccc;
--swal2-close-button-transition: color 0.1s, box-shadow 0.1s; --swal2-close-button-transition: color 0.2s, box-shadow 0.2s;
--swal2-close-button-outline: initial; --swal2-close-button-outline: initial;
--swal2-close-button-box-shadow: inset 0 0 0 3px transparent; --swal2-close-button-box-shadow: inset 0 0 0 3px transparent;
--swal2-close-button-focus-box-shadow: inset var(--swal2-outline); --swal2-close-button-focus-box-shadow: inset var(--swal2-outline);
--swal2-close-button-hover-transform: none; --swal2-close-button-hover-transform: none;
--swal2-button-darken-hover: rgba(0, 0, 0, 0.1); --swal2-actions-justify-content: center;
--swal2-button-darken-active: rgba(0, 0, 0, 0.2); --swal2-actions-width: auto;
--swal2-button-transition: box-shadow 0.1s; --swal2-actions-margin: 1.25em auto 0;
--swal2-confirm-button-border: 0; --swal2-actions-padding: 0;
--swal2-actions-border-radius: 0;
--swal2-actions-background: transparent;
--swal2-action-button-transition: background-color 0.2s, box-shadow 0.2s;
--swal2-action-button-hover: black 10%;
--swal2-action-button-active: black 10%;
--swal2-confirm-button-box-shadow: none;
--swal2-confirm-button-border-radius: 0.25em; --swal2-confirm-button-border-radius: 0.25em;
--swal2-confirm-button-background-color: #7066e0; --swal2-confirm-button-background-color: #7066e0;
--swal2-deny-button-border: 0; --swal2-confirm-button-color: #fff;
--swal2-deny-button-box-shadow: none;
--swal2-deny-button-border-radius: 0.25em; --swal2-deny-button-border-radius: 0.25em;
--swal2-deny-button-background-color: #dc3741; --swal2-deny-button-background-color: #dc3741;
--swal2-cancel-button-border: 0; --swal2-deny-button-color: #fff;
--swal2-cancel-button-box-shadow: none;
--swal2-cancel-button-border-radius: 0.25em; --swal2-cancel-button-border-radius: 0.25em;
--swal2-cancel-button-background-color: #6e7881; --swal2-cancel-button-background-color: #6e7881;
--swal2-cancel-button-color: #fff;
--swal2-toast-show-animation: swal2-toast-show 0.5s; --swal2-toast-show-animation: swal2-toast-show 0.5s;
--swal2-toast-hide-animation: swal2-toast-hide 0.1s forwards; --swal2-toast-hide-animation: swal2-toast-hide 0.1s forwards;
--swal2-toast-border: none; --swal2-toast-border: none;
@ -287,19 +302,12 @@ div:where(.swal2-container) div:where(.swal2-actions) {
box-sizing: border-box; box-sizing: border-box;
flex-wrap: wrap; flex-wrap: wrap;
align-items: center; align-items: center;
justify-content: center; justify-content: var(--swal2-actions-justify-content);
width: auto; width: var(--swal2-actions-width);
margin: 1.25em auto 0; margin: var(--swal2-actions-margin);
padding: 0; padding: var(--swal2-actions-padding);
} border-radius: var(--swal2-actions-border-radius);
div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled[disabled] { background: var(--swal2-actions-background);
opacity: 0.4;
}
div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled:hover {
background-image: linear-gradient(var(--swal2-button-darken-hover), var(--swal2-button-darken-hover));
}
div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled:active {
background-image: linear-gradient(var(--swal2-button-darken-active), var(--swal2-button-darken-active));
} }
div:where(.swal2-container) div:where(.swal2-loader) { div:where(.swal2-container) div:where(.swal2-loader) {
display: none; display: none;
@ -317,7 +325,8 @@ div:where(.swal2-container) div:where(.swal2-loader) {
div:where(.swal2-container) button:where(.swal2-styled) { div:where(.swal2-container) button:where(.swal2-styled) {
margin: 0.3125em; margin: 0.3125em;
padding: 0.625em 1.1em; padding: 0.625em 1.1em;
transition: var(--swal2-button-transition); transition: var(--swal2-action-button-transition);
border: none;
box-shadow: 0 0 0 3px transparent; box-shadow: 0 0 0 3px transparent;
font-weight: 500; font-weight: 500;
} }
@ -325,32 +334,53 @@ div:where(.swal2-container) button:where(.swal2-styled):not([disabled]) {
cursor: pointer; cursor: pointer;
} }
div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm) { div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm) {
border: var(--swal2-confirm-button-border);
border-radius: var(--swal2-confirm-button-border-radius); border-radius: var(--swal2-confirm-button-border-radius);
background: initial; background: initial;
background-color: var(--swal2-confirm-button-background-color); background-color: var(--swal2-confirm-button-background-color);
color: #fff; box-shadow: var(--swal2-confirm-button-box-shadow);
color: var(--swal2-confirm-button-color);
font-size: 1em; font-size: 1em;
} }
div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):hover {
background-color: color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-hover));
}
div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):active {
background-color: color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-active));
}
div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny) { div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny) {
border: var(--swal2-deny-button-border);
border-radius: var(--swal2-deny-button-border-radius); border-radius: var(--swal2-deny-button-border-radius);
background: initial; background: initial;
background-color: var(--swal2-deny-button-background-color); background-color: var(--swal2-deny-button-background-color);
color: #fff; box-shadow: var(--swal2-deny-button-box-shadow);
color: var(--swal2-deny-button-color);
font-size: 1em; font-size: 1em;
} }
div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):hover {
background-color: color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-hover));
}
div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):active {
background-color: color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-active));
}
div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel) { div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel) {
border: var(--swal2-cancel-button-border);
border-radius: var(--swal2-cancel-button-border-radius); border-radius: var(--swal2-cancel-button-border-radius);
background: initial; background: initial;
background-color: var(--swal2-cancel-button-background-color); background-color: var(--swal2-cancel-button-background-color);
color: #fff; box-shadow: var(--swal2-cancel-button-box-shadow);
color: var(--swal2-cancel-button-color);
font-size: 1em; font-size: 1em;
} }
div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):hover {
background-color: color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-hover));
}
div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):active {
background-color: color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-active));
}
div:where(.swal2-container) button:where(.swal2-styled):focus-visible { div:where(.swal2-container) button:where(.swal2-styled):focus-visible {
outline: none; outline: none;
box-shadow: var(--swal2-action-button-outline); box-shadow: var(--swal2-action-button-focus-box-shadow);
}
div:where(.swal2-container) button:where(.swal2-styled)[disabled]:not(.swal2-loading) {
opacity: 0.4;
} }
div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner { div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner {
border: 0; border: 0;
@ -359,7 +389,8 @@ div:where(.swal2-container) div:where(.swal2-footer) {
margin: 1em 0 0; margin: 1em 0 0;
padding: 1em 1em 0; padding: 1em 1em 0;
border-top: 1px solid var(--swal2-footer-border-color); border-top: 1px solid var(--swal2-footer-border-color);
color: inherit; background: var(--swal2-footer-background);
color: var(--swal2-footer-color);
font-size: 1em; font-size: 1em;
text-align: center; text-align: center;
cursor: initial; cursor: initial;
@ -449,7 +480,7 @@ div:where(.swal2-container) textarea:where(.swal2-textarea) {
box-sizing: border-box; box-sizing: border-box;
width: auto; width: auto;
transition: var(--swal2-input-transition); transition: var(--swal2-input-transition);
border: 1px solid #d9d9d9; border: var(--swal2-input-border);
border-radius: var(--swal2-input-border-radius); border-radius: var(--swal2-input-border-radius);
background: var(--swal2-input-background); background: var(--swal2-input-background);
box-shadow: var(--swal2-input-box-shadow); box-shadow: var(--swal2-input-box-shadow);
@ -462,12 +493,17 @@ div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror {
border-color: #f27474 !important; border-color: #f27474 !important;
box-shadow: 0 0 2px #f27474 !important; box-shadow: 0 0 2px #f27474 !important;
} }
div:where(.swal2-container) input:where(.swal2-input):hover,
div:where(.swal2-container) input:where(.swal2-file):hover,
div:where(.swal2-container) textarea:where(.swal2-textarea):hover {
box-shadow: var(--swal2-input-hover-box-shadow);
}
div:where(.swal2-container) input:where(.swal2-input):focus, div:where(.swal2-container) input:where(.swal2-input):focus,
div:where(.swal2-container) input:where(.swal2-file):focus, div:where(.swal2-container) input:where(.swal2-file):focus,
div:where(.swal2-container) textarea:where(.swal2-textarea):focus { div:where(.swal2-container) textarea:where(.swal2-textarea):focus {
border: 1px solid #b4dbed; border: var(--swal2-input-focus-border);
outline: none; outline: none;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px rgba(100, 150, 200, 0.5); box-shadow: var(--swal2-input-focus-box-shadow);
} }
div:where(.swal2-container) input:where(.swal2-input)::placeholder, div:where(.swal2-container) input:where(.swal2-input)::placeholder,
div:where(.swal2-container) input:where(.swal2-file)::placeholder, div:where(.swal2-container) input:where(.swal2-file)::placeholder,

35
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.esm.all.js

File diff suppressed because one or more lines are too long

6
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.esm.all.min.js

File diff suppressed because one or more lines are too long

33
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.esm.js

@ -1,5 +1,5 @@
/*! /*!
* sweetalert2 v11.21.1 * sweetalert2 v11.22.2
* Released under the MIT License. * Released under the MIT License.
*/ */
function _assertClassBrand(e, t, n) { function _assertClassBrand(e, t, n) {
@ -982,8 +982,12 @@ function handleButtonsStyling(confirmButton, denyButton, cancelButton, params) {
*/ */
function applyOutlineColor(button) { function applyOutlineColor(button) {
const buttonStyle = window.getComputedStyle(button); const buttonStyle = window.getComputedStyle(button);
if (buttonStyle.getPropertyValue('--swal2-action-button-focus-box-shadow')) {
// If the button already has a custom outline color, no need to change it
return;
}
const outlineColor = buttonStyle.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/, 'rgba($1, $2, $3, 0.5)'); const outlineColor = buttonStyle.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/, 'rgba($1, $2, $3, 0.5)');
button.style.setProperty('--swal2-action-button-outline', buttonStyle.getPropertyValue('--swal2-outline').replace(/ rgba\(.*/, ` ${outlineColor}`)); button.style.setProperty('--swal2-action-button-focus-box-shadow', buttonStyle.getPropertyValue('--swal2-outline').replace(/ rgba\(.*/, ` ${outlineColor}`));
} }
/** /**
@ -1507,11 +1511,18 @@ const adjustSuccessIconBackgroundColor = () => {
successIconParts[i].style.backgroundColor = popupBackgroundColor; successIconParts[i].style.backgroundColor = popupBackgroundColor;
} }
}; };
const successIconHtml = `
<div class="swal2-success-circular-line-left"></div> /**
*
* @param {SweetAlertOptions} params
* @returns {string}
*/
const successIconHtml = params => `
${params.animation ? '<div class="swal2-success-circular-line-left"></div>' : ''}
<span class="swal2-success-line-tip"></span> <span class="swal2-success-line-long"></span> <span class="swal2-success-line-tip"></span> <span class="swal2-success-line-long"></span>
<div class="swal2-success-ring"></div> <div class="swal2-success-fix"></div> <div class="swal2-success-ring"></div>
<div class="swal2-success-circular-line-right"></div> ${params.animation ? '<div class="swal2-success-fix"></div>' : ''}
${params.animation ? '<div class="swal2-success-circular-line-right"></div>' : ''}
`; `;
const errorIconHtml = ` const errorIconHtml = `
<span class="swal2-x-mark"> <span class="swal2-x-mark">
@ -1533,7 +1544,7 @@ const setContent = (icon, params) => {
if (params.iconHtml) { if (params.iconHtml) {
newContent = iconContent(params.iconHtml); newContent = iconContent(params.iconHtml);
} else if (params.icon === 'success') { } else if (params.icon === 'success') {
newContent = successIconHtml; newContent = successIconHtml(params);
oldContent = oldContent.replace(/ style=".*?"/g, ''); // undo adjustSuccessIconBackgroundColor() oldContent = oldContent.replace(/ style=".*?"/g, ''); // undo adjustSuccessIconBackgroundColor()
} else if (params.icon === 'error') { } else if (params.icon === 'error') {
newContent = errorIconHtml; newContent = errorIconHtml;
@ -2100,8 +2111,8 @@ const handleArrows = key => {
* @param {Function} dismissWith * @param {Function} dismissWith
*/ */
const handleEsc = (event, innerParams, dismissWith) => { const handleEsc = (event, innerParams, dismissWith) => {
event.preventDefault();
if (callIfFunction(innerParams.allowEscapeKey)) { if (callIfFunction(innerParams.allowEscapeKey)) {
event.preventDefault();
dismissWith(DismissReason.esc); dismissWith(DismissReason.esc);
} }
}; };
@ -3242,8 +3253,8 @@ const showWarningsForParams = params => {
if (params.backdrop === false && params.allowOutsideClick) { if (params.backdrop === false && params.allowOutsideClick) {
warn('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'); warn('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`');
} }
if (params.theme && !['light', 'dark', 'auto', 'minimal', 'borderless', 'embed-iframe'].includes(params.theme)) { if (params.theme && !['light', 'dark', 'auto', 'minimal', 'borderless', 'embed-iframe', 'bulma', 'bulma-light', 'bulma-dark'].includes(params.theme)) {
warn(`Invalid theme "${params.theme}". Expected "light", "dark", "auto", "minimal", "borderless", or "embed-iframe"`); warn(`Invalid theme "${params.theme}"`);
} }
for (const param in params) { for (const param in params) {
checkIfParamIsValid(param); checkIfParamIsValid(param);
@ -4611,7 +4622,7 @@ Object.keys(instanceMethods).forEach(key => {
}; };
}); });
SweetAlert.DismissReason = DismissReason; SweetAlert.DismissReason = DismissReason;
SweetAlert.version = '11.21.1'; SweetAlert.version = '11.22.2';
const Swal = SweetAlert; const Swal = SweetAlert;
// @ts-ignore // @ts-ignore

4
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.esm.min.js

File diff suppressed because one or more lines are too long

33
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.js

@ -1,5 +1,5 @@
/*! /*!
* sweetalert2 v11.21.1 * sweetalert2 v11.22.2
* Released under the MIT License. * Released under the MIT License.
*/ */
(function (global, factory) { (function (global, factory) {
@ -988,8 +988,12 @@
*/ */
function applyOutlineColor(button) { function applyOutlineColor(button) {
const buttonStyle = window.getComputedStyle(button); const buttonStyle = window.getComputedStyle(button);
if (buttonStyle.getPropertyValue('--swal2-action-button-focus-box-shadow')) {
// If the button already has a custom outline color, no need to change it
return;
}
const outlineColor = buttonStyle.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/, 'rgba($1, $2, $3, 0.5)'); const outlineColor = buttonStyle.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/, 'rgba($1, $2, $3, 0.5)');
button.style.setProperty('--swal2-action-button-outline', buttonStyle.getPropertyValue('--swal2-outline').replace(/ rgba\(.*/, ` ${outlineColor}`)); button.style.setProperty('--swal2-action-button-focus-box-shadow', buttonStyle.getPropertyValue('--swal2-outline').replace(/ rgba\(.*/, ` ${outlineColor}`));
} }
/** /**
@ -1513,11 +1517,18 @@
successIconParts[i].style.backgroundColor = popupBackgroundColor; successIconParts[i].style.backgroundColor = popupBackgroundColor;
} }
}; };
const successIconHtml = `
<div class="swal2-success-circular-line-left"></div> /**
*
* @param {SweetAlertOptions} params
* @returns {string}
*/
const successIconHtml = params => `
${params.animation ? '<div class="swal2-success-circular-line-left"></div>' : ''}
<span class="swal2-success-line-tip"></span> <span class="swal2-success-line-long"></span> <span class="swal2-success-line-tip"></span> <span class="swal2-success-line-long"></span>
<div class="swal2-success-ring"></div> <div class="swal2-success-fix"></div> <div class="swal2-success-ring"></div>
<div class="swal2-success-circular-line-right"></div> ${params.animation ? '<div class="swal2-success-fix"></div>' : ''}
${params.animation ? '<div class="swal2-success-circular-line-right"></div>' : ''}
`; `;
const errorIconHtml = ` const errorIconHtml = `
<span class="swal2-x-mark"> <span class="swal2-x-mark">
@ -1539,7 +1550,7 @@
if (params.iconHtml) { if (params.iconHtml) {
newContent = iconContent(params.iconHtml); newContent = iconContent(params.iconHtml);
} else if (params.icon === 'success') { } else if (params.icon === 'success') {
newContent = successIconHtml; newContent = successIconHtml(params);
oldContent = oldContent.replace(/ style=".*?"/g, ''); // undo adjustSuccessIconBackgroundColor() oldContent = oldContent.replace(/ style=".*?"/g, ''); // undo adjustSuccessIconBackgroundColor()
} else if (params.icon === 'error') { } else if (params.icon === 'error') {
newContent = errorIconHtml; newContent = errorIconHtml;
@ -2106,8 +2117,8 @@
* @param {Function} dismissWith * @param {Function} dismissWith
*/ */
const handleEsc = (event, innerParams, dismissWith) => { const handleEsc = (event, innerParams, dismissWith) => {
event.preventDefault();
if (callIfFunction(innerParams.allowEscapeKey)) { if (callIfFunction(innerParams.allowEscapeKey)) {
event.preventDefault();
dismissWith(DismissReason.esc); dismissWith(DismissReason.esc);
} }
}; };
@ -3248,8 +3259,8 @@
if (params.backdrop === false && params.allowOutsideClick) { if (params.backdrop === false && params.allowOutsideClick) {
warn('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'); warn('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`');
} }
if (params.theme && !['light', 'dark', 'auto', 'minimal', 'borderless', 'embed-iframe'].includes(params.theme)) { if (params.theme && !['light', 'dark', 'auto', 'minimal', 'borderless', 'embed-iframe', 'bulma', 'bulma-light', 'bulma-dark'].includes(params.theme)) {
warn(`Invalid theme "${params.theme}". Expected "light", "dark", "auto", "minimal", "borderless", or "embed-iframe"`); warn(`Invalid theme "${params.theme}"`);
} }
for (const param in params) { for (const param in params) {
checkIfParamIsValid(param); checkIfParamIsValid(param);
@ -4617,7 +4628,7 @@
}; };
}); });
SweetAlert.DismissReason = DismissReason; SweetAlert.DismissReason = DismissReason;
SweetAlert.version = '11.21.1'; SweetAlert.version = '11.22.2';
const Swal = SweetAlert; const Swal = SweetAlert;
// @ts-ignore // @ts-ignore

2
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.min.css

File diff suppressed because one or more lines are too long

4
aspnet-core/services/LY.MicroService.AuthServer/wwwroot/libs/sweetalert2/sweetalert2.min.js

File diff suppressed because one or more lines are too long

5
aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/BackendAdminHttpApiHostModule.Configure.cs

@ -449,6 +449,11 @@ public partial class BackendAdminHttpApiHostModule
options.TokenValidationParameters.ValidIssuers = validIssuers; options.TokenValidationParameters.ValidIssuers = validIssuers;
options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator; options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator;
} }
var validAudiences = configuration.GetSection("AuthServer:ValidAudiences").Get<List<string>>();
if (validAudiences?.Count > 0)
{
options.TokenValidationParameters.ValidAudiences = validAudiences;
}
}); });
if (!isDevelopment) if (!isDevelopment)

5
aspnet-core/services/LY.MicroService.IdentityServer.HttpApi.Host/IdentityServerHttpApiHostModule.Configure.cs

@ -470,6 +470,11 @@ public partial class IdentityServerHttpApiHostModule
options.TokenValidationParameters.ValidIssuers = validIssuers; options.TokenValidationParameters.ValidIssuers = validIssuers;
options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator; options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator;
} }
var validAudiences = configuration.GetSection("AuthServer:ValidAudiences").Get<List<string>>();
if (validAudiences?.Count > 0)
{
options.TokenValidationParameters.ValidAudiences = validAudiences;
}
}); });
if (!isDevelopment) if (!isDevelopment)

6
aspnet-core/services/LY.MicroService.IdentityServer/package.json

@ -1,9 +1,9 @@
{ {
"version": "9.2.0", "version": "9.2.3",
"name": "my-app-identityserver", "name": "my-app-identityserver",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@abp/aspnetcore.mvc.ui.theme.leptonxlite": "4.2.0", "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "4.2.3",
"@abp/qrcode": "~9.2.0" "@abp/qrcode": "~9.2.3"
} }
} }

1879
aspnet-core/services/LY.MicroService.IdentityServer/wwwroot/libs/jquery/jquery.js

File diff suppressed because it is too large

4
aspnet-core/services/LY.MicroService.IdentityServer/wwwroot/libs/select2/js/i18n/nb.js

@ -1 +1,3 @@
","ebx_topicSuggestionExplanationTitle":"Kay rimanata sutichay huk runakunata imayna kasqanman, runakunaman, churayninkunaman yaykunankupaq.","ebx_repeatedWordsExplanationTitle":"Kay simiqa kutipasqam","ebx_showBeta":"Beta kaypi {0}","ebx_googleDocs":"Google Docs","ebx_indicatorTooltip":"Qillqachaqta kichay utaq clicta ruway alliq ñitinapi aswan akllaykuna qawanapaq","ebx_indicatorTooltipActive":"Editorpi llanpan yacharichiyta qaway utaq clicta ruway alliq ñitinapi aswan akllaykuna qawanapaq","contextAccessibilityLabelForSpelling":"Mana allin qillqasqa, {0}, {1}","contextAccessibilityLabelForRepeatedWord":"Kutipasqa simi, {0}, {1}","contextAccessibilityLabelForGrammar":"Allin rimana pantay, {0}, {1}","contextAccessibilityLabelForRefinement":"Refinamiento rikchay, {0 /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){return"Vennligst fjern "+(e.input.length-e.maximum)+" tegn"},inputTooShort:function(e){return"Vennligst skriv inn "+(e.minimum-e.input.length)+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}();

BIN
aspnet-core/services/LY.MicroService.IdentityServer/wwwroot/libs/timeago/locales/jquery.timeago.rs.js

Binary file not shown.

BIN
aspnet-core/services/LY.MicroService.IdentityServer/wwwroot/libs/timeago/locales/jquery.timeago.sk.js

Binary file not shown.

31
aspnet-core/services/LY.MicroService.IdentityServer/wwwroot/libs/timeago/locales/jquery.timeago.th.js

@ -1 +1,30 @@
olour to ${color} on table ${tableName}",TableBodyRangeFormatSetFontColorLabel:"Set the font colour to ${color} on table ${tableName} body",TableHeaderRowRangeFormatSetFontColorLabel:"Set the font colour to ${color} on table ${tableName} header row",TableTotalRowRangeFormatSetFontColorLabel:"Set the font colour to ${color} on table ${tableName} total row",TableGeneralRangeFormatSetFontColorLabel:"Set the font colour to ${color} on sub-range of table ${tableName}",TableRowsRangeFormatSetFontColorLabel:"Set the font colour to ${color} on ${count} row(s) in table ${tableName}",TableRowByIndexRangeFormatSetFontColorLabel:"Set the font colour to ${color} on row at index ${rowIndex} in table ${tableName}",TableColumnsRangeFormatSetFontColorLabel:"Set the font colour to ${color} on ${count} column(s) in table ${tableName}",TableColumnByNameRangeFormatSetFontColorLabel:"Set the font colour to ${color} on column '${columnName}' in table ${tableName}",TableColumnByIndexRangeFormatSetFontColorLabel:"Set the font colour to ${color} (function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && typeof module.exports === 'object') {
factory(require('jquery'));
} else {
factory(jQuery);
}
}(function (jQuery) {
// Thai
jQuery.timeago.settings.strings = {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "ที่แล้ว",
suffixFromNow: "จากตอนนี้",
seconds: "น้อยกว่าหนึ่งนาที",
minute: "ประมาณหนึ่งนาที",
minutes: "%d นาที",
hour: "ประมาณหนึ่งชั่วโมง",
hours: "ประมาณ %d ชั่วโมง",
day: "หนึ่งวัน",
days: "%d วัน",
month: "ประมาณหนึ่งเดือน",
months: "%d เดือน",
year: "ประมาณหนึ่งปี",
years: "%d ปี",
wordSeparator: "",
numbers: []
};
}));

5
aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LocalizationManagementHttpApiHostModule.Configure.cs

@ -355,6 +355,11 @@ public partial class LocalizationManagementHttpApiHostModule
options.TokenValidationParameters.ValidIssuers = validIssuers; options.TokenValidationParameters.ValidIssuers = validIssuers;
options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator; options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator;
} }
var validAudiences = configuration.GetSection("AuthServer:ValidAudiences").Get<List<string>>();
if (validAudiences?.Count > 0)
{
options.TokenValidationParameters.ValidAudiences = validAudiences;
}
}); });
if (isDevelopment) if (isDevelopment)

5
aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/PlatformManagementHttpApiHostModule.Configure.cs

@ -432,6 +432,11 @@ public partial class PlatformManagementHttpApiHostModule
options.TokenValidationParameters.ValidIssuers = validIssuers; options.TokenValidationParameters.ValidIssuers = validIssuers;
options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator; options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator;
} }
var validAudiences = configuration.GetSection("AuthServer:ValidAudiences").Get<List<string>>();
if (validAudiences?.Count > 0)
{
options.TokenValidationParameters.ValidAudiences = validAudiences;
}
options.Events = new JwtBearerEvents options.Events = new JwtBearerEvents
{ {

5
aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.Configure.cs

@ -458,6 +458,11 @@ public partial class RealtimeMessageHttpApiHostModule
options.TokenValidationParameters.ValidIssuers = validIssuers; options.TokenValidationParameters.ValidIssuers = validIssuers;
options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator; options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator;
} }
var validAudiences = configuration.GetSection("AuthServer:ValidAudiences").Get<List<string>>();
if (validAudiences?.Count > 0)
{
options.TokenValidationParameters.ValidAudiences = validAudiences;
}
options.Events = new JwtBearerEvents options.Events = new JwtBearerEvents
{ {

5
aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.Configure.cs

@ -409,6 +409,11 @@ public partial class TaskManagementHttpApiHostModule
options.TokenValidationParameters.ValidIssuers = validIssuers; options.TokenValidationParameters.ValidIssuers = validIssuers;
options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator; options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator;
} }
var validAudiences = configuration.GetSection("AuthServer:ValidAudiences").Get<List<string>>();
if (validAudiences?.Count > 0)
{
options.TokenValidationParameters.ValidAudiences = validAudiences;
}
}); });
if (!isDevelopment) if (!isDevelopment)

5
aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/WebhooksManagementHttpApiHostModule.Configure.cs

@ -465,6 +465,11 @@ public partial class WebhooksManagementHttpApiHostModule
options.TokenValidationParameters.ValidIssuers = validIssuers; options.TokenValidationParameters.ValidIssuers = validIssuers;
options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator; options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator;
} }
var validAudiences = configuration.GetSection("AuthServer:ValidAudiences").Get<List<string>>();
if (validAudiences?.Count > 0)
{
options.TokenValidationParameters.ValidAudiences = validAudiences;
}
}); });
if (!isDevelopment) if (!isDevelopment)

5
aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/WechatManagementHttpApiHostModule.Configure.cs

@ -401,6 +401,11 @@ public partial class WechatManagementHttpApiHostModule
options.TokenValidationParameters.ValidIssuers = validIssuers; options.TokenValidationParameters.ValidIssuers = validIssuers;
options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator; options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator;
} }
var validAudiences = configuration.GetSection("AuthServer:ValidAudiences").Get<List<string>>();
if (validAudiences?.Count > 0)
{
options.TokenValidationParameters.ValidAudiences = validAudiences;
}
}); });
if (!isDevelopment) if (!isDevelopment)

5
aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/WorkflowManagementHttpApiHostModule.Configure.cs

@ -486,6 +486,11 @@ public partial class WorkflowManagementHttpApiHostModule
options.TokenValidationParameters.ValidIssuers = validIssuers; options.TokenValidationParameters.ValidIssuers = validIssuers;
options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator; options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator;
} }
var validAudiences = configuration.GetSection("AuthServer:ValidAudiences").Get<List<string>>();
if (validAudiences?.Count > 0)
{
options.TokenValidationParameters.ValidAudiences = validAudiences;
}
}); });
//services.AddElsaJwtBearerAuthentication(options => //services.AddElsaJwtBearerAuthentication(options =>

4
common.props

@ -1,12 +1,12 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<Version>9.2.1</Version> <Version>9.2.3</Version>
<Authors>colin</Authors> <Authors>colin</Authors>
<NoWarn>$(NoWarn);CS1591;CS0436;CS8618;NU1803</NoWarn> <NoWarn>$(NoWarn);CS1591;CS0436;CS8618;NU1803</NoWarn>
<PackageProjectUrl>https://github.com/colinin/abp-next-admin</PackageProjectUrl> <PackageProjectUrl>https://github.com/colinin/abp-next-admin</PackageProjectUrl>
<PackageOutputPath>$(SolutionDir)LocalNuget</PackageOutputPath> <PackageOutputPath>$(SolutionDir)LocalNuget</PackageOutputPath>
<PackageVersion>9.2.1</PackageVersion> <PackageVersion>9.2.3</PackageVersion>
<PackageLicenseExpression>MIT</PackageLicenseExpression> <PackageLicenseExpression>MIT</PackageLicenseExpression>
<RepositoryType>git</RepositoryType> <RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/colinin/abp-next-admin</RepositoryUrl> <RepositoryUrl>https://github.com/colinin/abp-next-admin</RepositoryUrl>

Loading…
Cancel
Save