Initial commit: restructure to flat layout with ui/ and web/ at root
This commit is contained in:
108
web/server/lib/quota/providers/google/auth.js
Normal file
108
web/server/lib/quota/providers/google/auth.js
Normal file
@@ -0,0 +1,108 @@
|
||||
/**
|
||||
* Google Provider - Auth
|
||||
*
|
||||
* Authentication resolution logic for Google quota providers.
|
||||
* @module quota/providers/google/auth
|
||||
*/
|
||||
|
||||
import {
|
||||
ANTIGRAVITY_ACCOUNTS_PATHS,
|
||||
readJsonFile,
|
||||
getAuthEntry,
|
||||
normalizeAuthEntry,
|
||||
asObject,
|
||||
asNonEmptyString,
|
||||
toTimestamp
|
||||
} from '../../utils/index.js';
|
||||
import { readAuthFile } from '../../../opencode/auth.js';
|
||||
import { parseGoogleRefreshToken } from './transforms.js';
|
||||
|
||||
const ANTIGRAVITY_GOOGLE_CLIENT_ID =
|
||||
'1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com';
|
||||
const ANTIGRAVITY_GOOGLE_CLIENT_SECRET = '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';
|
||||
const GEMINI_GOOGLE_CLIENT_ID =
|
||||
'681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com';
|
||||
const GEMINI_GOOGLE_CLIENT_SECRET = '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';
|
||||
export const DEFAULT_PROJECT_ID = 'rising-fact-p41fc';
|
||||
|
||||
export const resolveGoogleOAuthClient = (sourceId) => {
|
||||
if (sourceId === 'gemini') {
|
||||
return {
|
||||
clientId: GEMINI_GOOGLE_CLIENT_ID,
|
||||
clientSecret: GEMINI_GOOGLE_CLIENT_SECRET
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
clientId: ANTIGRAVITY_GOOGLE_CLIENT_ID,
|
||||
clientSecret: ANTIGRAVITY_GOOGLE_CLIENT_SECRET
|
||||
};
|
||||
};
|
||||
|
||||
export const resolveGeminiCliAuth = (auth) => {
|
||||
const entry = normalizeAuthEntry(getAuthEntry(auth, ['google', 'google.oauth']));
|
||||
const entryObject = asObject(entry);
|
||||
if (!entryObject) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const oauthObject = asObject(entryObject.oauth) ?? entryObject;
|
||||
const accessToken = asNonEmptyString(oauthObject.access) ?? asNonEmptyString(oauthObject.token);
|
||||
const refreshParts = parseGoogleRefreshToken(oauthObject.refresh);
|
||||
|
||||
if (!accessToken && !refreshParts.refreshToken) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
sourceId: 'gemini',
|
||||
sourceLabel: 'Gemini',
|
||||
accessToken,
|
||||
refreshToken: refreshParts.refreshToken,
|
||||
projectId: refreshParts.projectId ?? refreshParts.managedProjectId,
|
||||
expires: toTimestamp(oauthObject.expires)
|
||||
};
|
||||
};
|
||||
|
||||
export const resolveAntigravityAuth = () => {
|
||||
for (const filePath of ANTIGRAVITY_ACCOUNTS_PATHS) {
|
||||
const data = readJsonFile(filePath);
|
||||
const accounts = data?.accounts;
|
||||
if (Array.isArray(accounts) && accounts.length > 0) {
|
||||
const index = typeof data.activeIndex === 'number' ? data.activeIndex : 0;
|
||||
const account = accounts[index] ?? accounts[0];
|
||||
if (account?.refreshToken) {
|
||||
const refreshParts = parseGoogleRefreshToken(account.refreshToken);
|
||||
return {
|
||||
sourceId: 'antigravity',
|
||||
sourceLabel: 'Antigravity',
|
||||
refreshToken: refreshParts.refreshToken,
|
||||
projectId: asNonEmptyString(account.projectId)
|
||||
?? asNonEmptyString(account.managedProjectId)
|
||||
?? refreshParts.projectId
|
||||
?? refreshParts.managedProjectId,
|
||||
email: account.email
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
export const resolveGoogleAuthSources = () => {
|
||||
const auth = readAuthFile();
|
||||
const sources = [];
|
||||
|
||||
const geminiAuth = resolveGeminiCliAuth(auth);
|
||||
if (geminiAuth) {
|
||||
sources.push(geminiAuth);
|
||||
}
|
||||
|
||||
const antigravityAuth = resolveAntigravityAuth();
|
||||
if (antigravityAuth) {
|
||||
sources.push(antigravityAuth);
|
||||
}
|
||||
|
||||
return sources;
|
||||
};
|
||||
Reference in New Issue
Block a user