diff --git a/NuGet.AzDO.config b/NuGet.AzDO.config index c9581ab..95e879e 100644 --- a/NuGet.AzDO.config +++ b/NuGet.AzDO.config @@ -1,8 +1,6 @@ - + - - - \ No newline at end of file + diff --git a/RSK.IdentityServer4.AuditEventSink.sln b/RSK.IdentityServer4.AuditEventSink.sln index 8cd2259..2a4c179 100644 --- a/RSK.IdentityServer4.AuditEventSink.sln +++ b/RSK.IdentityServer4.AuditEventSink.sln @@ -3,12 +3,8 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.28306.52 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Rsk.IdentityServer4.AuditEventSink", "src\RSK.IdentityServer4.AuditEventSink\RSK.IdentityServer4.AuditEventSink.csproj", "{E752B37B-6562-4DC5-8657-620FE569905A}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{4AD87BDC-20A4-4426-80E4-0706AA9D8294}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RSK.IdentityServer4.AuditEventSink.Tests", "tests\Rsk.IdentityServer4.AuditEventSink.Tests\RSK.IdentityServer4.AuditEventSink.Tests.csproj", "{90720013-B304-4B49-A174-0C840E218A26}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{0F18CE73-394B-4E63-8791-E6FDD93581AC}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rsk.DuendeIdentityServer.AuditEventSink", "src\Rsk.DuendeIdentityServer.AuditEventSink\Rsk.DuendeIdentityServer.AuditEventSink.csproj", "{28F49BF0-75B5-40D1-91D8-E701072F17CA}" @@ -31,14 +27,6 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E752B37B-6562-4DC5-8657-620FE569905A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E752B37B-6562-4DC5-8657-620FE569905A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E752B37B-6562-4DC5-8657-620FE569905A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E752B37B-6562-4DC5-8657-620FE569905A}.Release|Any CPU.Build.0 = Release|Any CPU - {90720013-B304-4B49-A174-0C840E218A26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {90720013-B304-4B49-A174-0C840E218A26}.Debug|Any CPU.Build.0 = Debug|Any CPU - {90720013-B304-4B49-A174-0C840E218A26}.Release|Any CPU.ActiveCfg = Release|Any CPU - {90720013-B304-4B49-A174-0C840E218A26}.Release|Any CPU.Build.0 = Release|Any CPU {28F49BF0-75B5-40D1-91D8-E701072F17CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {28F49BF0-75B5-40D1-91D8-E701072F17CA}.Debug|Any CPU.Build.0 = Debug|Any CPU {28F49BF0-75B5-40D1-91D8-E701072F17CA}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -72,8 +60,6 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {90720013-B304-4B49-A174-0C840E218A26} = {4AD87BDC-20A4-4426-80E4-0706AA9D8294} - {E752B37B-6562-4DC5-8657-620FE569905A} = {0F18CE73-394B-4E63-8791-E6FDD93581AC} {28F49BF0-75B5-40D1-91D8-E701072F17CA} = {0F18CE73-394B-4E63-8791-E6FDD93581AC} {84B20BBC-743D-47CB-A8E2-5B642005C7B4} = {4AD87BDC-20A4-4426-80E4-0706AA9D8294} {7E77BD90-9720-449D-95C9-74F52ED47CFD} = {0F18CE73-394B-4E63-8791-E6FDD93581AC} diff --git a/azure-pipelines.duende-identity-server.yml b/azure-pipelines.duende-identity-server.yml new file mode 100644 index 0000000..c48df68 --- /dev/null +++ b/azure-pipelines.duende-identity-server.yml @@ -0,0 +1,83 @@ +variables: +- name: buildConfiguration + value: 'Release' +- name: identityPackageVersion + value: '5.0.0.0' + +stages: +- stage: Build + jobs: + - job: BuildDuendeIdentityServer + strategy: + matrix: + linux: + imageName: 'ubuntu-latest' + shouldPack: true + mac: + imageName: 'macOS-latest' + shouldPack: true + windows: + imageName: 'windows-latest' + shouldPack: true + pool: + vmImage: $(imageName) + steps: + - task: UseDotNet@2 + displayName: Install .NET Core sdk version 10.x + inputs: + packageType: sdk + version: 10.x + installationPath: $(Agent.ToolsDirectory)/dotnet + - task: NuGetToolInstaller@0 + inputs: + versionSpec: 5.4.0 + - task: DotNetCoreCLI@2 + displayName: 'Dotnet restore' + inputs: + command: 'restore' + projects: 'src/Rsk.DuendeIdentityServer.AuditEventSink/Rsk.DuendeIdentityServer.AuditEventSink.csproj' + feedsToUse: 'config' + nugetConfigPath: $(System.DefaultWorkingDirectory)/NuGet.AzDO.config + - task: DotNetCoreCLI@2 + displayName: dotnet build src/Rsk.DuendeIdentityServer.AuditEventSink/Rsk.DuendeIdentityServer.AuditEventSink.csproj + inputs: + command: 'build' + projects: 'src/Rsk.DuendeIdentityServer.AuditEventSink/Rsk.DuendeIdentityServer.AuditEventSink.csproj' + arguments: -c $(buildConfiguration) --no-restore /p:Version="$(identityPackageVersion)" + - task: DotNetCoreCLI@2 + displayName: dotnet test - Run Duende IdentityServer Tests + inputs: + command: 'test' + projects: 'tests/Rsk.DuendeIdentityServer.AuditEventSink.Tests/Rsk.DuendeIdentityServer.AuditEventSink.Tests.csproj' + arguments: -c $(buildConfiguration) --no-restore + - task: DotNetCoreCLI@2 + displayName: Package Rsk.DuendeIdentityServer.AuditEventSink.csproj for Nuget + inputs: + command: 'pack' + packagesToPack: 'src/Rsk.DuendeIdentityServer.AuditEventSink/Rsk.DuendeIdentityServer.AuditEventSink.csproj' + nobuild: true + includesymbols: true + versionEnvVar: identityPackageVersion + versioningScheme: 'byEnvVar' + verbosityPack: 'Normal' + outputDir: '$(Build.ArtifactStagingDirectory)' + - task: PublishBuildArtifacts@1 + condition: and(succeeded(), eq(variables['shouldPack'], true)) + displayName: Publish Duende IdentityServer artifacts + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)' + ArtifactName: 'Rsk.DuendeIdentityServer.AuditEventSink nupkg' + publishLocation: 'Container' + +- stage: Publish + dependsOn: Build + condition: succeeded() + jobs: + - job: PublishNuGet + pool: + vmImage: 'ubuntu-latest' + steps: + - template: templates/publish-nuget.yml + parameters: + artifact: 'Rsk.DuendeIdentityServer.AuditEventSink nupkg' + packageToPublish: '$(Pipeline.Workspace)/Rsk.DuendeIdentityServer.AuditEventSink nupkg/*.nupkg' diff --git a/azure-pipelines.rsk-audit-ef.yml b/azure-pipelines.rsk-audit-ef.yml new file mode 100644 index 0000000..c2cd2bd --- /dev/null +++ b/azure-pipelines.rsk-audit-ef.yml @@ -0,0 +1,83 @@ +variables: +- name: buildConfiguration + value: 'Release' +- name: efPackageVersion + value: '4.0.0.0' + +stages: +- stage: Build + jobs: + - job: BuildRskAuditEF + strategy: + matrix: + linux: + imageName: 'ubuntu-latest' + shouldPack: true + mac: + imageName: 'macOS-latest' + shouldPack: true + windows: + imageName: 'windows-latest' + shouldPack: true + pool: + vmImage: $(imageName) + steps: + - task: UseDotNet@2 + displayName: Install .NET Core sdk version 10.x + inputs: + packageType: sdk + version: 10.x + installationPath: $(Agent.ToolsDirectory)/dotnet + - task: NuGetToolInstaller@0 + inputs: + versionSpec: 5.4.0 + - task: DotNetCoreCLI@2 + displayName: 'Dotnet restore' + inputs: + command: 'restore' + projects: 'src/Rsk.Audit.EF/Rsk.Audit.EF.csproj' + feedsToUse: 'config' + nugetConfigPath: $(System.DefaultWorkingDirectory)/NuGet.AzDO.config + - task: DotNetCoreCLI@2 + displayName: dotnet build src/Rsk.Audit.EF/Rsk.Audit.EF.csproj + inputs: + command: 'build' + projects: 'src/Rsk.Audit.EF/Rsk.Audit.EF.csproj' + arguments: -c $(buildConfiguration) --no-restore /p:Version="$(efPackageVersion)" + - task: DotNetCoreCLI@2 + displayName: dotnet test - Run Rsk.Audit.EF Tests + inputs: + command: 'test' + projects: 'tests/Rsk.Audit.Tests.Integration/Rsk.Audit.Tests.Integration.csproj' + arguments: -c $(buildConfiguration) --no-restore + - task: DotNetCoreCLI@2 + displayName: Package Rsk.Audit.EF.csproj for Nuget + inputs: + command: 'pack' + packagesToPack: 'src/Rsk.Audit.EF/Rsk.Audit.EF.csproj' + nobuild: true + includesymbols: true + versionEnvVar: efPackageVersion + versioningScheme: 'byEnvVar' + verbosityPack: 'Normal' + outputDir: '$(Build.ArtifactStagingDirectory)' + - task: PublishBuildArtifacts@1 + condition: and(succeeded(), eq(variables['shouldPack'], true)) + displayName: Publish Rsk.Audit.EF artifacts + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)' + ArtifactName: 'Rsk.Audit.EF nupkg' + publishLocation: 'Container' + +- stage: Publish + dependsOn: Build + condition: succeeded() + jobs: + - job: PublishNuGet + pool: + vmImage: 'ubuntu-latest' + steps: + - template: templates/publish-nuget.yml + parameters: + artifact: 'Rsk.Audit.EF nupkg' + packageToPublish: '$(Pipeline.Workspace)/Rsk.Audit.EF nupkg/*.nupkg' diff --git a/azure-pipelines.rsk-audit.yml b/azure-pipelines.rsk-audit.yml new file mode 100644 index 0000000..ee61ab5 --- /dev/null +++ b/azure-pipelines.rsk-audit.yml @@ -0,0 +1,83 @@ +variables: +- name: buildConfiguration + value: 'Release' +- name: packageVersion + value: '4.0.0.0' + +stages: +- stage: Build + jobs: + - job: BuildRskAudit + strategy: + matrix: + linux: + imageName: 'ubuntu-latest' + shouldPack: true + mac: + imageName: 'macOS-latest' + shouldPack: true + windows: + imageName: 'windows-latest' + shouldPack: true + pool: + vmImage: $(imageName) + steps: + - task: UseDotNet@2 + displayName: Install .NET Core sdk version 10.x + inputs: + packageType: sdk + version: 10.x + installationPath: $(Agent.ToolsDirectory)/dotnet + - task: NuGetToolInstaller@0 + inputs: + versionSpec: 5.4.0 + - task: DotNetCoreCLI@2 + displayName: 'Dotnet restore' + inputs: + command: 'restore' + projects: 'src/Rsk.Audit/Rsk.Audit.csproj' + feedsToUse: 'config' + nugetConfigPath: $(System.DefaultWorkingDirectory)/NuGet.AzDO.config + - task: DotNetCoreCLI@2 + displayName: dotnet build src/Rsk.Audit/Rsk.Audit.csproj + inputs: + command: 'build' + projects: 'src/Rsk.Audit/Rsk.Audit.csproj' + arguments: -c $(buildConfiguration) --no-restore /p:Version="$(packageVersion)" + - task: DotNetCoreCLI@2 + displayName: dotnet test - Run Rsk.Audit Tests + inputs: + command: 'test' + projects: 'tests/Rsk.Audit.Tests/Rsk.Audit.Tests.csproj' + arguments: -c $(buildConfiguration) --no-restore + - task: DotNetCoreCLI@2 + displayName: Package Rsk.Audit.csproj for Nuget + inputs: + command: 'pack' + packagesToPack: 'src/Rsk.Audit/Rsk.Audit.csproj' + nobuild: true + includesymbols: true + versionEnvVar: packageVersion + versioningScheme: 'byEnvVar' + verbosityPack: 'Normal' + outputDir: '$(Build.ArtifactStagingDirectory)' + - task: PublishBuildArtifacts@1 + condition: and(succeeded(), eq(variables['shouldPack'], true)) + displayName: Publish Rsk.Audit artifacts + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)' + ArtifactName: 'Rsk.Audit nupkg' + publishLocation: 'Container' + +- stage: Publish + dependsOn: Build + condition: succeeded() + jobs: + - job: PublishNuGet + pool: + vmImage: 'ubuntu-latest' + steps: + - template: templates/publish-nuget.yml + parameters: + artifact: 'Rsk.Audit nupkg' + packageToPublish: '$(Pipeline.Workspace)/Rsk.Audit nupkg/*.nupkg' diff --git a/azure-pipelines.yml b/azure-pipelines.yml index bf97994..f8c4dee 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -7,50 +7,27 @@ variables: - name: buildConfiguration value: 'Release' - name: packageVersion - value: '3.0.0.0' + value: '4.0.0.0' - name: efPackageVersion - value: '3.0.0.0' + value: '4.0.0.0' - name: identityPackageVersion - value: '4.1.0.0' -- name: RunSqlServerTest - value: 'true' + value: '5.0.0.0' + stages: -- stage: __default +- stage: Build jobs: - - job: '' + - job: BuildAllProjects strategy: matrix: linux: imageName: 'ubuntu-latest' - shouldPack: true mac: imageName: 'macOS-latest' - shouldPack: true windows: imageName: 'windows-latest' - shouldPack: true pool: vmImage: $(imageName) steps: - - task: Bash@3 - displayName: Create LocalNuget folder - inputs: - targetType: inline - script: | - mkdir LocalNuget - workingDirectory: $(Build.SourcesDirectory) - - task: UseDotNet@2 - displayName: Install .NET Core sdk version 8.x - inputs: - packageType: sdk - version: 8.x - installationPath: $(Agent.ToolsDirectory)/dotnet - - task: UseDotNet@2 - displayName: Install .NET Core sdk version 9.x - inputs: - packageType: sdk - version: 9.x - installationPath: $(Agent.ToolsDirectory)/dotnet - task: UseDotNet@2 displayName: Install .NET Core sdk version 10.x inputs: @@ -68,80 +45,26 @@ stages: feedsToUse: 'config' nugetConfigPath: $(System.DefaultWorkingDirectory)/NuGet.AzDO.config - task: DotNetCoreCLI@2 - displayName: dotnet build **/Rsk.Audit.csproj + displayName: dotnet build Rsk.Audit.csproj inputs: command: 'build' projects: '**/Rsk.Audit.csproj' arguments: -c $(buildConfiguration) --no-restore /p:Version="$(packageVersion)" - task: DotNetCoreCLI@2 - displayName: dotnet build **/Rsk.Audit.EF.csproj + displayName: dotnet build Rsk.Audit.EF.csproj inputs: command: 'build' projects: '**/Rsk.Audit.EF.csproj' arguments: -c $(buildConfiguration) --no-restore /p:Version="$(efPackageVersion)" - task: DotNetCoreCLI@2 - displayName: dotnet build **/Rsk.DuendeIdentityServer.AuditEventSink.csproj + displayName: dotnet build Rsk.DuendeIdentityServer.AuditEventSink.csproj inputs: command: 'build' projects: '**/Rsk.DuendeIdentityServer.AuditEventSink.csproj' arguments: -c $(buildConfiguration) --no-restore /p:Version="$(identityPackageVersion)" - - task: DotNetCoreCLI@2 - displayName: dotnet build **/RSK.IdentityServer4.AuditEventSink.csproj - inputs: - command: 'build' - projects: '**/RSK.IdentityServer4.AuditEventSink.csproj' - arguments: -c $(buildConfiguration) --no-restore" - task: DotNetCoreCLI@2 displayName: dotnet test - Run All Tests inputs: command: 'test' projects: '**/*Tests*.csproj' - arguments: -c $(buildConfiguration) --no-restore" - - task: DotNetCoreCLI@2 - displayName: Package **/Rsk.Audit.csproj for Nuget - inputs: - command: 'pack' - packagesToPack: '**/Rsk.Audit.csproj' - nobuild: true - includesymbols: true - versionEnvVar: packageVersion - versioningScheme: 'byEnvVar' - verbosityPack: 'Normal' - outputDir: LocalNuget - - task: DotNetCoreCLI@2 - displayName: Package **/Rsk.Audit.EF.csproj for Nuget - inputs: - command: 'pack' - packagesToPack: '**/Rsk.Audit.EF.csproj' - nobuild: true - includesymbols: true - versionEnvVar: efPackageVersion - versioningScheme: 'byEnvVar' - verbosityPack: 'Normal' - outputDir: LocalNuget - - task: DotNetCoreCLI@2 - displayName: Package **/Rsk.DuendeIdentityServer.AuditEventSink.csproj for Nuget - inputs: - command: 'pack' - packagesToPack: '**/Rsk.DuendeIdentityServer.AuditEventSink.csproj' - nobuild: true - includesymbols: true - versionEnvVar: identityPackageVersion - versioningScheme: 'byEnvVar' - verbosityPack: 'Normal' - outputDir: LocalNuget - - task: CopyFiles@2 - condition: and(succeeded(), eq(variables['shouldPack'], true)) - displayName: 'Copy nupkg to artifact directory' - inputs: - Contents: 'LocalNuget/*.nupkg' - TargetFolder: '$(Build.ArtifactStagingDirectory)' - CleanTargetFolder: true - flattenFolders: true - - task: PublishBuildArtifacts@1 - condition: and(succeeded(), eq(variables['shouldPack'], true)) - displayName: Publish Audit artifacts - inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)' - ArtifactName: Audit nupkg - publishLocation: 'Container' \ No newline at end of file + arguments: -c $(buildConfiguration) --no-restore \ No newline at end of file diff --git a/src/RSK.IdentityServer4.AuditEventSink/AdapterFactory.cs b/src/RSK.IdentityServer4.AuditEventSink/AdapterFactory.cs deleted file mode 100644 index 6c0b487..0000000 --- a/src/RSK.IdentityServer4.AuditEventSink/AdapterFactory.cs +++ /dev/null @@ -1,37 +0,0 @@ -using IdentityServer4.Events; -using RSK.Audit; -using RSK.IdentityServer4.AuditEventSink.Adapters; - -namespace RSK.IdentityServer4.AuditEventSink -{ - public class AdapterFactory : IAdapterFactory - { - public IAuditEventArguments Create(Event evt) - { - if (evt != null) - { - switch (evt) - { - case TokenIssuedSuccessEvent tokenIssuedSuccessEvent: - return new TokenIssuedSuccessEventAdapter(tokenIssuedSuccessEvent); - case UserLoginSuccessEvent userLoginSuccess: - return new UserLoginSuccessEventAdapter(userLoginSuccess); - case UserLoginFailureEvent userLoginFailure: - return new UserLoginFailureEventAdapter(userLoginFailure); - case UserLogoutSuccessEvent userLogoutSuccess: - return new UserLogoutSuccessEventAdapter(userLogoutSuccess); - case ConsentGrantedEvent consentGranted: - return new ConsentGrantedEventAdapter(consentGranted); - case ConsentDeniedEvent consentDenied: - return new ConsentDeniedEventAdapter(consentDenied); - case TokenIssuedFailureEvent tokenIssuedFailure: - return new TokenIssuedFailureEventAdapter(tokenIssuedFailure); - case GrantsRevokedEvent grantsRevoked: - return new GrantsRevokedEventAdapter(grantsRevoked); - } - } - - return null; - } - } -} diff --git a/src/RSK.IdentityServer4.AuditEventSink/Adapters/ConsentDeniedEventAdapter.cs b/src/RSK.IdentityServer4.AuditEventSink/Adapters/ConsentDeniedEventAdapter.cs deleted file mode 100644 index 79b338d..0000000 --- a/src/RSK.IdentityServer4.AuditEventSink/Adapters/ConsentDeniedEventAdapter.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using IdentityServer4.Events; -using RSK.Audit; - -namespace RSK.IdentityServer4.AuditEventSink.Adapters -{ - public class ConsentDeniedEventAdapter : IAuditEventArguments - { - private readonly ConsentDeniedEvent evt; - - public ConsentDeniedEventAdapter(ConsentDeniedEvent evt) - { - this.evt = evt ?? throw new ArgumentNullException(nameof(evt)); - } - - public ResourceActor Actor => new ResourceActor(ResourceActor.UserSubjectType, evt.SubjectId, evt.SubjectId); - public string Action => evt.Name; - public AuditableResource Resource => new AuditableResource("Client", evt.ClientId); - public FormattedString Description => evt.ToString().SafeForFormatted(); - } -} diff --git a/src/RSK.IdentityServer4.AuditEventSink/Adapters/ConsentGrantedEventAdapter.cs b/src/RSK.IdentityServer4.AuditEventSink/Adapters/ConsentGrantedEventAdapter.cs deleted file mode 100644 index e1e2e72..0000000 --- a/src/RSK.IdentityServer4.AuditEventSink/Adapters/ConsentGrantedEventAdapter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using IdentityServer4.Events; -using RSK.Audit; - -namespace RSK.IdentityServer4.AuditEventSink.Adapters -{ - public class ConsentGrantedEventAdapter : IAuditEventArguments - { - private readonly ConsentGrantedEvent evt; - - public ConsentGrantedEventAdapter(ConsentGrantedEvent evt) - { - this.evt = evt; - } - - public ResourceActor Actor => new ResourceActor(ResourceActor.UserSubjectType, evt.SubjectId, evt.SubjectId); - public string Action => evt.Name; - public AuditableResource Resource => new AuditableResource("Client", evt.ClientId); - public FormattedString Description => evt.ToString().SafeForFormatted(); - } -} diff --git a/src/RSK.IdentityServer4.AuditEventSink/Adapters/GrantsRevokedEventAdapter.cs b/src/RSK.IdentityServer4.AuditEventSink/Adapters/GrantsRevokedEventAdapter.cs deleted file mode 100644 index ef33308..0000000 --- a/src/RSK.IdentityServer4.AuditEventSink/Adapters/GrantsRevokedEventAdapter.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using IdentityServer4.Events; -using RSK.Audit; - -namespace RSK.IdentityServer4.AuditEventSink.Adapters -{ - public class GrantsRevokedEventAdapter : IAuditEventArguments - { - private readonly GrantsRevokedEvent evt; - - public GrantsRevokedEventAdapter(GrantsRevokedEvent evt) - { - this.evt = evt ?? throw new ArgumentNullException(nameof(evt)); - } - - public ResourceActor Actor => new ResourceActor(ResourceActor.UserSubjectType, evt.SubjectId, evt.SubjectId); - public string Action => evt.Name; - public AuditableResource Resource => new AuditableResource("Client", evt.ClientId); - public FormattedString Description => evt.ToString().SafeForFormatted(); - } -} diff --git a/src/RSK.IdentityServer4.AuditEventSink/Adapters/TokenIssuedFailureEventAdapter.cs b/src/RSK.IdentityServer4.AuditEventSink/Adapters/TokenIssuedFailureEventAdapter.cs deleted file mode 100644 index a18482a..0000000 --- a/src/RSK.IdentityServer4.AuditEventSink/Adapters/TokenIssuedFailureEventAdapter.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using IdentityServer4.Events; -using RSK.Audit; - -namespace RSK.IdentityServer4.AuditEventSink.Adapters -{ - public class TokenIssuedFailureEventAdapter : IAuditEventArguments - { - private readonly TokenIssuedFailureEvent evt; - - public TokenIssuedFailureEventAdapter(TokenIssuedFailureEvent evt) - { - this.evt = evt ?? throw new ArgumentNullException(nameof(evt)); - } - - public ResourceActor Actor => new ResourceActor(ResourceActor.MachineSubjectType, evt.ClientId, evt.ClientName); - public string Action => evt.Name; - public AuditableResource Resource => new AuditableResource("IdentityServer", evt.Endpoint); - public FormattedString Description => evt.ToString().SafeForFormatted(); - } -} diff --git a/src/RSK.IdentityServer4.AuditEventSink/Adapters/TokenIssuedSuccessEventAdapter.cs b/src/RSK.IdentityServer4.AuditEventSink/Adapters/TokenIssuedSuccessEventAdapter.cs deleted file mode 100644 index eb77e74..0000000 --- a/src/RSK.IdentityServer4.AuditEventSink/Adapters/TokenIssuedSuccessEventAdapter.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using IdentityServer4.Events; -using RSK.Audit; - -namespace RSK.IdentityServer4.AuditEventSink.Adapters -{ - public class TokenIssuedSuccessEventAdapter : IAuditEventArguments - { - private readonly TokenIssuedSuccessEvent evt; - - public TokenIssuedSuccessEventAdapter(TokenIssuedSuccessEvent evt) - { - this.evt = evt ?? throw new ArgumentNullException(nameof(evt)); - } - - public ResourceActor Actor => new ResourceActor(ResourceActor.MachineSubjectType, evt.ClientId, evt.ClientName); - public string Action => evt.Name; - public AuditableResource Resource => new AuditableResource("IdentityServer", evt.Endpoint); - public FormattedString Description => evt.ToString().SafeForFormatted(); - } -} diff --git a/src/RSK.IdentityServer4.AuditEventSink/Adapters/UserLoginFailureEventAdapter.cs b/src/RSK.IdentityServer4.AuditEventSink/Adapters/UserLoginFailureEventAdapter.cs deleted file mode 100644 index f65058a..0000000 --- a/src/RSK.IdentityServer4.AuditEventSink/Adapters/UserLoginFailureEventAdapter.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using IdentityServer4.Events; -using RSK.Audit; - -namespace RSK.IdentityServer4.AuditEventSink.Adapters -{ - public class UserLoginFailureEventAdapter : IAuditEventArguments - { - private readonly UserLoginFailureEvent evt; - - public UserLoginFailureEventAdapter(UserLoginFailureEvent evt) - { - this.evt = evt ?? throw new ArgumentNullException(nameof(evt)); - } - - public ResourceActor Actor => new ResourceActor(ResourceActor.UserSubjectType, evt.Username, evt.Username); - public string Action => evt.Name; - public AuditableResource Resource => new AuditableResource("IdentityServer", evt.Endpoint); - public FormattedString Description => evt.ToString().SafeForFormatted(); - } -} diff --git a/src/RSK.IdentityServer4.AuditEventSink/Adapters/UserLoginSuccessEventAdapter.cs b/src/RSK.IdentityServer4.AuditEventSink/Adapters/UserLoginSuccessEventAdapter.cs deleted file mode 100644 index 369ff5a..0000000 --- a/src/RSK.IdentityServer4.AuditEventSink/Adapters/UserLoginSuccessEventAdapter.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using IdentityServer4.Events; -using RSK.Audit; - -namespace RSK.IdentityServer4.AuditEventSink.Adapters -{ - public class UserLoginSuccessEventAdapter : IAuditEventArguments - { - private readonly UserLoginSuccessEvent evt; - - public UserLoginSuccessEventAdapter(UserLoginSuccessEvent evt) - { - this.evt = evt ?? throw new ArgumentNullException(nameof(evt)); - } - - public ResourceActor Actor => new ResourceActor(ResourceActor.UserSubjectType, evt.SubjectId, evt.DisplayName); - public string Action => evt.Name; - public AuditableResource Resource => new AuditableResource("IdentityServer", evt.Endpoint); - public FormattedString Description => evt.ToString().SafeForFormatted(); - } -} diff --git a/src/RSK.IdentityServer4.AuditEventSink/Adapters/UserLogoutSuccessEventAdapter.cs b/src/RSK.IdentityServer4.AuditEventSink/Adapters/UserLogoutSuccessEventAdapter.cs deleted file mode 100644 index d7bf8b9..0000000 --- a/src/RSK.IdentityServer4.AuditEventSink/Adapters/UserLogoutSuccessEventAdapter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using IdentityServer4.Events; -using RSK.Audit; - -namespace RSK.IdentityServer4.AuditEventSink.Adapters -{ - public class UserLogoutSuccessEventAdapter : IAuditEventArguments - { - private readonly UserLogoutSuccessEvent evt; - - public UserLogoutSuccessEventAdapter(UserLogoutSuccessEvent evt) - { - this.evt = evt; - } - - public ResourceActor Actor => new ResourceActor(ResourceActor.UserSubjectType, evt.SubjectId, evt.DisplayName); - public string Action => evt.Name; - public AuditableResource Resource => new AuditableResource("IdentityServer", string.Empty); - public FormattedString Description => evt.ToString().SafeForFormatted(); - } -} diff --git a/src/RSK.IdentityServer4.AuditEventSink/AuditSink.cs b/src/RSK.IdentityServer4.AuditEventSink/AuditSink.cs deleted file mode 100644 index 608db13..0000000 --- a/src/RSK.IdentityServer4.AuditEventSink/AuditSink.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using IdentityServer4.Events; -using IdentityServer4.Services; -using RSK.Audit; - -[assembly:InternalsVisibleTo("RSK.IdentityServer4.AuditEventSink.Tests")] - -namespace RSK.IdentityServer4.AuditEventSink -{ - public class AuditSink : IEventSink - { - private readonly IRecordAuditableActions auditRecorder; - - internal IAdapterFactory Factory { get; set; } = new AdapterFactory(); - - public AuditSink(IRecordAuditableActions auditRecorder) - { - this.auditRecorder = auditRecorder ?? throw new ArgumentNullException(); - } - - public Task PersistAsync(Event evt) - { - var auditArgument = Factory.Create(evt); - - if (auditArgument != null) - { - if (evt.EventType == EventTypes.Success || evt.EventType == EventTypes.Information) - { - return auditRecorder.RecordSuccess(auditArgument); - } - - return auditRecorder.RecordFailure(auditArgument); - } - - return Task.CompletedTask; - } - } -} diff --git a/src/RSK.IdentityServer4.AuditEventSink/EventSinkAgregator.cs b/src/RSK.IdentityServer4.AuditEventSink/EventSinkAgregator.cs deleted file mode 100644 index ed35dbd..0000000 --- a/src/RSK.IdentityServer4.AuditEventSink/EventSinkAgregator.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using IdentityServer4.Events; -using IdentityServer4.Services; -using Microsoft.Extensions.Logging; - -namespace RSK.IdentityServer4.AuditEventSink -{ - public class EventSinkAggregator : IEventSink - { - private readonly ILogger logger; - public List EventSinks { get; set; } = new List(); - - public EventSinkAggregator(ILogger logger) - { - this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); - } - - public Task PersistAsync(Event evt) - { - var eventSinkTasks = new List(); - - foreach (var eventSink in EventSinks) - { - eventSinkTasks.Add(ProtectedExecution(() => eventSink.PersistAsync(evt))); - } - - return Task.WhenAll(eventSinkTasks); - } - - private async Task ProtectedExecution(Func persistAsync) - { - try - { - await persistAsync(); - } - catch (Exception e) - { - logger.Log(LogLevel.Error, e.Message); - } - } - } -} diff --git a/src/RSK.IdentityServer4.AuditEventSink/IAdapterFactory.cs b/src/RSK.IdentityServer4.AuditEventSink/IAdapterFactory.cs deleted file mode 100644 index 05ff2aa..0000000 --- a/src/RSK.IdentityServer4.AuditEventSink/IAdapterFactory.cs +++ /dev/null @@ -1,10 +0,0 @@ -using IdentityServer4.Events; -using RSK.Audit; - -namespace RSK.IdentityServer4.AuditEventSink -{ - public interface IAdapterFactory - { - IAuditEventArguments Create(Event evt); - } -} \ No newline at end of file diff --git a/src/RSK.IdentityServer4.AuditEventSink/RSK.IdentityServer4.AuditEventSink.csproj b/src/RSK.IdentityServer4.AuditEventSink/RSK.IdentityServer4.AuditEventSink.csproj deleted file mode 100644 index b5e3581..0000000 --- a/src/RSK.IdentityServer4.AuditEventSink/RSK.IdentityServer4.AuditEventSink.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - net8.0;net9.0;net10.0 - Rock Solid Knowledge Ltd - IdentityServer4 event sink to add audit records into AdminUI auditing - https://github.com/RockSolidKnowledge/RSK.IdentityServer4.AuditEventSink - Upgrade to .NET 10 - Copyright 2021 (c) Rock Solid Knowledge Ltd. All rights reserved - Audit AdminUI IdentityServer Events - true - icon.png - Apache-2.0 - 2.0.0 - - - - - - - - - - - - diff --git a/src/RSK.IdentityServer4.AuditEventSink/StringExtention.cs b/src/RSK.IdentityServer4.AuditEventSink/StringExtention.cs deleted file mode 100644 index ff09f81..0000000 --- a/src/RSK.IdentityServer4.AuditEventSink/StringExtention.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace RSK.IdentityServer4.AuditEventSink -{ - public static class StringExtension - { - public static string SafeForFormatted(this string value) - { - return value.Replace("{", "{{").Replace("}", "}}"); - } - } -} diff --git a/src/Rsk.Audit.EF/Rsk.Audit.EF.csproj b/src/Rsk.Audit.EF/Rsk.Audit.EF.csproj index 2ab896f..530aa85 100644 --- a/src/Rsk.Audit.EF/Rsk.Audit.EF.csproj +++ b/src/Rsk.Audit.EF/Rsk.Audit.EF.csproj @@ -1,20 +1,19 @@ - + - net8.0;net9.0;net10.0 + net10.0 RSK.Audit.EF Rock Solid Knowledge Ltd Provides audting API to record audit records and query api to find audit records with EntityFramework Core - https://www.identityserver.com/products/adminui - https://www.identityserver.com/downloads/adminui - Copyright 2022 (c) Rock Solid Knowledge Ltd. All rights reserved. + https://github.com/RockSolidKnowledge/Audit + Copyright 2026 (c) Rock Solid Knowledge Ltd. All rights reserved. Audit AdminUI IdentityServer EntityFramework true true icon.png Apache-2.0 RSK.Audit.EF - 3.0.0 + 4.0.0 @@ -22,16 +21,8 @@ 1591 - - - - - - - - - - + + diff --git a/src/Rsk.Audit/Rsk.Audit.csproj b/src/Rsk.Audit/Rsk.Audit.csproj index b7596d2..14a8612 100644 --- a/src/Rsk.Audit/Rsk.Audit.csproj +++ b/src/Rsk.Audit/Rsk.Audit.csproj @@ -1,38 +1,29 @@ - + - net8.0;net9.0;net10.0 + net10.0 RSK.Audit Rock Solid Knowledge Ltd RSK.Audit Provides audting API to record audit records and query api to find audit records - https://www.identityserver.com/products/adminui - https://www.identityserver.com/downloads/adminui - Copyright 2022 (c) Rock Solid Knowledge Ltd. All rights reserved. + https://github.com/RockSolidKnowledge/Audit + Copyright 2026 (c) Rock Solid Knowledge Ltd. All rights reserved. Audit AdminUI IdentityServer true true icon.png Apache-2.0 RSK.Audit - 3.0.0 + 4.0.0 1591 - - - - - - - - - - + + diff --git a/src/Rsk.DuendeIdentityServer.AuditEventSink/Rsk.DuendeIdentityServer.AuditEventSink.csproj b/src/Rsk.DuendeIdentityServer.AuditEventSink/Rsk.DuendeIdentityServer.AuditEventSink.csproj index d0d49b1..8924bd9 100644 --- a/src/Rsk.DuendeIdentityServer.AuditEventSink/Rsk.DuendeIdentityServer.AuditEventSink.csproj +++ b/src/Rsk.DuendeIdentityServer.AuditEventSink/Rsk.DuendeIdentityServer.AuditEventSink.csproj @@ -1,22 +1,23 @@  - net8.0;net9.0;net10.0 + net10.0 Rock Solid Knowledge Ltd Duende IdentityServer event sink to add audit records into AdminUI auditing - https://github.com/RockSolidKnowledge/RSK.IdentityServer4.AuditEventSink - Add event extensibility + https://github.com/RockSolidKnowledge/Audit Copyright 2026 (c) Rock Solid Knowledge Ltd. All rights reserved Audit AdminUI IdentityServer Events true icon.png Apache-2.0 - 4.1.0 + 5.0.0 - - + + + + diff --git a/templates/publish-nuget.yml b/templates/publish-nuget.yml new file mode 100644 index 0000000..7407bf2 --- /dev/null +++ b/templates/publish-nuget.yml @@ -0,0 +1,34 @@ +parameters: + - name: toLive + type: boolean + default: false + - name: artifact + type: string + default: 'Nupkg' + - name: packageToPublish + type: string + +steps: + - task: UseDotNet@2 + inputs: + packageType: 'sdk' + version: '10.0.x' + + - download: current + displayName: 'Download NuGet Artifact' + artifact: '${{ parameters.artifact }}' + + - ${{ if eq(parameters.toLive, true) }}: + - bash: | + dotnet nuget push ${{ parameters.packageToPublish }} --source https://api.nuget.org/v3/index.json --api-key $(NuGetPackagePushKey) + displayName: 'Publish Release Nuget Package' + + - ${{ if eq(parameters.toLive, false) }}: + - task: DotNetCoreCLI@2 + displayName: 'Publish NuGet to RSKTools' + inputs: + command: 'push' + arguments: '--skip-duplicate' + packagesToPush: '${{ parameters.packageToPublish }}' + nuGetFeedType: 'internal' + publishVstsFeed: '75d50f4c-8a7b-4618-b9de-bae4820efa8f' \ No newline at end of file diff --git a/tests/Rsk.Audit.Tests.Common/Rsk.Audit.Tests.Common.csproj b/tests/Rsk.Audit.Tests.Common/Rsk.Audit.Tests.Common.csproj index 7b37d1b..8cf9e68 100644 --- a/tests/Rsk.Audit.Tests.Common/Rsk.Audit.Tests.Common.csproj +++ b/tests/Rsk.Audit.Tests.Common/Rsk.Audit.Tests.Common.csproj @@ -1,7 +1,7 @@ - net8.0;net9.0;net10.0 + net10.0 diff --git a/tests/Rsk.Audit.Tests.Integration/Rsk.Audit.Tests.Integration.csproj b/tests/Rsk.Audit.Tests.Integration/Rsk.Audit.Tests.Integration.csproj index 6ea67ea..7f36c45 100644 --- a/tests/Rsk.Audit.Tests.Integration/Rsk.Audit.Tests.Integration.csproj +++ b/tests/Rsk.Audit.Tests.Integration/Rsk.Audit.Tests.Integration.csproj @@ -1,16 +1,16 @@ - net8.0;net9.0;net10.0 + net10.0 false - + - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -21,15 +21,15 @@ - + - + - + diff --git a/tests/Rsk.Audit.Tests/Rsk.Audit.Tests.csproj b/tests/Rsk.Audit.Tests/Rsk.Audit.Tests.csproj index 1d34b74..6ab1849 100644 --- a/tests/Rsk.Audit.Tests/Rsk.Audit.Tests.csproj +++ b/tests/Rsk.Audit.Tests/Rsk.Audit.Tests.csproj @@ -1,29 +1,29 @@  - - net8.0;net9.0;net10.0 - false - + + net10.0 + false + - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + - - - - - + + + + + diff --git a/tests/Rsk.DuendeIdentityServer.AuditEventSink.Tests/AdapterFactoryTests.cs b/tests/Rsk.DuendeIdentityServer.AuditEventSink.Tests/AdapterFactoryTests.cs index 7c9de0d..c94ce5e 100644 --- a/tests/Rsk.DuendeIdentityServer.AuditEventSink.Tests/AdapterFactoryTests.cs +++ b/tests/Rsk.DuendeIdentityServer.AuditEventSink.Tests/AdapterFactoryTests.cs @@ -4,7 +4,7 @@ using Duende.IdentityServer.Models; using Duende.IdentityServer.ResponseHandling; using Duende.IdentityServer.Validation; -using IdentityModel; +using Duende.IdentityModel; using Rsk.DuendeIdentityServer.AuditEventSink.Adapters; using Xunit; diff --git a/tests/Rsk.DuendeIdentityServer.AuditEventSink.Tests/Rsk.DuendeIdentityServer.AuditEventSink.Tests.csproj b/tests/Rsk.DuendeIdentityServer.AuditEventSink.Tests/Rsk.DuendeIdentityServer.AuditEventSink.Tests.csproj index 52125b9..0fb495a 100644 --- a/tests/Rsk.DuendeIdentityServer.AuditEventSink.Tests/Rsk.DuendeIdentityServer.AuditEventSink.Tests.csproj +++ b/tests/Rsk.DuendeIdentityServer.AuditEventSink.Tests/Rsk.DuendeIdentityServer.AuditEventSink.Tests.csproj @@ -1,15 +1,18 @@ - net8.0;net9.0;net10.0 + net10.0 false - - - - + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/tests/Rsk.IdentityServer4.AuditEventSink.Tests/AdapterFactoryTests.cs b/tests/Rsk.IdentityServer4.AuditEventSink.Tests/AdapterFactoryTests.cs deleted file mode 100644 index 2210e2a..0000000 --- a/tests/Rsk.IdentityServer4.AuditEventSink.Tests/AdapterFactoryTests.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Security.Claims; -using IdentityModel; -using IdentityServer4.Events; -using IdentityServer4.Models; -using IdentityServer4.ResponseHandling; -using IdentityServer4.Validation; -using RSK.IdentityServer4.AuditEventSink.Adapters; -using Xunit; - -namespace RSK.IdentityServer4.AuditEventSink.Tests -{ - public class AdapterFactoryTests - { - [Fact] - public void Create_WhenTokenIssuedSuccessEvent_WillReturnTokenIssuedSuccessEventAdapter() - { - // Arrange - var authResponse = new AuthorizeResponse() - { - Request = new ValidatedAuthorizeRequest() - { - Client = new Client(), - Subject = new ClaimsPrincipal(new ClaimsIdentity(new List() - { - new Claim(JwtClaimTypes.Subject, string.Empty) - })) - } - }; - - var evt = new TokenIssuedSuccessEvent(authResponse); - - var sut = new AdapterFactory(); - - // Act - var adapter = sut.Create(evt); - - // Assert - Assert.IsType(adapter); - } - - [Fact] - public void Create_WhenConsentGrantedEvent_WillReturnConsentGrantedEventAdapter() - { - // Arrange - var evt = new ConsentGrantedEvent(string.Empty, string.Empty, new List(), new List(), false); - - var sut = new AdapterFactory(); - - // Act - var adapter = sut.Create(evt); - - // Assert - Assert.IsType(adapter); - } - - [Fact] - public void Create_WhenUserLoginFailureEvent_WillReturnUserLoginFailureAdapter() - { - // Arrange - var evt = new UserLoginFailureEvent(string.Empty, string.Empty); - - var sut = new AdapterFactory(); - - // Act - var adapter = sut.Create(evt); - - // Assert - Assert.IsType(adapter); - } - - [Fact] - public void Create_WhenUserLoginSuccessEvent_WillReturnUserLoginSuccessAdapter() - { - // Arrange - var evt = new UserLoginSuccessEvent(string.Empty, string.Empty, string.Empty, string.Empty); - - var sut = new AdapterFactory(); - - // Act - var adapter = sut.Create(evt); - - // Assert - Assert.IsType(adapter); - } - - [Fact] - public void Create_WhenUserLogoutSuccessEvent_WillReturnUserLogoutSuccessAdapter() - { - // Arrange - var evt = new UserLogoutSuccessEvent(string.Empty, string.Empty); - - var sut = new AdapterFactory(); - - // Act - var adapter = sut.Create(evt); - - // Assert - Assert.IsType(adapter); - } - - [Fact] - public void Create_WhenConsentDeniedEvent_WillReturnConsentDeniedAdapter() - { - // Arrange - var evt = new ConsentDeniedEvent(string.Empty, string.Empty, new string[] { }); - - var sut = new AdapterFactory(); - - // Act - var adapter = sut.Create(evt); - - // Assert - Assert.IsType(adapter); - } - - [Fact] - public void Create_WhenTokenIssuedFailureEvent_WillReturnTokenIssuedFailureAdapter() - { - // Arrange - var request = new ValidatedAuthorizeRequest() - { - Client = new Client(), - Subject = new ClaimsPrincipal(new ClaimsIdentity(new List() - { - new Claim(JwtClaimTypes.Subject, string.Empty) - })) - }; - - var evt = new TokenIssuedFailureEvent(request, string.Empty, string.Empty); - - var sut = new AdapterFactory(); - - // Act - var adapter = sut.Create(evt); - - // Assert - Assert.IsType(adapter); - } - - [Fact] - public void Create_WhenGrantsRevokedEvent_WillReturnGrantsRevokedAdapter() - { - // Arrange - var evt = new GrantsRevokedEvent(string.Empty, string.Empty); - - var sut = new AdapterFactory(); - - // Act - var adapter = sut.Create(evt); - - // Assert - Assert.IsType(adapter); - } - } -} diff --git a/tests/Rsk.IdentityServer4.AuditEventSink.Tests/AuditSinkTests.cs b/tests/Rsk.IdentityServer4.AuditEventSink.Tests/AuditSinkTests.cs deleted file mode 100644 index 71ea8ce..0000000 --- a/tests/Rsk.IdentityServer4.AuditEventSink.Tests/AuditSinkTests.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System.Threading.Tasks; -using IdentityServer4.Events; -using Moq; -using RSK.Audit; -using Xunit; - -namespace RSK.IdentityServer4.AuditEventSink.Tests -{ - public class AuditSinkTests - { - [Fact] - public async Task PersistAsync_WhenSuccessEvent_WillCallSuccessAuditRecord() - { - // Arrange - var recorder = new Mock(); - var factory = new Mock(); - factory.Setup(x => x.Create(It.IsAny())).Returns(new Mock().Object); - - var sut = new AuditSink(recorder.Object) {Factory = factory.Object}; - - - var successfulEvent = new StubEvent(string.Empty, string.Empty, EventTypes.Success, -1); - - // Act - await sut.PersistAsync(successfulEvent); - - // Assert - recorder.Verify(x => x.RecordSuccess(It.IsAny()), Times.Once); - } - - [Fact] - public async Task PersistAsync_WhenInformationEvent_WillCallSuccessAuditRecord() - { - // Arrange - var recorder = new Mock(); - var factory = new Mock(); - factory.Setup(x => x.Create(It.IsAny())).Returns(new Mock().Object); - - var sut = new AuditSink(recorder.Object) { Factory = factory.Object }; - - - var successfulEvent = new StubEvent(string.Empty, string.Empty, EventTypes.Information, -1); - - // Act - await sut.PersistAsync(successfulEvent); - - // Assert - recorder.Verify(x => x.RecordSuccess(It.IsAny()), Times.Once); - } - - [Fact] - public async Task PersistAsync_WhenErrorEvent_WillCallFailureAuditRecord() - { - // Arrange - var recorder = new Mock(); - var factory = new Mock(); - factory.Setup(x => x.Create(It.IsAny())).Returns(new Mock().Object); - - var sut = new AuditSink(recorder.Object) { Factory = factory.Object }; - - - var successfulEvent = new StubEvent(string.Empty, string.Empty, EventTypes.Error, -1); - - // Act - await sut.PersistAsync(successfulEvent); - - // Assert - recorder.Verify(x => x.RecordFailure(It.IsAny()), Times.Once); - } - - [Fact] - public async Task PersistAsync_WhenFailureEvent_WillCallFailureAuditRecord() - { - // Arrange - var recorder = new Mock(); - var factory = new Mock(); - factory.Setup(x => x.Create(It.IsAny())).Returns(new Mock().Object); - - var sut = new AuditSink(recorder.Object) { Factory = factory.Object }; - - - var successfulEvent = new StubEvent(string.Empty, string.Empty, EventTypes.Failure, -1); - - // Act - await sut.PersistAsync(successfulEvent); - - // Assert - recorder.Verify(x => x.RecordFailure(It.IsAny()), Times.Once); - } - - private class StubEvent : Event - { - public StubEvent(string category, string name, EventTypes type, int id, string message = null) : base(category, name, type, id, message) - { - } - } - } -} diff --git a/tests/Rsk.IdentityServer4.AuditEventSink.Tests/EventSinkAggregatorTests.cs b/tests/Rsk.IdentityServer4.AuditEventSink.Tests/EventSinkAggregatorTests.cs deleted file mode 100644 index 2b071d1..0000000 --- a/tests/Rsk.IdentityServer4.AuditEventSink.Tests/EventSinkAggregatorTests.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.Threading.Tasks; -using IdentityServer4.Events; -using IdentityServer4.Services; -using Microsoft.Extensions.Logging; -using Moq; -using Xunit; - -namespace RSK.IdentityServer4.AuditEventSink.Tests -{ - public class EventSinkAggregatorTests - { - [Fact] - public async Task PersistAsync_WhenCalledWithMultiEventSinks_WillRaiseWithAll() - { - // Arrange - var sink1 = new StubSink(); - var sink2 = new StubSink(); - - var sut = new EventSinkAggregator(new Mock().Object); - - sut.EventSinks.Add(sink1); - sut.EventSinks.Add(sink2); - - // Act - await sut.PersistAsync(new StubEvent()); - - // Assert - Assert.Equal(1, sink1.WasCalled); - Assert.Equal(1, sink2.WasCalled); - } - - [Fact] - public async Task PersistAsync_WhenCalledWithMultiEventSinksAndOneThrowsAnException_WillRaiseToAllEventSinks() - { - // Arrange - var sink1 = new StubSink(); - var sink2 = new StubSink(); - var sink3 = new StubSinkThrowsException(); - - var logger = new StubLogger(); - - var sut = new EventSinkAggregator(logger); - - sut.EventSinks.Add(sink1); - sut.EventSinks.Add(sink2); - sut.EventSinks.Add(sink3); - - // Act - await sut.PersistAsync(new StubEvent()); - - // Assert - Assert.Equal(1, sink1.WasCalled); - Assert.Equal(1, sink2.WasCalled); - Assert.Equal(1, sink3.WasCalled); - Assert.Equal(1, logger.TimesErrored); - } - - private class StubSink : IEventSink - { - public int WasCalled { get; private set; } - - public Task PersistAsync(Event evt) - { - WasCalled++; - return Task.CompletedTask; - } - } - - private class StubSinkThrowsException : IEventSink - { - public int WasCalled { get; private set; } - - public Task PersistAsync(Event evt) - { - WasCalled++; - throw new Exception("Blah"); - } - } - - private class StubEvent : Event - { - public StubEvent() : base(string.Empty, string.Empty, EventTypes.Failure, 0) - { - } - } - - private class StubLogger : ILogger - { - public int TimesErrored = 0; - - public IDisposable BeginScope(TState state) - { - throw new NotImplementedException(); - } - - public bool IsEnabled(LogLevel logLevel) => true; - - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) - { - if (logLevel == LogLevel.Error) TimesErrored++; - } - } - } -} diff --git a/tests/Rsk.IdentityServer4.AuditEventSink.Tests/RSK.IdentityServer4.AuditEventSink.Tests.csproj b/tests/Rsk.IdentityServer4.AuditEventSink.Tests/RSK.IdentityServer4.AuditEventSink.Tests.csproj deleted file mode 100644 index 8f504d1..0000000 --- a/tests/Rsk.IdentityServer4.AuditEventSink.Tests/RSK.IdentityServer4.AuditEventSink.Tests.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - net8.0;net9.0;net10.0 - false - - - - - - - - - - - - - -