Add startup connection validation to GUI

- Add validate_token() method to RegistryClient
  - Returns (is_valid, error_message) tuple
  - Catches 401/UNAUTHORIZED errors and connection issues
- Add startup validation in MainWindow
  - Runs 500ms after window shows (non-blocking)
  - Clears invalid tokens automatically
  - Shows status bar message explaining what happened
- Document cmdforge config disconnect command

This prevents confusing errors when trying to publish with stale or
revoked credentials - the GUI now auto-clears bad connections on restart.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
This commit is contained in:
rob
2026-01-17 01:59:16 -04:00
co-authored by Claude Opus 4.5
parent 66fd121ee4
commit 85d1212c0d
3 changed files with 62 additions and 1 deletions
+28 -1
View File
@@ -5,7 +5,7 @@ from PySide6.QtWidgets import (
QListWidget, QListWidgetItem, QStackedWidget,
QStatusBar, QLabel, QSplitter
)
from PySide6.QtCore import Qt, QSize, QSettings
from PySide6.QtCore import Qt, QSize, QSettings, QTimer
from PySide6.QtGui import QIcon, QFont, QShortcut, QKeySequence
from .styles import STYLESHEET
@@ -68,6 +68,33 @@ class MainWindow(QMainWindow):
# Restore window geometry
self._restore_geometry()
# Validate registry connection after window shows
QTimer.singleShot(500, self._validate_registry_connection)
def _validate_registry_connection(self):
"""Check if registry connection is valid on startup, clear if invalid."""
try:
from ..registry_client import RegistryClient
from ..config import set_registry_token, load_config
config = load_config()
if not config.registry.token:
return # No connection configured, nothing to validate
client = RegistryClient()
is_valid, error = client.validate_token()
if not is_valid:
# Token is invalid, clear it
set_registry_token(None)
self.status_bar.showMessage(
f"Registry connection cleared: {error}. Please reconnect.",
10000 # Show for 10 seconds
)
except Exception as e:
# Don't crash on validation errors, just log to status
self.status_bar.showMessage(f"Could not validate registry connection: {e}", 5000)
def _setup_sidebar(self):
"""Set up sidebar navigation items."""
items = [