fix: Empty environment variables should not trigger validations
Add deprecation notice for SLACK_KEY, SLACK_SECRET closes #3578
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user