replicas-cli 0.2.3 → 0.2.4
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/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +71 -30
- package/dist/commands/login.js.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAgBA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAgBA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA6MlD"}
|
package/dist/commands/login.js
CHANGED
|
@@ -21,15 +21,61 @@ async function loginCommand() {
|
|
|
21
21
|
return new Promise((resolve, reject) => {
|
|
22
22
|
let authTimeout;
|
|
23
23
|
let hasHandledCallback = false;
|
|
24
|
+
let lastRedirectUrl = null;
|
|
25
|
+
let lastMessage = null;
|
|
26
|
+
const pendingResponses = new Set();
|
|
27
|
+
function respondWithRedirect(res) {
|
|
28
|
+
if (lastRedirectUrl) {
|
|
29
|
+
res.writeHead(302, {
|
|
30
|
+
'Location': lastRedirectUrl,
|
|
31
|
+
'Connection': 'close',
|
|
32
|
+
});
|
|
33
|
+
res.end();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
res.writeHead(200, {
|
|
37
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
38
|
+
'Connection': 'close',
|
|
39
|
+
});
|
|
40
|
+
res.end(`
|
|
41
|
+
<!DOCTYPE html>
|
|
42
|
+
<html lang="en">
|
|
43
|
+
<head>
|
|
44
|
+
<meta charset="utf-8" />
|
|
45
|
+
<title>Replicas CLI Login</title>
|
|
46
|
+
<style>
|
|
47
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background:#09090b; color:#f4f4f5; display:flex; align-items:center; justify-content:center; height:100vh; margin:0; }
|
|
48
|
+
.card { border:1px solid #27272a; padding:32px; border-radius:12px; background:#0f0f12; max-width:420px; text-align:center; }
|
|
49
|
+
.title { font-size:20px; margin-bottom:12px; letter-spacing:0.08em; text-transform:uppercase; color:#a855f7; }
|
|
50
|
+
.message { font-family: 'Menlo', 'Source Code Pro', monospace; font-size:14px; line-height:1.6; color:#d4d4d8; white-space:pre-line; }
|
|
51
|
+
</style>
|
|
52
|
+
</head>
|
|
53
|
+
<body>
|
|
54
|
+
<div class="card">
|
|
55
|
+
<div class="title">Replicas CLI</div>
|
|
56
|
+
<div class="message">${lastMessage || 'Authentication already processed. You can close this tab.'}</div>
|
|
57
|
+
</div>
|
|
58
|
+
</body>
|
|
59
|
+
</html>
|
|
60
|
+
`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function flushPendingResponses() {
|
|
64
|
+
for (const response of pendingResponses) {
|
|
65
|
+
respondWithRedirect(response);
|
|
66
|
+
}
|
|
67
|
+
pendingResponses.clear();
|
|
68
|
+
}
|
|
24
69
|
const server = http_1.default.createServer(async (req, res) => {
|
|
25
70
|
const url = new url_1.URL(req.url || '', `http://${req.headers.host}`);
|
|
26
71
|
if (url.pathname === '/callback') {
|
|
27
72
|
if (hasHandledCallback) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
'
|
|
31
|
-
|
|
32
|
-
|
|
73
|
+
if (!lastRedirectUrl) {
|
|
74
|
+
pendingResponses.add(res);
|
|
75
|
+
res.on('close', () => pendingResponses.delete(res));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
respondWithRedirect(res);
|
|
33
79
|
return;
|
|
34
80
|
}
|
|
35
81
|
const returnedState = url.searchParams.get('state');
|
|
@@ -39,11 +85,10 @@ async function loginCommand() {
|
|
|
39
85
|
const error = url.searchParams.get('error');
|
|
40
86
|
if (error) {
|
|
41
87
|
const errorUrl = `${WEB_APP_URL}/cli-login/error?message=${encodeURIComponent(error)}`;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
res.end();
|
|
88
|
+
lastRedirectUrl = errorUrl;
|
|
89
|
+
lastMessage = `Authentication failed: ${error}`;
|
|
90
|
+
respondWithRedirect(res);
|
|
91
|
+
flushPendingResponses();
|
|
47
92
|
clearTimeout(authTimeout);
|
|
48
93
|
setImmediate(() => {
|
|
49
94
|
server.closeAllConnections?.();
|
|
@@ -54,11 +99,10 @@ async function loginCommand() {
|
|
|
54
99
|
}
|
|
55
100
|
if (returnedState !== state) {
|
|
56
101
|
const errorUrl = `${WEB_APP_URL}/cli-login/error?message=${encodeURIComponent('Invalid state parameter. This might be a CSRF attack.')}`;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
res.end();
|
|
102
|
+
lastRedirectUrl = errorUrl;
|
|
103
|
+
lastMessage = 'Invalid state parameter. This might be a CSRF attack.';
|
|
104
|
+
respondWithRedirect(res);
|
|
105
|
+
flushPendingResponses();
|
|
62
106
|
clearTimeout(authTimeout);
|
|
63
107
|
setImmediate(() => {
|
|
64
108
|
server.closeAllConnections?.();
|
|
@@ -69,11 +113,10 @@ async function loginCommand() {
|
|
|
69
113
|
}
|
|
70
114
|
if (!accessToken || !refreshToken || !expiresAt) {
|
|
71
115
|
const errorUrl = `${WEB_APP_URL}/cli-login/error?message=${encodeURIComponent('Missing required authentication tokens.')}`;
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
res.end();
|
|
116
|
+
lastRedirectUrl = errorUrl;
|
|
117
|
+
lastMessage = 'Missing required authentication tokens.';
|
|
118
|
+
respondWithRedirect(res);
|
|
119
|
+
flushPendingResponses();
|
|
77
120
|
clearTimeout(authTimeout);
|
|
78
121
|
setImmediate(() => {
|
|
79
122
|
server.closeAllConnections?.();
|
|
@@ -103,11 +146,10 @@ async function loginCommand() {
|
|
|
103
146
|
console.log(chalk_1.default.gray(' You can set your organization later with: replicas org switch'));
|
|
104
147
|
}
|
|
105
148
|
const successUrl = `${WEB_APP_URL}/cli-login/success?email=${encodeURIComponent(user.email)}`;
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
res.end();
|
|
149
|
+
lastRedirectUrl = successUrl;
|
|
150
|
+
lastMessage = `Successfully logged in as ${user.email}. You can close this tab.`;
|
|
151
|
+
respondWithRedirect(res);
|
|
152
|
+
flushPendingResponses();
|
|
111
153
|
console.log(chalk_1.default.green('\n✓ Successfully logged in!'));
|
|
112
154
|
console.log(chalk_1.default.gray(` Email: ${user.email}\n`));
|
|
113
155
|
clearTimeout(authTimeout);
|
|
@@ -119,11 +161,10 @@ async function loginCommand() {
|
|
|
119
161
|
}
|
|
120
162
|
catch (error) {
|
|
121
163
|
const errorUrl = `${WEB_APP_URL}/cli-login/error?message=${encodeURIComponent('Failed to verify authentication.')}`;
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
res.end();
|
|
164
|
+
lastRedirectUrl = errorUrl;
|
|
165
|
+
lastMessage = 'Failed to verify authentication.';
|
|
166
|
+
respondWithRedirect(res);
|
|
167
|
+
flushPendingResponses();
|
|
127
168
|
clearTimeout(authTimeout);
|
|
128
169
|
setImmediate(() => {
|
|
129
170
|
server.closeAllConnections?.();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;;;AAgBA,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -18,7 +18,7 @@ const program = new commander_1.Command();
|
|
|
18
18
|
program
|
|
19
19
|
.name('replicas')
|
|
20
20
|
.description('CLI for managing Replicas workspaces')
|
|
21
|
-
.version('0.
|
|
21
|
+
.version('0.2.3');
|
|
22
22
|
program
|
|
23
23
|
.command('login')
|
|
24
24
|
.description('Authenticate with your Replicas account')
|