arc-1 0.6.10 → 0.7.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.
Files changed (115) hide show
  1. package/README.md +8 -7
  2. package/bin/arc1-cli.js +10 -0
  3. package/bin/arc1.js +1 -1
  4. package/dist/adt/cds-impact.d.ts +35 -0
  5. package/dist/adt/cds-impact.d.ts.map +1 -1
  6. package/dist/adt/cds-impact.js +71 -0
  7. package/dist/adt/cds-impact.js.map +1 -1
  8. package/dist/adt/client.d.ts +4 -1
  9. package/dist/adt/client.d.ts.map +1 -1
  10. package/dist/adt/client.js +18 -5
  11. package/dist/adt/client.js.map +1 -1
  12. package/dist/adt/crud.d.ts.map +1 -1
  13. package/dist/adt/crud.js +32 -5
  14. package/dist/adt/crud.js.map +1 -1
  15. package/dist/adt/devtools.d.ts +39 -3
  16. package/dist/adt/devtools.d.ts.map +1 -1
  17. package/dist/adt/devtools.js +237 -25
  18. package/dist/adt/devtools.js.map +1 -1
  19. package/dist/adt/diagnostics.d.ts +69 -7
  20. package/dist/adt/diagnostics.d.ts.map +1 -1
  21. package/dist/adt/diagnostics.js +694 -36
  22. package/dist/adt/diagnostics.js.map +1 -1
  23. package/dist/adt/errors.d.ts +14 -1
  24. package/dist/adt/errors.d.ts.map +1 -1
  25. package/dist/adt/errors.js +40 -9
  26. package/dist/adt/errors.js.map +1 -1
  27. package/dist/adt/http.d.ts.map +1 -1
  28. package/dist/adt/http.js +86 -1
  29. package/dist/adt/http.js.map +1 -1
  30. package/dist/adt/rap-handlers.d.ts +165 -0
  31. package/dist/adt/rap-handlers.d.ts.map +1 -0
  32. package/dist/adt/rap-handlers.js +835 -0
  33. package/dist/adt/rap-handlers.js.map +1 -0
  34. package/dist/adt/rap-preflight.d.ts +43 -0
  35. package/dist/adt/rap-preflight.d.ts.map +1 -0
  36. package/dist/adt/rap-preflight.js +405 -0
  37. package/dist/adt/rap-preflight.js.map +1 -0
  38. package/dist/adt/safety.d.ts +60 -36
  39. package/dist/adt/safety.d.ts.map +1 -1
  40. package/dist/adt/safety.js +202 -120
  41. package/dist/adt/safety.js.map +1 -1
  42. package/dist/adt/transport.d.ts +1 -1
  43. package/dist/adt/transport.js +2 -2
  44. package/dist/adt/transport.js.map +1 -1
  45. package/dist/adt/types.d.ts +88 -0
  46. package/dist/adt/types.d.ts.map +1 -1
  47. package/dist/adt/xml-parser.d.ts +13 -1
  48. package/dist/adt/xml-parser.d.ts.map +1 -1
  49. package/dist/adt/xml-parser.js +26 -15
  50. package/dist/adt/xml-parser.js.map +1 -1
  51. package/dist/authz/policy.d.ts +53 -0
  52. package/dist/authz/policy.d.ts.map +1 -0
  53. package/dist/authz/policy.js +199 -0
  54. package/dist/authz/policy.js.map +1 -0
  55. package/dist/cli-args.d.ts +14 -0
  56. package/dist/cli-args.d.ts.map +1 -0
  57. package/dist/cli-args.js +62 -0
  58. package/dist/cli-args.js.map +1 -0
  59. package/dist/cli.d.ts +13 -7
  60. package/dist/cli.d.ts.map +1 -1
  61. package/dist/cli.js +252 -55
  62. package/dist/cli.js.map +1 -1
  63. package/dist/extract-sap-cookies.d.ts +24 -0
  64. package/dist/extract-sap-cookies.d.ts.map +1 -0
  65. package/dist/extract-sap-cookies.js +317 -0
  66. package/dist/extract-sap-cookies.js.map +1 -0
  67. package/dist/handlers/hyperfocused.d.ts +4 -3
  68. package/dist/handlers/hyperfocused.d.ts.map +1 -1
  69. package/dist/handlers/hyperfocused.js +25 -16
  70. package/dist/handlers/hyperfocused.js.map +1 -1
  71. package/dist/handlers/intent.d.ts +4 -12
  72. package/dist/handlers/intent.d.ts.map +1 -1
  73. package/dist/handlers/intent.js +1238 -114
  74. package/dist/handlers/intent.js.map +1 -1
  75. package/dist/handlers/schemas.d.ts +38 -10
  76. package/dist/handlers/schemas.d.ts.map +1 -1
  77. package/dist/handlers/schemas.js +69 -4
  78. package/dist/handlers/schemas.js.map +1 -1
  79. package/dist/handlers/tools.d.ts.map +1 -1
  80. package/dist/handlers/tools.js +251 -164
  81. package/dist/handlers/tools.js.map +1 -1
  82. package/dist/index.d.ts +1 -1
  83. package/dist/index.js +7 -6
  84. package/dist/index.js.map +1 -1
  85. package/dist/server/audit.d.ts +26 -3
  86. package/dist/server/audit.d.ts.map +1 -1
  87. package/dist/server/audit.js.map +1 -1
  88. package/dist/server/config.d.ts +34 -19
  89. package/dist/server/config.d.ts.map +1 -1
  90. package/dist/server/config.js +320 -193
  91. package/dist/server/config.js.map +1 -1
  92. package/dist/server/deny-actions.d.ts +31 -0
  93. package/dist/server/deny-actions.d.ts.map +1 -0
  94. package/dist/server/deny-actions.js +156 -0
  95. package/dist/server/deny-actions.js.map +1 -0
  96. package/dist/server/effective-policy-log.d.ts +27 -0
  97. package/dist/server/effective-policy-log.d.ts.map +1 -0
  98. package/dist/server/effective-policy-log.js +103 -0
  99. package/dist/server/effective-policy-log.js.map +1 -0
  100. package/dist/server/http.d.ts.map +1 -1
  101. package/dist/server/http.js +15 -16
  102. package/dist/server/http.js.map +1 -1
  103. package/dist/server/server.d.ts +37 -3
  104. package/dist/server/server.d.ts.map +1 -1
  105. package/dist/server/server.js +231 -30
  106. package/dist/server/server.js.map +1 -1
  107. package/dist/server/types.d.ts +29 -13
  108. package/dist/server/types.d.ts.map +1 -1
  109. package/dist/server/types.js +10 -11
  110. package/dist/server/types.js.map +1 -1
  111. package/dist/server/xsuaa.d.ts +1 -2
  112. package/dist/server/xsuaa.d.ts.map +1 -1
  113. package/dist/server/xsuaa.js +13 -14
  114. package/dist/server/xsuaa.js.map +1 -1
  115. package/package.json +6 -3
@@ -4,18 +4,24 @@
4
4
  * Gates all operations before they reach SAP. This is the first line of defense
5
5
  * against unintended modifications — it runs before any HTTP call.
6
6
  *
7
- * Key design principle: safety checks are declarative and composable.
8
- * Each check is independent: readOnly, blockFreeSQL, allowedOps, disallowedOps,
9
- * allowedPackages, enableTransports, etc. They combine additively if ANY
10
- * check blocks the operation, it's blocked.
7
+ * Design (post-authz-refactor-v2):
8
+ * - Safety flags are all POSITIVE opt-ins (`allow*=true` to enable a capability).
9
+ * Defaults are restrictive. No mix of negations and opt-ins.
10
+ * - Every mutation requires the matching server flag AND the user's scope
11
+ * (two-gate rule; scope check happens in the handler layer).
12
+ * - `allowWrites=false` is a TRUE no-mutation block — it stops object writes,
13
+ * transport writes, git writes, and activation (no loopholes).
14
+ * - Fine-grained per-action denials are expressed via `denyActions` (parsed
15
+ * from `SAP_DENY_ACTIONS`), not via op-code allow/block lists.
11
16
  *
12
- * This matches the Go implementation exactly (pkg/adt/safety.go) to ensure
13
- * behavioral parity during migration.
17
+ * Internal only: `OperationType` is the classification used by the safety
18
+ * engine. It is NOT admin-facing — the env vars `SAP_ALLOWED_OPS` /
19
+ * `SAP_DISALLOWED_OPS` were removed in v0.7. Admins configure via the `allow*`
20
+ * flags and `SAP_DENY_ACTIONS`.
14
21
  */
15
22
  /**
16
- * Operation type codes.
17
- * Single-character codes used in allowedOps/disallowedOps strings.
18
- * Example: "RSQ" = allow Read, Search, Query only.
23
+ * Operation type codes (internal classification).
24
+ * NOT admin-facing the code just uses these as a compact categorical label.
19
25
  */
20
26
  export declare const OperationType: {
21
27
  readonly Read: "R";
@@ -34,48 +40,66 @@ export declare const OperationType: {
34
40
  };
35
41
  export type OperationTypeCode = (typeof OperationType)[keyof typeof OperationType];
36
42
  export interface SafetyConfig {
37
- readOnly: boolean;
38
- blockFreeSQL: boolean;
39
- blockData: boolean;
40
- allowedOps: string;
41
- disallowedOps: string;
43
+ allowWrites: boolean;
44
+ allowDataPreview: boolean;
45
+ allowFreeSQL: boolean;
46
+ allowTransportWrites: boolean;
47
+ allowGitWrites: boolean;
42
48
  allowedPackages: string[];
43
- dryRun: boolean;
44
- enableGit: boolean;
45
- enableTransports: boolean;
46
- transportReadOnly: boolean;
47
49
  allowedTransports: string[];
50
+ /** Resolved deny-action patterns from SAP_DENY_ACTIONS. Populated at config-parse time. */
51
+ denyActions: string[];
48
52
  }
49
- /** Safe defaults: read-only, no free SQL, standard ops only */
53
+ /**
54
+ * Safe defaults — mirrors DEFAULT_CONFIG in src/server/types.ts.
55
+ * Use this when a test needs the real ship default without re-deriving it.
56
+ * If you change DEFAULT_CONFIG's safety fields, update this to match.
57
+ */
50
58
  export declare function defaultSafetyConfig(): SafetyConfig;
51
- /** No restrictions — use with caution */
59
+ /** No restrictions — use with caution. */
52
60
  export declare function unrestrictedSafetyConfig(): SafetyConfig;
53
- /** Check if an operation type is allowed by the safety config */
61
+ /** Check if an operation type is allowed by the safety config. */
54
62
  export declare function isOperationAllowed(config: SafetyConfig, op: OperationTypeCode): boolean;
55
- /** Check operation and throw AdtSafetyError if blocked */
63
+ /** Check operation and throw AdtSafetyError if blocked. */
56
64
  export declare function checkOperation(config: SafetyConfig, op: OperationTypeCode, opName: string): void;
57
- /** Check if operations on a given package are allowed */
65
+ /** Check if operations on a given package are allowed (write-only check). */
58
66
  export declare function isPackageAllowed(config: SafetyConfig, pkg: string): boolean;
59
- /** Check package and throw AdtSafetyError if blocked */
67
+ /** Check package and throw AdtSafetyError if blocked. */
60
68
  export declare function checkPackage(config: SafetyConfig, pkg: string): void;
61
- /** Check transport operation and throw AdtSafetyError if blocked */
69
+ /**
70
+ * Check transport operation. Writes require `allowWrites && allowTransportWrites`.
71
+ * Reads are always allowed at this layer (scope check enforces user gating upstream).
72
+ */
62
73
  export declare function checkTransport(config: SafetyConfig, transport: string, opName: string, isWrite: boolean): void;
63
- /** Check git operation and throw AdtSafetyError if blocked */
64
- export declare function checkGit(config: SafetyConfig, operation: string): void;
65
74
  /**
66
- * Expand implied scopes: `write` implies `read`, `sql` implies `data`.
67
- * Returns a new array with implied scopes added.
75
+ * Check git operation. Writes require `allowWrites && allowGitWrites`.
76
+ * Reads are always allowed at this layer.
68
77
  */
69
- export declare function expandImpliedScopes(scopes: string[]): string[];
78
+ export declare function checkGit(config: SafetyConfig, operation: string, isWrite?: boolean): void;
70
79
  /**
71
- * Derive a per-user safety config by merging server-level config (ceiling)
72
- * with JWT scopes. Scopes can only RESTRICT further, never expand beyond
73
- * what the server config allows.
80
+ * Derive a per-user effective safety config by merging the server ceiling with
81
+ * the user's JWT scopes. Scopes can only RESTRICT further, never loosen.
74
82
  *
75
- * Key principle: start with server config, only tighten booleans (false→true).
76
- * Never loosen (true→false).
83
+ * Uses the scope expansion rules from src/authz/policy.ts (admin implies all,
84
+ * write implies read, sql implies data). Callers should pass the already-expanded
85
+ * scope list for speed; this function re-expands as a safety net.
77
86
  */
78
87
  export declare function deriveUserSafety(serverConfig: SafetyConfig, scopes: string[]): SafetyConfig;
79
- /** Human-readable description of the safety configuration */
88
+ /**
89
+ * Derive a per-user effective safety by intersecting a partial SafetyConfig
90
+ * (from an API-key profile) with the server ceiling. Tight side wins field-by-field.
91
+ *
92
+ * Semantics:
93
+ * - Boolean fields: result is `server && profile` (both must be true for capability on).
94
+ * - `allowedPackages`:
95
+ * * If either side is `[]` (no restriction), use the other.
96
+ * * Else intersection by prefix semantics — profile entries covered by the
97
+ * server ceiling survive. If none survive, the effective list denies all
98
+ * packages/transports (true intersection).
99
+ * - `allowedTransports`: same as allowedPackages.
100
+ * - `denyActions`: union (both the server and profile denies apply).
101
+ */
102
+ export declare function deriveUserSafetyFromProfile(serverConfig: SafetyConfig, profileSafety: Partial<SafetyConfig>): SafetyConfig;
103
+ /** Human-readable description of the safety configuration. */
80
104
  export declare function describeSafety(config: SafetyConfig): string;
81
105
  //# sourceMappingURL=safety.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/adt/safety.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH;;;;GAIG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;CAchB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAKnF,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,IAAI,YAAY,CAclD;AAED,yCAAyC;AACzC,wBAAgB,wBAAwB,IAAI,YAAY,CAcvD;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAuBvF;AAED,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAIhG;AAED,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAmB3E;AAED,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAMpE;AAoBD,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAqB9G;AAED,8DAA8D;AAC9D,wBAAgB,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAMtE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAK9D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CA0B3F;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAgB3D"}
1
+ {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/adt/safety.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;CAchB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAcnF,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,2FAA2F;IAC3F,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,YAAY,CAWlD;AAED,0CAA0C;AAC1C,wBAAgB,wBAAwB,IAAI,YAAY,CAWvD;AAED,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAgBvF;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAMhG;AAYD,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAoB3E;AAED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAMpE;AAqBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAsB9G;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,UAAO,GAAG,IAAI,CAYtF;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CA6B3F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,OAAO,CAAC,YAAY,CAAC,GACnC,YAAY,CAuCd;AAED,8DAA8D;AAC9D,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAY3D"}
@@ -4,19 +4,25 @@
4
4
  * Gates all operations before they reach SAP. This is the first line of defense
5
5
  * against unintended modifications — it runs before any HTTP call.
6
6
  *
7
- * Key design principle: safety checks are declarative and composable.
8
- * Each check is independent: readOnly, blockFreeSQL, allowedOps, disallowedOps,
9
- * allowedPackages, enableTransports, etc. They combine additively if ANY
10
- * check blocks the operation, it's blocked.
7
+ * Design (post-authz-refactor-v2):
8
+ * - Safety flags are all POSITIVE opt-ins (`allow*=true` to enable a capability).
9
+ * Defaults are restrictive. No mix of negations and opt-ins.
10
+ * - Every mutation requires the matching server flag AND the user's scope
11
+ * (two-gate rule; scope check happens in the handler layer).
12
+ * - `allowWrites=false` is a TRUE no-mutation block — it stops object writes,
13
+ * transport writes, git writes, and activation (no loopholes).
14
+ * - Fine-grained per-action denials are expressed via `denyActions` (parsed
15
+ * from `SAP_DENY_ACTIONS`), not via op-code allow/block lists.
11
16
  *
12
- * This matches the Go implementation exactly (pkg/adt/safety.go) to ensure
13
- * behavioral parity during migration.
17
+ * Internal only: `OperationType` is the classification used by the safety
18
+ * engine. It is NOT admin-facing — the env vars `SAP_ALLOWED_OPS` /
19
+ * `SAP_DISALLOWED_OPS` were removed in v0.7. Admins configure via the `allow*`
20
+ * flags and `SAP_DENY_ACTIONS`.
14
21
  */
15
22
  import { AdtSafetyError } from './errors.js';
16
23
  /**
17
- * Operation type codes.
18
- * Single-character codes used in allowedOps/disallowedOps strings.
19
- * Example: "RSQ" = allow Read, Search, Query only.
24
+ * Operation type codes (internal classification).
25
+ * NOT admin-facing the code just uses these as a compact categorical label.
20
26
  */
21
27
  export const OperationType = {
22
28
  Read: 'R',
@@ -33,73 +39,85 @@ export const OperationType = {
33
39
  Workflow: 'W',
34
40
  Transport: 'X',
35
41
  };
36
- /** Write operations that are blocked in read-only mode */
37
- const WRITE_OPS = 'CDUAW';
38
- /** Safe defaults: read-only, no free SQL, standard ops only */
42
+ /** Mutating operation types blocked when `allowWrites=false`. */
43
+ const MUTATING_OPS = 'CDUAWX';
44
+ const DENY_ALL_LIST_ENTRY = '__ARC1_DENY_ALL__';
45
+ function listDeniesAll(list) {
46
+ return list.includes(DENY_ALL_LIST_ENTRY);
47
+ }
48
+ function displayAllowList(list) {
49
+ return listDeniesAll(list) ? '[]' : `[${list.join(',')}]`;
50
+ }
51
+ /**
52
+ * Safe defaults — mirrors DEFAULT_CONFIG in src/server/types.ts.
53
+ * Use this when a test needs the real ship default without re-deriving it.
54
+ * If you change DEFAULT_CONFIG's safety fields, update this to match.
55
+ */
39
56
  export function defaultSafetyConfig() {
40
57
  return {
41
- readOnly: true,
42
- blockFreeSQL: true,
43
- blockData: true,
44
- allowedOps: 'RSQTI',
45
- disallowedOps: '',
46
- allowedPackages: [],
47
- dryRun: false,
48
- enableGit: false,
49
- enableTransports: false,
50
- transportReadOnly: false,
58
+ allowWrites: false,
59
+ allowDataPreview: false,
60
+ allowFreeSQL: false,
61
+ allowTransportWrites: false,
62
+ allowGitWrites: false,
63
+ allowedPackages: ['$TMP'],
51
64
  allowedTransports: [],
65
+ denyActions: [],
52
66
  };
53
67
  }
54
- /** No restrictions — use with caution */
68
+ /** No restrictions — use with caution. */
55
69
  export function unrestrictedSafetyConfig() {
56
70
  return {
57
- readOnly: false,
58
- blockFreeSQL: false,
59
- blockData: false,
60
- allowedOps: '',
61
- disallowedOps: '',
71
+ allowWrites: true,
72
+ allowDataPreview: true,
73
+ allowFreeSQL: true,
74
+ allowTransportWrites: true,
75
+ allowGitWrites: true,
62
76
  allowedPackages: [],
63
- dryRun: false,
64
- enableGit: true,
65
- enableTransports: false,
66
- transportReadOnly: false,
67
77
  allowedTransports: [],
78
+ denyActions: [],
68
79
  };
69
80
  }
70
- /** Check if an operation type is allowed by the safety config */
81
+ /** Check if an operation type is allowed by the safety config. */
71
82
  export function isOperationAllowed(config, op) {
72
- // DryRun mode allows everything (but doesn't execute)
73
- if (config.dryRun)
74
- return true;
75
- // ReadOnly blocks all write operations
76
- if (config.readOnly && WRITE_OPS.includes(op))
77
- return false;
78
- // BlockFreeSQL specifically blocks free SQL queries
79
- if (config.blockFreeSQL && op === OperationType.FreeSQL)
80
- return false;
81
- // BlockData blocks named table preview queries
82
- if (config.blockData && op === OperationType.Query)
83
+ // Mutating ops (Create/Update/Delete/Activate/Workflow/Transport) require allowWrites
84
+ if (MUTATING_OPS.includes(op) && !config.allowWrites)
83
85
  return false;
84
- // Transport operations require explicit opt-in
85
- if (op === OperationType.Transport && !config.enableTransports)
86
+ // Transport mutation has an additional gate
87
+ if (op === OperationType.Transport && !config.allowTransportWrites)
86
88
  return false;
87
- // Disallowed ops blacklist (takes precedence over allowed)
88
- if (config.disallowedOps?.includes(op))
89
+ // Table preview
90
+ if (op === OperationType.Query && !config.allowDataPreview)
89
91
  return false;
90
- // Allowed ops whitelist (if set, only listed ops are allowed)
91
- if (config.allowedOps && !config.allowedOps.includes(op))
92
+ // Free SQL
93
+ if (op === OperationType.FreeSQL && !config.allowFreeSQL)
92
94
  return false;
95
+ // All other ops (Read/Search/Intelligence/Test/Lock) are always allowed at this layer.
96
+ // User-gating happens at the scope layer (ACTION_POLICY + hasRequiredScope).
93
97
  return true;
94
98
  }
95
- /** Check operation and throw AdtSafetyError if blocked */
99
+ /** Check operation and throw AdtSafetyError if blocked. */
96
100
  export function checkOperation(config, op, opName) {
97
101
  if (!isOperationAllowed(config, op)) {
98
- throw new AdtSafetyError(`Operation '${opName}' (type ${op}) is blocked by safety configuration`);
102
+ throw new AdtSafetyError(`Operation '${opName}' (type ${op}) is blocked by safety configuration (${explainOperationBlock(config, op)})`);
99
103
  }
100
104
  }
101
- /** Check if operations on a given package are allowed */
105
+ /** Returns a human-readable reason why an operation is blocked. Assumes the op IS blocked. */
106
+ function explainOperationBlock(config, op) {
107
+ if (MUTATING_OPS.includes(op) && !config.allowWrites)
108
+ return 'reason: allowWrites=false blocks mutations (C/D/U/A/W/X)';
109
+ if (op === OperationType.Transport && !config.allowTransportWrites)
110
+ return 'reason: allowTransportWrites=false';
111
+ if (op === OperationType.Query && !config.allowDataPreview)
112
+ return 'reason: allowDataPreview=false';
113
+ if (op === OperationType.FreeSQL && !config.allowFreeSQL)
114
+ return 'reason: allowFreeSQL=false';
115
+ return 'reason: unknown';
116
+ }
117
+ /** Check if operations on a given package are allowed (write-only check). */
102
118
  export function isPackageAllowed(config, pkg) {
119
+ if (listDeniesAll(config.allowedPackages))
120
+ return false;
103
121
  if (config.allowedPackages.length === 0)
104
122
  return true;
105
123
  const upperPkg = pkg.toUpperCase();
@@ -117,14 +135,16 @@ export function isPackageAllowed(config, pkg) {
117
135
  }
118
136
  return false;
119
137
  }
120
- /** Check package and throw AdtSafetyError if blocked */
138
+ /** Check package and throw AdtSafetyError if blocked. */
121
139
  export function checkPackage(config, pkg) {
122
140
  if (!isPackageAllowed(config, pkg)) {
123
- throw new AdtSafetyError(`Operations on package '${pkg}' are blocked by safety configuration (allowed: ${JSON.stringify(config.allowedPackages)})`);
141
+ throw new AdtSafetyError(`Operations on package '${pkg}' are blocked by safety configuration (allowed: ${displayAllowList(config.allowedPackages)})`);
124
142
  }
125
143
  }
126
- /** Check if a transport is in the whitelist (helper, doesn't check enableTransports) */
144
+ /** Check if a transport is in the whitelist. */
127
145
  function isTransportInWhitelist(config, transport) {
146
+ if (listDeniesAll(config.allowedTransports))
147
+ return false;
128
148
  if (config.allowedTransports.length === 0)
129
149
  return true;
130
150
  const upperTransport = transport.toUpperCase();
@@ -140,96 +160,158 @@ function isTransportInWhitelist(config, transport) {
140
160
  }
141
161
  return false;
142
162
  }
143
- /** Check transport operation and throw AdtSafetyError if blocked */
163
+ /**
164
+ * Check transport operation. Writes require `allowWrites && allowTransportWrites`.
165
+ * Reads are always allowed at this layer (scope check enforces user gating upstream).
166
+ */
144
167
  export function checkTransport(config, transport, opName, isWrite) {
145
- // Require enableTransports for all transport operations
146
- if (!config.enableTransports) {
147
- throw new AdtSafetyError(`Transport operation '${opName}' is blocked: transports not enabled (use --enable-transports or SAP_ENABLE_TRANSPORTS=true)`);
148
- }
149
- // Check write permissions
150
- if (isWrite && config.transportReadOnly) {
151
- throw new AdtSafetyError(`Transport write operation '${opName}' is blocked: transport read-only mode enabled`);
168
+ if (isWrite) {
169
+ if (!config.allowWrites) {
170
+ throw new AdtSafetyError(`Transport write '${opName}' is blocked: allowWrites=false. Set SAP_ALLOW_WRITES=true to enable writes.`);
171
+ }
172
+ if (!config.allowTransportWrites) {
173
+ throw new AdtSafetyError(`Transport write '${opName}' is blocked: allowTransportWrites=false. Set SAP_ALLOW_TRANSPORT_WRITES=true to enable transport mutations.`);
174
+ }
152
175
  }
153
- // Check transport whitelist (applies to both read and write)
176
+ // Transport whitelist applies to both read and write
154
177
  if (transport && transport !== '*' && config.allowedTransports.length > 0) {
155
178
  if (!isTransportInWhitelist(config, transport)) {
156
- throw new AdtSafetyError(`Operation '${opName}' on transport '${transport}' is blocked by safety configuration (allowed: ${JSON.stringify(config.allowedTransports)})`);
179
+ throw new AdtSafetyError(`Operation '${opName}' on transport '${transport}' is blocked by safety configuration (allowed: ${displayAllowList(config.allowedTransports)})`);
157
180
  }
158
181
  }
159
182
  }
160
- /** Check git operation and throw AdtSafetyError if blocked */
161
- export function checkGit(config, operation) {
162
- if (!config.enableGit) {
163
- throw new AdtSafetyError(`Git operation "${operation}" is disabled. Set SAP_ENABLE_GIT=true or pass --enable-git to enable.`);
183
+ /**
184
+ * Check git operation. Writes require `allowWrites && allowGitWrites`.
185
+ * Reads are always allowed at this layer.
186
+ */
187
+ export function checkGit(config, operation, isWrite = true) {
188
+ if (!isWrite)
189
+ return;
190
+ if (!config.allowWrites) {
191
+ throw new AdtSafetyError(`Git write '${operation}' is blocked: allowWrites=false. Set SAP_ALLOW_WRITES=true to enable writes.`);
192
+ }
193
+ if (!config.allowGitWrites) {
194
+ throw new AdtSafetyError(`Git write '${operation}' is blocked: allowGitWrites=false. Set SAP_ALLOW_GIT_WRITES=true to enable git mutations.`);
164
195
  }
165
196
  }
166
197
  /**
167
- * Expand implied scopes: `write` implies `read`, `sql` implies `data`.
168
- * Returns a new array with implied scopes added.
198
+ * Derive a per-user effective safety config by merging the server ceiling with
199
+ * the user's JWT scopes. Scopes can only RESTRICT further, never loosen.
200
+ *
201
+ * Uses the scope expansion rules from src/authz/policy.ts (admin implies all,
202
+ * write implies read, sql implies data). Callers should pass the already-expanded
203
+ * scope list for speed; this function re-expands as a safety net.
169
204
  */
170
- export function expandImpliedScopes(scopes) {
205
+ export function deriveUserSafety(serverConfig, scopes) {
206
+ // Inline the expansion to avoid the circular import with src/authz/policy.ts.
207
+ // Keep in sync with expandScopes() there.
171
208
  const expanded = new Set(scopes);
209
+ if (expanded.has('admin')) {
210
+ expanded.add('read');
211
+ expanded.add('write');
212
+ expanded.add('data');
213
+ expanded.add('sql');
214
+ expanded.add('transports');
215
+ expanded.add('git');
216
+ }
172
217
  if (expanded.has('write'))
173
218
  expanded.add('read');
174
219
  if (expanded.has('sql'))
175
220
  expanded.add('data');
176
- return [...expanded];
221
+ const effective = {
222
+ ...serverConfig,
223
+ allowedPackages: [...serverConfig.allowedPackages],
224
+ allowedTransports: [...serverConfig.allowedTransports],
225
+ denyActions: [...serverConfig.denyActions],
226
+ };
227
+ if (!expanded.has('write'))
228
+ effective.allowWrites = false;
229
+ if (!expanded.has('data'))
230
+ effective.allowDataPreview = false;
231
+ if (!expanded.has('sql'))
232
+ effective.allowFreeSQL = false;
233
+ if (!expanded.has('transports'))
234
+ effective.allowTransportWrites = false;
235
+ if (!expanded.has('git'))
236
+ effective.allowGitWrites = false;
237
+ return effective;
177
238
  }
178
239
  /**
179
- * Derive a per-user safety config by merging server-level config (ceiling)
180
- * with JWT scopes. Scopes can only RESTRICT further, never expand beyond
181
- * what the server config allows.
240
+ * Derive a per-user effective safety by intersecting a partial SafetyConfig
241
+ * (from an API-key profile) with the server ceiling. Tight side wins field-by-field.
182
242
  *
183
- * Key principle: start with server config, only tighten booleans (false→true).
184
- * Never loosen (true→false).
243
+ * Semantics:
244
+ * - Boolean fields: result is `server && profile` (both must be true for capability on).
245
+ * - `allowedPackages`:
246
+ * * If either side is `[]` (no restriction), use the other.
247
+ * * Else intersection by prefix semantics — profile entries covered by the
248
+ * server ceiling survive. If none survive, the effective list denies all
249
+ * packages/transports (true intersection).
250
+ * - `allowedTransports`: same as allowedPackages.
251
+ * - `denyActions`: union (both the server and profile denies apply).
185
252
  */
186
- export function deriveUserSafety(serverConfig, scopes) {
253
+ export function deriveUserSafetyFromProfile(serverConfig, profileSafety) {
254
+ const and = (a, b) => (b === undefined ? a : a && b);
255
+ const intersectList = (server, profile) => {
256
+ if (!profile)
257
+ return [...server];
258
+ if (server.length === 0 && profile.length === 0)
259
+ return [];
260
+ if (server.length === 0)
261
+ return [...profile];
262
+ if (profile.length === 0)
263
+ return [...server];
264
+ // Profile narrows server: keep profile entries that are covered by server.
265
+ // "Covered by" means: there exists a server entry equal to the profile entry, or a
266
+ // server wildcard that matches it.
267
+ const covers = (serverPat, profilePat) => {
268
+ const s = serverPat.toUpperCase();
269
+ const p = profilePat.toUpperCase();
270
+ if (s === p)
271
+ return true;
272
+ if (s.endsWith('*')) {
273
+ const prefix = s.slice(0, -1);
274
+ if (p.startsWith(prefix))
275
+ return true;
276
+ }
277
+ return false;
278
+ };
279
+ const narrowed = profile.filter((p) => server.some((s) => covers(s, p)));
280
+ // True intersection: disjoint constraints mean no package/transport is allowed.
281
+ // We cannot return [] here because [] means "unrestricted" in SafetyConfig.
282
+ return narrowed.length > 0 ? narrowed : [DENY_ALL_LIST_ENTRY];
283
+ };
187
284
  const effective = {
188
- ...serverConfig,
189
- allowedPackages: [...serverConfig.allowedPackages],
190
- allowedTransports: [...serverConfig.allowedTransports],
285
+ allowWrites: and(serverConfig.allowWrites, profileSafety.allowWrites),
286
+ allowDataPreview: and(serverConfig.allowDataPreview, profileSafety.allowDataPreview),
287
+ allowFreeSQL: and(serverConfig.allowFreeSQL, profileSafety.allowFreeSQL),
288
+ allowTransportWrites: and(serverConfig.allowTransportWrites, profileSafety.allowTransportWrites),
289
+ allowGitWrites: and(serverConfig.allowGitWrites, profileSafety.allowGitWrites),
290
+ allowedPackages: intersectList(serverConfig.allowedPackages, profileSafety.allowedPackages),
291
+ allowedTransports: intersectList(serverConfig.allowedTransports, profileSafety.allowedTransports),
292
+ denyActions: [...new Set([...serverConfig.denyActions, ...(profileSafety.denyActions ?? [])])],
191
293
  };
192
- const expanded = expandImpliedScopes(scopes);
193
- // No write scope → force read-only and disable transports
194
- if (!expanded.includes('write')) {
195
- effective.readOnly = true;
196
- effective.enableGit = false;
197
- effective.enableTransports = false;
198
- }
199
- // No data scope (and no sql, which implies data) → block table preview
200
- if (!expanded.includes('data')) {
201
- effective.blockData = true;
202
- }
203
- // No sql scope → block free SQL
204
- if (!expanded.includes('sql')) {
205
- effective.blockFreeSQL = true;
206
- }
207
294
  return effective;
208
295
  }
209
- /** Human-readable description of the safety configuration */
296
+ /** Human-readable description of the safety configuration. */
210
297
  export function describeSafety(config) {
211
298
  const parts = [];
212
- if (config.readOnly)
213
- parts.push('READ-ONLY');
214
- if (config.blockFreeSQL)
215
- parts.push('NO-FREE-SQL');
216
- if (config.blockData)
217
- parts.push('NO-DATA');
218
- if (config.dryRun)
219
- parts.push('DRY-RUN');
220
- if (config.allowedOps)
221
- parts.push(`AllowedOps=${config.allowedOps}`);
222
- if (config.disallowedOps)
223
- parts.push(`DisallowedOps=${config.disallowedOps}`);
299
+ if (config.allowWrites)
300
+ parts.push('WRITES');
301
+ if (config.allowDataPreview)
302
+ parts.push('DATA-PREVIEW');
303
+ if (config.allowFreeSQL)
304
+ parts.push('FREE-SQL');
305
+ if (config.allowTransportWrites)
306
+ parts.push('TRANSPORT-WRITES');
307
+ if (config.allowGitWrites)
308
+ parts.push('GIT-WRITES');
224
309
  if (config.allowedPackages.length > 0)
225
- parts.push(`AllowedPackages=[${config.allowedPackages.join(',')}]`);
226
- if (config.enableTransports) {
227
- parts.push('TRANSPORTS-ENABLED');
228
- if (config.transportReadOnly)
229
- parts.push('TRANSPORT-READ-ONLY');
230
- if (config.allowedTransports.length > 0)
231
- parts.push(`AllowedTransports=[${config.allowedTransports.join(',')}]`);
232
- }
233
- return parts.length === 0 ? 'UNRESTRICTED' : parts.join(', ');
310
+ parts.push(`Packages=${displayAllowList(config.allowedPackages)}`);
311
+ if (config.allowedTransports.length > 0)
312
+ parts.push(`Transports=${displayAllowList(config.allowedTransports)}`);
313
+ if (config.denyActions.length > 0)
314
+ parts.push(`DenyActions=${config.denyActions.length}`);
315
+ return parts.length === 0 ? 'READ-ONLY' : parts.join(', ');
234
316
  }
235
317
  //# sourceMappingURL=safety.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/adt/safety.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/adt/safety.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * CTS Transport management for SAP ADT.
3
3
  *
4
- * Transport operations require explicit opt-in via enableTransports flag.
4
+ * Transport mutations require explicit opt-in via allowWrites + allowTransportWrites.
5
5
  * Safety checks are applied at every entry point.
6
6
  */
7
7
  import type { AdtHttpClient } from './http.js';
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * CTS Transport management for SAP ADT.
3
3
  *
4
- * Transport operations require explicit opt-in via enableTransports flag.
4
+ * Transport mutations require explicit opt-in via allowWrites + allowTransportWrites.
5
5
  * Safety checks are applied at every entry point.
6
6
  */
7
7
  import { AdtApiError } from './errors.js';
@@ -144,7 +144,7 @@ async function reassignSingle(http, transportId, newOwner) {
144
144
  * @param operation - `I` for insert/create, empty string for modify (default: `I`)
145
145
  */
146
146
  export async function getTransportInfo(http, safety, objectUrl, devclass, operation = 'I') {
147
- // Transport info is a read operation — doesn't require enableTransports
147
+ // Transport info is a read operation — doesn't require allowTransportWrites.
148
148
  checkOperation(safety, OperationType.Read, 'TransportInfo');
149
149
  const body = `<?xml version="1.0" encoding="UTF-8"?>
150
150
  <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">