Skip to content

Commit

Permalink
Added timer for non-responding server
Browse files Browse the repository at this point in the history
  • Loading branch information
spooni01 committed Nov 18, 2024
1 parent dee7f6a commit 150d079
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 4 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ IMAP je sieťový protokol, ktorý umožnuje klientovi pristupovať k e-mailom,
TLS je šifrovací protokol, ktorý robí komunikáciu medzi dvoma zariadeniami bezpečnejšou, teda v prípade tohto programu ochraňuje prenos údajov medzi klientom a serverom. V prípade, keď sa pripája klient pomocou IMAPS, automaticky sa vytvorí TLS spojenie, ktoré túto komunikáciu zabezpečuje.<br>
IMAPS je teda komunikácia protokolom IMAP s podporou šifrovacieho protokolu TLS.<br>

### Možné chyby
* Zo zatiaľ nezistených príčin nastáva niekedy problém pri overovaní certifikátov a pripájaní sa na takéto serveri
### Odchylky od zadania
* Pri neexistujúcom autorizačnom súbore skončí program vyvolaním výnimky a pri nesprávnych údajoch (v existujúcom súbore) skončí program s nulovým návratovým kódom a s oznámením, že sa nepodarilo overiť identitu na strane servera. Napr. `./imapcl ... -a non_existing_file.txt` skončí výnimkou a nie textom `Není možné ověřit identitu serveru xxx.` ako bolo uvedené v zadaní.

### Použitie programu
```
Expand Down
4 changes: 2 additions & 2 deletions doc/manual.tex
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@
Trieda riadi tok programu pomocou konečného stavového automatu (FSM). Obsahuje stavy programu a metódy na ich prechod, a to konkrétne stavy INIT, AUTH, SELECT, DOWNLOAD, QUIT a END (viď \ref{subsection:usecase}).

\item \textbf{AuthManager} \\
Spravuje autentifikáciu používateľa. Zabezpečuje získanie prihlasovacích údajov a ich správne uloženie do tejto triedy. Autentifikačný súbor musí mať formát \texttt{username = xxx} a na ďalšom riadku \texttt{password = yyy}.
Spravuje autentifikáciu používateľa. Zabezpečuje získanie prihlasovacích údajov a ich správne uloženie do tejto triedy. Autentifikačný súbor musí mať formát \texttt{username = xxx} a na ďalšom riadku \texttt{password = yyy}. Pri neexistujúcom súbore skončí program vyvolaním výnimku a pri nesprávnych údajoch skončí program s nulovým návratovým kódom a oznámením, že sa nepodarilo overiť identitu na strane servera.

\item \textbf{ArgsParser} \\
Zodpovedá za spracovanie argumentov príkazového riadku. Umožňuje používateľovi zadať konfiguráciu, ako je názov servera, portu, a ďalšie možnosti.
Expand All @@ -170,7 +170,7 @@
Zodpovedá za vytváranie inštancií správ. Prijíma surové dáta zo servera a transformuje ich na objekt typu `Message`. Po spracovaní týchto dát je každá e-mailová správa uložená do vlastného súboru, ktorý má nazov vo formáte \texttt{SUBJECT\_IDMESSAGE.txt}. Tento názov bol zvolený pretože je jedinečný pre akékoľvek emailové správy (vďaka IDMESSAGE) a zároveň je prehľadný kvôli použitiu predmetu správy v názve.

\item \textbf{IMAPConnection} \\
Spravuje spojenie so serverom pomocou protokolu IMAP(S). Umožňuje odosielať príkazy na server, prijímať odpovede a spracúvať komunikáciu\cite{opennsslapi}.
Spravuje spojenie so serverom pomocou protokolu IMAP(S). Umožňuje odosielať príkazy na server, prijímať odpovede a spracúvať komunikáciu\cite{opennsslapi}. V tejto triede je vo funckii na prijatie odpovedí zabudovaný časovač, ktorý má dĺžku 10 sekúnd a slúži na ukončenie programu v prípade, že by server prestal odpovedať.

\item \textbf{IMAPClient} \\
Hlavná trieda, ktorá integruje všetky ostatné komponenty. Implementuje logiku programu na riadenie stavového automatu, vykonáva autentifikáciu a sťahovanie e-mailových správ.
Expand Down
Binary file modified manual.pdf
Binary file not shown.
19 changes: 19 additions & 0 deletions src/classes/IMAPConnection/IMAPConnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -233,10 +233,21 @@ std::string IMAPConnection::readResponse(const std::string& endCondition)
int bytes;
std::string response;

// Start a timer to track elapsed time.
auto start = std::chrono::steady_clock::now();

// Secure connection (SSL) or non-secure (BIO).
if (this->secure) {

while ((bytes = SSL_read(this->ssl, buffer, sizeof(buffer) - 1)) > 0) {
// Check if timeout has occurred.
auto now = std::chrono::steady_clock::now();
std::chrono::duration<double> elapsed_seconds = now - start;
if (elapsed_seconds.count() > 10) {
DEBUG_PRINT(ANSI_COLOR_RED, "IMAPConnection::readResponse() -> Timeout occurred while reading response.");
throw IMAPException("Timeout expired");
}

buffer[bytes] = '\0';
response += buffer;

Expand All @@ -262,6 +273,14 @@ std::string IMAPConnection::readResponse(const std::string& endCondition)
} else {

while ((bytes = BIO_read(this->bio, buffer, sizeof(buffer) - 1)) > 0) {
// Check if timeout has occurred.
auto now = std::chrono::steady_clock::now();
std::chrono::duration<double> elapsed_seconds = now - start;
if (elapsed_seconds.count() > 10) {
DEBUG_PRINT(ANSI_COLOR_RED, "IMAPConnection::readResponse() -> Timeout occurred while reading response.");
throw IMAPException("Timeout expired");
}

buffer[bytes] = '\0';
response += buffer;

Expand Down

0 comments on commit 150d079

Please sign in to comment.