Skip to content

Post Connect-a-thon catch up#40

Merged
JoeShook merged 60 commits into
udap-tools:mainfrom
JoeShook:main
Apr 30, 2026
Merged

Post Connect-a-thon catch up#40
JoeShook merged 60 commits into
udap-tools:mainfrom
JoeShook:main

Conversation

@JoeShook

Copy link
Copy Markdown
Collaborator

See PRs in https://github.com/JoeShook/udap-dotnet for history.

Joe Shook and others added 30 commits March 22, 2026 15:22
…cilitated-FHIR-Implementation

Item 1: TEFCA Certification JWT

  - TefcaCertificationDocument.cs in Udap.Tefca.Model — subclass of UdapCertificationAndEndorsementDocument that:
    - Defaults certification_name to "TEFCA Basic App Certification"
    - Defaults certification_uris to the RCE basic-app-certification URI
    - Adds exchange_purposes and home_community_id properties
    - Overrides SerializeToJson() to include the TEFCA-specific claims
    - Works with existing SignedSoftwareStatementBuilder<T> for signing

  Item 2: TEFCA Error Extension

  - TEFCAAuthorizationErrorExtension.cs in Udap.Tefca.Model — model with consent_required and consent_form
  - Generic plumbing in Udap.Server:
    - AuthorizationExtensionValidationResult.ErrorExtensions — dictionary for carrying custom error data
    - UdapCustomTokenRequestValidator — stores error extensions in HttpContext.Items when validation fails
    - UdapTokenResponseMiddleware — injects extensions JSON object into error responses

  A custom IUdapAuthorizationExtensionValidator implementation (which a TEFCA server would register) can now return error
  extensions like:
  return AuthorizationExtensionValidationResult.Failure(
      "invalid_grant",
      "Consent policy required",
      new Dictionary<string, object>
      {
          ["hl7-b2b"] = new TEFCAAuthorizationErrorExtension
          {
              ConsentRequired = ["urn:oid:2.16.840.1.113883.3.7204.1.1.1.1.2.1"]
          }
      });
…tration and token issuance

Introduces ICommunityRegistrationValidator and ICommunityTokenValidator interfaces in Udap.Server that enable community-specific validation without hardcoding profile logic into core packages. Implementations are registered as DI collections, following the same pattern as IAuthorizationExtensionDeserializer.

  New Udap.Tefca.Server project provides TEFCA implementations:
  - TefcaRegistrationValidator: validates that the client certificate SAN URI contains a valid TEFCA Exchange Purpose (XP) code per SOP v2.0 Section 6.11 #5a
  - TefcaTokenValidator: enforces that the hl7-b2b purpose_of_use matches the exchange purpose from the client's registered SAN URI

  Pipeline changes:
  - ChainValidationResult now carries CommunityName from the matched trust anchor
  - UdapDynamicClientRegistrationEndpoint calls community registration validators after core validation succeeds, before persisting the client
  - DefaultUdapAuthorizationExtensionValidator calls community token validators after purpose_of_use validation completes
  - UdapAuthorizationExtensionValidationContext gains SanUri and CommunityName properties
  - TEFCAIASAuthorizationExtension.GetPurposeOfUse() now returns actual value instead of null

  Also:
  - Wires AddUdapTefcaExtensions() and AddUdapTefcaValidation() into Udap.Auth.Server
  - Adds Udap.Tefca.Server pack and push to release and prerelease CI workflows
  - 26 unit tests covering valid/invalid XP codes, matching/mismatching purpose_of_use, edge cases, and non-TEFCA community regression
…edentialsExtensionsRequired, and AuthorizationCodeExtensionsRequired properties. These can no longer be set via appsettings.

All this logic is in implemented in ICommunityTokenValidators
Planning what it would take to move to a API that is a free alternative to Duende Identity Server.
…erties so per-community values in JSON config are now deserialized
Created Claud skill for turning a full zip FHIR IG download into an AI friendly content.
Udap.Model changes:
  - AccessTokenRequestForAuthorizationCodeBuilder — changed _certificate to _certificates (list), added Create(clientId, tokenEndpoint, List<X509Certificate2>, redirectUri, code)
  overload, single-cert Create wraps in a list, BuildClientAssertion passes the list to SignedSoftwareStatementBuilder
  - AccessTokenRequestForClientCredentialsBuilder — same pattern

  Tests added (AccessTokenTests.cs):
  - ClientCredentials_WithCertificateChain_IncludesMultipleX5cEntries — uses real SureFhirLabs_Intermediate.cer, verifies 2 x5c entries
  - AuthorizationCode_WithCertificateChain_IncludesMultipleX5cEntries — same with auth code builder
  - ClientCredentials_SingleCert_StillWorks — verifies backward compatibility
  - AuthorizationCode_SingleCert_StillWorks — same
JoeShook and others added 29 commits April 12, 2026 09:57
Using MS Aspire to orchestrate.
…re status

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fix copy-paste title errors, fill empty placeholder docs, remove stale
references to UdapEd (now separate repo), update API names and feature
descriptions to match current codebase.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…roviders, project renames

- Add Hangfire with PostgreSQL storage for job scheduling
- Replace custom Job/JobExecution entities with Hangfire's built-in storage
- Add CrlGenerationService with local PFX and remote signing (ISigningProvider) support
- Add CrlAutoRenewalJob (recurring, configurable cron via UI or appsettings)
- Add Jobs page with recurring job management (edit cron, run now) and CRL status grouped by community
- Add IPublishingProvider interface with domain-based URL routing via PublishingCoordinator
- Add Sigil.FileSystem publisher (writes CRL/cert files to disk)
- Add Sigil.Gcp publisher (uploads to GCS bucket)
- Add Sigil.Certificate.Server (static file server for CRLs/certs, modeled after Udap.Certificates.Server)
- Rename Sigil.Vault.Transit -> Sigil.Vault, merge Sigil.Gcp.Kms + Sigil.Gcp.Publisher -> Sigil.Gcp
- Add RevocationReason to IssuedCertificate entity
- Update Dockerfiles for renamed projects

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bumps [dotnet-sdk](https://github.com/dotnet/sdk) from 10.0.104 to 10.0.202.
- [Release notes](https://github.com/dotnet/sdk/releases)
- [Commits](https://github.com/dotnet/sdk/commits)

---
updated-dependencies:
- dependency-name: dotnet-sdk
  dependency-version: 10.0.202
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
- CA certificate revocation with IsRevoked/RevokedAt/RevocationReason fields
- Revoke UI in CertificateExplorer with reason code selection and automatic CRL regeneration
- CRL generation now includes revoked child CAs in parent CRL
- Community BaseUrl for {BaseUrl} token expansion in certificate template URLs
- Communities page edit dialog for Name/Description/BaseUrl
- Fix re-key dialog not pre-filling subject DN for intermediate certificates
- Improve PublishingCoordinator logging when no provider matches a domain
- Update .NET SDK to 10.0.202
Bumps OpenTelemetry from 1.15.0 to 1.15.3
Bumps OpenTelemetry.Exporter.OpenTelemetryProtocol from 1.15.0 to 1.15.3

---
updated-dependencies:
- dependency-name: OpenTelemetry
  dependency-version: 1.15.3
  dependency-type: direct:production
  dependency-group: nuget
- dependency-name: OpenTelemetry.Exporter.OpenTelemetryProtocol
  dependency-version: 1.15.3
  dependency-type: direct:production
  dependency-group: nuget
...

Signed-off-by: dependabot[bot] <support@github.com>
…Auth.Server/nuget-02b6c62f1f

Bump the nuget group with 2 updates
…otnet-sdk-10.0.202

Bump dotnet-sdk from 10.0.104 to 10.0.202
Bumps OpenTelemetry from 1.15.0 to 1.15.3
Bumps OpenTelemetry.Exporter.OpenTelemetryProtocol from 1.15.0 to 1.15.3

---
updated-dependencies:
- dependency-name: OpenTelemetry
  dependency-version: 1.15.3
  dependency-type: direct:production
  dependency-group: nuget
- dependency-name: OpenTelemetry.Exporter.OpenTelemetryProtocol
  dependency-version: 1.15.3
  dependency-type: direct:production
  dependency-group: nuget
- dependency-name: OpenTelemetry
  dependency-version: 1.15.3
  dependency-type: direct:production
  dependency-group: nuget
- dependency-name: OpenTelemetry.Exporter.OpenTelemetryProtocol
  dependency-version: 1.15.3
  dependency-type: direct:production
  dependency-group: nuget
...

Signed-off-by: dependabot[bot] <support@github.com>
…mprovements

- Similar button clones cert metadata into issuance dialog for quick reissue
- AutoRenew flag on CA and issued certs to exclude from Hangfire auto-renewal
- Cross-algorithm signing: RSA CA can now sign ECDSA child certs (X509SignatureGenerator)
- ECDSA template UX: curve auto-sets hash algorithm, hides redundant dropdown
- Template clone opens editor instead of saving immediately
- Preserve user-entered data (subject DN, SANs) when switching templates
- Ensure issuing CA cert/CRL published before endpoint URL validation
- Import area close button, template dropdown reflects programmatic selection
- Visual separation for CRL/AIA resolution labels, revocation date in local time
- Roadmap: planned rename of Community to Trust Domain

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…orage

- New TimeDisplayService with event notification for live UI updates
- Settings gear icon in header opens popover with theme and timezone toggles
- All date displays across Dashboard, Certificate Explorer, and Jobs use the service
- Preference persisted to browser localStorage, survives page reloads
- Click-away dismissal for settings popover

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…Identity.Provider.2/nuget-d65c606cf2

Bump the nuget group with 2 updates
The examples/Udap.CA directory was renamed to examples/CA (Sigil) and
does not need the host.docker.internal.pfx SSL certificate.
Implement TEFCA authorization extension and community validation features
@JoeShook JoeShook merged commit 5a2ea4e into udap-tools:main Apr 30, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant