70 lines
2.1 KiB
JavaScript
70 lines
2.1 KiB
JavaScript
// @ts-check
|
|
|
|
import { renderError } from "./render.js";
|
|
import { blacklist } from "./blacklist.js";
|
|
import { whitelist, gistWhitelist } from "./envs.js";
|
|
|
|
const NOT_WHITELISTED_USERNAME_MESSAGE = "This username is not whitelisted";
|
|
const NOT_WHITELISTED_GIST_MESSAGE = "This gist ID is not whitelisted";
|
|
const BLACKLISTED_MESSAGE = "This username is blacklisted";
|
|
|
|
/**
|
|
* Guards access using whitelist/blacklist.
|
|
*
|
|
* @param {Object} args The parameters object.
|
|
* @param {any} args.res The response object.
|
|
* @param {string} args.id Resource identifier (username or gist id).
|
|
* @param {"username"|"gist"|"wakatime"} args.type The type of identifier.
|
|
* @param {{ title_color?: string, text_color?: string, bg_color?: string, border_color?: string, theme?: string }} args.colors Color options for the error card.
|
|
* @returns {{ isPassed: boolean, result?: any }} The result object indicating success or failure.
|
|
*/
|
|
const guardAccess = ({ res, id, type, colors }) => {
|
|
if (!["username", "gist", "wakatime"].includes(type)) {
|
|
throw new Error(
|
|
'Invalid type. Expected "username", "gist", or "wakatime".',
|
|
);
|
|
}
|
|
|
|
const currentWhitelist = type === "gist" ? gistWhitelist : whitelist;
|
|
const notWhitelistedMsg =
|
|
type === "gist"
|
|
? NOT_WHITELISTED_GIST_MESSAGE
|
|
: NOT_WHITELISTED_USERNAME_MESSAGE;
|
|
|
|
if (Array.isArray(currentWhitelist) && !currentWhitelist.includes(id)) {
|
|
const result = res.send(
|
|
renderError({
|
|
message: notWhitelistedMsg,
|
|
secondaryMessage: "Please deploy your own instance",
|
|
renderOptions: {
|
|
...colors,
|
|
show_repo_link: false,
|
|
},
|
|
}),
|
|
);
|
|
return { isPassed: false, result };
|
|
}
|
|
|
|
if (
|
|
type === "username" &&
|
|
currentWhitelist === undefined &&
|
|
blacklist.includes(id)
|
|
) {
|
|
const result = res.send(
|
|
renderError({
|
|
message: BLACKLISTED_MESSAGE,
|
|
secondaryMessage: "Please deploy your own instance",
|
|
renderOptions: {
|
|
...colors,
|
|
show_repo_link: false,
|
|
},
|
|
}),
|
|
);
|
|
return { isPassed: false, result };
|
|
}
|
|
|
|
return { isPassed: true };
|
|
};
|
|
|
|
export { guardAccess };
|