# Correzione dei tentativi di disconnessione degli account nell'SDK Launch

Data: 2026-10-24. Corretto AUTH-07 e aggiornati i punti di ingresso del ciclo di vita degli account per Go, JavaScript, Python, C#, Java, Ruby, Rust, C e C++. **Nessuna distribuzione, pubblicazione dell'SDK, commit o push Git.** Questa attività non ha modificato il codice applicativo lato server di Launch o Licentivo.

## Comportamento

La disconnessione esplicita contrassegna prima il record dell'account nell'archivio sicuro come «solo in attesa di revoca», quindi chiama la disconnessione dell'SDK ufficiale e invia a Launch la revoca della sessione dell'account. Qualunque sia lo stato della rete o dell'annullamento, il runtime locale viene arrestato e non può continuare a eseguire funzionalità protette.

Finché Launch non conferma la revoca, l'SDK conserva l'attività in sospeso e le credenziali originali dell'account necessarie per riprovare, senza considerare più l'account connesso. Una nuova chiamata a `Logout`, `Login` o `Restore` riprende la richiesta di revoca; `Restore` non usa l'attività in sospeso per richiedere un'identità o avviare il runtime di autorizzazione. L'attività dell'account viene eliminata soltanto dopo una risposta riuscita o HTTP 401 che indica che la sessione originale non può più autenticarsi. In questo modo è possibile recuperare anche dopo la perdita di una risposta, evitando il caso in cui «la seconda disconnessione restituisce successo, ma la revoca non è mai stata reinviata».

I normali record degli account connessi rimangono compatibili con v2. I record in attesa di revoca usano il formato privato v3; Java e Rust hanno inoltre rimosso da tale struttura i campi delle credenziali necessari per l'accesso normale, per impedire ai vecchi SDK di scambiare un'attività in sospeso per un normale accesso. Le attività in sospeso non conservano attestazioni di identità di breve durata, chiavi di licenza o permessi firmati.

Le attività in sospeso degli account usano lo `Store` sicuro già configurato. **Il ripristino tra processi richiede un archivio sicuro persistente**, ad esempio Windows DPAPI o un archivio cifrato supportato dall'SDK; il valore predefinito `MemoryStore` conserva i dati soltanto nel processo corrente. I tentativi successivi vengono attivati dalle operazioni successive di accesso, ripristino o disconnessione, senza introdurre attività indipendenti in background. Se l'archiviazione o la revoca non sono completate, viene restituito un errore o un risultato in sospeso, senza segnalare un successo.

I ticket di disconnessione dei dispositivi dell'SDK Licentivo e `.logout.json` continuano a essere gestiti dall'SDK stesso; Launch non elimina la sua directory della cache e non decide i permessi dei dispositivi, delle funzionalità o dell'uso offline. Sono stati aggiornati anche gli esempi nativi e la documentazione SDK dei vari linguaggi.

## Verifica

| Ambito | Risultato |
| --- | --- |
| Pacchetti sorgente Go di Launch | 185 record di test superati, inclusi i sottocasi; nessun errore; `go vet` superato |
| HTTP Launch e MySQL reali | Dopo l'interruzione della richiesta di disconnessione, l'attività sicura in sospeso viene conservata; ricreando l'SDK non è possibile ripristinare l'accesso; al ripristino della rete la revoca viene reinviata e le interfacce di autenticazione e identità rifiutano entrambe il vecchio token |
| JavaScript | 10 verifiche superate, incluse disconnessione fallita, ripristino dopo la ricreazione e conferma tramite 401 |
| Python | 8 verifiche superate, incluse pulizia dell'account locale dopo la disconnessione, ripristino dopo la ricreazione e Windows DPAPI |
| C# | Superati i controlli del ciclo di vita, del ripristino delle attività in sospeso, della conservazione dei registri di disconnessione dell'SDK e di DPAPI |
| Java | 7 gruppi di test del ciclo di vita e di sicurezza superati, inclusi i tentativi di disconnessione offline |
| Ruby | Superata la regressione del ciclo di vita degli account, del ripristino delle attività in sospeso e dell'archiviazione cifrata |
| Rust | Tutti i test locali superati, inclusi il ripristino delle attività in sospeso dopo la ricreazione e l'esecuzione effettiva dell'SDK |
| C / C++ | Superati i controlli con firme reali dell'SDK, il ripristino dopo la ricreazione senza rete, la conferma tramite 401, DPAPI e i punti di ingresso di esecuzione C++ |
| Correzioni correnti delle autorizzazioni Licentivo | 45 record di test superati, senza errori né test saltati; comprendono notifiche negative in presenza di scostamenti delle politiche, coordinamento dei dispositivi con limiti ridotti, limiti manuali dei dispositivi e regressione delle autorizzazioni esistenti |
| SDK ufficiale incorporato | Tutti gli hash dei 115 file nel manifest corrispondono; l'implementazione delle autorizzazioni e della crittografia non è stata modificata |

Nella regressione dei sorgenti Launch sono stati saltati i quattro test `TestMySQLBaseline`, `TestProductUploadRoundTrip`, `TestInitialAdministratorMustChangePasswordBeforeAdministration` e `TestNewPaymentProvidersAndRegistrationWithoutMail`, che dipendono da altri database dedicati; non sono stati conteggiati tra quelli superati. In questa attività, l'SDK, l'HTTP degli account, la sincronizzazione degli acquisti e le procedure di mappatura sono stati verificati con database di test indipendenti.

## Test di integrazione tra i due sistemi

Usando un MySQL 8.0.32 locale indipendente, i servizi Launch e Licentivo correnti e i relativi worker, l'SDK Go Launch effettivo e il runtime ufficiale di autorizzazione, oltre all'archivio DPAPI degli account, sono state completate **15 fasi applicative**.

Aggiunte due verifiche di errori di disconnessione:

1. **Richiesta non consegnata a Launch**: l'interfaccia di disconnessione dell'account restituisce temporaneamente 503. L'SDK arresta le funzionalità locali, l'associazione reale del dispositivo Licentivo viene rilasciata e l'attività di revoca dell'account in sospeso viene conservata. Dopo la ricreazione dell'SDK si riprova ancora soltanto la disconnessione; ripristinata la connessione, la sessione Launch originale viene revocata e Licentivo conferma di aver ricevuto la notifica della sessione corrispondente.
2. **Revoca già eseguita sul server, ma risposta persa**: Launch ha elaborato la disconnessione e il proxy di test sostituisce la risposta con 503. L'attività in sospeso viene conservata tra ricreazioni dell'SDK; dopo il ripristino della connessione, HTTP 401 conferma che la sessione originale non è più valida e l'attività viene eliminata. Durante la procedura non vengono ripristinati accessi né riattivati dispositivi.

Le altre fasi coprono la sincronizzazione effettiva degli acquisti e l'esecuzione delle funzionalità firmate, il ripristino dopo la chiusura ordinaria, la disconnessione normale, lo scollegamento remoto e le vecchie generazioni, rinnovi e rimborsi, revoca degli account e nuovo accesso, rifiuto dell'esecuzione dopo un rimborso completo, recupero dei rimborsi, storni e regressione della traduzione di documenti lunghi. I tre aggiornamenti di Licentivo sono stati forniti dal relativo responsabile; questa attività si è limitata alla compilazione e alla verifica.

I canali di pagamento e DeepL usano servizi simulati isolati, senza addebiti, rimborsi o traduzioni a pagamento reali. La verifica congiunta dei servizi reali usa Go; gli altri linguaggi hanno completato la regressione SDK locale, senza affermare che tutti e nove abbiano eseguito individualmente un collaudo completo della distribuzione con servizi reali.

In questa sessione non è stato effettuato alcun accesso a `192.168.2.177`. I processi temporanei MySQL e Licentivo sono stati arrestati, conservando i servizi preesistenti e le prove dei test. I materiali originali si trovano in `.local/logout-retry-fix-20261024/`; per il riepilogo e gli hash dei sorgenti, consultare le [prove di verifica](https://github.com/spf86/licentivo-launch/blob/main/docs/logout-retry-fix-evidence-2026-10-24.json).
