iobroker.eos-admin 7.9.89 → 7.9.92
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INSTALL_TEST_V7.9.92.md +18 -0
- package/NEXOWATT_EOS_BUILD_INFO.json +19 -25
- package/PUBLISH_STABLE_V7.9.92.md +19 -0
- package/README_STABILITY_V7.9.92.md +14 -0
- package/RELEASE_ACCEPTANCE_V7.9.92.md +12 -0
- package/RELEASE_NOTES_V7.9.92.md +17 -0
- package/adminWww/assets/Instances-YdaGnS5a-v84.js +1 -1
- package/adminWww/css/nexowatt-native-shell.css +151 -12
- package/adminWww/index.html +11 -11
- package/adminWww/js/eos-account-management.js +1 -1
- package/adminWww/js/eos-assistant.js +1 -1
- package/adminWww/js/eos-basic-settings.js +1 -1
- package/adminWww/js/eos-branding-sanitizer.js +1 -1
- package/adminWww/js/eos-native-security.js +1 -1
- package/adminWww/js/eos-policy-client.js +1 -1
- package/adminWww/js/eos-role-bootstrap.js +180 -46
- package/adminWww/js/eos-role-ui.js +156 -23
- package/adminWww/js/nexowatt-native-shell.js +1 -1
- package/build/lib/web.js +39 -0
- package/io-package.json +15 -5
- package/package.json +21 -13
- package/tools/nexowatt-account-management-selftest.cjs +1 -1
- package/tools/nexowatt-ensure-release-defaults.cjs +72 -0
- package/tools/nexowatt-internal-reserve-selftest.cjs +1 -0
- package/tools/nexowatt-login-layout-selftest.cjs +81 -0
- package/tools/nexowatt-modern-ui-selftest.cjs +7 -5
- package/tools/nexowatt-release-defaults-selftest.cjs +29 -0
- package/tools/nexowatt-validate-package.cjs +18 -8
- package/INSTALL_TEST_V7.9.89.md +0 -73
- package/PUBLISH_STABLE_V7.9.89.md +0 -33
- package/README_STABILITY_V7.9.89.md +0 -26
- package/RELEASE_ACCEPTANCE_V7.9.89.md +0 -40
- package/admin/img/eos/nexowatt-192-maskable.png +0 -0
- package/admin/img/eos/nexowatt-24.png +0 -0
- package/admin/img/eos/nexowatt-512-maskable.png +0 -0
- package/admin/img/eos/nexowatt-eos-logo.png +0 -0
- package/adminWww/admin.png +0 -0
- package/adminWww/img/eos/nexowatt-24.png +0 -0
- package/adminWww/img/eos/nexowatt-eos-logo.png +0 -0
- package/adminWww/img/eos/nexowatt-header-128.png +0 -0
- package/adminWww/img/eos/nexowatt-header-192.png +0 -0
- package/adminWww/img/eos/nexowatt-header-256.png +0 -0
- package/adminWww/img/eos/nexowatt-header-512.png +0 -0
- package/adminWww/img/eos/nexowatt-header-64.png +0 -0
- package/adminWww/img/logo192.png +0 -0
- package/adminWww/js/eos-adapter-surface-cleanup.js +0 -141
- package/adminWww/js/eos-toolbar-ghost-cleanup.js +0 -102
- package/docs/NEXOWATT_EOS_BRANDING_DE.md +0 -29
- package/docs/NEXOWATT_EOS_UI_LOGO_LOGIN_V6_DE.md +0 -9
- package/docs/NEXOWATT_EOS_UI_PERFORMANCE_V5_DE.md +0 -25
- package/docs/NEXOWATT_EOS_UI_V12_HEADER_LOGO_NAV_CLEANUP_DE.md +0 -16
- package/docs/NEXOWATT_EOS_UI_V12_HEADER_NAV_LOGO_FIX_DE.md +0 -16
- package/docs/NEXOWATT_EOS_UI_V15_DE.md +0 -8
- package/docs/NEXOWATT_EOS_UI_V16_DE.md +0 -9
- package/docs/NEXOWATT_EOS_UI_V17_DE.md +0 -24
- package/docs/NEXOWATT_EOS_UI_V6_FIXES_DE.md +0 -13
- package/docs/NEXOWATT_EOS_UI_V6_LOGIN_LOGO_404_FIX_DE.md +0 -9
- package/docs/NEXOWATT_EOS_UI_V6_LOGO_LOGIN_FIX_DE.md +0 -10
- package/docs/NEXOWATT_EOS_UI_V7_RESTORE_LOGO_SCOPE_FIX_DE.md +0 -18
package/build/lib/web.js
CHANGED
|
@@ -893,6 +893,39 @@ class Web {
|
|
|
893
893
|
&& account?.passwordlessFirstLoginAllowed === true;
|
|
894
894
|
return { eligible, role: access.role, user, minLength: setup.minLength };
|
|
895
895
|
}
|
|
896
|
+
async getEosPasswordlessFirstLoginStatus(req, res) {
|
|
897
|
+
res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');
|
|
898
|
+
if (!this.settings.auth
|
|
899
|
+
|| !this.isEosPasswordlessFirstLoginEnabled()
|
|
900
|
+
|| !this.isEosSameOriginWrite(req)
|
|
901
|
+
|| req.headers['x-nexowatt-eos-passwordless-status'] !== '1') {
|
|
902
|
+
res.status(403).json({ error: 'statusUnavailable' });
|
|
903
|
+
return;
|
|
904
|
+
}
|
|
905
|
+
if (!this.isEosPasswordlessRequestNetworkAllowed(req)) {
|
|
906
|
+
res.status(403).json({ error: 'privateNetworkRequired' });
|
|
907
|
+
return;
|
|
908
|
+
}
|
|
909
|
+
const requested = String(req.body?.user || '')
|
|
910
|
+
.trim()
|
|
911
|
+
.toLowerCase()
|
|
912
|
+
.replace(/^system\.user\./, '');
|
|
913
|
+
const managed = requested === 'installer' || requested === 'guest' || requested === 'user';
|
|
914
|
+
const userId = managed ? this.normalizeEosUserId(requested) : '';
|
|
915
|
+
if (!userId) {
|
|
916
|
+
res.status(200).json({ success: true, eligible: false, userName: requested });
|
|
917
|
+
return;
|
|
918
|
+
}
|
|
919
|
+
const eligibility = await this.getEosPasswordlessClaimEligibility(userId);
|
|
920
|
+
const eligible = eligibility.eligible && (eligibility.role === 'installer' || eligibility.role === 'enduser');
|
|
921
|
+
res.status(200).json({
|
|
922
|
+
success: true,
|
|
923
|
+
eligible,
|
|
924
|
+
role: eligibility.role,
|
|
925
|
+
userName: requested,
|
|
926
|
+
minLength: eligibility.minLength,
|
|
927
|
+
});
|
|
928
|
+
}
|
|
896
929
|
invalidateEosPasswordClaimsForUser(userId) {
|
|
897
930
|
for (const [key, claim] of this.eosPasswordClaims.entries()) {
|
|
898
931
|
if (claim.userId === userId) {
|
|
@@ -1606,6 +1639,12 @@ class Web {
|
|
|
1606
1639
|
// Passwordless first activation is not a normal authenticated session. The two
|
|
1607
1640
|
// narrow routes below only issue/consume a short-lived HttpOnly claim and are registered
|
|
1608
1641
|
// before the general login middleware. They never expose the EOS application itself.
|
|
1642
|
+
this.server.app.post('/nexowatt/account/passwordless-status', (req, res) => {
|
|
1643
|
+
void this.getEosPasswordlessFirstLoginStatus(req, res).catch(e => {
|
|
1644
|
+
this.adapter.log.debug(`Cannot read EOS passwordless activation status: ${e instanceof Error ? e.message : e}`);
|
|
1645
|
+
res.status(200).json({ success: true, eligible: false });
|
|
1646
|
+
});
|
|
1647
|
+
});
|
|
1609
1648
|
this.server.app.post('/nexowatt/account/passwordless-claim', (req, res) => {
|
|
1610
1649
|
void this.startEosPasswordlessFirstLogin(req, res).catch(e => {
|
|
1611
1650
|
this.adapter.log.warn(`Cannot start EOS passwordless activation: ${e instanceof Error ? e.message : e}`);
|
package/io-package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "eos-admin",
|
|
4
|
-
"version": "7.9.
|
|
4
|
+
"version": "7.9.92",
|
|
5
5
|
"titleLang": {
|
|
6
6
|
"en": "NexoWatt EOS Admin",
|
|
7
7
|
"de": "NexoWatt EOS Admin",
|
|
@@ -18,6 +18,16 @@
|
|
|
18
18
|
"connectionType": "local",
|
|
19
19
|
"dataSource": "push",
|
|
20
20
|
"news": {
|
|
21
|
+
"7.9.92": {
|
|
22
|
+
"de": "Stable 7.9.92 korrigiert die Release-Vorbereitung: Vor Paketprüfung und npm-Veröffentlichung werden die verbindlichen Verkaufsstandardwerte für Authentifizierung, Port 8081 sowie die ausschließlich für Admin/Service sichtbaren internen Admin- und BackItUp-Notfallreserven automatisch normalisiert. Dadurch kann ein gemischter lokaler Arbeitsordner die Sicherheitsprüfung nicht mehr durch einen fehlenden Standardwert abbrechen. Rollen-, Login-, Übersichts- und Dienstefilter aus 7.9.91 bleiben unverändert.",
|
|
23
|
+
"en": "Stable 7.9.92 hardens release preparation: before package validation and npm publishing, the mandatory sales defaults for authentication, port 8081 and the Admin/Service-only internal admin and BackItUp emergency reserves are normalized automatically. A mixed local working tree can therefore no longer abort the security check merely because a required default value is missing. Role, login, overview and service filtering from 7.9.91 remain unchanged.",
|
|
24
|
+
"nl": "Stable 7.9.92 verhardt de releasevoorbereiding: vóór pakketcontrole en npm-publicatie worden de verplichte verkoopstandaarden voor authenticatie, poort 8081 en de uitsluitend voor Admin/Service zichtbare interne admin- en BackItUp-noodreserve automatisch genormaliseerd. Een gemengde lokale werkmap kan de veiligheidscontrole daardoor niet meer laten stoppen door een ontbrekende standaardwaarde. Rollen-, login-, overzichts- en dienstenfilters uit 7.9.91 blijven ongewijzigd."
|
|
25
|
+
},
|
|
26
|
+
"7.9.90": {
|
|
27
|
+
"de": "Stable 7.9.90 korrigiert die produktive Rollenoberfläche: Die Übersichtskacheln sind für Installateur und Gast/Endkunde zuverlässig bedienbar. Interner Admin und interne BackItUp-Notfallreserve werden in Dienste auch bei verzögert gerenderten Tabellen ausschließlich für Admin/Service angezeigt. Die Erstanmeldung prüft serverseitig, ob Installer, Guest oder User noch keinen persönlichen Zugang besitzen: Nur dann wird die normale Anmeldeschaltfläche bei leerem Passwort aktiv und öffnet die verpflichtende Passwortvergabe; nach abgeschlossener Aktivierung bleibt sie ohne Passwort gesperrt. NexoWatt Sicherung bleibt für freigegebene Rollen erreichbar, EOS Assist im Header und Standardport 8081 bleiben unverändert.",
|
|
28
|
+
"en": "Stable 7.9.90 fixes the production role interface: overview tiles are reliably clickable for Installer and Guest/End User. The internal admin and internal BackItUp emergency reserve are shown only to Admin/Service, including tables rendered asynchronously. First activation now checks eligibility on the server before enabling empty-password sign-in for Installer, Guest or User. Only an uninitialized/reset account gets an active sign-in button and mandatory password setup; after activation, empty-password sign-in remains disabled. NexoWatt Backup stays available to approved roles, while EOS Assist remains in the header and the default port remains 8081.",
|
|
29
|
+
"nl": "Stable 7.9.90 corrigeert de productie-rolinterface: overzichtstegels zijn betrouwbaar klikbaar voor installateur en gast/eindgebruiker. De interne admin en BackItUp-noodreserve zijn uitsluitend zichtbaar voor Admin/Service, ook in vertraagd gerenderde tabellen. Eerste activering controleert server-side of Installer, Guest of User nog geen persoonlijk wachtwoord heeft. Alleen dan wordt aanmelden met leeg wachtwoord actief en volgt verplichte wachtwoordinstelling; na activering blijft aanmelden zonder wachtwoord geblokkeerd. NexoWatt Backup blijft beschikbaar voor vrijgegeven rollen, EOS Assist blijft in de kop en standaardpoort 8081 blijft behouden."
|
|
30
|
+
},
|
|
21
31
|
"7.9.89": {
|
|
22
32
|
"de": "Stable 7.9.89 finalisiert die rollenbasierte NexoWatt-EOS-Verkaufsoberfläche: Admin/Service behält Vollzugriff und Expertenmodus, Installateure erhalten Inbetriebnahme und Fehlersuche, Gast/Endkunde die freigegebene Smart-Home-Bedienung. Die Erstanmeldung ist direkt in die normale Anmeldung integriert: Installer und Guest wählen ihre Ebene und lassen das Passwort einmalig leer, danach wird zwingend ein persönliches Passwort vergeben. EOS Assist sitzt kollisionsfrei im Kopfbereich; Zugangsverwaltung liegt ausschließlich unter „Zugänge & Rechte“. Die aktuelle Übersicht wurde modernisiert, die Easy-Übersicht wird nicht verwendet. Interner Admin und interne BackItUp-Notfallreserve sind nur für Admin/Service sichtbar; die NexoWatt-Sicherung bleibt für die freigegebenen Rollen nutzbar. Standardport ist 8081.",
|
|
23
33
|
"en": "Stable 7.9.89 finalizes the role-based NexoWatt EOS sales interface: Admin/Service retains full access and expert mode, installers receive commissioning and troubleshooting functions, and Guest/End User receives the approved smart-home controls. First activation is integrated into the normal sign-in card: Installer and Guest select their level and leave the password empty once, then must create a personal password. EOS Assist is positioned safely in the header; account management exists only under “Access & Rights”. The current overview was modernized and the Easy overview is not used. The internal admin and internal BackItUp emergency reserve are visible only to Admin/Service, while NexoWatt Backup remains available to approved roles. Default port is 8081.",
|
|
@@ -304,7 +314,7 @@
|
|
|
304
314
|
"icon": "admin.svg",
|
|
305
315
|
"messagebox": true,
|
|
306
316
|
"enabled": true,
|
|
307
|
-
"extIcon": "https://unpkg.com/iobroker.eos-admin@7.9.
|
|
317
|
+
"extIcon": "https://unpkg.com/iobroker.eos-admin@7.9.92/admin/admin.svg",
|
|
308
318
|
"keywords": [
|
|
309
319
|
"NexoWatt",
|
|
310
320
|
"EOS",
|
|
@@ -315,7 +325,7 @@
|
|
|
315
325
|
"licensed"
|
|
316
326
|
],
|
|
317
327
|
"compact": true,
|
|
318
|
-
"readme": "https://unpkg.com/iobroker.eos-admin@7.9.
|
|
328
|
+
"readme": "https://unpkg.com/iobroker.eos-admin@7.9.92/README.md",
|
|
319
329
|
"authors": [
|
|
320
330
|
"bluefox <bluefox@ccu.io>",
|
|
321
331
|
"hobbyquaker <hq@ccu.io>"
|
|
@@ -384,7 +394,7 @@
|
|
|
384
394
|
"nondeletable": false,
|
|
385
395
|
"allowAdapterUpdate": true,
|
|
386
396
|
"allowAdapterDelete": false,
|
|
387
|
-
"meta": "https://unpkg.com/iobroker.eos-admin@7.9.
|
|
397
|
+
"meta": "https://unpkg.com/iobroker.eos-admin@7.9.92/io-package.json",
|
|
388
398
|
"npmPackage": "iobroker.eos-admin",
|
|
389
399
|
"packetName": "iobroker.eos-admin"
|
|
390
400
|
},
|
|
@@ -1088,5 +1098,5 @@
|
|
|
1088
1098
|
}
|
|
1089
1099
|
}
|
|
1090
1100
|
},
|
|
1091
|
-
"version": "7.9.
|
|
1101
|
+
"version": "7.9.92"
|
|
1092
1102
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.eos-admin",
|
|
3
|
-
"description": "NexoWatt EOS Admin stable product release with
|
|
4
|
-
"version": "7.9.
|
|
3
|
+
"description": "NexoWatt EOS Admin stable product release with compact login, role-safe services and self-healing sales defaults",
|
|
4
|
+
"version": "7.9.92",
|
|
5
5
|
"contributors": [
|
|
6
6
|
"bluefox <dogafox@gmail.com>",
|
|
7
7
|
"apollon77",
|
|
@@ -110,11 +110,15 @@
|
|
|
110
110
|
"tools/nexowatt-runtime-cleanup-selftest.cjs",
|
|
111
111
|
"tools/nexowatt-account-management-selftest.cjs",
|
|
112
112
|
"tools/nexowatt-modern-ui-selftest.cjs",
|
|
113
|
-
"
|
|
114
|
-
"
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
"
|
|
113
|
+
"tools/nexowatt-login-layout-selftest.cjs",
|
|
114
|
+
"README_STABILITY_V7.9.92.md",
|
|
115
|
+
"RELEASE_NOTES_V7.9.92.md",
|
|
116
|
+
"PUBLISH_STABLE_V7.9.92.md",
|
|
117
|
+
"INSTALL_TEST_V7.9.92.md",
|
|
118
|
+
"RELEASE_ACCEPTANCE_V7.9.92.md",
|
|
119
|
+
"tools/nexowatt-internal-reserve-selftest.cjs",
|
|
120
|
+
"tools/nexowatt-ensure-release-defaults.cjs",
|
|
121
|
+
"tools/nexowatt-release-defaults-selftest.cjs"
|
|
118
122
|
],
|
|
119
123
|
"scripts": {
|
|
120
124
|
"npm": "npm i -f && cd src-admin && npm i -f",
|
|
@@ -125,7 +129,7 @@
|
|
|
125
129
|
"test:integration": "mocha test/integration --exit && npm run test:gui && npm run test:rule && npm run test:unit",
|
|
126
130
|
"test:rule": "mocha test/rule --exit",
|
|
127
131
|
"test:gui": "mocha test/*.gui.js --exit",
|
|
128
|
-
"prepublishOnly": "npm run check:eos-publish-channel && npm run check:eos-package && npm run check:eos-stability",
|
|
132
|
+
"prepublishOnly": "npm run prepare:eos-release-defaults && npm run check:eos-publish-channel && npm run check:eos-package && npm run check:eos-stability",
|
|
129
133
|
"build": "npm run build:frontend && npm run build:backend && npm run clean:eos-runtime",
|
|
130
134
|
"build:backend": "tsc -p tsconfig.build.json && tsx tasks.mts --backend-i18n",
|
|
131
135
|
"build:frontend": "tsx tasks.mts",
|
|
@@ -149,11 +153,11 @@
|
|
|
149
153
|
"nexowatt:repo-entry": "node tools/nexowatt-generate-repo-entry.cjs",
|
|
150
154
|
"nexowatt:patch-repo": "node tools/nexowatt-patch-repo.cjs",
|
|
151
155
|
"nexowatt:repair-update": "node tools/nexowatt-repair-eos-admin-update.cjs",
|
|
152
|
-
"check:eos-stability": "node tools/nexowatt-stability-check.cjs && node tools/nexowatt-esm-syntax-selftest.cjs && node tools/nexowatt-import-integrity-selftest.cjs && node tools/nexowatt-entrypoint-smoke-selftest.cjs && node tools/nexowatt-frontend-graph-check.cjs && node tools/nexowatt-policy-selftest.cjs && node tools/nexowatt-publish-channel-selftest.cjs && node tools/nexowatt-role-access-selftest.cjs && node tools/nexowatt-internal-reserve-selftest.cjs && node tools/nexowatt-first-login-selftest.cjs && node tools/nexowatt-account-management-selftest.cjs && node tools/nexowatt-modern-ui-selftest.cjs && node tools/nexowatt-branding-selftest.cjs && node tools/nexowatt-default-port-selftest.cjs && node tools/nexowatt-module-popup-selftest.cjs && node tools/nexowatt-datapoint-selftest.cjs && node tools/nexowatt-update-selftest.cjs && node tools/nexowatt-datapoint-interaction-selftest.cjs && node tools/nexowatt-manual-write-policy-selftest.cjs && node tools/nexowatt-value-column-selftest.cjs && node tools/nexowatt-native-shell-selftest.cjs && node tools/nexowatt-assistant-separation-selftest.cjs && node tools/nexowatt-runtime-cleanup-selftest.cjs",
|
|
156
|
+
"check:eos-stability": "node tools/nexowatt-stability-check.cjs && node tools/nexowatt-esm-syntax-selftest.cjs && node tools/nexowatt-import-integrity-selftest.cjs && node tools/nexowatt-entrypoint-smoke-selftest.cjs && node tools/nexowatt-frontend-graph-check.cjs && node tools/nexowatt-policy-selftest.cjs && node tools/nexowatt-publish-channel-selftest.cjs && node tools/nexowatt-release-defaults-selftest.cjs && node tools/nexowatt-role-access-selftest.cjs && node tools/nexowatt-internal-reserve-selftest.cjs && node tools/nexowatt-first-login-selftest.cjs && node tools/nexowatt-account-management-selftest.cjs && node tools/nexowatt-modern-ui-selftest.cjs && node tools/nexowatt-login-layout-selftest.cjs && node tools/nexowatt-branding-selftest.cjs && node tools/nexowatt-default-port-selftest.cjs && node tools/nexowatt-module-popup-selftest.cjs && node tools/nexowatt-datapoint-selftest.cjs && node tools/nexowatt-update-selftest.cjs && node tools/nexowatt-datapoint-interaction-selftest.cjs && node tools/nexowatt-manual-write-policy-selftest.cjs && node tools/nexowatt-value-column-selftest.cjs && node tools/nexowatt-native-shell-selftest.cjs && node tools/nexowatt-assistant-separation-selftest.cjs && node tools/nexowatt-runtime-cleanup-selftest.cjs",
|
|
153
157
|
"nexowatt:patch-built-frontend": "node tools/nexowatt-patch-built-frontend.cjs",
|
|
154
158
|
"clean:eos-runtime": "node tools/nexowatt-clean-legacy-runtime.cjs",
|
|
155
|
-
"precheck:eos-package": "npm run clean:eos-runtime",
|
|
156
|
-
"precheck:eos-stability": "npm run clean:eos-runtime",
|
|
159
|
+
"precheck:eos-package": "npm run prepare:eos-release-defaults && npm run clean:eos-runtime",
|
|
160
|
+
"precheck:eos-stability": "npm run prepare:eos-release-defaults && npm run clean:eos-runtime",
|
|
157
161
|
"prepack": "node tools/nexowatt-clean-legacy-runtime.cjs --quiet",
|
|
158
162
|
"check:eos-esm": "node tools/nexowatt-esm-syntax-selftest.cjs",
|
|
159
163
|
"check:eos-imports": "node tools/nexowatt-import-integrity-selftest.cjs",
|
|
@@ -165,7 +169,11 @@
|
|
|
165
169
|
"test:eos-default-port": "node tools/nexowatt-default-port-selftest.cjs",
|
|
166
170
|
"test:eos-account-management": "node tools/nexowatt-account-management-selftest.cjs",
|
|
167
171
|
"test:eos-modern-ui": "node tools/nexowatt-modern-ui-selftest.cjs",
|
|
168
|
-
"test:eos-internal-reserve": "node tools/nexowatt-internal-reserve-selftest.cjs"
|
|
172
|
+
"test:eos-internal-reserve": "node tools/nexowatt-internal-reserve-selftest.cjs",
|
|
173
|
+
"test:eos-login-layout": "node tools/nexowatt-login-layout-selftest.cjs",
|
|
174
|
+
"test:eos-release-defaults": "node tools/nexowatt-release-defaults-selftest.cjs",
|
|
175
|
+
"prepare:eos-release-defaults": "node tools/nexowatt-ensure-release-defaults.cjs",
|
|
176
|
+
"normalize:eos-release": "npm run prepare:eos-release-defaults"
|
|
169
177
|
},
|
|
170
178
|
"author": "NexoWatt",
|
|
171
179
|
"private": false,
|
|
@@ -176,6 +184,6 @@
|
|
|
176
184
|
},
|
|
177
185
|
"nexowattReleasePolicy": {
|
|
178
186
|
"distTag": "latest",
|
|
179
|
-
"purpose": "accepted stable NexoWatt EOS sales-product release 7.9.
|
|
187
|
+
"purpose": "accepted stable NexoWatt EOS sales-product release 7.9.92"
|
|
180
188
|
}
|
|
181
189
|
}
|
|
@@ -41,7 +41,7 @@ for (const code of [webSource, webBuilt]) {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
for (const marker of [
|
|
44
|
-
'
|
|
44
|
+
'v91-account-management-under-access-rights', "['admin', 'installer']", 'nexowatt/account/manage',
|
|
45
45
|
'nexowatt/account/reset', 'X-NexoWatt-EOS-Account-Reset', 'data.canResetInstaller === true',
|
|
46
46
|
"account.role === 'enduser'", 'Admin/Service', 'Installateure', 'NEXOWATT_EOS_ACCOUNT_MANAGEMENT',
|
|
47
47
|
'ensureEntrySurface', "currentRoute() !== 'tab-users'", 'eos-account-management-entry',
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const fs = require('node:fs');
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
|
|
7
|
+
const CANONICAL_NATIVE_DEFAULTS = Object.freeze({
|
|
8
|
+
auth: true,
|
|
9
|
+
port: 8081,
|
|
10
|
+
eosLockLegacyAdmin: true,
|
|
11
|
+
eosHideLegacyAdminFromNonAdmins: true,
|
|
12
|
+
eosHideLegacyBackupFromNonAdmins: true,
|
|
13
|
+
nexowattHideLegacyBackupFromNonAdmins: true,
|
|
14
|
+
eosRequireFirstLoginPassword: true,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Enforce mandatory source defaults for every NexoWatt EOS sales release.
|
|
19
|
+
* This normalizes the repository io-package.json only. Existing installed
|
|
20
|
+
* instance configuration is not overwritten during adapter startup.
|
|
21
|
+
*/
|
|
22
|
+
function ensureReleaseDefaults(ioPackage) {
|
|
23
|
+
if (!ioPackage || typeof ioPackage !== 'object' || Array.isArray(ioPackage)) {
|
|
24
|
+
throw new TypeError('io-package.json must contain a JSON object');
|
|
25
|
+
}
|
|
26
|
+
const native = ioPackage.native && typeof ioPackage.native === 'object' && !Array.isArray(ioPackage.native)
|
|
27
|
+
? ioPackage.native
|
|
28
|
+
: (ioPackage.native = {});
|
|
29
|
+
const changes = [];
|
|
30
|
+
for (const [key, value] of Object.entries(CANONICAL_NATIVE_DEFAULTS)) {
|
|
31
|
+
if (native[key] !== value) {
|
|
32
|
+
changes.push({ key, previous: native[key], value });
|
|
33
|
+
native[key] = value;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
ioPackage,
|
|
38
|
+
changed: changes.length > 0,
|
|
39
|
+
fields: changes.map(change => `native.${change.key}`),
|
|
40
|
+
changes,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function ensureFile(filePath) {
|
|
45
|
+
const absolute = path.resolve(filePath);
|
|
46
|
+
const parsed = JSON.parse(fs.readFileSync(absolute, 'utf8'));
|
|
47
|
+
const result = ensureReleaseDefaults(parsed);
|
|
48
|
+
if (result.changed) {
|
|
49
|
+
fs.writeFileSync(absolute, `${JSON.stringify(result.ioPackage, null, 2)}\n`, 'utf8');
|
|
50
|
+
}
|
|
51
|
+
return { file: absolute, ...result };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (require.main === module) {
|
|
55
|
+
const root = path.resolve(__dirname, '..');
|
|
56
|
+
const target = process.argv[2] || path.join(root, 'io-package.json');
|
|
57
|
+
try {
|
|
58
|
+
const result = ensureFile(target);
|
|
59
|
+
if (result.changed) {
|
|
60
|
+
console.log(
|
|
61
|
+
`[NexoWatt EOS release defaults] repaired ${result.changes.length} canonical value(s): ${result.changes.map(change => change.key).join(', ')}`,
|
|
62
|
+
);
|
|
63
|
+
} else {
|
|
64
|
+
console.log('[NexoWatt EOS release defaults] OK (canonical sales defaults already present)');
|
|
65
|
+
}
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.error(`[NexoWatt EOS release defaults] ${error instanceof Error ? error.message : String(error)}`);
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
module.exports = { CANONICAL_NATIVE_DEFAULTS, ensureReleaseDefaults, ensureFile };
|
|
@@ -36,6 +36,7 @@ for (const code of [webSource, webBuilt]) {
|
|
|
36
36
|
for (const marker of [
|
|
37
37
|
'isOfficialAdminTab', 'isOfficialBackupTab', 'isOfficialReserveTab', 'isCustomerBackupTab',
|
|
38
38
|
'system.adapter.backitup', 'tab-backitup', 'nexowatt-backup', 'eos-backup',
|
|
39
|
+
'exact visible instance ID', 'data-eos-official-reserve-hidden', 'Reused virtual rows must be unhidden',
|
|
39
40
|
]) if (!role.includes(marker)) fail(`role UI reserve marker missing: ${marker}`);
|
|
40
41
|
for (const marker of ['isOfficialReserveTab', 'isCustomerBackupTab', 'backitup', 'nexowatt-backup']) {
|
|
41
42
|
if (!boot.includes(marker)) fail(`bootstrap reserve marker missing: ${marker}`);
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
|
|
7
|
+
const root = path.resolve(__dirname, '..');
|
|
8
|
+
const read = rel => fs.readFileSync(path.join(root, rel), 'utf8');
|
|
9
|
+
let bad = false;
|
|
10
|
+
const fail = message => {
|
|
11
|
+
console.error(`[NexoWatt EOS login layout] ${message}`);
|
|
12
|
+
bad = true;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const css = read('adminWww/css/nexowatt-native-shell.css');
|
|
16
|
+
const sourceCss = read('src-admin/public/css/nexowatt-native-shell.css');
|
|
17
|
+
const login = read('src-admin/src/login/Login.tsx');
|
|
18
|
+
const bootstrap = read('adminWww/js/eos-role-bootstrap.js');
|
|
19
|
+
const index = read('adminWww/index.html');
|
|
20
|
+
const buildInfo = JSON.parse(read('NEXOWATT_EOS_BUILD_INFO.json'));
|
|
21
|
+
const shellTag = String(buildInfo.shellCacheTag || buildInfo.shellCacheVersion || '');
|
|
22
|
+
|
|
23
|
+
if (css !== sourceCss) fail('login CSS source/build drift');
|
|
24
|
+
if (!css.includes('outer frame is decorative only')) fail('decorative compact-frame contract is missing');
|
|
25
|
+
if (css.includes('html.eos-login .MuiPaper-root:has(#username)')) {
|
|
26
|
+
fail('broad :has selector still styles the outer login Paper');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const outer = css.match(/html\.eos-login main\.MuiPaper-root\s*\{([\s\S]*?)\n\}/)?.[1] || '';
|
|
30
|
+
for (const marker of [
|
|
31
|
+
'position: relative',
|
|
32
|
+
'width: 100%',
|
|
33
|
+
'min-height: 100vh',
|
|
34
|
+
'place-items: center',
|
|
35
|
+
'background: transparent !important',
|
|
36
|
+
'box-shadow: none !important',
|
|
37
|
+
]) {
|
|
38
|
+
if (!outer.includes(marker)) fail(`transparent viewport host rule missing: ${marker}`);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const decorative = css.match(/html\.eos-login main\.MuiPaper-root::before\s*\{([\s\S]*?)\n\}/)?.[1] || '';
|
|
42
|
+
for (const marker of [
|
|
43
|
+
"content: ''",
|
|
44
|
+
'width: min(390px, calc(100vw - 24px))',
|
|
45
|
+
'height: min(480px, calc(100vh - 24px))',
|
|
46
|
+
'transform: translate(-50%, -50%)',
|
|
47
|
+
'pointer-events: none',
|
|
48
|
+
]) {
|
|
49
|
+
if (!decorative.includes(marker)) fail(`decorative rear frame rule missing: ${marker}`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
for (const marker of [
|
|
53
|
+
'html.eos-login main.MuiPaper-root > .eos-login-card-modern',
|
|
54
|
+
'html.eos-login main.MuiPaper-root > .MuiPaper-root:has(#username)',
|
|
55
|
+
'html.eos-login main.MuiPaper-root > .MuiPaper-root:has(#password)',
|
|
56
|
+
'width: min(334px, calc(100vw - 56px)) !important',
|
|
57
|
+
'height: min(424px, calc(100vh - 56px)) !important',
|
|
58
|
+
'max-height: none !important',
|
|
59
|
+
]) {
|
|
60
|
+
if (!css.includes(marker)) fail(`inner compact card rule missing: ${marker}`);
|
|
61
|
+
}
|
|
62
|
+
if (!css.includes('.eos-login-first-status:empty { display: none; min-height: 0; margin: 0; }')) {
|
|
63
|
+
fail('empty first-login status still reserves vertical space');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (!login.includes('Keep the familiar compact login page')) fail('native Login source lacks compact-page contract');
|
|
67
|
+
if (login.includes('eos-login-role-selector-native') || login.includes('data-eos-account=')) {
|
|
68
|
+
fail('native Login source still renders role-selector buttons');
|
|
69
|
+
}
|
|
70
|
+
if (!bootstrap.includes('compact normal-login first activation')) fail('runtime compact first-login contract missing');
|
|
71
|
+
if (!bootstrap.includes("card.querySelectorAll('.eos-login-role-selector').forEach(element => element.remove())")) {
|
|
72
|
+
fail('runtime does not remove stale role-selector surfaces');
|
|
73
|
+
}
|
|
74
|
+
if (/data-eos-account=|selector\.innerHTML/.test(bootstrap)) fail('runtime still injects a second role-selector panel');
|
|
75
|
+
|
|
76
|
+
if (!shellTag || !index.includes(`nexowatt-native-shell.css?v=${shellTag}`)) {
|
|
77
|
+
fail('login CSS cache key is not aligned with build information');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (bad) process.exit(1);
|
|
81
|
+
console.log('[NexoWatt EOS login layout] OK');
|
|
@@ -19,8 +19,8 @@ for (const marker of [
|
|
|
19
19
|
'--nx-shadow-soft', '--nx-shadow-float', 'backdrop-filter: blur', '#app-paper', '.MuiDialog-paper',
|
|
20
20
|
'.MuiButton-root', '.MuiTableRow-root', ':focus-visible', 'border-radius: 24px', 'linear-gradient',
|
|
21
21
|
'@media (max-width: 720px)', '.eos-activation-steps', '.eos-account-row:hover',
|
|
22
|
-
'.
|
|
23
|
-
'.eos-account-management-entry', 'overflow: visible',
|
|
22
|
+
'main.MuiPaper-root::before', 'width: min(334px, calc(100vw - 56px)) !important', '.eos-assist-header-root', '.eos-overview-hero', '.eos-overview-grid',
|
|
23
|
+
'.eos-account-management-entry', 'pointer-events: auto !important', 'touch-action: manipulation', 'overflow: visible',
|
|
24
24
|
]) if (!css.includes(marker)) fail(`modern styling marker missing: ${marker}`);
|
|
25
25
|
if (sourceCss !== css) fail('modern CSS source/build drift');
|
|
26
26
|
for (const marker of ['eos-account-management.js','nexowatt-native-shell.css','eos-role-bootstrap.js','eos-assistant.js']) {
|
|
@@ -29,12 +29,14 @@ for (const marker of ['eos-account-management.js','nexowatt-native-shell.css','e
|
|
|
29
29
|
for (const marker of ['NexoWatt EOS', 'Zugänge & Rollen', 'Endkunden-Zugänge', 'ensureEntrySurface']) {
|
|
30
30
|
if (!accountUi.includes(marker)) fail(`modern account surface missing label: ${marker}`);
|
|
31
31
|
}
|
|
32
|
-
for (const marker of ['installIntegratedFirstLogin','
|
|
32
|
+
for (const marker of ['installIntegratedFirstLogin','v91 compact normal-login first activation','eos-passwordless-card','Idempotent writes are essential here']) {
|
|
33
33
|
if (!bootstrap.includes(marker)) fail(`integrated first-activation surface missing: ${marker}`);
|
|
34
34
|
}
|
|
35
|
+
if (/data-eos-account=|selector\.innerHTML/.test(bootstrap)) fail('compact login still injects role buttons or a second panel');
|
|
35
36
|
if (bootstrap.includes("launcher.className = 'eos-passwordless-launcher'")) fail('old bottom first-login launcher is still rendered');
|
|
36
37
|
if (!shell.includes('ensureModernOverview') || !shell.includes("currentTab() !== 'tab-intro'")) fail('current overview is not modernized');
|
|
37
|
-
if (!role.includes('eos-role-safe-overview') || !role.includes("currentRoute() !== 'tab-intro'")) fail('role-safe current overview is missing');
|
|
38
|
+
if (!role.includes('eos-role-safe-overview') || !role.includes("currentRoute() !== 'tab-intro'") || !role.includes('navigateToTab') || !role.includes("overview.querySelectorAll('a[data-eos-role-tab]')")) fail('role-safe current overview is missing or not directly clickable');
|
|
39
|
+
if (!role.includes('ensureReserveObserver') || !role.includes('state.reserveObserver.observe(paper')) fail('scoped delayed-row reserve filter is missing');
|
|
38
40
|
if (!assist.includes('eos-assist-header-root') || !assist.includes('insertBefore(root, userAnchor)')) fail('EOS Assist is not integrated in the header');
|
|
39
41
|
if (assist.includes('position:fixed;bottom') || assist.includes('bottom:')) fail('EOS Assist still uses a bottom floating position');
|
|
40
42
|
|
|
@@ -42,7 +44,7 @@ const observerCount = [
|
|
|
42
44
|
'eos-policy-client.js', 'eos-branding-sanitizer.js', 'nexowatt-native-shell.js', 'eos-native-security.js',
|
|
43
45
|
'eos-basic-settings.js', 'eos-role-ui.js', 'eos-account-management.js', 'eos-assistant.js',
|
|
44
46
|
].reduce((count, file) => count + (read(`adminWww/js/${file}`).match(/new MutationObserver/g) || []).length, 0);
|
|
45
|
-
if (observerCount !==
|
|
47
|
+
if (observerCount !== 2) fail(`expected one shared observer plus one scoped reserve-row observer, found ${observerCount}`);
|
|
46
48
|
|
|
47
49
|
if (bad) process.exit(1);
|
|
48
50
|
console.log('[NexoWatt EOS modern UI] OK');
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const assert = require('node:assert/strict');
|
|
5
|
+
const { CANONICAL_NATIVE_DEFAULTS, ensureReleaseDefaults } = require('./nexowatt-ensure-release-defaults.cjs');
|
|
6
|
+
|
|
7
|
+
const unsafe = {
|
|
8
|
+
common: { name: 'eos-admin' },
|
|
9
|
+
native: {
|
|
10
|
+
auth: false,
|
|
11
|
+
port: 8091,
|
|
12
|
+
eosLockLegacyAdmin: false,
|
|
13
|
+
eosHideLegacyAdminFromNonAdmins: false,
|
|
14
|
+
eosHideLegacyBackupFromNonAdmins: false,
|
|
15
|
+
nexowattHideLegacyBackupFromNonAdmins: false,
|
|
16
|
+
eosRequireFirstLoginPassword: false,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
const repaired = ensureReleaseDefaults(unsafe);
|
|
20
|
+
assert.ok(repaired.changes.length >= 7, 'unsafe defaults must be repaired');
|
|
21
|
+
for (const [key, expected] of Object.entries(CANONICAL_NATIVE_DEFAULTS)) {
|
|
22
|
+
assert.equal(repaired.ioPackage.native[key], expected, `${key} must be normalized`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const canonical = { native: { ...CANONICAL_NATIVE_DEFAULTS } };
|
|
26
|
+
const unchanged = ensureReleaseDefaults(canonical);
|
|
27
|
+
assert.equal(unchanged.changes.length, 0, 'canonical defaults must remain unchanged');
|
|
28
|
+
|
|
29
|
+
console.log('[NexoWatt EOS release defaults selftest] OK');
|
|
@@ -32,10 +32,15 @@ if (prerelease) {
|
|
|
32
32
|
} else if (pkg.nexowattReleasePolicy?.acceptedPrerelease) {
|
|
33
33
|
fail(`stable package must remove stale acceptedPrerelease ${pkg.nexowattReleasePolicy.acceptedPrerelease}`);
|
|
34
34
|
}
|
|
35
|
+
if (pkg.scripts['prepare:eos-release-defaults'] !== 'node tools/nexowatt-ensure-release-defaults.cjs') fail('release-default preparation script is missing');
|
|
36
|
+
if (pkg.scripts['test:eos-release-defaults'] !== 'node tools/nexowatt-release-defaults-selftest.cjs') fail('release-default selftest script is missing');
|
|
35
37
|
if (pkg.scripts['check:eos-publish-channel'] !== 'node tools/nexowatt-publish-channel-guard.cjs') fail('publish channel guard script is missing');
|
|
36
|
-
if (!pkg.scripts.prepublishOnly?.startsWith('npm run check:eos-publish-channel')) fail('prepublishOnly must
|
|
38
|
+
if (!pkg.scripts.prepublishOnly?.startsWith('npm run prepare:eos-release-defaults && npm run check:eos-publish-channel')) fail('prepublishOnly must normalize release defaults before the publish channel guard');
|
|
39
|
+
if (pkg.scripts['precheck:eos-package'] !== 'npm run prepare:eos-release-defaults && npm run clean:eos-runtime') fail('precheck:eos-package must normalize release defaults and clean stale runtime files');
|
|
40
|
+
if (pkg.scripts['precheck:eos-stability'] !== 'npm run prepare:eos-release-defaults && npm run clean:eos-runtime') fail('precheck:eos-stability must normalize release defaults and clean stale runtime files');
|
|
37
41
|
if (pkg.scripts['test:eos-publish-channel'] !== 'node tools/nexowatt-publish-channel-selftest.cjs') fail('publish channel selftest script is missing');
|
|
38
42
|
if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-publish-channel-selftest.cjs')) fail('stability check must execute the publish channel selftest');
|
|
43
|
+
if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-release-defaults-selftest.cjs')) fail('stability check must execute the release-default selftest');
|
|
39
44
|
if (io.native?.auth !== true) fail('fresh sales installations must default to authenticated access');
|
|
40
45
|
if (io.native?.eosHideLegacyBackupFromNonAdmins !== true) fail('internal BackItUp reserve must default to Admin/Service visibility');
|
|
41
46
|
if (io.native?.nexowattHideLegacyBackupFromNonAdmins !== true) fail('NexoWatt backup visibility compatibility flag must default to true');
|
|
@@ -98,10 +103,10 @@ for (const file of [
|
|
|
98
103
|
'LICENSE',
|
|
99
104
|
'NEXOWATT_PROPRIETARY_LICENSE.md',
|
|
100
105
|
'THIRD_PARTY_NOTICES.md',
|
|
101
|
-
'README_STABILITY_V7.9.
|
|
102
|
-
'PUBLISH_STABLE_V7.9.
|
|
103
|
-
'INSTALL_TEST_V7.9.
|
|
104
|
-
'RELEASE_ACCEPTANCE_V7.9.
|
|
106
|
+
'README_STABILITY_V7.9.92.md',
|
|
107
|
+
'PUBLISH_STABLE_V7.9.92.md',
|
|
108
|
+
'INSTALL_TEST_V7.9.92.md',
|
|
109
|
+
'RELEASE_ACCEPTANCE_V7.9.92.md',
|
|
105
110
|
'tools/nexowatt-patch-built-frontend.cjs',
|
|
106
111
|
'tools/nexowatt-native-shell-selftest.cjs',
|
|
107
112
|
'tools/nexowatt-clean-legacy-runtime.cjs',
|
|
@@ -113,10 +118,13 @@ for (const file of [
|
|
|
113
118
|
'tools/nexowatt-first-login-selftest.cjs',
|
|
114
119
|
'tools/nexowatt-account-management-selftest.cjs',
|
|
115
120
|
'tools/nexowatt-modern-ui-selftest.cjs',
|
|
121
|
+
'tools/nexowatt-login-layout-selftest.cjs',
|
|
116
122
|
'tools/nexowatt-internal-reserve-selftest.cjs',
|
|
117
123
|
'tools/nexowatt-branding-selftest.cjs',
|
|
118
124
|
'tools/nexowatt-publish-channel-guard.cjs',
|
|
119
125
|
'tools/nexowatt-publish-channel-selftest.cjs',
|
|
126
|
+
'tools/nexowatt-ensure-release-defaults.cjs',
|
|
127
|
+
'tools/nexowatt-release-defaults-selftest.cjs',
|
|
120
128
|
'tools/nexowatt-default-port-selftest.cjs',
|
|
121
129
|
'.npmrc',
|
|
122
130
|
repositoryEntryFile,
|
|
@@ -195,7 +203,9 @@ if (accountManagement.includes("launcher.className = 'eos-account-management-lau
|
|
|
195
203
|
if (accountManagement.includes('new MutationObserver')) fail('account-management runtime adds a second broad DOM observer');
|
|
196
204
|
if (read('src-admin/public/js/eos-account-management.js') !== accountManagement) fail('account-management source/build drift');
|
|
197
205
|
const roleBootstrap = read('adminWww/js/eos-role-bootstrap.js');
|
|
198
|
-
if (!roleBootstrap.includes('installIntegratedFirstLogin') || !roleBootstrap.includes('
|
|
206
|
+
if (!roleBootstrap.includes('installIntegratedFirstLogin') || !roleBootstrap.includes('v91 compact normal-login first activation')) fail('compact integrated first-login is incomplete');
|
|
207
|
+
if (/data-eos-account=|selector\.innerHTML/.test(roleBootstrap)) fail('login role buttons must not enlarge the normal login card');
|
|
208
|
+
if (!roleBootstrap.includes('nexowatt/account/passwordless-status') || !roleBootstrap.includes('eligibility.allowed')) fail('server-checked first-login eligibility is incomplete');
|
|
199
209
|
if (roleBootstrap.includes('installPasswordlessFirstLoginLauncher')) fail('old first-login launcher remains active');
|
|
200
210
|
const assistant = read('adminWww/js/eos-assistant.js');
|
|
201
211
|
if (!assistant.includes('eos-assist-header-root') || !assistant.includes('insertBefore(root, userAnchor)')) fail('EOS Assist is not header-integrated');
|
|
@@ -217,14 +227,14 @@ if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-esm-syntax-selftest.
|
|
|
217
227
|
if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-import-integrity-selftest.cjs')) fail('import integrity selftest is not part of check:eos-stability');
|
|
218
228
|
if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-entrypoint-smoke-selftest.cjs')) fail('entrypoint smoke selftest is not part of check:eos-stability');
|
|
219
229
|
if (pkg.scripts['clean:eos-runtime'] !== 'node tools/nexowatt-clean-legacy-runtime.cjs') fail('clean:eos-runtime script is missing or incorrect');
|
|
220
|
-
if (pkg.scripts['precheck:eos-package'] !== 'npm run clean:eos-runtime') fail('precheck:eos-package must clean stale runtime files');
|
|
221
|
-
if (pkg.scripts['precheck:eos-stability'] !== 'npm run clean:eos-runtime') fail('precheck:eos-stability must clean stale runtime files');
|
|
222
230
|
if (pkg.scripts.prepack !== 'node tools/nexowatt-clean-legacy-runtime.cjs --quiet') fail('prepack must silently clean stale runtime files');
|
|
223
231
|
if (!pkg.scripts.build?.includes('npm run clean:eos-runtime')) fail('build must finish with runtime cleanup');
|
|
224
232
|
if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-role-access-selftest.cjs')) fail('role access selftest is not part of check:eos-stability');
|
|
225
233
|
if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-first-login-selftest.cjs')) fail('first-login selftest is not part of check:eos-stability');
|
|
226
234
|
if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-account-management-selftest.cjs')) fail('account-management selftest is not part of check:eos-stability');
|
|
227
235
|
if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-modern-ui-selftest.cjs')) fail('modern-UI selftest is not part of check:eos-stability');
|
|
236
|
+
if (pkg.scripts['test:eos-login-layout'] !== 'node tools/nexowatt-login-layout-selftest.cjs') fail('login-layout selftest script is missing or incorrect');
|
|
237
|
+
if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-login-layout-selftest.cjs')) fail('login-layout selftest is not part of check:eos-stability');
|
|
228
238
|
if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-internal-reserve-selftest.cjs')) fail('internal reserve selftest is not part of check:eos-stability');
|
|
229
239
|
if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-branding-selftest.cjs')) fail('branding selftest is not part of check:eos-stability');
|
|
230
240
|
if (!pkg.scripts['check:eos-stability']?.includes('nexowatt-native-shell-selftest.cjs')) fail('native shell selftest is not part of check:eos-stability');
|
package/INSTALL_TEST_V7.9.89.md
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
# Installation und Abnahme – NexoWatt EOS Admin 7.9.89
|
|
2
|
-
|
|
3
|
-
## Installation aus npm
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
cd /opt/iobroker
|
|
7
|
-
iobroker backup
|
|
8
|
-
iobroker stop eos-admin.0
|
|
9
|
-
npm install --no-save --omit=dev iobroker.eos-admin@7.9.89
|
|
10
|
-
iobroker upload eos-admin
|
|
11
|
-
iobroker restart eos-admin.0
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
## Portbelegung
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
iobroker set admin.0 --port 18081 --ip 127.0.0.1 --enabled false
|
|
18
|
-
iobroker set eos-admin.0 --port 8081 --ip 0.0.0.0 --enabled true
|
|
19
|
-
iobroker restart eos-admin.0
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
Aufruf:
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
http://SYSTEM-IP:8081
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Pflichtabnahme
|
|
29
|
-
|
|
30
|
-
### Admin / Service
|
|
31
|
-
|
|
32
|
-
- Anmeldung mit dem fest eingerichteten Passwort.
|
|
33
|
-
- Kein erzwungener Erstkennwortdialog.
|
|
34
|
-
- Expertenmodus verfügbar.
|
|
35
|
-
- Interner Admin und System-Notfallsicherung sichtbar.
|
|
36
|
-
- Vollständige Zugangs- und Rechteverwaltung.
|
|
37
|
-
|
|
38
|
-
### Installateur
|
|
39
|
-
|
|
40
|
-
- Erste Aktivierung: Ebene **Installateur**, Benutzer `installer`, Passwort leer, danach persönliches Passwort setzen.
|
|
41
|
-
- Kein Expertenmodus.
|
|
42
|
-
- Inbetriebnahme, Module, Dienste, Datenpunkte und Diagnose erreichbar.
|
|
43
|
-
- **Zugänge & Rechte** erreichbar; nur Endkunden-Reset möglich.
|
|
44
|
-
- Interner Admin und interne BackItUp-Notfallreserve nicht sichtbar.
|
|
45
|
-
- NexoWatt Sicherung nutzbar, sofern installiert und freigegeben.
|
|
46
|
-
|
|
47
|
-
### Gast / Endkunde
|
|
48
|
-
|
|
49
|
-
- Erste Aktivierung: Ebene **Gast / Endkunde**, Benutzer `guest`, Passwort leer, danach persönliches Passwort setzen.
|
|
50
|
-
- Kein Expertenmodus.
|
|
51
|
-
- Freigegebenes Smart Home, Räume, Funktionen und Bedienoberflächen erreichbar.
|
|
52
|
-
- Keine technischen System-, Repository-, Zertifikats- oder Rohdiagnosebereiche.
|
|
53
|
-
- Interner Admin und interne BackItUp-Notfallreserve nicht sichtbar.
|
|
54
|
-
- NexoWatt Sicherung nutzbar, sofern freigegeben.
|
|
55
|
-
|
|
56
|
-
### Bedienoberfläche
|
|
57
|
-
|
|
58
|
-
- EOS Assist sitzt im Kopfbereich und überlappt keine Inhalte.
|
|
59
|
-
- Zugangsverwaltung erscheint nur unter **Zugänge & Rechte**.
|
|
60
|
-
- Startseite ist **Übersicht**, nicht Easy.
|
|
61
|
-
- Keine `permissionError`-Leerseite.
|
|
62
|
-
- Dialoge, Popups und Schließen-Schaltflächen funktionieren.
|
|
63
|
-
- Schreibbare Datenpunkte sind entsprechend Rolle bedienbar.
|
|
64
|
-
|
|
65
|
-
## Rückfall auf 7.9.86
|
|
66
|
-
|
|
67
|
-
```bash
|
|
68
|
-
cd /opt/iobroker
|
|
69
|
-
iobroker stop eos-admin.0
|
|
70
|
-
npm install --no-save --omit=dev iobroker.eos-admin@7.9.86
|
|
71
|
-
iobroker upload eos-admin
|
|
72
|
-
iobroker restart eos-admin.0
|
|
73
|
-
```
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# npm-Veröffentlichung – NexoWatt EOS Admin 7.9.89 Stable
|
|
2
|
-
|
|
3
|
-
## Vorprüfung
|
|
4
|
-
|
|
5
|
-
```powershell
|
|
6
|
-
npm run check:eos-publish-channel
|
|
7
|
-
npm run check:eos-package
|
|
8
|
-
npm run check:eos-stability
|
|
9
|
-
npm publish --dry-run --tag latest
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
## Veröffentlichung
|
|
13
|
-
|
|
14
|
-
```powershell
|
|
15
|
-
npm login
|
|
16
|
-
npm whoami
|
|
17
|
-
npm publish --tag latest
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## Kontrolle
|
|
21
|
-
|
|
22
|
-
```powershell
|
|
23
|
-
npm view iobroker.eos-admin@latest version
|
|
24
|
-
npm dist-tag ls iobroker.eos-admin
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
Erwartet:
|
|
28
|
-
|
|
29
|
-
```text
|
|
30
|
-
latest: 7.9.89
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
Bereits veröffentlichte Paketversionen dürfen nicht mit verändertem Inhalt erneut veröffentlicht werden. Jede spätere Änderung benötigt eine höhere Versionsnummer.
|