173 lines
6.4 KiB
JavaScript
173 lines
6.4 KiB
JavaScript
// Generated, do not edit. sha256:ea3063d2dd3cc633da7f13f8cbd1705cc2b0b7e8797aeceebc91b788a0760522
|
|||
|
|
import { describe, it, beforeEach, afterEach } from 'node:test';
|
||
|
|
import assert from 'node:assert/strict';
|
||
|
|
import { mkdtemp, rm, readFile } from 'node:fs/promises';
|
||
|
|
import { tmpdir } from 'node:os';
|
||
|
|
import { join } from 'node:path';
|
||
|
|
|
||
|
|
import { credentialsStatus, setCredentials, clearCredentials, loadCredentials } from '../../server/auth.mjs';
|
||
|
|
import { writeActiveName } from '../../server/portfolios.mjs';
|
||
|
|
import { secretsFile, writeSecretsStore } from '../../server/keys.mjs';
|
||
|
|
|
||
|
|
let DIR;
|
||
|
|
let vorige;
|
||
|
|
let vorigeUser;
|
||
|
|
let vorigWachtwoord;
|
||
|
|
|
||
|
|
beforeEach(async () => {
|
||
|
|
vorige = process.env.ASSETAPP_DATA_DIR;
|
||
|
|
vorigeUser = process.env.ASSETAPP_USER;
|
||
|
|
vorigWachtwoord = process.env.ASSETAPP_PASSWORD;
|
||
|
|
delete process.env.ASSETAPP_USER;
|
||
|
|
delete process.env.ASSETAPP_PASSWORD;
|
||
|
|
DIR = await mkdtemp(join(tmpdir(), 'assetapp-auth-'));
|
||
|
|
process.env.ASSETAPP_DATA_DIR = DIR;
|
||
|
|
writeActiveName('Echt');
|
||
|
|
});
|
||
|
|
|
||
|
|
afterEach(async () => {
|
||
|
|
if (vorige === undefined) delete process.env.ASSETAPP_DATA_DIR; else process.env.ASSETAPP_DATA_DIR = vorige;
|
||
|
|
if (vorigeUser === undefined) delete process.env.ASSETAPP_USER; else process.env.ASSETAPP_USER = vorigeUser;
|
||
|
|
if (vorigWachtwoord === undefined) delete process.env.ASSETAPP_PASSWORD;
|
||
|
|
else process.env.ASSETAPP_PASSWORD = vorigWachtwoord;
|
||
|
|
await rm(DIR, { recursive: true, force: true });
|
||
|
|
});
|
||
|
|
|
||
|
|
const store = async () => JSON.parse(await readFile(secretsFile(), 'utf-8'));
|
||
|
|
|
||
|
|
describe('credentialsStatus', () => {
|
||
|
|
it('meldt "geen" als er niets staat', async () => {
|
||
|
|
assert.deepEqual(await credentialsStatus(), { ingesteld: false, bron: 'geen', wijzigbaar: true });
|
||
|
|
});
|
||
|
|
|
||
|
|
it('geeft het wachtwoord NOOIT terug', async () => {
|
||
|
|
await setCredentials('geheim');
|
||
|
|
const status = await credentialsStatus();
|
||
|
|
|
||
|
|
assert.equal(status.ingesteld, true);
|
||
|
|
assert.equal(JSON.stringify(status).includes('geheim'), false, 'het wachtwoord staat in de status');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('meldt de omgeving als bron, en dat het dan niet te wijzigen is', async () => {
|
||
|
|
process.env.ASSETAPP_PASSWORD = 'ook';
|
||
|
|
|
||
|
|
const status = await credentialsStatus();
|
||
|
|
assert.equal(status.bron, 'omgeving');
|
||
|
|
assert.equal(status.wijzigbaar, false);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('ZET DE TOEGANGSCONTROLE AAN met alleen ASSETAPP_PASSWORD', async () => {
|
||
|
|
process.env.ASSETAPP_PASSWORD = 'uit-de-omgeving';
|
||
|
|
|
||
|
|
assert.equal((await credentialsStatus()).ingesteld, true);
|
||
|
|
assert.deepEqual(await loadCredentials(), { password: 'uit-de-omgeving' });
|
||
|
|
});
|
||
|
|
|
||
|
|
it('negeert ASSETAPP_USER volledig', async () => {
|
||
|
|
process.env.ASSETAPP_USER = 'harmen';
|
||
|
|
|
||
|
|
assert.equal((await credentialsStatus()).ingesteld, false);
|
||
|
|
assert.equal(await loadCredentials(), null);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('telt een leeg wachtwoord in het bestand niet als slot', async () => {
|
||
|
|
await writeSecretsStore({ assetapp_auth: { password: '' } });
|
||
|
|
|
||
|
|
assert.equal((await credentialsStatus()).ingesteld, false);
|
||
|
|
assert.equal(await loadCredentials(), null);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('laat een BESTAANDE rij met een gebruikersnaam gewoon werken', async () => {
|
||
|
|
await writeSecretsStore({ assetapp_auth: { user: 'harmen', password: 'van-vroeger' } });
|
||
|
|
|
||
|
|
assert.equal((await credentialsStatus()).ingesteld, true);
|
||
|
|
assert.deepEqual(await loadCredentials(), { password: 'van-vroeger' });
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('setCredentials', () => {
|
||
|
|
it('zet het, en loadCredentials vindt het terug', async () => {
|
||
|
|
const uit = await setCredentials('geheim');
|
||
|
|
|
||
|
|
assert.equal(uit.ingesteld, true);
|
||
|
|
assert.equal(uit.naHerstart, true, 'de UI hoort te melden dat het pas na een herstart geldt');
|
||
|
|
assert.deepEqual(await loadCredentials(), { password: 'geheim' });
|
||
|
|
});
|
||
|
|
|
||
|
|
it('wijzigen is dezelfde handeling als aanmaken', async () => {
|
||
|
|
await setCredentials('eerste');
|
||
|
|
await setCredentials('tweede');
|
||
|
|
|
||
|
|
assert.deepEqual(await loadCredentials(), { password: 'tweede' });
|
||
|
|
});
|
||
|
|
|
||
|
|
it('weigert een leeg wachtwoord in plaats van het te bewaren', async () => {
|
||
|
|
await assert.rejects(() => setCredentials(''), (e) => e.key === 'portfolios.passwordRequired');
|
||
|
|
await assert.rejects(() => setCredentials(null), (e) => e.key === 'portfolios.passwordRequired');
|
||
|
|
await assert.rejects(() => setCredentials(undefined), (e) => e.key === 'portfolios.passwordRequired');
|
||
|
|
|
||
|
|
assert.equal((await credentialsStatus()).ingesteld, false, 'en er is niets bewaard');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('stelt GEEN eisen aan wat er wel in staat', async () => {
|
||
|
|
for (const w of ['a', ' ', '1234', 'áé€', 'x'.repeat(500)]) {
|
||
|
|
await setCredentials(w);
|
||
|
|
assert.deepEqual(await loadCredentials(), { password: w });
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
it('schrijft de rij ZONDER gebruikersnaam weg, ook als er een in stond', async () => {
|
||
|
|
await writeSecretsStore({ assetapp_auth: { user: 'harmen', password: 'van-vroeger' } });
|
||
|
|
|
||
|
|
await setCredentials('nieuw');
|
||
|
|
|
||
|
|
assert.deepEqual((await store()).assetapp_auth, { password: 'nieuw' });
|
||
|
|
});
|
||
|
|
|
||
|
|
it('laat de andere sleutels in het geheimenbestand ongemoeid', async () => {
|
||
|
|
await writeSecretsStore({ nwc_3: { uri: 'geheim' }, ai_handle_secret: 'a'.repeat(64) });
|
||
|
|
|
||
|
|
await setCredentials('geheim');
|
||
|
|
|
||
|
|
const s = await store();
|
||
|
|
assert.equal(s.nwc_3.uri, 'geheim');
|
||
|
|
assert.equal(s.ai_handle_secret, 'a'.repeat(64));
|
||
|
|
});
|
||
|
|
|
||
|
|
it('schrijft in het bestand van de ACTIEVE portefeuille', async () => {
|
||
|
|
await setCredentials('geheim');
|
||
|
|
writeActiveName('Demo');
|
||
|
|
|
||
|
|
assert.equal((await credentialsStatus()).ingesteld, false, 'Demo heeft zijn eigen toegangscontrole');
|
||
|
|
writeActiveName('Echt');
|
||
|
|
assert.equal((await credentialsStatus()).ingesteld, true);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('clearCredentials: de weg terug naar "alleen deze machine"', () => {
|
||
|
|
it('haalt het weg', async () => {
|
||
|
|
await setCredentials('geheim');
|
||
|
|
|
||
|
|
const uit = await clearCredentials();
|
||
|
|
|
||
|
|
assert.equal(uit.ingesteld, false);
|
||
|
|
assert.equal(uit.naHerstart, true);
|
||
|
|
assert.equal(await loadCredentials(), null);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('doet niets als er niets stond, en meldt dat ook zo', async () => {
|
||
|
|
const uit = await clearCredentials();
|
||
|
|
|
||
|
|
assert.equal(uit.ingesteld, false);
|
||
|
|
assert.equal(uit.naHerstart, false, 'er valt niets te herstarten voor een wijziging die er niet was');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('laat de andere sleutels staan', async () => {
|
||
|
|
await writeSecretsStore({ nwc_3: { uri: 'geheim' }, assetapp_auth: { password: 'w' } });
|
||
|
|
|
||
|
|
await clearCredentials();
|
||
|
|
|
||
|
|
const s = await store();
|
||
|
|
assert.deepEqual(Object.keys(s), ['nwc_3']);
|
||
|
|
});
|
||
|
|
});
|