@naylence/advanced-security 0.4.4 → 0.4.6

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.
Files changed (85) hide show
  1. package/dist/browser/index.cjs +702 -32
  2. package/dist/browser/index.mjs +702 -32
  3. package/dist/cjs/advanced-security-isomorphic.js +1 -1
  4. package/dist/cjs/advanced-security-isomorphic.js.map +1 -1
  5. package/dist/cjs/naylence/fame/expr/builtins.js +1 -1
  6. package/dist/cjs/naylence/fame/expr/builtins.js.map +1 -1
  7. package/dist/cjs/naylence/fame/factory-manifest.js +2 -0
  8. package/dist/cjs/naylence/fame/factory-manifest.js.map +1 -1
  9. package/dist/cjs/naylence/fame/security/auth/index.js +2 -0
  10. package/dist/cjs/naylence/fame/security/auth/index.js.map +1 -1
  11. package/dist/cjs/naylence/fame/security/auth/policy/advanced-authorization-policy.js +32 -13
  12. package/dist/cjs/naylence/fame/security/auth/policy/advanced-authorization-policy.js.map +1 -1
  13. package/dist/cjs/naylence/fame/security/auth/policy/auth-policy-server-cli.js +47 -0
  14. package/dist/cjs/naylence/fame/security/auth/policy/auth-policy-server-cli.js.map +1 -0
  15. package/dist/cjs/naylence/fame/security/auth/policy/auth-policy-server.js +553 -0
  16. package/dist/cjs/naylence/fame/security/auth/policy/auth-policy-server.js.map +1 -0
  17. package/dist/cjs/naylence/fame/security/auth/policy/expr-builtins.js +166 -2
  18. package/dist/cjs/naylence/fame/security/auth/policy/expr-builtins.js.map +1 -1
  19. package/dist/cjs/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.js +108 -0
  20. package/dist/cjs/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.js.map +1 -0
  21. package/dist/cjs/naylence/fame/security/auth/policy/http-authorization-policy-source.js +367 -0
  22. package/dist/cjs/naylence/fame/security/auth/policy/http-authorization-policy-source.js.map +1 -0
  23. package/dist/cjs/naylence/fame/security/auth/policy/index.js +4 -2
  24. package/dist/cjs/naylence/fame/security/auth/policy/index.js.map +1 -1
  25. package/dist/cjs/naylence/fame/security/auth/policy-http-authorization-profile.js +78 -0
  26. package/dist/cjs/naylence/fame/security/auth/policy-http-authorization-profile.js.map +1 -0
  27. package/dist/cjs/naylence/fame/security/register-advanced-security-factories.js +2 -0
  28. package/dist/cjs/naylence/fame/security/register-advanced-security-factories.js.map +1 -1
  29. package/dist/cjs/version.js +2 -2
  30. package/dist/esm/advanced-security-isomorphic.js +1 -1
  31. package/dist/esm/advanced-security-isomorphic.js.map +1 -1
  32. package/dist/esm/naylence/fame/expr/builtins.js +1 -1
  33. package/dist/esm/naylence/fame/expr/builtins.js.map +1 -1
  34. package/dist/esm/naylence/fame/factory-manifest.js +2 -0
  35. package/dist/esm/naylence/fame/factory-manifest.js.map +1 -1
  36. package/dist/esm/naylence/fame/security/auth/index.js +2 -0
  37. package/dist/esm/naylence/fame/security/auth/index.js.map +1 -1
  38. package/dist/esm/naylence/fame/security/auth/policy/advanced-authorization-policy.js +32 -13
  39. package/dist/esm/naylence/fame/security/auth/policy/advanced-authorization-policy.js.map +1 -1
  40. package/dist/esm/naylence/fame/security/auth/policy/auth-policy-server-cli.js +47 -0
  41. package/dist/esm/naylence/fame/security/auth/policy/auth-policy-server-cli.js.map +1 -0
  42. package/dist/esm/naylence/fame/security/auth/policy/auth-policy-server.js +553 -0
  43. package/dist/esm/naylence/fame/security/auth/policy/auth-policy-server.js.map +1 -0
  44. package/dist/esm/naylence/fame/security/auth/policy/expr-builtins.js +166 -2
  45. package/dist/esm/naylence/fame/security/auth/policy/expr-builtins.js.map +1 -1
  46. package/dist/esm/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.js +108 -0
  47. package/dist/esm/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.js.map +1 -0
  48. package/dist/esm/naylence/fame/security/auth/policy/http-authorization-policy-source.js +367 -0
  49. package/dist/esm/naylence/fame/security/auth/policy/http-authorization-policy-source.js.map +1 -0
  50. package/dist/esm/naylence/fame/security/auth/policy/index.js +4 -2
  51. package/dist/esm/naylence/fame/security/auth/policy/index.js.map +1 -1
  52. package/dist/esm/naylence/fame/security/auth/policy-http-authorization-profile.js +78 -0
  53. package/dist/esm/naylence/fame/security/auth/policy-http-authorization-profile.js.map +1 -0
  54. package/dist/esm/naylence/fame/security/register-advanced-security-factories.js +2 -0
  55. package/dist/esm/naylence/fame/security/register-advanced-security-factories.js.map +1 -1
  56. package/dist/esm/version.js +2 -2
  57. package/dist/node/index.cjs +777 -139
  58. package/dist/node/index.mjs +770 -109
  59. package/dist/node/node.cjs +788 -65
  60. package/dist/node/node.mjs +780 -34
  61. package/dist/types/advanced-security-isomorphic.d.ts +0 -1
  62. package/dist/types/advanced-security-isomorphic.d.ts.map +1 -1
  63. package/dist/types/naylence/fame/factory-manifest.d.ts +1 -1
  64. package/dist/types/naylence/fame/factory-manifest.d.ts.map +1 -1
  65. package/dist/types/naylence/fame/security/auth/index.d.ts +1 -0
  66. package/dist/types/naylence/fame/security/auth/index.d.ts.map +1 -1
  67. package/dist/types/naylence/fame/security/auth/policy/advanced-authorization-policy.d.ts.map +1 -1
  68. package/dist/types/naylence/fame/security/auth/policy/auth-policy-server-cli.d.ts +20 -0
  69. package/dist/types/naylence/fame/security/auth/policy/auth-policy-server-cli.d.ts.map +1 -0
  70. package/dist/types/naylence/fame/security/auth/policy/auth-policy-server.d.ts +74 -0
  71. package/dist/types/naylence/fame/security/auth/policy/auth-policy-server.d.ts.map +1 -0
  72. package/dist/types/naylence/fame/security/auth/policy/expr-builtins.d.ts +71 -1
  73. package/dist/types/naylence/fame/security/auth/policy/expr-builtins.d.ts.map +1 -1
  74. package/dist/types/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.d.ts +81 -0
  75. package/dist/types/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.d.ts.map +1 -0
  76. package/dist/types/naylence/fame/security/auth/policy/http-authorization-policy-source.d.ts +150 -0
  77. package/dist/types/naylence/fame/security/auth/policy/http-authorization-policy-source.d.ts.map +1 -0
  78. package/dist/types/naylence/fame/security/auth/policy/index.d.ts +2 -1
  79. package/dist/types/naylence/fame/security/auth/policy/index.d.ts.map +1 -1
  80. package/dist/types/naylence/fame/security/auth/policy-http-authorization-profile.d.ts +17 -0
  81. package/dist/types/naylence/fame/security/auth/policy-http-authorization-profile.d.ts.map +1 -0
  82. package/dist/types/naylence/fame/security/register-advanced-security-factories.d.ts +1 -0
  83. package/dist/types/naylence/fame/security/register-advanced-security-factories.d.ts.map +1 -1
  84. package/dist/types/version.d.ts +1 -1
  85. package/package.json +3 -2
@@ -4,10 +4,88 @@
4
4
  * Null handling semantics:
5
5
  * - Scope predicate builtins (has_scope, has_any_scope, has_all_scopes)
6
6
  * return `false` when passed `null` for required args.
7
+ * - Security predicate builtins (is_signed, is_encrypted, is_encrypted_at_least)
8
+ * return `false` when the envelope lacks the required security posture.
7
9
  * - Wrong non-null types still raise BuiltinError to surface real bugs.
8
10
  */
9
11
  import { BUILTIN_FUNCTIONS, getTypeName, } from "../../../expr/index.js";
10
12
  import { BuiltinError } from "../../../expr/errors.js";
13
+ /**
14
+ * Valid encryption levels for is_encrypted_at_least comparisons.
15
+ */
16
+ const VALID_ENCRYPTION_LEVELS = [
17
+ "plaintext",
18
+ "channel",
19
+ "sealed",
20
+ ];
21
+ /**
22
+ * Encryption level ordering for comparison.
23
+ * Higher number = stronger encryption.
24
+ */
25
+ const ENCRYPTION_LEVEL_ORDER = {
26
+ plaintext: 0,
27
+ channel: 1,
28
+ sealed: 2,
29
+ };
30
+ /**
31
+ * Normalizes an encryption algorithm string to an EncryptionLevel.
32
+ *
33
+ * Mapping rules:
34
+ * - null/undefined => "plaintext" (no encryption present)
35
+ * - alg contains "-channel" => "channel" (e.g., "chacha20-poly1305-channel")
36
+ * - alg contains "-sealed" => "sealed" (explicit sealed marker)
37
+ * - alg matches ECDH-ES pattern with AEAD cipher => "sealed" (e.g., "ECDH-ES+A256GCM")
38
+ * - otherwise => "unknown"
39
+ *
40
+ * Currently supported algorithms:
41
+ * - Channel: "chacha20-poly1305-channel"
42
+ * - Sealed: "ECDH-ES+A256GCM"
43
+ *
44
+ * This helper is centralized to ensure consistent mapping across TS and Python.
45
+ */
46
+ export function normalizeEncryptionLevelFromAlg(alg) {
47
+ if (alg === null || alg === undefined) {
48
+ return "plaintext";
49
+ }
50
+ const algLower = alg.toLowerCase();
51
+ // Check for channel encryption (e.g., "chacha20-poly1305-channel")
52
+ // Must check before other patterns since channel suffix is explicit
53
+ if (algLower.includes("-channel")) {
54
+ return "channel";
55
+ }
56
+ // Check for explicit sealed marker
57
+ if (algLower.includes("-sealed")) {
58
+ return "sealed";
59
+ }
60
+ // ECDH-ES key agreement with AEAD cipher => sealed encryption
61
+ // Pattern: "ECDH-ES+A256GCM", "ECDH-ES+A128GCM", etc.
62
+ if (algLower.startsWith("ecdh-es") && algLower.includes("+a")) {
63
+ return "sealed";
64
+ }
65
+ return "unknown";
66
+ }
67
+ /**
68
+ * Creates security bindings from an envelope's sec header.
69
+ * Exposes only metadata, never raw values like sig.val or enc.val.
70
+ */
71
+ export function createSecurityBindings(sec) {
72
+ const sigPresent = sec?.sig !== undefined;
73
+ const encPresent = sec?.enc !== undefined;
74
+ return {
75
+ sig: {
76
+ present: sigPresent,
77
+ kid: sec?.sig?.kid ?? null,
78
+ },
79
+ enc: {
80
+ present: encPresent,
81
+ alg: sec?.enc?.alg ?? null,
82
+ kid: sec?.enc?.kid ?? null,
83
+ level: encPresent
84
+ ? normalizeEncryptionLevelFromAlg(sec?.enc?.alg ?? null)
85
+ : "plaintext",
86
+ },
87
+ };
88
+ }
11
89
  /**
12
90
  * Checks if a value is null.
13
91
  */
@@ -16,9 +94,21 @@ function isNull(value) {
16
94
  }
17
95
  /**
18
96
  * Creates a function registry with auth helpers installed.
97
+ *
98
+ * This registry extends the base builtins with:
99
+ * - Scope builtins: has_scope, has_any_scope, has_all_scopes
100
+ * - Security builtins: is_signed, encryption_level, is_encrypted, is_encrypted_at_least
19
101
  */
20
- export function createAuthFunctionRegistry(grantedScopes = []) {
21
- const scopes = grantedScopes ?? [];
102
+ export function createAuthFunctionRegistry(grantedScopesOrOptions = []) {
103
+ // Handle both old signature (array) and new signature (options object)
104
+ const options = Array.isArray(grantedScopesOrOptions)
105
+ ? { grantedScopes: grantedScopesOrOptions }
106
+ : grantedScopesOrOptions;
107
+ const scopes = options.grantedScopes ?? [];
108
+ const secBindings = options.securityBindings ?? {
109
+ sig: { present: false, kid: null },
110
+ enc: { present: false, alg: null, kid: null, level: "plaintext" },
111
+ };
22
112
  /**
23
113
  * Checks if any granted scope matches a pattern (using glob syntax).
24
114
  */
@@ -74,11 +164,85 @@ export function createAuthFunctionRegistry(grantedScopes = []) {
74
164
  }
75
165
  return values.every((scope) => matchesScope(scope));
76
166
  };
167
+ // ============================================================
168
+ // Security posture builtins
169
+ // ============================================================
170
+ /**
171
+ * is_signed() -> bool
172
+ *
173
+ * Returns true if the envelope has a signature present.
174
+ * No arguments required.
175
+ */
176
+ const is_signed = (args) => {
177
+ assertArgCount(args, 0, "is_signed");
178
+ return secBindings.sig.present;
179
+ };
180
+ /**
181
+ * encryption_level() -> string
182
+ *
183
+ * Returns the normalized encryption level: "plaintext" | "channel" | "sealed" | "unknown"
184
+ * No arguments required.
185
+ */
186
+ const encryption_level = (args) => {
187
+ assertArgCount(args, 0, "encryption_level");
188
+ return secBindings.enc.level;
189
+ };
190
+ /**
191
+ * is_encrypted() -> bool
192
+ *
193
+ * Returns true if the encryption level is not "plaintext".
194
+ * This means the envelope has some form of encryption (channel, sealed, or unknown).
195
+ * No arguments required.
196
+ */
197
+ const is_encrypted = (args) => {
198
+ assertArgCount(args, 0, "is_encrypted");
199
+ return secBindings.enc.level !== "plaintext";
200
+ };
201
+ /**
202
+ * is_encrypted_at_least(level: string) -> bool
203
+ *
204
+ * Returns true if the envelope's encryption level meets or exceeds the required level.
205
+ *
206
+ * Level ordering: plaintext < channel < sealed
207
+ *
208
+ * Special handling:
209
+ * - "unknown" encryption level does NOT satisfy "channel" or "sealed" (conservative)
210
+ * - "plaintext" is always satisfied (any envelope meets at least plaintext)
211
+ * - null argument => false (predicate-style)
212
+ * - invalid level string => BuiltinError
213
+ */
214
+ const is_encrypted_at_least = (args) => {
215
+ assertArgCount(args, 1, "is_encrypted_at_least");
216
+ const requiredLevel = getArg(args, 0, "is_encrypted_at_least");
217
+ // Null-tolerant: return false if level is null
218
+ if (!assertStringOrNull(requiredLevel, "level", "is_encrypted_at_least")) {
219
+ return false;
220
+ }
221
+ // Validate required level
222
+ if (!VALID_ENCRYPTION_LEVELS.includes(requiredLevel)) {
223
+ throw new BuiltinError("is_encrypted_at_least", `level must be one of: ${VALID_ENCRYPTION_LEVELS.join(", ")}; got "${requiredLevel}"`);
224
+ }
225
+ const currentLevel = secBindings.enc.level;
226
+ const requiredOrder = ENCRYPTION_LEVEL_ORDER[requiredLevel] ?? 0;
227
+ const currentOrder = ENCRYPTION_LEVEL_ORDER[currentLevel];
228
+ // If current level is "unknown", it only satisfies "plaintext"
229
+ if (currentOrder === undefined) {
230
+ // "unknown" is treated as NOT meeting channel/sealed requirements
231
+ return requiredOrder === 0; // Only plaintext is satisfied by unknown
232
+ }
233
+ return currentOrder >= requiredOrder;
234
+ };
77
235
  return new Map([
78
236
  ...BUILTIN_FUNCTIONS,
237
+ // Scope builtins
79
238
  ["has_scope", has_scope],
80
239
  ["has_any_scope", has_any_scope],
81
240
  ["has_all_scopes", has_all_scopes],
241
+ // Security posture builtins
242
+ ["is_signed", is_signed],
243
+ ["encryption_level", encryption_level],
244
+ ["is_encrypted", is_encrypted],
245
+ ["is_encrypted_at_least", is_encrypted_at_least],
82
246
  ]);
83
247
  }
84
248
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"expr-builtins.js","sourceRoot":"","sources":["../../../../../../../src/naylence/fame/security/auth/policy/expr-builtins.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"expr-builtins.js","sourceRoot":"","sources":["../../../../../../../src/naylence/fame/security/auth/policy/expr-builtins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Factory for creating HttpAuthorizationPolicySource instances.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ import { AUTHORIZATION_POLICY_SOURCE_FACTORY_BASE_TYPE, AuthorizationPolicySourceFactory, TokenProviderFactory, } from "@naylence/runtime";
7
+ let httpModulePromise = null;
8
+ async function getHttpModule() {
9
+ if (!httpModulePromise) {
10
+ httpModulePromise = import("./http-authorization-policy-source.js");
11
+ }
12
+ return httpModulePromise;
13
+ }
14
+ function normalizeConfig(config) {
15
+ if (!config) {
16
+ throw new Error("HttpAuthorizationPolicySourceFactory requires a configuration with a url");
17
+ }
18
+ const candidate = config;
19
+ const url = candidate.url;
20
+ if (typeof url !== "string" || url.trim().length === 0) {
21
+ throw new Error("HttpAuthorizationPolicySourceConfig requires a non-empty url");
22
+ }
23
+ // Support both camelCase and snake_case
24
+ const method = candidate.method ?? "GET";
25
+ if (!["GET", "POST", "PUT"].includes(method)) {
26
+ throw new Error(`Invalid method "${String(method)}". Must be "GET", "POST", or "PUT"`);
27
+ }
28
+ const timeoutMs = candidate.timeout_ms ??
29
+ candidate.timeoutMs ??
30
+ 30000;
31
+ if (typeof timeoutMs !== "number" || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {
32
+ throw new Error("timeout_ms must be a positive number");
33
+ }
34
+ const headers = candidate.headers;
35
+ if (headers !== undefined && typeof headers !== "object") {
36
+ throw new Error("headers must be an object");
37
+ }
38
+ const tokenProviderConfig = candidate.token_provider ??
39
+ candidate.tokenProvider;
40
+ const bearerPrefix = candidate.bearer_prefix ??
41
+ candidate.bearerPrefix ??
42
+ "Bearer ";
43
+ const policyFactory = candidate.policy_factory ??
44
+ candidate.policyFactory;
45
+ const cacheTtlMs = candidate.cache_ttl_ms ??
46
+ candidate.cacheTtlMs ??
47
+ 300000;
48
+ if (typeof cacheTtlMs !== "number" || !Number.isFinite(cacheTtlMs) || cacheTtlMs < 0) {
49
+ throw new Error("cache_ttl_ms must be a non-negative number");
50
+ }
51
+ return {
52
+ url: url.trim(),
53
+ method,
54
+ timeoutMs,
55
+ headers,
56
+ tokenProviderConfig,
57
+ bearerPrefix,
58
+ policyFactory,
59
+ cacheTtlMs,
60
+ };
61
+ }
62
+ /**
63
+ * Factory metadata for registration.
64
+ */
65
+ export const FACTORY_META = {
66
+ base: AUTHORIZATION_POLICY_SOURCE_FACTORY_BASE_TYPE,
67
+ key: "HttpAuthorizationPolicySource",
68
+ };
69
+ /**
70
+ * Factory for creating HttpAuthorizationPolicySource instances.
71
+ *
72
+ * This factory uses lazy loading to avoid pulling in Node.js-specific
73
+ * code (fetch operations) in browser environments where it may not work.
74
+ */
75
+ export class HttpAuthorizationPolicySourceFactory extends AuthorizationPolicySourceFactory {
76
+ constructor() {
77
+ super(...arguments);
78
+ this.type = "HttpAuthorizationPolicySource";
79
+ }
80
+ /**
81
+ * Creates an HttpAuthorizationPolicySource from the given configuration.
82
+ *
83
+ * @param config - Configuration specifying the policy URL and options
84
+ * @returns The created policy source
85
+ */
86
+ async create(config) {
87
+ const normalized = normalizeConfig(config);
88
+ // Create token provider if configured
89
+ let tokenProvider;
90
+ if (normalized.tokenProviderConfig) {
91
+ tokenProvider = await TokenProviderFactory.createTokenProvider(normalized.tokenProviderConfig);
92
+ }
93
+ const { HttpAuthorizationPolicySource } = await getHttpModule();
94
+ const options = {
95
+ url: normalized.url,
96
+ method: normalized.method,
97
+ timeoutMs: normalized.timeoutMs,
98
+ headers: normalized.headers,
99
+ tokenProvider,
100
+ bearerPrefix: normalized.bearerPrefix,
101
+ policyFactory: normalized.policyFactory,
102
+ cacheTtlMs: normalized.cacheTtlMs,
103
+ };
104
+ return new HttpAuthorizationPolicySource(options);
105
+ }
106
+ }
107
+ export default HttpAuthorizationPolicySourceFactory;
108
+ //# sourceMappingURL=http-authorization-policy-source-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-authorization-policy-source-factory.js","sourceRoot":"","sources":["../../../../../../../src/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.ts"],"names":[],"mappings":"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"}