feat: federation panel + Dart SDK federation methods (0.70.0)
Some checks failed
Security / Security check (push) Failing after 2s

A new 'Föderation' destination (primary side) lists connected
satellites — name, region, version, wire version, advertised
capabilities — and adds them in one step: 'Add satellite' issues a
single-use bootstrap token bundled with the primary CA as a
ready-to-paste satellite config (the bundled CA makes the first
connect tamper-proof). Localized EN + DE, in-app help doc. Uses the
new HubService.listSatellites / issueSatelliteToken wrapping the
SDK's federation methods.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-06-13 14:16:07 +02:00
parent b35bbc1b12
commit d0cfa5df05
12 changed files with 815 additions and 4 deletions

View file

@ -1594,5 +1594,23 @@
"endpoint": {"type": "String"}
}
},
"hubUnreachableOpenSettings": "Einstellungen öffnen"
"hubUnreachableOpenSettings": "Einstellungen öffnen",
"navFederation": "Föderation",
"federationTitle": "Föderation",
"federationReloadTooltip": "Satelliten neu laden",
"federationAddSatellite": "Satellit hinzufügen",
"federationEmptyTitle": "Keine Satelliten verbunden",
"federationEmptyHint": "Verbinde einen weiteren Hub als Satellit, um Capabilities dort auszuführen. Stelle dazu ein Enrollment-Token aus.",
"federationPillConnected": "verbunden",
"federationRegionNone": "keine Region",
"federationCapabilities": "{count} angebotene Capabilities",
"federationAddDialogTitle": "Enrollment-Token ausstellen",
"federationNameLabel": "Satelliten-Name",
"federationIssueButton": "Ausstellen",
"federationIssueFailed": "Token konnte nicht ausgestellt werden: {error}",
"federationEnrollmentTitle": "{name} einrichten",
"federationTokenLabel": "Bootstrap-Token (einmalig)",
"federationConfigLabel": "Satelliten-Konfiguration (in den Satelliten einfügen)",
"federationCopied": "In die Zwischenablage kopiert",
"federationEnrollmentHint": "Übergib das Token dem Satelliten-Betreiber über einen sicheren Kanal. Die mitgelieferte CA macht den ersten Connect des Satelliten manipulationssicher."
}

View file

@ -1597,5 +1597,38 @@
"endpoint": {"type": "String"}
}
},
"hubUnreachableOpenSettings": "Open Settings"
"hubUnreachableOpenSettings": "Open Settings",
"navFederation": "Federation",
"federationTitle": "Federation",
"federationReloadTooltip": "Reload satellites",
"federationAddSatellite": "Add satellite",
"federationEmptyTitle": "No satellites connected",
"federationEmptyHint": "Connect another hub as a satellite to run capabilities on it. Issue an enrollment token to get started.",
"federationPillConnected": "connected",
"federationRegionNone": "no region",
"federationCapabilities": "{count} advertised capabilities",
"@federationCapabilities": {
"placeholders": {
"count": {"type": "int"}
}
},
"federationAddDialogTitle": "Issue an enrollment token",
"federationNameLabel": "Satellite name",
"federationIssueButton": "Issue",
"federationIssueFailed": "Could not issue token: {error}",
"@federationIssueFailed": {
"placeholders": {
"error": {"type": "String"}
}
},
"federationEnrollmentTitle": "Enroll {name}",
"@federationEnrollmentTitle": {
"placeholders": {
"name": {"type": "String"}
}
},
"federationTokenLabel": "Bootstrap token (single use)",
"federationConfigLabel": "Satellite config (paste into the satellite)",
"federationCopied": "Copied to clipboard",
"federationEnrollmentHint": "Hand the token to the satellite operator over a secure channel. The bundled CA makes the satellite's first connect tamper-proof."
}

View file

@ -4470,6 +4470,114 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Open Settings'**
String get hubUnreachableOpenSettings;
/// No description provided for @navFederation.
///
/// In en, this message translates to:
/// **'Federation'**
String get navFederation;
/// No description provided for @federationTitle.
///
/// In en, this message translates to:
/// **'Federation'**
String get federationTitle;
/// No description provided for @federationReloadTooltip.
///
/// In en, this message translates to:
/// **'Reload satellites'**
String get federationReloadTooltip;
/// No description provided for @federationAddSatellite.
///
/// In en, this message translates to:
/// **'Add satellite'**
String get federationAddSatellite;
/// No description provided for @federationEmptyTitle.
///
/// In en, this message translates to:
/// **'No satellites connected'**
String get federationEmptyTitle;
/// No description provided for @federationEmptyHint.
///
/// In en, this message translates to:
/// **'Connect another hub as a satellite to run capabilities on it. Issue an enrollment token to get started.'**
String get federationEmptyHint;
/// No description provided for @federationPillConnected.
///
/// In en, this message translates to:
/// **'connected'**
String get federationPillConnected;
/// No description provided for @federationRegionNone.
///
/// In en, this message translates to:
/// **'no region'**
String get federationRegionNone;
/// No description provided for @federationCapabilities.
///
/// In en, this message translates to:
/// **'{count} advertised capabilities'**
String federationCapabilities(int count);
/// No description provided for @federationAddDialogTitle.
///
/// In en, this message translates to:
/// **'Issue an enrollment token'**
String get federationAddDialogTitle;
/// No description provided for @federationNameLabel.
///
/// In en, this message translates to:
/// **'Satellite name'**
String get federationNameLabel;
/// No description provided for @federationIssueButton.
///
/// In en, this message translates to:
/// **'Issue'**
String get federationIssueButton;
/// No description provided for @federationIssueFailed.
///
/// In en, this message translates to:
/// **'Could not issue token: {error}'**
String federationIssueFailed(String error);
/// No description provided for @federationEnrollmentTitle.
///
/// In en, this message translates to:
/// **'Enroll {name}'**
String federationEnrollmentTitle(String name);
/// No description provided for @federationTokenLabel.
///
/// In en, this message translates to:
/// **'Bootstrap token (single use)'**
String get federationTokenLabel;
/// No description provided for @federationConfigLabel.
///
/// In en, this message translates to:
/// **'Satellite config (paste into the satellite)'**
String get federationConfigLabel;
/// No description provided for @federationCopied.
///
/// In en, this message translates to:
/// **'Copied to clipboard'**
String get federationCopied;
/// No description provided for @federationEnrollmentHint.
///
/// In en, this message translates to:
/// **'Hand the token to the satellite operator over a secure channel. The bundled CA makes the satellite\'s first connect tamper-proof.'**
String get federationEnrollmentHint;
}
class _AppLocalizationsDelegate

View file

@ -2632,4 +2632,67 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get hubUnreachableOpenSettings => 'Einstellungen öffnen';
@override
String get navFederation => 'Föderation';
@override
String get federationTitle => 'Föderation';
@override
String get federationReloadTooltip => 'Satelliten neu laden';
@override
String get federationAddSatellite => 'Satellit hinzufügen';
@override
String get federationEmptyTitle => 'Keine Satelliten verbunden';
@override
String get federationEmptyHint =>
'Verbinde einen weiteren Hub als Satellit, um Capabilities dort auszuführen. Stelle dazu ein Enrollment-Token aus.';
@override
String get federationPillConnected => 'verbunden';
@override
String get federationRegionNone => 'keine Region';
@override
String federationCapabilities(int count) {
return '$count angebotene Capabilities';
}
@override
String get federationAddDialogTitle => 'Enrollment-Token ausstellen';
@override
String get federationNameLabel => 'Satelliten-Name';
@override
String get federationIssueButton => 'Ausstellen';
@override
String federationIssueFailed(String error) {
return 'Token konnte nicht ausgestellt werden: $error';
}
@override
String federationEnrollmentTitle(String name) {
return '$name einrichten';
}
@override
String get federationTokenLabel => 'Bootstrap-Token (einmalig)';
@override
String get federationConfigLabel =>
'Satelliten-Konfiguration (in den Satelliten einfügen)';
@override
String get federationCopied => 'In die Zwischenablage kopiert';
@override
String get federationEnrollmentHint =>
'Übergib das Token dem Satelliten-Betreiber über einen sicheren Kanal. Die mitgelieferte CA macht den ersten Connect des Satelliten manipulationssicher.';
}

View file

@ -2635,4 +2635,67 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get hubUnreachableOpenSettings => 'Open Settings';
@override
String get navFederation => 'Federation';
@override
String get federationTitle => 'Federation';
@override
String get federationReloadTooltip => 'Reload satellites';
@override
String get federationAddSatellite => 'Add satellite';
@override
String get federationEmptyTitle => 'No satellites connected';
@override
String get federationEmptyHint =>
'Connect another hub as a satellite to run capabilities on it. Issue an enrollment token to get started.';
@override
String get federationPillConnected => 'connected';
@override
String get federationRegionNone => 'no region';
@override
String federationCapabilities(int count) {
return '$count advertised capabilities';
}
@override
String get federationAddDialogTitle => 'Issue an enrollment token';
@override
String get federationNameLabel => 'Satellite name';
@override
String get federationIssueButton => 'Issue';
@override
String federationIssueFailed(String error) {
return 'Could not issue token: $error';
}
@override
String federationEnrollmentTitle(String name) {
return 'Enroll $name';
}
@override
String get federationTokenLabel => 'Bootstrap token (single use)';
@override
String get federationConfigLabel =>
'Satellite config (paste into the satellite)';
@override
String get federationCopied => 'Copied to clipboard';
@override
String get federationEnrollmentHint =>
'Hand the token to the satellite operator over a secure channel. The bundled CA makes the satellite\'s first connect tamper-proof.';
}