fix: trim oauth env secrets before provider calls (#17)

This commit is contained in:
Felipe Domingues 2026-05-31 21:49:36 -03:00 committed by GitHub
parent 14810f57ff
commit 71f55de6b9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -75,12 +75,22 @@ async function logOAuthHttpFailure(
); );
} }
function readFirstEnv(keys: string[]): string { interface EnvLookupResult {
key: string | null;
value: string;
trimmed: boolean;
}
function readFirstEnv(keys: string[]): EnvLookupResult {
for (const key of keys) { for (const key of keys) {
const value = Deno.env.get(key); const value = Deno.env.get(key);
if (value) return value; if (!value) continue;
const trimmed = value.trim();
if (trimmed) return { key, value: trimmed, trimmed: trimmed !== value };
} }
return "";
return { key: null, value: "", trimmed: false };
} }
export function getProviderEnv(slug: ProviderSlug, redirectUri: string): ProviderEnv { export function getProviderEnv(slug: ProviderSlug, redirectUri: string): ProviderEnv {
@ -109,12 +119,23 @@ export function getProviderEnv(slug: ProviderSlug, redirectUri: string): Provide
const keys = map[slug]; const keys = map[slug];
const clientId = readFirstEnv(keys.id); const clientId = readFirstEnv(keys.id);
const clientSecret = readFirstEnv(keys.secret); const clientSecret = readFirstEnv(keys.secret);
if (!clientId || !clientSecret) { if (!clientId.value || !clientSecret.value) {
throw new Error( throw new Error(
`Credenciais OAuth ausentes para ${slug} (${keys.id.join(" ou ")}/${keys.secret.join(" ou ")})`, `Credenciais OAuth ausentes para ${slug} (${keys.id.join(" ou ")}/${keys.secret.join(" ou ")})`,
); );
} }
return { clientId, clientSecret, redirectUri };
console.info(
[
`oauth env selected provider=${slug}`,
`client_id_key=${clientId.key ?? "missing"}`,
`client_secret_key=${clientSecret.key ?? "missing"}`,
`client_id_trimmed=${String(clientId.trimmed)}`,
`client_secret_trimmed=${String(clientSecret.trimmed)}`,
].join(" "),
);
return { clientId: clientId.value, clientSecret: clientSecret.value, redirectUri };
} }
@ -493,8 +514,8 @@ export async function revokeToken(
} }
case "todoist": { case "todoist": {
// Todoist precisa client_id/secret + access_token no body // Todoist precisa client_id/secret + access_token no body
const clientId = readFirstEnv(["TODOIST_OAUTH_CLIENT_ID", "TODOIST_CLIENT_ID"]); const clientId = readFirstEnv(["TODOIST_OAUTH_CLIENT_ID", "TODOIST_CLIENT_ID"]).value;
const clientSecret = readFirstEnv(["TODOIST_OAUTH_CLIENT_SECRET", "TODOIST_CLIENT_SECRET"]); const clientSecret = readFirstEnv(["TODOIST_OAUTH_CLIENT_SECRET", "TODOIST_CLIENT_SECRET"]).value;
const body = new URLSearchParams({ const body = new URLSearchParams({
client_id: clientId, client_id: clientId,