fix: Empty environment variables should not trigger validations

Add deprecation notice for SLACK_KEY, SLACK_SECRET
closes #3578
This commit is contained in:
Tom Moor
2022-05-23 21:37:27 +01:00
parent 51249fd6f7
commit ef5e3f0b29

View File

@@ -79,7 +79,9 @@ export class Environment {
allow_underscores: true, allow_underscores: true,
protocols: ["postgres"], protocols: ["postgres"],
}) })
public DATABASE_CONNECTION_POOL_URL = `${process.env.DATABASE_CONNECTION_POOL_URL}`; public DATABASE_CONNECTION_POOL_URL = this.toOptionalString(
process.env.DATABASE_CONNECTION_POOL_URL
);
/** /**
* Database connection pool configuration. * Database connection pool configuration.
@@ -136,7 +138,7 @@ export class Environment {
*/ */
@IsOptional() @IsOptional()
@IsUrl() @IsUrl()
public CDN_URL = process.env.CDN_URL; public CDN_URL = this.toOptionalString(process.env.CDN_URL);
/** /**
* The fully qualified, external facing domain name of the collaboration * The fully qualified, external facing domain name of the collaboration
@@ -144,7 +146,9 @@ export class Environment {
*/ */
@IsUrl({ require_tld: false, protocols: ["http", "https", "ws", "wss"] }) @IsUrl({ require_tld: false, protocols: ["http", "https", "ws", "wss"] })
@IsOptional() @IsOptional()
public COLLABORATION_URL = process.env.COLLABORATION_URL; public COLLABORATION_URL = this.toOptionalString(
process.env.COLLABORATION_URL
);
/** /**
* The port that the server will listen on, defaults to 3000. * The port that the server will listen on, defaults to 3000.
@@ -171,21 +175,21 @@ export class Environment {
*/ */
@IsOptional() @IsOptional()
@CannotUseWithout("SSL_CERT") @CannotUseWithout("SSL_CERT")
public SSL_KEY = process.env.SSL_KEY; public SSL_KEY = this.toOptionalString(process.env.SSL_KEY);
/** /**
* Base64 encoded public certificate if Outline is to perform SSL termination. * Base64 encoded public certificate if Outline is to perform SSL termination.
*/ */
@IsOptional() @IsOptional()
@CannotUseWithout("SSL_KEY") @CannotUseWithout("SSL_KEY")
public SSL_CERT = process.env.SSL_CERT; public SSL_CERT = this.toOptionalString(process.env.SSL_CERT);
/** /**
* Should always be left unset in a self-hosted environment. * Should always be left unset in a self-hosted environment.
*/ */
@Equals("hosted") @Equals("hosted")
@IsOptional() @IsOptional()
public DEPLOYMENT = process.env.DEPLOYMENT; public DEPLOYMENT = this.toOptionalString(process.env.DEPLOYMENT);
/** /**
* Custom company logo that displays on the authentication screen. * Custom company logo that displays on the authentication screen.
@@ -276,7 +280,7 @@ export class Environment {
*/ */
@IsEmail({ allow_display_name: true, allow_ip_domain: true }) @IsEmail({ allow_display_name: true, allow_ip_domain: true })
@IsOptional() @IsOptional()
public SMTP_FROM_EMAIL = process.env.SMTP_FROM_EMAIL; public SMTP_FROM_EMAIL = this.toOptionalString(process.env.SMTP_FROM_EMAIL);
/** /**
* The reply-to address for emails sent from Outline. If unset the from * The reply-to address for emails sent from Outline. If unset the from
@@ -284,12 +288,12 @@ export class Environment {
*/ */
@IsEmail({ allow_display_name: true, allow_ip_domain: true }) @IsEmail({ allow_display_name: true, allow_ip_domain: true })
@IsOptional() @IsOptional()
public SMTP_REPLY_EMAIL = process.env.SMTP_REPLY_EMAIL; public SMTP_REPLY_EMAIL = this.toOptionalString(process.env.SMTP_REPLY_EMAIL);
/** /**
* Override the cipher used for SMTP SSL connections. * Override the cipher used for SMTP SSL connections.
*/ */
public SMTP_TLS_CIPHERS = process.env.SMTP_TLS_CIPHERS; public SMTP_TLS_CIPHERS = this.toOptionalString(process.env.SMTP_TLS_CIPHERS);
/** /**
* If true (the default) the connection will use TLS when connecting to server. * If true (the default) the connection will use TLS when connecting to server.
@@ -305,12 +309,12 @@ export class Environment {
*/ */
@IsUrl() @IsUrl()
@IsOptional() @IsOptional()
public SENTRY_DSN = process.env.SENTRY_DSN; public SENTRY_DSN = this.toOptionalString(process.env.SENTRY_DSN);
/** /**
* A release SHA or other identifier for Sentry. * A release SHA or other identifier for Sentry.
*/ */
public RELEASE = process.env.RELEASE; public RELEASE = this.toOptionalString(process.env.RELEASE);
/** /**
* An optional host from which to load default avatars. * An optional host from which to load default avatars.
@@ -324,7 +328,9 @@ export class Environment {
*/ */
@Contains("UA-") @Contains("UA-")
@IsOptional() @IsOptional()
public GOOGLE_ANALYTICS_ID = process.env.GOOGLE_ANALYTICS_ID; public GOOGLE_ANALYTICS_ID = this.toOptionalString(
process.env.GOOGLE_ANALYTICS_ID
);
/** /**
* A DataDog API key for tracking server metrics. * A DataDog API key for tracking server metrics.
@@ -336,37 +342,52 @@ export class Environment {
*/ */
@IsOptional() @IsOptional()
@CannotUseWithout("GOOGLE_CLIENT_SECRET") @CannotUseWithout("GOOGLE_CLIENT_SECRET")
public GOOGLE_CLIENT_ID = process.env.GOOGLE_CLIENT_ID; public GOOGLE_CLIENT_ID = this.toOptionalString(process.env.GOOGLE_CLIENT_ID);
@IsOptional() @IsOptional()
@CannotUseWithout("GOOGLE_CLIENT_ID") @CannotUseWithout("GOOGLE_CLIENT_ID")
public GOOGLE_CLIENT_SECRET = process.env.GOOGLE_CLIENT_SECRET; public GOOGLE_CLIENT_SECRET = this.toOptionalString(
process.env.GOOGLE_CLIENT_SECRET
);
/** /**
* Slack OAuth2 client credentials. To enable authentication with Slack. * Slack OAuth2 client credentials. To enable authentication with Slack.
*/ */
@IsOptional()
@Deprecated("Use SLACK_CLIENT_SECRET instead")
public SLACK_SECRET = this.toOptionalString(process.env.SLACK_SECRET);
@IsOptional()
@Deprecated("Use SLACK_CLIENT_ID instead")
public SLACK_KEY = this.toOptionalString(process.env.SLACK_KEY);
@IsOptional() @IsOptional()
@CannotUseWithout("SLACK_CLIENT_SECRET") @CannotUseWithout("SLACK_CLIENT_SECRET")
public SLACK_CLIENT_ID = process.env.SLACK_CLIENT_ID ?? process.env.SLACK_KEY; public SLACK_CLIENT_ID = this.toOptionalString(
process.env.SLACK_CLIENT_ID ?? process.env.SLACK_KEY
);
@IsOptional() @IsOptional()
@CannotUseWithout("SLACK_CLIENT_ID") @CannotUseWithout("SLACK_CLIENT_ID")
public SLACK_CLIENT_SECRET = public SLACK_CLIENT_SECRET = this.toOptionalString(
process.env.SLACK_CLIENT_SECRET ?? process.env.SLACK_SECRET; process.env.SLACK_CLIENT_SECRET ?? process.env.SLACK_SECRET
);
/** /**
* This is injected into the HTML page headers for Slack. * This is injected into the HTML page headers for Slack.
*/ */
@IsOptional() @IsOptional()
@CannotUseWithout("SLACK_CLIENT_ID") @CannotUseWithout("SLACK_CLIENT_ID")
public SLACK_VERIFICATION_TOKEN = process.env.SLACK_VERIFICATION_TOKEN; public SLACK_VERIFICATION_TOKEN = this.toOptionalString(
process.env.SLACK_VERIFICATION_TOKEN
);
/** /**
* This is injected into the slack-app-id header meta tag if provided. * This is injected into the slack-app-id header meta tag if provided.
*/ */
@IsOptional() @IsOptional()
@CannotUseWithout("SLACK_CLIENT_ID") @CannotUseWithout("SLACK_CLIENT_ID")
public SLACK_APP_ID = process.env.SLACK_APP_ID; public SLACK_APP_ID = this.toOptionalString(process.env.SLACK_APP_ID);
/** /**
* If enabled a "Post to Channel" button will be added to search result * If enabled a "Post to Channel" button will be added to search result
@@ -383,15 +404,19 @@ export class Environment {
*/ */
@IsOptional() @IsOptional()
@CannotUseWithout("AZURE_CLIENT_SECRET") @CannotUseWithout("AZURE_CLIENT_SECRET")
public AZURE_CLIENT_ID = process.env.AZURE_CLIENT_ID; public AZURE_CLIENT_ID = this.toOptionalString(process.env.AZURE_CLIENT_ID);
@IsOptional() @IsOptional()
@CannotUseWithout("AZURE_CLIENT_ID") @CannotUseWithout("AZURE_CLIENT_ID")
public AZURE_CLIENT_SECRET = process.env.AZURE_CLIENT_SECRET; public AZURE_CLIENT_SECRET = this.toOptionalString(
process.env.AZURE_CLIENT_SECRET
);
@IsOptional() @IsOptional()
@CannotUseWithout("AZURE_CLIENT_ID") @CannotUseWithout("AZURE_CLIENT_ID")
public AZURE_RESOURCE_APP_ID = process.env.AZURE_RESOURCE_APP_ID; public AZURE_RESOURCE_APP_ID = this.toOptionalString(
process.env.AZURE_RESOURCE_APP_ID
);
/** /**
* OICD client credentials. To enable authentication with any * OICD client credentials. To enable authentication with any
@@ -403,11 +428,13 @@ export class Environment {
@CannotUseWithout("OIDC_TOKEN_URI") @CannotUseWithout("OIDC_TOKEN_URI")
@CannotUseWithout("OIDC_USERINFO_URI") @CannotUseWithout("OIDC_USERINFO_URI")
@CannotUseWithout("OIDC_DISPLAY_NAME") @CannotUseWithout("OIDC_DISPLAY_NAME")
public OIDC_CLIENT_ID = process.env.OIDC_CLIENT_ID; public OIDC_CLIENT_ID = this.toOptionalString(process.env.OIDC_CLIENT_ID);
@IsOptional() @IsOptional()
@CannotUseWithout("OIDC_CLIENT_ID") @CannotUseWithout("OIDC_CLIENT_ID")
public OIDC_CLIENT_SECRET = process.env.OIDC_CLIENT_SECRET; public OIDC_CLIENT_SECRET = this.toOptionalString(
process.env.OIDC_CLIENT_SECRET
);
/** /**
* The name of the OIDC provider, eg "GitLab" this will be displayed on the * The name of the OIDC provider, eg "GitLab" this will be displayed on the
@@ -422,21 +449,23 @@ export class Environment {
*/ */
@IsOptional() @IsOptional()
@IsUrl() @IsUrl()
public OIDC_AUTH_URI = process.env.OIDC_AUTH_URI; public OIDC_AUTH_URI = this.toOptionalString(process.env.OIDC_AUTH_URI);
/** /**
* The OIDC token endpoint. * The OIDC token endpoint.
*/ */
@IsOptional() @IsOptional()
@IsUrl() @IsUrl()
public OIDC_TOKEN_URI = process.env.OIDC_TOKEN_URI; public OIDC_TOKEN_URI = this.toOptionalString(process.env.OIDC_TOKEN_URI);
/** /**
* The OIDC userinfo endpoint. * The OIDC userinfo endpoint.
*/ */
@IsOptional() @IsOptional()
@IsUrl() @IsUrl()
public OIDC_USERINFO_URI = process.env.OIDC_USERINFO_URI; public OIDC_USERINFO_URI = this.toOptionalString(
process.env.OIDC_USERINFO_URI
);
/** /**
* The OIDC profile field to use as the username. The default value is * The OIDC profile field to use as the username. The default value is
@@ -451,6 +480,10 @@ export class Environment {
*/ */
public OIDC_SCOPES = process.env.OIDC_SCOPES ?? "openid profile email"; public OIDC_SCOPES = process.env.OIDC_SCOPES ?? "openid profile email";
private toOptionalString(value: string | undefined) {
return value ? value : undefined;
}
private toOptionalNumber(value: string | undefined) { private toOptionalNumber(value: string | undefined) {
return value ? parseInt(value, 10) : undefined; return value ? parseInt(value, 10) : undefined;
} }