Skip to content

Commit

Permalink
feat: Add support for multiple sets of expected env vars per repo sch…
Browse files Browse the repository at this point in the history
…eme (#90)
  • Loading branch information
dhilgarth authored Feb 14, 2024
1 parent ebf3d80 commit da0551c
Showing 1 changed file with 42 additions and 18 deletions.
60 changes: 42 additions & 18 deletions webui/src/views/AddRepoModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -451,11 +451,11 @@ export const AddRepoModal = ({
);
};

const expectedEnvVars: { [scheme: string]: string[] } = {
s3: ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"],
b2: ["B2_ACCOUNT_ID", "B2_ACCOUNT_KEY"],
azure: ["AZURE_ACCOUNT_NAME", "AZURE_ACCOUNT_KEY"],
gs: ["GOOGLE_APPLICATION_CREDENTIALS", "GOOGLE_PROJECT_ID"],
const expectedEnvVars: { [scheme: string]: string[][] } = {
s3: [["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"]],
b2: [["B2_ACCOUNT_ID", "B2_ACCOUNT_KEY"]],
azure: [["AZURE_ACCOUNT_NAME", "AZURE_ACCOUNT_KEY"], ["AZURE_ACCOUNT_NAME", "AZURE_ACCOUNT_SAS"]],
gs: [["GOOGLE_APPLICATION_CREDENTIALS", "GOOGLE_PROJECT_ID"], ["GOOGLE_ACCESS_TOKEN"]],
};

const envVarSetValidator = (form: FormInstance<FormData>, envVars: string[]) => {
Expand Down Expand Up @@ -500,31 +500,55 @@ const envVarSetValidator = (form: FormInstance<FormData>, envVars: string[]) =>
}

let scheme = uri.substring(0, schemeIdx);

return checkSchemeEnvVars(scheme, envVarNames);
};

const cryptoRandomPassword = (): string => {
let vals = crypto.getRandomValues(new Uint8Array(64));
// 48 chars is at least log2(64) * 48 = ~288 bits of entropy.
return btoa(String.fromCharCode(...vals)).slice(0, 48);
};

const checkSchemeEnvVars = (scheme: string, envVarNames: string[]): Promise<void> => {
let expected = expectedEnvVars[scheme];
if (!expected) {
return Promise.resolve();
}

let missing: string[] = [];
for (let e of expected) {
if (!envVarNames.includes(e)) {
missing.push(e);
const missingVarsCollection: string[][] = [];

for (let possibility of expected) {
const missingVars = possibility.filter(envVar => !envVarNames.includes(envVar));

// If no env vars are missing, we have a full match and are good
if (missingVars.length === 0) {
return Promise.resolve();
}

// First pass: Only add those missing vars from sets where at least one existing env var already exists
if (missingVars.length < possibility.length) {
missingVarsCollection.push(missingVars);
}
}

if (missing.length === 0) {
return Promise.resolve();
// If we didn't find any env var set with a partial match, then add all expected sets
if (!missingVarsCollection.length) {
missingVarsCollection.push(...expected);
}

return Promise.reject(
new Error(
"Missing env vars " + missing.join(", ") + " for scheme " + scheme
"Missing env vars " + formatMissingEnvVars(missingVarsCollection) + " for scheme " + scheme
)
);
};
}

const cryptoRandomPassword = (): string => {
let vals = crypto.getRandomValues(new Uint8Array(64));
// 48 chars is at least log2(64) * 48 = ~288 bits of entropy.
return btoa(String.fromCharCode(...vals)).slice(0, 48);
};
const formatMissingEnvVars = (partialMatches: string[][]): string => {
return partialMatches.map(x => {
if (x.length > 1) {
return `[ ${ x.join(", ") } ]`;
}
return x[0];
}).join(" or ");
}

0 comments on commit da0551c

Please sign in to comment.