Contribuisci a Rustwarden

Questo documento descrive le interazioni tra gitrust e il framework Rustwarden-core e spiega come estendere il framework dal lato gitrust senza modificarne le fonti.

Servizi quadro utilizzati

Service Usage dans gitrust
UserService CRUD users, roles, delete_user, admin_reset_password, change_password_direct, unassign_role_from_user
RoleService Liste/création/suppression roles, get_role_by_name
PasswordService hash_password (async), verify_password (async), generate_secure_password
ResourceService register/unregister repos, set_public, effective_permission, find_by_type_and_id
AuthService authenticate_user (login)
JwtService generate_token (login)
EmailValidationService Vérification email
PasswordResetService Flux "mot de passe oublié"
AppSettingsService get_bool pour registration_enabled

Hook "on_user_deleted" implementato

L'hook on_user_deleted in gitrust-hooks elimina la directory dell'utente sul filesystem (repos_base_path/username/) prima della cascata del DB. Chiamato automaticamente da UserService::delete_user.

Regola fondamentale

Non modificare mai crates/rustwarden-core/. Questo crate è il framework condiviso. Qualsiasi estensione passa attraverso:

  • wrapper sul lato gitrust-core (servizi che delegano al framework)
  • Tratti impliciti (RustwardenHooks in gitrust-hooks)
  • Estensioni tramite meccanismi di iniezione Axum ("Estensione", "Stato")

Nessun bypass in corso

Tutte le vecchie soluzioni alternative (entità dirette, hash manuali) sono state sostituite dai servizi framework in seguito all'aggiornamento del 26-03-2026.

Aggiungi una funzionalità che richiede un servizio framework mancante

Se un servizio necessario non esiste in Rustwarden-Core:

  1. Implementa il servizio sul lato gitrust-core riutilizzando le primitive del framework (ad esempio: PasswordService::hash_password per l'hashing)
  2. Se la funzionalità è generica e andrebbe a vantaggio del framework stesso, aprire un problema o un PR upstream sul repository Rustwarden-core
  3. Non duplicare l'autenticazione, la sessione o la logica JWT: queste aree appartengono esclusivamente al framework

Modello di estensione tramite ganci

Gli hook (gitrust-hooks/src/lib.rs) implementano RustwardenHooks e vengono inseriti nel router Axum all'avvio:

// Dans main.rs
let hooks = Arc::new(GitrustHooks::new(config.clone()));
// Passé via .merge_routes(app_routes(hooks))
// Puis disponible via axum::Extension dans les handlers

Per reagire a un nuovo evento del framework, aggiungi il metodo corrispondente nell'impl RustwardenHooks di gitrust-hooks, senza toccare il codice del framework che emette l'evento.