3. Diagramma di stato e flusso (State and Flow Diagram)
Il protocollo IMAP4rev1 ha quattro stati. La maggior parte dei comandi è valida solo in uno stato specifico.
3.1. Stato non autenticato (Not Authenticated State)
Nello stato non autenticato (Not Authenticated State), il client ha stabilito una connessione ma l'autenticazione non è ancora stata effettuata. In questo stato, il server non si fida ancora del client.
I comandi validi nello stato non autenticato sono:
- CAPABILITY - Interroga le capacità del server
- NOOP - Non fa nulla (mantiene la connessione)
- LOGOUT - Termina la connessione
- STARTTLS - Avvia la crittografia TLS
- AUTHENTICATE - Autentica utilizzando un meccanismo di autenticazione SASL
- LOGIN - Autentica con nome utente e password
Quando l'autenticazione ha successo, il protocollo passa allo stato autenticato (Authenticated State).
3.2. Stato autenticato (Authenticated State)
Nello stato autenticato (Authenticated State), il client è autenticato ma non è ancora stata selezionata alcuna mailbox. In questo stato, sono possibili operazioni a livello di mailbox.
I comandi validi nello stato autenticato sono:
- Tutti i comandi dello stato non autenticato
- SELECT - Seleziona una mailbox e passa allo stato selezionato
- EXAMINE - Seleziona una mailbox in modalità di sola lettura
- CREATE - Crea una nuova mailbox
- DELETE - Elimina una mailbox
- RENAME - Rinomina una mailbox
- SUBSCRIBE - Si iscrive a una mailbox
- UNSUBSCRIBE - Annulla l'iscrizione a una mailbox
- LIST - Ottiene un elenco di mailbox
- LSUB - Ottiene un elenco di mailbox sottoscritte
- STATUS - Ottiene informazioni di stato su una mailbox
- APPEND - Aggiunge un messaggio a una mailbox
Quando un comando SELECT o EXAMINE ha successo, il protocollo passa allo stato selezionato (Selected State).
3.3. Stato selezionato (Selected State)
Nello stato selezionato (Selected State), è selezionata una mailbox e sono possibili operazioni a livello di messaggio. In questo stato, è possibile eseguire operazioni come la lettura, la ricerca, la modifica e l'eliminazione di messaggi.
I comandi validi nello stato selezionato sono:
- Tutti i comandi dello stato autenticato
- CHECK - Richiede un checkpoint della mailbox
- CLOSE - Chiude la mailbox selezionata e torna allo stato autenticato
- EXPUNGE - Elimina definitivamente i messaggi contrassegnati per l'eliminazione
- SEARCH - Cerca messaggi nella mailbox
- FETCH - Recupera i dati del messaggio
- STORE - Modifica i flag del messaggio
- COPY - Copia messaggi in un'altra mailbox
- UID - Esegue comandi utilizzando gli UID
Lo stato selezionato termina con un SELECT o EXAMINE di un'altra mailbox, un comando CLOSE o un comando LOGOUT.
3.4. Stato di disconnessione (Logout State)
Nello stato di disconnessione (Logout State), la connessione è in fase di terminazione. Il server invia una risposta BYE e chiude la connessione.
Il comando LOGOUT può essere emesso da qualsiasi stato. Quando viene emesso un comando LOGOUT, il server invia una risposta BYE non taggata, quindi una risposta OK taggata e chiude la connessione.
Diagramma di transizione di stato:
+------------------------+
|connessione stabilita |
+------------------------+
||
\/
+-------------------------------+
| saluto iniziale |
+-------------------------------+
|| (1)
\/
+-------------------------------+
| Stato non autenticato |
| Not Authenticated State |
+-------------------------------+
|| (2)
\/
+-------------------------------+
| Stato autenticato |
| Authenticated State |
+-------------------------------+
|| (3)
\/
+-------------------------------+
| Stato selezionato |
| Selected State |
+-------------------------------+
|| (4)
\/
+-------------------------------+
| Stato di disconnessione |
| Logout State |
+-------------------------------+
||
\/
+-------------------------------+
| connessione chiusa |
+-------------------------------+
Transizioni:
- (1) Dopo l'instaurazione della connessione, ingresso automatico nello stato non autenticato
- (2) Passaggio allo stato autenticato dopo il successo del comando LOGIN o AUTHENTICATE
- (3) Passaggio allo stato selezionato dopo il successo del comando SELECT o EXAMINE
- (4) Passaggio allo stato di disconnessione tramite il comando LOGOUT o la disconnessione
Note importanti:
- Il client dovrebbe (SHOULD) inviare solo comandi validi nello stato corrente
- Il server dovrebbe (SHOULD) restituire una risposta BAD per comandi non validi nello stato corrente
- Il comando LOGOUT può essere eseguito da tutti gli stati