using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Reflection; namespace StellaOps.Auth.Abstractions; /// /// Canonical scope names supported by StellaOps services. /// public static class StellaOpsScopes { /// /// Scope required to trigger Concelier jobs. /// public const string ConcelierJobsTrigger = "concelier.jobs.trigger"; /// /// Scope required to manage Concelier merge operations. /// public const string ConcelierMerge = "concelier.merge"; /// /// Scope granting administrative access to Authority user management. /// public const string AuthorityUsersManage = "authority.users.manage"; /// /// Scope granting administrative access to Authority client registrations. /// public const string AuthorityClientsManage = "authority.clients.manage"; /// /// Scope granting read-only access to Authority audit logs. /// public const string AuthorityAuditRead = "authority.audit.read"; /// /// Synthetic scope representing trusted network bypass. /// public const string Bypass = "stellaops.bypass"; /// /// Scope granting read-only access to console UX features. /// public const string UiRead = "ui.read"; /// /// Scope granting permission to approve exceptions. /// public const string ExceptionsApprove = "exceptions:approve"; /// /// Scope granting read-only access to raw advisory ingestion data. /// public const string AdvisoryRead = "advisory:read"; /// /// Scope granting write access for raw advisory ingestion. /// public const string AdvisoryIngest = "advisory:ingest"; /// /// Scope granting read-only access to Advisory AI artefacts (summaries, remediation exports). /// public const string AdvisoryAiView = "advisory-ai:view"; /// /// Scope permitting Advisory AI inference requests and workflow execution. /// public const string AdvisoryAiOperate = "advisory-ai:operate"; /// /// Scope granting administrative control over Advisory AI configuration and profiles. /// public const string AdvisoryAiAdmin = "advisory-ai:admin"; /// /// Scope granting read-only access to raw VEX ingestion data. /// public const string VexRead = "vex:read"; /// /// Scope granting write access for raw VEX ingestion. /// public const string VexIngest = "vex:ingest"; /// /// Scope granting permission to execute aggregation-only contract verification. /// public const string AocVerify = "aoc:verify"; /// /// Scope granting read-only access to reachability signals. /// public const string SignalsRead = "signals:read"; /// /// Scope granting permission to write reachability signals. /// public const string SignalsWrite = "signals:write"; /// /// Scope granting administrative access to reachability signal ingestion. /// public const string SignalsAdmin = "signals:admin"; /// /// Scope granting permission to seal or unseal an installation in air-gapped mode. /// public const string AirgapSeal = "airgap:seal"; /// /// Scope granting permission to import offline bundles while in air-gapped mode. /// public const string AirgapImport = "airgap:import"; /// /// Scope granting read-only access to air-gap status and sealing state endpoints. /// public const string AirgapStatusRead = "airgap:status:read"; /// /// Scope granting permission to create or edit policy drafts. /// public const string PolicyWrite = "policy:write"; /// /// Scope granting permission to author Policy Studio workspaces. /// public const string PolicyAuthor = "policy:author"; /// /// Scope granting permission to edit policy configurations. /// public const string PolicyEdit = "policy:edit"; /// /// Scope granting read-only access to policy metadata. /// public const string PolicyRead = "policy:read"; /// /// Scope granting permission to review Policy Studio drafts. /// public const string PolicyReview = "policy:review"; /// /// Scope granting permission to submit drafts for review. /// public const string PolicySubmit = "policy:submit"; /// /// Scope granting permission to approve or reject policies. /// public const string PolicyApprove = "policy:approve"; /// /// Scope granting permission to operate Policy Studio promotions and runs. /// public const string PolicyOperate = "policy:operate"; /// /// Scope granting permission to publish approved policy versions with attested artefacts. /// public const string PolicyPublish = "policy:publish"; /// /// Scope granting permission to promote policy attestations between environments. /// public const string PolicyPromote = "policy:promote"; /// /// Scope granting permission to audit Policy Studio activity. /// public const string PolicyAudit = "policy:audit"; /// /// Scope granting permission to trigger policy runs and activation workflows. /// public const string PolicyRun = "policy:run"; /// /// Scope granting permission to activate policies. /// public const string PolicyActivate = "policy:activate"; /// /// Scope granting read-only access to effective findings materialised by Policy Engine. /// public const string FindingsRead = "findings:read"; /// /// Scope granting permission to run Policy Studio simulations. /// public const string PolicySimulate = "policy:simulate"; /// /// Scope granted to Policy Engine service identity for writing effective findings. /// public const string EffectiveWrite = "effective:write"; /// /// Scope granting read-only access to graph queries and overlays. /// public const string GraphRead = "graph:read"; /// /// Scope granting read-only access to Vuln Explorer resources and permalinks. /// [Obsolete("Use vuln:view (StellaOpsScopes.VulnView) instead.")] public const string VulnRead = "vuln:read"; /// /// Scope granting read-only access to Vuln Explorer findings, reports, and dashboards. /// public const string VulnView = "vuln:view"; /// /// Scope permitting triage actions (assign, comment, annotate) within Vuln Explorer. /// public const string VulnInvestigate = "vuln:investigate"; /// /// Scope permitting state-changing operations (status transitions, remediation workflows) within Vuln Explorer. /// public const string VulnOperate = "vuln:operate"; /// /// Scope permitting access to Vuln Explorer audit exports and immutable ledgers. /// public const string VulnAudit = "vuln:audit"; /// /// Scope granting read-only access to observability dashboards and overlays. /// public const string ObservabilityRead = "obs:read"; /// /// Scope granting read-only access to incident timelines and chronology data. /// public const string TimelineRead = "timeline:read"; /// /// Scope granting permission to append events to incident timelines. /// public const string TimelineWrite = "timeline:write"; /// /// Scope granting permission to create evidence packets in the evidence locker. /// public const string EvidenceCreate = "evidence:create"; /// /// Scope granting read-only access to stored evidence packets. /// public const string EvidenceRead = "evidence:read"; /// /// Scope granting permission to place or release legal holds on evidence packets. /// public const string EvidenceHold = "evidence:hold"; /// /// Scope granting read-only access to attestation records and observer feeds. /// public const string AttestRead = "attest:read"; /// /// Scope granting permission to activate or resolve observability incident mode controls. /// public const string ObservabilityIncident = "obs:incident"; /// /// Scope granting read-only access to export center runs and bundles. /// public const string ExportViewer = "export.viewer"; /// /// Scope granting permission to operate export center scheduling and run execution. /// public const string ExportOperator = "export.operator"; /// /// Scope granting administrative control over export center retention, encryption keys, and scheduling policies. /// public const string ExportAdmin = "export.admin"; /// /// Scope granting read-only access to notifier channels, rules, and delivery history. /// public const string NotifyViewer = "notify.viewer"; /// /// Scope permitting notifier rule management, delivery actions, and channel operations. /// public const string NotifyOperator = "notify.operator"; /// /// Scope granting administrative control over notifier secrets, escalations, and platform-wide settings. /// public const string NotifyAdmin = "notify.admin"; /// /// Scope granting read-only access to issuer directory catalogues. /// public const string IssuerDirectoryRead = "issuer-directory:read"; /// /// Scope permitting creation and modification of issuer directory entries. /// public const string IssuerDirectoryWrite = "issuer-directory:write"; /// /// Scope granting administrative control over issuer directory resources (delete, audit bypass). /// public const string IssuerDirectoryAdmin = "issuer-directory:admin"; /// /// Scope required to issue or honour escalation actions for notifications. /// public const string NotifyEscalate = "notify.escalate"; /// /// Scope granting read-only access to Task Packs catalogues and manifests. /// public const string PacksRead = "packs.read"; /// /// Scope permitting publication or updates to Task Packs in the registry. /// public const string PacksWrite = "packs.write"; /// /// Scope granting permission to execute Task Packs via CLI or Task Runner. /// public const string PacksRun = "packs.run"; /// /// Scope granting permission to fulfil Task Pack approval gates. /// public const string PacksApprove = "packs.approve"; /// /// Scope granting permission to enqueue or mutate graph build jobs. /// public const string GraphWrite = "graph:write"; /// /// Scope granting permission to export graph artefacts (GraphML/JSONL/etc.). /// public const string GraphExport = "graph:export"; /// /// Scope granting permission to trigger what-if simulations on graphs. /// public const string GraphSimulate = "graph:simulate"; /// /// Scope granting read-only access to Orchestrator job state and telemetry. /// public const string OrchRead = "orch:read"; /// /// Scope granting permission to execute Orchestrator control actions. /// public const string OrchOperate = "orch:operate"; /// /// Scope granting permission to manage Orchestrator quotas and elevated backfill tooling. /// public const string OrchQuota = "orch:quota"; /// /// Scope granting permission to initiate orchestrator-controlled backfill runs. /// public const string OrchBackfill = "orch:backfill"; /// /// Scope granting read-only access to Authority tenant catalog APIs. /// public const string AuthorityTenantsRead = "authority:tenants.read"; /// /// Scope granting write access to Authority tenant management. /// public const string AuthorityTenantsWrite = "authority:tenants.write"; /// /// Scope granting read-only access to Authority user management. /// public const string AuthorityUsersRead = "authority:users.read"; /// /// Scope granting write access to Authority user management. /// public const string AuthorityUsersWrite = "authority:users.write"; /// /// Scope granting read-only access to Authority role management. /// public const string AuthorityRolesRead = "authority:roles.read"; /// /// Scope granting write access to Authority role management. /// public const string AuthorityRolesWrite = "authority:roles.write"; /// /// Scope granting read-only access to Authority client registrations. /// public const string AuthorityClientsRead = "authority:clients.read"; /// /// Scope granting write access to Authority client registrations. /// public const string AuthorityClientsWrite = "authority:clients.write"; /// /// Scope granting read-only access to Authority token inventory. /// public const string AuthorityTokensRead = "authority:tokens.read"; /// /// Scope granting permission to revoke Authority tokens. /// public const string AuthorityTokensRevoke = "authority:tokens.revoke"; /// /// Scope granting read-only access to Authority branding configuration. /// public const string AuthorityBrandingRead = "authority:branding.read"; /// /// Scope granting write access to Authority branding configuration. /// public const string AuthorityBrandingWrite = "authority:branding.write"; /// /// Scope granting access to Console Admin UI and workflows. /// public const string UiAdmin = "ui.admin"; /// /// Scope granting read-only access to Scanner scan results and metadata. /// public const string ScannerRead = "scanner:read"; /// /// Scope granting permission to trigger Scanner scan operations. /// public const string ScannerScan = "scanner:scan"; /// /// Scope granting permission to export Scanner results (SBOM, reports). /// public const string ScannerExport = "scanner:export"; /// /// Scope granting write access to Scanner configuration. /// public const string ScannerWrite = "scanner:write"; /// /// Scope granting read-only access to Scheduler job state and history. /// public const string SchedulerRead = "scheduler:read"; /// /// Scope granting permission to operate Scheduler jobs (pause, resume, trigger). /// public const string SchedulerOperate = "scheduler:operate"; /// /// Scope granting administrative control over Scheduler configuration. /// public const string SchedulerAdmin = "scheduler:admin"; /// /// Scope granting permission to create attestations. /// public const string AttestCreate = "attest:create"; /// /// Scope granting administrative control over Attestor configuration. /// public const string AttestAdmin = "attest:admin"; /// /// Scope granting read-only access to Signer configuration and key metadata. /// public const string SignerRead = "signer:read"; /// /// Scope granting permission to create signatures. /// public const string SignerSign = "signer:sign"; /// /// Scope granting permission to rotate Signer keys. /// public const string SignerRotate = "signer:rotate"; /// /// Scope granting administrative control over Signer configuration. /// public const string SignerAdmin = "signer:admin"; /// /// Scope granting read-only access to SBOM documents. /// public const string SbomRead = "sbom:read"; /// /// Scope granting permission to create or edit SBOM documents. /// public const string SbomWrite = "sbom:write"; /// /// Scope granting permission to attest SBOM documents. /// public const string SbomAttest = "sbom:attest"; /// /// Scope granting read-only access to Release metadata and workflows. /// public const string ReleaseRead = "release:read"; /// /// Scope granting permission to create or edit Release metadata. /// public const string ReleaseWrite = "release:write"; /// /// Scope granting permission to publish Releases. /// public const string ReleasePublish = "release:publish"; /// /// Scope granting permission to bypass Release policy gates. /// public const string ReleaseBypass = "release:bypass"; /// /// Scope granting read-only access to Zastava webhook observer state. /// public const string ZastavaRead = "zastava:read"; /// /// Scope granting permission to trigger Zastava webhook processing. /// public const string ZastavaTrigger = "zastava:trigger"; /// /// Scope granting administrative control over Zastava configuration. /// public const string ZastavaAdmin = "zastava:admin"; /// /// Scope granting read-only access to exception records. /// public const string ExceptionsRead = "exceptions:read"; /// /// Scope granting permission to create or edit exception records. /// public const string ExceptionsWrite = "exceptions:write"; /// /// Scope granting permission to request exceptions (initiate approval workflow). /// public const string ExceptionsRequest = "exceptions:request"; /// /// Scope granting administrative control over Graph resources. /// public const string GraphAdmin = "graph:admin"; private static readonly IReadOnlyList AllScopes = BuildAllScopes(); private static readonly HashSet KnownScopes = new(AllScopes, StringComparer.OrdinalIgnoreCase); /// /// Normalises a scope string (trim/convert to lower case). /// /// Scope raw value. /// Normalised scope or null when the input is blank. public static string? Normalize(string? scope) { if (string.IsNullOrWhiteSpace(scope)) { return null; } return scope.Trim().ToLowerInvariant(); } /// /// Checks whether the provided scope is registered as a built-in StellaOps scope. /// public static bool IsKnown(string scope) { ArgumentNullException.ThrowIfNull(scope); return KnownScopes.Contains(scope); } /// /// Returns the full set of built-in scopes. /// public static IReadOnlyCollection All => AllScopes; private static IReadOnlyList BuildAllScopes() { var values = typeof(StellaOpsScopes) .GetFields(BindingFlags.Public | BindingFlags.Static) .Where(static field => field is { IsLiteral: true, IsInitOnly: false } && field.FieldType == typeof(string)) .Select(static field => (string)field.GetRawConstantValue()!) .Where(static value => !string.IsNullOrWhiteSpace(value)) .Distinct(StringComparer.Ordinal) .OrderBy(static value => value, StringComparer.Ordinal) .ToArray(); return new ReadOnlyCollection(values); } }