@nodefony/framework 10.0.0-alpha.1
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 +544 -0
- package/README.md +50 -0
- package/dist/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/decorate.js +9 -0
- package/dist/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/decorateMetadata.js +6 -0
- package/dist/index.js +211 -0
- package/dist/nodefony/config/config.js +61 -0
- package/dist/nodefony/config/defineModuleConfig.js +36 -0
- package/dist/nodefony/controller/AdminApiController.js +163 -0
- package/dist/nodefony/controller/ApiKeyController.js +151 -0
- package/dist/nodefony/controller/BenchController.js +132 -0
- package/dist/nodefony/controller/IssuerMetadataController.js +148 -0
- package/dist/nodefony/controller/OAuth2Controller.js +133 -0
- package/dist/nodefony/controller/ProtectedResourceMetadataController.js +221 -0
- package/dist/nodefony/controller/SessionAuthController.js +141 -0
- package/dist/nodefony/controller/TokenAuthController.js +113 -0
- package/dist/nodefony/controller/TotpController.js +129 -0
- package/dist/nodefony/controller/WebAuthnController.js +242 -0
- package/dist/nodefony/controller/oauthAuthority.js +74 -0
- package/dist/nodefony/decorators/routerDecorators.js +967 -0
- package/dist/nodefony/interfaces/IAdminBroker.js +1 -0
- package/dist/nodefony/interfaces/IController.js +1 -0
- package/dist/nodefony/interfaces/IIdempotencyStore.js +1 -0
- package/dist/nodefony/interfaces/IResolver.js +1 -0
- package/dist/nodefony/interfaces/IRoute.js +1 -0
- package/dist/nodefony/interfaces/index.js +1 -0
- package/dist/nodefony/service/AdminBroker.js +106 -0
- package/dist/nodefony/service/Eta.js +68 -0
- package/dist/nodefony/service/IdempotencyStore.js +136 -0
- package/dist/nodefony/service/router.js +243 -0
- package/dist/nodefony/src/Controller.js +515 -0
- package/dist/nodefony/src/FrameworkAdminApi.js +268 -0
- package/dist/nodefony/src/KernelAdminApi.js +1243 -0
- package/dist/nodefony/src/PlaygroundAdminApi.js +97 -0
- package/dist/nodefony/src/RedisIdempotencyStore.js +254 -0
- package/dist/nodefony/src/Resolver.js +416 -0
- package/dist/nodefony/src/ResourceController.js +148 -0
- package/dist/nodefony/src/Route.js +476 -0
- package/dist/nodefony/src/SyslogAdminApi.js +466 -0
- package/dist/nodefony/src/Template.js +15 -0
- package/dist/nodefony/src/configMutation.js +186 -0
- package/dist/nodefony/src/docsReader.js +929 -0
- package/dist/nodefony/src/idempotency.js +137 -0
- package/dist/nodefony/src/idempotencyGc.js +32 -0
- package/dist/nodefony/src/idempotencyStoreRegistry.js +36 -0
- package/dist/nodefony/src/scopeCatalog.js +40 -0
- package/dist/nodefony/src/syslogFilters.js +51 -0
- package/dist/types/index.d.ts +96 -0
- package/dist/types/nodefony/config/config.d.ts +41 -0
- package/dist/types/nodefony/config/defineModuleConfig.d.ts +27 -0
- package/dist/types/nodefony/controller/AdminApiController.d.ts +70 -0
- package/dist/types/nodefony/controller/ApiKeyController.d.ts +49 -0
- package/dist/types/nodefony/controller/BenchController.d.ts +45 -0
- package/dist/types/nodefony/controller/IssuerMetadataController.d.ts +86 -0
- package/dist/types/nodefony/controller/OAuth2Controller.d.ts +81 -0
- package/dist/types/nodefony/controller/ProtectedResourceMetadataController.d.ts +147 -0
- package/dist/types/nodefony/controller/SessionAuthController.d.ts +74 -0
- package/dist/types/nodefony/controller/TokenAuthController.d.ts +56 -0
- package/dist/types/nodefony/controller/TotpController.d.ts +42 -0
- package/dist/types/nodefony/controller/WebAuthnController.d.ts +123 -0
- package/dist/types/nodefony/controller/oauthAuthority.d.ts +54 -0
- package/dist/types/nodefony/decorators/routerDecorators.d.ts +632 -0
- package/dist/types/nodefony/interfaces/IAdminBroker.d.ts +79 -0
- package/dist/types/nodefony/interfaces/IController.d.ts +38 -0
- package/dist/types/nodefony/interfaces/IIdempotencyStore.d.ts +1 -0
- package/dist/types/nodefony/interfaces/IResolver.d.ts +25 -0
- package/dist/types/nodefony/interfaces/IRoute.d.ts +31 -0
- package/dist/types/nodefony/interfaces/index.d.ts +5 -0
- package/dist/types/nodefony/service/AdminBroker.d.ts +37 -0
- package/dist/types/nodefony/service/Eta.d.ts +25 -0
- package/dist/types/nodefony/service/IdempotencyStore.d.ts +45 -0
- package/dist/types/nodefony/service/router.d.ts +53 -0
- package/dist/types/nodefony/src/Controller.d.ts +193 -0
- package/dist/types/nodefony/src/FrameworkAdminApi.d.ts +35 -0
- package/dist/types/nodefony/src/KernelAdminApi.d.ts +71 -0
- package/dist/types/nodefony/src/PlaygroundAdminApi.d.ts +98 -0
- package/dist/types/nodefony/src/RedisIdempotencyStore.d.ts +104 -0
- package/dist/types/nodefony/src/Resolver.d.ts +165 -0
- package/dist/types/nodefony/src/ResourceController.d.ts +171 -0
- package/dist/types/nodefony/src/Route.d.ts +192 -0
- package/dist/types/nodefony/src/SyslogAdminApi.d.ts +38 -0
- package/dist/types/nodefony/src/Template.d.ts +8 -0
- package/dist/types/nodefony/src/configMutation.d.ts +109 -0
- package/dist/types/nodefony/src/docsReader.d.ts +369 -0
- package/dist/types/nodefony/src/idempotency.d.ts +96 -0
- package/dist/types/nodefony/src/idempotencyGc.d.ts +30 -0
- package/dist/types/nodefony/src/idempotencyStoreRegistry.d.ts +59 -0
- package/dist/types/nodefony/src/scopeCatalog.d.ts +26 -0
- package/dist/types/nodefony/src/syslogFilters.d.ts +52 -0
- package/docs/admin.md +451 -0
- package/docs/controller.md +645 -0
- package/docs/decorateurs.md +845 -0
- package/docs/idempotence.md +741 -0
- package/docs/index.md +151 -0
- package/docs/routing.md +648 -0
- package/docs/templates.md +380 -0
- package/package.json +83 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
//#region nodefony/controller/oauthAuthority.ts
|
|
2
|
+
/**
|
|
3
|
+
* Une seule règle : un document bien connu ne se sert QUE sur l'autorité dont
|
|
4
|
+
* il se réclame.
|
|
5
|
+
*
|
|
6
|
+
* Elle vaut pour les deux rôles OAuth que cette application peut tenir, et pour
|
|
7
|
+
* la même raison. Côté **émetteur** (RFC 8414 §3.3), le client DOIT rejeter un
|
|
8
|
+
* document dont l'`issuer` ne correspond pas à l'endroit où il l'a demandé.
|
|
9
|
+
* Côté **serveur de ressource** (RFC 9728 §3.3), il DOIT rejeter un document
|
|
10
|
+
* dont la `resource` ne correspond pas à l'URI de la ressource. Dans les deux
|
|
11
|
+
* cas, servir le document sur une autre autorité ne rend pas service au
|
|
12
|
+
* client : il le lit, le rejette, et **s'arrête là** — alors qu'un `404`
|
|
13
|
+
* l'aurait laissé continuer.
|
|
14
|
+
*
|
|
15
|
+
* 🔴 C'est exactement la faille qu'un vrai client MCP a trouvée en août : le
|
|
16
|
+
* document d'émetteur était servi sur TOUTE autorité, si bien qu'une sonde sur
|
|
17
|
+
* `http://localhost:5151` recevait le document de `https://localhost:5152` et
|
|
18
|
+
* déclarait la connexion en échec. Le banc de la veille testait le symptôme, pas
|
|
19
|
+
* la règle. Cette fonction est la règle, écrite une fois — la recopier dans
|
|
20
|
+
* chaque controller la ferait diverger au premier correctif.
|
|
21
|
+
*
|
|
22
|
+
* @see references/rfc/ietf/rfc8414.txt — métadonnées du serveur d'autorisation
|
|
23
|
+
* @see references/rfc/ietf/rfc9728.txt — métadonnées de la ressource protégée
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* La requête entre-t-elle par l'autorité dont ce document se réclame ?
|
|
27
|
+
*
|
|
28
|
+
* La comparaison porte sur l'**autorité demandée** (hôte + port, tels que le
|
|
29
|
+
* client les a écrits), jamais sur le schéma : derrière un relais qui termine
|
|
30
|
+
* TLS, le processus voit `http` pour une requête que le client a faite en
|
|
31
|
+
* `https`, et refuser là-dessus fermerait le document en production. Le port
|
|
32
|
+
* par défaut est normalisé par `URL` — `app.example:443` et `app.example`
|
|
33
|
+
* désignent le même serveur et doivent se valoir.
|
|
34
|
+
*
|
|
35
|
+
* Fonction **pure** : elle reçoit l'autorité demandée plutôt que d'aller la
|
|
36
|
+
* chercher dans un contexte, ce qui la rend éprouvable sans serveur — et permet
|
|
37
|
+
* au contexte WebSocket, dont la requête n'est qu'un `IncomingMessage`, de
|
|
38
|
+
* l'appeler avec la même valeur.
|
|
39
|
+
*
|
|
40
|
+
* @param asked - autorité demandée (`:authority` en HTTP/2, `Host` en HTTP/1.1)
|
|
41
|
+
* @param declared - URL absolue dont le document se réclame (émetteur ou ressource)
|
|
42
|
+
* @returns `true` si les deux désignent le même serveur
|
|
43
|
+
*/
|
|
44
|
+
function onDeclaredAuthority(asked, declared) {
|
|
45
|
+
if (typeof asked !== "string" || asked.length === 0) return false;
|
|
46
|
+
let wanted;
|
|
47
|
+
try {
|
|
48
|
+
wanted = new URL(declared);
|
|
49
|
+
} catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
return new URL(`${wanted.protocol}//${asked}`).host === wanted.host;
|
|
54
|
+
} catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Extrait l'autorité demandée des en-têtes bruts d'une requête.
|
|
60
|
+
*
|
|
61
|
+
* Lue ici plutôt que par un accesseur de `Request` : le type varie selon le
|
|
62
|
+
* transport (le contexte WebSocket n'expose qu'un `IncomingMessage`), et un
|
|
63
|
+
* document bien connu doit rester lisible par les deux.
|
|
64
|
+
*
|
|
65
|
+
* @param headers - en-têtes de la requête entrante
|
|
66
|
+
* @returns l'autorité telle que le client l'a écrite, ou `undefined`
|
|
67
|
+
*/
|
|
68
|
+
function askedAuthority(headers) {
|
|
69
|
+
const raw = headers?.[":authority"] ?? headers?.host;
|
|
70
|
+
const asked = Array.isArray(raw) ? raw[0] : raw;
|
|
71
|
+
return typeof asked === "string" && asked.length > 0 ? asked : void 0;
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
export { askedAuthority, onDeclaredAuthority };
|