@jwilleke/ngdpbase-types 0.0.0 → 5.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +16 -2
- package/lib/packages/ngdpbase-types/index.d.ts +32 -0
- package/lib/packages/ngdpbase-types/testing.d.ts +43 -0
- package/lib/packages/ngdpbase-types/testing.js +53 -0
- package/lib/src/cache/CacheDependencies.d.ts +50 -0
- package/lib/src/cache/CacheDependencies.js +50 -0
- package/lib/src/cache/ICacheAdapter.d.ts +86 -0
- package/lib/src/cache/RegionCache.d.ts +171 -0
- package/lib/src/context/ActorContext.d.ts +48 -0
- package/lib/src/context/ActorContext.js +33 -0
- package/lib/src/context/ApiContext.d.ts +194 -0
- package/lib/src/context/ApiContext.js +273 -0
- package/lib/src/context/BaseContext.d.ts +110 -0
- package/lib/src/context/BaseContext.js +143 -0
- package/lib/src/context/JobContext.d.ts +153 -0
- package/lib/src/context/JobContext.js +144 -0
- package/lib/src/context/WikiContext.d.ts +404 -0
- package/lib/src/context/bootActions.d.ts +64 -0
- package/lib/src/context/bootActions.js +111 -0
- package/lib/src/converters/HtmlConverter.d.ts +70 -0
- package/lib/src/converters/IContentConverter.d.ts +94 -0
- package/lib/src/converters/JSPWikiConverter.d.ts +117 -0
- package/lib/src/converters/conversionWarning.d.ts +15 -0
- package/lib/src/converters/ncm/bridge.d.ts +22 -0
- package/lib/src/converters/ncm/existing.d.ts +23 -0
- package/lib/src/converters/ncm/fix/blocks.d.ts +89 -0
- package/lib/src/converters/ncm/fix/bulletMarkers.d.ts +21 -0
- package/lib/src/converters/ncm/fix/index.d.ts +36 -0
- package/lib/src/converters/ncm/fix/jspwikiBullets.d.ts +20 -0
- package/lib/src/converters/ncm/fix/jspwikiCodeMarkers.d.ts +38 -0
- package/lib/src/converters/ncm/fix/jspwikiHeadings.d.ts +25 -0
- package/lib/src/converters/ncm/fix/jspwikiIndent.d.ts +24 -0
- package/lib/src/converters/ncm/fix/jspwikiInsert.d.ts +21 -0
- package/lib/src/converters/ncm/fix/jspwikiItalic.d.ts +29 -0
- package/lib/src/converters/ncm/fix/jspwikiLinkLeftovers.d.ts +27 -0
- package/lib/src/converters/ncm/fix/moreInformationFooter.d.ts +25 -0
- package/lib/src/converters/ncm/fix/styleClosers.d.ts +25 -0
- package/lib/src/converters/ncm/fix/tightenLists.d.ts +30 -0
- package/lib/src/converters/ncm/fix/types.d.ts +33 -0
- package/lib/src/converters/ncm/footnotes.d.ts +39 -0
- package/lib/src/converters/ncm/images.d.ts +49 -0
- package/lib/src/converters/ncm/index.d.ts +20 -0
- package/lib/src/converters/ncm/links.d.ts +21 -0
- package/lib/src/converters/ncm/normalize.d.ts +39 -0
- package/lib/src/converters/ncm/placeholder.d.ts +25 -0
- package/lib/src/converters/ncm/tables.d.ts +36 -0
- package/lib/src/converters/ncm/types.d.ts +42 -0
- package/lib/src/http/egressPolicy.d.ts +52 -0
- package/lib/src/http/guardedFetch.d.ts +89 -0
- package/lib/src/http/guardedFetch.js +113 -0
- package/lib/src/http/guardedLookup.d.ts +48 -0
- package/lib/src/http/guardedLookup.js +73 -0
- package/lib/src/http/ssrf.d.ts +83 -0
- package/lib/src/http/ssrf.js +311 -0
- package/lib/src/mail/MailProvider.d.ts +36 -0
- package/lib/src/mail/NodemailerMailProvider.d.ts +26 -0
- package/lib/src/managers/AddonsManager.d.ts +691 -0
- package/lib/src/managers/AgentTokenManager.d.ts +269 -0
- package/lib/src/managers/AssetManager.d.ts +116 -0
- package/lib/src/managers/AttachmentManager.d.ts +1032 -0
- package/lib/src/managers/AuthManager.d.ts +1257 -0
- package/lib/src/managers/BackgroundJobManager.d.ts +434 -0
- package/lib/src/managers/BaseManager.d.ts +427 -0
- package/lib/src/managers/BaseManager.js +415 -0
- package/lib/src/managers/CacheManager.d.ts +159 -0
- package/lib/src/managers/CatalogManager.d.ts +235 -0
- package/lib/src/managers/CommentManager.d.ts +75 -0
- package/lib/src/managers/ConfigurationManager.d.ts +747 -0
- package/lib/src/managers/DatabaseManager.d.ts +188 -0
- package/lib/src/managers/DatabaseManager.js +590 -0
- package/lib/src/managers/EmailManager.d.ts +47 -0
- package/lib/src/managers/ExportManager.d.ts +129 -0
- package/lib/src/managers/ExportManager.js +420 -0
- package/lib/src/managers/FootnoteManager.d.ts +118 -0
- package/lib/src/managers/MediaManager.d.ts +279 -0
- package/lib/src/managers/MetricsManager.d.ts +89 -0
- package/lib/src/managers/NotificationManager.d.ts +165 -0
- package/lib/src/managers/OidcManager.d.ts +210 -0
- package/lib/src/managers/OrganizationManager.d.ts +107 -0
- package/lib/src/managers/PageManager.d.ts +1645 -0
- package/lib/src/managers/PersonManager.d.ts +48 -0
- package/lib/src/managers/PluginManager.d.ts +179 -0
- package/lib/src/managers/PluginManager.js +393 -0
- package/lib/src/managers/PolicyEvaluator.d.ts +213 -0
- package/lib/src/managers/RenderingManager.d.ts +358 -0
- package/lib/src/managers/RoleManager.d.ts +134 -0
- package/lib/src/managers/SearchManager.d.ts +402 -0
- package/lib/src/managers/ShareManager.d.ts +251 -0
- package/lib/src/managers/TemplateManager.d.ts +176 -0
- package/lib/src/managers/ThemeManager.d.ts +56 -0
- package/lib/src/managers/UserManager.d.ts +480 -0
- package/lib/src/managers/ValidationManager.d.ts +426 -0
- package/lib/src/managers/VariableManager.d.ts +145 -0
- package/lib/src/middleware/csrf.d.ts +3 -0
- package/lib/src/parsers/LinkParser.d.ts +457 -0
- package/lib/src/parsers/MarkupParser.d.ts +769 -0
- package/lib/src/parsers/context/ParseContext.d.ts +314 -0
- package/lib/src/parsers/data/emoji-map.d.ts +18 -0
- package/lib/src/parsers/dom/DOMBuilder.d.ts +210 -0
- package/lib/src/parsers/dom/DOMParser.d.ts +252 -0
- package/lib/src/parsers/dom/Tokenizer.d.ts +358 -0
- package/lib/src/parsers/dom/WikiDocument.d.ts +272 -0
- package/lib/src/parsers/dom/handlers/DOMLinkHandler.d.ts +260 -0
- package/lib/src/parsers/dom/handlers/DOMPluginHandler.d.ts +212 -0
- package/lib/src/parsers/dom/handlers/DOMVariableHandler.d.ts +171 -0
- package/lib/src/parsers/filters/BaseFilter.d.ts +269 -0
- package/lib/src/parsers/filters/FilterChain.d.ts +320 -0
- package/lib/src/parsers/handlers/BaseSyntaxHandler.d.ts +331 -0
- package/lib/src/parsers/handlers/HandlerRegistry.d.ts +225 -0
- package/lib/src/parsers/handlers/JSPWikiPreprocessor.d.ts +89 -0
- package/lib/src/parsers/handlers/LinkParserHandler.d.ts +80 -0
- package/lib/src/parsers/handlers/PluginSyntaxHandler.d.ts +78 -0
- package/lib/src/parsers/handlers/WikiFormHandler.d.ts +149 -0
- package/lib/src/parsers/handlers/WikiTagHandler.d.ts +125 -0
- package/lib/src/parsers/jspwikiTableRow.d.ts +39 -0
- package/lib/src/parsers/styleBlockSyntax.d.ts +14 -0
- package/lib/src/plugins/types.d.ts +79 -0
- package/lib/src/providers/AgentTokenAuthProvider.d.ts +40 -0
- package/lib/src/providers/AuthentikBearerAuthProvider.d.ts +75 -0
- package/lib/src/providers/BaseAttachmentProvider.d.ts +197 -0
- package/lib/src/providers/BaseAuthProvider.d.ts +220 -0
- package/lib/src/providers/BaseCacheProvider.d.ts +140 -0
- package/lib/src/providers/BaseCredentialsProvider.d.ts +84 -0
- package/lib/src/providers/BaseDatabaseProvider.d.ts +22 -0
- package/lib/src/providers/BaseDatabaseProvider.js +12 -0
- package/lib/src/providers/BaseLoggingProvider.d.ts +68 -0
- package/lib/src/providers/BaseLoggingProvider.js +37 -0
- package/lib/src/providers/BaseMediaProvider.d.ts +308 -0
- package/lib/src/providers/BasePageProvider.d.ts +337 -0
- package/lib/src/providers/BaseProvider.d.ts +98 -0
- package/lib/src/providers/BaseProvider.js +74 -0
- package/lib/src/providers/BaseSearchProvider.d.ts +362 -0
- package/lib/src/providers/BasicAttachmentProvider.d.ts +599 -0
- package/lib/src/providers/CloudflareAccessAuthProvider.d.ts +72 -0
- package/lib/src/providers/FileCredentialsProvider.d.ts +33 -0
- package/lib/src/providers/FileJobStateProvider.d.ts +58 -0
- package/lib/src/providers/FileLoggingProvider.d.ts +43 -0
- package/lib/src/providers/FileLoggingProvider.js +120 -0
- package/lib/src/providers/FileOidcAdapter.d.ts +25 -0
- package/lib/src/providers/FileSystemMediaProvider.d.ts +403 -0
- package/lib/src/providers/LunrSearchProvider.d.ts +280 -0
- package/lib/src/providers/MagicLinkAuthProvider.d.ts +125 -0
- package/lib/src/providers/NullCacheProvider.d.ts +72 -0
- package/lib/src/providers/OidcAuthProvider.d.ts +180 -0
- package/lib/src/providers/OidcBearerAuthProvider.d.ts +30 -0
- package/lib/src/providers/PasskeyAuthProvider.d.ts +58 -0
- package/lib/src/providers/PasswordAuthProvider.d.ts +20 -0
- package/lib/src/providers/SqliteDatabaseProvider.d.ts +55 -0
- package/lib/src/providers/SqliteDatabaseProvider.js +90 -0
- package/lib/src/providers/SqliteJobStateProvider.d.ts +41 -0
- package/lib/src/providers/databaseMigrations.d.ts +8 -0
- package/lib/src/providers/databaseMigrations.js +47 -0
- package/lib/src/providers/jobState.d.ts +99 -0
- package/lib/src/providers/lunrQueryToMiniSearch.d.ts +32 -0
- package/lib/src/providers/mediaFilenameDate.d.ts +22 -0
- package/lib/src/providers/sqliteBackup.d.ts +128 -0
- package/lib/src/providers/sqliteBackup.js +365 -0
- package/lib/src/providers/sqliteLocation.d.ts +17 -0
- package/lib/src/providers/sqliteLocation.js +55 -0
- package/lib/src/providers/sqliteMigrations.d.ts +48 -0
- package/lib/src/providers/sqliteMigrations.js +72 -0
- package/lib/src/rendering/githubAlerts.d.ts +22 -0
- package/lib/src/rendering/htmlPolicy.d.ts +76 -0
- package/lib/src/rendering/markdownConverter.d.ts +73 -0
- package/lib/src/security/PolicyDecisionPoint.d.ts +245 -0
- package/lib/src/security/PolicyInformationPoint.d.ts +448 -0
- package/lib/src/security/pageActions.d.ts +40 -0
- package/lib/src/security/permissions.generated.d.ts +78 -0
- package/lib/src/types/Asset.d.ts +414 -0
- package/lib/src/types/Catalog.d.ts +61 -0
- package/lib/src/types/Comment.d.ts +11 -0
- package/lib/src/types/Config.d.ts +388 -0
- package/lib/src/types/Organization.d.ts +78 -0
- package/lib/src/types/OrganizationProvider.d.ts +38 -0
- package/lib/src/types/Page.d.ts +220 -0
- package/lib/src/types/Person.d.ts +56 -0
- package/lib/src/types/PersonProvider.d.ts +25 -0
- package/lib/src/types/Policy.d.ts +139 -0
- package/lib/src/types/Policy.js +17 -0
- package/lib/src/types/Provider.d.ts +810 -0
- package/lib/src/types/Role.d.ts +84 -0
- package/lib/src/types/RoleProvider.d.ts +35 -0
- package/lib/src/types/Schema.d.ts +425 -0
- package/lib/src/types/Share.d.ts +172 -0
- package/lib/src/types/Share.js +81 -0
- package/lib/src/types/User.d.ts +304 -0
- package/lib/src/types/Version.d.ts +189 -0
- package/lib/src/types/WikiEngine.d.ts +128 -0
- package/lib/src/types/express.d.ts +120 -0
- package/lib/src/types/express.js +1 -0
- package/lib/src/types/guards.d.ts +78 -0
- package/lib/src/types/heic-decode.d.ts +16 -0
- package/lib/src/types/index.d.ts +19 -0
- package/lib/src/types/linkedom.d.ts +77 -0
- package/lib/src/types/markdown-it-plugins.d.ts +21 -0
- package/lib/src/utils/DeltaStorage.d.ts +118 -0
- package/lib/src/utils/LocaleUtils.d.ts +105 -0
- package/lib/src/utils/LocaleUtils.js +294 -0
- package/lib/src/utils/PageNameMatcher.d.ts +98 -0
- package/lib/src/utils/PathPreflight.d.ts +38 -0
- package/lib/src/utils/PathPreflight.js +50 -0
- package/lib/src/utils/SectionUtils.d.ts +40 -0
- package/lib/src/utils/addonConfigLayer.d.ts +144 -0
- package/lib/src/utils/addonConfigLayer.js +382 -0
- package/lib/src/utils/addonDatabaseRules.d.ts +25 -0
- package/lib/src/utils/addonDatabaseRules.js +57 -0
- package/lib/src/utils/addonHost.d.ts +51 -0
- package/lib/src/utils/addonHost.js +72 -0
- package/lib/src/utils/addonInstaller.d.ts +109 -0
- package/lib/src/utils/addonLock.d.ts +37 -0
- package/lib/src/utils/addonLock.js +48 -0
- package/lib/src/utils/addonPageSync.d.ts +45 -0
- package/lib/src/utils/addonProvenance.d.ts +48 -0
- package/lib/src/utils/addonTarball.d.ts +41 -0
- package/lib/src/utils/addonsPathResolver.d.ts +76 -0
- package/lib/src/utils/addonsPathResolver.js +129 -0
- package/lib/src/utils/assetMetadataTags.d.ts +66 -0
- package/lib/src/utils/atomicWrite.d.ts +28 -0
- package/lib/src/utils/auditConfigChange.d.ts +57 -0
- package/lib/src/utils/auditEventNames.d.ts +50 -0
- package/lib/src/utils/auditEventNames.generated.d.ts +169 -0
- package/lib/src/utils/auditEventNames.generated.js +174 -0
- package/lib/src/utils/auditEventNames.js +49 -0
- package/lib/src/utils/auditEvents.d.ts +265 -0
- package/lib/src/utils/auditEvents.js +309 -0
- package/lib/src/utils/auditRegistry.d.ts +102 -0
- package/lib/src/utils/auditRegistry.js +168 -0
- package/lib/src/utils/bip39English.d.ts +2 -0
- package/lib/src/utils/configEnvKeys.d.ts +68 -0
- package/lib/src/utils/configFiles.d.ts +74 -0
- package/lib/src/utils/configFiles.js +150 -0
- package/lib/src/utils/delegation.d.ts +48 -0
- package/lib/src/utils/deriveUsername.d.ts +21 -0
- package/lib/src/utils/explainMediaPath.d.ts +123 -0
- package/lib/src/utils/formerTitles.d.ts +69 -0
- package/lib/src/utils/frontmatterAccess.d.ts +54 -0
- package/lib/src/utils/headlessAdminPassword.d.ts +55 -0
- package/lib/src/utils/imageTransform.d.ts +52 -0
- package/lib/src/utils/instanceEnvSecret.d.ts +51 -0
- package/lib/src/utils/jobSlots.d.ts +43 -0
- package/lib/src/utils/keywordNormalizer.d.ts +127 -0
- package/lib/src/utils/logger.d.ts +70 -0
- package/lib/src/utils/logger.js +106 -0
- package/lib/src/utils/magicLinkDeviceState.d.ts +95 -0
- package/lib/src/utils/managerUtils.d.ts +40 -0
- package/lib/src/utils/migrateLegacyPrivateAttachments.d.ts +15 -0
- package/lib/src/utils/orgFilename.d.ts +22 -0
- package/lib/src/utils/pageFeature.d.ts +27 -0
- package/lib/src/utils/pageFrontmatter.d.ts +21 -0
- package/lib/src/utils/pageNotes.d.ts +150 -0
- package/lib/src/utils/pageTitleRule.d.ts +37 -0
- package/lib/src/utils/pageToArticle.d.ts +59 -0
- package/lib/src/utils/pageUrl.d.ts +18 -0
- package/lib/src/utils/passwordChange.d.ts +12 -0
- package/lib/src/utils/passwordHash.d.ts +60 -0
- package/lib/src/utils/permissionCatalog.d.ts +52 -0
- package/lib/src/utils/pluginFormatters.d.ts +452 -0
- package/lib/src/utils/pluginFormatters.js +714 -0
- package/lib/src/utils/privateLinkRewrite.d.ts +42 -0
- package/lib/src/utils/privateStoreAccess.d.ts +57 -0
- package/lib/src/utils/privateStoreAccess.js +65 -0
- package/lib/src/utils/privateStoreCatalogs.d.ts +40 -0
- package/lib/src/utils/privateStoreCrypto.d.ts +127 -0
- package/lib/src/utils/privateStoreDoor.d.ts +181 -0
- package/lib/src/utils/privateStoreExport.d.ts +72 -0
- package/lib/src/utils/privateStoreFiles.d.ts +120 -0
- package/lib/src/utils/privateStoreMeta.d.ts +64 -0
- package/lib/src/utils/privateStoreMigrations.d.ts +37 -0
- package/lib/src/utils/privateStorePath.d.ts +259 -0
- package/lib/src/utils/privateStorePath.js +436 -0
- package/lib/src/utils/privateStoreTakeout.d.ts +76 -0
- package/lib/src/utils/privateStoreUnlock.d.ts +175 -0
- package/lib/src/utils/proxyClaim.d.ts +59 -0
- package/lib/src/utils/proxyClaim.js +30 -0
- package/lib/src/utils/redactPrivateNames.d.ts +21 -0
- package/lib/src/utils/redactPrivateNames.js +89 -0
- package/lib/src/utils/redactSecrets.d.ts +58 -0
- package/lib/src/utils/redactSecrets.js +171 -0
- package/lib/src/utils/renameLinkRewrite.d.ts +112 -0
- package/lib/src/utils/roleGrants.d.ts +35 -0
- package/lib/src/utils/safeRedirect.d.ts +32 -0
- package/lib/src/utils/schedule.d.ts +54 -0
- package/lib/src/utils/secretFileMode.d.ts +17 -0
- package/lib/src/utils/seededShippedPages.d.ts +45 -0
- package/lib/src/utils/sensitiveValues.d.ts +59 -0
- package/lib/src/utils/sensitiveValues.js +106 -0
- package/lib/src/utils/sessionEnd.d.ts +12 -0
- package/lib/src/utils/sessionGeneration.d.ts +24 -0
- package/lib/src/utils/sessionIdle.d.ts +41 -0
- package/lib/src/utils/sessionLimits.d.ts +68 -0
- package/lib/src/utils/shareLockbox.d.ts +64 -0
- package/lib/src/utils/sigstoreTrustedRoot.d.ts +33 -0
- package/lib/src/utils/sniffMime.d.ts +21 -0
- package/lib/src/utils/storeSearchIndex.d.ts +75 -0
- package/lib/src/utils/subjectMayDo.d.ts +21 -0
- package/lib/src/utils/systemCategoryRules.d.ts +30 -0
- package/lib/src/utils/systemCategoryRules.js +41 -0
- package/lib/src/utils/userCreateError.d.ts +62 -0
- package/lib/src/utils/username.d.ts +53 -0
- package/lib/src/utils/vaultUrlRewrite.d.ts +27 -0
- package/lib/src/utils/version.d.ts +84 -0
- package/lib/src/utils/videoFrame.d.ts +21 -0
- package/package.json +54 -3
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who asked for a background job, and from where (#631).
|
|
3
|
+
*
|
|
4
|
+
* A job runs after its request has returned, so nothing about the request
|
|
5
|
+
* survives unless it is carried deliberately. `BackgroundJobManager.enqueue()`
|
|
6
|
+
* took a job id and nothing else, so the identity of whoever pressed the button
|
|
7
|
+
* was discarded at the call site — `WikiRoutes` logged
|
|
8
|
+
* `Page reindex requested by: jim` on one line and threw the name away on the
|
|
9
|
+
* next. The audit log, which #1148/#1149/#1150/#1156/#1158/#1138 exist to make
|
|
10
|
+
* trustworthy, could not say who reindexed anything.
|
|
11
|
+
*
|
|
12
|
+
* __Identity and provenance travel; authority does not.__ This carries who
|
|
13
|
+
* asked, from what origin, and whether a delegated token was involved. It
|
|
14
|
+
* deliberately does NOT carry resolved roles. A reindex enqueued at 09:00 and
|
|
15
|
+
* running at 09:12 must not authorise against 09:00's roles — demote or delete
|
|
16
|
+
* the user in between and the job would keep rights they no longer hold. That
|
|
17
|
+
* is the same reasoning `app.ts` gives for agent tokens: *"roles are resolved
|
|
18
|
+
* live per request — a token never carries a snapshot."*
|
|
19
|
+
*
|
|
20
|
+
* So a job that needs to make a permission decision asks for the permission at
|
|
21
|
+
* the moment of the decision, from `username`, via {@link toPermissionSubject}.
|
|
22
|
+
* The question is always a permission (P2); roles are lists policy refers to,
|
|
23
|
+
* carried by nothing and gating nothing.
|
|
24
|
+
*
|
|
25
|
+
* __This is a deliberate reduction, which is the thing #1164 punished.__ The
|
|
26
|
+
* difference is that there it was accidental: `AttachmentManager` rebuilt a
|
|
27
|
+
* subject from three fields and silently dropped `viaToken` while believing it
|
|
28
|
+
* forwarded everything. Here the reduction happens in exactly one place, losing
|
|
29
|
+
* roles is the point, and __`viaToken` must survive it__ — otherwise a job
|
|
30
|
+
* enqueued by a token-bearing request escapes the agent-token ceiling simply by
|
|
31
|
+
* becoming asynchronous.
|
|
32
|
+
*/
|
|
33
|
+
import type { JobSubject, AgentTokenGrant, ProxyClaim } from '../managers/UserManager.js';
|
|
34
|
+
import type { ShareGrant } from '../types/Share.js';
|
|
35
|
+
/**
|
|
36
|
+
* Where the work came from.
|
|
37
|
+
*
|
|
38
|
+
* Every origin is a caller; none of them is "a person" as far as this type is
|
|
39
|
+
* concerned. `request` acts for an identity the session authenticated — which
|
|
40
|
+
* may itself be an agent token acting under a delegation. The rest are the
|
|
41
|
+
* server acting for itself, and they are named for that reason rather than
|
|
42
|
+
* defaulting to anonymous: `schedule` and `boot` run as the system principal
|
|
43
|
+
* (#631, env-owned identity, authority resolved through policy like any other
|
|
44
|
+
* caller), and `operator` is a command line.
|
|
45
|
+
*/
|
|
46
|
+
export type JobOrigin = 'request' | 'schedule' | 'boot' | 'operator';
|
|
47
|
+
/** The identity a background job runs under. Flat, and serialisable by construction. */
|
|
48
|
+
export interface JobContext {
|
|
49
|
+
/** Who asked. The system principal for the origins where the server acts for itself. */
|
|
50
|
+
username: string;
|
|
51
|
+
/** From what context the work was requested. */
|
|
52
|
+
origin: JobOrigin;
|
|
53
|
+
/**
|
|
54
|
+
* The agent token the requesting call arrived with, when it did.
|
|
55
|
+
*
|
|
56
|
+
* Carried so a job cannot outrun the ceiling that capped the request. Whether
|
|
57
|
+
* a token-triggered job may run at all is #1173's decision — this makes the
|
|
58
|
+
* question answerable rather than invisible.
|
|
59
|
+
*/
|
|
60
|
+
viaToken?: AgentTokenGrant;
|
|
61
|
+
/** The share the requesting call presented, when it did (#1222). Carried for the same reason. */
|
|
62
|
+
viaShare?: ShareGrant;
|
|
63
|
+
/** The proxy grant the requesting call acted under, when it did (#1762). Carried for the same reason: a job never runs as the represented person unbounded. */
|
|
64
|
+
viaProxy?: ProxyClaim;
|
|
65
|
+
/** The address the requesting call came from (#1179), when there was one. Provenance for the record. */
|
|
66
|
+
ipAddress?: string;
|
|
67
|
+
/** ISO 8601. When the work was requested, not when it ran. */
|
|
68
|
+
requestedAt: string;
|
|
69
|
+
/** Why, for origins with no person to ask. Free text, for the audit record. */
|
|
70
|
+
reason?: string;
|
|
71
|
+
}
|
|
72
|
+
/** The shape a request-bound context exposes; both WikiContext and ApiContext satisfy it. */
|
|
73
|
+
export interface RequestIdentity {
|
|
74
|
+
username?: string | null;
|
|
75
|
+
viaToken?: AgentTokenGrant;
|
|
76
|
+
viaShare?: ShareGrant;
|
|
77
|
+
viaProxy?: ProxyClaim;
|
|
78
|
+
ipAddress?: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The username a request-origin job carries when the request had no identity.
|
|
82
|
+
*
|
|
83
|
+
* Anonymous, and deliberately NOT the system principal. This used to default
|
|
84
|
+
* to `'System'`, which was harmless while `'System'` named nobody. Under #631
|
|
85
|
+
* the principal is a configured name that resolves to the `admin` role, so a
|
|
86
|
+
* route that enqueued work without a `userContext` would have run that work
|
|
87
|
+
* as the system principal — a bypass reached by forgetting an argument. A
|
|
88
|
+
* missing identity is a visitor; nothing more.
|
|
89
|
+
*/
|
|
90
|
+
export declare const ANONYMOUS_USERNAME = "Anonymous";
|
|
91
|
+
/**
|
|
92
|
+
* Derive a job context from the request that triggered the work.
|
|
93
|
+
*
|
|
94
|
+
* Takes the identity a route already holds — `req.userContext`, an
|
|
95
|
+
* `ApiContext`, or a `WikiContext`'s `userContext` — rather than a username
|
|
96
|
+
* string, so `viaToken` comes along instead of being dropped.
|
|
97
|
+
*/
|
|
98
|
+
export declare function jobContextFromRequest(identity: RequestIdentity | null | undefined, now?: Date): JobContext;
|
|
99
|
+
/**
|
|
100
|
+
* A request-origin context that also says why (#1179).
|
|
101
|
+
*
|
|
102
|
+
* For an act inside a request that has no subject of its own yet, or acts for
|
|
103
|
+
* someone other than the caller: self-registration (the new account is the
|
|
104
|
+
* identity, the reason says so), an identity provider provisioning an account
|
|
105
|
+
* (the system principal is the identity, the reason names the provider), a
|
|
106
|
+
* sign-in refreshing login statistics. The reason is mandatory for the same
|
|
107
|
+
* cause as in `jobContextFromSystem`: an act that cannot say why is the one an
|
|
108
|
+
* assessor asks about.
|
|
109
|
+
*/
|
|
110
|
+
export declare function jobContextFromRequestWithReason(identity: RequestIdentity | null | undefined, reason: string, now?: Date): JobContext;
|
|
111
|
+
/**
|
|
112
|
+
* An operator acting from the command line (#1179) — `scripts/restart-audit-chain.ts`
|
|
113
|
+
* and its kind. There is a person, named on the command, and no request; the
|
|
114
|
+
* origin says so, and the reason is the command's own.
|
|
115
|
+
*/
|
|
116
|
+
export declare function jobContextFromOperator(username: string, reason: string, now?: Date): JobContext;
|
|
117
|
+
/**
|
|
118
|
+
* A job with no person behind it — boot, a schedule, a retention pass.
|
|
119
|
+
*
|
|
120
|
+
* `systemPrincipal` is the name configured in `.env` as `NGDPBASE_SYSTEM_USER`
|
|
121
|
+
* (#631), read through `PolicyInformationPoint.systemPrincipalName()`. It is a mandatory
|
|
122
|
+
* positional argument rather than a constant here because this module is flat
|
|
123
|
+
* and engine-free by design, and a hardcoded `'System'` would be a second
|
|
124
|
+
* source of truth for a value the environment owns — one that silently names
|
|
125
|
+
* nobody the moment an operator picks a different name.
|
|
126
|
+
*
|
|
127
|
+
* `reason` is required rather than optional. An ownerless action that cannot
|
|
128
|
+
* say why it happened is the thing an assessor asks about, and a default would
|
|
129
|
+
* be filled in by nobody. This is the constructor #1173 needs in order to
|
|
130
|
+
* delete the `hasPermission` string overload: once it exists, every caller has
|
|
131
|
+
* a context to pass, including code that runs with no request at all.
|
|
132
|
+
*/
|
|
133
|
+
export declare function jobContextFromSystem(systemPrincipal: string, reason: string, now?: Date): JobContext;
|
|
134
|
+
/** As {@link jobContextFromSystem}, for work started by a timer rather than at boot. */
|
|
135
|
+
export declare function jobContextFromSchedule(systemPrincipal: string, reason: string, now?: Date): JobContext;
|
|
136
|
+
/**
|
|
137
|
+
* The subject for a permission check made *by* this job.
|
|
138
|
+
*
|
|
139
|
+
* `roles` is deliberately absent for EVERY origin, and the PDP (`permits`)
|
|
140
|
+
* resolves them from the username at decision time — which is what makes the
|
|
141
|
+
* answer current rather than a replay of enqueue time. For a request-origin
|
|
142
|
+
* job that is the requester's current roles. For a boot or schedule job the
|
|
143
|
+
* username is the system principal named in `.env` (#631), and it resolves to
|
|
144
|
+
* the roles `ngdpbase.system.roles` declares for it — `admin` by default —
|
|
145
|
+
* through the same policy door as everyone else (P2). No roles ride along in
|
|
146
|
+
* the context, so there is nothing here for a caller to widen.
|
|
147
|
+
*
|
|
148
|
+
* `viaToken` IS carried, so a job triggered through a delegated token is still
|
|
149
|
+
* held to that token's scopes.
|
|
150
|
+
*/
|
|
151
|
+
export declare function toPermissionSubject(ctx: JobContext): JobSubject;
|
|
152
|
+
/** One line for a log or an audit record: who, from where, and how. */
|
|
153
|
+
export declare function describeJobContext(ctx: JobContext): string;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who asked for a background job, and from where (#631).
|
|
3
|
+
*
|
|
4
|
+
* A job runs after its request has returned, so nothing about the request
|
|
5
|
+
* survives unless it is carried deliberately. `BackgroundJobManager.enqueue()`
|
|
6
|
+
* took a job id and nothing else, so the identity of whoever pressed the button
|
|
7
|
+
* was discarded at the call site — `WikiRoutes` logged
|
|
8
|
+
* `Page reindex requested by: jim` on one line and threw the name away on the
|
|
9
|
+
* next. The audit log, which #1148/#1149/#1150/#1156/#1158/#1138 exist to make
|
|
10
|
+
* trustworthy, could not say who reindexed anything.
|
|
11
|
+
*
|
|
12
|
+
* __Identity and provenance travel; authority does not.__ This carries who
|
|
13
|
+
* asked, from what origin, and whether a delegated token was involved. It
|
|
14
|
+
* deliberately does NOT carry resolved roles. A reindex enqueued at 09:00 and
|
|
15
|
+
* running at 09:12 must not authorise against 09:00's roles — demote or delete
|
|
16
|
+
* the user in between and the job would keep rights they no longer hold. That
|
|
17
|
+
* is the same reasoning `app.ts` gives for agent tokens: *"roles are resolved
|
|
18
|
+
* live per request — a token never carries a snapshot."*
|
|
19
|
+
*
|
|
20
|
+
* So a job that needs to make a permission decision asks for the permission at
|
|
21
|
+
* the moment of the decision, from `username`, via {@link toPermissionSubject}.
|
|
22
|
+
* The question is always a permission (P2); roles are lists policy refers to,
|
|
23
|
+
* carried by nothing and gating nothing.
|
|
24
|
+
*
|
|
25
|
+
* __This is a deliberate reduction, which is the thing #1164 punished.__ The
|
|
26
|
+
* difference is that there it was accidental: `AttachmentManager` rebuilt a
|
|
27
|
+
* subject from three fields and silently dropped `viaToken` while believing it
|
|
28
|
+
* forwarded everything. Here the reduction happens in exactly one place, losing
|
|
29
|
+
* roles is the point, and __`viaToken` must survive it__ — otherwise a job
|
|
30
|
+
* enqueued by a token-bearing request escapes the agent-token ceiling simply by
|
|
31
|
+
* becoming asynchronous.
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* The username a request-origin job carries when the request had no identity.
|
|
35
|
+
*
|
|
36
|
+
* Anonymous, and deliberately NOT the system principal. This used to default
|
|
37
|
+
* to `'System'`, which was harmless while `'System'` named nobody. Under #631
|
|
38
|
+
* the principal is a configured name that resolves to the `admin` role, so a
|
|
39
|
+
* route that enqueued work without a `userContext` would have run that work
|
|
40
|
+
* as the system principal — a bypass reached by forgetting an argument. A
|
|
41
|
+
* missing identity is a visitor; nothing more.
|
|
42
|
+
*/
|
|
43
|
+
export const ANONYMOUS_USERNAME = 'Anonymous';
|
|
44
|
+
/**
|
|
45
|
+
* Derive a job context from the request that triggered the work.
|
|
46
|
+
*
|
|
47
|
+
* Takes the identity a route already holds — `req.userContext`, an
|
|
48
|
+
* `ApiContext`, or a `WikiContext`'s `userContext` — rather than a username
|
|
49
|
+
* string, so `viaToken` comes along instead of being dropped.
|
|
50
|
+
*/
|
|
51
|
+
export function jobContextFromRequest(identity, now = new Date()) {
|
|
52
|
+
return {
|
|
53
|
+
username: identity?.username ?? ANONYMOUS_USERNAME,
|
|
54
|
+
origin: 'request',
|
|
55
|
+
...(identity?.viaToken ? { viaToken: identity.viaToken } : {}),
|
|
56
|
+
...(identity?.viaShare ? { viaShare: identity.viaShare } : {}),
|
|
57
|
+
...(identity?.viaProxy ? { viaProxy: identity.viaProxy } : {}),
|
|
58
|
+
...(identity?.ipAddress ? { ipAddress: identity.ipAddress } : {}),
|
|
59
|
+
requestedAt: now.toISOString()
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* A request-origin context that also says why (#1179).
|
|
64
|
+
*
|
|
65
|
+
* For an act inside a request that has no subject of its own yet, or acts for
|
|
66
|
+
* someone other than the caller: self-registration (the new account is the
|
|
67
|
+
* identity, the reason says so), an identity provider provisioning an account
|
|
68
|
+
* (the system principal is the identity, the reason names the provider), a
|
|
69
|
+
* sign-in refreshing login statistics. The reason is mandatory for the same
|
|
70
|
+
* cause as in `jobContextFromSystem`: an act that cannot say why is the one an
|
|
71
|
+
* assessor asks about.
|
|
72
|
+
*/
|
|
73
|
+
export function jobContextFromRequestWithReason(identity, reason, now = new Date()) {
|
|
74
|
+
return { ...jobContextFromRequest(identity, now), reason };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* An operator acting from the command line (#1179) — `scripts/restart-audit-chain.ts`
|
|
78
|
+
* and its kind. There is a person, named on the command, and no request; the
|
|
79
|
+
* origin says so, and the reason is the command's own.
|
|
80
|
+
*/
|
|
81
|
+
export function jobContextFromOperator(username, reason, now = new Date()) {
|
|
82
|
+
return { username, origin: 'operator', reason, requestedAt: now.toISOString() };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* A job with no person behind it — boot, a schedule, a retention pass.
|
|
86
|
+
*
|
|
87
|
+
* `systemPrincipal` is the name configured in `.env` as `NGDPBASE_SYSTEM_USER`
|
|
88
|
+
* (#631), read through `PolicyInformationPoint.systemPrincipalName()`. It is a mandatory
|
|
89
|
+
* positional argument rather than a constant here because this module is flat
|
|
90
|
+
* and engine-free by design, and a hardcoded `'System'` would be a second
|
|
91
|
+
* source of truth for a value the environment owns — one that silently names
|
|
92
|
+
* nobody the moment an operator picks a different name.
|
|
93
|
+
*
|
|
94
|
+
* `reason` is required rather than optional. An ownerless action that cannot
|
|
95
|
+
* say why it happened is the thing an assessor asks about, and a default would
|
|
96
|
+
* be filled in by nobody. This is the constructor #1173 needs in order to
|
|
97
|
+
* delete the `hasPermission` string overload: once it exists, every caller has
|
|
98
|
+
* a context to pass, including code that runs with no request at all.
|
|
99
|
+
*/
|
|
100
|
+
export function jobContextFromSystem(systemPrincipal, reason, now = new Date()) {
|
|
101
|
+
return {
|
|
102
|
+
username: systemPrincipal,
|
|
103
|
+
origin: 'boot',
|
|
104
|
+
requestedAt: now.toISOString(),
|
|
105
|
+
reason
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** As {@link jobContextFromSystem}, for work started by a timer rather than at boot. */
|
|
109
|
+
export function jobContextFromSchedule(systemPrincipal, reason, now = new Date()) {
|
|
110
|
+
return { ...jobContextFromSystem(systemPrincipal, reason, now), origin: 'schedule' };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The subject for a permission check made *by* this job.
|
|
114
|
+
*
|
|
115
|
+
* `roles` is deliberately absent for EVERY origin, and the PDP (`permits`)
|
|
116
|
+
* resolves them from the username at decision time — which is what makes the
|
|
117
|
+
* answer current rather than a replay of enqueue time. For a request-origin
|
|
118
|
+
* job that is the requester's current roles. For a boot or schedule job the
|
|
119
|
+
* username is the system principal named in `.env` (#631), and it resolves to
|
|
120
|
+
* the roles `ngdpbase.system.roles` declares for it — `admin` by default —
|
|
121
|
+
* through the same policy door as everyone else (P2). No roles ride along in
|
|
122
|
+
* the context, so there is nothing here for a caller to widen.
|
|
123
|
+
*
|
|
124
|
+
* `viaToken` IS carried, so a job triggered through a delegated token is still
|
|
125
|
+
* held to that token's scopes.
|
|
126
|
+
*/
|
|
127
|
+
export function toPermissionSubject(ctx) {
|
|
128
|
+
return {
|
|
129
|
+
username: ctx.username,
|
|
130
|
+
isAuthenticated: true,
|
|
131
|
+
// #1212: said on purpose. "Roles absent" used to be the signal, and the
|
|
132
|
+
// type could not tell that from a caller that forgot them.
|
|
133
|
+
resolveRolesNow: true,
|
|
134
|
+
...(ctx.viaToken ? { viaToken: ctx.viaToken } : {}),
|
|
135
|
+
...(ctx.viaShare ? { viaShare: ctx.viaShare } : {}),
|
|
136
|
+
...(ctx.viaProxy ? { viaProxy: ctx.viaProxy } : {})
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/** One line for a log or an audit record: who, from where, and how. */
|
|
140
|
+
export function describeJobContext(ctx) {
|
|
141
|
+
const via = ctx.viaToken ? ` via token ${ctx.viaToken.id} ("${ctx.viaToken.name}")` : '';
|
|
142
|
+
const why = ctx.reason ? ` — ${ctx.reason}` : '';
|
|
143
|
+
return `${ctx.username} (${ctx.origin})${via}${why}`;
|
|
144
|
+
}
|