Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
<PackageVersion Include="MailKit" Version="4.14.1" />
<PackageVersion Include="Markdig" Version="0.42.0" />
<PackageVersion Include="Microsoft.Extensions.Azure" Version="1.13.0" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.9" />
<PackageVersion Include="Microsoft.Identity.Web" Version="3.14.1" />
<PackageVersion Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="8.14.0" />
<PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" />
Expand Down
21 changes: 21 additions & 0 deletions OrchardCore.sln
Original file line number Diff line number Diff line change
Expand Up @@ -585,6 +585,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrchardCore.Taxonomies.Core
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrchardCore.Flows.Core", "src\OrchardCore\OrchardCore.Flows.Core\OrchardCore.Flows.Core.csproj", "{F7F3AFBD-8045-49D3-BA06-504954D6910B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrchardCore.Security.Core", "src\OrchardCore\OrchardCore.Security.Core\OrchardCore.Security.Core.csproj", "{697B126E-3AB6-46A7-A491-AF3E195D6836}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrchardCore.Azure", "src\OrchardCore.Modules\OrchardCore.Azure\OrchardCore.Azure.csproj", "{7B0C21D9-9365-8CBC-1A2B-52322BAC9153}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrchardCore.Azure.Core", "src\OrchardCore\OrchardCore.Azure.Core\OrchardCore.Azure.Core.csproj", "{08B1CAEE-D15E-CB2C-29C9-3771714D2E15}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -1481,6 +1487,18 @@ Global
{F7F3AFBD-8045-49D3-BA06-504954D6910B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F7F3AFBD-8045-49D3-BA06-504954D6910B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F7F3AFBD-8045-49D3-BA06-504954D6910B}.Release|Any CPU.Build.0 = Release|Any CPU
{697B126E-3AB6-46A7-A491-AF3E195D6836}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{697B126E-3AB6-46A7-A491-AF3E195D6836}.Debug|Any CPU.Build.0 = Debug|Any CPU
{697B126E-3AB6-46A7-A491-AF3E195D6836}.Release|Any CPU.ActiveCfg = Release|Any CPU
{697B126E-3AB6-46A7-A491-AF3E195D6836}.Release|Any CPU.Build.0 = Release|Any CPU
{7B0C21D9-9365-8CBC-1A2B-52322BAC9153}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B0C21D9-9365-8CBC-1A2B-52322BAC9153}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7B0C21D9-9365-8CBC-1A2B-52322BAC9153}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7B0C21D9-9365-8CBC-1A2B-52322BAC9153}.Release|Any CPU.Build.0 = Release|Any CPU
{08B1CAEE-D15E-CB2C-29C9-3771714D2E15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{08B1CAEE-D15E-CB2C-29C9-3771714D2E15}.Debug|Any CPU.Build.0 = Debug|Any CPU
{08B1CAEE-D15E-CB2C-29C9-3771714D2E15}.Release|Any CPU.ActiveCfg = Release|Any CPU
{08B1CAEE-D15E-CB2C-29C9-3771714D2E15}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -1734,6 +1752,9 @@ Global
{51C07EE9-9420-4BFE-911B-9F4326A0F83B} = {F23AC6C2-DE44-4699-999D-3C478EF3D691}
{6A379AE9-B468-4D89-82B2-0C350AB712F9} = {F23AC6C2-DE44-4699-999D-3C478EF3D691}
{F7F3AFBD-8045-49D3-BA06-504954D6910B} = {F23AC6C2-DE44-4699-999D-3C478EF3D691}
{697B126E-3AB6-46A7-A491-AF3E195D6836} = {F23AC6C2-DE44-4699-999D-3C478EF3D691}
{7B0C21D9-9365-8CBC-1A2B-52322BAC9153} = {A066395F-6F73-45DC-B5A6-B4E306110DCE}
{08B1CAEE-D15E-CB2C-29C9-3771714D2E15} = {F23AC6C2-DE44-4699-999D-3C478EF3D691}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {46A1D25A-78D1-4476-9CBF-25B75E296341}
Expand Down
43 changes: 43 additions & 0 deletions OrchardCore.sln.rej
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
diff a/OrchardCore.sln b/OrchardCore.sln (rejected hunks)
@@ -585,6 +585,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrchardCore.Taxonomies.Core
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrchardCore.Flows.Core", "src\OrchardCore\OrchardCore.Flows.Core\OrchardCore.Flows.Core.csproj", "{F7F3AFBD-8045-49D3-BA06-504954D6910B}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrchardCore.Redis.Azure", "src\OrchardCore.Modules\OrchardCore.Redis.Azure\OrchardCore.Redis.Azure.csproj", "{61848F3E-972A-4AD3-965E-DC42E690BF05}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrchardCore.Azure.Core", "src\OrchardCore\OrchardCore.Azure.Core\OrchardCore.Azure.Core.csproj", "{903FFEBA-B69D-4464-8391-9240C9EB8384}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrchardCore.Azure", "src\OrchardCore.Modules\OrchardCore.Azure\OrchardCore.Azure.csproj", "{5BA3337B-2266-40A8-87A2-C4497D260FE0}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -1481,6 +1487,18 @@ Global
{F7F3AFBD-8045-49D3-BA06-504954D6910B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F7F3AFBD-8045-49D3-BA06-504954D6910B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F7F3AFBD-8045-49D3-BA06-504954D6910B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {61848F3E-972A-4AD3-965E-DC42E690BF05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {61848F3E-972A-4AD3-965E-DC42E690BF05}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {61848F3E-972A-4AD3-965E-DC42E690BF05}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {61848F3E-972A-4AD3-965E-DC42E690BF05}.Release|Any CPU.Build.0 = Release|Any CPU
+ {903FFEBA-B69D-4464-8391-9240C9EB8384}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {903FFEBA-B69D-4464-8391-9240C9EB8384}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {903FFEBA-B69D-4464-8391-9240C9EB8384}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {903FFEBA-B69D-4464-8391-9240C9EB8384}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5BA3337B-2266-40A8-87A2-C4497D260FE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5BA3337B-2266-40A8-87A2-C4497D260FE0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5BA3337B-2266-40A8-87A2-C4497D260FE0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5BA3337B-2266-40A8-87A2-C4497D260FE0}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1734,6 +1752,9 @@ Global
{51C07EE9-9420-4BFE-911B-9F4326A0F83B} = {F23AC6C2-DE44-4699-999D-3C478EF3D691}
{6A379AE9-B468-4D89-82B2-0C350AB712F9} = {F23AC6C2-DE44-4699-999D-3C478EF3D691}
{F7F3AFBD-8045-49D3-BA06-504954D6910B} = {F23AC6C2-DE44-4699-999D-3C478EF3D691}
+ {61848F3E-972A-4AD3-965E-DC42E690BF05} = {A066395F-6F73-45DC-B5A6-B4E306110DCE}
+ {903FFEBA-B69D-4464-8391-9240C9EB8384} = {F23AC6C2-DE44-4699-999D-3C478EF3D691}
+ {5BA3337B-2266-40A8-87A2-C4497D260FE0} = {A066395F-6F73-45DC-B5A6-B4E306110DCE}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {46A1D25A-78D1-4476-9CBF-25B75E296341}
2 changes: 2 additions & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ nav:
- Display Management: reference/modules/DisplayManagement/README.md
- Audit Trail: reference/modules/AuditTrail/README.md
- Auto Setup: reference/modules/AutoSetup/README.md
- Azure: reference/modules/Azure/README.md
- Features: reference/modules/Features/README.md
- Contents: reference/modules/Contents/README.md
- Configuration: reference/modules/Configuration/README.md
Expand Down Expand Up @@ -271,6 +272,7 @@ nav:
- Razor Helpers: reference/modules/Razor/README.md
- Recipes: reference/modules/Recipes/README.md
- Redis: reference/modules/Redis/README.md
- Redis Azure: reference/modules/Redis.Azure/README.md
- Remote Deployment: reference/modules/Deployment.Remote/README.md
- Response Compression: reference/modules/ResponseCompression/README.md
- Roles: reference/modules/Roles/README.md
Expand Down
10 changes: 10 additions & 0 deletions src/OrchardCore.Modules/OrchardCore.Azure/Manifest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using OrchardCore.Modules.Manifest;

[assembly: Module(
Name = "OrchardCore.Azure",
Author = ManifestConstants.OrchardCoreTeam,
Website = ManifestConstants.OrchardCoreWebsite,
Version = ManifestConstants.OrchardCoreVersion,
Description = "Provides a way to manage Azure credentials",
Category = "Azure"
)]
12 changes: 12 additions & 0 deletions src/OrchardCore.Modules/OrchardCore.Azure/OrchardCore.Azure.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">

<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\OrchardCore\OrchardCore.Abstractions\OrchardCore.Abstractions.csproj" />
<ProjectReference Include="..\..\OrchardCore\OrchardCore.Azure.Core\OrchardCore.Azure.Core.csproj" />
</ItemGroup>

</Project>
13 changes: 13 additions & 0 deletions src/OrchardCore.Modules/OrchardCore.Azure/Startup.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Microsoft.Extensions.DependencyInjection;
using OrchardCore.Azure.Core;
using OrchardCore.Modules;

namespace OrchardCore.Azure;

public class Startup : StartupBase
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddAzureOptions();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public override async Task<IDisplayResult> EditAsync(ISite site, AzureEmailSetti
{
model.IsEnabled = settings.IsEnabled;
model.DefaultSender = settings.DefaultSender;

model.HasConnectionString = !string.IsNullOrWhiteSpace(settings.ConnectionString);
}).Location("Content:5#Azure Communication Services")
.OnGroup(SettingsGroupId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,22 @@ public class AzureEmailOptions

public string ConnectionString { get; set; }

public string CredentialName { get; set; }

public Uri Endpoint { get; set; }

public bool ConfigurationExists()
=> !string.IsNullOrWhiteSpace(DefaultSender) && !string.IsNullOrWhiteSpace(ConnectionString);
{
if (string.IsNullOrWhiteSpace(DefaultSender))
{
return false;
}

if (Endpoint is not null)
{
return true;
}

return !string.IsNullOrWhiteSpace(ConnectionString);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.Options;
using OrchardCore.Azure.Core;
using OrchardCore.Email.Azure;
using OrchardCore.Email.Azure.Models;
using OrchardCore.Settings;
Expand Down Expand Up @@ -32,7 +33,20 @@ public void Configure(AzureEmailOptions options)
{
var protector = _dataProtectionProvider.CreateProtector(ProtectorName);

options.ConnectionString = protector.Unprotect(settings.ConnectionString);
var rawConnectionString = protector.Unprotect(settings.ConnectionString);

options.ConnectionString = rawConnectionString;

if (options.Endpoint is null)
{
var endpointString = ConnectionStringHelper.Extract(rawConnectionString, "Endpoint");

if (endpointString is not null && Uri.TryCreate(endpointString, UriKind.Absolute, out var endpointUri))
{
options.Endpoint = endpointUri;
}
}
}

}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using OrchardCore.Azure.Core;
using OrchardCore.Email.Azure.Models;

namespace OrchardCore.Email.Azure.Services;
Expand All @@ -11,9 +12,10 @@ public class AzureEmailProvider : AzureEmailProviderBase

public AzureEmailProvider(
IOptions<AzureEmailOptions> options,
IOptionsMonitor<AzureOptions> optionsMonitor,
ILogger<AzureEmailProvider> logger,
IStringLocalizer<AzureEmailProvider> stringLocalizer)
: base(options.Value, logger, stringLocalizer)
: base(options.Value, optionsMonitor, logger, stringLocalizer)
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using Azure.Communication.Email;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using OrchardCore.Azure.Core;
using OrchardCore.Email.Azure.Models;

namespace OrchardCore.Email.Azure.Services;
Expand Down Expand Up @@ -79,6 +81,7 @@ public abstract class AzureEmailProviderBase : IEmailProvider
};

private readonly AzureEmailOptions _providerOptions;
private readonly IOptionsMonitor<AzureOptions> _optionsMonitor;
private readonly ILogger _logger;

private EmailClient _emailClient;
Expand All @@ -87,10 +90,12 @@ public abstract class AzureEmailProviderBase : IEmailProvider

public AzureEmailProviderBase(
AzureEmailOptions options,
IOptionsMonitor<AzureOptions> optionsMonitor,
ILogger logger,
IStringLocalizer stringLocalizer)
{
_providerOptions = options;
_optionsMonitor = optionsMonitor;
_logger = logger;
S = stringLocalizer;
}
Expand Down Expand Up @@ -135,7 +140,28 @@ public virtual async Task<EmailResult> SendAsync(MailMessage message)

try
{
_emailClient ??= new EmailClient(_providerOptions.ConnectionString);
if (_emailClient is null)
{
if (!string.IsNullOrEmpty(_providerOptions.ConnectionString))
{
_emailClient = new EmailClient(_providerOptions.ConnectionString);
}
else if (_providerOptions.Endpoint is not null)
{
var azureOptions = _optionsMonitor.Get(_providerOptions.CredentialName ?? AzureOptions.DefaultName);

if (azureOptions is null)
{
return EmailResult.FailedResult(string.Empty, S["Unsupported Authentication Type. The Azure Email Provider is not configured correctly."]);
}

_emailClient = new EmailClient(_providerOptions.Endpoint, azureOptions.ToTokenCredential());
}
else
{
return EmailResult.FailedResult(string.Empty, S["The Azure Email Provider is not configured correctly."]);
}
}

var emailResult = await _emailClient.SendAsync(WaitUntil.Completed, emailMessage);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using OrchardCore.Azure.Core;
using OrchardCore.Email.Azure.Models;

namespace OrchardCore.Email.Azure.Services;
Expand All @@ -11,9 +12,10 @@ public class DefaultAzureEmailProvider : AzureEmailProviderBase

public DefaultAzureEmailProvider(
IOptions<DefaultAzureEmailOptions> options,
IOptionsMonitor<AzureOptions> optionsMonitor,
ILogger<DefaultAzureEmailProvider> logger,
IStringLocalizer<DefaultAzureEmailProvider> stringLocalizer)
: base(options.Value, logger, stringLocalizer)
: base(options.Value, optionsMonitor, logger, stringLocalizer)
{
}

Expand Down
11 changes: 11 additions & 0 deletions src/OrchardCore.Modules/OrchardCore.Email.Azure/Startup.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using OrchardCore.Azure.Core;
using OrchardCore.Azure.Email.Drivers;
using OrchardCore.DisplayManagement.Handlers;
using OrchardCore.Email.Azure.Models;
Expand Down Expand Up @@ -34,6 +35,16 @@ public void ConfigureServices(IServiceCollection services)
// The 'OrchardCore_Email_Azure' key can be removed in version 3.
_shellConfiguration.GetSection("OrchardCore_Email_Azure").Bind(options);

if (options.Endpoint is null && !string.IsNullOrEmpty(options.ConnectionString))
{
var endpointString = ConnectionStringHelper.Extract(options.ConnectionString, "Endpoint");

if (endpointString is not null && Uri.TryCreate(endpointString, UriKind.Absolute, out var endpointUri))
{
options.Endpoint = endpointUri;
}
}

options.IsEnabled = options.ConfigurationExists();
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,12 +93,12 @@ public async Task<IActionResult> Index(
.ThenBy(x => x.Type),
};

foreach (var record in result.Models)
foreach (var entry in result.Entries)
{
viewModel.Models.Add(new ModelEntry<IndexProfile>
{
Model = record,
Shape = await _displayManager.BuildDisplayAsync(record, _updateModelAccessor.ModelUpdater, "SummaryAdmin"),
Model = entry,
Shape = await _displayManager.BuildDisplayAsync(entry, _updateModelAccessor.ModelUpdater, "SummaryAdmin"),
});
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using Microsoft.Extensions.DependencyInjection;
using OrchardCore.Catalogs;
using OrchardCore.Data.Migration;
using OrchardCore.Documents;
using OrchardCore.Environment.Shell;
using OrchardCore.Environment.Shell.Scope;
using OrchardCore.Indexing.Core;
using OrchardCore.Indexing.Models;
using YesSql;

Expand Down
4 changes: 3 additions & 1 deletion src/OrchardCore.Modules/OrchardCore.Media.Azure/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using OrchardCore.Azure.Core;
using OrchardCore.Environment.Shell;
using OrchardCore.Environment.Shell.Configuration;
using OrchardCore.FileStorage;
Expand Down Expand Up @@ -92,12 +93,13 @@ public override void ConfigureServices(IServiceCollection services)
var shellSettings = serviceProvider.GetRequiredService<ShellSettings>();
var mediaOptions = serviceProvider.GetRequiredService<IOptions<MediaOptions>>().Value;
var clock = serviceProvider.GetRequiredService<IClock>();
var optionsMonitor = serviceProvider.GetRequiredService<IOptionsMonitor<AzureOptions>>();
var contentTypeProvider = serviceProvider.GetRequiredService<IContentTypeProvider>();
var mediaEventHandlers = serviceProvider.GetServices<IMediaEventHandler>();
var mediaCreatingEventHandlers = serviceProvider.GetServices<IMediaCreatingEventHandler>();
var logger = serviceProvider.GetRequiredService<ILogger<DefaultMediaFileStore>>();

var fileStore = new BlobFileStore(blobStorageOptions, clock, contentTypeProvider);
var fileStore = new BlobFileStore(blobStorageOptions, clock, optionsMonitor, contentTypeProvider);
var mediaUrlBase = "/" + fileStore.Combine(shellSettings.RequestUrlPrefix, mediaOptions.AssetsRequestPath);

var originalPathBase = serviceProvider.GetRequiredService<IHttpContextAccessor>().HttpContext
Expand Down
Loading
Loading