Skip to content

Commit

Permalink
Add /os/v2/config endpoint for config.json migration
Browse files Browse the repository at this point in the history
  • Loading branch information
cywang117 committed Aug 29, 2023
1 parent 91fb0f4 commit 906d836
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 15 deletions.
48 changes: 33 additions & 15 deletions src/features/os-config/index.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,45 @@
import type { Application, RequestHandler } from 'express';
import type { Application } from 'express';

import {
DEVICE_CONFIG_OPENVPN_CA,
DEVICE_CONFIG_OPENVPN_CONFIG,
DEVICE_CONFIG_SSH_AUTHORIZED_KEYS,
LOGS_HOST,
} from '../../lib/config';
import { b64decode } from '../../lib/utils';

const getOsConfiguration: RequestHandler = (_req, res) => {
res.json({
services: {
openvpn: {
config: DEVICE_CONFIG_OPENVPN_CONFIG,
ca: b64decode(DEVICE_CONFIG_OPENVPN_CA),
},
ssh: {
authorized_keys: DEVICE_CONFIG_SSH_AUTHORIZED_KEYS,
},
},
schema_version: '1.0.0',
});
// OS service configurations
const services = {
openvpn: {
config: DEVICE_CONFIG_OPENVPN_CONFIG,
ca: b64decode(DEVICE_CONFIG_OPENVPN_CA),
},
ssh: {
authorized_keys: DEVICE_CONFIG_SSH_AUTHORIZED_KEYS,
},
};

// Config.json migrations: changes should be evaluated for security risks before applying.
const config = {
// config.json fields to add or change
update: {
logsEndpoint: LOGS_HOST != null ? `https://${LOGS_HOST}` : undefined,
},
// config.json fields to delete
delete: [],
};

export const setup = (app: Application) => {
app.get('/os/v1/config/', getOsConfiguration);
app.get('/os/v1/config/', (_req, res) => {
res.json({
services,
schema_version: '1.0.0',
});
});
app.get('/os/v2/config', (_req, res) => {
res.json({
services,
config,
});
});
};
35 changes: 35 additions & 0 deletions test/22_os-config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { expect } from 'chai';

import { supertest } from './test-lib/supertest';
import { LOGS_HOST } from '../src/lib/config';

describe('OS configuration endpoints', () => {
describe('/os/v1/config', () => {
it('should return a valid JSON response', async () => {
const { body } = await supertest().get('/os/v1/config').expect(200);

expect(body)
.to.have.property('services')
.that.has.all.keys('openvpn', 'ssh');
expect(body).to.have.property('schema_version').that.equals('1.0.0');
});
});

describe('/os/v2/config', () => {
it('should return a valid JSON response', async () => {
const { body } = await supertest().get('/os/v2/config').expect(200);

expect(body)
.to.have.property('services')
.that.has.all.keys('openvpn', 'ssh');
expect(body)
.to.have.property('config')
.that.deep.equals({
update: {
logsEndpoint: LOGS_HOST ? `https://${LOGS_HOST}` : undefined,
},
delete: [],
});
});
});
});

0 comments on commit 906d836

Please sign in to comment.