@thirtified/eudi-dev 0.0.0-stage → 0.1.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 +202 -0
- package/README.md +223 -2
- package/dist/binary.d.ts +42 -0
- package/dist/binary.js +76 -0
- package/dist/binary.js.map +1 -0
- package/dist/commands/credentials.d.ts +151 -0
- package/dist/commands/credentials.js +234 -0
- package/dist/commands/credentials.js.map +1 -0
- package/dist/commands/registrar.d.ts +116 -0
- package/dist/commands/registrar.js +150 -0
- package/dist/commands/registrar.js.map +1 -0
- package/dist/commands/trust.d.ts +58 -0
- package/dist/commands/trust.js +90 -0
- package/dist/commands/trust.js.map +1 -0
- package/dist/errors.d.ts +47 -0
- package/dist/errors.js +41 -0
- package/dist/errors.js.map +1 -0
- package/dist/eudi.d.ts +66 -0
- package/dist/eudi.js +113 -0
- package/dist/eudi.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/input.d.ts +32 -0
- package/dist/input.js +7 -0
- package/dist/input.js.map +1 -0
- package/dist/runner.d.ts +86 -0
- package/dist/runner.js +246 -0
- package/dist/runner.js.map +1 -0
- package/dist/types.d.ts +338 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +24 -0
- package/dist/version.js +35 -0
- package/dist/version.js.map +1 -0
- package/package.json +75 -4
- package/src/binary.ts +114 -0
- package/src/commands/credentials.ts +384 -0
- package/src/commands/registrar.ts +243 -0
- package/src/commands/trust.ts +123 -0
- package/src/errors.ts +66 -0
- package/src/eudi.ts +159 -0
- package/src/index.ts +44 -0
- package/src/input.ts +27 -0
- package/src/runner.ts +310 -0
- package/src/types.ts +389 -0
- package/src/version.ts +36 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { type FileInput, type Input } from '../input.js';
|
|
2
|
+
import { type Runner, type RunOptions } from '../runner.js';
|
|
3
|
+
import type { DcqlQuery, DecodeCredentialResult, DecodeResult, JsonObject, ValidateReport, VersionInfo } from '../types.js';
|
|
4
|
+
/** Per-call options shared by every wrapper. */
|
|
5
|
+
export type CallOptions = Pick<RunOptions, 'timeoutMs' | 'signal'> & {
|
|
6
|
+
/** Appended to the generated arguments, for flags this package doesn't wrap. */
|
|
7
|
+
extraArgs?: string[];
|
|
8
|
+
};
|
|
9
|
+
export declare function version(runner: Runner, opts?: CallOptions): Promise<VersionInfo>;
|
|
10
|
+
export type DecodeFormat = 'sdjwt' | 'jwt' | 'mdoc' | 'vci' | 'vp' | 'trusted-list' | 'x509';
|
|
11
|
+
export interface DecodeOptions extends CallOptions {
|
|
12
|
+
/** Skip auto-detection (`--format`). */
|
|
13
|
+
format?: DecodeFormat;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* `eudi decode`: inspects a credential, certificate, OpenID4VCI offer,
|
|
17
|
+
* OpenID4VP request or trusted list. For credentials and certificates the
|
|
18
|
+
* document also holds the decoder's checks under `validation.checks`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function decode(runner: Runner, input: Input, opts?: DecodeOptions): Promise<DecodeResult>;
|
|
21
|
+
/** True when a decode result is a credential or certificate (it carries `validation`). */
|
|
22
|
+
export declare function isDecodedCredential(doc: DecodeResult): doc is DecodeCredentialResult;
|
|
23
|
+
export interface ValidateOptions extends CallOptions {
|
|
24
|
+
/** Issuer public key, PEM or JWK (`--key`). A JWK object is serialised. */
|
|
25
|
+
key?: FileInput | JsonObject;
|
|
26
|
+
/** ETSI trusted list JWT: content, `{ path }` or `{ url }` (`--trusted-list`). */
|
|
27
|
+
trustedList?: FileInput;
|
|
28
|
+
/** Check the status list when the credential references one. Default `true` upstream. */
|
|
29
|
+
statusList?: boolean;
|
|
30
|
+
/** Don't fail on a credential outside its validity period. */
|
|
31
|
+
allowExpired?: boolean;
|
|
32
|
+
/** Also report HAIP 1.0 findings (informational, they don't fail validation). */
|
|
33
|
+
haip?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface ValidateResult {
|
|
36
|
+
/** False when a type, expiry, integrity, signature, certificate revocation or status check failed. */
|
|
37
|
+
valid: boolean;
|
|
38
|
+
/** The first failing check as `"<name>: <detail>"`, as eudi-dev reports it. */
|
|
39
|
+
error?: string;
|
|
40
|
+
report: ValidateReport;
|
|
41
|
+
stderr: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* `eudi validate`. A failing check does not throw: the result has
|
|
45
|
+
* `valid: false` and the full report. It throws {@link EudiDevError} when
|
|
46
|
+
* there is no report, for example for input that doesn't parse.
|
|
47
|
+
*/
|
|
48
|
+
export declare function validate(runner: Runner, input: Input, opts?: ValidateOptions): Promise<ValidateResult>;
|
|
49
|
+
/** `eudi dcql`: a DCQL query asking for every claim of the credential. */
|
|
50
|
+
export declare function dcql(runner: Runner, input: Input, opts?: CallOptions): Promise<DcqlQuery>;
|
|
51
|
+
export type CredentialCategory = 'pid' | 'qeaa' | 'pub-eaa' | 'eaa' | 'unlisted';
|
|
52
|
+
/** Card display flags, used with `wallet: true`. */
|
|
53
|
+
export interface IssueDisplayOptions {
|
|
54
|
+
name?: string;
|
|
55
|
+
description?: string;
|
|
56
|
+
backgroundColor?: string;
|
|
57
|
+
textColor?: string;
|
|
58
|
+
/** File path, data URI or http(s) URL. */
|
|
59
|
+
logo?: string;
|
|
60
|
+
logoAlt?: string;
|
|
61
|
+
/** File path, data URI or http(s) URL. */
|
|
62
|
+
backgroundImage?: string;
|
|
63
|
+
/** Take unset display values from this template. */
|
|
64
|
+
template?: string;
|
|
65
|
+
}
|
|
66
|
+
/** Trust and issuer metadata stored for the credential type with `wallet: true`. */
|
|
67
|
+
export interface IssueRegistrationOptions {
|
|
68
|
+
category?: CredentialCategory;
|
|
69
|
+
entitlements?: string[];
|
|
70
|
+
trustedListType?: string;
|
|
71
|
+
statusDeterminationApproach?: string;
|
|
72
|
+
schemeCommunityRule?: string;
|
|
73
|
+
schemeTerritory?: string;
|
|
74
|
+
trustedEntityName?: string;
|
|
75
|
+
issuanceServiceType?: string;
|
|
76
|
+
revocationServiceType?: string;
|
|
77
|
+
issuanceServiceName?: string;
|
|
78
|
+
revocationServiceName?: string;
|
|
79
|
+
}
|
|
80
|
+
export interface IssueCommonOptions extends CallOptions {
|
|
81
|
+
/** Claims as an object (written to a temp file) or `{ path }` to a JSON file. Overrides top-level template claims. */
|
|
82
|
+
claims?: JsonObject | {
|
|
83
|
+
path: string;
|
|
84
|
+
};
|
|
85
|
+
/** Private signing key, PEM or JWK. Ephemeral P-256 if omitted. */
|
|
86
|
+
key?: FileInput | JsonObject;
|
|
87
|
+
/** Certificate chain PEM, leaf first, embedded as x5c / x5chain. Requires `key`. */
|
|
88
|
+
cert?: FileInput;
|
|
89
|
+
/** Expiration as a Go duration, default `720h`. */
|
|
90
|
+
exp?: string;
|
|
91
|
+
/** Not-before: RFC 3339 time or a duration such as `-1h`. */
|
|
92
|
+
nbf?: string;
|
|
93
|
+
/** Use the full EUDI PID Rulebook claim set. */
|
|
94
|
+
pid?: boolean;
|
|
95
|
+
/** Claim names to leave out. */
|
|
96
|
+
omit?: string[];
|
|
97
|
+
/** Template name, or `{ path }` to a template file. */
|
|
98
|
+
template?: string | {
|
|
99
|
+
path: string;
|
|
100
|
+
};
|
|
101
|
+
/** Save the issued claims and settings as a template with this name. */
|
|
102
|
+
saveTemplate?: string;
|
|
103
|
+
statusListUri?: string;
|
|
104
|
+
statusListIdx?: number;
|
|
105
|
+
/** Import into the wallet under the instance's EUDI_DEV_HOME. */
|
|
106
|
+
wallet?: boolean;
|
|
107
|
+
walletDir?: string;
|
|
108
|
+
templatesDir?: string;
|
|
109
|
+
/** With `wallet`: `file`, `memory`, `auto` or a `postgres://` URL. */
|
|
110
|
+
storage?: string;
|
|
111
|
+
/** With `wallet`: derive generated keys from this string. */
|
|
112
|
+
seed?: string;
|
|
113
|
+
display?: IssueDisplayOptions;
|
|
114
|
+
registration?: IssueRegistrationOptions;
|
|
115
|
+
/** With `saveTemplate`: add the template to the attestation catalogue with this entry. */
|
|
116
|
+
catalog?: JsonObject;
|
|
117
|
+
}
|
|
118
|
+
export interface IssueSdJwtOptions extends IssueCommonOptions {
|
|
119
|
+
iss?: string;
|
|
120
|
+
vct?: string;
|
|
121
|
+
/** Claims issued plainly instead of selectively disclosable (dotted paths for nested claims). */
|
|
122
|
+
alwaysDisclosed?: string[];
|
|
123
|
+
/** With `wallet`: issue this many copies with separate holder keys (max 8). */
|
|
124
|
+
batch?: number;
|
|
125
|
+
/** With `wallet`: issue without a holder key. */
|
|
126
|
+
unbound?: boolean;
|
|
127
|
+
}
|
|
128
|
+
export interface IssueJwtOptions extends IssueCommonOptions {
|
|
129
|
+
iss?: string;
|
|
130
|
+
vct?: string;
|
|
131
|
+
}
|
|
132
|
+
export interface IssueMdocOptions extends IssueCommonOptions {
|
|
133
|
+
docType?: string;
|
|
134
|
+
namespace?: string;
|
|
135
|
+
batch?: number;
|
|
136
|
+
unbound?: boolean;
|
|
137
|
+
}
|
|
138
|
+
export interface IssueResult {
|
|
139
|
+
/** The credential: SD-JWT / JWT compact form, or base64url / hex mdoc. */
|
|
140
|
+
credential: string;
|
|
141
|
+
/** Wallet credential id, set when `wallet: true` stored it. */
|
|
142
|
+
id?: string;
|
|
143
|
+
/** Public JWK of the ephemeral signing key, when no `key` was given. */
|
|
144
|
+
publicJwk?: JsonObject;
|
|
145
|
+
stderr: string;
|
|
146
|
+
}
|
|
147
|
+
/** Extracts the ephemeral public JWK that `issue` prints to stderr. Exported for tests. */
|
|
148
|
+
export declare function parseEphemeralJwk(stderr: string): JsonObject | undefined;
|
|
149
|
+
export declare function issueSdJwt(runner: Runner, opts?: IssueSdJwtOptions): Promise<IssueResult>;
|
|
150
|
+
export declare function issueJwt(runner: Runner, opts?: IssueJwtOptions): Promise<IssueResult>;
|
|
151
|
+
export declare function issueMdoc(runner: Runner, opts?: IssueMdocOptions): Promise<IssueResult>;
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { EudiDevError } from '../errors.js';
|
|
2
|
+
import { isPathInput } from '../input.js';
|
|
3
|
+
import { ArgList, positionalInput, Scratch } from '../runner.js';
|
|
4
|
+
function runOpts(opts, stdin) {
|
|
5
|
+
const r = {};
|
|
6
|
+
if (opts.timeoutMs !== undefined)
|
|
7
|
+
r.timeoutMs = opts.timeoutMs;
|
|
8
|
+
if (opts.signal !== undefined)
|
|
9
|
+
r.signal = opts.signal;
|
|
10
|
+
if (stdin !== undefined)
|
|
11
|
+
r.stdin = stdin;
|
|
12
|
+
return r;
|
|
13
|
+
}
|
|
14
|
+
// ── version ───────────────────────────────────────────────────────────────
|
|
15
|
+
export async function version(runner, opts = {}) {
|
|
16
|
+
const { document } = await runner.run(['version', ...(opts.extraArgs ?? [])], runOpts(opts));
|
|
17
|
+
return document;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* `eudi decode`: inspects a credential, certificate, OpenID4VCI offer,
|
|
21
|
+
* OpenID4VP request or trusted list. For credentials and certificates the
|
|
22
|
+
* document also holds the decoder's checks under `validation.checks`.
|
|
23
|
+
*/
|
|
24
|
+
export async function decode(runner, input, opts = {}) {
|
|
25
|
+
const { arg, stdin } = await positionalInput(input);
|
|
26
|
+
const args = new ArgList('decode').value('format', opts.format).push(...(opts.extraArgs ?? []), arg);
|
|
27
|
+
const { document } = await runner.run(args.args, runOpts(opts, stdin));
|
|
28
|
+
return document;
|
|
29
|
+
}
|
|
30
|
+
/** True when a decode result is a credential or certificate (it carries `validation`). */
|
|
31
|
+
export function isDecodedCredential(doc) {
|
|
32
|
+
const format = doc.format;
|
|
33
|
+
return (typeof doc === 'object' &&
|
|
34
|
+
doc !== null &&
|
|
35
|
+
typeof doc.validation === 'object' &&
|
|
36
|
+
(format === 'dc+sd-jwt' || format === 'jwt' || format === 'mso_mdoc' || format === 'x509'));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* `eudi validate`. A failing check does not throw: the result has
|
|
40
|
+
* `valid: false` and the full report. It throws {@link EudiDevError} when
|
|
41
|
+
* there is no report, for example for input that doesn't parse.
|
|
42
|
+
*/
|
|
43
|
+
export async function validate(runner, input, opts = {}) {
|
|
44
|
+
const scratch = new Scratch();
|
|
45
|
+
try {
|
|
46
|
+
const { arg, stdin } = await positionalInput(input);
|
|
47
|
+
const args = new ArgList('validate');
|
|
48
|
+
if (opts.key !== undefined) {
|
|
49
|
+
const key = isJsonObject(opts.key) ? JSON.stringify(opts.key) : opts.key;
|
|
50
|
+
args.value('key', await scratch.file(key, 'key'));
|
|
51
|
+
}
|
|
52
|
+
if (opts.trustedList !== undefined) {
|
|
53
|
+
args.value('trusted-list', await scratch.file(opts.trustedList, 'trusted-list.jwt', { allowUrl: true }));
|
|
54
|
+
}
|
|
55
|
+
args
|
|
56
|
+
.bool('status-list', opts.statusList)
|
|
57
|
+
.on('allow-expired', opts.allowExpired)
|
|
58
|
+
.on('haip', opts.haip)
|
|
59
|
+
.push(...(opts.extraArgs ?? []), arg);
|
|
60
|
+
try {
|
|
61
|
+
const { document, stderr } = await runner.run(args.args, runOpts(opts, stdin));
|
|
62
|
+
return { valid: true, report: document, stderr };
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
if (err instanceof EudiDevError && isReport(err.document)) {
|
|
66
|
+
return { valid: false, error: err.message, report: err.document, stderr: err.stderr };
|
|
67
|
+
}
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
await scratch.cleanup();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function isReport(doc) {
|
|
76
|
+
return typeof doc === 'object' && doc !== null && Array.isArray(doc.checks);
|
|
77
|
+
}
|
|
78
|
+
function isJsonObject(v) {
|
|
79
|
+
return (typeof v === 'object' &&
|
|
80
|
+
v !== null &&
|
|
81
|
+
!(v instanceof Uint8Array) &&
|
|
82
|
+
!('path' in v && typeof v.path === 'string') &&
|
|
83
|
+
!('url' in v && typeof v.url === 'string'));
|
|
84
|
+
}
|
|
85
|
+
// ── dcql ──────────────────────────────────────────────────────────────────
|
|
86
|
+
/** `eudi dcql`: a DCQL query asking for every claim of the credential. */
|
|
87
|
+
export async function dcql(runner, input, opts = {}) {
|
|
88
|
+
const { arg, stdin } = await positionalInput(input);
|
|
89
|
+
const { document } = await runner.run(['dcql', ...(opts.extraArgs ?? []), arg], runOpts(opts, stdin));
|
|
90
|
+
return document;
|
|
91
|
+
}
|
|
92
|
+
const EPHEMERAL_MARKER = 'Ephemeral signing key (public JWK):';
|
|
93
|
+
/** Extracts the ephemeral public JWK that `issue` prints to stderr. Exported for tests. */
|
|
94
|
+
export function parseEphemeralJwk(stderr) {
|
|
95
|
+
const lines = stderr.split(/\r?\n/);
|
|
96
|
+
const start = lines.findIndex((l) => l.trim() === EPHEMERAL_MARKER);
|
|
97
|
+
if (start < 0)
|
|
98
|
+
return undefined;
|
|
99
|
+
// Upstream prints the JWK with json.MarshalIndent, so it spans several
|
|
100
|
+
// lines. Grow the candidate line by line until it parses.
|
|
101
|
+
let candidate = '';
|
|
102
|
+
for (const line of lines.slice(start + 1, start + 1 + 64)) {
|
|
103
|
+
candidate += `${line}\n`;
|
|
104
|
+
try {
|
|
105
|
+
const jwk = JSON.parse(candidate);
|
|
106
|
+
return typeof jwk === 'object' && jwk !== null && !Array.isArray(jwk) ? jwk : undefined;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// incomplete, keep reading
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
async function commonIssueArgs(args, opts, scratch) {
|
|
115
|
+
if (opts.claims !== undefined) {
|
|
116
|
+
const path = isPathInput(opts.claims)
|
|
117
|
+
? await scratch.file(opts.claims, 'claims.json')
|
|
118
|
+
: await scratch.write('claims.json', JSON.stringify(opts.claims));
|
|
119
|
+
args.value('claims', `@${path}`);
|
|
120
|
+
}
|
|
121
|
+
if (opts.key !== undefined) {
|
|
122
|
+
const key = isJsonObject(opts.key) ? JSON.stringify(opts.key) : opts.key;
|
|
123
|
+
args.value('key', await scratch.file(key, 'key'));
|
|
124
|
+
}
|
|
125
|
+
if (opts.cert !== undefined)
|
|
126
|
+
args.value('cert', await scratch.file(opts.cert, 'cert.pem'));
|
|
127
|
+
if (opts.template !== undefined) {
|
|
128
|
+
args.value('template', typeof opts.template === 'string' ? opts.template : await scratch.file(opts.template, 'template.json'));
|
|
129
|
+
}
|
|
130
|
+
args
|
|
131
|
+
.value('exp', opts.exp)
|
|
132
|
+
.value('nbf', opts.nbf)
|
|
133
|
+
.on('pid', opts.pid)
|
|
134
|
+
.csv('omit', opts.omit)
|
|
135
|
+
.value('save-template', opts.saveTemplate)
|
|
136
|
+
.value('status-list-uri', opts.statusListUri)
|
|
137
|
+
.value('status-list-idx', opts.statusListIdx)
|
|
138
|
+
.on('wallet', opts.wallet)
|
|
139
|
+
.value('wallet-dir', opts.walletDir)
|
|
140
|
+
.value('templates-dir', opts.templatesDir)
|
|
141
|
+
.value('storage', opts.storage)
|
|
142
|
+
.value('seed', opts.seed);
|
|
143
|
+
const d = opts.display;
|
|
144
|
+
if (d) {
|
|
145
|
+
args
|
|
146
|
+
.value('display-name', d.name)
|
|
147
|
+
.value('display-description', d.description)
|
|
148
|
+
.value('background-color', d.backgroundColor)
|
|
149
|
+
.value('text-color', d.textColor)
|
|
150
|
+
.value('logo', d.logo)
|
|
151
|
+
.value('logo-alt', d.logoAlt)
|
|
152
|
+
.value('background-image', d.backgroundImage)
|
|
153
|
+
.value('display-template', d.template);
|
|
154
|
+
}
|
|
155
|
+
const r = opts.registration;
|
|
156
|
+
if (r) {
|
|
157
|
+
args
|
|
158
|
+
.value('category', r.category)
|
|
159
|
+
.repeat('entitlement', r.entitlements)
|
|
160
|
+
.value('trusted-list-type', r.trustedListType)
|
|
161
|
+
.value('status-determination-approach', r.statusDeterminationApproach)
|
|
162
|
+
.value('scheme-community-rule', r.schemeCommunityRule)
|
|
163
|
+
.value('scheme-territory', r.schemeTerritory)
|
|
164
|
+
.value('trusted-entity-name', r.trustedEntityName)
|
|
165
|
+
.value('issuance-service-type', r.issuanceServiceType)
|
|
166
|
+
.value('revocation-service-type', r.revocationServiceType)
|
|
167
|
+
.value('issuance-service-name', r.issuanceServiceName)
|
|
168
|
+
.value('revocation-service-name', r.revocationServiceName);
|
|
169
|
+
}
|
|
170
|
+
if (opts.catalog !== undefined) {
|
|
171
|
+
args.value('catalog', await scratch.write('catalog.json', JSON.stringify(opts.catalog)));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async function runIssue(runner, args, opts, scratch) {
|
|
175
|
+
try {
|
|
176
|
+
args.push(...(opts.extraArgs ?? []));
|
|
177
|
+
const { document, stderr } = await runner.run(args.args, runOpts(opts));
|
|
178
|
+
const result = { credential: document.credential, stderr };
|
|
179
|
+
if (document.id !== undefined)
|
|
180
|
+
result.id = document.id;
|
|
181
|
+
const jwk = parseEphemeralJwk(stderr);
|
|
182
|
+
if (jwk)
|
|
183
|
+
result.publicJwk = jwk;
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
finally {
|
|
187
|
+
await scratch.cleanup();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
export async function issueSdJwt(runner, opts = {}) {
|
|
191
|
+
const scratch = new Scratch();
|
|
192
|
+
const args = new ArgList('issue', 'sdjwt');
|
|
193
|
+
try {
|
|
194
|
+
await commonIssueArgs(args, opts, scratch);
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
await scratch.cleanup();
|
|
198
|
+
throw err;
|
|
199
|
+
}
|
|
200
|
+
args
|
|
201
|
+
.value('iss', opts.iss)
|
|
202
|
+
.value('vct', opts.vct)
|
|
203
|
+
.csv('always-disclosed', opts.alwaysDisclosed)
|
|
204
|
+
.value('batch', opts.batch)
|
|
205
|
+
.on('unbound', opts.unbound);
|
|
206
|
+
return runIssue(runner, args, opts, scratch);
|
|
207
|
+
}
|
|
208
|
+
export async function issueJwt(runner, opts = {}) {
|
|
209
|
+
const scratch = new Scratch();
|
|
210
|
+
const args = new ArgList('issue', 'jwt');
|
|
211
|
+
try {
|
|
212
|
+
await commonIssueArgs(args, opts, scratch);
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
await scratch.cleanup();
|
|
216
|
+
throw err;
|
|
217
|
+
}
|
|
218
|
+
args.value('iss', opts.iss).value('vct', opts.vct);
|
|
219
|
+
return runIssue(runner, args, opts, scratch);
|
|
220
|
+
}
|
|
221
|
+
export async function issueMdoc(runner, opts = {}) {
|
|
222
|
+
const scratch = new Scratch();
|
|
223
|
+
const args = new ArgList('issue', 'mdoc');
|
|
224
|
+
try {
|
|
225
|
+
await commonIssueArgs(args, opts, scratch);
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
await scratch.cleanup();
|
|
229
|
+
throw err;
|
|
230
|
+
}
|
|
231
|
+
args.value('doc-type', opts.docType).value('namespace', opts.namespace).value('batch', opts.batch).on('unbound', opts.unbound);
|
|
232
|
+
return runIssue(runner, args, opts, scratch);
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/commands/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAA8B,WAAW,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAgC,OAAO,EAAE,MAAM,cAAc,CAAC;AAS/F,SAAS,OAAO,CAAC,IAAiB,EAAE,KAA2B;IAC7D,MAAM,CAAC,GAAe,EAAE,CAAC;IACzB,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAC/D,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACtD,IAAI,KAAK,KAAK,SAAS;QAAE,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;IACzC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,6EAA6E;AAE7E,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,OAAoB,EAAE;IAClE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAc,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1G,OAAO,QAAQ,CAAC;AAClB,CAAC;AAWD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,MAAc,EAAE,KAAY,EAAE,OAAsB,EAAE;IACjF,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACrG,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAe,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACrF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,mBAAmB,CAAC,GAAiB;IACnD,MAAM,MAAM,GAAI,GAA4B,CAAC,MAAM,CAAC;IACpD,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAQ,GAAgC,CAAC,UAAU,KAAK,QAAQ;QAChE,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,MAAM,CAAC,CAC3F,CAAC;AACJ,CAAC;AA0BD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAc,EAAE,KAAY,EAAE,OAAwB,EAAE;IACrF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YACzE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3G,CAAC;QACD,IAAI;aACD,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC;aACpC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC;aACtC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;aACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAiB,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/F,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,YAAY,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;YACxF,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,GAAY;IAC5B,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAE,GAA4B,CAAC,MAAM,CAAC,CAAC;AACxG,CAAC;AAED,SAAS,YAAY,CAAC,CAAU;IAC9B,OAAO,CACL,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI;QACV,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC;QAC1B,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,OAAQ,CAAuB,CAAC,IAAI,KAAK,QAAQ,CAAC;QACnE,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,OAAQ,CAAsB,CAAC,GAAG,KAAK,QAAQ,CAAC,CACjE,CAAC;AACJ,CAAC;AAED,6EAA6E;AAE7E,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,MAAc,EAAE,KAAY,EAAE,OAAoB,EAAE;IAC7E,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAY,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACjH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAwGD,MAAM,gBAAgB,GAAG,qCAAqC,CAAC;AAE/D,2FAA2F;AAC3F,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,gBAAgB,CAAC,CAAC;IACpE,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAChC,uEAAuE;IACvE,0DAA0D;IAC1D,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QAC1D,SAAS,IAAI,GAAG,IAAI,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC3C,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,GAAkB,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1G,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAa,EAAE,IAAwB,EAAE,OAAgB;IACtF,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;YACnC,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC;YAChD,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACzE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3F,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;IACjI,CAAC;IACD,IAAI;SACD,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;SACtB,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;SACtB,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;SACnB,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;SACtB,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC;SACzC,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,aAAa,CAAC;SAC5C,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,aAAa,CAAC;SAC5C,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;SACzB,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC;SACnC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC;SACzC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;SAC9B,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,CAAC;QACN,IAAI;aACD,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC;aAC7B,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,WAAW,CAAC;aAC3C,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,eAAe,CAAC;aAC5C,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,SAAS,CAAC;aAChC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;aACrB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC;aAC5B,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,eAAe,CAAC;aAC5C,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;IAC5B,IAAI,CAAC,EAAE,CAAC;QACN,IAAI;aACD,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC;aAC7B,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,YAAY,CAAC;aACrC,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC,eAAe,CAAC;aAC7C,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC,2BAA2B,CAAC;aACrE,KAAK,CAAC,uBAAuB,EAAE,CAAC,CAAC,mBAAmB,CAAC;aACrD,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,eAAe,CAAC;aAC5C,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,iBAAiB,CAAC;aACjD,KAAK,CAAC,uBAAuB,EAAE,CAAC,CAAC,mBAAmB,CAAC;aACrD,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAC,qBAAqB,CAAC;aACzD,KAAK,CAAC,uBAAuB,EAAE,CAAC,CAAC,mBAAmB,CAAC;aACrD,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,MAAc,EAAE,IAAa,EAAE,IAAwB,EAAE,OAAgB;IAC/F,IAAI,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACvF,MAAM,MAAM,GAAgB,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QACxE,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS;YAAE,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,GAAG;YAAE,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,OAA0B,EAAE;IAC3E,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,IAAI;SACD,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;SACtB,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;SACtB,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,eAAe,CAAC;SAC7C,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;SAC1B,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAc,EAAE,OAAwB,EAAE;IACvE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACnD,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc,EAAE,OAAyB,EAAE;IACzE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/H,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { FileInput } from '../input.js';
|
|
2
|
+
import { ArgList, type Runner, Scratch } from '../runner.js';
|
|
3
|
+
import type { AccessCertificateResult, DcqlQuery, Enrolment, EnrolmentResult, RegistrationCertificateResult, RegistrationExtensionResult, RelyingParty } from '../types.js';
|
|
4
|
+
import type { CallOptions } from './credentials.js';
|
|
5
|
+
/** Registration fields shared by verifiers and issuers. */
|
|
6
|
+
export interface PartyOptions {
|
|
7
|
+
/** Trade name. Required for a new registration. */
|
|
8
|
+
name: string;
|
|
9
|
+
/** An EUID or an organizationIdentifier. Default: an assigned EUID. */
|
|
10
|
+
identifier?: string;
|
|
11
|
+
/** Default `name`. */
|
|
12
|
+
legalName?: string;
|
|
13
|
+
/** Country code. Default the identifier's country. */
|
|
14
|
+
country?: string;
|
|
15
|
+
/** Web or email address. */
|
|
16
|
+
supportUri?: string;
|
|
17
|
+
/** Service identifier (the OU in access certificates). */
|
|
18
|
+
serviceId?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface IntendedUseOptions {
|
|
21
|
+
/** Shown in the consent dialog. */
|
|
22
|
+
purpose: string;
|
|
23
|
+
/** DCQL query with the credentials and claims to register. */
|
|
24
|
+
dcql: DcqlQuery | FileInput;
|
|
25
|
+
/** Privacy policy URL. Default a placeholder page on the wallet. */
|
|
26
|
+
privacyPolicy?: string;
|
|
27
|
+
}
|
|
28
|
+
export type AddVerifierOptions = PartyOptions & IntendedUseOptions & CallOptions;
|
|
29
|
+
export type ExtendVerifierOptions = IntendedUseOptions & CallOptions & {
|
|
30
|
+
/** Identifier of the registered relying party to add the intended use to. */
|
|
31
|
+
to: string;
|
|
32
|
+
};
|
|
33
|
+
export interface AttestationOptions {
|
|
34
|
+
/** `format:type`, e.g. `dc+sd-jwt:urn:eudi:pid:1` or `mso_mdoc:eu.europa.ec.eudi.pid.1`. */
|
|
35
|
+
attestations: string[];
|
|
36
|
+
/** Provider entitlement categories: pid, qeaa, pub-eaa, eaa. Default from the catalogue. */
|
|
37
|
+
categories?: string[];
|
|
38
|
+
}
|
|
39
|
+
export type AddIssuerOptions = PartyOptions & AttestationOptions & CallOptions;
|
|
40
|
+
export type ExtendIssuerOptions = AttestationOptions & CallOptions & {
|
|
41
|
+
to: string;
|
|
42
|
+
};
|
|
43
|
+
export interface AccessCertOptions extends CallOptions {
|
|
44
|
+
/** Identifier of the registered relying party. */
|
|
45
|
+
identifier: string;
|
|
46
|
+
/** PEM certificate signing request. */
|
|
47
|
+
csr: FileInput;
|
|
48
|
+
serviceId?: string;
|
|
49
|
+
/** Extra DNS names for the x509_san_dns client identifier. */
|
|
50
|
+
dns?: string[];
|
|
51
|
+
/** Go duration, at most one year. */
|
|
52
|
+
validity?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface RegistrationCertOptions extends CallOptions {
|
|
55
|
+
identifier: string;
|
|
56
|
+
serviceId?: string;
|
|
57
|
+
/** Default the relying party's only intended use. */
|
|
58
|
+
intendedUse?: string;
|
|
59
|
+
/** Certify the attestation provider service instead of an intended use. */
|
|
60
|
+
provider?: boolean;
|
|
61
|
+
/** Issue a new certificate and revoke the current one (`--new`). */
|
|
62
|
+
renew?: boolean;
|
|
63
|
+
/** Validity of a new certificate as a Go duration. Requires `renew` when one exists. */
|
|
64
|
+
validity?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface RegistrationScopeOptions extends CallOptions {
|
|
67
|
+
identifier: string;
|
|
68
|
+
intendedUse?: string;
|
|
69
|
+
serviceId?: string;
|
|
70
|
+
}
|
|
71
|
+
export declare class PartyCommands<AddOpts, ExtendOpts> {
|
|
72
|
+
protected readonly runner: Runner;
|
|
73
|
+
private readonly role;
|
|
74
|
+
private readonly build;
|
|
75
|
+
constructor(runner: Runner, role: 'verifiers' | 'issuers', build: (args: ArgList, opts: AddOpts | ExtendOpts, scratch: Scratch) => Promise<ArgList>);
|
|
76
|
+
/** `registrar <role> list`. */
|
|
77
|
+
list(opts?: CallOptions): Promise<RelyingParty[]>;
|
|
78
|
+
/** `registrar <role> add`: register a new relying party. */
|
|
79
|
+
add(opts: AddOpts & CallOptions): Promise<RelyingParty>;
|
|
80
|
+
/** `registrar <role> add --to`: extend an existing registration. */
|
|
81
|
+
extend(opts: ExtendOpts & CallOptions & {
|
|
82
|
+
to: string;
|
|
83
|
+
}): Promise<RegistrationExtensionResult>;
|
|
84
|
+
/** `registrar <role> rm <identifier>`: remove it and revoke its registration certificates. */
|
|
85
|
+
remove(identifier: string, opts?: CallOptions): Promise<{
|
|
86
|
+
removed: string;
|
|
87
|
+
}>;
|
|
88
|
+
private runAdd;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* `eudi registrar ...` against the wallet in this instance's EUDI_DEV_HOME.
|
|
92
|
+
* Registrations persist there between calls.
|
|
93
|
+
*/
|
|
94
|
+
export declare class RegistrarCommands {
|
|
95
|
+
private readonly runner;
|
|
96
|
+
readonly verifiers: PartyCommands<AddVerifierOptions, ExtendVerifierOptions>;
|
|
97
|
+
readonly issuers: PartyCommands<AddIssuerOptions, ExtendIssuerOptions>;
|
|
98
|
+
constructor(runner: Runner);
|
|
99
|
+
/** `registrar enrol`: register a relying party and issue its certificates in one step. */
|
|
100
|
+
enrol(enrolment: Enrolment, opts?: CallOptions & {
|
|
101
|
+
update?: boolean;
|
|
102
|
+
}): Promise<EnrolmentResult>;
|
|
103
|
+
/** `registrar access-cert`: issue an access certificate for a CSR. */
|
|
104
|
+
accessCert(opts: AccessCertOptions): Promise<AccessCertificateResult>;
|
|
105
|
+
/** `registrar registration-cert`: the current registration certificate, issuing one if needed. */
|
|
106
|
+
registrationCert(opts: RegistrationCertOptions): Promise<RegistrationCertificateResult>;
|
|
107
|
+
/** `registrar revoke`: revoke registration certificates. Returns how many changed. */
|
|
108
|
+
revoke(opts: RegistrationScopeOptions): Promise<{
|
|
109
|
+
changed: number;
|
|
110
|
+
}>;
|
|
111
|
+
/** `registrar activate`: reactivate revoked registration certificates. */
|
|
112
|
+
activate(opts: RegistrationScopeOptions): Promise<{
|
|
113
|
+
changed: number;
|
|
114
|
+
}>;
|
|
115
|
+
private setStatus;
|
|
116
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { ArgList, Scratch } from '../runner.js';
|
|
2
|
+
function runOpts(opts, stdin) {
|
|
3
|
+
const r = {};
|
|
4
|
+
if (opts.timeoutMs !== undefined)
|
|
5
|
+
r.timeoutMs = opts.timeoutMs;
|
|
6
|
+
if (opts.signal !== undefined)
|
|
7
|
+
r.signal = opts.signal;
|
|
8
|
+
if (stdin !== undefined)
|
|
9
|
+
r.stdin = stdin;
|
|
10
|
+
return r;
|
|
11
|
+
}
|
|
12
|
+
function isDcqlObject(v) {
|
|
13
|
+
return typeof v === 'object' && v !== null && !(v instanceof Uint8Array) && Array.isArray(v.credentials);
|
|
14
|
+
}
|
|
15
|
+
function partyArgs(args, p) {
|
|
16
|
+
return args
|
|
17
|
+
.value('name', p.name)
|
|
18
|
+
.value('identifier', p.identifier)
|
|
19
|
+
.value('legal-name', p.legalName)
|
|
20
|
+
.value('country', p.country)
|
|
21
|
+
.value('support-uri', p.supportUri)
|
|
22
|
+
.value('service-id', p.serviceId);
|
|
23
|
+
}
|
|
24
|
+
async function intendedUseArgs(args, u, scratch) {
|
|
25
|
+
const dcql = isDcqlObject(u.dcql) ? JSON.stringify(u.dcql) : u.dcql;
|
|
26
|
+
return args
|
|
27
|
+
.value('purpose', u.purpose)
|
|
28
|
+
.value('dcql', await scratch.file(dcql, 'dcql.json'))
|
|
29
|
+
.value('privacy-policy', u.privacyPolicy);
|
|
30
|
+
}
|
|
31
|
+
function attestationArgs(args, a) {
|
|
32
|
+
return args.repeat('attestation', a.attestations).repeat('category', a.categories);
|
|
33
|
+
}
|
|
34
|
+
export class PartyCommands {
|
|
35
|
+
runner;
|
|
36
|
+
role;
|
|
37
|
+
build;
|
|
38
|
+
constructor(runner, role, build) {
|
|
39
|
+
this.runner = runner;
|
|
40
|
+
this.role = role;
|
|
41
|
+
this.build = build;
|
|
42
|
+
}
|
|
43
|
+
/** `registrar <role> list`. */
|
|
44
|
+
async list(opts = {}) {
|
|
45
|
+
const { document } = await this.runner.run(['registrar', this.role, 'list', ...(opts.extraArgs ?? [])], runOpts(opts));
|
|
46
|
+
return document;
|
|
47
|
+
}
|
|
48
|
+
/** `registrar <role> add`: register a new relying party. */
|
|
49
|
+
async add(opts) {
|
|
50
|
+
return this.runAdd(opts);
|
|
51
|
+
}
|
|
52
|
+
/** `registrar <role> add --to`: extend an existing registration. */
|
|
53
|
+
async extend(opts) {
|
|
54
|
+
return this.runAdd(opts);
|
|
55
|
+
}
|
|
56
|
+
/** `registrar <role> rm <identifier>`: remove it and revoke its registration certificates. */
|
|
57
|
+
async remove(identifier, opts = {}) {
|
|
58
|
+
const { document } = await this.runner.run(['registrar', this.role, 'rm', ...(opts.extraArgs ?? []), identifier], runOpts(opts));
|
|
59
|
+
return document;
|
|
60
|
+
}
|
|
61
|
+
async runAdd(opts) {
|
|
62
|
+
const scratch = new Scratch();
|
|
63
|
+
try {
|
|
64
|
+
const args = await this.build(new ArgList('registrar', this.role, 'add'), opts, scratch);
|
|
65
|
+
args.value('to', opts.to).push(...(opts.extraArgs ?? []));
|
|
66
|
+
const { document } = await this.runner.run(args.args, runOpts(opts));
|
|
67
|
+
return document;
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
await scratch.cleanup();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* `eudi registrar ...` against the wallet in this instance's EUDI_DEV_HOME.
|
|
76
|
+
* Registrations persist there between calls.
|
|
77
|
+
*/
|
|
78
|
+
export class RegistrarCommands {
|
|
79
|
+
runner;
|
|
80
|
+
verifiers;
|
|
81
|
+
issuers;
|
|
82
|
+
constructor(runner) {
|
|
83
|
+
this.runner = runner;
|
|
84
|
+
this.verifiers = new PartyCommands(runner, 'verifiers', async (args, opts, scratch) => {
|
|
85
|
+
if (!('to' in opts && opts.to))
|
|
86
|
+
partyArgs(args, opts);
|
|
87
|
+
return intendedUseArgs(args, opts, scratch);
|
|
88
|
+
});
|
|
89
|
+
this.issuers = new PartyCommands(runner, 'issuers', async (args, opts) => {
|
|
90
|
+
if (!('to' in opts && opts.to))
|
|
91
|
+
partyArgs(args, opts);
|
|
92
|
+
return attestationArgs(args, opts);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/** `registrar enrol`: register a relying party and issue its certificates in one step. */
|
|
96
|
+
async enrol(enrolment, opts = {}) {
|
|
97
|
+
const args = new ArgList('registrar', 'enrol').on('update', opts.update).push(...(opts.extraArgs ?? []), '-');
|
|
98
|
+
const { document } = await this.runner.run(args.args, runOpts(opts, JSON.stringify(enrolment)));
|
|
99
|
+
return document;
|
|
100
|
+
}
|
|
101
|
+
/** `registrar access-cert`: issue an access certificate for a CSR. */
|
|
102
|
+
async accessCert(opts) {
|
|
103
|
+
const scratch = new Scratch();
|
|
104
|
+
try {
|
|
105
|
+
const args = new ArgList('registrar', 'access-cert')
|
|
106
|
+
.value('identifier', opts.identifier)
|
|
107
|
+
.value('csr', await scratch.file(opts.csr, 'request.csr'))
|
|
108
|
+
.value('service-id', opts.serviceId)
|
|
109
|
+
.repeat('dns', opts.dns)
|
|
110
|
+
.value('validity', opts.validity)
|
|
111
|
+
.push(...(opts.extraArgs ?? []));
|
|
112
|
+
const { document } = await this.runner.run(args.args, runOpts(opts));
|
|
113
|
+
return document;
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
await scratch.cleanup();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** `registrar registration-cert`: the current registration certificate, issuing one if needed. */
|
|
120
|
+
async registrationCert(opts) {
|
|
121
|
+
const args = new ArgList('registrar', 'registration-cert')
|
|
122
|
+
.value('identifier', opts.identifier)
|
|
123
|
+
.value('service-id', opts.serviceId)
|
|
124
|
+
.value('intended-use', opts.intendedUse)
|
|
125
|
+
.on('provider', opts.provider)
|
|
126
|
+
.on('new', opts.renew)
|
|
127
|
+
.value('validity', opts.validity)
|
|
128
|
+
.push(...(opts.extraArgs ?? []));
|
|
129
|
+
const { document } = await this.runner.run(args.args, runOpts(opts));
|
|
130
|
+
return document;
|
|
131
|
+
}
|
|
132
|
+
/** `registrar revoke`: revoke registration certificates. Returns how many changed. */
|
|
133
|
+
async revoke(opts) {
|
|
134
|
+
return this.setStatus('revoke', opts);
|
|
135
|
+
}
|
|
136
|
+
/** `registrar activate`: reactivate revoked registration certificates. */
|
|
137
|
+
async activate(opts) {
|
|
138
|
+
return this.setStatus('activate', opts);
|
|
139
|
+
}
|
|
140
|
+
async setStatus(cmd, opts) {
|
|
141
|
+
const args = new ArgList('registrar', cmd)
|
|
142
|
+
.value('identifier', opts.identifier)
|
|
143
|
+
.value('intended-use', opts.intendedUse)
|
|
144
|
+
.value('service-id', opts.serviceId)
|
|
145
|
+
.push(...(opts.extraArgs ?? []));
|
|
146
|
+
const { document } = await this.runner.run(args.args, runOpts(opts));
|
|
147
|
+
return document;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=registrar.js.map
|