Amélioration avec des fonctions d'un vrai dashboard automotive et containerisation du projet pour faciliter le déploiement

This commit is contained in:
Christian CUNAT-BRULE
2026-09-12 21:13:24 +02:00
parent d170f95c92
commit d8eb7f4375
31 changed files with 2233 additions and 65 deletions
+28
View File
@@ -0,0 +1,28 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import { normalizePreferences, safeWebUrl, wazeUrl } from '../ui/applications.js';
import { embedUrl } from '../ui/embeds.js';
test('launcher preferences migrate defaults and reject duplicate/unknown/hidden favorites', () => {
assert.deepEqual(normalizePreferences(null).favorites,['home','drive','map','music']);
const p=normalizePreferences({favorites:['youtube-music','youtube-music','invalid','spotify','home'],hidden:['spotify','invalid'],modes:{youtube:'same',spotify:'invalid'}});
assert.deepEqual(p.favorites,['youtube-music',null,null,null]);
assert.deepEqual(p.hidden,['spotify']); assert.equal(p.modes.youtube,'same'); assert.equal(p.modes.spotify,'new');
assert.deepEqual(normalizePreferences({favorites:[]}).favorites,[null,null,null,null]);
});
test('official embed URLs reject foreign origins and unsupported content',()=>{
assert.equal(embedUrl('spotify','https://open.spotify.com/playlist/abc123'),'https://open.spotify.com/embed/playlist/abc123');
assert.equal(embedUrl('spotify','https://open.spotify.com/'),'');
assert.equal(embedUrl('spotify','https://evil.example/playlist/abc123'),'');
assert.equal(embedUrl('youtube-music','https://music.youtube.com/watch?v=M7lc1UVf-VE'),'https://www.youtube.com/embed/M7lc1UVf-VE');
assert.equal(embedUrl('youtube-music','https://music.youtube.com/'),'');
assert.equal(embedUrl('stream','javascript:alert(1)'),'');
assert.equal(normalizePreferences({modes:{spotify:'embed',waze:'embed'}}).modes.spotify,'embed');
assert.equal(normalizePreferences({modes:{waze:'embed'}}).modes.waze,'new');
});
test('external links only allow web URLs and valid Waze destination coordinates', () => {
for (const value of ['javascript:alert(1)','file:///x','https://name:pass@example.org','bad']) assert.equal(safeWebUrl(value),'');
assert.equal(safeWebUrl('https://media.cunatbrule.fr/web/'),'https://media.cunatbrule.fr/web/');
const url = new URL(wazeUrl({lat:48.85,lon:2.35}));
assert.equal(url.searchParams.get('ll'),'48.85,2.35'); assert.equal(url.searchParams.get('navigate'),'yes');
assert.equal(new URL(wazeUrl({lat:NaN,lon:0})).searchParams.has('ll'),false);
});