zerobyte/app/server/modules/notifications/notification-config-secrets.ts
Nicolas Meienberger aa23967329
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
fix: encrypt ntfy access token at rest
2026-03-20 20:37:51 +01:00

68 lines
1.8 KiB
TypeScript

import { cryptoUtils } from "~/server/utils/crypto";
import type { NotificationConfig } from "~/schemas/notifications";
type SecretTransformer = (value: string) => Promise<string>;
const transformOptionalSecret = async (value: string | undefined, transformSecret: SecretTransformer) => {
if (!value) {
return value;
}
return await transformSecret(value);
};
export const mapNotificationConfigSecrets = async (config: NotificationConfig, transformSecret: SecretTransformer) => {
switch (config.type) {
case "email":
return {
...config,
password: await transformOptionalSecret(config.password, transformSecret),
};
case "slack":
return {
...config,
webhookUrl: await transformSecret(config.webhookUrl),
};
case "discord":
return {
...config,
webhookUrl: await transformSecret(config.webhookUrl),
};
case "gotify":
return {
...config,
token: await transformSecret(config.token),
};
case "ntfy":
return {
...config,
password: await transformOptionalSecret(config.password, transformSecret),
accessToken: await transformOptionalSecret(config.accessToken, transformSecret),
};
case "pushover":
return {
...config,
apiToken: await transformSecret(config.apiToken),
};
case "telegram":
return {
...config,
botToken: await transformSecret(config.botToken),
};
case "custom":
return {
...config,
shoutrrrUrl: await transformSecret(config.shoutrrrUrl),
};
case "generic":
return config;
}
};
export const encryptNotificationConfig = async (config: NotificationConfig) => {
return await mapNotificationConfigSecrets(config, cryptoUtils.sealSecret);
};
export const decryptNotificationConfig = async (config: NotificationConfig) => {
return await mapNotificationConfigSecrets(config, cryptoUtils.resolveSecret);
};