feat(settings): hub bearer-token panel + auto-attach on every RPC
Some checks failed
Security / Security check (push) Failing after 1s

Studio gains a new "HUB AUTHENTICATION" panel in Settings
mirroring the existing registry-credentials panel:

- `lib/data/hub_auth_token.dart` — `~/.fai/hub-auth-token`
  helper (read / write / clear, mode 0600 on Unix). Sister
  of `RegistryToken` with the same on-disk hygiene.
- `HubService.loadPersistedEndpoint` now reads the token at
  startup and reconnects with it. `reconnect()` grew an
  `authToken:` parameter with a sentinel that distinguishes
  "keep current" from "drop". `reloadAuthToken()` is the
  one-liner Settings calls after save / clear.
- `_HubAuthTokenPanel` in `fai_settings_dialog.dart` — paste
  with show/hide toggle, save button, clear button, status
  pill ("Configured (40 chars)" / "Not set (anonymous)"),
  storage-location hint. Trimmed token length only — the
  secret never round-trips back into the UI after save.
- EN + DE ARB entries (`hubAuthToken*`) + regenerated
  `app_localizations.dart` keep the bilingual surface
  consistent.

The hub side (auth.tokens config + tower middleware) shipped
on the platform side 2026-05-28 (43a54a2). Until now an
operator had no GUI path to consume it: they had to find the
file in their home dir, paste the token by hand, and bounce
Studio. This panel closes that loop.

Bumped pubspec to 0.47.0. dart analyze clean (No issues
found!); flutter test green (11 tests pass).

Block E item 1 of 4 done. Capability-picker badges,
default_scope editor, multi-version uninstall picker follow.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-05-28 23:24:15 +02:00
parent 3237c4415a
commit c5a96bc8d4
9 changed files with 538 additions and 12 deletions

View file

@ -1241,6 +1241,49 @@ class AppLocalizationsDe extends AppLocalizations {
return 'Speichern fehlgeschlagen: $error';
}
@override
String get hubAuthTokenHeader => 'HUB-AUTHENTIFIZIERUNG';
@override
String get hubAuthTokenBlurb =>
'Bearer-Token für die Studio-Anbindung an einen Hub mit aktivierter auth.tokens-Konfiguration (RBAC Level 2). Gespeichert in ~/.fai/hub-auth-token, Modus 0600. Studio sendet ihn als Authorization: Bearer bei jedem gRPC-Aufruf.';
@override
String hubAuthTokenStatusConfigured(int chars) {
return 'Eingerichtet ($chars Zeichen)';
}
@override
String get hubAuthTokenStatusNotSet => 'Nicht gesetzt (anonym)';
@override
String get hubAuthTokenFieldLabel => 'Token';
@override
String get hubAuthTokenFieldHint =>
'Token aus dem auth.tokens-Eintrag des Hub-Operators einfügen';
@override
String get hubAuthTokenSaveButton => 'Speichern';
@override
String get hubAuthTokenClearButton => 'Entfernen';
@override
String get hubAuthTokenStorageHint =>
'Lokal gespeichert in ~/.fai/hub-auth-token. Studio verbindet nach dem Speichern automatisch neu, der Token wirkt sofort.';
@override
String get hubAuthTokenSavedToast => 'Hub-Token gespeichert.';
@override
String get hubAuthTokenClearedToast => 'Hub-Token entfernt.';
@override
String hubAuthTokenSaveFailedToast(String error) {
return 'Speichern fehlgeschlagen: $error';
}
@override
String get maintenanceHeader => 'HUB-WARTUNG';