@package-broker/cli 0.19.8 → 2.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +12 -0
- package/dist/bin.js.map +1 -0
- package/dist/build-artifacts.d.ts +27 -0
- package/dist/build-artifacts.d.ts.map +1 -0
- package/dist/build-artifacts.js +169 -0
- package/dist/build-artifacts.js.map +1 -0
- package/dist/build-assets.d.ts +36 -0
- package/dist/build-assets.d.ts.map +1 -0
- package/dist/build-assets.js +224 -0
- package/dist/build-assets.js.map +1 -0
- package/dist/build.d.ts +31 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +277 -0
- package/dist/build.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +801 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloudflare/d1-http-executor.d.ts +30 -0
- package/dist/cloudflare/d1-http-executor.d.ts.map +1 -0
- package/dist/cloudflare/d1-http-executor.js +230 -0
- package/dist/cloudflare/d1-http-executor.js.map +1 -0
- package/dist/cloudflare/d1-http-response.d.ts +4 -0
- package/dist/cloudflare/d1-http-response.d.ts.map +1 -0
- package/dist/cloudflare/d1-http-response.js +113 -0
- package/dist/cloudflare/d1-http-response.js.map +1 -0
- package/dist/commands/admin.d.ts +47 -0
- package/dist/commands/admin.d.ts.map +1 -0
- package/dist/commands/admin.js +447 -0
- package/dist/commands/admin.js.map +1 -0
- package/dist/commands/built-manifest.d.ts +13 -0
- package/dist/commands/built-manifest.d.ts.map +1 -0
- package/dist/commands/built-manifest.js +197 -0
- package/dist/commands/built-manifest.js.map +1 -0
- package/dist/commands/cloudflare/api.d.ts +129 -0
- package/dist/commands/cloudflare/api.d.ts.map +1 -0
- package/dist/commands/cloudflare/api.js +480 -0
- package/dist/commands/cloudflare/api.js.map +1 -0
- package/dist/commands/cloudflare/deploy.d.ts +81 -0
- package/dist/commands/cloudflare/deploy.d.ts.map +1 -0
- package/dist/commands/cloudflare/deploy.js +1848 -0
- package/dist/commands/cloudflare/deploy.js.map +1 -0
- package/dist/commands/cloudflare/inventory.d.ts +243 -0
- package/dist/commands/cloudflare/inventory.d.ts.map +1 -0
- package/dist/commands/cloudflare/inventory.js +786 -0
- package/dist/commands/cloudflare/inventory.js.map +1 -0
- package/dist/commands/cloudflare/janitor.d.ts +10 -0
- package/dist/commands/cloudflare/janitor.d.ts.map +1 -0
- package/dist/commands/cloudflare/janitor.js +84 -0
- package/dist/commands/cloudflare/janitor.js.map +1 -0
- package/dist/commands/cloudflare/migrations-check.d.ts +5 -0
- package/dist/commands/cloudflare/migrations-check.d.ts.map +1 -0
- package/dist/commands/cloudflare/migrations-check.js +10 -0
- package/dist/commands/cloudflare/migrations-check.js.map +1 -0
- package/dist/commands/cloudflare/provision.d.ts +79 -0
- package/dist/commands/cloudflare/provision.d.ts.map +1 -0
- package/dist/commands/cloudflare/provision.js +961 -0
- package/dist/commands/cloudflare/provision.js.map +1 -0
- package/dist/commands/cloudflare/queue-consumer.d.ts +4 -0
- package/dist/commands/cloudflare/queue-consumer.d.ts.map +1 -0
- package/dist/commands/cloudflare/queue-consumer.js +57 -0
- package/dist/commands/cloudflare/queue-consumer.js.map +1 -0
- package/dist/commands/cloudflare/setup.d.ts +48 -0
- package/dist/commands/cloudflare/setup.d.ts.map +1 -0
- package/dist/commands/cloudflare/setup.js +836 -0
- package/dist/commands/cloudflare/setup.js.map +1 -0
- package/dist/commands/cloudflare/smoke.d.ts +29 -0
- package/dist/commands/cloudflare/smoke.d.ts.map +1 -0
- package/dist/commands/cloudflare/smoke.js +715 -0
- package/dist/commands/cloudflare/smoke.js.map +1 -0
- package/dist/commands/cloudflare/teardown.d.ts +62 -0
- package/dist/commands/cloudflare/teardown.d.ts.map +1 -0
- package/dist/commands/cloudflare/teardown.js +906 -0
- package/dist/commands/cloudflare/teardown.js.map +1 -0
- package/dist/commands/cloudflare/worker-settings.d.ts +4 -0
- package/dist/commands/cloudflare/worker-settings.d.ts.map +1 -0
- package/dist/commands/cloudflare/worker-settings.js +93 -0
- package/dist/commands/cloudflare/worker-settings.js.map +1 -0
- package/dist/commands/cloudflare.d.ts +55 -0
- package/dist/commands/cloudflare.d.ts.map +1 -0
- package/dist/commands/cloudflare.js +393 -0
- package/dist/commands/cloudflare.js.map +1 -0
- package/dist/commands/import-cutover.d.ts +5 -0
- package/dist/commands/import-cutover.d.ts.map +1 -0
- package/dist/commands/import-cutover.js +25 -0
- package/dist/commands/import-cutover.js.map +1 -0
- package/dist/commands/import-private-packagist.d.ts +38 -0
- package/dist/commands/import-private-packagist.d.ts.map +1 -0
- package/dist/commands/import-private-packagist.js +232 -0
- package/dist/commands/import-private-packagist.js.map +1 -0
- package/dist/commands/import-satis.d.ts +11 -0
- package/dist/commands/import-satis.d.ts.map +1 -0
- package/dist/commands/import-satis.js +112 -0
- package/dist/commands/import-satis.js.map +1 -0
- package/dist/commands/import.d.ts +22 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +343 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/openapi-specs.d.ts +4 -0
- package/dist/commands/openapi-specs.d.ts.map +1 -0
- package/dist/commands/openapi-specs.js +94 -0
- package/dist/commands/openapi-specs.js.map +1 -0
- package/dist/commands/openapi.d.ts +12 -0
- package/dist/commands/openapi.d.ts.map +1 -0
- package/dist/commands/openapi.js +44 -0
- package/dist/commands/openapi.js.map +1 -0
- package/dist/commands/source.d.ts +8 -0
- package/dist/commands/source.d.ts.map +1 -0
- package/dist/commands/source.js +61 -0
- package/dist/commands/source.js.map +1 -0
- package/dist/commands/sqlite.d.ts +11 -0
- package/dist/commands/sqlite.d.ts.map +1 -0
- package/dist/commands/sqlite.js +76 -0
- package/dist/commands/sqlite.js.map +1 -0
- package/dist/import/client.d.ts +71 -0
- package/dist/import/client.d.ts.map +1 -0
- package/dist/import/client.js +348 -0
- package/dist/import/client.js.map +1 -0
- package/dist/import/credential-refs.d.ts +2 -0
- package/dist/import/credential-refs.d.ts.map +1 -0
- package/dist/import/credential-refs.js +22 -0
- package/dist/import/credential-refs.js.map +1 -0
- package/dist/import/cutover.d.ts +64 -0
- package/dist/import/cutover.d.ts.map +1 -0
- package/dist/import/cutover.js +544 -0
- package/dist/import/cutover.js.map +1 -0
- package/dist/import/private-packagist/api.d.ts +57 -0
- package/dist/import/private-packagist/api.d.ts.map +1 -0
- package/dist/import/private-packagist/api.js +246 -0
- package/dist/import/private-packagist/api.js.map +1 -0
- package/dist/import/private-packagist/dates.d.ts +30 -0
- package/dist/import/private-packagist/dates.d.ts.map +1 -0
- package/dist/import/private-packagist/dates.js +189 -0
- package/dist/import/private-packagist/dates.js.map +1 -0
- package/dist/import/private-packagist/map.d.ts +48 -0
- package/dist/import/private-packagist/map.d.ts.map +1 -0
- package/dist/import/private-packagist/map.js +162 -0
- package/dist/import/private-packagist/map.js.map +1 -0
- package/dist/import/private-packagist/plan.d.ts +61 -0
- package/dist/import/private-packagist/plan.d.ts.map +1 -0
- package/dist/import/private-packagist/plan.js +936 -0
- package/dist/import/private-packagist/plan.js.map +1 -0
- package/dist/import/private-packagist/snapshot.d.ts +31 -0
- package/dist/import/private-packagist/snapshot.d.ts.map +1 -0
- package/dist/import/private-packagist/snapshot.js +406 -0
- package/dist/import/private-packagist/snapshot.js.map +1 -0
- package/dist/import/satis.d.ts +93 -0
- package/dist/import/satis.d.ts.map +1 -0
- package/dist/import/satis.js +873 -0
- package/dist/import/satis.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -96
- package/dist/index.js.map +1 -1
- package/dist/manifest.d.ts +55 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +125 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations-collect.d.ts +6 -0
- package/dist/migrations-collect.d.ts.map +1 -0
- package/dist/migrations-collect.js +39 -0
- package/dist/migrations-collect.js.map +1 -0
- package/dist/prebuilt-expected.json +7 -0
- package/dist/prebuilt.d.ts +27 -0
- package/dist/prebuilt.d.ts.map +1 -0
- package/dist/prebuilt.js +391 -0
- package/dist/prebuilt.js.map +1 -0
- package/package.json +21 -25
- package/README.md +0 -29
- package/dist/__tests__/migrate.test.d.ts +0 -2
- package/dist/__tests__/migrate.test.d.ts.map +0 -1
- package/dist/__tests__/migrate.test.js +0 -116
- package/dist/__tests__/migrate.test.js.map +0 -1
- package/dist/migrate.d.ts +0 -40
- package/dist/migrate.d.ts.map +0 -1
- package/dist/migrate.js +0 -335
- package/dist/migrate.js.map +0 -1
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
import { existsSync, lstatSync, unlinkSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { lstat, open, unlink } from 'node:fs/promises';
|
|
4
|
+
import { randomToken, sha256Hex } from '@package-broker/core/auth/primitives';
|
|
5
|
+
import { DEFAULT_ROLES } from '@package-broker/core/authz/permissions';
|
|
6
|
+
import { DbError } from '@package-broker/core/db/errors';
|
|
7
|
+
import { orgContext } from '@package-broker/core/db/port';
|
|
8
|
+
import { isoTimestamp, systemClock, ulid } from '@package-broker/core/ids';
|
|
9
|
+
import { isReservedProviderId, isValidProviderId, isValidTrustAnchor, } from '@package-broker/core/identity/port';
|
|
10
|
+
import { normalizeEmail } from '@package-broker/core/identity/policy';
|
|
11
|
+
import { reportableErrorName } from '@package-broker/core/kernel/error-name';
|
|
12
|
+
import { formatMasterKey, generateMasterKey } from '@package-broker/core/secrets/master-key';
|
|
13
|
+
import { bootstrapAdminWithTopUp, resetLocalLogin, } from '@package-broker/db-sqlite/repositories/admin-bootstrap';
|
|
14
|
+
import { createOrganizationBootstrap } from '@package-broker/db-sqlite/repositories/organization';
|
|
15
|
+
import { readProviderBinding, rebindProvider, } from '@package-broker/db-sqlite/repositories/provider-binding';
|
|
16
|
+
import { openBetterSqliteExecutor } from '@package-broker/runtime-node/db/better-sqlite3-executor';
|
|
17
|
+
import { createD1HttpExecutor, isLostResponse } from '../cloudflare/d1-http-executor.js';
|
|
18
|
+
const SIGNALS = ['SIGINT', 'SIGTERM'];
|
|
19
|
+
const SETUP_TOKEN_TTL_MS = 24 * 3_600_000;
|
|
20
|
+
const KEY_VERSION = /^[1-9][0-9]{0,8}$/;
|
|
21
|
+
const UUID_SHAPE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
22
|
+
const ACCOUNT_ID_SHAPE = /^[0-9a-f]{32}$/;
|
|
23
|
+
const TOKEN_SHAPE = /^[\x21-\x7e]+$/;
|
|
24
|
+
const NEXT = [
|
|
25
|
+
'POST /_pb/auth/local/setup/start {"token"}',
|
|
26
|
+
'POST /_pb/auth/local/setup/finish {"token","password","code"}',
|
|
27
|
+
];
|
|
28
|
+
const BROWSER_NEXT = 'next: open /_pb/ui/setup on the broker in a browser and paste the setup token there; the token never goes into the address bar. Or call the two POST routes named under "next".';
|
|
29
|
+
function say(command, text) {
|
|
30
|
+
console.error(`${command}: ${text}`);
|
|
31
|
+
}
|
|
32
|
+
export async function runGenerateMasterKey(o) {
|
|
33
|
+
const command = 'secrets generate-master-key';
|
|
34
|
+
const version = o.keyVersion === undefined ? 1 : Number(o.keyVersion);
|
|
35
|
+
if (o.keyVersion !== undefined && !KEY_VERSION.test(o.keyVersion)) {
|
|
36
|
+
say(command, 'invalid_key_version');
|
|
37
|
+
return 2;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const key = formatMasterKey(generateMasterKey(version));
|
|
41
|
+
console.error('store this key in a secret manager and set PB_MASTER_KEY; it is not shown again');
|
|
42
|
+
console.log(key);
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
if (error instanceof RangeError) {
|
|
47
|
+
say(command, 'invalid_key_version');
|
|
48
|
+
return 2;
|
|
49
|
+
}
|
|
50
|
+
say(command, `failed (${reportableErrorName(error)})`);
|
|
51
|
+
return 1;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function cloudflareExecutor(command, target) {
|
|
55
|
+
const apiToken = target.env.CLOUDFLARE_API_TOKEN;
|
|
56
|
+
const accountId = target.env.CLOUDFLARE_ACCOUNT_ID;
|
|
57
|
+
if (apiToken === undefined || apiToken === '') {
|
|
58
|
+
say(command, 'CLOUDFLARE_API_TOKEN is required');
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
if (accountId === undefined || accountId === '') {
|
|
62
|
+
say(command, 'CLOUDFLARE_ACCOUNT_ID is required');
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
if (!TOKEN_SHAPE.test(apiToken)) {
|
|
66
|
+
say(command, 'CLOUDFLARE_API_TOKEN must be visible ASCII without whitespace');
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
if (!ACCOUNT_ID_SHAPE.test(accountId)) {
|
|
70
|
+
say(command, 'CLOUDFLARE_ACCOUNT_ID must be 32 lowercase hex characters');
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
if (!UUID_SHAPE.test(target.databaseId)) {
|
|
74
|
+
say(command, '--database-id must be a UUID');
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return createD1HttpExecutor({
|
|
78
|
+
accountId,
|
|
79
|
+
databaseId: target.databaseId,
|
|
80
|
+
apiToken,
|
|
81
|
+
...(target.fetch === undefined ? {} : { fetch: target.fetch }),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
function openTarget(command, target) {
|
|
85
|
+
if (target.kind === 'cloudflare') {
|
|
86
|
+
const executor = cloudflareExecutor(command, target);
|
|
87
|
+
return executor === null ? null : { executor, close: async () => undefined };
|
|
88
|
+
}
|
|
89
|
+
if (!existsSync(target.file)) {
|
|
90
|
+
say(command, 'sqlite_file_not_found');
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
return openBetterSqliteExecutor(target.file);
|
|
94
|
+
}
|
|
95
|
+
async function createTokenFile(command, path) {
|
|
96
|
+
try {
|
|
97
|
+
return await open(path, 'wx', 0o600);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
if (error?.code === 'EEXIST') {
|
|
101
|
+
say(command, 'token_file_exists');
|
|
102
|
+
return 'exists';
|
|
103
|
+
}
|
|
104
|
+
say(command, `token_file_failed (${reportableErrorName(error)})`);
|
|
105
|
+
return 'failed';
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const DIRECTORY_SYNC_UNSUPPORTED = new Set(['EISDIR', 'EPERM', 'EINVAL']);
|
|
109
|
+
async function syncDirectoryOf(path) {
|
|
110
|
+
let directory;
|
|
111
|
+
try {
|
|
112
|
+
directory = await open(dirname(path), 'r');
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
if (DIRECTORY_SYNC_UNSUPPORTED.has(error?.code ?? ''))
|
|
116
|
+
return;
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
await directory.sync();
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (!DIRECTORY_SYNC_UNSUPPORTED.has(error?.code ?? '')) {
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
await directory.close().catch(() => undefined);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function sameFile(a, b) {
|
|
132
|
+
return a.dev === b.dev && a.ino === b.ino;
|
|
133
|
+
}
|
|
134
|
+
function unlinkTokenFileSync(path, identity) {
|
|
135
|
+
try {
|
|
136
|
+
if (sameFile(lstatSync(path, { bigint: true }), identity))
|
|
137
|
+
unlinkSync(path);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
/* the file may already be gone */
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async function unlinkTokenFile(path, identity) {
|
|
144
|
+
try {
|
|
145
|
+
if (sameFile(await lstat(path, { bigint: true }), identity))
|
|
146
|
+
await unlink(path);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
/* the file may already be gone */
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function roleIds() {
|
|
153
|
+
const ids = {};
|
|
154
|
+
for (const { key } of DEFAULT_ROLES)
|
|
155
|
+
ids[key] = ulid();
|
|
156
|
+
return ids;
|
|
157
|
+
}
|
|
158
|
+
function toppedUpText(count) {
|
|
159
|
+
return `topped up ${count} organization_admin ${count === 1 ? 'permission' : 'permissions'}`;
|
|
160
|
+
}
|
|
161
|
+
const cliAdminSink = {
|
|
162
|
+
diagnostic: (message) => console.error(message),
|
|
163
|
+
output: (value) => console.log(JSON.stringify(value)),
|
|
164
|
+
};
|
|
165
|
+
async function issue(command, o, sink = cliAdminSink) {
|
|
166
|
+
const say = (_command, text) => sink.diagnostic(`${command}: ${text}`);
|
|
167
|
+
const finish = (exitCode, state = exitCode === 7 ? 'unknown' : 'error', expiresAt = null) => ({ exitCode, state, expiresAt });
|
|
168
|
+
const email = typeof o.email === 'string' ? normalizeEmail(o.email) : null;
|
|
169
|
+
if (email === null) {
|
|
170
|
+
say(command, 'invalid_email');
|
|
171
|
+
return finish(2);
|
|
172
|
+
}
|
|
173
|
+
let handle = null;
|
|
174
|
+
let identity = null;
|
|
175
|
+
let issued = false;
|
|
176
|
+
const pending = { signal: null };
|
|
177
|
+
let opened = null;
|
|
178
|
+
const onSignal = (signal) => {
|
|
179
|
+
const repeated = pending.signal !== null;
|
|
180
|
+
pending.signal ??= signal;
|
|
181
|
+
if (identity !== null && o.tokenFile !== undefined) {
|
|
182
|
+
unlinkTokenFileSync(o.tokenFile, identity);
|
|
183
|
+
}
|
|
184
|
+
if (repeated) {
|
|
185
|
+
for (const name of SIGNALS)
|
|
186
|
+
process.off(name, onSignal);
|
|
187
|
+
process.kill(process.pid, signal);
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
if (o.tokenFile !== undefined)
|
|
191
|
+
for (const name of SIGNALS)
|
|
192
|
+
process.on(name, onSignal);
|
|
193
|
+
try {
|
|
194
|
+
if (o.tokenFile !== undefined) {
|
|
195
|
+
const file = await createTokenFile(command, o.tokenFile);
|
|
196
|
+
if (file === 'exists')
|
|
197
|
+
return finish(2);
|
|
198
|
+
if (file === 'failed')
|
|
199
|
+
return finish(1);
|
|
200
|
+
handle = file;
|
|
201
|
+
const { dev, ino } = await handle.stat({ bigint: true });
|
|
202
|
+
identity = { dev, ino };
|
|
203
|
+
}
|
|
204
|
+
opened = openTarget(command, o.target);
|
|
205
|
+
if (opened === null)
|
|
206
|
+
return finish(2);
|
|
207
|
+
const organization = await createOrganizationBootstrap(opened.executor).findSingleton();
|
|
208
|
+
if (organization === null) {
|
|
209
|
+
say(command, 'organization not found; run pb bootstrap or pb cloudflare bootstrap first');
|
|
210
|
+
return finish(5);
|
|
211
|
+
}
|
|
212
|
+
const now = systemClock.now();
|
|
213
|
+
const token = randomToken();
|
|
214
|
+
const input = {
|
|
215
|
+
email,
|
|
216
|
+
userId: ulid(),
|
|
217
|
+
setupHash: await sha256Hex(token),
|
|
218
|
+
setupExpiresAt: isoTimestamp(new Date(now.getTime() + SETUP_TOKEN_TTL_MS)),
|
|
219
|
+
grantId: ulid(),
|
|
220
|
+
roleIds: roleIds(),
|
|
221
|
+
opId: ulid(),
|
|
222
|
+
now: isoTimestamp(now),
|
|
223
|
+
};
|
|
224
|
+
const ctx = orgContext(organization.id);
|
|
225
|
+
if (pending.signal !== null) {
|
|
226
|
+
say(command, 'outcome unknown; re-running is safe');
|
|
227
|
+
return finish(7);
|
|
228
|
+
}
|
|
229
|
+
if (handle !== null && o.tokenFile !== undefined) {
|
|
230
|
+
await handle.writeFile(`${token}\n`);
|
|
231
|
+
await handle.sync();
|
|
232
|
+
await handle.close();
|
|
233
|
+
handle = null;
|
|
234
|
+
await syncDirectoryOf(o.tokenFile);
|
|
235
|
+
}
|
|
236
|
+
if (pending.signal !== null) {
|
|
237
|
+
say(command, 'outcome unknown; re-running is safe');
|
|
238
|
+
return finish(7);
|
|
239
|
+
}
|
|
240
|
+
const outcome = await runOperation(command, opened.executor, ctx, input);
|
|
241
|
+
if (pending.signal !== null) {
|
|
242
|
+
say(command, 'outcome unknown; re-running is safe');
|
|
243
|
+
return finish(7);
|
|
244
|
+
}
|
|
245
|
+
if (!outcome.issued && 'toppedUp' in outcome) {
|
|
246
|
+
say(command, `already_set_up; ${toppedUpText(outcome.toppedUp)}; no setup token issued; run pb admin reset-local to issue a new setup token`);
|
|
247
|
+
sink.output({ result: 'already_set_up', toppedUp: outcome.toppedUp });
|
|
248
|
+
return finish(0, 'already_set_up');
|
|
249
|
+
}
|
|
250
|
+
if (!outcome.issued) {
|
|
251
|
+
say(command, outcome.text);
|
|
252
|
+
return finish(outcome.exit, outcome.exit === 6 ? 'already_set_up' : 'error');
|
|
253
|
+
}
|
|
254
|
+
issued = true;
|
|
255
|
+
if (outcome.toppedUp > 0)
|
|
256
|
+
say(command, toppedUpText(outcome.toppedUp));
|
|
257
|
+
if (command === 'admin bootstrap') {
|
|
258
|
+
say(command, 'does not check for existing administrators; it adds or refreshes this e-mail as an organization admin');
|
|
259
|
+
}
|
|
260
|
+
const toTerminal = o.stdoutIsTTY ?? process.stdout.isTTY === true;
|
|
261
|
+
if (o.tokenFile === undefined && !toTerminal && sink.deliver === undefined) {
|
|
262
|
+
say(command, 'warning: the setup token is being written to a non-terminal stdout; use --token-file to keep it out of logs');
|
|
263
|
+
}
|
|
264
|
+
say(command, BROWSER_NEXT);
|
|
265
|
+
await sink.deliver?.(token);
|
|
266
|
+
sink.output({
|
|
267
|
+
result: outcome.result,
|
|
268
|
+
setupToken: o.tokenFile === undefined && sink.deliver === undefined ? token : null,
|
|
269
|
+
tokenFile: o.tokenFile ?? null,
|
|
270
|
+
expiresAt: input.setupExpiresAt,
|
|
271
|
+
next: NEXT,
|
|
272
|
+
});
|
|
273
|
+
return finish(0, 'issued', input.setupExpiresAt);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
if (issued && sink !== cliAdminSink) {
|
|
277
|
+
say(command, 'outcome unknown; use explicit setup-token refresh if delivery was lost');
|
|
278
|
+
return finish(7);
|
|
279
|
+
}
|
|
280
|
+
if (error instanceof DbError && error.kind === 'foreign_key') {
|
|
281
|
+
say(command, 'organization not found; run pb bootstrap or pb cloudflare bootstrap first');
|
|
282
|
+
return finish(5);
|
|
283
|
+
}
|
|
284
|
+
if (isLostResponse(error)) {
|
|
285
|
+
say(command, 'outcome unknown; re-running is safe');
|
|
286
|
+
return finish(7);
|
|
287
|
+
}
|
|
288
|
+
say(command, `failed (${reportableErrorName(error)})`);
|
|
289
|
+
return finish(1);
|
|
290
|
+
}
|
|
291
|
+
finally {
|
|
292
|
+
await handle?.close().catch(() => undefined);
|
|
293
|
+
if (identity !== null && !issued && o.tokenFile !== undefined) {
|
|
294
|
+
await unlinkTokenFile(o.tokenFile, identity);
|
|
295
|
+
}
|
|
296
|
+
await opened?.close().catch(() => undefined);
|
|
297
|
+
for (const name of SIGNALS)
|
|
298
|
+
process.off(name, onSignal);
|
|
299
|
+
if (pending.signal !== null)
|
|
300
|
+
process.kill(process.pid, pending.signal);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
async function runOperation(command, executor, ctx, input) {
|
|
304
|
+
if (command === 'admin bootstrap') {
|
|
305
|
+
const { result, toppedUp } = await bootstrapAdminWithTopUp(executor, ctx, input);
|
|
306
|
+
if (result === 'already_set_up') {
|
|
307
|
+
if (toppedUp > 0)
|
|
308
|
+
return { issued: false, toppedUp };
|
|
309
|
+
return {
|
|
310
|
+
issued: false,
|
|
311
|
+
exit: 6,
|
|
312
|
+
text: 'already_set_up; nothing changed; run pb admin reset-local to issue a new setup token',
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
return { issued: true, result, toppedUp };
|
|
316
|
+
}
|
|
317
|
+
const { email, setupHash, setupExpiresAt, grantId, roleIds: ids, opId, now } = input;
|
|
318
|
+
const result = await resetLocalLogin(executor, ctx, {
|
|
319
|
+
email,
|
|
320
|
+
setupHash,
|
|
321
|
+
setupExpiresAt,
|
|
322
|
+
grantId,
|
|
323
|
+
roleIds: ids,
|
|
324
|
+
opId,
|
|
325
|
+
now,
|
|
326
|
+
});
|
|
327
|
+
if (result === 'not_found') {
|
|
328
|
+
return {
|
|
329
|
+
issued: false,
|
|
330
|
+
exit: 6,
|
|
331
|
+
text: 'not_found; no local user with that e-mail; nothing changed',
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
if (result === 'admin_role_missing') {
|
|
335
|
+
return {
|
|
336
|
+
issued: false,
|
|
337
|
+
exit: 8,
|
|
338
|
+
text: 'admin_role_missing; the organization has no organization_admin role; run pb admin bootstrap first',
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
return { issued: true, result, toppedUp: 0 };
|
|
342
|
+
}
|
|
343
|
+
export function bootstrapAdmin(o, sink) {
|
|
344
|
+
return issue('admin bootstrap', o, sink);
|
|
345
|
+
}
|
|
346
|
+
export function runAdminBootstrap(o) {
|
|
347
|
+
return issue('admin bootstrap', o).then((result) => result.exitCode);
|
|
348
|
+
}
|
|
349
|
+
export function runAdminResetLocal(o) {
|
|
350
|
+
return issue('admin reset-local', o).then((result) => result.exitCode);
|
|
351
|
+
}
|
|
352
|
+
function rebindUsageError(o) {
|
|
353
|
+
if (typeof o.provider !== 'string' || o.confirm !== o.provider)
|
|
354
|
+
return 'confirm_mismatch';
|
|
355
|
+
if (!isValidProviderId(o.provider) || isReservedProviderId(o.provider)) {
|
|
356
|
+
return 'invalid_provider';
|
|
357
|
+
}
|
|
358
|
+
for (const anchor of [o.expectedAnchor, o.newAnchor]) {
|
|
359
|
+
if (typeof anchor !== 'string' || !isValidTrustAnchor(anchor))
|
|
360
|
+
return 'invalid_anchor';
|
|
361
|
+
}
|
|
362
|
+
return o.expectedAnchor === o.newAnchor ? 'anchors_equal' : null;
|
|
363
|
+
}
|
|
364
|
+
export async function runAdminRebindProvider(o) {
|
|
365
|
+
const command = 'admin rebind-provider';
|
|
366
|
+
const usageError = rebindUsageError(o);
|
|
367
|
+
if (usageError !== null) {
|
|
368
|
+
say(command, usageError);
|
|
369
|
+
return 2;
|
|
370
|
+
}
|
|
371
|
+
let opened = null;
|
|
372
|
+
try {
|
|
373
|
+
opened = openTarget(command, o.target);
|
|
374
|
+
if (opened === null)
|
|
375
|
+
return 2;
|
|
376
|
+
const organization = await createOrganizationBootstrap(opened.executor).findSingleton();
|
|
377
|
+
if (organization === null) {
|
|
378
|
+
say(command, 'organization not found; run pb bootstrap or pb cloudflare bootstrap first');
|
|
379
|
+
return 5;
|
|
380
|
+
}
|
|
381
|
+
const result = await rebindProvider(opened.executor, orgContext(organization.id), o.provider, o.expectedAnchor, o.newAnchor, isoTimestamp(systemClock.now()));
|
|
382
|
+
if (!result.swapped) {
|
|
383
|
+
say(command, 'anchor_mismatch; no binding with that provider and expected anchor; nothing changed');
|
|
384
|
+
return 6;
|
|
385
|
+
}
|
|
386
|
+
console.log(JSON.stringify({
|
|
387
|
+
provider: o.provider,
|
|
388
|
+
identities: result.identities,
|
|
389
|
+
sessions: result.sessions,
|
|
390
|
+
}));
|
|
391
|
+
return 0;
|
|
392
|
+
}
|
|
393
|
+
catch (error) {
|
|
394
|
+
if (isLostResponse(error)) {
|
|
395
|
+
say(command, 'outcome unknown; the swap may have applied; a re-run that reports anchor_mismatch means it did or the anchor is wrong');
|
|
396
|
+
return 7;
|
|
397
|
+
}
|
|
398
|
+
say(command, `failed (${reportableErrorName(error)})`);
|
|
399
|
+
return 1;
|
|
400
|
+
}
|
|
401
|
+
finally {
|
|
402
|
+
await opened?.close().catch(() => undefined);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
export async function runAdminShowProviderBinding(o) {
|
|
406
|
+
const command = 'admin show-provider-binding';
|
|
407
|
+
if (typeof o.provider !== 'string' ||
|
|
408
|
+
!isValidProviderId(o.provider) ||
|
|
409
|
+
isReservedProviderId(o.provider)) {
|
|
410
|
+
say(command, 'invalid_provider');
|
|
411
|
+
return 2;
|
|
412
|
+
}
|
|
413
|
+
let opened = null;
|
|
414
|
+
try {
|
|
415
|
+
opened = openTarget(command, o.target);
|
|
416
|
+
if (opened === null)
|
|
417
|
+
return 2;
|
|
418
|
+
const organization = await createOrganizationBootstrap(opened.executor).findSingleton();
|
|
419
|
+
if (organization === null) {
|
|
420
|
+
say(command, 'organization not found; run pb bootstrap or pb cloudflare bootstrap first');
|
|
421
|
+
return 5;
|
|
422
|
+
}
|
|
423
|
+
const binding = await readProviderBinding(opened.executor, orgContext(organization.id), o.provider);
|
|
424
|
+
if (binding === null) {
|
|
425
|
+
say(command, 'no_binding; nothing is bound for that provider');
|
|
426
|
+
return 6;
|
|
427
|
+
}
|
|
428
|
+
console.log(JSON.stringify({
|
|
429
|
+
provider: o.provider,
|
|
430
|
+
anchor: binding.anchor,
|
|
431
|
+
createdAt: binding.createdAt,
|
|
432
|
+
}));
|
|
433
|
+
return 0;
|
|
434
|
+
}
|
|
435
|
+
catch (error) {
|
|
436
|
+
if (isLostResponse(error)) {
|
|
437
|
+
say(command, 'outcome unknown; re-running is safe');
|
|
438
|
+
return 7;
|
|
439
|
+
}
|
|
440
|
+
say(command, `failed (${reportableErrorName(error)})`);
|
|
441
|
+
return 1;
|
|
442
|
+
}
|
|
443
|
+
finally {
|
|
444
|
+
await opened?.close().catch(() => undefined);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/commands/admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DiagnosticRoute } from '@package-broker/core/authz/catalogue-diagnostics';
|
|
2
|
+
import { type MigrationSource } from '@package-broker/db-sqlite/migrations/source';
|
|
3
|
+
export declare class BuiltManifestError extends Error {
|
|
4
|
+
constructor(message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare class LegacyRouteTableError extends BuiltManifestError {
|
|
7
|
+
constructor();
|
|
8
|
+
}
|
|
9
|
+
export declare function loadBuiltMigrations(outDir: string): Promise<MigrationSource[]>;
|
|
10
|
+
export declare function loadBuiltRoutes(outDir: string): Promise<DiagnosticRoute[] | null>;
|
|
11
|
+
export declare function builtRouteProblems(outDir: string): Promise<string[] | null>;
|
|
12
|
+
export declare function routesAreValid(outDir: string): Promise<boolean>;
|
|
13
|
+
//# sourceMappingURL=built-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"built-manifest.d.ts","sourceRoot":"","sources":["../../src/commands/built-manifest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AAGxF,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,6CAA6C,CAAC;AAErD,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,qBAAsB,SAAQ,kBAAkB;;CAK5D;AA4FD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAqBpF;AAsCD,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,CAkBvF;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAGjF;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAerE"}
|