feat(studio): registry credentials panel in Settings (v0.44.0)

The hub install path now reads `~/.fai/registry-token` as a
fallback when `FAI_REGISTRY_TOKEN` is unset (platform v0.10.92).
Studio now writes that file directly: a fresh operator pastes
the PAT into Settings → Registry credentials, hits Save, and
the next install attempt resolves the auth wall without any
shell or env-var setup.

The token never round-trips back into Studio after save —
status is shown only as "Configured (40 chars)" / "Not set"
with no display of the secret itself. The Clear action deletes
the file. On Unix the file is chmod-ed to 0600 (owner-only
read/write); Windows leaves the default user ACL in place.

Storage is strictly local: `~/.fai/registry-token`, never sent
to a remote service. The hint text under the field says so to
make the data flow explicit.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-05-09 13:38:47 +02:00
parent 01f3f773cf
commit 878f0a4e28
8 changed files with 464 additions and 6 deletions

View file

@ -1970,6 +1970,78 @@ abstract class AppLocalizations {
/// **'Could not open file: {error}'**
String flowsOpenInEditorFailed(String error);
/// No description provided for @registryCredentialsHeader.
///
/// In en, this message translates to:
/// **'REGISTRY CREDENTIALS'**
String get registryCredentialsHeader;
/// No description provided for @registryCredentialsBlurb.
///
/// In en, this message translates to:
/// **'Token used to download .fai modules from a registry behind a signin wall (Forgejo, GitHub-private). Stored at ~/.fai/registry-token, mode 0600. The FAI_REGISTRY_TOKEN env var still wins when set.'**
String get registryCredentialsBlurb;
/// No description provided for @registryTokenStatusConfigured.
///
/// In en, this message translates to:
/// **'Configured ({chars} chars)'**
String registryTokenStatusConfigured(int chars);
/// No description provided for @registryTokenStatusNotSet.
///
/// In en, this message translates to:
/// **'Not set'**
String get registryTokenStatusNotSet;
/// No description provided for @registryTokenFieldLabel.
///
/// In en, this message translates to:
/// **'Token'**
String get registryTokenFieldLabel;
/// No description provided for @registryTokenFieldHint.
///
/// In en, this message translates to:
/// **'Paste your Forgejo or GitHub personal access token'**
String get registryTokenFieldHint;
/// No description provided for @registryTokenSaveButton.
///
/// In en, this message translates to:
/// **'Save'**
String get registryTokenSaveButton;
/// No description provided for @registryTokenClearButton.
///
/// In en, this message translates to:
/// **'Clear'**
String get registryTokenClearButton;
/// No description provided for @registryTokenStorageHint.
///
/// In en, this message translates to:
/// **'Saved locally to ~/.fai/registry-token. Never sent to a remote service.'**
String get registryTokenStorageHint;
/// No description provided for @registryTokenSavedToast.
///
/// In en, this message translates to:
/// **'Registry token saved.'**
String get registryTokenSavedToast;
/// No description provided for @registryTokenClearedToast.
///
/// In en, this message translates to:
/// **'Registry token cleared.'**
String get registryTokenClearedToast;
/// No description provided for @registryTokenSaveFailedToast.
///
/// In en, this message translates to:
/// **'Could not save: {error}'**
String registryTokenSaveFailedToast(String error);
/// No description provided for @welcomeChecklistAllSetTitle.
///
/// In en, this message translates to: