Browse Source

Merge branch 'dev' of https://github.com/volosoft/abp into dev

pull/6532/head
Yunus Emre Kalkan 6 years ago
parent
commit
0d9924bd38
  1. 2
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/Branding.razor
  2. 19
      framework/src/Volo.Abp.Authorization/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions.cs
  3. 7
      framework/src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj
  4. 15
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationErrorCodes.cs
  5. 22
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs
  6. 10
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/AbpAuthorizationResource.cs
  7. 10
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/en.json
  8. 10
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/tr.json
  9. 10
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/zh-Hans.json
  10. 9
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs
  11. 5
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ITemplateInfoProvider.cs
  12. 68
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs
  13. 6
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateProjectBuilder.cs
  14. 6
      framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/AspNetCore/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs
  15. 7
      framework/src/Volo.Abp.Features/Volo.Abp.Features.csproj
  16. 11
      framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeatureErrorCodes.cs
  17. 22
      framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs
  18. 23
      framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerExtensions.cs
  19. 10
      framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/AbpFeatureResource.cs
  20. 8
      framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/en.json
  21. 8
      framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/tr.json
  22. 8
      framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/zh-Hans.json
  23. 29
      framework/src/Volo.Abp.Security/Volo/Abp/Authorization/AbpAuthorizationException.cs
  24. 49
      framework/test/Volo.Abp.Authorization.Tests/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions_Tests.cs
  25. 1
      framework/test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.csproj
  26. 4
      framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs
  27. 1
      framework/test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj
  28. 4
      framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestModule.cs
  29. 40
      framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureCheckerExtensions_Tests.cs
  30. 4
      modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityWebMainMenuContributor.cs
  31. 2
      modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Menus/SettingManagementMenuContributor.cs
  32. 2
      modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Navigation/TenantManagementBlazorMenuContributor.cs
  33. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs

2
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/Branding.razor

@ -1,3 +1,3 @@
@using Volo.Abp.Ui.Branding
@inject IBrandingProvider BrandingProvider
<a class="navbar-brand" href="/">@BrandingProvider.AppName</a>
<a class="navbar-brand" href="">@BrandingProvider.AppName</a>

19
framework/src/Volo.Abp.Authorization/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions.cs

@ -95,7 +95,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(policyName))
{
throw new AbpAuthorizationException("Authorization failed! Given policy has not granted: " + policyName);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedWithPolicyName)
.WithData("PolicyName", policyName);
}
}
@ -103,7 +104,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(resource, requirement))
{
throw new AbpAuthorizationException("Authorization failed! Given requirement has not granted for given resource: " + resource);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementHasNotGrantedForGivenResource)
.WithData("PolicyName", resource);
}
}
@ -111,7 +113,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(resource, policy))
{
throw new AbpAuthorizationException("Authorization failed! Given policy has not granted for given resource: " + resource);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedForGivenResource)
.WithData("ResourceName", resource);
}
}
@ -119,7 +122,7 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(policy))
{
throw new AbpAuthorizationException("Authorization failed! Given policy has not granted.");
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGranted);
}
}
@ -127,7 +130,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(resource, requirements))
{
throw new AbpAuthorizationException("Authorization failed! Given requirements have not granted for given resource: " + resource);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementsHasNotGrantedForGivenResource)
.WithData("ResourceName", resource);
}
}
@ -135,7 +139,8 @@ namespace Microsoft.AspNetCore.Authorization
{
if (!await authorizationService.IsGrantedAsync(resource, policyName))
{
throw new AbpAuthorizationException("Authorization failed! Given polist has not granted for given resource: " + resource);
throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedForGivenResource)
.WithData("ResourceName", resource);
}
}
@ -149,4 +154,4 @@ namespace Microsoft.AspNetCore.Authorization
return abpAuthorizationService;
}
}
}
}

7
framework/src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj

@ -19,7 +19,12 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Localization.Abstractions\Volo.Abp.Localization.Abstractions.csproj" />
<None Remove="Volo\Abp\Authorization\Localization\*.json" />
<EmbeddedResource Include="Volo\Abp\Authorization\Localization\*.json" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Localization\Volo.Abp.Localization.csproj" />
<ProjectReference Include="..\Volo.Abp.MultiTenancy\Volo.Abp.MultiTenancy.csproj" />
<ProjectReference Include="..\Volo.Abp.Security\Volo.Abp.Security.csproj" />
</ItemGroup>

15
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationErrorCodes.cs

@ -0,0 +1,15 @@
namespace Volo.Abp.Authorization
{
public static class AbpAuthorizationErrorCodes
{
public const string GivenPolicyHasNotGranted = "Volo.Authorization:010001";
public const string GivenPolicyHasNotGrantedWithPolicyName = "Volo.Authorization:010002";
public const string GivenPolicyHasNotGrantedForGivenResource = "Volo.Authorization:010003";
public const string GivenRequirementHasNotGrantedForGivenResource = "Volo.Authorization:010004";
public const string GivenRequirementsHasNotGrantedForGivenResource = "Volo.Authorization:010005";
}
}

22
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs

@ -3,17 +3,20 @@ using System.Collections.Generic;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.Authorization.Localization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization;
using Volo.Abp.Localization.ExceptionHandling;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Security;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.Authorization
{
[DependsOn(
typeof(AbpSecurityModule),
typeof(AbpLocalizationAbstractionsModule),
typeof(AbpLocalizationModule),
typeof(AbpMultiTenancyModule)
)]
public class AbpAuthorizationModule : AbpModule
@ -38,6 +41,23 @@ namespace Volo.Abp.Authorization
options.ValueProviders.Add<RolePermissionValueProvider>();
options.ValueProviders.Add<ClientPermissionValueProvider>();
});
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpAuthorizationResource>();
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<AbpAuthorizationResource>("en")
.AddVirtualJson("/Volo/Abp/Authorization/Localization");
});
Configure<AbpExceptionLocalizationOptions>(options =>
{
options.MapCodeNamespace("Volo.Authorization", typeof(AbpAuthorizationResource));
});
}
private static void AutoAddDefinitionProviders(IServiceCollection services)

10
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/AbpAuthorizationResource.cs

@ -0,0 +1,10 @@
using Volo.Abp.Localization;
namespace Volo.Abp.Authorization.Localization
{
[LocalizationResourceName("AbpAuthorization")]
public class AbpAuthorizationResource
{
}
}

10
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/en.json

@ -0,0 +1,10 @@
{
"culture": "en",
"texts": {
"Volo.Authorization:010001": "Authorization failed! Given policy has not granted.",
"Volo.Authorization:010002": "Authorization failed! Given policy has not granted: {PolicyName}",
"Volo.Authorization:010003": "Authorization failed! Given policy has not granted for given resource: {ResourceName}",
"Volo.Authorization:010004": "Authorization failed! Given requirement has not granted for given resource: {ResourceName}",
"Volo.Authorization:010005": "Authorization failed! Given requirements has not granted for given resource: {ResourceName}"
}
}

10
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/tr.json

@ -0,0 +1,10 @@
{
"culture": "tr",
"texts": {
"Volo.Authorization:010001": "Yetkilendirme başarısız oldu! Verilen politika verilmemiştir.",
"Volo.Authorization:010002": "Yetkilendirme başarısız oldu! Verilen politika vermedi: {PolicyName}",
"Volo.Authorization:010003": "Yetkilendirme başarısız oldu! Verilen politika, verilen kaynak için verilmemiştir: {ResourceName}",
"Volo.Authorization:010004": "Yetkilendirme başarısız oldu! Belirtilen kaynak için verilen şart verilmedi {ResourceName}",
"Volo.Authorization:010005": "Yetkilendirme başarısız oldu! Verilen gereksinimler, verilen kaynak için verilmemiştir: {ResourceName}"
}
}

10
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/zh-Hans.json

@ -0,0 +1,10 @@
{
"culture": "zh-Hans",
"texts": {
"Volo.Authorization:010001": "授权失败! 提供的策略尚未授予.",
"Volo.Authorization:010002": "授权失败! 提供的策略尚未授予: {PolicyName}",
"Volo.Authorization:010003": "授权失败! 提供的策略未授予提供的资源: {ResourceName}",
"Volo.Authorization:010004": "授权失败! 提供的要求未授予提供的资源: {ResourceName}",
"Volo.Authorization:010005": "授权失败! 提供的要求未授予提供的资源: {ResourceName}"
}
}

9
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs

@ -3,18 +3,22 @@ using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using ICSharpCode.SharpZipLib.Core;
using ICSharpCode.SharpZipLib.Zip;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.Cli.Args;
using Volo.Abp.Cli.Auth;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding;
using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Templates.App;
using Volo.Abp.Cli.ProjectBuilding.Templates.Console;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Threading;
namespace Volo.Abp.Cli.Commands
{
@ -25,7 +29,8 @@ namespace Volo.Abp.Cli.Commands
protected TemplateProjectBuilder TemplateProjectBuilder { get; }
public ITemplateInfoProvider TemplateInfoProvider { get; }
public NewCommand(TemplateProjectBuilder templateProjectBuilder, ITemplateInfoProvider templateInfoProvider)
public NewCommand(TemplateProjectBuilder templateProjectBuilder
, ITemplateInfoProvider templateInfoProvider)
{
TemplateProjectBuilder = templateProjectBuilder;
TemplateInfoProvider = templateInfoProvider;
@ -193,7 +198,7 @@ namespace Volo.Abp.Cli.Commands
Logger.LogInformation($"'{projectName}' has been successfully created to '{outputFolder}'");
if (AppTemplateBase.IsAppTemplate(template ?? TemplateInfoProvider.GetDefault().Name))
if (AppTemplateBase.IsAppTemplate(template ?? (await TemplateInfoProvider.GetDefaultAsync()).Name))
{
var isCommercial = template == AppProTemplate.TemplateName;
OpenThanksPage(uiFramework, databaseProvider, isTiered || commandLineArgs.Options.ContainsKey("separate-identity-server"), isCommercial);

5
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ITemplateInfoProvider.cs

@ -1,10 +1,11 @@
using Volo.Abp.Cli.ProjectBuilding.Building;
using System.Threading.Tasks;
using Volo.Abp.Cli.ProjectBuilding.Building;
namespace Volo.Abp.Cli.ProjectBuilding
{
public interface ITemplateInfoProvider
{
TemplateInfo GetDefault();
Task<TemplateInfo> GetDefaultAsync();
TemplateInfo Get(string name);
}

68
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs

@ -1,18 +1,44 @@
using System;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.Cli.Auth;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Templates.App;
using Volo.Abp.Cli.ProjectBuilding.Templates.Console;
using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule;
using Volo.Abp.Cli.ProjectBuilding.Templates.Wpf;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Threading;
namespace Volo.Abp.Cli.ProjectBuilding
{
public class TemplateInfoProvider : ITemplateInfoProvider, ITransientDependency
{
public TemplateInfo GetDefault()
public ILogger<TemplateInfoProvider> Logger { get; set; }
public ICancellationTokenProvider CancellationTokenProvider { get; }
public IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; }
public AuthService AuthService { get; }
public TemplateInfoProvider(ICancellationTokenProvider cancellationTokenProvider,
IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
AuthService authService)
{
CancellationTokenProvider = cancellationTokenProvider;
RemoteServiceExceptionHandler = remoteServiceExceptionHandler;
AuthService = authService;
Logger = NullLogger<TemplateInfoProvider>.Instance;
}
public async Task<TemplateInfo> GetDefaultAsync()
{
return Get(AppTemplate.TemplateName);
var defaultTemplateName = await CheckProLicenseAsync() ? AppProTemplate.TemplateName : AppTemplate.TemplateName;
return Get(defaultTemplateName);
}
public TemplateInfo Get(string name)
@ -35,5 +61,43 @@ namespace Volo.Abp.Cli.ProjectBuilding
throw new Exception("There is no template found with given name: " + name);
}
}
private async Task<bool> CheckProLicenseAsync()
{
if (!AuthService.IsLoggedIn())
{
return false;
}
try
{
var url = $"{CliUrls.WwwAbpIo}api/license/check-user";
using (var client = new CliHttpClient())
{
var response = await client.GetHttpResponseMessageWithRetryAsync(
url,
CancellationTokenProvider.Token,
Logger);
if (!response.IsSuccessStatusCode)
{
throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'");
}
await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response);
var responseContent = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<bool>(responseContent);
return result;
}
}
catch (Exception)
{
return false;
}
}
}
}

6
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateProjectBuilder.cs

@ -49,7 +49,7 @@ namespace Volo.Abp.Cli.ProjectBuilding
public async Task<ProjectBuildResult> BuildAsync(ProjectBuildArgs args)
{
var templateInfo = GetTemplateInfo(args);
var templateInfo = await GetTemplateInfoAsync(args);
NormalizeArgs(args, templateInfo);
@ -175,11 +175,11 @@ namespace Volo.Abp.Cli.ProjectBuilding
}
}
private TemplateInfo GetTemplateInfo(ProjectBuildArgs args)
private async Task<TemplateInfo> GetTemplateInfoAsync(ProjectBuildArgs args)
{
if (args.TemplateName.IsNullOrWhiteSpace())
{
return TemplateInfoProvider.GetDefault();
return await TemplateInfoProvider.GetDefaultAsync();
}
else
{

6
framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/AspNetCore/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs

@ -62,12 +62,6 @@ namespace Volo.Abp.AspNetCore.ExceptionHandling
return CreateEntityNotFoundError(exception as EntityNotFoundException);
}
if (exception is AbpAuthorizationException)
{
var authorizationException = exception as AbpAuthorizationException;
return new RemoteServiceErrorInfo(authorizationException.Message);
}
var errorInfo = new RemoteServiceErrorInfo();
if (exception is IUserFriendlyException)

7
framework/src/Volo.Abp.Features/Volo.Abp.Features.csproj

@ -15,7 +15,12 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Localization.Abstractions\Volo.Abp.Localization.Abstractions.csproj" />
<None Remove="Volo\Abp\Features\Localization\*.json" />
<EmbeddedResource Include="Volo\Abp\Features\Localization\*.json" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Localization\Volo.Abp.Localization.csproj" />
<ProjectReference Include="..\Volo.Abp.MultiTenancy\Volo.Abp.MultiTenancy.csproj" />
<ProjectReference Include="..\Volo.Abp.Validation\Volo.Abp.Validation.csproj" />
</ItemGroup>

11
framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeatureErrorCodes.cs

@ -0,0 +1,11 @@
namespace Volo.Abp.Features
{
public static class AbpFeatureErrorCodes
{
public const string FeatureIsNotEnabled = "Volo.Feature:010001";
public const string AllOfTheseFeaturesMustBeEnabled = "Volo.Feature:010002";
public const string AtLeastOneOfTheseFeaturesMustBeEnabled = "Volo.Feature:010003";
}
}

22
framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs

@ -1,15 +1,18 @@
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using Volo.Abp.Features.Localization;
using Volo.Abp.Localization;
using Volo.Abp.Localization.ExceptionHandling;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Validation;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.Features
{
[DependsOn(
typeof(AbpLocalizationAbstractionsModule),
typeof(AbpLocalizationModule),
typeof(AbpMultiTenancyModule),
typeof(AbpValidationModule)
)]
@ -29,6 +32,23 @@ namespace Volo.Abp.Features
options.ValueProviders.Add<EditionFeatureValueProvider>();
options.ValueProviders.Add<TenantFeatureValueProvider>();
});
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpFeatureResource>();
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<AbpFeatureResource>("en")
.AddVirtualJson("/Volo/Abp/Features/Localization");
});
Configure<AbpExceptionLocalizationOptions>(options =>
{
options.MapCodeNamespace("Volo.Feature", typeof(AbpFeatureResource));
});
}
private static void AutoAddDefinitionProviders(IServiceCollection services)

23
framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerExtensions.cs

@ -9,8 +9,8 @@ namespace Volo.Abp.Features
public static class FeatureCheckerExtensions
{
public static async Task<T> GetAsync<T>(
[NotNull] this IFeatureChecker featureChecker,
[NotNull] string name,
[NotNull] this IFeatureChecker featureChecker,
[NotNull] string name,
T defaultValue = default)
where T : struct
{
@ -56,10 +56,11 @@ namespace Volo.Abp.Features
{
if (!(await featureChecker.IsEnabledAsync(featureName)))
{
throw new AbpAuthorizationException("Feature is not enabled: " + featureName);
throw new AbpAuthorizationException(code: AbpFeatureErrorCodes.FeatureIsNotEnabled).WithData(
"FeatureName", featureName);
}
}
public static async Task CheckEnabledAsync(this IFeatureChecker featureChecker, bool requiresAll, params string[] featureNames)
{
if (featureNames.IsNullOrEmpty())
@ -73,10 +74,8 @@ namespace Volo.Abp.Features
{
if (!(await featureChecker.IsEnabledAsync(featureName)))
{
throw new AbpAuthorizationException(
"Required features are not enabled. All of these features must be enabled: " +
string.Join(", ", featureNames)
);
throw new AbpAuthorizationException(code: AbpFeatureErrorCodes.AllOfTheseFeaturesMustBeEnabled)
.WithData("FeatureNames", string.Join(", ", featureNames));
}
}
}
@ -90,11 +89,9 @@ namespace Volo.Abp.Features
}
}
throw new AbpAuthorizationException(
"Required features are not enabled. At least one of these features must be enabled: " +
string.Join(", ", featureNames)
);
throw new AbpAuthorizationException(code: AbpFeatureErrorCodes.AtLeastOneOfTheseFeaturesMustBeEnabled)
.WithData("FeatureNames", string.Join(", ", featureNames));
}
}
}
}
}

10
framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/AbpFeatureResource.cs

@ -0,0 +1,10 @@
using Volo.Abp.Localization;
namespace Volo.Abp.Features.Localization
{
[LocalizationResourceName("AbpFeature")]
public class AbpFeatureResource
{
}
}

8
framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/en.json

@ -0,0 +1,8 @@
{
"culture": "en",
"texts": {
"Volo.Feature:010001": "Feature is not enabled: {FeatureName}",
"Volo.Feature:010002": "Required features are not enabled. All of these features must be enabled: {FeatureNames}",
"Volo.Feature:010003": "Required features are not enabled. At least one of these features must be enabled: {FeatureNames}"
}
}

8
framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/tr.json

@ -0,0 +1,8 @@
{
"culture": "tr",
"texts": {
"Volo.Feature:010001": "Özellik etkinleştirilmedi: {FeatureName}",
"Volo.Feature:010002": "Gerekli özellikler etkinleştirilmedi. Bu özelliklerin tümü etkinleştirilmelidir: {FeatureNames}",
"Volo.Feature:010003": "Gerekli özellikler etkinleştirilmedi. Bu özelliklerden en az birinin etkinleştirilmesi gerekir: {FeatureNames}"
}
}

8
framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/zh-Hans.json

@ -0,0 +1,8 @@
{
"culture": "zh-Hans",
"texts": {
"Volo.Feature:010001": "功能未启用: {FeatureName}",
"Volo.Feature:010002": "必要的功能未启用. 这些功能需要启用: {FeatureNames}",
"Volo.Feature:010003": "必要的功能未启用. 需要启用这些功能中的一项:{FeatureNames}"
}
}

29
framework/src/Volo.Abp.Security/Volo/Abp/Authorization/AbpAuthorizationException.cs

@ -1,6 +1,7 @@
using System;
using System.Runtime.Serialization;
using Microsoft.Extensions.Logging;
using Volo.Abp.ExceptionHandling;
using Volo.Abp.Logging;
namespace Volo.Abp.Authorization
@ -9,7 +10,7 @@ namespace Volo.Abp.Authorization
/// This exception is thrown on an unauthorized request.
/// </summary>
[Serializable]
public class AbpAuthorizationException : AbpException, IHasLogLevel
public class AbpAuthorizationException : AbpException, IHasLogLevel, IHasErrorCode
{
/// <summary>
/// Severity of the exception.
@ -17,6 +18,11 @@ namespace Volo.Abp.Authorization
/// </summary>
public LogLevel LogLevel { get; set; }
/// <summary>
/// Error code.
/// </summary>
public string Code { get; }
/// <summary>
/// Creates a new <see cref="AbpAuthorizationException"/> object.
/// </summary>
@ -54,5 +60,24 @@ namespace Volo.Abp.Authorization
{
LogLevel = LogLevel.Warning;
}
/// <summary>
/// Creates a new <see cref="AbpAuthorizationException"/> object.
/// </summary>
/// <param name="message">Exception message</param>
/// <param name="code">Exception code</param>
/// <param name="innerException">Inner exception</param>
public AbpAuthorizationException(string message = null, string code = null, Exception innerException = null)
: base(message, innerException)
{
Code = code;
LogLevel = LogLevel.Warning;
}
public AbpAuthorizationException WithData(string name, object value)
{
Data[name] = value;
return this;
}
}
}
}

49
framework/test/Volo.Abp.Authorization.Tests/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions_Tests.cs

@ -0,0 +1,49 @@
using Shouldly;
using Volo.Abp.AspNetCore.ExceptionHandling;
using Volo.Abp.Authorization;
using Volo.Abp.Localization;
using Xunit;
namespace Microsoft.AspNetCore.Authorization
{
public class AbpAuthorizationServiceExtensions_Tests : AuthorizationTestBase
{
private readonly IExceptionToErrorInfoConverter _exceptionToErrorInfoConverter;
public AbpAuthorizationServiceExtensions_Tests()
{
_exceptionToErrorInfoConverter = GetRequiredService<IExceptionToErrorInfoConverter>();
}
[Fact]
public void Test_AbpAuthorizationException_Localization()
{
using (CultureHelper.Use("zh-Hans"))
{
var exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGranted);
var errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的策略尚未授予.");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedWithPolicyName)
.WithData("PolicyName", "my_policy_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的策略尚未授予: my_policy_name");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedForGivenResource)
.WithData("ResourceName", "my_resource_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的策略未授予提供的资源: my_resource_name");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementHasNotGrantedForGivenResource)
.WithData("ResourceName", "my_resource_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的要求未授予提供的资源: my_resource_name");
exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementsHasNotGrantedForGivenResource)
.WithData("ResourceName", "my_resource_name");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("授权失败! 提供的要求未授予提供的资源: my_resource_name");
}
}
}
}

1
framework/test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.csproj

@ -12,6 +12,7 @@
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.ExceptionHandling\Volo.Abp.ExceptionHandling.csproj" />
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Authorization\Volo.Abp.Authorization.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />

4
framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs

@ -2,12 +2,14 @@
using Volo.Abp.Authorization.TestServices;
using Volo.Abp.Autofac;
using Volo.Abp.DynamicProxy;
using Volo.Abp.ExceptionHandling;
using Volo.Abp.Modularity;
namespace Volo.Abp.Authorization
{
[DependsOn(typeof(AbpAutofacModule))]
[DependsOn(typeof(AbpAuthorizationModule))]
[DependsOn(typeof(AbpExceptionHandlingModule))]
public class AbpAuthorizationTestModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
@ -22,4 +24,4 @@ namespace Volo.Abp.Authorization
});
}
}
}
}

1
framework/test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj

@ -9,6 +9,7 @@
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.ExceptionHandling\Volo.Abp.ExceptionHandling.csproj" />
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Features\Volo.Abp.Features.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" />

4
framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestModule.cs

@ -1,10 +1,12 @@
using Volo.Abp.Autofac;
using Volo.Abp.ExceptionHandling;
using Volo.Abp.Modularity;
namespace Volo.Abp.Features
{
[DependsOn(
typeof(AbpFeaturesModule),
typeof(AbpExceptionHandlingModule),
typeof(AbpTestBaseModule),
typeof(AbpAutofacModule)
)]
@ -12,7 +14,7 @@ namespace Volo.Abp.Features
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
}
}
}

40
framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureCheckerExtensions_Tests.cs

@ -0,0 +1,40 @@
using Shouldly;
using Volo.Abp.AspNetCore.ExceptionHandling;
using Volo.Abp.Authorization;
using Volo.Abp.Localization;
using Xunit;
namespace Volo.Abp.Features
{
public class FeatureCheckerExtensions_Tests : FeatureTestBase
{
private readonly IExceptionToErrorInfoConverter _exceptionToErrorInfoConverter;
public FeatureCheckerExtensions_Tests()
{
_exceptionToErrorInfoConverter = GetRequiredService<IExceptionToErrorInfoConverter>();
}
[Fact]
public void Test_AbpAuthorizationException_Localization()
{
using (CultureHelper.Use("zh-Hans"))
{
var exception = new AbpAuthorizationException(code: AbpFeatureErrorCodes.FeatureIsNotEnabled)
.WithData("FeatureName", "my_feature_name");
var errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("功能未启用: my_feature_name");
exception = new AbpAuthorizationException(code: AbpFeatureErrorCodes.AllOfTheseFeaturesMustBeEnabled)
.WithData("FeatureNames", "my_feature_name, my_feature_name2");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("必要的功能未启用. 这些功能需要启用: my_feature_name, my_feature_name2");
exception = new AbpAuthorizationException(code: AbpFeatureErrorCodes.AtLeastOneOfTheseFeaturesMustBeEnabled)
.WithData("FeatureNames", "my_feature_name, my_feature_name2");
errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false);
errorInfo.Message.ShouldBe("必要的功能未启用. 需要启用这些功能中的一项:my_feature_name, my_feature_name2");
}
}
}
}

4
modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityWebMainMenuContributor.cs

@ -27,12 +27,12 @@ namespace Volo.Abp.Identity.Blazor
if (hasRolePermission)
{
identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Roles, l["Roles"], url: "/identity/roles"));
identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Roles, l["Roles"], url: "identity/roles"));
}
if (hasUserPermission)
{
identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Users, l["Users"], url: "/identity/users"));
identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Users, l["Users"], url: "identity/users"));
}
}
}

2
modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Menus/SettingManagementMenuContributor.cs

@ -37,7 +37,7 @@ namespace Volo.Abp.SettingManagement.Blazor.Menus
new ApplicationMenuItem(
SettingManagementMenus.GroupName,
l["Settings"],
"/setting-management",
"setting-management",
icon: "fa fa-cog"
)
);

2
modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Navigation/TenantManagementBlazorMenuContributor.cs

@ -22,7 +22,7 @@ namespace Volo.Abp.TenantManagement.Blazor.Navigation
if (await context.IsGrantedAsync(TenantManagementPermissions.Tenants.Default))
{
tenantManagementMenuItem.AddItem(new ApplicationMenuItem(TenantManagementMenuNames.Tenants, l["Tenants"], url: "/tenant-management/tenants"));
tenantManagementMenuItem.AddItem(new ApplicationMenuItem(TenantManagementMenuNames.Tenants, l["Tenants"], url: "tenant-management/tenants"));
}
}
}

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs

@ -39,7 +39,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Menus
new ApplicationMenuItem(
MyProjectNameMenus.Home,
l["Menu:Home"],
"/",
"",
icon: "fas fa-home"
)
);

Loading…
Cancel
Save