From 9e38cf816fef38df3be3909956b493f10ae0834c Mon Sep 17 00:00:00 2001 From: Thomas Shufps Date: Wed, 3 Jun 2026 17:15:43 +0200 Subject: [PATCH 01/17] fix reboot required (#605) * fix reboot required * 3 fields that really require reboot were missing --------- Co-authored-by: Pmaxsd --- .../axe-os/src/app/pages/edit/edit.component.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/main/http_server/axe-os/src/app/pages/edit/edit.component.ts b/main/http_server/axe-os/src/app/pages/edit/edit.component.ts index ebfbbb1f6..e73d0c87d 100644 --- a/main/http_server/axe-os/src/app/pages/edit/edit.component.ts +++ b/main/http_server/axe-os/src/app/pages/edit/edit.component.ts @@ -62,7 +62,7 @@ export class EditComponent implements OnInit { 'ssid', 'wifiPass', 'wifiStatus', - 'invertfanpolarity', + 'invertFanPolarity', 'stratumDifficulty', 'stratum_keep', 'poolMode', @@ -398,9 +398,14 @@ export class EditComponent implements OnInit { const currentValue = this.normalizeValue(current[key]); const originalValue = this.normalizeValue(this.originalSettings[key]); - // Special case: masked password fields + // Masked password fields: unchanged if still '*****', changed otherwise if (typeof currentValue === 'string' && currentValue === '*****') { - continue; // User hasn't changed this field + continue; + } + // Fields not present in original settings (e.g. wifiPass): + // if we got past the '*****' check, the user has typed something new + if (originalValue === undefined || originalValue === null) { + return true; } if (currentValue !== originalValue) { From c169288fc8b52d8c33b6e8089efc71e2aea86a91 Mon Sep 17 00:00:00 2001 From: Eddy Date: Sat, 6 Jun 2026 12:11:35 +0200 Subject: [PATCH 02/17] fix: bound partial HTTP body reads (#611) --- main/http_server/http_utils.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main/http_server/http_utils.cpp b/main/http_server/http_utils.cpp index f60a63ff1..b3f6a2252 100644 --- a/main/http_server/http_utils.cpp +++ b/main/http_server/http_utils.cpp @@ -178,7 +178,8 @@ esp_err_t getPostData(httpd_req_t *req) } while (cur_len < total_len) { - received = httpd_req_recv(req, buf + cur_len, total_len); + int remaining = total_len - cur_len; + received = httpd_req_recv(req, buf + cur_len, remaining); if (received <= 0) { /* Respond with 500 Internal Server Error */ ESP_LOGE(TAG, "error receiving data"); From 3e07855ba8397bf9ee281ca6b7f5cbf84c70c96a Mon Sep 17 00:00:00 2001 From: Pmaxsd Date: Sat, 6 Jun 2026 13:09:30 +0200 Subject: [PATCH 03/17] reverted field name --- main/http_server/axe-os/src/app/pages/edit/edit.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/http_server/axe-os/src/app/pages/edit/edit.component.ts b/main/http_server/axe-os/src/app/pages/edit/edit.component.ts index e73d0c87d..f53cc9852 100644 --- a/main/http_server/axe-os/src/app/pages/edit/edit.component.ts +++ b/main/http_server/axe-os/src/app/pages/edit/edit.component.ts @@ -62,7 +62,7 @@ export class EditComponent implements OnInit { 'ssid', 'wifiPass', 'wifiStatus', - 'invertFanPolarity', + 'invertfanpolarity', 'stratumDifficulty', 'stratum_keep', 'poolMode', From f531e55737dcb530b2dea9f25bc06e43ccb3059c Mon Sep 17 00:00:00 2001 From: Pmaxsd Date: Sat, 6 Jun 2026 13:13:40 +0200 Subject: [PATCH 04/17] Revert "reverted field name" This reverts commit 3e07855ba8397bf9ee281ca6b7f5cbf84c70c96a. --- main/http_server/axe-os/src/app/pages/edit/edit.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/http_server/axe-os/src/app/pages/edit/edit.component.ts b/main/http_server/axe-os/src/app/pages/edit/edit.component.ts index f53cc9852..e73d0c87d 100644 --- a/main/http_server/axe-os/src/app/pages/edit/edit.component.ts +++ b/main/http_server/axe-os/src/app/pages/edit/edit.component.ts @@ -62,7 +62,7 @@ export class EditComponent implements OnInit { 'ssid', 'wifiPass', 'wifiStatus', - 'invertfanpolarity', + 'invertFanPolarity', 'stratumDifficulty', 'stratum_keep', 'poolMode', From 7860921bdbdf68e36541bea482ad99f8bb4b4e4b Mon Sep 17 00:00:00 2001 From: Pmaxsd Date: Sat, 6 Jun 2026 13:33:08 +0200 Subject: [PATCH 05/17] Reapply "reverted field name" This reverts commit f531e55737dcb530b2dea9f25bc06e43ccb3059c. --- main/http_server/axe-os/src/app/pages/edit/edit.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/http_server/axe-os/src/app/pages/edit/edit.component.ts b/main/http_server/axe-os/src/app/pages/edit/edit.component.ts index e73d0c87d..f53cc9852 100644 --- a/main/http_server/axe-os/src/app/pages/edit/edit.component.ts +++ b/main/http_server/axe-os/src/app/pages/edit/edit.component.ts @@ -62,7 +62,7 @@ export class EditComponent implements OnInit { 'ssid', 'wifiPass', 'wifiStatus', - 'invertFanPolarity', + 'invertfanpolarity', 'stratumDifficulty', 'stratum_keep', 'poolMode', From 92d6c77f29ea63efdcd17e7925ec5b2bb4f46dc3 Mon Sep 17 00:00:00 2001 From: Pmaxsd Date: Sun, 24 May 2026 07:59:29 +0200 Subject: [PATCH 06/17] removed fan-guessing artifact code --- .../src/app/pages/home/home.component.html | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/main/http_server/axe-os/src/app/pages/home/home.component.html b/main/http_server/axe-os/src/app/pages/home/home.component.html index 33005cf79..0c15e1d7e 100644 --- a/main/http_server/axe-os/src/app/pages/home/home.component.html +++ b/main/http_server/axe-os/src/app/pages/home/home.component.html @@ -554,15 +554,7 @@

{{ 'COMMON.SHUTDOWN' | translate }}

- @let fanRpm1 = (info.fanrpm ?? 0); - @let fanRpm2 = (info.fanrpm2 ?? 0); - @let fanC1HasRpm = fanRpm1 > 0; - @let fanC2HasRpm = fanRpm2 > 0; - @let singleFanUsesC2 = !fanC1HasRpm && fanC2HasRpm; - @let primaryFanPercent = singleFanUsesC2 ? (info.fanspeed2 ?? 0) : (info.fanspeed ?? 0); - @let primaryFanRpm = singleFanUsesC2 ? (info.fanrpm2 ?? 0) : (info.fanrpm ?? 0); - @let showFanC1 = (primaryFanPercent > 0) || (primaryFanRpm > 0) || !fanC2HasRpm; - @let showFanC2 = fanC1HasRpm && fanC2HasRpm; + @let showFanC2 = (info.fanCount ?? 1) > 1; - @let fanC1LowRpm = shouldShowLowRpmHint(primaryFanPercent, primaryFanRpm); - From 50890c0f6362b7fb821a1bcccce9b485db3fd2e7 Mon Sep 17 00:00:00 2001 From: Eddy Date: Sat, 6 Jun 2026 18:45:49 +0200 Subject: [PATCH 07/17] fix: use X-TOTP for alert test OTP (#617) --- .../src/app/services/system.service.spec.ts | 25 ++++++++++++++++++- .../axe-os/src/app/services/system.service.ts | 2 +- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/main/http_server/axe-os/src/app/services/system.service.spec.ts b/main/http_server/axe-os/src/app/services/system.service.spec.ts index 8dbc519cf..34eac1f2c 100644 --- a/main/http_server/axe-os/src/app/services/system.service.spec.ts +++ b/main/http_server/axe-os/src/app/services/system.service.spec.ts @@ -1,16 +1,39 @@ import { TestBed } from '@angular/core/testing'; +import { provideHttpClient } from '@angular/common/http'; +import { provideHttpClientTesting, HttpTestingController } from '@angular/common/http/testing'; import { SystemService } from './system.service'; describe('SystemService', () => { let service: SystemService; + let httpMock: HttpTestingController; beforeEach(() => { - TestBed.configureTestingModule({}); + TestBed.configureTestingModule({ + providers: [ + provideHttpClient(), + provideHttpClientTesting(), + ], + }); service = TestBed.inject(SystemService); + httpMock = TestBed.inject(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); }); it('should be created', () => { expect(service).toBeTruthy(); }); + + it('sendAlertTest sends one-shot OTP using the backend accepted X-TOTP header', () => { + service.sendAlertTest('', '123456').subscribe(); + + const req = httpMock.expectOne('/api/v2/alert/test'); + expect(req.request.method).toBe('POST'); + expect(req.request.headers.get('X-TOTP')).toBe('123456'); + expect(req.request.headers.has('X-OTP-Code')).toBeFalse(); + req.flush('ok'); + }); }); diff --git a/main/http_server/axe-os/src/app/services/system.service.ts b/main/http_server/axe-os/src/app/services/system.service.ts index 8236e5ed0..c35e045f3 100644 --- a/main/http_server/axe-os/src/app/services/system.service.ts +++ b/main/http_server/axe-os/src/app/services/system.service.ts @@ -334,7 +334,7 @@ export class SystemService { } public sendAlertTest(uri: string = '', totp?: string): Observable { - const headers = totp ? new HttpHeaders({ 'X-OTP-Code': totp }) : undefined; + const headers = totp ? new HttpHeaders({ 'X-TOTP': totp }) : undefined; return this.httpClient.post(`${uri}/api/alert/test`, {}, { responseType: 'text', headers, From 5ea20148eda2917eb7a2574ea0f34a6b1200a533 Mon Sep 17 00:00:00 2001 From: Pmaxsd Date: Sun, 7 Jun 2026 06:19:06 +0200 Subject: [PATCH 08/17] Revert spec file to pre-v2 state on LTS branch Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/app/services/system.service.spec.ts | 25 +------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/main/http_server/axe-os/src/app/services/system.service.spec.ts b/main/http_server/axe-os/src/app/services/system.service.spec.ts index 34eac1f2c..8dbc519cf 100644 --- a/main/http_server/axe-os/src/app/services/system.service.spec.ts +++ b/main/http_server/axe-os/src/app/services/system.service.spec.ts @@ -1,39 +1,16 @@ import { TestBed } from '@angular/core/testing'; -import { provideHttpClient } from '@angular/common/http'; -import { provideHttpClientTesting, HttpTestingController } from '@angular/common/http/testing'; import { SystemService } from './system.service'; describe('SystemService', () => { let service: SystemService; - let httpMock: HttpTestingController; beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - provideHttpClient(), - provideHttpClientTesting(), - ], - }); + TestBed.configureTestingModule({}); service = TestBed.inject(SystemService); - httpMock = TestBed.inject(HttpTestingController); - }); - - afterEach(() => { - httpMock.verify(); }); it('should be created', () => { expect(service).toBeTruthy(); }); - - it('sendAlertTest sends one-shot OTP using the backend accepted X-TOTP header', () => { - service.sendAlertTest('', '123456').subscribe(); - - const req = httpMock.expectOne('/api/v2/alert/test'); - expect(req.request.method).toBe('POST'); - expect(req.request.headers.get('X-TOTP')).toBe('123456'); - expect(req.request.headers.has('X-OTP-Code')).toBeFalse(); - req.flush('ok'); - }); }); From f02a4087e6b33a63841c87767335414aa071c27b Mon Sep 17 00:00:00 2001 From: Pmaxsd Date: Sun, 7 Jun 2026 06:40:14 +0200 Subject: [PATCH 09/17] Fix input voltage warning using board-specific min/max values NerdAxe boards run at 5V which triggered false orange warnings with the hardcoded 12V thresholds. Use the board-reported voltage range instead. Backported from #600. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../axe-os/src/app/pages/home/home.component.html | 2 +- .../axe-os/src/app/pages/home/home.component.ts | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/main/http_server/axe-os/src/app/pages/home/home.component.html b/main/http_server/axe-os/src/app/pages/home/home.component.html index 0c15e1d7e..92ae50a38 100644 --- a/main/http_server/axe-os/src/app/pages/home/home.component.html +++ b/main/http_server/axe-os/src/app/pages/home/home.component.html @@ -466,7 +466,7 @@

{{ 'COMMON.SHUTDOWN' | translate }}