Release v2.17.1: remove obsolete dashboard permission
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile, web, pulse-signage-web) (push) Successful in 1m9s
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile.player, player, pulse-signage-player) (push) Successful in 31s

This commit is contained in:
lzstealth committed 2026-10-23 02:07:47 +01:00
1 parent 3ce4f70601
commit 6ce70ad7cb
7 files changed
+54 -6

No files matched your search

+6
View File
@@ -2,6 +2,12 @@
All notable changes to this project will be documented in this file.
## 2.17.1 - 2026-10-23
### Fixed
- Removed the obsolete `dashboard.allow` permission and its role assignments from existing databases so it no longer appears in role permissions.
## 2.17.0 - 2026-10-23
### Added
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "pulse-signage-player",
"version": "2.17.0",
"version": "2.17.1",
"private": false,
"description": "Pulse Signage player application bundle",
"engines": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "pulse-signage-web",
"version": "2.17.0",
"version": "2.17.1",
"private": false,
"description": "Pulse Signage web and bridge application bundle",
"engines": {
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "pulse-signage",
"version": "2.17.0",
"version": "2.17.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "pulse-signage",
"version": "2.17.0",
"version": "2.17.1",
"dependencies": {
"animate.css": "^4.1.1",
"bootstrap-icons": "1.13.1",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "pulse-signage",
"version": "2.17.0",
"version": "2.17.1",
"private": false,
"description": "Pulse Signage application with MySQL and media storage",
"engines": {
+14
View File
@@ -732,6 +732,20 @@ const VERSIONED_MIGRATIONS = [
await ensureColumn(pool, 'a_sessions', 'view_as_user_id', 'INT NULL', 'user_id');
await ensureColumn(pool, 'a_sessions', 'view_as_expires_at', 'DATETIME NULL', 'view_as_user_id');
}
},
{
version: '2.17.1',
label: 'v2.17.1 remove obsolete dashboard permission',
run: async function (pool) {
await pool.query(
`DELETE role_permissions
FROM a_role_permissions role_permissions
JOIN a_permissions permissions ON permissions.id = role_permissions.permission_id
WHERE permissions.permission_key = ?`,
['dashboard.allow']
);
await pool.query('DELETE FROM a_permissions WHERE permission_key = ?', ['dashboard.allow']);
}
}
];
+29 -1
View File
@@ -161,7 +161,7 @@ test('2.17.0 migration adds the expiring view-as session columns', async () => {
]);
const pending = await getPendingMigrations(pool, { currentVersion: '2.16.2' });
assert.deepEqual(pending.map(function (migration) { return migration.version; }), ['2.17.0']);
assert.deepEqual(pending.map(function (migration) { return migration.version; }), ['2.17.0', '2.17.1']);
await pending[0].run(pool);
assert.ok(pool.queries.some(function ([sql]) {
@@ -170,4 +170,32 @@ test('2.17.0 migration adds the expiring view-as session columns', async () => {
assert.ok(pool.queries.some(function ([sql]) {
return String(sql).includes('ALTER TABLE a_sessions ADD COLUMN view_as_expires_at DATETIME NULL AFTER view_as_user_id');
}));
});
test('2.17.1 migration removes obsolete dashboard.allow grants and permission', async () => {
const pool = createPool([
{
match(sql) {
return sql.includes('FROM information_schema.COLUMNS');
},
result: [[{ column_count: 1 }]]
},
{
match(sql) {
return sql.includes('FROM information_schema.TABLES');
},
result: [[{ table_count: 0 }]]
}
]);
const pending = await getPendingMigrations(pool, { currentVersion: '2.17.0' });
assert.deepEqual(pending.map(function (migration) { return migration.version; }), ['2.17.1']);
await pending[0].run(pool);
assert.ok(pool.queries.some(function ([sql, params]) {
return String(sql).includes('DELETE role_permissions') && params[0] === 'dashboard.allow';
}));
assert.ok(pool.queries.some(function ([sql, params]) {
return String(sql).includes('DELETE FROM a_permissions') && params[0] === 'dashboard.allow';
}));
});