pal-explorer-cli 0.4.12 → 0.4.13
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/README.md +149 -149
- package/bin/pal.js +63 -2
- package/extensions/@palexplorer/analytics/extension.json +20 -1
- package/extensions/@palexplorer/analytics/index.js +19 -9
- package/extensions/@palexplorer/audit/extension.json +14 -0
- package/extensions/@palexplorer/auth-email/extension.json +15 -0
- package/extensions/@palexplorer/auth-oauth/extension.json +15 -0
- package/extensions/@palexplorer/chat/extension.json +14 -0
- package/extensions/@palexplorer/discovery/extension.json +17 -0
- package/extensions/@palexplorer/discovery/index.js +1 -1
- package/extensions/@palexplorer/email-notifications/extension.json +23 -0
- package/extensions/@palexplorer/groups/extension.json +15 -0
- package/extensions/@palexplorer/share-links/extension.json +15 -0
- package/extensions/@palexplorer/sync/extension.json +16 -0
- package/extensions/@palexplorer/user-mgmt/extension.json +15 -0
- package/lib/capabilities.js +24 -24
- package/lib/commands/analytics.js +175 -175
- package/lib/commands/api-keys.js +131 -131
- package/lib/commands/audit.js +235 -235
- package/lib/commands/auth.js +137 -137
- package/lib/commands/backup.js +76 -76
- package/lib/commands/billing.js +148 -148
- package/lib/commands/chat.js +217 -217
- package/lib/commands/cloud-backup.js +231 -231
- package/lib/commands/comment.js +99 -99
- package/lib/commands/completion.js +203 -203
- package/lib/commands/compliance.js +218 -218
- package/lib/commands/config.js +136 -136
- package/lib/commands/connect.js +44 -44
- package/lib/commands/dept.js +294 -294
- package/lib/commands/device.js +146 -146
- package/lib/commands/download.js +240 -226
- package/lib/commands/explorer.js +178 -178
- package/lib/commands/extension.js +1060 -970
- package/lib/commands/favorite.js +90 -90
- package/lib/commands/federation.js +270 -270
- package/lib/commands/file.js +533 -533
- package/lib/commands/group.js +271 -271
- package/lib/commands/gui-share.js +29 -29
- package/lib/commands/init.js +61 -61
- package/lib/commands/invite.js +59 -59
- package/lib/commands/list.js +58 -58
- package/lib/commands/log.js +116 -116
- package/lib/commands/nearby.js +108 -108
- package/lib/commands/network.js +251 -251
- package/lib/commands/notify.js +198 -198
- package/lib/commands/org.js +273 -273
- package/lib/commands/pal.js +403 -180
- package/lib/commands/permissions.js +216 -216
- package/lib/commands/pin.js +97 -97
- package/lib/commands/protocol.js +357 -357
- package/lib/commands/rbac.js +147 -147
- package/lib/commands/recover.js +36 -36
- package/lib/commands/register.js +171 -171
- package/lib/commands/relay.js +131 -131
- package/lib/commands/remote.js +368 -368
- package/lib/commands/revoke.js +50 -50
- package/lib/commands/scanner.js +280 -280
- package/lib/commands/schedule.js +344 -344
- package/lib/commands/scim.js +203 -203
- package/lib/commands/search.js +181 -181
- package/lib/commands/serve.js +438 -438
- package/lib/commands/server.js +350 -350
- package/lib/commands/share-link.js +199 -199
- package/lib/commands/share.js +336 -323
- package/lib/commands/sso.js +200 -200
- package/lib/commands/status.js +145 -145
- package/lib/commands/stream.js +562 -562
- package/lib/commands/su.js +187 -187
- package/lib/commands/sync.js +979 -979
- package/lib/commands/transfers.js +152 -152
- package/lib/commands/uninstall.js +188 -188
- package/lib/commands/update.js +204 -204
- package/lib/commands/user.js +276 -276
- package/lib/commands/vfs.js +84 -84
- package/lib/commands/web-login.js +79 -79
- package/lib/commands/web.js +52 -52
- package/lib/commands/webhook.js +180 -180
- package/lib/commands/whoami.js +59 -59
- package/lib/commands/workspace.js +121 -121
- package/lib/core/billing.js +16 -5
- package/lib/core/dhtDiscovery.js +9 -2
- package/lib/core/discoveryClient.js +13 -7
- package/lib/core/extensions.js +142 -1
- package/lib/core/identity.js +33 -2
- package/lib/core/imageProcessor.js +109 -0
- package/lib/core/imageTorrent.js +167 -0
- package/lib/core/permissions.js +1 -1
- package/lib/core/pro.js +11 -4
- package/lib/core/serverList.js +4 -1
- package/lib/core/shares.js +12 -1
- package/lib/core/signalingServer.js +14 -2
- package/lib/core/su.js +1 -1
- package/lib/core/users.js +1 -1
- package/lib/protocol/messages.js +12 -3
- package/lib/utils/explorer.js +1 -1
- package/lib/utils/help.js +357 -357
- package/lib/utils/torrent.js +1 -0
- package/package.json +4 -3
package/lib/commands/api-keys.js
CHANGED
|
@@ -1,131 +1,131 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import config from '../utils/config.js';
|
|
3
|
-
import { getIdentity } from '../core/identity.js';
|
|
4
|
-
|
|
5
|
-
const DISCOVERY_URL = process.env.PAL_DISCOVERY_URL || config.get('discoveryUrl') || 'https://discovery-1.palexplorer.com';
|
|
6
|
-
|
|
7
|
-
export default function apiKeysCommand(program) {
|
|
8
|
-
const cmd = program
|
|
9
|
-
.command('api-keys')
|
|
10
|
-
.description('manage API keys (Pro)')
|
|
11
|
-
.addHelpText('after', `
|
|
12
|
-
Examples:
|
|
13
|
-
$
|
|
14
|
-
$
|
|
15
|
-
$
|
|
16
|
-
`)
|
|
17
|
-
.action(async () => {
|
|
18
|
-
try {
|
|
19
|
-
const identity = await getIdentity();
|
|
20
|
-
if (!identity?.publicKey) {
|
|
21
|
-
console.log(chalk.red('No identity. Run `
|
|
22
|
-
process.exitCode = 1;
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const res = await fetch(`${DISCOVERY_URL}/api/v1/keys/${encodeURIComponent(identity.publicKey)}`, {
|
|
27
|
-
signal: AbortSignal.timeout(5000),
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
if (!res.ok) {
|
|
31
|
-
console.log(chalk.red('Failed to fetch API keys.'));
|
|
32
|
-
process.exitCode = 1;
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const keys = await res.json();
|
|
37
|
-
if (!Array.isArray(keys) || keys.length === 0) {
|
|
38
|
-
console.log(chalk.gray('No API keys. Use `
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
console.log('');
|
|
43
|
-
console.log(chalk.cyan('API Keys:'));
|
|
44
|
-
for (const k of keys) {
|
|
45
|
-
const status = k.revoked ? chalk.red('revoked') : chalk.green('active');
|
|
46
|
-
console.log(` ${chalk.white(k.id)} [${status}] ${chalk.yellow(k.name || 'unnamed')}`);
|
|
47
|
-
console.log(` Created: ${chalk.gray(k.createdAt || 'unknown')}`);
|
|
48
|
-
if (k.lastUsed) console.log(` Last used: ${chalk.gray(k.lastUsed)}`);
|
|
49
|
-
}
|
|
50
|
-
} catch (err) {
|
|
51
|
-
console.log(chalk.red(`Error: ${err.message}`));
|
|
52
|
-
process.exitCode = 1;
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
cmd
|
|
57
|
-
.command('create <name>')
|
|
58
|
-
.description('create a new API key')
|
|
59
|
-
.action(async (name) => {
|
|
60
|
-
try {
|
|
61
|
-
const identity = await getIdentity();
|
|
62
|
-
if (!identity?.publicKey) {
|
|
63
|
-
console.log(chalk.red('No identity. Run `
|
|
64
|
-
process.exitCode = 1;
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const res = await fetch(`${DISCOVERY_URL}/api/v1/keys`, {
|
|
69
|
-
method: 'POST',
|
|
70
|
-
headers: { 'Content-Type': 'application/json' },
|
|
71
|
-
body: JSON.stringify({ publicKey: identity.publicKey, name }),
|
|
72
|
-
signal: AbortSignal.timeout(10000),
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
if (!res.ok) {
|
|
76
|
-
const err = await res.json().catch(() => ({}));
|
|
77
|
-
console.log(chalk.red(`Failed: ${err.error || res.statusText}`));
|
|
78
|
-
process.exitCode = 1;
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const key = await res.json();
|
|
83
|
-
console.log(chalk.green(`✔ API key created: ${key.id}`));
|
|
84
|
-
const apiKey = key.key || key.secret;
|
|
85
|
-
if (apiKey) {
|
|
86
|
-
console.log(chalk.yellow(' Key (save it — shown only once):'));
|
|
87
|
-
console.log(` ${chalk.white(apiKey)}`);
|
|
88
|
-
try {
|
|
89
|
-
const keytar = (await import('keytar')).default;
|
|
90
|
-
await keytar.setPassword('palexplorer', 'apiKey', apiKey);
|
|
91
|
-
} catch {
|
|
92
|
-
config.set('apiKey', apiKey);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
} catch (err) {
|
|
96
|
-
console.log(chalk.red(`Error: ${err.message}`));
|
|
97
|
-
process.exitCode = 1;
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
cmd
|
|
102
|
-
.command('revoke <keyId>')
|
|
103
|
-
.description('revoke an API key')
|
|
104
|
-
.action(async (keyId) => {
|
|
105
|
-
try {
|
|
106
|
-
const identity = await getIdentity();
|
|
107
|
-
if (!identity?.publicKey) {
|
|
108
|
-
console.log(chalk.red('No identity. Run `
|
|
109
|
-
process.exitCode = 1;
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const res = await fetch(`${DISCOVERY_URL}/api/v1/keys/${encodeURIComponent(identity.publicKey)}/${encodeURIComponent(keyId)}`, {
|
|
114
|
-
method: 'DELETE',
|
|
115
|
-
signal: AbortSignal.timeout(10000),
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
if (!res.ok) {
|
|
119
|
-
const err = await res.json().catch(() => ({}));
|
|
120
|
-
console.log(chalk.red(`Failed: ${err.error || res.statusText}`));
|
|
121
|
-
process.exitCode = 1;
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
console.log(chalk.green(`✔ API key ${keyId} revoked.`));
|
|
126
|
-
} catch (err) {
|
|
127
|
-
console.log(chalk.red(`Error: ${err.message}`));
|
|
128
|
-
process.exitCode = 1;
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
}
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import config from '../utils/config.js';
|
|
3
|
+
import { getIdentity } from '../core/identity.js';
|
|
4
|
+
|
|
5
|
+
const DISCOVERY_URL = process.env.PAL_DISCOVERY_URL || config.get('discoveryUrl') || 'https://discovery-1.palexplorer.com';
|
|
6
|
+
|
|
7
|
+
export default function apiKeysCommand(program) {
|
|
8
|
+
const cmd = program
|
|
9
|
+
.command('api-keys')
|
|
10
|
+
.description('manage API keys (Pro)')
|
|
11
|
+
.addHelpText('after', `
|
|
12
|
+
Examples:
|
|
13
|
+
$ pal api-keys List your API keys
|
|
14
|
+
$ pal api-keys create "my-bot" Create a new API key
|
|
15
|
+
$ pal api-keys revoke <keyId> Revoke an API key
|
|
16
|
+
`)
|
|
17
|
+
.action(async () => {
|
|
18
|
+
try {
|
|
19
|
+
const identity = await getIdentity();
|
|
20
|
+
if (!identity?.publicKey) {
|
|
21
|
+
console.log(chalk.red('No identity. Run `pal init` first.'));
|
|
22
|
+
process.exitCode = 1;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const res = await fetch(`${DISCOVERY_URL}/api/v1/keys/${encodeURIComponent(identity.publicKey)}`, {
|
|
27
|
+
signal: AbortSignal.timeout(5000),
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
if (!res.ok) {
|
|
31
|
+
console.log(chalk.red('Failed to fetch API keys.'));
|
|
32
|
+
process.exitCode = 1;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const keys = await res.json();
|
|
37
|
+
if (!Array.isArray(keys) || keys.length === 0) {
|
|
38
|
+
console.log(chalk.gray('No API keys. Use `pal api-keys create <name>` to create one.'));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
console.log('');
|
|
43
|
+
console.log(chalk.cyan('API Keys:'));
|
|
44
|
+
for (const k of keys) {
|
|
45
|
+
const status = k.revoked ? chalk.red('revoked') : chalk.green('active');
|
|
46
|
+
console.log(` ${chalk.white(k.id)} [${status}] ${chalk.yellow(k.name || 'unnamed')}`);
|
|
47
|
+
console.log(` Created: ${chalk.gray(k.createdAt || 'unknown')}`);
|
|
48
|
+
if (k.lastUsed) console.log(` Last used: ${chalk.gray(k.lastUsed)}`);
|
|
49
|
+
}
|
|
50
|
+
} catch (err) {
|
|
51
|
+
console.log(chalk.red(`Error: ${err.message}`));
|
|
52
|
+
process.exitCode = 1;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
cmd
|
|
57
|
+
.command('create <name>')
|
|
58
|
+
.description('create a new API key')
|
|
59
|
+
.action(async (name) => {
|
|
60
|
+
try {
|
|
61
|
+
const identity = await getIdentity();
|
|
62
|
+
if (!identity?.publicKey) {
|
|
63
|
+
console.log(chalk.red('No identity. Run `pal init` first.'));
|
|
64
|
+
process.exitCode = 1;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const res = await fetch(`${DISCOVERY_URL}/api/v1/keys`, {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
headers: { 'Content-Type': 'application/json' },
|
|
71
|
+
body: JSON.stringify({ publicKey: identity.publicKey, name }),
|
|
72
|
+
signal: AbortSignal.timeout(10000),
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
if (!res.ok) {
|
|
76
|
+
const err = await res.json().catch(() => ({}));
|
|
77
|
+
console.log(chalk.red(`Failed: ${err.error || res.statusText}`));
|
|
78
|
+
process.exitCode = 1;
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const key = await res.json();
|
|
83
|
+
console.log(chalk.green(`✔ API key created: ${key.id}`));
|
|
84
|
+
const apiKey = key.key || key.secret;
|
|
85
|
+
if (apiKey) {
|
|
86
|
+
console.log(chalk.yellow(' Key (save it — shown only once):'));
|
|
87
|
+
console.log(` ${chalk.white(apiKey)}`);
|
|
88
|
+
try {
|
|
89
|
+
const keytar = (await import('keytar')).default;
|
|
90
|
+
await keytar.setPassword('palexplorer', 'apiKey', apiKey);
|
|
91
|
+
} catch {
|
|
92
|
+
config.set('apiKey', apiKey);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
} catch (err) {
|
|
96
|
+
console.log(chalk.red(`Error: ${err.message}`));
|
|
97
|
+
process.exitCode = 1;
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
cmd
|
|
102
|
+
.command('revoke <keyId>')
|
|
103
|
+
.description('revoke an API key')
|
|
104
|
+
.action(async (keyId) => {
|
|
105
|
+
try {
|
|
106
|
+
const identity = await getIdentity();
|
|
107
|
+
if (!identity?.publicKey) {
|
|
108
|
+
console.log(chalk.red('No identity. Run `pal init` first.'));
|
|
109
|
+
process.exitCode = 1;
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const res = await fetch(`${DISCOVERY_URL}/api/v1/keys/${encodeURIComponent(identity.publicKey)}/${encodeURIComponent(keyId)}`, {
|
|
114
|
+
method: 'DELETE',
|
|
115
|
+
signal: AbortSignal.timeout(10000),
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
if (!res.ok) {
|
|
119
|
+
const err = await res.json().catch(() => ({}));
|
|
120
|
+
console.log(chalk.red(`Failed: ${err.error || res.statusText}`));
|
|
121
|
+
process.exitCode = 1;
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
console.log(chalk.green(`✔ API key ${keyId} revoked.`));
|
|
126
|
+
} catch (err) {
|
|
127
|
+
console.log(chalk.red(`Error: ${err.message}`));
|
|
128
|
+
process.exitCode = 1;
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|