@dsh-enhanced/coding-subscription-provider 0.1.2 → 0.1.3
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 +81 -30
- package/lib/adapter.d.ts +34 -3
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +288 -71
- package/lib/adapter.js.map +1 -1
- package/lib/codex-direct-auth.d.ts +34 -0
- package/lib/codex-direct-auth.d.ts.map +1 -0
- package/lib/codex-direct-auth.js +604 -0
- package/lib/codex-direct-auth.js.map +1 -0
- package/lib/codex-direct-responses.d.ts +50 -0
- package/lib/codex-direct-responses.d.ts.map +1 -0
- package/lib/codex-direct-responses.js +1585 -0
- package/lib/codex-direct-responses.js.map +1 -0
- package/lib/config.d.ts +16 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +34 -1
- package/lib/config.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +32 -4
- package/lib/index.js.map +1 -1
- package/lib/process.d.ts +6 -0
- package/lib/process.d.ts.map +1 -1
- package/lib/process.js +26 -4
- package/lib/process.js.map +1 -1
- package/lib/prompt.d.ts.map +1 -1
- package/lib/prompt.js +33 -2
- package/lib/prompt.js.map +1 -1
- package/lib/session-cwd.d.ts +24 -0
- package/lib/session-cwd.d.ts.map +1 -0
- package/lib/session-cwd.js +39 -0
- package/lib/session-cwd.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +14 -4
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
import { constants } from 'node:fs';
|
|
2
|
+
import { lstat, open, realpath, rename, unlink } from 'node:fs/promises';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { basename, dirname, join, resolve } from 'node:path';
|
|
5
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
6
|
+
import { attributionHeaders } from '@deepseek-ai/dsh-llm';
|
|
7
|
+
export const CODEX_RESPONSES_URL = 'https://chatgpt.com/backend-api/codex/responses';
|
|
8
|
+
export const CODEX_OAUTH_REFRESH_URL = 'https://auth.openai.com/oauth/token';
|
|
9
|
+
/**
|
|
10
|
+
* Private Responses routing is version-gated independently of this plugin's
|
|
11
|
+
* package version. These compatibility identifiers describe this reconstructed
|
|
12
|
+
* dialect; the deliberately minimal user agent is not byte-identical to the
|
|
13
|
+
* platform/terminal-qualified value emitted by the official Codex binary.
|
|
14
|
+
*/
|
|
15
|
+
export const CODEX_WIRE_ORIGINATOR = 'codex_cli_rs';
|
|
16
|
+
export const CODEX_WIRE_CLIENT_VERSION = '0.149.1';
|
|
17
|
+
export const CODEX_WIRE_USER_AGENT = `${CODEX_WIRE_ORIGINATOR}/${CODEX_WIRE_CLIENT_VERSION}`;
|
|
18
|
+
const CODEX_OAUTH_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';
|
|
19
|
+
const MAX_AUTH_FILE_BYTES = 1024 * 1024;
|
|
20
|
+
const MAX_REFRESH_RESPONSE_BYTES = 64 * 1024;
|
|
21
|
+
const MAX_TOKEN_BYTES = 64 * 1024;
|
|
22
|
+
const MAX_ACCOUNT_ID_BYTES = 4 * 1024;
|
|
23
|
+
const BEARER_PREFIX = 'Bearer ';
|
|
24
|
+
const MAX_ACCESS_TOKEN_BYTES = MAX_TOKEN_BYTES - Buffer.byteLength(BEARER_PREFIX, 'utf8');
|
|
25
|
+
const MAX_AUTH_READ_ATTEMPTS = 3;
|
|
26
|
+
const MAX_PERSIST_ATTEMPTS = 3;
|
|
27
|
+
export class CodexDirectAuthError extends Error {
|
|
28
|
+
status;
|
|
29
|
+
constructor(message, cause = 'subscription-auth', status) {
|
|
30
|
+
super(message, { cause });
|
|
31
|
+
this.name = 'CodexDirectAuthError';
|
|
32
|
+
this.status = status;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
class CredentialSnapshotChangedError extends Error {
|
|
36
|
+
}
|
|
37
|
+
/** Process-wide without ever placing raw credential material in the map key. */
|
|
38
|
+
const refreshFlights = new Map();
|
|
39
|
+
/**
|
|
40
|
+
* Narrow credential capability for Codex's fixed private Responses endpoint.
|
|
41
|
+
* It intentionally does not expose bearer tokens or a generic authenticated fetch.
|
|
42
|
+
*/
|
|
43
|
+
export class CodexCredentialStore {
|
|
44
|
+
#authFile;
|
|
45
|
+
#fetch;
|
|
46
|
+
#refreshTimeoutMs;
|
|
47
|
+
#now;
|
|
48
|
+
constructor(options = {}) {
|
|
49
|
+
const configuredHome = process.env.CODEX_HOME?.trim();
|
|
50
|
+
const authFile = options.authFile ?? join(configuredHome || join(homedir(), '.codex'), 'auth.json');
|
|
51
|
+
this.#authFile = resolve(authFile);
|
|
52
|
+
this.#fetch = options.fetch ?? globalThis.fetch;
|
|
53
|
+
this.#refreshTimeoutMs = requireRefreshTimeout(options.refreshTimeoutMs ?? 10_000);
|
|
54
|
+
this.#now = options.now ?? (() => new Date());
|
|
55
|
+
}
|
|
56
|
+
async requestResponses(body, signal) {
|
|
57
|
+
throwIfCallerAborted(signal);
|
|
58
|
+
const original = await readCredentialFile(this.#authFile);
|
|
59
|
+
const sessionId = randomUUID();
|
|
60
|
+
const threadId = randomUUID();
|
|
61
|
+
const first = await this.#postResponses(body, original, sessionId, threadId, signal);
|
|
62
|
+
if (first.status !== 401)
|
|
63
|
+
return first;
|
|
64
|
+
discardBody(first);
|
|
65
|
+
throwIfCallerAborted(signal);
|
|
66
|
+
const onDisk = await readCredentialFile(this.#authFile);
|
|
67
|
+
if (onDisk.accountId !== original.accountId) {
|
|
68
|
+
throw new CodexDirectAuthError('Codex authentication account changed during unauthorized recovery');
|
|
69
|
+
}
|
|
70
|
+
const credentials = credentialsChanged(original, onDisk)
|
|
71
|
+
? onDisk
|
|
72
|
+
: await waitForSignal(this.#refreshOnce(original), signal);
|
|
73
|
+
assertSameAccount(original, credentials);
|
|
74
|
+
return this.#postResponses(body, credentials, sessionId, threadId, signal);
|
|
75
|
+
}
|
|
76
|
+
async #postResponses(body, credentials, sessionId, threadId, signal) {
|
|
77
|
+
throwIfCallerAborted(signal);
|
|
78
|
+
const headers = createValidatedHeaders(() => ({
|
|
79
|
+
...attributionHeaders(),
|
|
80
|
+
authorization: `${BEARER_PREFIX}${credentials.accessToken}`,
|
|
81
|
+
'chatgpt-account-id': credentials.accountId,
|
|
82
|
+
'content-type': 'application/json',
|
|
83
|
+
accept: 'text/event-stream',
|
|
84
|
+
'openai-beta': 'responses=v1',
|
|
85
|
+
originator: CODEX_WIRE_ORIGINATOR,
|
|
86
|
+
version: CODEX_WIRE_CLIENT_VERSION,
|
|
87
|
+
'user-agent': CODEX_WIRE_USER_AGENT,
|
|
88
|
+
'session-id': sessionId,
|
|
89
|
+
'thread-id': threadId,
|
|
90
|
+
'x-client-request-id': threadId,
|
|
91
|
+
}));
|
|
92
|
+
throwIfCallerAborted(signal);
|
|
93
|
+
try {
|
|
94
|
+
return await this.#fetch(CODEX_RESPONSES_URL, {
|
|
95
|
+
method: 'POST',
|
|
96
|
+
headers,
|
|
97
|
+
body,
|
|
98
|
+
signal,
|
|
99
|
+
redirect: 'error',
|
|
100
|
+
credentials: 'omit',
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
if (signal.aborted)
|
|
105
|
+
throwCallerAbortReason(signal);
|
|
106
|
+
throw new CodexDirectAuthError('Codex private Responses transport failed', 'transport');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
#refreshOnce(snapshot) {
|
|
110
|
+
const key = refreshFlightKey(this.#authFile, snapshot);
|
|
111
|
+
const current = refreshFlights.get(key);
|
|
112
|
+
if (current !== undefined)
|
|
113
|
+
return current;
|
|
114
|
+
const promise = this.#refresh(snapshot);
|
|
115
|
+
refreshFlights.set(key, promise);
|
|
116
|
+
void promise.finally(() => {
|
|
117
|
+
if (refreshFlights.get(key) === promise)
|
|
118
|
+
refreshFlights.delete(key);
|
|
119
|
+
}).catch(() => { });
|
|
120
|
+
return promise;
|
|
121
|
+
}
|
|
122
|
+
async #refresh(snapshot) {
|
|
123
|
+
const timeoutSignal = AbortSignal.timeout(this.#refreshTimeoutMs);
|
|
124
|
+
const headers = createValidatedHeaders(() => ({
|
|
125
|
+
...attributionHeaders(),
|
|
126
|
+
'content-type': 'application/json',
|
|
127
|
+
accept: 'application/json',
|
|
128
|
+
}));
|
|
129
|
+
const body = JSON.stringify({
|
|
130
|
+
client_id: CODEX_OAUTH_CLIENT_ID,
|
|
131
|
+
grant_type: 'refresh_token',
|
|
132
|
+
refresh_token: snapshot.refreshToken,
|
|
133
|
+
});
|
|
134
|
+
let response;
|
|
135
|
+
try {
|
|
136
|
+
response = await this.#fetch(CODEX_OAUTH_REFRESH_URL, {
|
|
137
|
+
method: 'POST',
|
|
138
|
+
headers,
|
|
139
|
+
body,
|
|
140
|
+
signal: timeoutSignal,
|
|
141
|
+
redirect: 'error',
|
|
142
|
+
credentials: 'omit',
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
if (timeoutSignal.aborted) {
|
|
147
|
+
throw new CodexDirectAuthError('Codex OAuth token refresh timed out', 'timeout');
|
|
148
|
+
}
|
|
149
|
+
throw new CodexDirectAuthError('Codex OAuth token refresh transport failed', 'transport');
|
|
150
|
+
}
|
|
151
|
+
if (timeoutSignal.aborted) {
|
|
152
|
+
discardBody(response);
|
|
153
|
+
throw new CodexDirectAuthError('Codex OAuth token refresh timed out', 'timeout');
|
|
154
|
+
}
|
|
155
|
+
if (!response.ok) {
|
|
156
|
+
discardBody(response);
|
|
157
|
+
if (response.status === 400 || response.status === 401) {
|
|
158
|
+
throw new CodexDirectAuthError('Codex OAuth token refresh rejected the local ChatGPT session', 'subscription-auth', response.status);
|
|
159
|
+
}
|
|
160
|
+
throw new CodexDirectAuthError(`Codex OAuth token refresh returned HTTP ${response.status}`, 'provider-http', response.status);
|
|
161
|
+
}
|
|
162
|
+
let contents;
|
|
163
|
+
try {
|
|
164
|
+
contents = await readBoundedBody(response, MAX_REFRESH_RESPONSE_BYTES, timeoutSignal);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
if (timeoutSignal.aborted) {
|
|
168
|
+
throw new CodexDirectAuthError('Codex OAuth token refresh timed out', 'timeout');
|
|
169
|
+
}
|
|
170
|
+
if (error instanceof CodexDirectAuthError)
|
|
171
|
+
throw error;
|
|
172
|
+
throw new CodexDirectAuthError('Codex OAuth token refresh returned an invalid body', 'protocol');
|
|
173
|
+
}
|
|
174
|
+
if (timeoutSignal.aborted) {
|
|
175
|
+
throw new CodexDirectAuthError('Codex OAuth token refresh timed out', 'timeout');
|
|
176
|
+
}
|
|
177
|
+
return this.#persistRefresh(snapshot, parseRefreshResponse(contents));
|
|
178
|
+
}
|
|
179
|
+
async #persistRefresh(snapshot, refreshed) {
|
|
180
|
+
let refreshedAt;
|
|
181
|
+
try {
|
|
182
|
+
refreshedAt = this.#now().toISOString();
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
throw new CodexDirectAuthError('Could not securely update the Codex authentication file');
|
|
186
|
+
}
|
|
187
|
+
for (let attempt = 0; attempt < MAX_PERSIST_ATTEMPTS; attempt += 1) {
|
|
188
|
+
const current = await readCredentialFile(this.#authFile);
|
|
189
|
+
if (credentialsChanged(snapshot, current))
|
|
190
|
+
return assertSameAccount(snapshot, current);
|
|
191
|
+
const tokens = {
|
|
192
|
+
...current.document.tokens,
|
|
193
|
+
access_token: refreshed.accessToken,
|
|
194
|
+
refresh_token: refreshed.refreshToken ?? current.refreshToken,
|
|
195
|
+
id_token: refreshed.idToken ?? current.idToken,
|
|
196
|
+
account_id: current.accountId,
|
|
197
|
+
};
|
|
198
|
+
const document = {
|
|
199
|
+
...current.document,
|
|
200
|
+
auth_mode: 'chatgpt',
|
|
201
|
+
tokens,
|
|
202
|
+
last_refresh: refreshedAt,
|
|
203
|
+
};
|
|
204
|
+
const serialized = JSON.stringify(document);
|
|
205
|
+
if (Buffer.byteLength(serialized, 'utf8') > MAX_AUTH_FILE_BYTES) {
|
|
206
|
+
throw new CodexDirectAuthError('Refreshed Codex authentication data exceeds its safety limit');
|
|
207
|
+
}
|
|
208
|
+
const directory = dirname(this.#authFile);
|
|
209
|
+
const temporary = join(directory, `.${basename(this.#authFile)}.dsh-${process.pid}-${randomUUID()}.tmp`);
|
|
210
|
+
let temporaryExists = false;
|
|
211
|
+
try {
|
|
212
|
+
await assertTrustedParent(this.#authFile);
|
|
213
|
+
const handle = await open(temporary, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
|
|
214
|
+
temporaryExists = true;
|
|
215
|
+
let handleStat;
|
|
216
|
+
try {
|
|
217
|
+
await handle.chmod(0o600);
|
|
218
|
+
await handle.writeFile(serialized, 'utf8');
|
|
219
|
+
await handle.sync();
|
|
220
|
+
handleStat = await handle.stat({ bigint: true });
|
|
221
|
+
assertSecureTemporaryFile(handleStat, Buffer.byteLength(serialized, 'utf8'));
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
await handle.close();
|
|
225
|
+
}
|
|
226
|
+
const temporaryStat = await lstat(temporary, { bigint: true });
|
|
227
|
+
assertSecureTemporaryFile(temporaryStat, Buffer.byteLength(serialized, 'utf8'));
|
|
228
|
+
if (temporaryStat.dev !== handleStat.dev || temporaryStat.ino !== handleStat.ino) {
|
|
229
|
+
throw new CodexDirectAuthError('Codex authentication temporary file changed before persistence');
|
|
230
|
+
}
|
|
231
|
+
const beforeRename = await readCredentialFile(this.#authFile);
|
|
232
|
+
if (credentialsChanged(snapshot, beforeRename))
|
|
233
|
+
return assertSameAccount(snapshot, beforeRename);
|
|
234
|
+
if (!sameFingerprint(current.fingerprint, beforeRename.fingerprint))
|
|
235
|
+
continue;
|
|
236
|
+
await assertTrustedParent(this.#authFile);
|
|
237
|
+
const finalTemporaryStat = await lstat(temporary, { bigint: true });
|
|
238
|
+
assertSecureTemporaryFile(finalTemporaryStat, Buffer.byteLength(serialized, 'utf8'));
|
|
239
|
+
if (finalTemporaryStat.dev !== handleStat.dev || finalTemporaryStat.ino !== handleStat.ino) {
|
|
240
|
+
throw new CodexDirectAuthError('Codex authentication temporary file changed before rename');
|
|
241
|
+
}
|
|
242
|
+
/*
|
|
243
|
+
* This compare-then-rename is deliberately best-effort across processes.
|
|
244
|
+
* Official Codex writers do not share a lock with this plugin, so another
|
|
245
|
+
* writer can still win after the final comparison.
|
|
246
|
+
*/
|
|
247
|
+
await rename(temporary, this.#authFile);
|
|
248
|
+
temporaryExists = false;
|
|
249
|
+
await syncDirectory(directory);
|
|
250
|
+
return assertSameAccount(snapshot, await readCredentialFile(this.#authFile));
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
if (error instanceof CodexDirectAuthError)
|
|
254
|
+
throw error;
|
|
255
|
+
throw new CodexDirectAuthError('Could not securely update the Codex authentication file');
|
|
256
|
+
}
|
|
257
|
+
finally {
|
|
258
|
+
if (temporaryExists)
|
|
259
|
+
await unlink(temporary).catch(() => { });
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
throw new CodexDirectAuthError('Codex authentication file changed too often to update safely');
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
async function readCredentialFile(path) {
|
|
266
|
+
ensurePosixSecuritySupport();
|
|
267
|
+
for (let attempt = 0; attempt < MAX_AUTH_READ_ATTEMPTS; attempt += 1) {
|
|
268
|
+
try {
|
|
269
|
+
return await readCredentialSnapshot(path);
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
if (error instanceof CredentialSnapshotChangedError) {
|
|
273
|
+
if (attempt + 1 < MAX_AUTH_READ_ATTEMPTS)
|
|
274
|
+
continue;
|
|
275
|
+
throw new CodexDirectAuthError('Codex authentication file changed while it was read');
|
|
276
|
+
}
|
|
277
|
+
if (error instanceof CodexDirectAuthError)
|
|
278
|
+
throw error;
|
|
279
|
+
throw new CodexDirectAuthError('Could not securely read the Codex authentication file');
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
throw new CodexDirectAuthError('Codex authentication file changed while it was read');
|
|
283
|
+
}
|
|
284
|
+
async function readCredentialSnapshot(path) {
|
|
285
|
+
await assertTrustedParent(path);
|
|
286
|
+
let handle;
|
|
287
|
+
try {
|
|
288
|
+
const before = await lstat(path, { bigint: true });
|
|
289
|
+
assertSecureAuthFile(before);
|
|
290
|
+
handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
291
|
+
const opened = await handle.stat({ bigint: true });
|
|
292
|
+
assertSecureAuthFile(opened);
|
|
293
|
+
if (!sameFingerprint(fingerprint(before), fingerprint(opened))) {
|
|
294
|
+
throw new CredentialSnapshotChangedError();
|
|
295
|
+
}
|
|
296
|
+
const bytes = await readBoundedFile(handle, MAX_AUTH_FILE_BYTES);
|
|
297
|
+
const after = await handle.stat({ bigint: true });
|
|
298
|
+
const afterPath = await lstat(path, { bigint: true });
|
|
299
|
+
assertSecureAuthFile(after);
|
|
300
|
+
assertSecureAuthFile(afterPath);
|
|
301
|
+
if (!sameFingerprint(fingerprint(opened), fingerprint(after))
|
|
302
|
+
|| !sameFingerprint(fingerprint(after), fingerprint(afterPath))
|
|
303
|
+
|| after.size !== BigInt(bytes.byteLength)) {
|
|
304
|
+
throw new CredentialSnapshotChangedError();
|
|
305
|
+
}
|
|
306
|
+
await assertTrustedParent(path);
|
|
307
|
+
const document = parseCredentialDocument(decodeStrictUtf8(bytes));
|
|
308
|
+
return {
|
|
309
|
+
document,
|
|
310
|
+
fingerprint: fingerprint(after),
|
|
311
|
+
accessToken: document.tokens.access_token,
|
|
312
|
+
refreshToken: document.tokens.refresh_token,
|
|
313
|
+
idToken: document.tokens.id_token,
|
|
314
|
+
accountId: document.tokens.account_id,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
if (error instanceof CredentialSnapshotChangedError || error instanceof CodexDirectAuthError)
|
|
319
|
+
throw error;
|
|
320
|
+
throw new CodexDirectAuthError('Could not securely read the Codex authentication file');
|
|
321
|
+
}
|
|
322
|
+
finally {
|
|
323
|
+
await handle?.close().catch(() => { });
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
async function assertTrustedParent(path) {
|
|
327
|
+
ensurePosixSecuritySupport();
|
|
328
|
+
const parent = dirname(path);
|
|
329
|
+
try {
|
|
330
|
+
const before = await lstat(parent, { bigint: true });
|
|
331
|
+
assertSecureParent(before);
|
|
332
|
+
const canonical = await realpath(parent);
|
|
333
|
+
const after = await lstat(parent, { bigint: true });
|
|
334
|
+
assertSecureParent(after);
|
|
335
|
+
if (canonical !== resolve(parent) || before.dev !== after.dev || before.ino !== after.ino) {
|
|
336
|
+
throw new CodexDirectAuthError('Codex authentication parent must not contain symbolic links');
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
340
|
+
if (error instanceof CodexDirectAuthError)
|
|
341
|
+
throw error;
|
|
342
|
+
throw new CodexDirectAuthError('Could not securely inspect the Codex authentication parent');
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
function assertSecureParent(stat) {
|
|
346
|
+
if (!stat.isDirectory() || stat.isSymbolicLink()) {
|
|
347
|
+
throw new CodexDirectAuthError('Codex authentication parent must be a regular directory');
|
|
348
|
+
}
|
|
349
|
+
if (stat.uid !== currentUid()) {
|
|
350
|
+
throw new CodexDirectAuthError('Codex authentication parent must be owned by the current user');
|
|
351
|
+
}
|
|
352
|
+
if ((stat.mode & 18n) !== 0n) {
|
|
353
|
+
throw new CodexDirectAuthError('Codex authentication parent permissions are unsafe');
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function assertSecureAuthFile(stat) {
|
|
357
|
+
if (!stat.isFile() || stat.isSymbolicLink()) {
|
|
358
|
+
throw new CodexDirectAuthError('Codex authentication path must be a regular file');
|
|
359
|
+
}
|
|
360
|
+
if (stat.uid !== currentUid()) {
|
|
361
|
+
throw new CodexDirectAuthError('Codex authentication file must be owned by the current user');
|
|
362
|
+
}
|
|
363
|
+
if ((stat.mode & 63n) !== 0n || stat.nlink !== 1n) {
|
|
364
|
+
throw new CodexDirectAuthError('Codex authentication file permissions are unsafe');
|
|
365
|
+
}
|
|
366
|
+
if (stat.size <= 0n || stat.size > BigInt(MAX_AUTH_FILE_BYTES)) {
|
|
367
|
+
throw new CodexDirectAuthError('Codex authentication file size is invalid');
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
function assertSecureTemporaryFile(stat, expectedBytes) {
|
|
371
|
+
if (!stat.isFile() || stat.isSymbolicLink()
|
|
372
|
+
|| stat.uid !== currentUid()
|
|
373
|
+
|| (stat.mode & 511n) !== 384n
|
|
374
|
+
|| stat.nlink !== 1n
|
|
375
|
+
|| stat.size !== BigInt(expectedBytes)) {
|
|
376
|
+
throw new CodexDirectAuthError('Codex authentication temporary file is unsafe');
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
async function readBoundedFile(handle, maxBytes) {
|
|
380
|
+
const output = Buffer.allocUnsafe(maxBytes + 1);
|
|
381
|
+
let total = 0;
|
|
382
|
+
while (total < output.byteLength) {
|
|
383
|
+
const part = await handle.read(output, total, output.byteLength - total, null);
|
|
384
|
+
if (part.bytesRead === 0)
|
|
385
|
+
break;
|
|
386
|
+
total += part.bytesRead;
|
|
387
|
+
}
|
|
388
|
+
if (total > maxBytes) {
|
|
389
|
+
throw new CodexDirectAuthError('Codex authentication file exceeded its safety limit');
|
|
390
|
+
}
|
|
391
|
+
return output.subarray(0, total);
|
|
392
|
+
}
|
|
393
|
+
function decodeStrictUtf8(contents) {
|
|
394
|
+
try {
|
|
395
|
+
return new TextDecoder('utf-8', { fatal: true }).decode(contents);
|
|
396
|
+
}
|
|
397
|
+
catch {
|
|
398
|
+
throw new CodexDirectAuthError('Codex authentication file is not valid UTF-8');
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
function parseCredentialDocument(contents) {
|
|
402
|
+
let parsed;
|
|
403
|
+
try {
|
|
404
|
+
parsed = JSON.parse(contents);
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
throw new CodexDirectAuthError('Codex authentication file is not valid JSON');
|
|
408
|
+
}
|
|
409
|
+
if (!isRecord(parsed) || parsed.auth_mode !== 'chatgpt' || !isRecord(parsed.tokens)) {
|
|
410
|
+
throw new CodexDirectAuthError('Codex authentication file does not contain a ChatGPT session');
|
|
411
|
+
}
|
|
412
|
+
const tokens = parsed.tokens;
|
|
413
|
+
requireHeaderValue(tokens.access_token, 'access token', MAX_ACCESS_TOKEN_BYTES, 'subscription-auth');
|
|
414
|
+
requireBoundedString(tokens.refresh_token, 'refresh token', MAX_TOKEN_BYTES, 'subscription-auth');
|
|
415
|
+
requireBoundedString(tokens.id_token, 'ID token', MAX_TOKEN_BYTES, 'subscription-auth');
|
|
416
|
+
requireHeaderValue(tokens.account_id, 'account id', MAX_ACCOUNT_ID_BYTES, 'subscription-auth');
|
|
417
|
+
return parsed;
|
|
418
|
+
}
|
|
419
|
+
function parseRefreshResponse(contents) {
|
|
420
|
+
let parsed;
|
|
421
|
+
try {
|
|
422
|
+
parsed = JSON.parse(contents);
|
|
423
|
+
}
|
|
424
|
+
catch {
|
|
425
|
+
throw new CodexDirectAuthError('Codex OAuth token refresh returned invalid JSON', 'protocol');
|
|
426
|
+
}
|
|
427
|
+
if (!isRecord(parsed)) {
|
|
428
|
+
throw new CodexDirectAuthError('Codex OAuth token refresh returned an invalid payload', 'protocol');
|
|
429
|
+
}
|
|
430
|
+
const accessToken = requireHeaderValue(parsed.access_token, 'refreshed access token', MAX_ACCESS_TOKEN_BYTES, 'protocol');
|
|
431
|
+
const refreshToken = optionalBoundedString(parsed.refresh_token, 'refreshed refresh token', MAX_TOKEN_BYTES, 'protocol');
|
|
432
|
+
const idToken = optionalBoundedString(parsed.id_token, 'refreshed ID token', MAX_TOKEN_BYTES, 'protocol');
|
|
433
|
+
return {
|
|
434
|
+
accessToken,
|
|
435
|
+
...(refreshToken === undefined ? {} : { refreshToken }),
|
|
436
|
+
...(idToken === undefined ? {} : { idToken }),
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
function requireBoundedString(value, label, maxBytes, cause) {
|
|
440
|
+
if (typeof value !== 'string' || value.length === 0 || Buffer.byteLength(value, 'utf8') > maxBytes) {
|
|
441
|
+
throw new CodexDirectAuthError(`Codex ${label} is missing or invalid`, cause);
|
|
442
|
+
}
|
|
443
|
+
return value;
|
|
444
|
+
}
|
|
445
|
+
function requireHeaderValue(value, label, maxBytes, cause) {
|
|
446
|
+
const parsed = requireBoundedString(value, label, maxBytes, cause);
|
|
447
|
+
for (let index = 0; index < parsed.length; index += 1) {
|
|
448
|
+
const code = parsed.charCodeAt(index);
|
|
449
|
+
if (code <= 0x20 || code >= 0x7f) {
|
|
450
|
+
throw new CodexDirectAuthError(`Codex ${label} cannot be used as a safe HTTP header value`, cause);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
return parsed;
|
|
454
|
+
}
|
|
455
|
+
function optionalBoundedString(value, label, maxBytes, cause) {
|
|
456
|
+
return value === undefined ? undefined : requireBoundedString(value, label, maxBytes, cause);
|
|
457
|
+
}
|
|
458
|
+
function validatedHeaders(headers) {
|
|
459
|
+
for (const value of Object.values(headers)) {
|
|
460
|
+
if (value.length === 0 || Buffer.byteLength(value, 'utf8') > MAX_TOKEN_BYTES) {
|
|
461
|
+
throw new CodexDirectAuthError('Codex request header is invalid', 'protocol');
|
|
462
|
+
}
|
|
463
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
464
|
+
const code = value.charCodeAt(index);
|
|
465
|
+
if ((code < 0x20 && code !== 0x09) || code >= 0x7f) {
|
|
466
|
+
throw new CodexDirectAuthError('Codex request header is unsafe', 'protocol');
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
return headers;
|
|
471
|
+
}
|
|
472
|
+
function createValidatedHeaders(factory) {
|
|
473
|
+
try {
|
|
474
|
+
return validatedHeaders(factory());
|
|
475
|
+
}
|
|
476
|
+
catch (error) {
|
|
477
|
+
if (error instanceof CodexDirectAuthError)
|
|
478
|
+
throw error;
|
|
479
|
+
throw new CodexDirectAuthError('Could not construct safe Codex request headers', 'protocol');
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
function credentialsChanged(left, right) {
|
|
483
|
+
return left.accessToken !== right.accessToken
|
|
484
|
+
|| left.refreshToken !== right.refreshToken
|
|
485
|
+
|| left.idToken !== right.idToken
|
|
486
|
+
|| left.accountId !== right.accountId;
|
|
487
|
+
}
|
|
488
|
+
function assertSameAccount(expected, candidate) {
|
|
489
|
+
if (candidate.accountId !== expected.accountId) {
|
|
490
|
+
throw new CodexDirectAuthError('Codex authentication account changed during unauthorized recovery');
|
|
491
|
+
}
|
|
492
|
+
return candidate;
|
|
493
|
+
}
|
|
494
|
+
function refreshFlightKey(path, snapshot) {
|
|
495
|
+
const hash = createHash('sha256');
|
|
496
|
+
for (const value of [path, snapshot.accessToken, snapshot.refreshToken, snapshot.idToken, snapshot.accountId]) {
|
|
497
|
+
hash.update(String(Buffer.byteLength(value, 'utf8')));
|
|
498
|
+
hash.update(':');
|
|
499
|
+
hash.update(value);
|
|
500
|
+
}
|
|
501
|
+
return hash.digest('hex');
|
|
502
|
+
}
|
|
503
|
+
function fingerprint(stat) {
|
|
504
|
+
return {
|
|
505
|
+
dev: stat.dev,
|
|
506
|
+
ino: stat.ino,
|
|
507
|
+
size: stat.size,
|
|
508
|
+
mtimeNs: stat.mtimeNs,
|
|
509
|
+
ctimeNs: stat.ctimeNs,
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
function sameFingerprint(left, right) {
|
|
513
|
+
return left.dev === right.dev
|
|
514
|
+
&& left.ino === right.ino
|
|
515
|
+
&& left.size === right.size
|
|
516
|
+
&& left.mtimeNs === right.mtimeNs
|
|
517
|
+
&& left.ctimeNs === right.ctimeNs;
|
|
518
|
+
}
|
|
519
|
+
function isRecord(value) {
|
|
520
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
521
|
+
}
|
|
522
|
+
async function readBoundedBody(response, maxBytes, signal) {
|
|
523
|
+
const reader = response.body?.getReader();
|
|
524
|
+
if (reader === undefined)
|
|
525
|
+
return '';
|
|
526
|
+
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
527
|
+
let total = 0;
|
|
528
|
+
let output = '';
|
|
529
|
+
try {
|
|
530
|
+
while (true) {
|
|
531
|
+
const part = await waitForSignal(reader.read(), signal);
|
|
532
|
+
if (part.done)
|
|
533
|
+
break;
|
|
534
|
+
total += part.value.byteLength;
|
|
535
|
+
if (total > maxBytes) {
|
|
536
|
+
throw new CodexDirectAuthError('Codex OAuth token refresh response exceeded its safety limit', 'protocol');
|
|
537
|
+
}
|
|
538
|
+
output += decoder.decode(part.value, { stream: true });
|
|
539
|
+
}
|
|
540
|
+
return output + decoder.decode();
|
|
541
|
+
}
|
|
542
|
+
catch (error) {
|
|
543
|
+
void reader.cancel().catch(() => { });
|
|
544
|
+
if (signal.aborted) {
|
|
545
|
+
throw new CodexDirectAuthError('Codex OAuth token refresh timed out', 'timeout');
|
|
546
|
+
}
|
|
547
|
+
if (error instanceof CodexDirectAuthError)
|
|
548
|
+
throw error;
|
|
549
|
+
throw new CodexDirectAuthError('Could not read the Codex OAuth token refresh response', 'protocol');
|
|
550
|
+
}
|
|
551
|
+
finally {
|
|
552
|
+
try {
|
|
553
|
+
reader.releaseLock();
|
|
554
|
+
}
|
|
555
|
+
catch { }
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
function discardBody(response) {
|
|
559
|
+
try {
|
|
560
|
+
void response.body?.cancel().catch(() => { });
|
|
561
|
+
}
|
|
562
|
+
catch { }
|
|
563
|
+
}
|
|
564
|
+
async function syncDirectory(path) {
|
|
565
|
+
const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_DIRECTORY);
|
|
566
|
+
try {
|
|
567
|
+
await handle.sync();
|
|
568
|
+
}
|
|
569
|
+
finally {
|
|
570
|
+
await handle.close();
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
function waitForSignal(promise, signal) {
|
|
574
|
+
if (signal.aborted)
|
|
575
|
+
return Promise.reject(signal.reason);
|
|
576
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
577
|
+
const aborted = () => rejectPromise(signal.reason);
|
|
578
|
+
signal.addEventListener('abort', aborted, { once: true });
|
|
579
|
+
void promise.then(resolvePromise, rejectPromise).finally(() => signal.removeEventListener('abort', aborted));
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
function requireRefreshTimeout(value) {
|
|
583
|
+
if (!Number.isSafeInteger(value) || value <= 0 || value > 2_147_483_647) {
|
|
584
|
+
throw new CodexDirectAuthError('Codex OAuth refresh timeout is invalid');
|
|
585
|
+
}
|
|
586
|
+
return value;
|
|
587
|
+
}
|
|
588
|
+
function ensurePosixSecuritySupport() {
|
|
589
|
+
if (process.platform === 'win32' || typeof process.getuid !== 'function') {
|
|
590
|
+
throw new CodexDirectAuthError('Codex direct authentication requires POSIX file permissions');
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
function currentUid() {
|
|
594
|
+
ensurePosixSecuritySupport();
|
|
595
|
+
return BigInt(process.getuid());
|
|
596
|
+
}
|
|
597
|
+
function throwIfCallerAborted(signal) {
|
|
598
|
+
if (signal.aborted)
|
|
599
|
+
throwCallerAbortReason(signal);
|
|
600
|
+
}
|
|
601
|
+
function throwCallerAbortReason(signal) {
|
|
602
|
+
throw signal.reason ?? new Error('Codex direct request aborted', { cause: 'abort' });
|
|
603
|
+
}
|
|
604
|
+
//# sourceMappingURL=codex-direct-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-direct-auth.js","sourceRoot":"","sources":["../src/codex-direct-auth.ts"],"names":[],"mappings":"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"}
|