antri_cli 1.34.0 → 1.38.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/dist/cloud/auth.d.ts +23 -1
- package/dist/cloud/auth.d.ts.map +1 -1
- package/dist/cloud/auth.js +85 -6
- package/dist/cloud/auth.js.map +1 -1
- package/dist/cloud/browserAuth.d.ts.map +1 -1
- package/dist/cloud/browserAuth.js +167 -84
- package/dist/cloud/browserAuth.js.map +1 -1
- package/dist/core/config.js +1 -1
- package/dist/core/updater.d.ts +1 -1
- package/dist/core/updater.js +1 -1
- package/dist/desktop/public/index.html +1 -1
- package/package.json +1 -1
package/dist/cloud/auth.d.ts
CHANGED
|
@@ -5,11 +5,33 @@ export interface UserAccount {
|
|
|
5
5
|
token?: string;
|
|
6
6
|
loggedInAt: string;
|
|
7
7
|
}
|
|
8
|
+
export interface StoredAccount {
|
|
9
|
+
email: string;
|
|
10
|
+
userId: string;
|
|
11
|
+
passwordHash?: string;
|
|
12
|
+
salt?: string;
|
|
13
|
+
provider: 'email' | 'google';
|
|
14
|
+
createdAt: string;
|
|
15
|
+
}
|
|
8
16
|
export declare class AuthManager {
|
|
9
17
|
private static getAuthFilePath;
|
|
18
|
+
private static getAccountsFilePath;
|
|
19
|
+
private static loadAccounts;
|
|
20
|
+
private static saveAccounts;
|
|
21
|
+
private static hashPassword;
|
|
10
22
|
static getCurrentUser(): UserAccount | null;
|
|
11
23
|
static isAuthenticated(): boolean;
|
|
12
24
|
static generateUserId(email: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Password-based Registration or Login
|
|
27
|
+
* - If account does not exist: creates account with hashed password
|
|
28
|
+
* - If account exists: verifies password against stored PBKDF2 hash
|
|
29
|
+
*/
|
|
30
|
+
static loginWithPassword(email: string, password?: string): Promise<{
|
|
31
|
+
success: boolean;
|
|
32
|
+
user?: UserAccount;
|
|
33
|
+
error?: string;
|
|
34
|
+
}>;
|
|
13
35
|
static register(email: string, password?: string): Promise<{
|
|
14
36
|
success: boolean;
|
|
15
37
|
user?: UserAccount;
|
|
@@ -21,7 +43,7 @@ export declare class AuthManager {
|
|
|
21
43
|
error?: string;
|
|
22
44
|
}>;
|
|
23
45
|
/**
|
|
24
|
-
* Google Sign-In handler (processes verified Google OAuth
|
|
46
|
+
* Google Sign-In handler (processes verified Google OAuth token or Google account identity)
|
|
25
47
|
*/
|
|
26
48
|
static loginWithGoogle(email: string, googleToken?: string): Promise<{
|
|
27
49
|
success: boolean;
|
package/dist/cloud/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,eAAe;IAI9B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAIlC,OAAO,CAAC,MAAM,CAAC,YAAY;IAU3B,OAAO,CAAC,MAAM,CAAC,YAAY;IAM3B,OAAO,CAAC,MAAM,CAAC,YAAY;WAIb,cAAc,IAAI,WAAW,GAAG,IAAI;WAapC,eAAe,IAAI,OAAO;WAI1B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAOnD;;;;OAIG;WACiB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;WAsEtH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;WAI7G,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAI9H;;OAEG;WACiB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;WA6C7H,MAAM,IAAI,IAAI;CAU7B"}
|
package/dist/cloud/auth.js
CHANGED
|
@@ -8,6 +8,28 @@ export class AuthManager {
|
|
|
8
8
|
static getAuthFilePath() {
|
|
9
9
|
return path.join(os.homedir(), '.antri', 'auth.json');
|
|
10
10
|
}
|
|
11
|
+
static getAccountsFilePath() {
|
|
12
|
+
return path.join(os.homedir(), '.antri', 'accounts.json');
|
|
13
|
+
}
|
|
14
|
+
static loadAccounts() {
|
|
15
|
+
const filePath = this.getAccountsFilePath();
|
|
16
|
+
if (fs.existsSync(filePath)) {
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
19
|
+
}
|
|
20
|
+
catch (_) { }
|
|
21
|
+
}
|
|
22
|
+
return {};
|
|
23
|
+
}
|
|
24
|
+
static saveAccounts(accounts) {
|
|
25
|
+
const dir = path.join(os.homedir(), '.antri');
|
|
26
|
+
if (!fs.existsSync(dir))
|
|
27
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
28
|
+
fs.writeFileSync(this.getAccountsFilePath(), JSON.stringify(accounts, null, 2), 'utf-8');
|
|
29
|
+
}
|
|
30
|
+
static hashPassword(password, salt) {
|
|
31
|
+
return crypto.pbkdf2Sync(password, salt, 10000, 64, 'sha512').toString('hex');
|
|
32
|
+
}
|
|
11
33
|
static getCurrentUser() {
|
|
12
34
|
const filePath = this.getAuthFilePath();
|
|
13
35
|
if (fs.existsSync(filePath)) {
|
|
@@ -30,7 +52,12 @@ export class AuthManager {
|
|
|
30
52
|
const prefix = clean.split('@')[0].replace(/[^a-z0-9_-]/g, '_');
|
|
31
53
|
return `${prefix}_${hash}`;
|
|
32
54
|
}
|
|
33
|
-
|
|
55
|
+
/**
|
|
56
|
+
* Password-based Registration or Login
|
|
57
|
+
* - If account does not exist: creates account with hashed password
|
|
58
|
+
* - If account exists: verifies password against stored PBKDF2 hash
|
|
59
|
+
*/
|
|
60
|
+
static async loginWithPassword(email, password) {
|
|
34
61
|
const cleanEmail = email.toLowerCase().trim();
|
|
35
62
|
if (!cleanEmail || !cleanEmail.includes('@')) {
|
|
36
63
|
return { success: false, error: 'Please enter a valid email address.' };
|
|
@@ -39,7 +66,43 @@ export class AuthManager {
|
|
|
39
66
|
if (!rateCheck.allowed) {
|
|
40
67
|
return { success: false, error: `Too many auth requests. Please retry in ${rateCheck.retryAfterSeconds}s.` };
|
|
41
68
|
}
|
|
42
|
-
const
|
|
69
|
+
const accounts = this.loadAccounts();
|
|
70
|
+
const existing = accounts[cleanEmail];
|
|
71
|
+
if (existing) {
|
|
72
|
+
// Existing account - verify password if password was set
|
|
73
|
+
if (existing.passwordHash && existing.salt) {
|
|
74
|
+
if (!password) {
|
|
75
|
+
return { success: false, error: 'Password required for this account.' };
|
|
76
|
+
}
|
|
77
|
+
const computedHash = this.hashPassword(password, existing.salt);
|
|
78
|
+
if (computedHash !== existing.passwordHash) {
|
|
79
|
+
return { success: false, error: 'Invalid password. Please check your password and try again.' };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// New account - create account
|
|
85
|
+
if (password && password.length < 6) {
|
|
86
|
+
return { success: false, error: 'Password must be at least 6 characters long.' };
|
|
87
|
+
}
|
|
88
|
+
const userId = this.generateUserId(cleanEmail);
|
|
89
|
+
let salt;
|
|
90
|
+
let passwordHash;
|
|
91
|
+
if (password) {
|
|
92
|
+
salt = crypto.randomBytes(16).toString('hex');
|
|
93
|
+
passwordHash = this.hashPassword(password, salt);
|
|
94
|
+
}
|
|
95
|
+
accounts[cleanEmail] = {
|
|
96
|
+
email: cleanEmail,
|
|
97
|
+
userId,
|
|
98
|
+
passwordHash,
|
|
99
|
+
salt,
|
|
100
|
+
provider: 'email',
|
|
101
|
+
createdAt: new Date().toISOString(),
|
|
102
|
+
};
|
|
103
|
+
this.saveAccounts(accounts);
|
|
104
|
+
}
|
|
105
|
+
const userId = existing ? existing.userId : this.generateUserId(cleanEmail);
|
|
43
106
|
const user = {
|
|
44
107
|
email: cleanEmail,
|
|
45
108
|
userId,
|
|
@@ -50,16 +113,19 @@ export class AuthManager {
|
|
|
50
113
|
if (!fs.existsSync(dir))
|
|
51
114
|
fs.mkdirSync(dir, { recursive: true });
|
|
52
115
|
fs.writeFileSync(this.getAuthFilePath(), JSON.stringify(user, null, 2), 'utf-8');
|
|
53
|
-
//
|
|
116
|
+
// Route Firestore sync partition
|
|
54
117
|
const syncCfg = FirestoreSyncManager.getSyncConfig();
|
|
55
118
|
FirestoreSyncManager.saveSyncConfig(syncCfg.projectId || 'antri-agentic-hackathon', userId, syncCfg.apiKey);
|
|
56
119
|
return { success: true, user };
|
|
57
120
|
}
|
|
121
|
+
static async register(email, password) {
|
|
122
|
+
return this.loginWithPassword(email, password);
|
|
123
|
+
}
|
|
58
124
|
static async login(email, password) {
|
|
59
|
-
return this.
|
|
125
|
+
return this.loginWithPassword(email, password);
|
|
60
126
|
}
|
|
61
127
|
/**
|
|
62
|
-
* Google Sign-In handler (processes verified Google OAuth
|
|
128
|
+
* Google Sign-In handler (processes verified Google OAuth token or Google account identity)
|
|
63
129
|
*/
|
|
64
130
|
static async loginWithGoogle(email, googleToken) {
|
|
65
131
|
const cleanEmail = email.toLowerCase().trim();
|
|
@@ -70,7 +136,20 @@ export class AuthManager {
|
|
|
70
136
|
if (!rateCheck.allowed) {
|
|
71
137
|
return { success: false, error: `Rate limit exceeded. Please retry in ${rateCheck.retryAfterSeconds}s.` };
|
|
72
138
|
}
|
|
73
|
-
const
|
|
139
|
+
const accounts = this.loadAccounts();
|
|
140
|
+
let existing = accounts[cleanEmail];
|
|
141
|
+
if (!existing) {
|
|
142
|
+
const userId = this.generateUserId(cleanEmail);
|
|
143
|
+
accounts[cleanEmail] = {
|
|
144
|
+
email: cleanEmail,
|
|
145
|
+
userId,
|
|
146
|
+
provider: 'google',
|
|
147
|
+
createdAt: new Date().toISOString(),
|
|
148
|
+
};
|
|
149
|
+
this.saveAccounts(accounts);
|
|
150
|
+
existing = accounts[cleanEmail];
|
|
151
|
+
}
|
|
152
|
+
const userId = existing.userId;
|
|
74
153
|
const user = {
|
|
75
154
|
email: cleanEmail,
|
|
76
155
|
userId,
|
package/dist/cloud/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserAuth.d.ts","sourceRoot":"","sources":["../../src/cloud/browserAuth.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,WAAW,EAAE,MAAM,WAAW,CAAC;AAErD,qBAAa,iBAAiB;IAC5B;;OAEG;WACiB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"browserAuth.d.ts","sourceRoot":"","sources":["../../src/cloud/browserAuth.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,WAAW,EAAE,MAAM,WAAW,CAAC;AAErD,qBAAa,iBAAiB;IAC5B;;OAEG;WACiB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAqJjE,OAAO,CAAC,MAAM,CAAC,WAAW;IAe1B,OAAO,CAAC,MAAM,CAAC,eAAe;CAqU/B"}
|
|
@@ -22,7 +22,64 @@ export class BrowserAuthServer {
|
|
|
22
22
|
res.end(this.renderLoginPage(port, projectId, apiKey));
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
25
|
-
// 2.
|
|
25
|
+
// 2. Google OAuth Popup Callback Endpoint
|
|
26
|
+
if (url.pathname === '/api/google/callback') {
|
|
27
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
28
|
+
res.end(`<!DOCTYPE html><html><body style="background:#fcfbf9;font-family:system-ui;text-align:center;padding:40px;">
|
|
29
|
+
<p>Connecting your Google Account to ANTRI Code...</p>
|
|
30
|
+
<script>
|
|
31
|
+
const hash = window.location.hash.substring(1);
|
|
32
|
+
const params = new URLSearchParams(hash);
|
|
33
|
+
const idToken = params.get('id_token') || '';
|
|
34
|
+
const accessToken = params.get('access_token') || '';
|
|
35
|
+
|
|
36
|
+
function parseJwt(token) {
|
|
37
|
+
try {
|
|
38
|
+
var base64Url = token.split('.')[1];
|
|
39
|
+
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
|
|
40
|
+
var jsonPayload = decodeURIComponent(atob(base64).split('').map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join(''));
|
|
41
|
+
return JSON.parse(jsonPayload);
|
|
42
|
+
} catch(e) { return null; }
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function finish() {
|
|
46
|
+
let email = '';
|
|
47
|
+
if (idToken) {
|
|
48
|
+
const payload = parseJwt(idToken);
|
|
49
|
+
if (payload && payload.email) email = payload.email;
|
|
50
|
+
}
|
|
51
|
+
if (!email && accessToken) {
|
|
52
|
+
try {
|
|
53
|
+
const r = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', {
|
|
54
|
+
headers: { Authorization: 'Bearer ' + accessToken }
|
|
55
|
+
});
|
|
56
|
+
const d = await r.json();
|
|
57
|
+
if (d.email) email = d.email;
|
|
58
|
+
} catch(e) {}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (email) {
|
|
62
|
+
await fetch('/api/callback', {
|
|
63
|
+
method: 'POST',
|
|
64
|
+
headers: { 'Content-Type': 'application/json' },
|
|
65
|
+
body: JSON.stringify({ email: email, provider: 'google', googleToken: idToken || accessToken })
|
|
66
|
+
});
|
|
67
|
+
if (window.opener) {
|
|
68
|
+
window.opener.postMessage({ type: 'ANTRI_AUTH_SUCCESS', email: email }, '*');
|
|
69
|
+
window.close();
|
|
70
|
+
} else {
|
|
71
|
+
window.location.href = '/login';
|
|
72
|
+
}
|
|
73
|
+
} else {
|
|
74
|
+
document.body.innerHTML = '<p style="color:#dc2626;">Google sign-in completed. Returning to CLI...</p>';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
finish();
|
|
78
|
+
</script>
|
|
79
|
+
</body></html>`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// 3. Auth Callback Endpoint
|
|
26
83
|
if (url.pathname === '/api/callback' && req.method === 'POST') {
|
|
27
84
|
let body = '';
|
|
28
85
|
req.on('data', (chunk) => (body += chunk));
|
|
@@ -41,7 +98,7 @@ export class BrowserAuthServer {
|
|
|
41
98
|
authResult = await AuthManager.loginWithGoogle(email, data.googleToken);
|
|
42
99
|
}
|
|
43
100
|
else {
|
|
44
|
-
authResult = await AuthManager.
|
|
101
|
+
authResult = await AuthManager.loginWithPassword(email, data.password);
|
|
45
102
|
}
|
|
46
103
|
if (authResult.success && authResult.user) {
|
|
47
104
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
@@ -112,10 +169,11 @@ export class BrowserAuthServer {
|
|
|
112
169
|
<head>
|
|
113
170
|
<meta charset="UTF-8">
|
|
114
171
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
115
|
-
<title>ANTRI Code - Authentication</title>
|
|
172
|
+
<title>ANTRI Code - Secure Authentication</title>
|
|
116
173
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
117
174
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
118
175
|
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@500;700&display=swap" rel="stylesheet">
|
|
176
|
+
<script src="https://accounts.google.com/gsi/client" async defer></script>
|
|
119
177
|
<style>
|
|
120
178
|
:root {
|
|
121
179
|
--bg: #fcfbf9;
|
|
@@ -141,7 +199,7 @@ export class BrowserAuthServer {
|
|
|
141
199
|
border: 1px solid var(--border);
|
|
142
200
|
border-radius: 16px;
|
|
143
201
|
width: 100%;
|
|
144
|
-
max-width:
|
|
202
|
+
max-width: 440px;
|
|
145
203
|
padding: 36px 32px;
|
|
146
204
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.03);
|
|
147
205
|
text-align: center;
|
|
@@ -168,7 +226,12 @@ export class BrowserAuthServer {
|
|
|
168
226
|
p.subtitle {
|
|
169
227
|
font-size: 13px;
|
|
170
228
|
color: var(--subtext);
|
|
171
|
-
margin-bottom:
|
|
229
|
+
margin-bottom: 22px;
|
|
230
|
+
}
|
|
231
|
+
.google-container {
|
|
232
|
+
margin-bottom: 6px;
|
|
233
|
+
display: flex;
|
|
234
|
+
justify-content: center;
|
|
172
235
|
}
|
|
173
236
|
.btn-google {
|
|
174
237
|
width: 100%;
|
|
@@ -193,7 +256,7 @@ export class BrowserAuthServer {
|
|
|
193
256
|
.divider {
|
|
194
257
|
display: flex;
|
|
195
258
|
align-items: center;
|
|
196
|
-
margin:
|
|
259
|
+
margin: 20px 0;
|
|
197
260
|
color: #a8a29e;
|
|
198
261
|
font-size: 11px;
|
|
199
262
|
font-weight: 700;
|
|
@@ -208,7 +271,7 @@ export class BrowserAuthServer {
|
|
|
208
271
|
.divider span { padding: 0 12px; }
|
|
209
272
|
.input-group {
|
|
210
273
|
text-align: left;
|
|
211
|
-
margin-bottom:
|
|
274
|
+
margin-bottom: 14px;
|
|
212
275
|
}
|
|
213
276
|
label {
|
|
214
277
|
display: block;
|
|
@@ -217,7 +280,7 @@ export class BrowserAuthServer {
|
|
|
217
280
|
color: var(--text);
|
|
218
281
|
margin-bottom: 6px;
|
|
219
282
|
}
|
|
220
|
-
input[type="email"] {
|
|
283
|
+
input[type="email"], input[type="password"] {
|
|
221
284
|
width: 100%;
|
|
222
285
|
padding: 12px 14px;
|
|
223
286
|
border: 1px solid var(--border);
|
|
@@ -228,7 +291,7 @@ export class BrowserAuthServer {
|
|
|
228
291
|
outline: none;
|
|
229
292
|
transition: border-color 0.15s;
|
|
230
293
|
}
|
|
231
|
-
input[type="email"]:focus {
|
|
294
|
+
input[type="email"]:focus, input[type="password"]:focus {
|
|
232
295
|
border-color: var(--text);
|
|
233
296
|
background: #ffffff;
|
|
234
297
|
}
|
|
@@ -243,8 +306,10 @@ export class BrowserAuthServer {
|
|
|
243
306
|
border-radius: 8px;
|
|
244
307
|
cursor: pointer;
|
|
245
308
|
transition: opacity 0.15s;
|
|
309
|
+
margin-top: 6px;
|
|
246
310
|
}
|
|
247
311
|
.btn-submit:hover { opacity: 0.92; }
|
|
312
|
+
.btn-submit:disabled { opacity: 0.6; cursor: not-allowed; }
|
|
248
313
|
.success-view {
|
|
249
314
|
display: none;
|
|
250
315
|
padding: 20px 0;
|
|
@@ -265,8 +330,15 @@ export class BrowserAuthServer {
|
|
|
265
330
|
.status-msg {
|
|
266
331
|
font-size: 12px;
|
|
267
332
|
color: #dc2626;
|
|
268
|
-
margin-top:
|
|
333
|
+
margin-top: 12px;
|
|
269
334
|
display: none;
|
|
335
|
+
line-height: 1.4;
|
|
336
|
+
}
|
|
337
|
+
.auth-hint {
|
|
338
|
+
font-size: 11px;
|
|
339
|
+
color: var(--subtext);
|
|
340
|
+
margin-top: 6px;
|
|
341
|
+
text-align: left;
|
|
270
342
|
}
|
|
271
343
|
</style>
|
|
272
344
|
</head>
|
|
@@ -275,26 +347,34 @@ export class BrowserAuthServer {
|
|
|
275
347
|
<div id="auth-form-container">
|
|
276
348
|
<div class="brand-mark">A</div>
|
|
277
349
|
<h1>ANTRI CODE</h1>
|
|
278
|
-
<p class="subtitle">
|
|
350
|
+
<p class="subtitle">Secure authentication for terminal and cloud partition</p>
|
|
279
351
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
<
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
352
|
+
<!-- Google Sign In via Google Identity Services -->
|
|
353
|
+
<div class="google-container">
|
|
354
|
+
<button class="btn-google" id="google-btn" type="button">
|
|
355
|
+
<svg width="18" height="18" viewBox="0 0 24 24">
|
|
356
|
+
<path fill="#4285F4" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
|
|
357
|
+
<path fill="#34A853" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
|
|
358
|
+
<path fill="#FBBC05" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.06H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.94l2.85-2.22.81-.63z"/>
|
|
359
|
+
<path fill="#EA4335" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.06l3.66 2.84c.87-2.6 3.3-4.52 6.16-4.52z"/>
|
|
360
|
+
</svg>
|
|
361
|
+
<span id="google-btn-text">Sign in with Google</span>
|
|
362
|
+
</button>
|
|
363
|
+
</div>
|
|
289
364
|
|
|
290
|
-
<div class="divider"><span>OR
|
|
365
|
+
<div class="divider"><span>OR PASSWORD LOGIN / REGISTER</span></div>
|
|
291
366
|
|
|
292
|
-
<form id="
|
|
367
|
+
<form id="auth-form">
|
|
293
368
|
<div class="input-group">
|
|
294
|
-
<label for="email">
|
|
369
|
+
<label for="email">Account Email</label>
|
|
295
370
|
<input type="email" id="email" placeholder="e.g. user@gmail.com" required autofocus>
|
|
296
371
|
</div>
|
|
297
|
-
<
|
|
372
|
+
<div class="input-group">
|
|
373
|
+
<label for="password">Password</label>
|
|
374
|
+
<input type="password" id="password" placeholder="••••••••" minlength="6" required>
|
|
375
|
+
<p class="auth-hint">New account will automatically register. Existing accounts will verify password.</p>
|
|
376
|
+
</div>
|
|
377
|
+
<button type="submit" class="btn-submit" id="submit-btn">Login / Register & Unlock CLI</button>
|
|
298
378
|
<div class="status-msg" id="status-msg"></div>
|
|
299
379
|
</form>
|
|
300
380
|
</div>
|
|
@@ -302,104 +382,107 @@ export class BrowserAuthServer {
|
|
|
302
382
|
<div class="success-view" id="success-view">
|
|
303
383
|
<div class="success-icon">✓</div>
|
|
304
384
|
<h1>Authentication Successful!</h1>
|
|
305
|
-
<p class="subtitle" style="margin-top: 8px;">Your terminal has been authenticated. You can safely close this browser window and return to your CLI.</p>
|
|
385
|
+
<p class="subtitle" style="margin-top: 8px;" id="success-desc">Your terminal has been authenticated. You can safely close this browser window and return to your CLI.</p>
|
|
306
386
|
</div>
|
|
307
387
|
</div>
|
|
308
388
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
try {
|
|
323
|
-
const app = initializeApp(firebaseConfig);
|
|
324
|
-
authInstance = getAuth(app);
|
|
325
|
-
googleProvider = new GoogleAuthProvider();
|
|
326
|
-
} catch (err) {
|
|
327
|
-
console.warn('Firebase init:', err);
|
|
389
|
+
<script>
|
|
390
|
+
function parseJwt(token) {
|
|
391
|
+
try {
|
|
392
|
+
var base64Url = token.split('.')[1];
|
|
393
|
+
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
|
|
394
|
+
var jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
|
|
395
|
+
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
|
|
396
|
+
}).join(''));
|
|
397
|
+
return JSON.parse(jsonPayload);
|
|
398
|
+
} catch (e) {
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
328
401
|
}
|
|
329
402
|
|
|
330
|
-
|
|
403
|
+
async function authenticate(email, password = '', provider = 'email', googleToken = '') {
|
|
331
404
|
const statusMsg = document.getElementById('status-msg');
|
|
332
405
|
const submitBtn = document.getElementById('submit-btn');
|
|
406
|
+
const googleBtnText = document.getElementById('google-btn-text');
|
|
407
|
+
|
|
333
408
|
statusMsg.style.display = 'none';
|
|
334
409
|
submitBtn.disabled = true;
|
|
335
|
-
submitBtn.innerText = '
|
|
410
|
+
submitBtn.innerText = 'Verifying credentials...';
|
|
411
|
+
if (provider === 'google') {
|
|
412
|
+
googleBtnText.innerText = 'Linking Google Account...';
|
|
413
|
+
}
|
|
336
414
|
|
|
337
415
|
try {
|
|
338
416
|
const res = await fetch('/api/callback', {
|
|
339
417
|
method: 'POST',
|
|
340
418
|
headers: { 'Content-Type': 'application/json' },
|
|
341
|
-
body: JSON.stringify({ email, provider, googleToken
|
|
419
|
+
body: JSON.stringify({ email, password, provider, googleToken })
|
|
342
420
|
});
|
|
343
421
|
const data = await res.json();
|
|
344
422
|
if (data.success) {
|
|
345
423
|
document.getElementById('auth-form-container').style.display = 'none';
|
|
346
424
|
document.getElementById('success-view').style.display = 'block';
|
|
425
|
+
document.getElementById('success-desc').innerText = 'Authenticated as ' + email + '. Private Firestore partition is active. Return to your terminal now.';
|
|
347
426
|
} else {
|
|
348
427
|
statusMsg.innerText = data.error || 'Authentication failed.';
|
|
428
|
+
statusMsg.style.color = '#dc2626';
|
|
349
429
|
statusMsg.style.display = 'block';
|
|
350
430
|
submitBtn.disabled = false;
|
|
351
|
-
submitBtn.innerText = '
|
|
431
|
+
submitBtn.innerText = 'Login / Register & Unlock CLI';
|
|
432
|
+
googleBtnText.innerText = 'Sign in with Google';
|
|
352
433
|
}
|
|
353
434
|
} catch (err) {
|
|
354
435
|
statusMsg.innerText = 'Connection error: ' + err.message;
|
|
436
|
+
statusMsg.style.color = '#dc2626';
|
|
355
437
|
statusMsg.style.display = 'block';
|
|
356
438
|
submitBtn.disabled = false;
|
|
357
|
-
submitBtn.innerText = '
|
|
439
|
+
submitBtn.innerText = 'Login / Register & Unlock CLI';
|
|
440
|
+
googleBtnText.innerText = 'Sign in with Google';
|
|
358
441
|
}
|
|
359
|
-
}
|
|
442
|
+
}
|
|
360
443
|
|
|
361
|
-
document.getElementById('
|
|
444
|
+
document.getElementById('auth-form').addEventListener('submit', (e) => {
|
|
362
445
|
e.preventDefault();
|
|
363
446
|
const email = document.getElementById('email').value.trim();
|
|
364
|
-
|
|
447
|
+
const password = document.getElementById('password').value;
|
|
448
|
+
if (email && password) {
|
|
449
|
+
authenticate(email, password, 'email');
|
|
450
|
+
}
|
|
365
451
|
});
|
|
366
452
|
|
|
367
|
-
|
|
453
|
+
window.addEventListener('message', (event) => {
|
|
454
|
+
if (event.data && event.data.type === 'ANTRI_AUTH_SUCCESS') {
|
|
455
|
+
document.getElementById('auth-form-container').style.display = 'none';
|
|
456
|
+
document.getElementById('success-view').style.display = 'block';
|
|
457
|
+
document.getElementById('success-desc').innerText = 'Authenticated with Google as ' + event.data.email + '. Return to your terminal now.';
|
|
458
|
+
}
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
function openGooglePopup() {
|
|
368
462
|
const googleBtnText = document.getElementById('google-btn-text');
|
|
369
|
-
|
|
370
|
-
statusMsg.style.display = 'none';
|
|
463
|
+
googleBtnText.innerText = 'Opening Google...';
|
|
371
464
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
emailInput.focus();
|
|
389
|
-
statusMsg.innerText = 'Please enter your Google account email below to link your identity:';
|
|
390
|
-
statusMsg.style.color = '#78716c';
|
|
391
|
-
statusMsg.style.display = 'block';
|
|
392
|
-
return;
|
|
393
|
-
}
|
|
465
|
+
const authUrl = 'https://accounts.google.com/o/oauth2/v2/auth?' + new URLSearchParams({
|
|
466
|
+
client_id: '659424855422-e421p0t9b3qg4kff9e47s9a37gcr38l0.apps.googleusercontent.com',
|
|
467
|
+
redirect_uri: window.location.origin + '/api/google/callback',
|
|
468
|
+
response_type: 'token id_token',
|
|
469
|
+
scope: 'openid email profile',
|
|
470
|
+
nonce: Math.random().toString(36).substring(2),
|
|
471
|
+
prompt: 'select_account'
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
const width = 500, height = 640;
|
|
475
|
+
const left = (window.screen.width / 2) - (width / 2);
|
|
476
|
+
const top = (window.screen.height / 2) - (height / 2);
|
|
477
|
+
const popup = window.open(authUrl, 'google_signin_popup', 'width=' + width + ',height=' + height + ',top=' + top + ',left=' + left);
|
|
478
|
+
|
|
479
|
+
if (!popup || popup.closed || typeof popup.closed === 'undefined') {
|
|
480
|
+
window.location.href = authUrl;
|
|
394
481
|
}
|
|
482
|
+
}
|
|
395
483
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
emailInput.placeholder = 'Enter your Google email (e.g. user@gmail.com)';
|
|
399
|
-
emailInput.focus();
|
|
400
|
-
statusMsg.innerText = 'Enter your Google account email below and click Continue:';
|
|
401
|
-
statusMsg.style.color = '#78716c';
|
|
402
|
-
statusMsg.style.display = 'block';
|
|
484
|
+
document.getElementById('google-btn').addEventListener('click', () => {
|
|
485
|
+
openGooglePopup();
|
|
403
486
|
});
|
|
404
487
|
</script>
|
|
405
488
|
</body>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserAuth.js","sourceRoot":"","sources":["../../src/cloud/browserAuth.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"browserAuth.js","sourceRoot":"","sources":["../../src/cloud/browserAuth.ts"],"names":[],"mappings":"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"}
|
package/dist/core/config.js
CHANGED
package/dist/core/updater.d.ts
CHANGED
package/dist/core/updater.js
CHANGED
|
@@ -4,7 +4,7 @@ import chalk from 'chalk';
|
|
|
4
4
|
import ora from 'ora';
|
|
5
5
|
const execPromise = util.promisify(exec);
|
|
6
6
|
export class Updater {
|
|
7
|
-
static CURRENT_VERSION = '1.
|
|
7
|
+
static CURRENT_VERSION = '1.38.0';
|
|
8
8
|
static PACKAGE_NAME = 'antri_cli';
|
|
9
9
|
/**
|
|
10
10
|
* Checks for available updates and self-updates the global antri CLI
|