Skip to content

Commit d8c3be9

Browse files
authored
feat: github action to run otp provider unit tests (#447)
* feat: github action for otp provider unit tests * fix: default value for cookie secrets * fix: warning about extra body parser * feat: update gh action trigger condition
1 parent 383eb70 commit d8c3be9

File tree

6 files changed

+85
-9
lines changed

6 files changed

+85
-9
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
name: Run OTP provider tests
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- dev
7+
paths:
8+
- 'docker/otp-provider'
9+
- '.github/workflows/otp-provider-tests.yml'
10+
11+
jobs:
12+
otp-provider-test:
13+
runs-on: ubuntu-24.04
14+
steps:
15+
- uses: actions/checkout@v4
16+
17+
- name: Get yarn cache directory path
18+
id: yarn-cache-dir-path
19+
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
20+
- name: Cache Node dependencies
21+
uses: actions/cache@v4
22+
id: yarn-cache
23+
with:
24+
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
25+
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
26+
restore-keys: ${{ runner.os }}-yarn-
27+
28+
- name: Install asdf requirements
29+
run: |
30+
sudo apt-get install -y libssl-dev libreadline-dev uuid-dev
31+
32+
- name: Install asdf
33+
uses: asdf-vm/actions/setup@v3
34+
- name: Cache asdf tools
35+
uses: actions/cache@v4
36+
with:
37+
path: |
38+
/home/runner/.asdf
39+
key: ${{ runner.os }}-${{ hashFiles('**/.tool-versions') }}
40+
41+
- name: Install asdf
42+
uses: asdf-vm/actions/install@v3
43+
44+
- name: Install app specific asdf plugins
45+
run: |
46+
cat .tool-versions | cut -f 1 -d ' ' | xargs -n 1 asdf plugin-add || true
47+
asdf plugin-update --all
48+
asdf install
49+
asdf reshim
50+
working-directory: ./docker/otp-provider
51+
52+
- name: Install dependencies
53+
run: yarn install
54+
working-directory: ./docker/otp-provider
55+
56+
- name: Setup postgres
57+
env:
58+
PGUSER: postgres
59+
run: |
60+
pg_ctl start
61+
createdb runner || true
62+
chmod +x ./db-setup.sh
63+
./db-setup.sh otp_test
64+
working-directory: ./docker/otp-provider/.bin
65+
66+
- name: Run unit tests
67+
run: |
68+
yarn test
69+
working-directory: ./docker/otp-provider

docker/otp-provider/.bin/db-setup.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/bin/bash
2+
if [[ -n "$1" ]]; then
3+
db="$1"
4+
else
5+
db="otp"
6+
fi
7+
8+
echo "SELECT 'CREATE DATABASE $db' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '$db')\gexec" | psql -U postgres -d postgres

docker/otp-provider/src/app.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,6 @@ if (NODE_ENV === 'production') {
4343
app.set('trust proxy', true);
4444
}
4545

46-
app.use(express.json());
47-
app.use(express.urlencoded({ extended: true }));
48-
4946
app.use(express.static(staticFolder + '/public'));
5047

5148
app.set('views', path.join(staticFolder, 'views'));

docker/otp-provider/src/config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,5 @@ export const config = {
2626
OTP_ATTEMPTS_ALLOWED: process.env.OTP_ATTEMPTS_ALLOWED || '5',
2727
OTP_RESENDS_ALLOWED_PER_DAY: process.env.OTP_RESENDS_ALLOWED_PER_DAY || '4',
2828
OTP_RESEND_INTERVAL_MINUTES: process.env.OTP_RESEND_INTERVAL_MINUTES || '[1,2,5,60]',
29-
COOKIE_SECRET: process.env.COOKIE_SECRET || 'default_secret',
29+
COOKIE_SECRETS: process.env.COOKIE_SECRETS || 's3cr3t1,s3cr3t1,s3cr3t2',
3030
};

docker/otp-provider/src/modules/oidc-provider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { isOrigin, hashEmail } from '../utils/helpers';
66
import { getClients } from './sequelize/queries/client';
77
import type { Response } from 'express';
88

9-
const { JWKS } = config;
9+
const { JWKS, COOKIE_SECRETS } = config;
1010

1111
const jwks = JWKS || {};
1212

@@ -27,7 +27,7 @@ export const getConfig = (): Configuration => {
2727
jwks,
2828
adapter: SequelizeAdapter,
2929
cookies: {
30-
keys: new Keygrip(process.env.COOKIE_SECRETS!?.split(','), 'sha256', 'base64'),
30+
keys: new Keygrip(COOKIE_SECRETS!?.split(','), 'sha256', 'base64'),
3131
},
3232
clientAuthMethods: ['client_secret_basic', 'client_secret_post', 'none'],
3333
issueRefreshToken() {

docker/otp-provider/src/routes/interaction.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
import express, { NextFunction, Request, Response } from 'express';
1+
import express, { NextFunction, Request, Response, urlencoded } from 'express';
22
import Provider from 'oidc-provider';
33
import { authorize, generateOtp, login, userConsent, abortLogin } from '../controllers/auth-controller';
44
import { setNoCache } from '../utils/helpers';
55
import { errors } from 'oidc-provider';
66
import logger from '../modules/winston.config';
77

8+
const body = urlencoded({ extended: false });
9+
810
export const oidcRouter = async (oidcProvider: Provider) => {
911
const oidcRouter = express.Router();
1012
oidcRouter.get('/:uid', setNoCache, await authorize(oidcProvider));
11-
oidcRouter.post('/:uid/otp', setNoCache, await generateOtp(oidcProvider));
12-
oidcRouter.post('/:uid/login', setNoCache, await login(oidcProvider));
13+
oidcRouter.post('/:uid/otp', setNoCache, body, await generateOtp(oidcProvider));
14+
oidcRouter.post('/:uid/login', setNoCache, body, await login(oidcProvider));
1315
oidcRouter.post('/:uid/confirm', setNoCache, await userConsent(oidcProvider));
1416
oidcRouter.post('/:uid/abort', await abortLogin(oidcProvider));
1517
oidcRouter.use((err: Error, req: Request, res: Response, next: NextFunction) => {

0 commit comments

Comments
 (0)