diff --git a/packages/hoppscotch-backend/src/auth/guards/github-sso.guard.ts b/packages/hoppscotch-backend/src/auth/guards/github-sso.guard.ts index 744bb3935..1bf00bc6d 100644 --- a/packages/hoppscotch-backend/src/auth/guards/github-sso.guard.ts +++ b/packages/hoppscotch-backend/src/auth/guards/github-sso.guard.ts @@ -2,6 +2,7 @@ import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { AuthProvider, authProviderCheck, throwHTTPErr } from '../helper'; import { Observable } from 'rxjs'; +import { AUTH_PROVIDER_NOT_SPECIFIED } from 'src/errors'; @Injectable() export class GithubSSOGuard extends AuthGuard('github') implements CanActivate { @@ -9,7 +10,7 @@ export class GithubSSOGuard extends AuthGuard('github') implements CanActivate { context: ExecutionContext, ): boolean | Promise | Observable { if (!authProviderCheck(AuthProvider.GITHUB)) - throwHTTPErr({ message: 'GitHub auth is not enabled', statusCode: 404 }); + throwHTTPErr({ message: AUTH_PROVIDER_NOT_SPECIFIED, statusCode: 404 }); return super.canActivate(context); } diff --git a/packages/hoppscotch-backend/src/auth/guards/google-sso.guard.ts b/packages/hoppscotch-backend/src/auth/guards/google-sso.guard.ts index 437c2785a..c1f2c3b78 100644 --- a/packages/hoppscotch-backend/src/auth/guards/google-sso.guard.ts +++ b/packages/hoppscotch-backend/src/auth/guards/google-sso.guard.ts @@ -2,6 +2,7 @@ import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { AuthProvider, authProviderCheck, throwHTTPErr } from '../helper'; import { Observable } from 'rxjs'; +import { AUTH_PROVIDER_NOT_SPECIFIED } from 'src/errors'; @Injectable() export class GoogleSSOGuard extends AuthGuard('google') implements CanActivate { @@ -9,7 +10,7 @@ export class GoogleSSOGuard extends AuthGuard('google') implements CanActivate { context: ExecutionContext, ): boolean | Promise | Observable { if (!authProviderCheck(AuthProvider.GOOGLE)) - throwHTTPErr({ message: 'Google auth is not enabled', statusCode: 404 }); + throwHTTPErr({ message: AUTH_PROVIDER_NOT_SPECIFIED, statusCode: 404 }); return super.canActivate(context); } diff --git a/packages/hoppscotch-backend/src/auth/guards/microsoft-sso-.guard.ts b/packages/hoppscotch-backend/src/auth/guards/microsoft-sso-.guard.ts index 18e9691d4..c3a1db17b 100644 --- a/packages/hoppscotch-backend/src/auth/guards/microsoft-sso-.guard.ts +++ b/packages/hoppscotch-backend/src/auth/guards/microsoft-sso-.guard.ts @@ -2,6 +2,7 @@ import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { AuthProvider, authProviderCheck, throwHTTPErr } from '../helper'; import { Observable } from 'rxjs'; +import { AUTH_PROVIDER_NOT_SPECIFIED } from 'src/errors'; @Injectable() export class MicrosoftSSOGuard @@ -13,7 +14,7 @@ export class MicrosoftSSOGuard ): boolean | Promise | Observable { if (!authProviderCheck(AuthProvider.MICROSOFT)) throwHTTPErr({ - message: 'Microsoft auth is not enabled', + message: AUTH_PROVIDER_NOT_SPECIFIED, statusCode: 404, }); diff --git a/packages/hoppscotch-backend/src/auth/helper.ts b/packages/hoppscotch-backend/src/auth/helper.ts index 35cf55d62..3c87a045e 100644 --- a/packages/hoppscotch-backend/src/auth/helper.ts +++ b/packages/hoppscotch-backend/src/auth/helper.ts @@ -117,9 +117,11 @@ export function authProviderCheck(provider: string) { throwErr(AUTH_PROVIDER_NOT_SPECIFIED); } - const envVariables = process.env.ALLOWED_AUTH_PROVIDERS.split(',').map( - (provider) => provider.trim().toUpperCase(), - ); + const envVariables = process.env.ALLOWED_AUTH_PROVIDERS + ? process.env.ALLOWED_AUTH_PROVIDERS.split(',').map((provider) => + provider.trim().toUpperCase(), + ) + : []; if (!envVariables.includes(provider.toUpperCase())) return false; diff --git a/packages/hoppscotch-backend/src/main.ts b/packages/hoppscotch-backend/src/main.ts index 5515e804b..e5b27af88 100644 --- a/packages/hoppscotch-backend/src/main.ts +++ b/packages/hoppscotch-backend/src/main.ts @@ -5,12 +5,32 @@ import * as cookieParser from 'cookie-parser'; import { VersioningType } from '@nestjs/common'; import * as session from 'express-session'; import { emitGQLSchemaFile } from './gql-schema'; +import { AuthProvider } from './auth/helper'; -function checkRequiredEnvVars(requiredEnvVariables: string[]) { - for (const envVar of requiredEnvVariables) { - if (!process.env[envVar]) { - console.error(`Environment variable "${envVar}" is missing or not set.`); - process.exit(1); // Exit the application with a non-zero status code to indicate an error +function checkEnvironmentAuthProvider() { + if (!process.env.hasOwnProperty('ALLOWED_AUTH_PROVIDERS')) { + console.log(`"ALLOWED_AUTH_PROVIDERS" is not present in .env file`); + process.exit(1); + } + + if (process.env.ALLOWED_AUTH_PROVIDERS === '') { + console.log(`"ALLOWED_AUTH_PROVIDERS" is empty in .env file`); + process.exit(1); + } + + const givenAuthProviders = process.env.ALLOWED_AUTH_PROVIDERS.split(',').map( + (provider) => provider.toLocaleUpperCase(), + ); + const supportedAuthProviders = Object.values(AuthProvider).map( + (provider: string) => provider.toLocaleUpperCase(), + ); + + for (const givenAuthProvider of givenAuthProviders) { + if (!supportedAuthProviders.includes(givenAuthProvider)) { + console.error( + `Environment variable "ALLOWED_AUTH_PROVIDERS" contains an unsupported auth provider "${givenAuthProvider}".`, + ); + process.exit(1); } } } @@ -19,7 +39,7 @@ async function bootstrap() { console.log(`Running in production: ${process.env.PRODUCTION}`); console.log(`Port: ${process.env.PORT}`); - checkRequiredEnvVars(['ALLOWED_AUTH_PROVIDERS']); + checkEnvironmentAuthProvider(); const app = await NestFactory.create(AppModule);