feat(mqtt): add Waev broker

Add Waev (mqtt.waev.app) as a curated MQTT broker, selectable from the
web-panel Primary/Secondary dropdowns and the CLI.

- Broker spec on bit 0x20, audience mqtt.waev.app, Google Trust Services
  WE1 CA (matches Waev's cert chain); widen broker mask/count to 0x3F/6
- Per-broker JWT lifetime via BrokerSpec.token_ttl_secs: Waev enforces a
  1-hour max token TTL and rejects the 6h default with MQTT CONNACK 5,
  so it mints a 3600s token while other brokers keep the 6h default
- CLI get/set mqtt.waev, web-panel dropdown entry + hidden toggle, docs
- Log token TTL in the "token ready" line for broker auth debugging

fix(web): make Custom MQTT settings full width when Custom is selected

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jared Dohrman
2026-06-26 10:29:38 +10:00
co-authored by Claude Opus 4.8
parent dac0923899
commit 6ad3e5224e
7 changed files with 37 additions and 13 deletions
+8
View File
@@ -2446,6 +2446,8 @@ void MyMesh::handleCommand(uint32_t sender_timestamp, char *command, char *reply
sprintf(reply, "> %s", mqtt.isEndpointEnabled(0x01) ? "on" : "off");
} else if (strcmp(command, "get mqtt.meshmapper") == 0) {
sprintf(reply, "> %s", mqtt.isEndpointEnabled(0x10) ? "on" : "off");
} else if (strcmp(command, "get mqtt.waev") == 0) {
sprintf(reply, "> %s", mqtt.isEndpointEnabled(0x20) ? "on" : "off");
} else if (strcmp(command, "get mqtt.letsmesh-eu") == 0 || strcmp(command, "get mqtt.letsmesh.eu") == 0) {
sprintf(reply, "> %s", mqtt.isEndpointEnabled(0x02) ? "on" : "off");
} else if (strcmp(command, "get mqtt.letsmesh-us") == 0 || strcmp(command, "get mqtt.letsmesh.us") == 0) {
@@ -2504,6 +2506,12 @@ void MyMesh::handleCommand(uint32_t sender_timestamp, char *command, char *reply
} else {
strcpy(reply, "Err - max 2 mqtt brokers");
}
} else if (memcmp(command, "set mqtt.waev ", 14) == 0) {
if (mqtt.setEndpointEnabled(0x20, memcmp(&command[14], "on", 2) == 0)) {
strcpy(reply, "OK");
} else {
strcpy(reply, "Err - max 2 mqtt brokers");
}
} else if (memcmp(command, "set mqtt.letsmesh-eu ", 21) == 0 || memcmp(command, "set mqtt.letsmesh.eu ", 21) == 0) {
if (mqtt.setEndpointEnabled(0x02, memcmp(&command[21], "on", 2) == 0)) {
strcpy(reply, "OK");