Browse Source

Merge branch 'master' into Remove-logger-factory-configuration-from-Startup

pull/827/head
Halil İbrahim Kalkan 8 years ago
committed by GitHub
parent
commit
9143f01ea6
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 0
      .dockerignore
  2. 2
      abp_io/src/Volo.AbpWebSite.Web/AbpWebSiteWebModule.cs
  3. 28
      abp_io/src/Volo.AbpWebSite.Web/CorrelationIdLogEventEnricher.cs
  4. 2
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Threading/HttpContextCancellationTokenProvider.cs
  5. 19
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Tracing/AspNetCoreCorrelationIdProvider.cs
  6. 2
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IPermissionDefinitionContext.cs
  7. 11
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs
  8. 15
      framework/src/Volo.Abp.Caching/Volo/Abp/Caching/CacheNameAttribute.cs
  9. 10
      framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs
  10. 2
      framework/src/Volo.Abp.Threading/Volo/Abp/Threading/NullCancellationTokenProvider.cs
  11. 2
      framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/Authorization_Tests.cs
  12. 2
      framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestServices/AuthorizationTestPermissionDefinitionProvider.cs
  13. 2
      modules/docs/src/Volo.Docs.Admin.Web/DocsAdminWebAutoMapperProfile.cs
  14. 5
      modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Create.cshtml.cs
  15. 7
      modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Edit.cshtml.cs
  16. 4
      modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs
  17. 3
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs
  18. 32
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml
  19. 19
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs
  20. 3
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs
  21. 10
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs
  22. 1
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.csproj
  23. 7
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/AbpIdentityServerDomainSharedModule.cs
  24. 8
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientConsts.cs
  25. 4
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientPropertyConsts.cs
  26. 2
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientRedirectUriConsts.cs
  27. 57
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpCorsPolicyService.cs
  28. 1
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs
  29. 9
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AllowedCorsOriginsCacheItem.cs
  30. 24
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AllowedCorsOriginsCacheItemInvalidator.cs
  31. 2
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs
  32. 2
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/IClientRepository.cs
  33. 2
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceRepository.cs
  34. 3
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerBuilderExtensions.cs
  35. 5
      modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs
  36. 8
      modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/Clients/ClientRepository.cs
  37. 5
      modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceRepository.cs
  38. 26
      modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoClientRepository.cs
  39. 10
      modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/AbpIdentityServerDomainTestBase.cs
  40. 41
      modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/CorsPolicyService_Tests.cs
  41. 6
      modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.csproj
  42. 9
      modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestEntityFrameworkCoreModule.cs
  43. 7
      modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/ClientRepository_Tests.cs
  44. 6
      modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs
  45. 7
      modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/IdentityResourceRepository_Tests.cs
  46. 3
      modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo/Abp/IdentityServer/AbpIdentityServerMongoDbTestModule.cs
  47. 2
      modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs
  48. 13
      modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ClientRepository_Tests.cs
  49. 48
      modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml
  50. 3
      modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml.cs
  51. 31
      modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js

0
samples/MicroserviceDemo/.dockerignore → .dockerignore

2
abp_io/src/Volo.AbpWebSite.Web/AbpWebSiteWebModule.cs

@ -140,6 +140,8 @@ namespace Volo.AbpWebSite
var app = context.GetApplicationBuilder(); var app = context.GetApplicationBuilder();
var env = context.GetEnvironment(); var env = context.GetEnvironment();
app.UseCorrelationId();
app.UseAbpRequestLocalization(); app.UseAbpRequestLocalization();
if (env.IsDevelopment()) if (env.IsDevelopment())

28
abp_io/src/Volo.AbpWebSite.Web/CorrelationIdLogEventEnricher.cs

@ -0,0 +1,28 @@
using Serilog.Core;
using Serilog.Events;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Tracing;
namespace Volo.AbpWebSite
{
//This is for trial for now
public class CorrelationIdLogEventEnricher : ILogEventEnricher, ITransientDependency
{
private readonly ICorrelationIdProvider _correlationIdProvider;
public CorrelationIdLogEventEnricher(ICorrelationIdProvider correlationIdProvider)
{
_correlationIdProvider = correlationIdProvider;
}
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
logEvent.AddOrUpdateProperty(
new LogEventProperty(
"CorrelationId",
new ScalarValue("CorrId:" + _correlationIdProvider.Get())
)
);
}
}
}

2
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Threading/HttpContextCancellationTokenProvider.cs

@ -8,7 +8,7 @@ namespace Volo.Abp.AspNetCore.Threading
[Dependency(ReplaceServices = true)] [Dependency(ReplaceServices = true)]
public class HttpContextCancellationTokenProvider : ICancellationTokenProvider, ITransientDependency public class HttpContextCancellationTokenProvider : ICancellationTokenProvider, ITransientDependency
{ {
public CancellationToken Token => _httpContextAccessor.HttpContext?.RequestAborted ?? default; public CancellationToken Token => _httpContextAccessor.HttpContext?.RequestAborted ?? CancellationToken.None;
private readonly IHttpContextAccessor _httpContextAccessor; private readonly IHttpContextAccessor _httpContextAccessor;

19
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Tracing/AspNetCoreCorrelationIdProvider.cs

@ -27,18 +27,21 @@ namespace Volo.Abp.AspNetCore.Tracing
return CreateNewCorrelationId(); return CreateNewCorrelationId();
} }
lock (HttpContextAccessor.HttpContext.Request.Headers) string correlationId = HttpContextAccessor.HttpContext.Request.Headers[Options.HttpHeaderName];
{
string correlationId = HttpContextAccessor.HttpContext.Request.Headers[Options.HttpHeaderName];
if (correlationId.IsNullOrEmpty()) if (correlationId.IsNullOrEmpty())
{
lock (HttpContextAccessor.HttpContext.Request.Headers)
{ {
correlationId = CreateNewCorrelationId(); if (correlationId.IsNullOrEmpty())
HttpContextAccessor.HttpContext.Request.Headers[Options.HttpHeaderName] = correlationId; {
correlationId = CreateNewCorrelationId();
HttpContextAccessor.HttpContext.Request.Headers[Options.HttpHeaderName] = correlationId;
}
} }
return correlationId;
} }
return correlationId;
} }
protected virtual string CreateNewCorrelationId() protected virtual string CreateNewCorrelationId()

2
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IPermissionDefinitionContext.cs

@ -9,5 +9,7 @@ namespace Volo.Abp.Authorization.Permissions
PermissionGroupDefinition GetGroupOrNull(string name); PermissionGroupDefinition GetGroupOrNull(string name);
PermissionGroupDefinition AddGroup([NotNull] string name, ILocalizableString displayName = null); PermissionGroupDefinition AddGroup([NotNull] string name, ILocalizableString displayName = null);
void RemoveGroup(string name);
} }
} }

11
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs

@ -36,5 +36,16 @@ namespace Volo.Abp.Authorization.Permissions
return Groups[name]; return Groups[name];
} }
public virtual void RemoveGroup(string name)
{
Check.NotNull(name, nameof(name));
if (!Groups.ContainsKey(name))
{
throw new AbpException($"Not found permission group with name: {name}");
}
Groups.Remove(name);
}
} }
} }

15
framework/src/Volo.Abp.Caching/Volo/Abp/Caching/CacheNameAttribute.cs

@ -15,5 +15,20 @@ namespace Volo.Abp.Caching
Name = name; Name = name;
} }
public static string GetCacheName(Type cacheItemType)
{
var cacheNameAttribute = cacheItemType
.GetCustomAttributes(true)
.OfType<CacheNameAttribute>()
.FirstOrDefault();
if (cacheNameAttribute != null)
{
return cacheNameAttribute.Name;
}
return cacheItemType.FullName.RemovePostFix("CacheItem");
}
} }
} }

10
framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs

@ -127,7 +127,7 @@ namespace Volo.Abp.Caching
return value; return value;
} }
using (AsyncLock.Lock()) using (AsyncLock.Lock(CancellationTokenProvider.Token))
{ {
value = Get(key, hideErrors); value = Get(key, hideErrors);
if (value != null) if (value != null)
@ -326,13 +326,7 @@ namespace Volo.Abp.Caching
protected virtual void SetDefaultOptions() protected virtual void SetDefaultOptions()
{ {
//CacheName CacheName = CacheNameAttribute.GetCacheName(typeof(TCacheItem));
var cacheNameAttribute = typeof(TCacheItem)
.GetCustomAttributes(true)
.OfType<CacheNameAttribute>()
.FirstOrDefault();
CacheName = cacheNameAttribute != null ? cacheNameAttribute.Name : typeof(TCacheItem).FullName;
//IgnoreMultiTenancy //IgnoreMultiTenancy
IgnoreMultiTenancy = typeof(TCacheItem).IsDefined(typeof(IgnoreMultiTenancyAttribute), true); IgnoreMultiTenancy = typeof(TCacheItem).IsDefined(typeof(IgnoreMultiTenancyAttribute), true);

2
framework/src/Volo.Abp.Threading/Volo/Abp/Threading/NullCancellationTokenProvider.cs

@ -6,7 +6,7 @@ namespace Volo.Abp.Threading
{ {
public static NullCancellationTokenProvider Instance { get; } = new NullCancellationTokenProvider(); public static NullCancellationTokenProvider Instance { get; } = new NullCancellationTokenProvider();
public CancellationToken Token { get; } = default; public CancellationToken Token { get; } = CancellationToken.None;
private NullCancellationTokenProvider() private NullCancellationTokenProvider()
{ {

2
framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/Authorization_Tests.cs

@ -50,7 +50,7 @@ namespace Volo.Abp.Authorization
[Fact] [Fact]
public void Should_Permission_Definition_GetGroup() public void Should_Permission_Definition_GetGroup()
{ {
_permissionDefinitionManager.GetGroups().Count.ShouldBe(2); _permissionDefinitionManager.GetGroups().Count.ShouldBe(1);
} }
} }
} }

2
framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/TestServices/AuthorizationTestPermissionDefinitionProvider.cs

@ -13,6 +13,8 @@ namespace Volo.Abp.Authorization.TestServices
} }
PermissionGroupDefinition group = context.AddGroup("TestGroup"); PermissionGroupDefinition group = context.AddGroup("TestGroup");
group.AddPermission("MyAuthorizedService1"); group.AddPermission("MyAuthorizedService1");
context.RemoveGroup("TestGetGroup");
} }
} }
} }

2
modules/docs/src/Volo.Docs.Admin.Web/DocsAdminWebAutoMapperProfile.cs

@ -14,7 +14,7 @@ namespace Volo.Docs.Admin
CreateMap<EditModel.EditGithubProjectViewModel, UpdateProjectDto>().Ignore(x => x.ExtraProperties); CreateMap<EditModel.EditGithubProjectViewModel, UpdateProjectDto>().Ignore(x => x.ExtraProperties);
CreateMap<ProjectDto, EditModel.EditGithubProjectViewModel > () CreateMap<ProjectDto, EditModel.EditGithubProjectViewModel > ()
.Ignore(x => x.GitHubAccessToken).Ignore(x => x.GitHubRootUrl); .Ignore(x => x.GitHubAccessToken).Ignore(x => x.GitHubRootUrl).Ignore(x => x.GitHubUserAgent);
} }
} }
} }

5
modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Create.cshtml.cs

@ -60,6 +60,7 @@ namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects
dto.ExtraProperties = new Dictionary<string, object> dto.ExtraProperties = new Dictionary<string, object>
{ {
{nameof(GithubProject.GitHubRootUrl), GithubProject.GitHubRootUrl}, {nameof(GithubProject.GitHubRootUrl), GithubProject.GitHubRootUrl},
{nameof(GithubProject.GitHubUserAgent), GithubProject.GitHubUserAgent},
{nameof(GithubProject.GitHubAccessToken), GithubProject.GitHubAccessToken} {nameof(GithubProject.GitHubAccessToken), GithubProject.GitHubAccessToken}
}; };
@ -109,6 +110,10 @@ namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects
[DisplayOrder(10001)] [DisplayOrder(10001)]
[StringLength(512)] [StringLength(512)]
public string GitHubAccessToken { get; set; } public string GitHubAccessToken { get; set; }
[DisplayOrder(10002)]
[StringLength(64)]
public string GitHubUserAgent { get; set; }
} }
} }
} }

7
modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Edit.cshtml.cs

@ -62,6 +62,7 @@ namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects
dto.ExtraProperties = new Dictionary<string, object> dto.ExtraProperties = new Dictionary<string, object>
{ {
{nameof(GithubProject.GitHubRootUrl), GithubProject.GitHubRootUrl}, {nameof(GithubProject.GitHubRootUrl), GithubProject.GitHubRootUrl},
{nameof(GithubProject.GitHubUserAgent), GithubProject.GitHubUserAgent},
{nameof(GithubProject.GitHubAccessToken), GithubProject.GitHubAccessToken} {nameof(GithubProject.GitHubAccessToken), GithubProject.GitHubAccessToken}
}; };
@ -74,6 +75,7 @@ namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects
GithubProject.GitHubAccessToken = (string) dto.ExtraProperties[nameof(GithubProject.GitHubAccessToken)]; GithubProject.GitHubAccessToken = (string) dto.ExtraProperties[nameof(GithubProject.GitHubAccessToken)];
GithubProject.GitHubRootUrl = (string) dto.ExtraProperties[nameof(GithubProject.GitHubRootUrl)]; GithubProject.GitHubRootUrl = (string) dto.ExtraProperties[nameof(GithubProject.GitHubRootUrl)];
GithubProject.GitHubUserAgent = (string) dto.ExtraProperties[nameof(GithubProject.GitHubUserAgent)];
} }
public abstract class EditProjectViewModelBase public abstract class EditProjectViewModelBase
@ -116,6 +118,11 @@ namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects
[DisplayOrder(10001)] [DisplayOrder(10001)]
[StringLength(512)] [StringLength(512)]
public string GitHubAccessToken { get; set; } public string GitHubAccessToken { get; set; }
[DisplayOrder(10002)]
[StringLength(64)]
public string GitHubUserAgent { get; set; }
} }
} }
} }

4
modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Logging;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Caching; using Volo.Abp.Caching;
using Volo.Docs.Projects; using Volo.Docs.Projects;
@ -94,9 +95,10 @@ namespace Volo.Docs.Documents
cacheKey, cacheKey,
async () => async () =>
{ {
Logger.LogInformation($"Not found in the cache. Requesting {documentName} from the store...");
var store = _documentStoreFactory.Create(project.DocumentStoreType); var store = _documentStoreFactory.Create(project.DocumentStoreType);
var document = await store.GetDocumentAsync(project, documentName, version); var document = await store.GetDocumentAsync(project, documentName, version);
Logger.LogInformation($"Document retrieved: {documentName}");
return CreateDocumentWithDetailsDto(project, document); return CreateDocumentWithDetailsDto(project, document);
}, },
() => new DistributedCacheEntryOptions () => new DistributedCacheEntryOptions

3
modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs

@ -50,7 +50,8 @@ namespace Volo.Docs.GitHub.Documents
Format = project.Format, Format = project.Format,
LocalDirectory = localDirectory, LocalDirectory = localDirectory,
FileName = fileName, FileName = fileName,
Contributors = !isNavigationDocument ? await GetContributors(commitHistoryUrl, token, userAgent): new List<DocumentContributor>(), Contributors = new List<DocumentContributor>(),
//Contributors = !isNavigationDocument ? await GetContributors(commitHistoryUrl, token, userAgent): new List<DocumentContributor>(),
Version = version, Version = version,
Content = await DownloadWebContentAsStringAsync(rawDocumentUrl, token, userAgent) Content = await DownloadWebContentAsStringAsync(rawDocumentUrl, token, userAgent)
}; };

32
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml

@ -45,7 +45,7 @@
<nav class="navbar navbar-logo"> <nav class="navbar navbar-logo">
@if (!Model.Project.Name.IsNullOrWhiteSpace()) @if (!Model.Project.Name.IsNullOrWhiteSpace())
{ {
<a class="navbar-brand w-100" href="@Model.CreateLink(Model.LatestVersionInfo, Model.GetSpecificVersionOrLatest())"> <a class="navbar-brand w-100" href="@Model.CreateVersionLink(Model.LatestVersionInfo, Model.GetSpecificVersionOrLatest())">
<span id="ProjectName">@Model.Project.Name</span><br> <span id="ProjectName">@Model.Project.Name</span><br>
<strong class="display-block"> <strong class="display-block">
@L["Documents"] @L["Documents"]
@ -72,12 +72,21 @@
</div> </div>
<div class="docs-tree-list"> <div class="docs-tree-list">
<div class="docs-filter">
<input class="form-control" type="search" placeholder="Filter topics" aria-label="Filter"> @if (Model.ProjectSelectItems.Any())
<span class="my-2 filter-icon my-sm-0"> {
<i class="fa fa-filter"></i> <div class="docs-version">
</span> <div class="version-select">
</div> <div class="input-group">
<div class="input-group-prepend">
<label class="input-group-text">@L["Project"]</label>
</div>
<select asp-items="Model.ProjectSelectItems" class="form-control" onchange="window.location.replace(this.value)"></select>
</div>
</div>
</div>
}
@if (Model.VersionSelectItems.Any()) @if (Model.VersionSelectItems.Any())
{ {
@ -88,12 +97,19 @@
<label class="input-group-text">@L["Version"]</label> <label class="input-group-text">@L["Version"]</label>
</div> </div>
<select asp-items="Model.VersionSelectItems" class="form-control" onchange="window.location.replace(this.value)"></select> <select asp-items="Model.VersionSelectItems" class="form-control" onchange="if (this.value) { window.location.replace(this.value) }"></select>
</div> </div>
</div> </div>
</div> </div>
} }
<div class="docs-filter">
<input class="form-control" type="search" placeholder="Filter topics" aria-label="Filter">
<span class="my-2 filter-icon my-sm-0">
<i class="fa fa-filter"></i>
</span>
</div>
@if (Model.Navigation == null || Model.Navigation.Content.IsNullOrEmpty()) @if (Model.Navigation == null || Model.Navigation.Content.IsNullOrEmpty())
{ {
<div class="text-muted p-3"> <div class="text-muted p-3">

19
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs

@ -31,6 +31,8 @@ namespace Volo.Docs.Pages.Documents.Project
public List<SelectListItem> VersionSelectItems { get; private set; } public List<SelectListItem> VersionSelectItems { get; private set; }
public List<SelectListItem> ProjectSelectItems { get; private set; }
public NavigationWithDetailsDto Navigation { get; private set; } public NavigationWithDetailsDto Navigation { get; private set; }
public VersionInfoViewModel LatestVersionInfo { get; private set; } public VersionInfoViewModel LatestVersionInfo { get; private set; }
@ -52,6 +54,7 @@ namespace Volo.Docs.Pages.Documents.Project
public async Task OnGetAsync() public async Task OnGetAsync()
{ {
await SetProjectAsync(); await SetProjectAsync();
await SetProjectsAsync();
await SetVersionAsync(); await SetVersionAsync();
await SetDocumentAsync(); await SetDocumentAsync();
await SetNavigationAsync(); await SetNavigationAsync();
@ -62,6 +65,18 @@ namespace Volo.Docs.Pages.Documents.Project
Project = await _projectAppService.GetAsync(ProjectName); Project = await _projectAppService.GetAsync(ProjectName);
} }
private async Task SetProjectsAsync()
{
var projects = await _projectAppService.GetListAsync();
ProjectSelectItems = projects.Items.Select(p => new SelectListItem
{
Text = p.Name,
Value = p.Id != Project.Id ? "/documents/" + p.ShortName + "/" + DocsAppConsts.Latest : null,
Selected = p.Id == Project.Id
}).ToList();
}
private async Task SetVersionAsync() private async Task SetVersionAsync()
{ {
//TODO: Needs refactoring //TODO: Needs refactoring
@ -101,7 +116,7 @@ namespace Volo.Docs.Pages.Documents.Project
VersionSelectItems = versions.Select(v => new SelectListItem VersionSelectItems = versions.Select(v => new SelectListItem
{ {
Text = v.DisplayText, Text = v.DisplayText,
Value = CreateLink(LatestVersionInfo, v.Version, DocumentName), Value = CreateVersionLink(LatestVersionInfo, v.Version, DocumentName),
Selected = v.IsSelected Selected = v.IsSelected
}).ToList(); }).ToList();
} }
@ -128,7 +143,7 @@ namespace Volo.Docs.Pages.Documents.Project
Navigation.ConvertItems(); Navigation.ConvertItems();
} }
public string CreateLink(VersionInfoViewModel latestVersion, string version, string documentName = null) public string CreateVersionLink(VersionInfoViewModel latestVersion, string version, string documentName = null)
{ {
if (latestVersion == null || latestVersion.Version == version) if (latestVersion == null || latestVersion.Version == version)
{ {

3
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/AbpIdentityDomainSharedModule.cs

@ -1,5 +1,4 @@
using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Identity.Localization;
using Volo.Abp.Identity.Localization;
using Volo.Abp.Localization; using Volo.Abp.Localization;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Users; using Volo.Abp.Users;

10
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs

@ -7,15 +7,19 @@ using Volo.Abp.EventBus.Distributed;
using Volo.Abp.Identity.Localization; using Volo.Abp.Identity.Localization;
using Volo.Abp.Localization; using Volo.Abp.Localization;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.SettingManagement;
using Volo.Abp.Settings; using Volo.Abp.Settings;
using Volo.Abp.Users; using Volo.Abp.Users;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.Identity namespace Volo.Abp.Identity
{ {
[DependsOn(typeof(AbpDddDomainModule))] [DependsOn(
[DependsOn(typeof(AbpIdentityDomainSharedModule))] typeof(AbpDddDomainModule),
[DependsOn(typeof(AbpUsersDomainModule))] typeof(AbpIdentityDomainSharedModule),
typeof(AbpUsersDomainModule),
typeof(AbpSettingManagementDomainModule)
)]
public class AbpIdentityDomainModule : AbpModule public class AbpIdentityDomainModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)

1
modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo.Abp.IdentityServer.Domain.Shared.csproj

@ -14,7 +14,6 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Core\Volo.Abp.Core.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Localization\Volo.Abp.Localization.csproj" /> <ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Localization\Volo.Abp.Localization.csproj" />
</ItemGroup> </ItemGroup>

7
modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/AbpIdentityServerDomainSharedModule.cs

@ -1,13 +1,14 @@
using Microsoft.Extensions.DependencyInjection; using Volo.Abp.IdentityServer.Localization;
using Volo.Abp.IdentityServer.Localization;
using Volo.Abp.Localization; using Volo.Abp.Localization;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace Volo.Abp.IdentityServer namespace Volo.Abp.IdentityServer
{ {
[DependsOn(
typeof(AbpLocalizationModule)
)]
public class AbpIdentityServerDomainSharedModule : AbpModule public class AbpIdentityServerDomainSharedModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
Configure<AbpLocalizationOptions>(options => Configure<AbpLocalizationOptions>(options =>

8
modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientConsts.cs

@ -8,15 +8,15 @@
public const int ClientNameMaxLength = 200; public const int ClientNameMaxLength = 200;
public const int ClientUriMaxLength = 2000; public const int ClientUriMaxLength = 300;
public const int LogoUriMaxLength = 2000; public const int LogoUriMaxLength = 300;
public const int DescriptionMaxLength = 1000; public const int DescriptionMaxLength = 1000;
public const int FrontChannelLogoutUriMaxLength = 2000; public const int FrontChannelLogoutUriMaxLength = 300;
public const int BackChannelLogoutUriMaxLength = 2000; public const int BackChannelLogoutUriMaxLength = 300;
public const int ClientClaimsPrefixMaxLength = 200; public const int ClientClaimsPrefixMaxLength = 200;

4
modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientPropertyConsts.cs

@ -2,7 +2,7 @@
{ {
public class ClientPropertyConsts public class ClientPropertyConsts
{ {
public const int KeyMaxLength = 250; public const int KeyMaxLength = 64;
public const int ValueMaxLength = 2000; public const int ValueMaxLength = 128;
} }
} }

2
modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Clients/ClientRedirectUriConsts.cs

@ -2,6 +2,6 @@
{ {
public class ClientRedirectUriConsts public class ClientRedirectUriConsts
{ {
public const int RedirectUriMaxLength = 2000; public const int RedirectUriMaxLength = 200;
} }
} }

57
modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpCorsPolicyService.cs

@ -0,0 +1,57 @@
using IdentityServer4.Services;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using System;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
using Volo.Abp.IdentityServer.Clients;
namespace Volo.Abp.IdentityServer
{
public class AbpCorsPolicyService : ICorsPolicyService
{
public ILogger<AbpCorsPolicyService> Logger { get; set; }
protected IHybridServiceScopeFactory HybridServiceScopeFactory { get; }
protected IDistributedCache<AllowedCorsOriginsCacheItem> Cache { get; }
public AbpCorsPolicyService(
IDistributedCache<AllowedCorsOriginsCacheItem> cache,
IHybridServiceScopeFactory hybridServiceScopeFactory)
{
Cache = cache;
HybridServiceScopeFactory = hybridServiceScopeFactory;
Logger = NullLogger<AbpCorsPolicyService>.Instance;
}
public async Task<bool> IsOriginAllowedAsync(string origin)
{
var cacheItem = await Cache.GetOrAddAsync(AllowedCorsOriginsCacheItem.AllOrigins, CreateCacheItemAsync);
var isAllowed = cacheItem.AllowedOrigins.Contains(origin, StringComparer.OrdinalIgnoreCase);
if (!isAllowed)
{
Logger.LogWarning($"Origin is not allowed: {origin}");
}
return isAllowed;
}
protected virtual async Task<AllowedCorsOriginsCacheItem> CreateCacheItemAsync()
{
// doing this here and not in the ctor because: https://github.com/aspnet/AspNetCore/issues/2377
using (var scope = HybridServiceScopeFactory.CreateScope())
{
var clientRepository = scope.ServiceProvider.GetRequiredService<IClientRepository>();
return new AllowedCorsOriginsCacheItem
{
AllowedOrigins = (await clientRepository.GetAllDistinctAllowedCorsOriginsAsync()).ToArray()
};
}
}
}
}

1
modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs

@ -12,7 +12,6 @@ namespace Volo.Abp.IdentityServer
{ {
[DependsOn( [DependsOn(
typeof(AbpIdentityServerDomainSharedModule), typeof(AbpIdentityServerDomainSharedModule),
typeof(AbpDddDomainModule),
typeof(AbpAutoMapperModule), typeof(AbpAutoMapperModule),
typeof(AbpIdentityDomainModule), typeof(AbpIdentityDomainModule),
typeof(AbpSecurityModule) typeof(AbpSecurityModule)

9
modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AllowedCorsOriginsCacheItem.cs

@ -0,0 +1,9 @@
namespace Volo.Abp.IdentityServer
{
public class AllowedCorsOriginsCacheItem
{
public const string AllOrigins = "AllOrigins";
public string[] AllowedOrigins { get; set; }
}
}

24
modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AllowedCorsOriginsCacheItemInvalidator.cs

@ -0,0 +1,24 @@
using System.Threading.Tasks;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities.Events;
using Volo.Abp.EventBus;
using Volo.Abp.IdentityServer.Clients;
namespace Volo.Abp.IdentityServer
{
public class AllowedCorsOriginsCacheItemInvalidator : ILocalEventHandler<EntityChangedEventData<Client>>, ITransientDependency
{
protected IDistributedCache<AllowedCorsOriginsCacheItem> Cache { get; }
public AllowedCorsOriginsCacheItemInvalidator(IDistributedCache<AllowedCorsOriginsCacheItem> cache)
{
Cache = cache;
}
public async Task HandleEventAsync(EntityChangedEventData<Client> eventData)
{
await Cache.RemoveAsync(AllowedCorsOriginsCacheItem.AllOrigins);
}
}
}

2
modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiResources/IApiResourceRepository.cs

@ -32,7 +32,5 @@ namespace Volo.Abp.IdentityServer.ApiResources
bool includeDetails = false, bool includeDetails = false,
CancellationToken cancellationToken = default CancellationToken cancellationToken = default
); );
Task<long> GetTotalCount();
} }
} }

2
modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Clients/IClientRepository.cs

@ -23,6 +23,6 @@ namespace Volo.Abp.IdentityServer.Clients
CancellationToken cancellationToken = default CancellationToken cancellationToken = default
); );
Task<long> GetTotalCount(); Task<List<string>> GetAllDistinctAllowedCorsOriginsAsync(CancellationToken cancellationToken = default);
} }
} }

2
modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityResources/IIdentityResourceRepository.cs

@ -27,7 +27,5 @@ namespace Volo.Abp.IdentityServer.IdentityResources
bool includeDetails = true, bool includeDetails = true,
CancellationToken cancellationToken = default CancellationToken cancellationToken = default
); );
Task<long> GetTotalCountAsync();
} }
} }

3
modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/IdentityServerBuilderExtensions.cs

@ -13,7 +13,8 @@ namespace Volo.Abp.IdentityServer
return builder return builder
.AddClientStore<ClientStore>() .AddClientStore<ClientStore>()
.AddResourceStore<ResourceStore>(); .AddResourceStore<ResourceStore>()
.AddCorsPolicyService<AbpCorsPolicyService>();
} }
} }
} }

5
modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/ApiResources/ApiResourceRepository.cs

@ -61,11 +61,6 @@ namespace Volo.Abp.IdentityServer.ApiResources
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
} }
public virtual async Task<long> GetTotalCount()
{
return await DbSet.CountAsync();
}
public override async Task DeleteAsync(Guid id, bool autoSave = false, CancellationToken cancellationToken = default) public override async Task DeleteAsync(Guid id, bool autoSave = false, CancellationToken cancellationToken = default)
{ {
var scopeClaims = DbContext.Set<ApiScopeClaim>().Where(sc => sc.ApiResourceId == id); var scopeClaims = DbContext.Set<ApiScopeClaim>().Where(sc => sc.ApiResourceId == id);

8
modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/Clients/ClientRepository.cs

@ -37,9 +37,13 @@ namespace Volo.Abp.IdentityServer.Clients
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
} }
public virtual async Task<long> GetTotalCount() public async Task<List<string>> GetAllDistinctAllowedCorsOriginsAsync(CancellationToken cancellationToken = default)
{ {
return await DbSet.CountAsync(); return await DbSet
.AsNoTracking()
.SelectMany(x => x.AllowedCorsOrigins.Select(y => y.Origin))
.Distinct()
.ToListAsync(GetCancellationToken(cancellationToken));
} }
public override IQueryable<Client> WithDetails() public override IQueryable<Client> WithDetails()

5
modules/identityserver/src/Volo.Abp.IdentityServer.EntityFrameworkCore/Volo/Abp/IdentityServer/IdentityResources/IdentityResourceRepository.cs

@ -56,10 +56,5 @@ namespace Volo.Abp.IdentityServer.IdentityResources
.Where(x => x.Name == name) .Where(x => x.Name == name)
.FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); .FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
} }
public virtual async Task<long> GetTotalCountAsync()
{
return await DbSet.CountAsync();
}
} }
} }

26
modules/identityserver/src/Volo.Abp.IdentityServer.MongoDB/Volo/Abp/IdentityServer/MongoDB/MongoClientRepository.cs

@ -14,16 +14,26 @@ namespace Volo.Abp.IdentityServer.MongoDB
{ {
public class MongoClientRepository : MongoDbRepository<IAbpIdentityServerMongoDbContext, Client, Guid>, IClientRepository public class MongoClientRepository : MongoDbRepository<IAbpIdentityServerMongoDbContext, Client, Guid>, IClientRepository
{ {
public MongoClientRepository(IMongoDbContextProvider<IAbpIdentityServerMongoDbContext> dbContextProvider) : base(dbContextProvider) public MongoClientRepository(
IMongoDbContextProvider<IAbpIdentityServerMongoDbContext> dbContextProvider
) : base(
dbContextProvider)
{ {
} }
public virtual async Task<Client> FindByCliendIdAsync(string clientId, bool includeDetails = true, CancellationToken cancellationToken = default) public virtual async Task<Client> FindByCliendIdAsync(
string clientId,
bool includeDetails = true,
CancellationToken cancellationToken = default)
{ {
return await GetMongoQueryable().FirstOrDefaultAsync(x => x.ClientId == clientId, GetCancellationToken(cancellationToken)); return await GetMongoQueryable().FirstOrDefaultAsync(x => x.ClientId == clientId, GetCancellationToken(cancellationToken));
} }
public virtual async Task<List<Client>> GetListAsync(string sorting, int skipCount, int maxResultCount, bool includeDetails = false, public virtual async Task<List<Client>> GetListAsync(
string sorting,
int skipCount,
int maxResultCount,
bool includeDetails = false,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
return await GetMongoQueryable() return await GetMongoQueryable()
@ -33,6 +43,16 @@ namespace Volo.Abp.IdentityServer.MongoDB
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
} }
public async Task<List<string>> GetAllDistinctAllowedCorsOriginsAsync(
CancellationToken cancellationToken = default)
{
return await GetMongoQueryable()
.SelectMany(x => x.AllowedCorsOrigins)
.Select(y => y.Origin)
.Distinct()
.ToListAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<long> GetTotalCount() public virtual async Task<long> GetTotalCount()
{ {
return await GetCountAsync(); return await GetCountAsync();

10
modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/AbpIdentityServerDomainTestBase.cs

@ -0,0 +1,10 @@
namespace Volo.Abp.IdentityServer
{
public class AbpIdentityServerDomainTestBase : AbpIntegratedTest<AbpIdentityServerDomainTestModule>
{
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options)
{
options.UseAutofac();
}
}
}

41
modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/CorsPolicyService_Tests.cs

@ -0,0 +1,41 @@
using System.Threading.Tasks;
using IdentityServer4.Services;
using Shouldly;
using Volo.Abp.IdentityServer.Clients;
using Xunit;
namespace Volo.Abp.IdentityServer
{
public class CorsPolicyService_Tests : AbpIdentityServerDomainTestBase
{
private readonly ICorsPolicyService _corsPolicyService;
private readonly IClientRepository _clientRepository;
public CorsPolicyService_Tests()
{
_corsPolicyService = GetRequiredService<ICorsPolicyService>();
_clientRepository = GetRequiredService<IClientRepository>();
}
[Fact]
public async Task IsOriginAllowedAsync()
{
(await _corsPolicyService.IsOriginAllowedAsync("https://client1-origin.com")).ShouldBeTrue();
(await _corsPolicyService.IsOriginAllowedAsync("https://unknown-origin.com")).ShouldBeFalse();
}
[Fact]
public async Task IsOriginAllowedAsync_Should_Invalidate_Cache_On_Update()
{
//It does not exists before
(await _corsPolicyService.IsOriginAllowedAsync("https://new-origin.com")).ShouldBeFalse();
var client1 = await _clientRepository.FindByCliendIdAsync("ClientId1");
client1.AddCorsOrigin("https://new-origin.com");
await _clientRepository.UpdateAsync(client1);
//It does exists now
(await _corsPolicyService.IsOriginAllowedAsync("https://new-origin.com")).ShouldBeTrue();
}
}
}

6
modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework> <TargetFramework>netcoreapp2.2</TargetFramework>
<AssemblyName>Volo.Abp.IdentityServer.EntityFrameworkCore.Tests</AssemblyName> <AssemblyName>Volo.Abp.IdentityServer.EntityFrameworkCore.Tests</AssemblyName>
<PackageId>Volo.Abp.IdentityServer.EntityFrameworkCore.Tests</PackageId> <PackageId>Volo.Abp.IdentityServer.EntityFrameworkCore.Tests</PackageId>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
@ -15,9 +15,7 @@
<ProjectReference Include="..\..\src\Volo.Abp.IdentityServer.EntityFrameworkCore\Volo.Abp.IdentityServer.EntityFrameworkCore.csproj" /> <ProjectReference Include="..\..\src\Volo.Abp.IdentityServer.EntityFrameworkCore\Volo.Abp.IdentityServer.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.Identity.EntityFrameworkCore\Volo.Abp.Identity.EntityFrameworkCore.csproj" /> <ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.Identity.EntityFrameworkCore\Volo.Abp.Identity.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\Volo.Abp.IdentityServer.TestBase\Volo.Abp.IdentityServer.TestBase.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.TestBase\Volo.Abp.TestBase.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

9
modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/AbpIdentityServerTestEntityFrameworkCoreModule.cs

@ -10,9 +10,12 @@ using Volo.Abp.Uow;
namespace Volo.Abp.IdentityServer namespace Volo.Abp.IdentityServer
{ {
[DependsOn(typeof(AbpAutofacModule))] [DependsOn(
[DependsOn(typeof(AbpIdentityServerEntityFrameworkCoreModule))] typeof(AbpAutofacModule),
[DependsOn(typeof(AbpIdentityEntityFrameworkCoreModule))] typeof(AbpIdentityEntityFrameworkCoreModule),
typeof(AbpIdentityServerEntityFrameworkCoreModule),
typeof(AbpIdentityServerTestBaseModule)
)]
public class AbpIdentityServerTestEntityFrameworkCoreModule : AbpModule public class AbpIdentityServerTestEntityFrameworkCoreModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)

7
modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/ClientRepository_Tests.cs

@ -0,0 +1,7 @@
namespace Volo.Abp.IdentityServer
{
public class ClientRepository_Tests : ClientRepository_Tests<AbpIdentityServerTestEntityFrameworkCoreModule>
{
}
}

6
modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs

@ -81,10 +81,8 @@ namespace Volo.Abp.IdentityServer.Clients
//Assert //Assert
resources.ShouldNotBe(null); resources.ShouldNotBe(null);
resources.ApiResources.Count.ShouldBe(1); resources.ApiResources.Count.ShouldBeGreaterThan(0);
resources.ApiResources.First().Name.ShouldBe("Test-ApiResource-Name-1"); resources.ApiResources.Any(r => r.Name == "Test-ApiResource-Name-1").ShouldBeTrue();
resources.IdentityResources.First().Name.ShouldBe("Test-Identity-Resource-Name-1");
resources.IdentityResources.First().Required.ShouldBe(true);
} }
} }
} }

7
modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/IdentityResourceRepository_Tests.cs

@ -0,0 +1,7 @@
namespace Volo.Abp.IdentityServer
{
public class IdentityResourceRepository_Tests : IdentityResourceRepository_Tests<AbpIdentityServerTestEntityFrameworkCoreModule>
{
}
}

3
modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo/Abp/IdentityServer/AbpIdentityServerMongoDbTestModule.cs

@ -1,5 +1,4 @@
using Microsoft.Extensions.DependencyInjection; using Mongo2Go;
using Mongo2Go;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.IdentityServer.MongoDB; using Volo.Abp.IdentityServer.MongoDB;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;

2
modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs

@ -90,7 +90,7 @@ namespace Volo.Abp.IdentityServer
FrontChannelLogoutUri = nameof(Client.FrontChannelLogoutUri) FrontChannelLogoutUri = nameof(Client.FrontChannelLogoutUri)
}; };
client.AddCorsOrigin(nameof(ClientCorsOrigin.Origin)); client.AddCorsOrigin("https://client1-origin.com");
client.AddClaim(nameof(ClientClaim.Value), nameof(ClientClaim.Type)); client.AddClaim(nameof(ClientClaim.Value), nameof(ClientClaim.Type));
client.AddGrantType(nameof(ClientGrantType.GrantType)); client.AddGrantType(nameof(ClientGrantType.GrantType));
client.AddIdentityProviderRestriction(nameof(ClientIdPRestriction.Provider)); client.AddIdentityProviderRestriction(nameof(ClientIdPRestriction.Provider));

13
modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/ClientRepository_Tests.cs

@ -1,6 +1,4 @@
using System; using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Shouldly; using Shouldly;
@ -15,7 +13,7 @@ namespace Volo.Abp.IdentityServer
{ {
protected IClientRepository clientRepository { get; } protected IClientRepository clientRepository { get; }
public ClientRepository_Tests() protected ClientRepository_Tests()
{ {
clientRepository = ServiceProvider.GetRequiredService<IClientRepository>(); clientRepository = ServiceProvider.GetRequiredService<IClientRepository>();
} }
@ -25,5 +23,12 @@ namespace Volo.Abp.IdentityServer
{ {
(await clientRepository.FindByCliendIdAsync("ClientId2")).ShouldNotBeNull(); (await clientRepository.FindByCliendIdAsync("ClientId2")).ShouldNotBeNull();
} }
[Fact]
public async Task GetAllDistinctAllowedCorsOriginsAsync()
{
var origins = await clientRepository.GetAllDistinctAllowedCorsOriginsAsync();
origins.Any().ShouldBeTrue();
}
} }
} }

48
modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml

@ -12,52 +12,28 @@
<abp-modal size="Large"> <abp-modal size="Large">
<abp-modal-header title="@(L["Permissions"].Value) - @Model.EntityDisplayName"></abp-modal-header> <abp-modal-header title="@(L["Permissions"].Value) - @Model.EntityDisplayName">
</abp-modal-header>
<abp-modal-body> <abp-modal-body>
<input asp-for="@Model.ProviderKey" /> <input asp-for="@Model.ProviderKey" />
<input asp-for="@Model.ProviderName" /> <input asp-for="@Model.ProviderName" />
<abp-row h-align="End">
<div class="btn-group btn-group-toggle" data-toggle="buttons">
<label class="btn btn-light btn-sm @(Model.ShowOnlyProviderPermissons? "":"active")">
<input type="radio" value="0" name="ShowOnlyProviderPermissonsToggle" autocomplete="off"
@(Model.ShowOnlyProviderPermissons ? "" : "checked") /> @L["All"]
</label>
<label id="ShowOnlyProviderPermissonsLabel" class="btn btn-light btn-sm @(!Model.ShowOnlyProviderPermissons? "":"active")">
<input type="radio" value="1" name="ShowOnlyProviderPermissonsToggle" id="ShowOnlyProviderPermissonsInput" autocomplete="off"
@(!Model.ShowOnlyProviderPermissons ? "" : "checked") /> @L["OnlyProviderPermissons"]
</label>
</div>
</abp-row>
<abp-tabs tab-style="PillVertical" vertical-header-size="_4"> <abp-tabs tab-style="PillVertical" vertical-header-size="_4">
@for (var i = 0; i < Model.Groups.Count; i++) @for (var i = 0; i < Model.Groups.Count; i++)
{ {
var hideTabOnProviderToggle = true; <abp-tab title="@Model.Groups[i].DisplayName" name="v-pills-tab-@Model.Groups[i].GetNormalizedGroupName()">
@for (var j = 0; j < Model.Groups[i].Permissions.Count; j++) <h2>@Model.Groups[i].DisplayName</h2>
{
if (!(!Model.Groups[i].Permissions[j].AllowedProviders?.Any() ?? true))
{
hideTabOnProviderToggle = false;
break;
}
}
<abp-tab header-class="@(hideTabOnProviderToggle?"hideTabOnProviderToggle":"")" title="@Model.Groups[i].DisplayName" name="v-pills-tab-@Model.Groups[i].GetNormalizedGroupName()">
@for (var j = 0; j < Model.Groups[i].Permissions.Count; j++) @for (var j = 0; j < Model.Groups[i].Permissions.Count; j++)
{ {
var hidePermissonOnProviderToggle = !Model.Groups[i].Permissions[j].AllowedProviders?.Any() ?? true; <abp-input asp-for="@Model.Groups[i].Permissions[j].IsGranted"
<div class="@(hidePermissonOnProviderToggle?"hidePermissonOnProviderToggle":"")"> label="@Model.Groups[i].Permissions[j].GetShownName(Model.ProviderName)"
<abp-input asp-for="@Model.Groups[i].Permissions[j].IsGranted" disabled="@Model.Groups[i].Permissions[j].IsDisabled(Model.ProviderName)"
label="@Model.Groups[i].Permissions[j].GetShownName(Model.ProviderName)" group-data-permission-name="@Model.Groups[i].Permissions[j].Name"
disabled="@Model.Groups[i].Permissions[j].IsDisabled(Model.ProviderName)" group-data-parent-name="@(Model.Groups[i].Permissions[j].ParentName ?? "")"
group-data-permission-name="@Model.Groups[i].Permissions[j].Name" group-style="margin-left: @(Model.Groups[i].Permissions[j].Depth * 20)px" />
group-data-parent-name="@(Model.Groups[i].Permissions[j].ParentName ?? "")" <input asp-for="@Model.Groups[i].Permissions[j].Name" />
group-style="margin-left: @(Model.Groups[i].Permissions[j].Depth * 20)px" />
<input asp-for="@Model.Groups[i].Permissions[j].Name" />
</div>
} }
</abp-tab> </abp-tab>
} }

3
modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml.cs

@ -20,9 +20,6 @@ namespace Volo.Abp.PermissionManagement.Web.Pages.AbpPermissionManagement
[BindProperty(SupportsGet = true)] [BindProperty(SupportsGet = true)]
public string ProviderKey { get; set; } public string ProviderKey { get; set; }
[BindProperty(SupportsGet = true)]
public bool ShowOnlyProviderPermissons { get; set; } = false;
[BindProperty] [BindProperty]
public List<PermissionGroupViewModel> Groups { get; set; } public List<PermissionGroupViewModel> Groups { get; set; }

31
modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js

@ -4,12 +4,12 @@
abp.modals.PermissionManagement = function () { abp.modals.PermissionManagement = function () {
function checkParents($tab, $checkBox) { function checkParents($tab, $checkBox) {
var parentName = $checkBox.closest('.form-check').attr('data-parent-name'); var parentName = $checkBox.closest('.custom-checkbox').attr('data-parent-name');
if (!parentName) { if (!parentName) {
return; return;
} }
$tab.find('.form-check') $tab.find('.custom-checkbox')
.filter('[data-permission-name="' + parentName + '"]') .filter('[data-permission-name="' + parentName + '"]')
.find('input[type="checkbox"]') .find('input[type="checkbox"]')
.each(function() { .each(function() {
@ -20,12 +20,12 @@
} }
function uncheckChildren($tab, $checkBox) { function uncheckChildren($tab, $checkBox) {
var permissionName = $checkBox.closest('.form-check').attr('data-permission-name'); var permissionName = $checkBox.closest('.custom-checkbox').attr('data-permission-name');
if (!permissionName) { if (!permissionName) {
return; return;
} }
$tab.find('.form-check') $tab.find('.custom-checkbox')
.filter('[data-parent-name="' + permissionName + '"]') .filter('[data-parent-name="' + permissionName + '"]')
.find('input[type="checkbox"]') .find('input[type="checkbox"]')
.each(function () { .each(function () {
@ -35,17 +35,6 @@
}); });
} }
function togglePermissions(radioButton) {
if (radioButton.val() == '1') {
$('.hidePermissonOnProviderToggle').slideUp();
$('.hideTabOnProviderToggle').slideUp();
}
else {
$('.hidePermissonOnProviderToggle').slideDown();
$('.hideTabOnProviderToggle').slideDown();
}
}
this.initDom = function($el) { this.initDom = function($el) {
$el.find('.tab-pane').each(function () { $el.find('.tab-pane').each(function () {
var $tab = $(this); var $tab = $(this);
@ -60,18 +49,6 @@
}); });
}); });
}); });
var radioButton = $('input:radio[name="ShowOnlyProviderPermissonsToggle"]');
if ($('#ShowOnlyProviderPermissonsLabel').hasClass('active')) {
$('.hidePermissonOnProviderToggle').slideUp();
$('.hideTabOnProviderToggle').slideUp();
}
radioButton.change(
function () {
togglePermissions($(this));
});
}; };
}; };
})(jQuery); })(jQuery);
Loading…
Cancel
Save