diff --git a/VERSION b/VERSION index 29a1e95..db2fa0b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.4.07-beta +0.4.08-beta diff --git a/public/js/core.js b/public/js/core.js index d3d3269..72bf329 100644 --- a/public/js/core.js +++ b/public/js/core.js @@ -2,7 +2,7 @@ "use strict"; /* version — shown until /api/version resolves (or if the fetch fails, e.g. offline). Kept in sync by hand with the VERSION file at the repo root on every release. */ -const VERSION = "0.4.07-beta"; +const VERSION = "0.4.08-beta"; (function(){ const tag = document.getElementById("verTag"); tag.textContent = "v"+VERSION; diff --git a/test/schools.test.js b/test/schools.test.js index ca758bb..18c8240 100644 --- a/test/schools.test.js +++ b/test/schools.test.js @@ -143,6 +143,43 @@ test('een bestaande groepsleiding of schoolbeheerder kan via rolwijziging nooit await app3.close(); }); +test('groepsleiding mag zelf geen rol wijzigen en geen school koppelen/losmaken', async () => { + // rolwijziging: users.role.change is alleen 'super'. Een groepsleiding die + // dit probeert op een niet-leerling-account wordt zelfs al eerder + // geweigerd (teacherOnly-check: groepsleiding beheert uitsluitend + // leerlingen), dus 403 - niet stilzwijgend genegeerd. + const teacherActor = { id: 5, username: 'juf', role: 'teacher', school_id: 2, class_id: null, data: {}, data_rev: 0 }; + const { app, calls } = await makeApp(teacherActor, { id: 7, role: 'teacher', school_id: 2 }); + const res = await app.inject({ method: 'PATCH', url: '/api/admin/users/7', cookies, + payload: { role: 'admin' } }); + assert.equal(res.statusCode, 403, res.body); + assert.ok(!calls.some((c) => c.sql.startsWith('UPDATE users SET role')), + 'groepsleiding mag geen rol van een ander account wijzigen'); + await app.close(); + // schoolId koppelen/losmaken: alleen systeemmanager (req.user.allRoles.includes('super')). + // Op een eigen leerling (waar een groepsleiding verder wél bij mag) blijft + // dit alsnog verboden, dus hier specifiek getest met een leerling-doel. + const { app: app2, calls: calls2 } = await makeApp(teacherActor, { id: 7, role: 'pupil', school_id: 2, class_id: 40 }); + const res2 = await app2.inject({ method: 'PATCH', url: '/api/admin/users/7', cookies, + payload: { schoolId: null } }); + assert.ok(!calls2.some((c) => c.sql.startsWith('UPDATE users SET school_id')), + 'groepsleiding mag een account niet van school koppelen/losmaken'); + await app2.close(); + // klassen aanmaken/koppelen: classes.manage is alleen super/admin + const { app: app3, calls: calls3 } = await makeApp(teacherActor, null); + const res3 = await app3.inject({ method: 'POST', url: '/api/admin/classes', cookies, + payload: { name: 'Nieuwe klas' } }); + assert.equal(res3.statusCode, 403, res3.body); + assert.ok(!calls3.some((c) => c.sql.startsWith('INSERT INTO classes'))); + await app3.close(); + // scholen beheren: schools.manage is alleen super + const { app: app4 } = await makeApp(teacherActor); + const res4 = await app4.inject({ method: 'PATCH', url: '/api/admin/schools/2', cookies, + payload: { name: 'Andere naam' } }); + assert.equal(res4.statusCode, 403, res4.body); + await app4.close(); +}); + test('systeemmanager koppelt een gebruiker aan een school en maakt hem weer los', async () => { // koppelen: school bestaat -> update + klas-/toewijzing-opruiming const { app, calls } = await makeApp(superUser, { id: 7, role: 'teacher', school_id: null, username: 'juf' });