1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-15 17:50:48 +02:00

fix: convert AUTH_TYPE to uppercase (#797)

Make sure we support both `AUTH_TYPE=demo` and `AUTH_TYPE=DEMO`

Co-authored-by: Christopher Kolstad <chriswk@getunleash.ai>
This commit is contained in:
Ivar Conradi Østhus 2021-04-22 15:04:08 +02:00 committed by GitHub
parent 7776f3c940
commit 185091174f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 64 additions and 33 deletions

View File

@ -16,6 +16,15 @@ import {
} from './types/option'; } from './types/option';
import { defaultLogProvider, validateLogProvider } from './logger'; import { defaultLogProvider, validateLogProvider } from './logger';
const safeToUpper = (s: string) => (s ? s.toUpperCase() : s);
export function authTypeFromString(
s?: string,
defaultType: IAuthType = IAuthType.OPEN_SOURCE,
): IAuthType {
return IAuthType[safeToUpper(s)] || defaultType;
}
function safeNumber(envVar, defaultVal): number { function safeNumber(envVar, defaultVal): number {
if (envVar) { if (envVar) {
try { try {
@ -86,12 +95,9 @@ const defaultVersionOption: IVersionOption = {
enable: safeBoolean(process.env.CHECK_VERSION, true), enable: safeBoolean(process.env.CHECK_VERSION, true),
}; };
const authType = (defaultType: IAuthType): IAuthType =>
IAuthType[process.env.AUTH_TYPE] || defaultType;
const defaultAuthentication: IAuthOption = { const defaultAuthentication: IAuthOption = {
enableApiToken: safeBoolean(process.env.AUTH_ENABLE_API_TOKEN, true), enableApiToken: safeBoolean(process.env.AUTH_ENABLE_API_TOKEN, true),
type: authType(IAuthType.OPEN_SOURCE), type: authTypeFromString(process.env.AUTH_TYPE),
customAuthHandler: () => {}, customAuthHandler: () => {},
createAdminUser: false, createAdminUser: false,
}; };
@ -119,7 +125,7 @@ const dbPort = (dbConfig: Partial<IDBOption>): Partial<IDBOption> => {
return dbConfig; return dbConfig;
}; };
function createConfig(options: IUnleashOptions): IUnleashConfig { export function createConfig(options: IUnleashOptions): IUnleashConfig {
let extraDbOptions = {}; let extraDbOptions = {};
if (options.databaseUrl) { if (options.databaseUrl) {
extraDbOptions = parse(options.databaseUrl); extraDbOptions = parse(options.databaseUrl);
@ -193,5 +199,7 @@ function createConfig(options: IUnleashOptions): IUnleashConfig {
}; };
} }
export default createConfig; module.exports = {
module.exports = createConfig; createConfig,
authTypeFromString,
};

View File

@ -6,7 +6,7 @@ import apiTokenMiddleware from './api-token-middleware';
import getLogger from '../../test/fixtures/no-logger'; import getLogger from '../../test/fixtures/no-logger';
import User from '../user'; import User from '../user';
import { CLIENT } from '../permissions'; import { CLIENT } from '../permissions';
import createConfig from '../create-config'; import { createTestConfig } from '../../test/config/test-config';
let config: any; let config: any;
@ -95,7 +95,7 @@ test('should not add user if disabled', async t => {
getUserForToken: sinon.fake.returns(apiUser), getUserForToken: sinon.fake.returns(apiUser),
}; };
const disabledConfig = createConfig({ const disabledConfig = createTestConfig({
getLogger, getLogger,
authentication: { authentication: {
enableApiToken: false, enableApiToken: false,

View File

@ -3,19 +3,18 @@ import test from 'ava';
import sinon from 'sinon'; import sinon from 'sinon';
import rbacMiddleware from './rbac-middleware'; import rbacMiddleware from './rbac-middleware';
import getLogger from '../../test/fixtures/no-logger';
import ffStore from '../../test/fixtures/fake-feature-toggle-store'; import ffStore from '../../test/fixtures/fake-feature-toggle-store';
import User from '../user'; import User from '../user';
import perms from '../permissions'; import perms from '../permissions';
import { IUnleashConfig } from '../types/option'; import { IUnleashConfig } from '../types/option';
import createConfig from '../create-config'; import { createTestConfig } from '../../test/config/test-config';
let config: IUnleashConfig; let config: IUnleashConfig;
let featureToggleStore: any; let featureToggleStore: any;
test.beforeEach(() => { test.beforeEach(() => {
featureToggleStore = ffStore(); featureToggleStore = ffStore();
config = createConfig({ getLogger }); config = createTestConfig();
}); });
test('should add checkRbac to request', t => { test('should add checkRbac to request', t => {

View File

@ -9,7 +9,7 @@ import getApp from './app';
import { createMetricsMonitor } from './metrics'; import { createMetricsMonitor } from './metrics';
import { createStores } from './db'; import { createStores } from './db';
import { createServices } from './services'; import { createServices } from './services';
import createConfig from './create-config'; import { createConfig } from './create-config';
import User from './user'; import User from './user';
import permissions from './permissions'; import permissions from './permissions';

View File

@ -41,6 +41,7 @@ export enum IAuthType {
CUSTOM = 'custom', CUSTOM = 'custom',
NONE = 'none', NONE = 'none',
} }
export interface IAuthOption { export interface IAuthOption {
enableApiToken: boolean; enableApiToken: boolean;
type: IAuthType; type: IAuthType;

View File

@ -1,7 +1,7 @@
'use strict'; 'use strict';
import unleash from './lib/server-impl'; import unleash from './lib/server-impl';
import createConfig from "./lib/create-config"; import { createConfig } from './lib/create-config';
unleash.start(createConfig({ unleash.start(createConfig({
db: { db: {

View File

@ -1,6 +1,6 @@
import test from 'ava'; import test from 'ava';
import createConfig from '../../lib/create-config'; import { createConfig, authTypeFromString } from '../../lib/create-config';
import { IDBOption } from '../../lib/types/option'; import { IAuthType, IDBOption } from '../../lib/types/option';
test('Should use DATABASE_URL from env', t => { test('Should use DATABASE_URL from env', t => {
const databaseUrl = 'postgres://u:p@localhost:5432/name'; const databaseUrl = 'postgres://u:p@localhost:5432/name';
@ -71,3 +71,28 @@ test('Can set baseUriPath', t => {
const config = createConfig({ server: { baseUriPath } }); const config = createConfig({ server: { baseUriPath } });
t.is(config.server.baseUriPath, baseUriPath); t.is(config.server.baseUriPath, baseUriPath);
}); });
test('can convert both upper and lowercase string to enum', t => {
t.is(authTypeFromString('demo'), IAuthType.DEMO);
t.is(authTypeFromString('DEMO'), IAuthType.DEMO);
t.is(authTypeFromString('DeMo'), IAuthType.DEMO);
t.is(authTypeFromString('open_source'), IAuthType.OPEN_SOURCE);
t.is(authTypeFromString('OPEN_SOURCE'), IAuthType.OPEN_SOURCE);
t.is(authTypeFromString('ENTERPRISE'), IAuthType.ENTERPRISE);
t.is(authTypeFromString('enterprise'), IAuthType.ENTERPRISE);
t.is(authTypeFromString('custom'), IAuthType.CUSTOM);
t.is(authTypeFromString('CUSTOM'), IAuthType.CUSTOM);
t.is(authTypeFromString('none'), IAuthType.NONE);
t.is(authTypeFromString('NONE'), IAuthType.NONE);
t.is(authTypeFromString('unknown-string'), IAuthType.OPEN_SOURCE);
});
test('Can set auth type programmatically with a string', t => {
const config = createConfig({
authentication: {
// @ts-ignore
type: 'demo',
},
});
t.is(config.authentication.type, IAuthType.DEMO);
});

View File

@ -6,7 +6,7 @@ import {
} from '../../lib/types/option'; } from '../../lib/types/option';
import getLogger from '../fixtures/no-logger'; import getLogger from '../fixtures/no-logger';
import createConfig from '../../lib/create-config'; import { createConfig } from '../../lib/create-config';
function mergeAll<T>(objects: Partial<T>[]): T { function mergeAll<T>(objects: Partial<T>[]): T {
return merge.all<T>(objects.filter(i => i)); return merge.all<T>(objects.filter(i => i));
@ -24,3 +24,7 @@ export function createTestConfig(config?: IUnleashOptions): IUnleashConfig {
const options = mergeAll<IUnleashOptions>([testConfig, config]); const options = mergeAll<IUnleashOptions>([testConfig, config]);
return createConfig(options); return createConfig(options);
} }
module.exports = {
createTestConfig,
};

View File

@ -12,12 +12,12 @@ import UserService from '../../../../lib/services/user-service';
import { setupApp } from '../../helpers/test-helper'; import { setupApp } from '../../helpers/test-helper';
import { EmailService } from '../../../../lib/services/email-service'; import { EmailService } from '../../../../lib/services/email-service';
import User from '../../../../lib/user'; import User from '../../../../lib/user';
import createConfig from '../../../../lib/create-config';
import { IUnleashConfig } from '../../../../lib/types/option'; import { IUnleashConfig } from '../../../../lib/types/option';
import { createTestConfig } from '../../../config/test-config';
let stores; let stores;
let db; let db;
const config: IUnleashConfig = createConfig({ const config: IUnleashConfig = createTestConfig({
getLogger, getLogger,
server: { server: {
unleashUrl: 'http://localhost:3000', unleashUrl: 'http://localhost:3000',

View File

@ -1,13 +1,11 @@
'use strict'; 'use strict';
import createConfig from '../../../lib/create-config';
const { EventEmitter } = require('events'); const { EventEmitter } = require('events');
const migrator = require('../../../migrator'); const migrator = require('../../../migrator');
const { createStores } = require('../../../lib/db'); const { createStores } = require('../../../lib/db');
const { createDb } = require('../../../lib/db/db-pool'); const { createDb } = require('../../../lib/db/db-pool');
const dbConfig = require('./database-config'); const dbConfig = require('./database-config');
const { createTestConfig } = require('../../config/test-config');
const dbState = require('./database.json'); const dbState = require('./database.json');
// require('db-migrate-shared').log.silence(false); // require('db-migrate-shared').log.silence(false);
@ -85,7 +83,7 @@ async function setupDatabase(stores) {
} }
export default async function init(databaseSchema = 'test', getLogger) { export default async function init(databaseSchema = 'test', getLogger) {
const config = createConfig({ const config = createTestConfig({
db: { db: {
...dbConfig.getDb(), ...dbConfig.getDb(),
pool: { min: 2, max: 8 }, pool: { min: 2, max: 8 },

View File

@ -3,15 +3,14 @@ import dbInit from '../helpers/database-init';
import getLogger from '../../fixtures/no-logger'; import getLogger from '../../fixtures/no-logger';
import { ApiTokenService } from '../../../lib/services/api-token-service'; import { ApiTokenService } from '../../../lib/services/api-token-service';
import { ApiTokenType, IApiToken } from '../../../lib/db/api-token-store'; import { ApiTokenType, IApiToken } from '../../../lib/db/api-token-store';
import createConfig from '../../../lib/create-config'; import { createTestConfig } from '../../config/test-config';
let db; let db;
let stores; let stores;
let apiTokenService: ApiTokenService; let apiTokenService: ApiTokenService;
test.before(async () => { test.before(async () => {
const config = createConfig({ const config = createTestConfig({
getLogger,
server: { baseUriPath: '/test' }, server: { baseUriPath: '/test' },
}); });
db = await dbInit('api_token_service_serial', getLogger); db = await dbInit('api_token_service_serial', getLogger);

View File

@ -8,11 +8,9 @@ import NotFoundError from '../../../lib/error/notfound-error';
import { EmailService } from '../../../lib/services/email-service'; import { EmailService } from '../../../lib/services/email-service';
import User from '../../../lib/user'; import User from '../../../lib/user';
import { IUnleashConfig } from '../../../lib/types/option'; import { IUnleashConfig } from '../../../lib/types/option';
import createConfig from '../../../lib/create-config'; import { createTestConfig } from '../../config/test-config';
const config: IUnleashConfig = createConfig({ const config: IUnleashConfig = createTestConfig();
getLogger,
});
let stores; let stores;
let db; let db;

View File

@ -8,8 +8,7 @@ import User from '../../../lib/user';
import { IRole } from '../../../lib/db/access-store'; import { IRole } from '../../../lib/db/access-store';
import ResetTokenService from '../../../lib/services/reset-token-service'; import ResetTokenService from '../../../lib/services/reset-token-service';
import { EmailService } from '../../../lib/services/email-service'; import { EmailService } from '../../../lib/services/email-service';
import { IAuthType } from '../../../lib/types/option'; import { createTestConfig } from '../../config/test-config';
import createConfig from '../../../lib/create-config';
let db; let db;
let stores; let stores;
@ -20,7 +19,7 @@ let adminRole: IRole;
test.before(async () => { test.before(async () => {
db = await dbInit('user_service_serial', getLogger); db = await dbInit('user_service_serial', getLogger);
stores = db.stores; stores = db.stores;
const config = createConfig({ getLogger }); const config = createTestConfig();
const accessService = new AccessService(stores, config); const accessService = new AccessService(stores, config);
const resetTokenService = new ResetTokenService(stores, config); const resetTokenService = new ResetTokenService(stores, config);
const emailService = new EmailService(undefined, config.getLogger); const emailService = new EmailService(undefined, config.getLogger);