@eudiplo/cli 9.1.0-main.ab82b00 → 9.1.0-main.aba3274

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 (70) hide show
  1. package/dist/commands/completion/action.js +3 -1
  2. package/dist/commands/completion/action.js.map +1 -1
  3. package/dist/commands/config/portability/migrations.spec.js +3 -2
  4. package/dist/commands/config/portability/migrations.spec.js.map +1 -1
  5. package/dist/commands/config/portability/upgrade.d.ts.map +1 -1
  6. package/dist/commands/config/portability/upgrade.js +6 -2
  7. package/dist/commands/config/portability/upgrade.js.map +1 -1
  8. package/dist/commands/config/validate/action.d.ts.map +1 -1
  9. package/dist/commands/config/validate/action.js +2 -1
  10. package/dist/commands/config/validate/action.js.map +1 -1
  11. package/dist/commands/init/action.d.ts.map +1 -1
  12. package/dist/commands/init/action.js +1 -11
  13. package/dist/commands/init/action.js.map +1 -1
  14. package/dist/commands/instance/action.d.ts +2 -0
  15. package/dist/commands/instance/action.d.ts.map +1 -1
  16. package/dist/commands/instance/action.js +68 -12
  17. package/dist/commands/instance/action.js.map +1 -1
  18. package/dist/commands/instance/index.d.ts.map +1 -1
  19. package/dist/commands/instance/index.js +21 -3
  20. package/dist/commands/instance/index.js.map +1 -1
  21. package/dist/commands/open/action.d.ts.map +1 -1
  22. package/dist/commands/open/action.js +13 -2
  23. package/dist/commands/open/action.js.map +1 -1
  24. package/dist/commands/status/action.d.ts.map +1 -1
  25. package/dist/commands/status/action.js +2 -1
  26. package/dist/commands/status/action.js.map +1 -1
  27. package/dist/index.js +5960 -2389
  28. package/dist/services/api-auth.d.ts.map +1 -1
  29. package/dist/services/api-auth.js +3 -2
  30. package/dist/services/api-auth.js.map +1 -1
  31. package/dist/services/browser.d.ts.map +1 -1
  32. package/dist/services/browser.js +3 -2
  33. package/dist/services/browser.js.map +1 -1
  34. package/dist/services/cli-config.d.ts +41 -1
  35. package/dist/services/cli-config.d.ts.map +1 -1
  36. package/dist/services/cli-config.js +217 -29
  37. package/dist/services/cli-config.js.map +1 -1
  38. package/dist/services/diagnostics.d.ts.map +1 -1
  39. package/dist/services/diagnostics.js +9 -8
  40. package/dist/services/diagnostics.js.map +1 -1
  41. package/dist/services/instance-selection.d.ts.map +1 -1
  42. package/dist/services/instance-selection.js +2 -5
  43. package/dist/services/instance-selection.js.map +1 -1
  44. package/dist/services/url.d.ts +21 -0
  45. package/dist/services/url.d.ts.map +1 -0
  46. package/dist/services/url.js +61 -0
  47. package/dist/services/url.js.map +1 -0
  48. package/package.json +1 -1
  49. package/templates/demo-config/clients/presentation-test.json +1 -1
  50. package/templates/demo-config/clients/test.json +7 -2
  51. package/templates/demo-config/key-chains/attestation.json +2 -1
  52. package/templates/demo-config/key-chains/status-list.json +2 -1
  53. package/templates/demo-config/presentation/age-over-18.json +10 -0
  54. package/templates/docker-compose.yml +2 -2
  55. package/templates/schemas/ClientConfigFile.schema.json +134 -1
  56. package/templates/schemas/CreateClientDto.schema.json +5 -1
  57. package/templates/schemas/CreateTenantDto.schema.json +6 -2
  58. package/templates/schemas/CredentialConfigCreate.schema.json +6 -5
  59. package/templates/schemas/CredentialConfigFile.schema.json +796 -1
  60. package/templates/schemas/IssuanceConfig.schema.json +43 -0
  61. package/templates/schemas/IssuanceConfigFile.schema.json +696 -1
  62. package/templates/schemas/KeyChainConfigFile.schema.json +136 -119
  63. package/templates/schemas/KeyChainCreateDto.schema.json +10 -1
  64. package/templates/schemas/KeyChainImportDto.schema.json +8 -0
  65. package/templates/schemas/KmsConfigDto.schema.json +186 -0
  66. package/templates/schemas/KmsConfigFile.schema.json +1026 -1
  67. package/templates/schemas/RotationPolicyCreateDto.schema.json +1 -1
  68. package/templates/schemas/TenantConfigFile.schema.json +4 -129
  69. package/templates/schemas/UpdateClientDto.schema.json +5 -1
  70. package/templates/schemas/UpdateStatusListConfigDto.schema.json +5 -5
@@ -0,0 +1,21 @@
1
+ /** Throws unless `value` is an absolute HTTP(S) URL, as config loading requires. */
2
+ export declare function validateHttpUrl(value: string, label: string): void;
3
+ /** True when a URL carries user info such as `user:password@`. */
4
+ export declare function hasUserInfo(value: string): boolean;
5
+ /**
6
+ * Hides user info such as `user:password@` in a URL before it is printed.
7
+ * URLs without user info are returned exactly as configured. The masked form
8
+ * is built from the parsed URL, so spellings the URL parser accepts without
9
+ * `//`, such as `https:user:secret@host`, are masked too. A value that is not
10
+ * a URL is hidden entirely if it could contain user info.
11
+ */
12
+ export declare function redactUrl(value: string): string;
13
+ /** Returns the URL without user info, for handing it to another program. */
14
+ export declare function stripUserInfo(url: URL): URL;
15
+ /**
16
+ * Describes a failed request without the user info of its URL. Node's fetch
17
+ * repeats the full URL in some errors, for example "Request cannot be
18
+ * constructed from a URL that includes credentials: <url>".
19
+ */
20
+ export declare function describeRequestError(error: unknown, url: URL): string;
21
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/services/url.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CASlE;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAOlD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAa/C;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAK3C;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,CAGrE"}
@@ -0,0 +1,61 @@
1
+ /** Throws unless `value` is an absolute HTTP(S) URL, as config loading requires. */
2
+ export function validateHttpUrl(value, label) {
3
+ try {
4
+ const url = new URL(value);
5
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
6
+ throw new Error("Unsupported URL protocol.");
7
+ }
8
+ }
9
+ catch {
10
+ throw new Error(`${label} must be an absolute HTTP(S) URL.`);
11
+ }
12
+ }
13
+ /** True when a URL carries user info such as `user:password@`. */
14
+ export function hasUserInfo(value) {
15
+ try {
16
+ const url = new URL(value);
17
+ return url.username !== "" || url.password !== "";
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ /**
24
+ * Hides user info such as `user:password@` in a URL before it is printed.
25
+ * URLs without user info are returned exactly as configured. The masked form
26
+ * is built from the parsed URL, so spellings the URL parser accepts without
27
+ * `//`, such as `https:user:secret@host`, are masked too. A value that is not
28
+ * a URL is hidden entirely if it could contain user info.
29
+ */
30
+ export function redactUrl(value) {
31
+ let url;
32
+ try {
33
+ url = new URL(value);
34
+ }
35
+ catch {
36
+ return value.includes("@") ? "***" : value;
37
+ }
38
+ if (url.username === "" && url.password === "") {
39
+ return value;
40
+ }
41
+ url.username = "***";
42
+ url.password = "";
43
+ return url.href;
44
+ }
45
+ /** Returns the URL without user info, for handing it to another program. */
46
+ export function stripUserInfo(url) {
47
+ const stripped = new URL(url.href);
48
+ stripped.username = "";
49
+ stripped.password = "";
50
+ return stripped;
51
+ }
52
+ /**
53
+ * Describes a failed request without the user info of its URL. Node's fetch
54
+ * repeats the full URL in some errors, for example "Request cannot be
55
+ * constructed from a URL that includes credentials: <url>".
56
+ */
57
+ export function describeRequestError(error, url) {
58
+ const message = error instanceof Error ? error.message : String(error);
59
+ return message.replaceAll(url.href, redactUrl(url.href));
60
+ }
61
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/services/url.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAAa;IACxD,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACjD,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,mCAAmC,CAAC,CAAC;IACjE,CAAC;AACL,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,WAAW,CAAC,KAAa;IACrC,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACnC,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACD,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;IACrB,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC;IAClB,OAAO,GAAG,CAAC,IAAI,CAAC;AACpB,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,GAAQ;IAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,QAAQ,CAAC,QAAQ,GAAG,EAAE,CAAC;IACvB,QAAQ,CAAC,QAAQ,GAAG,EAAE,CAAC;IACvB,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc,EAAE,GAAQ;IACzD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eudiplo/cli",
3
- "version": "9.1.0-main.ab82b00",
3
+ "version": "9.1.0-main.aba3274",
4
4
  "description": "Deployment-aware command line tools for EUDIPLO",
5
5
  "private": false,
6
6
  "type": "module",
@@ -1,5 +1,5 @@
1
1
  {
2
- "$schema": "https://eudiplo.dev/schemas/v1/ClientConfigFile.schema.json",
2
+ "$schema": "https://eudiplo.dev/schemas/v2/ClientConfigFile.schema.json",
3
3
  "metadata": {
4
4
  "generation": 1
5
5
  },
@@ -1,5 +1,5 @@
1
1
  {
2
- "$schema": "https://eudiplo.dev/schemas/v1/ClientConfigFile.schema.json",
2
+ "$schema": "https://eudiplo.dev/schemas/v2/ClientConfigFile.schema.json",
3
3
  "metadata": {
4
4
  "generation": 1
5
5
  },
@@ -12,7 +12,12 @@
12
12
  "issuance:offer",
13
13
  "issuance:manage",
14
14
  "presentation:request",
15
- "presentation:manage"
15
+ "presentation:manage",
16
+ "registrar:manage",
17
+ "sessions:read",
18
+ "credentials:status",
19
+ "audit:read",
20
+ "keys:manage"
16
21
  ]
17
22
  }
18
23
  }
@@ -21,7 +21,8 @@
21
21
  "kmsProvider": "db",
22
22
  "rotationPolicy": {
23
23
  "certValidityDays": 30,
24
- "enabled": true
24
+ "enabled": true,
25
+ "intervalDays": 20
25
26
  }
26
27
  }
27
28
  }
@@ -21,7 +21,8 @@
21
21
  "kmsProvider": "db",
22
22
  "rotationPolicy": {
23
23
  "certValidityDays": 30,
24
- "enabled": true
24
+ "enabled": true,
25
+ "intervalDays": 20
25
26
  }
26
27
  }
27
28
  }
@@ -23,6 +23,16 @@
23
23
  "18"
24
24
  ]
25
25
  }
26
+ ],
27
+ "trusted_authorities": [
28
+ {
29
+ "type": "etsi_tl",
30
+ "values": [
31
+ {
32
+ "trustListId": "580831bc-ef11-43f4-a3be-a2b6bf1b29a3"
33
+ }
34
+ ]
35
+ }
26
36
  ]
27
37
  },
28
38
  {
@@ -89,7 +89,7 @@ services:
89
89
  - eudiplo-network
90
90
 
91
91
  rustfs:
92
- image: rustfs/rustfs:1.0.0
92
+ image: rustfs/rustfs:1.0.1
93
93
  restart: always
94
94
  profiles: ['s3', 'standard', 'full']
95
95
  ports:
@@ -114,7 +114,7 @@ services:
114
114
 
115
115
  # S3 bucket initialization using the AWS CLI
116
116
  rustfs-init:
117
- image: amazon/aws-cli:2.37.4
117
+ image: amazon/aws-cli:2.37.10
118
118
  profiles: ['s3', 'standard', 'full']
119
119
  depends_on:
120
120
  rustfs:
@@ -9,7 +9,7 @@
9
9
  "properties": {
10
10
  "$schema": {
11
11
  "type": "string",
12
- "const": "https://eudiplo.dev/schemas/v1/ClientConfigFile.schema.json"
12
+ "const": "https://eudiplo.dev/schemas/v2/ClientConfigFile.schema.json"
13
13
  },
14
14
  "metadata": {
15
15
  "type": "object",
@@ -55,6 +55,139 @@
55
55
  "spec"
56
56
  ],
57
57
  "additionalProperties": false
58
+ },
59
+ {
60
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
61
+ "$id": "https://eudiplo.dev/schemas/v1/ClientConfigFile.schema.json",
62
+ "title": "ClientConfigFile",
63
+ "type": "object",
64
+ "properties": {
65
+ "$schema": {
66
+ "type": "string",
67
+ "const": "https://eudiplo.dev/schemas/v1/ClientConfigFile.schema.json"
68
+ },
69
+ "metadata": {
70
+ "type": "object",
71
+ "properties": {
72
+ "generation": {
73
+ "type": "integer",
74
+ "minimum": 1,
75
+ "description": "Monotonically increasing configuration generation."
76
+ },
77
+ "ownership": {
78
+ "type": "string",
79
+ "enum": [
80
+ "unmanaged",
81
+ "file-managed"
82
+ ],
83
+ "description": "Requested ownership recorded when the document is applied."
84
+ }
85
+ },
86
+ "additionalProperties": false
87
+ },
88
+ "spec": {
89
+ "allOf": [
90
+ {
91
+ "$ref": "#/$defs/CreateClientDto"
92
+ },
93
+ {
94
+ "type": "object",
95
+ "required": [
96
+ "clientId"
97
+ ],
98
+ "properties": {
99
+ "clientId": {
100
+ "type": "string",
101
+ "minLength": 1
102
+ }
103
+ }
104
+ }
105
+ ]
106
+ }
107
+ },
108
+ "required": [
109
+ "$schema",
110
+ "spec"
111
+ ],
112
+ "additionalProperties": false,
113
+ "$defs": {
114
+ "CreateClientDto": {
115
+ "type": "object",
116
+ "properties": {
117
+ "clientId": {
118
+ "type": "string",
119
+ "minLength": 1,
120
+ "pattern": "^[A-Za-z0-9._:-]+$",
121
+ "description": "Unique client identifier."
122
+ },
123
+ "secret": {
124
+ "description": "Optional client secret for confidential clients.",
125
+ "type": "string",
126
+ "minLength": 1
127
+ },
128
+ "description": {
129
+ "description": "Optional human-readable client description.",
130
+ "type": "string",
131
+ "minLength": 1
132
+ },
133
+ "roles": {
134
+ "minItems": 1,
135
+ "type": "array",
136
+ "items": {
137
+ "type": "string",
138
+ "enum": [
139
+ "presentation:manage",
140
+ "presentation:request",
141
+ "issuance:manage",
142
+ "issuance:offer",
143
+ "clients:manage",
144
+ "users:manage",
145
+ "tenants:manage",
146
+ "tenant:admin",
147
+ "registrar:manage"
148
+ ]
149
+ },
150
+ "description": "Roles assigned to the client. At least one role is required."
151
+ },
152
+ "allowedPresentationConfigs": {
153
+ "description": "Optional allow-list of presentation config ids this client can use.",
154
+ "anyOf": [
155
+ {
156
+ "type": "array",
157
+ "items": {
158
+ "type": "string",
159
+ "minLength": 1
160
+ }
161
+ },
162
+ {
163
+ "type": "null"
164
+ }
165
+ ]
166
+ },
167
+ "allowedIssuanceConfigs": {
168
+ "description": "Optional allow-list of issuance config ids this client can use.",
169
+ "anyOf": [
170
+ {
171
+ "type": "array",
172
+ "items": {
173
+ "type": "string",
174
+ "minLength": 1
175
+ }
176
+ },
177
+ {
178
+ "type": "null"
179
+ }
180
+ ]
181
+ }
182
+ },
183
+ "required": [
184
+ "clientId",
185
+ "roles"
186
+ ],
187
+ "additionalProperties": false,
188
+ "title": "CreateClientDto"
189
+ }
190
+ }
58
191
  }
59
192
  ]
60
193
  }
@@ -32,7 +32,11 @@
32
32
  "users:manage",
33
33
  "tenants:manage",
34
34
  "tenant:admin",
35
- "registrar:manage"
35
+ "registrar:manage",
36
+ "audit:read",
37
+ "sessions:read",
38
+ "credentials:status",
39
+ "keys:manage"
36
40
  ]
37
41
  },
38
42
  "description": "Roles assigned to the client. At least one role is required."
@@ -19,7 +19,7 @@
19
19
  "minLength": 1
20
20
  },
21
21
  "roles": {
22
- "description": "Optional default role assignments for the tenant.",
22
+ "description": "Roles of the tenant's admin client `<id>-admin`, which also gets clients:manage. They are all that client can grant, unless they include tenant:admin. Without roles, no admin client is created.",
23
23
  "type": "array",
24
24
  "items": {
25
25
  "type": "string",
@@ -32,7 +32,11 @@
32
32
  "clients:manage",
33
33
  "users:manage",
34
34
  "registrar:manage",
35
- "tenant:admin"
35
+ "tenant:admin",
36
+ "audit:read",
37
+ "sessions:read",
38
+ "credentials:status",
39
+ "keys:manage"
36
40
  ]
37
41
  }
38
42
  },
@@ -209,7 +209,7 @@
209
209
  ]
210
210
  },
211
211
  "webhookEndpointId": {
212
- "description": "Optional webhook endpoint id notified during issuance events.",
212
+ "description": "Not used for notifications: they go to the webhook endpoint of the offer.",
213
213
  "type": [
214
214
  "string",
215
215
  "null"
@@ -303,7 +303,7 @@
303
303
  ]
304
304
  },
305
305
  "iaeActions": {
306
- "description": "Optional in-app experience actions for wallet flows.",
306
+ "description": "Interactive authorization steps (a presentation or a web flow) that the wallet completes, in order, before the credential is issued.",
307
307
  "anyOf": [
308
308
  {
309
309
  "type": "array",
@@ -479,16 +479,17 @@
479
479
  "type": "string"
480
480
  },
481
481
  "frameworkType": {
482
- "description": "Trust framework type.",
482
+ "description": "Trust framework type. `x509` takes a root certificate in `value` and no `verificationMethod`.",
483
483
  "type": "string",
484
484
  "enum": [
485
485
  "aki",
486
486
  "etsi_tl",
487
- "openid_federation"
487
+ "openid_federation",
488
+ "x509"
488
489
  ]
489
490
  },
490
491
  "value": {
491
- "description": "Framework-specific authority value.",
492
+ "description": "Framework-specific authority value, for example the trust list URL for `etsi_tl` or the root certificate (base64 DER or PEM) for `x509`.",
492
493
  "type": "string"
493
494
  },
494
495
  "verificationMethod": {