Files
RustBox/docs/RUSTBOX_PLAN.md
T
Mateusz Gruszczyński bc5fbd6ba9
RustBox CI / rustbox (push) Waiting to run
first commit
2026-10-29 15:24:59 +01:00

28 KiB

RustBox 0.0.1 — plan funkcjonalny bazowego wydania

Status: wersja wewnętrzna / przed publikacją
Wersja: 0.0.1
Cel: doprowadzić RustBox do poziomu funkcjonalnego zbliżonego do Roundcube wraz z typowymi funkcjami zapewnianymi przez jego oficjalne i popularne wtyczki — przed pierwszym publicznym wydaniem.

0. wielojezykowosc,

wstepnie angielski i polski, wszystko jak w rustproxy, czyli w plkikach jezykow, wybor nalezy do usera

1. Zasada wydania 0.0.1

RustBox 0.0.1 jest wydaniem bazowym i nie jest przeznaczony do publikacji przed zakończeniem całego poniższego zakresu.

Wszystkie funkcje opisane w tym dokumencie należą do 0.0.1. Kolejne sekcje są etapami realizacyjnymi wewnątrz tej samej wersji, a nie osobnymi wydaniami.

Podstawowe założenia:

  • jedna aplikacja Rust;
  • jeden proces runtime;
  • brak Node.js, Bun, React, Next.js i TypeScriptu w źródłach produktu;
  • interfejs HTML/CSS/vanilla JavaScript osadzony w binarce;
  • konfiguracja serwerów IMAP/SMTP/ManageSieve wyłącznie po stronie serwera w pliku konfiguracyjnym;
  • ekran logowania zawiera tylko dane użytkownika potrzebne do uwierzytelnienia, domyślnie e-mail i hasło;
  • obsługa IMAP, SMTP, ManageSieve, WebSocket, sesji i UI w jednym procesie;
  • zachowanie możliwości śledzenia rozwoju Oxi i portowania jego nowych funkcji do RustBox;
  • brak automatycznego przywracania starego frontendu Oxi podczas synchronizacji z upstreamem;
  • własny spójny interfejs RustBox inspirowany układem klasycznego webmaila typu Roundcube;
  • brak gradientów;
  • brak emoji i znaków Unicode udających ikony;
  • wyłącznie spójne, popularne ikony SVG;
  • ciemny, jasny i systemowy motyw;
  • pełna obsługa desktopu i urządzeń mobilnych.

2. Etap A — pełny fundament klienta IMAP

To jest najwyższy priorytet. RustBox musi być pełnoprawnym klientem pocztowym zanim rozbudowane zostaną funkcje dodatkowe.

2.1. Foldery IMAP

Pełny menedżer folderów musi obsługiwać:

  • hierarchiczną listę folderów zgodnie z delimiterem zgłaszanym przez IMAP;
  • tworzenie folderów;
  • tworzenie podfolderów;
  • zmianę nazwy folderu;
  • usuwanie folderu z potwierdzeniem;
  • subskrypcję folderu;
  • anulowanie subskrypcji;
  • przenoszenie folderów, jeśli serwer i protokół to umożliwiają;
  • opróżnianie folderu;
  • oznaczenie wszystkich wiadomości jako przeczytane;
  • liczniki wiadomości wszystkich i nieprzeczytanych;
  • automatyczne odświeżanie liczników;
  • obsługę IMAP IDLE;
  • specjalne foldery;
  • foldery współdzielone;
  • namespaces IMAP;
  • właściwe kodowanie nazw folderów;
  • Unicode w nazwach folderów;
  • możliwość ustawienia folderów specjalnych przez użytkownika.

Foldery specjalne

Użytkownik musi móc wybrać folder dla:

  • Sent;
  • Drafts;
  • Trash;
  • Junk/Spam;
  • Archive.

Układ ustawień:

Settings
└── Folders
    ├── Subscriptions
    ├── Special folders
    │   ├── Sent
    │   ├── Drafts
    │   ├── Trash
    │   ├── Junk
    │   └── Archive
    ├── Create folder
    ├── Rename
    ├── Delete
    └── Folder properties

2.2. Operacje na wiadomościach

RustBox musi obsługiwać:

  • otwarcie wiadomości;
  • odpowiedź;
  • odpowiedź wszystkim;
  • przekazanie wiadomości;
  • przekazanie jako załącznik;
  • oznaczenie przeczytane/nieprzeczytane;
  • flagowanie;
  • usunięcie flagi;
  • przeniesienie;
  • kopiowanie;
  • archiwizację;
  • usuwanie;
  • przeniesienie do spamu;
  • oznaczenie jako nie-spam;
  • zaznaczanie wielu wiadomości;
  • zaznaczanie wszystkich wyników;
  • operacje grupowe;
  • drag & drop między folderami;
  • Undo po możliwych do cofnięcia operacjach;
  • zachowanie pozycji scrolla i stanu listy po powrocie do folderu.

2.3. Menu kontekstowe — prawy przycisk myszy

Wiadomość

Open
Reply
Reply all
Forward
Forward as attachment
---
Mark read / unread
Flag / unflag
---
Move to…
Copy to…
Archive
Delete
Spam / Not spam
---
Create filter from message
Add sender to contacts
Search messages from sender
---
Show headers
Show source
Download .eml
Print

Folder

Open
Open in new view
---
Mark all read
Create subfolder
Rename
Subscribe / Unsubscribe
Empty
Delete
---
Properties
Permissions

Załącznik

Open
Download
Save
Download all as ZIP

2.4. Wątki

Obsługa wątków musi obejmować:

  • widok threaded i flat;
  • poprawne użycie Message-ID, In-Reply-To, References;
  • rozwijanie i zwijanie wątku;
  • automatyczne rozwijanie zgodnie z preferencją użytkownika;
  • przechodzenie między wiadomościami w wątku;
  • liczbę wiadomości w wątku;
  • status unread/flagged na poziomie wątku;
  • poprawne zachowanie po przeniesieniu części wątku do innego folderu.

3. Etap B — pełny podgląd wiadomości

3.1. Podstawowe nagłówki

Domyślnie pokazywane:

  • From;
  • To;
  • Cc;
  • Date;
  • Subject.

3.2. Rozszerzone nagłówki

Po wybraniu Show details / Show headers:

  • From;
  • Sender;
  • Reply-To;
  • To;
  • Cc;
  • Bcc, jeśli wiadomość lokalnie to umożliwia;
  • Date;
  • Message-ID;
  • In-Reply-To;
  • References;
  • Return-Path;
  • Delivered-To;
  • Envelope-To, jeśli występuje;
  • List-ID;
  • List-Unsubscribe;
  • User-Agent;
  • X-Mailer;
  • Authentication-Results;
  • DKIM-Signature;
  • Received;
  • Content-Type;
  • Content-Transfer-Encoding;
  • pozostałe nagłówki w trybie pełnym.

3.3. Surowa wiadomość

RustBox musi oferować:

  • Show source;
  • wyświetlenie dokładnego RFC822/MIME source;
  • brak przepuszczania source przez renderer HTML;
  • pobranie jako .eml;
  • kopiowanie Message-ID;
  • kopiowanie adresów;
  • przełączanie HTML / plain text;
  • drukowanie;
  • obsługę message/rfc822.

3.4. HTML wiadomości

Renderer wiadomości HTML musi:

  • sanitizować HTML;
  • sanitizować CSS;
  • blokować skrypty;
  • blokować niebezpieczne SVG;
  • blokować zewnętrzne zasoby domyślnie;
  • obsługiwać CID;
  • pozwalać użytkownikowi jednorazowo załadować obrazy;
  • mieć politykę: nigdy / kontakty / pytaj / zawsze;
  • izolować treść wiadomości od interfejsu RustBox;
  • poprawnie pokazywać tekstową alternatywę;
  • nie uruchamiać aktywnej zawartości wiadomości.

3.5. Cytaty

  • zwijanie cytowanej treści;
  • rozwinięcie na żądanie;
  • sensowna detekcja poprzednich odpowiedzi;
  • obsługa cytowania plain text i HTML.

4. Etap C — pełny composer

4.1. Pola wiadomości

Composer musi obsługiwać:

  • From / identity;
  • To;
  • Cc;
  • Bcc;
  • Reply-To;
  • Subject;
  • priorytet wiadomości;
  • żądanie potwierdzenia przeczytania;
  • opcjonalne DSN, jeśli backend SMTP pozwala;
  • własne dodatkowe nagłówki skonfigurowane przez administratora.

4.2. Tryby edycji

  • HTML;
  • plain text;
  • Markdown;
  • przełączanie trybu z ostrzeżeniem, jeśli może dojść do utraty formatowania.

4.3. Edytor HTML

Toolbar:

  • Bold;
  • Italic;
  • Underline;
  • Strike;
  • font;
  • rozmiar;
  • kolor tekstu;
  • wyrównanie;
  • lista numerowana;
  • lista punktowana;
  • cytat;
  • link;
  • obraz;
  • usuń formatowanie;
  • Undo;
  • Redo.

Edytor nie może wymagać Node.js/Bun w runtime. Jeżeli wykorzystywana jest biblioteka edytora, ma być vendored jako statyczny asset i włączona do binarki.

4.4. Drafty

  • automatyczny zapis draftu;
  • konfigurowalny interwał;
  • informacja o ostatnim zapisie;
  • odzyskiwanie po utracie połączenia;
  • odzyskiwanie po zamknięciu karty;
  • ostrzeżenie przed utratą niezapisanego tekstu;
  • draft recovery po błędzie SMTP;
  • zapis do wybranego folderu Drafts.

4.5. Załączniki

  • wybór pliku;
  • drag & drop;
  • wklejanie ze schowka;
  • pasek postępu uploadu;
  • możliwość usunięcia przed wysłaniem;
  • limity rozmiaru;
  • kontrola MIME;
  • bezpieczne nazwy plików;
  • obsługa dużych plików bez niepotrzebnego trzymania całości w pamięci;
  • tymczasowy magazyn izolowany per sesja;
  • automatyczne sprzątanie plików tymczasowych;
  • pobranie wszystkich załączników jako ZIP.

4.6. Obrazy inline

Proces:

Insert image
→ upload
→ walidacja MIME
→ zapis tymczasowy
→ CID attachment
→ <img src="cid:...">

Należy również obsłużyć:

  • wklejenie obrazu ze schowka;
  • przeciągnięcie obrazu do composera;
  • usuwanie nieużywanego CID attachmentu;
  • skalowanie po stronie UI bez destrukcji oryginalnego pliku.

4.7. Attachment reminder

Jeżeli treść sugeruje załącznik, np. „w załączniku”, „załączam”, a wiadomość nie ma załącznika, RustBox powinien ostrzec przed wysłaniem.


5. Etap D — tożsamości i stopki

5.1. Tożsamości

Użytkownik może posiadać wiele identities:

Settings
└── Identities
    ├── Personal
    ├── Work
    └── support@example.com

Każda identity zawiera:

  • Display name;
  • Email;
  • Reply-To;
  • Bcc;
  • Organization;
  • podpis plain text;
  • podpis HTML;
  • ustawienie domyślnej identity.

5.2. Automatyczny wybór identity

Przy odpowiedzi RustBox powinien dobierać identity na podstawie:

  • To;
  • Cc;
  • Delivered-To;
  • Envelope-To;
  • aliases użytkownika;
  • innych dostępnych nagłówków odbiorcy.

5.3. Stopki / signatures

Opcje:

  • plain text;
  • HTML;
  • automatyczne wstawianie;
  • tylko nowa wiadomość;
  • odpowiedź;
  • forward;
  • pozycja nad cytatem;
  • pozycja pod cytatem;
  • osobna stopka dla każdej identity;
  • możliwość wyłączenia stopki per wiadomość.

6. Etap E — ManageSieve, szybkie filtry i autoresponder

6.1. Menedżer filtrów

Widok:

Filters
├── Spam
├── GitLab
├── Mailing lists
└── Invoices

Funkcje:

  • lista skryptów;
  • aktywny skrypt;
  • tworzenie;
  • edycja;
  • usuwanie;
  • zmiana nazwy;
  • aktywowanie;
  • dezaktywowanie;
  • walidacja;
  • raw editor;
  • wizualny rule builder;
  • podgląd wynikowego Sieve;
  • wykrywanie capabilities serwera;
  • ostrzeganie o niedostępnych rozszerzeniach.

6.2. Warunki filtrów

  • From;
  • To;
  • Cc;
  • Recipient;
  • Subject;
  • dowolny header;
  • Body, jeśli capability pozwala;
  • size;
  • date;
  • List-ID;
  • address;
  • domain;
  • exists;
  • spam headers;
  • kombinacje AND / OR;
  • negacja;
  • kolejność reguł;
  • stop processing.

6.3. Akcje filtrów

  • Move;
  • Copy;
  • Discard;
  • Reject;
  • Redirect;
  • Keep;
  • Mark read;
  • Add flag;
  • Remove flag;
  • Vacation;
  • Stop.

6.4. Create filter from message

Prawoklik wiadomości:

Create filter →
    From this sender
    From this domain
    To this address
    Subject contains…
    Mailing list

Przykład:

IF From = invoices@example.com
THEN Move to Invoices

Formularz musi być automatycznie uzupełniony na podstawie wybranej wiadomości.

6.5. Autoresponder / Vacation

Pola:

  • enabled;
  • from;
  • until;
  • subject;
  • message;
  • days between replies;
  • zakres dat;
  • nie odpowiadaj mailing listom;
  • nie odpowiadaj automatom;
  • dodatkowe warunki dostępności.

W trybie Advanced użytkownik powinien móc zobaczyć wygenerowany skrypt Sieve.


7. Etap F — kontakty i książka adresowa

7.1. Funkcje podstawowe

  • lista kontaktów;
  • grupy;
  • wyszukiwanie;
  • autocomplete;
  • import vCard;
  • export vCard;
  • zdjęcia kontaktów;
  • duplicate detection;
  • dodanie nadawcy z wiadomości;
  • edycja;
  • usuwanie;
  • wiele adresów e-mail;
  • wiele numerów telefonu.

7.2. Dane kontaktu

  • Name;
  • Surname;
  • Display name;
  • Email(s);
  • Phone(s);
  • Organization;
  • Job title;
  • Address;
  • Website;
  • Notes;
  • Birthday;
  • Photo.

7.3. Upload zdjęcia kontaktu

  • upload pliku;
  • walidacja MIME;
  • limit rozmiaru;
  • bezpieczne dekodowanie;
  • miniatura;
  • usunięcie zdjęcia;
  • zachowanie oryginalnych proporcji.

7.4. Akcje na adresie

Po kliknięciu adresu:

Compose
Add to contacts
Copy address
Search messages
Create filter

7.5. Źródła danych

Docelowo:

  • lokalna książka adresowa;
  • CardDAV;
  • LDAP read-only;
  • LDAP read-write, jeżeli konfiguracja na to pozwala.

8. Etap G — wyszukiwanie

8.1. Szybkie wyszukiwanie

Globalne pole:

Search mail…

8.2. Wyszukiwanie zaawansowane

  • From;
  • To;
  • Cc;
  • Subject;
  • Body;
  • Date from/to;
  • Folder;
  • Has attachment;
  • Unread;
  • Flagged;
  • Size.

8.3. Składnia wyszukiwania

Przykłady:

from:john@example.com
subject:invoice
has:attachment
is:unread
folder:Archive
after:2026-01-01

8.4. Zapisane wyszukiwania

  • zapis kryteriów;
  • nazwa użytkownika;
  • szybkie uruchomienie;
  • usuwanie;
  • edycja.

8.5. Lokalny indeks

Tantivy powinien indeksować przyrostowo:

  • nadawcę;
  • odbiorców;
  • temat;
  • treść;
  • datę;
  • folder;
  • informacje o załącznikach;
  • Message-ID;
  • wybrane nagłówki.

Indeks musi pozostawać spójny z IMAP po:

  • restartach;
  • reconnect;
  • przenoszeniu;
  • usuwaniu;
  • zmianie flag;
  • UIDVALIDITY;
  • zmianie schematu indeksu.

9. Etap H — OpenPGP / PGP

RustBox nie implementuje własnych algorytmów kryptograficznych. Należy użyć sprawdzonej biblioteki.

9.1. Zarządzanie kluczami

Settings
└── Encryption
    └── OpenPGP

Funkcje:

  • Generate key;
  • Import private key;
  • Import public key;
  • Export public key;
  • Export private key, jeśli polityka na to pozwala;
  • Delete key;
  • Change passphrase;
  • fingerprint;
  • przypisanie klucza do identity.

9.2. Wysyłanie

  • Sign message;
  • Encrypt message;
  • Sign + encrypt;
  • wybór klucza odbiorcy;
  • ostrzeżenie o braku klucza;
  • możliwość dołączenia public key.

9.3. Odbieranie

  • Verify signature;
  • Decrypt message;
  • pokazanie tożsamości podpisującego;
  • pokazanie fingerprintu;
  • status podpisu;
  • status szyfrowania;
  • czytelne ostrzeżenie o niepoprawnym podpisie.

9.4. Discovery

Docelowo:

  • WKD;
  • HKP;
  • lookup po odbiorcy.

9.5. Ochrona kluczy

  • prywatne klucze nie mogą trafić do logów;
  • nie mogą trafić do indeksu wyszukiwania;
  • muszą być chronione oddzielnie od sesji przeglądarki;
  • hasła kluczy nie mogą być trwałe w plaintext;
  • operacje kryptograficzne muszą mieć osobny model zagrożeń.

10. Etap I — zaawansowane możliwości IMAP

RustBox powinien działać capability-driven.

Obsługiwane capability i zachowanie:

Capability RustBox
IDLE natychmiastowe nowe wiadomości
MOVE natywne przenoszenie
UIDPLUS poprawne UID
CONDSTORE wydajna kontrola zmian
QRESYNC szybka resynchronizacja
SORT sortowanie serwerowe
THREAD wątki
NAMESPACE namespaces
SPECIAL-USE Sent/Junk/Trash/etc.
QUOTA quota użytkownika
ACL prawa folderów
LIST-EXTENDED rozszerzona lista folderów
UTF8 międzynarodowe nazwy
custom keywords tagi / dodatkowe flagi

Jeśli capability nie istnieje, UI nie może udawać działania funkcji.


11. Etap J — shared folders i ACL

Ustawienia folderu:

Permissions

Przykładowe prawa:

user@example.com
    lookup
    read
    seen
    write
    insert
    post
    create
    delete
    administer

Funkcje:

  • odczyt ACL;
  • modyfikacja ACL;
  • usuwanie wpisów;
  • inherited/default rights, jeśli serwer je wspiera;
  • shared folders;
  • global folders;
  • czytelne rozróżnienie folderów własnych i współdzielonych.

12. Etap K — funkcjonalne odpowiedniki pluginów Roundcube

RustBox nie kopiuje PHP plugin API. Funkcje mają być natywnymi modułami jednej aplikacji.

Funkcja z ekosystemu Roundcube Odpowiednik w RustBox
ACL ACL folderów
Archive archiwizacja
Attachment reminder wykrycie braku deklarowanego załącznika
Enigma OpenPGP
Hide blockquote zwijanie cytatów
Identity select automatyczna tożsamość
ManageSieve filtry Sieve
Mark as junk Spam / Not spam
New mail notifier powiadomienia + dźwięk
Password zmiana hasła przez konfigurowalny backend
Show additional headers rozszerzone nagłówki
Subscriptions option subskrypcje folderów
Userinfo informacje o koncie
vCard attachments import kontaktu z załącznika
ZIP download wszystkie załączniki jako ZIP
Additional message headers konfigurowalne nagłówki wychodzące
Autologout timeout sesji
Reconnect automatyczne odzyskiwanie sesji IMAP
New user identity inicjalizacja identity
New user dialog onboarding
Virtuser mapowanie login → adres
Debug logger diagnostyka

Funkcje techniczne typu osobnych storage pluginów mają być implementowane jako wewnętrzne moduły RustBox, a nie jako osobne pluginy runtime.


13. Etap L — Spam / Junk

Prawoklik:

Mark as spam
Mark as not spam

Backend musi mieć warstwę adaptera umożliwiającą administratorowi wybór mechanizmu:

  • IMAP move;
  • Sieve;
  • rspamd HTTP;
  • SpamAssassin command;
  • custom command.

UI nie powinno zależeć od konkretnego backendu antyspamowego.


14. Etap M — powiadomienia

  • Browser desktop notifications;
  • dźwięk;
  • unread badge;
  • new mail indicator;
  • ustawienia per folder;
  • Do Not Disturb;
  • możliwość całkowitego wyłączenia;
  • IMAP IDLE → backend → WebSocket → browser.

15. Etap N — kalendarz i groupware

Całość nadal należy do 0.0.1, ale implementacja następuje po stabilizacji poczty.

15.1. Kalendarz

Widoki:

Calendar
├── Month
├── Week
├── Day
└── Agenda

Funkcje:

  • tworzenie wydarzenia;
  • edycja;
  • usuwanie;
  • iCalendar;
  • import;
  • export;
  • zaproszenia;
  • accept;
  • decline;
  • tentative;
  • recurrence;
  • reminders;
  • timezone;
  • shared calendars;
  • CalDAV.

15.2. CardDAV

  • synchronizacja kontaktów;
  • obsługa wielu książek;
  • konflikty edycji;
  • retry;
  • usuwanie;
  • status synchronizacji.

16. Etap O — ustawienia użytkownika

Docelowa struktura:

Settings

General
Appearance
Mailbox
Message view
Composing
Identities
Signatures
Folders
Filters
Autoresponder
Contacts
Calendar
Encryption
Notifications
Privacy
Security
Sessions
Account
Diagnostics
About

16.1. Appearance

  • Light / Dark / System;
  • density;
  • font size;
  • message list row height;
  • preview: right / bottom / disabled;
  • folder pane width;
  • message list width;
  • show avatars;
  • show attachment icons;
  • show flags;
  • date format;
  • time format;
  • locale;
  • UI scale;
  • zapamiętanie preferencji użytkownika.

16.2. Mailbox

  • messages per page;
  • threaded / flat;
  • default sort;
  • mark read after N seconds;
  • auto-expand threads;
  • delete behavior;
  • archive behavior;
  • trash behavior;
  • refresh / IDLE;
  • domyślne foldery specjalne.

16.3. Message view

  • HTML / Plain preference;
  • remote images: never / contacts / ask / always;
  • show full headers;
  • collapse quotes;
  • default charset fallback;
  • print behavior;
  • opening attachments.

16.4. Composing

  • HTML / Text / Markdown;
  • autosave interval;
  • default font;
  • reply above/below quote;
  • quote style;
  • forward inline/as attachment;
  • attachment reminder;
  • spellcheck;
  • default identity;
  • signature behavior;
  • default priority;
  • read receipt behavior.

17. Etap P — funkcje codzienne, które łatwo przeoczyć

RustBox 0.0.1 musi również objąć:

  • draft recovery;
  • Undo po usunięciu/przeniesieniu;
  • multi-select;
  • select all;
  • select all search results;
  • keyboard shortcuts;
  • pełną obsługę klawiaturą;
  • print;
  • .eml upload;
  • .eml download;
  • RFC822 attachments;
  • message/rfc822;
  • TNEF / winmail.dat, jeśli technicznie wykonalne przy zachowaniu bezpieczeństwa;
  • DSN;
  • MDN / read receipts;
  • SMTPUTF8;
  • IDN;
  • Unicode headers;
  • Unicode filenames;
  • poprawne RFC2047;
  • mailing-list headers;
  • List-Unsubscribe;
  • ZIP załączników;
  • quota warnings;
  • spam indicators;
  • message priority;
  • custom flags / labels;
  • autocomplete kontaktów;
  • vCard attachments;
  • iCal attachments;
  • automatyczny reconnect sesji IMAP;
  • zachowanie filtrów i scrolla;
  • poprzednia/następna wiadomość;
  • obsługa dużych wiadomości;
  • obsługa dużych attachmentów;
  • retry po błędach sieci;
  • czytelny offline/error state.

18. Etap Q — bezpieczeństwo

Bezpieczeństwo jest realizowane równolegle z każdą funkcją i nie może zostać odłożone na koniec.

Wymagane obszary:

  • HTML sanitizer;
  • CSS sanitizer;
  • SVG sanitizer;
  • remote images;
  • tracking pixels;
  • data: URI;
  • CID;
  • MIME nesting;
  • malformed headers;
  • CRLF/header injection;
  • attachment filename traversal;
  • archiwa;
  • zip bombs;
  • huge MIME messages;
  • SSRF;
  • cross-account authorization;
  • CSRF;
  • XSS;
  • session fixation;
  • session hijacking;
  • secure cookies;
  • SameSite;
  • TLS verification;
  • host name verification;
  • rate limiting logowania;
  • bezpieczne przechowywanie tokenów;
  • brak haseł w logach;
  • brak tokenów w logach;
  • brak prywatnych kluczy PGP w logach;
  • brak treści wiadomości w logach poza jawnie włączonym trybem diagnostycznym;
  • separacja danych kont;
  • ochrona endpointów administracyjnych;
  • limity uploadu;
  • walidacja MIME;
  • bezpieczne nazwy plików;
  • izolacja temporary storage;
  • czyszczenie danych po wylogowaniu / wygaśnięciu sesji.

Każdy moduł powinien posiadać testy negatywne i regresyjne.


19. Etap R — sesje i konto

19.1. Sesje

  • lista aktywnych sesji;
  • data utworzenia;
  • ostatnia aktywność;
  • urządzenie/przeglądarka w bezpiecznej formie;
  • wyloguj tę sesję;
  • wyloguj wszystkie pozostałe;
  • autologout;
  • remember me zgodnie z polityką bezpieczeństwa;
  • automatyczne odświeżanie po reconnect.

19.2. Zmiana hasła

RustBox nie zakłada jednego mechanizmu backendowego.

Administrator powinien móc skonfigurować adapter:

  • API;
  • LDAP;
  • PAM / command;
  • SQL;
  • custom executable;
  • funkcja wyłączona.

Hasło nie może być logowane ani zapisywane w plaintext.


20. Etap S — diagnostyka

Panel diagnostyczny użytkownika/administratora powinien pokazywać bez ujawniania danych poufnych:

  • IMAP status;
  • SMTP status;
  • ManageSieve status;
  • CalDAV status;
  • CardDAV status;
  • IDLE status;
  • ostatnie połączenie;
  • ostatnia synchronizacja;
  • liczba wiadomości w indeksie;
  • kolejka zadań;
  • status indeksowania;
  • quota;
  • ostatnie błędy;
  • informacje o capabilities serwera;
  • możliwość reconnect;
  • możliwość rebuild index;
  • health endpoint;
  • readiness endpoint.

21. Etap T — UI/UX docelowego RustBox

21.1. Layout

Desktop:

┌──────────────┬──────────────────────────┬───────────────────────────────┐
│ Folder tree  │ Message list             │ Message preview               │
│              │                          │                               │
│ Inbox        │ Sender / Subject / Date  │ Header                        │
│ Sent         │ Flags / Attachment       │ Body                          │
│ Drafts       │ Threads                  │ Attachments                   │
│ Archive      │                          │                               │
│ Spam         │                          │                               │
│ Trash        │                          │                               │
└──────────────┴──────────────────────────┴───────────────────────────────┘

Dostępne ustawienia:

  • preview po prawej;
  • preview na dole;
  • preview wyłączony;
  • zmiana szerokości paneli;
  • compact / comfortable;
  • mobile layout z osobnymi ekranami listy i wiadomości.

21.2. Styl

  • brak gradientów;
  • brak dekoracyjnych kolorowych kart;
  • brak emoji jako ikon;
  • popularne ikony SVG;
  • małe i konsekwentne promienie;
  • cienkie obramowania;
  • spokojne kolory;
  • jedna typografia UI;
  • możliwość użycia Inter z fallbackiem systemowym bez zewnętrznego CDN;
  • czytelne focus states;
  • dostępność klawiaturą;
  • odpowiedni kontrast;
  • informacje nie mogą być przekazywane wyłącznie kolorem.

22. Etap U — synchronizacja z Oxi

RustBox pozostaje forkiem bazującym na Oxi i zachowuje możliwość śledzenia upstreamu.

W repozytorium należy utrzymywać:

  • UPSTREAM_BASE z ostatnim w pełni przejrzanym i skonsumowanym commitem Oxi;
  • remote upstream-oxi;
  • skrypt setup upstream;
  • skrypt status/diff;
  • skrypt synchronizacji zmian backendowych;
  • skrypt portowania pojedynczego commita;
  • mechanizm finalizacji synchronizacji dopiero po przeglądzie zmian UI/root.

Mapowanie:

Oxi backend/src/...        → RustBox src/...
Oxi backend/Cargo.toml     → RustBox Cargo.toml
Oxi backend/migrations/... → RustBox migrations/...

Frontend Oxi nie jest automatycznie importowany.

Zmiany frontendowe Oxi powinny być raportowane jako potencjalne nowe funkcje i ręcznie portowane do interfejsu RustBox.

Przy konfliktach Git nie wolno automatycznie nadpisywać lokalnych zmian RustBox.


23. Etap V — testy akceptacyjne 0.0.1

23.1. Core mail

  • logowanie;
  • wylogowanie;
  • reconnect;
  • folder tree;
  • create folder;
  • create subfolder;
  • rename;
  • delete;
  • subscriptions;
  • special folders;
  • lista wiadomości;
  • threading;
  • podgląd;
  • full headers;
  • raw source;
  • .eml download;
  • reply;
  • reply all;
  • forward;
  • forward as attachment;
  • compose;
  • drafts;
  • attachments;
  • inline images;
  • signatures;
  • identities;
  • move;
  • copy;
  • delete;
  • archive;
  • spam;
  • flags;
  • unread;
  • drag & drop;
  • context menus.

23.2. Sieve

  • list scripts;
  • get;
  • put;
  • rename;
  • delete;
  • activate;
  • deactivate;
  • validation;
  • visual builder;
  • create filter from message;
  • vacation;
  • capability handling;
  • TLS;
  • STARTTLS;
  • jawnie dozwolony tryb plaintext, jeśli administrator go włączy.
  • szybkie;
  • zaawansowane;
  • Tantivy;
  • filtry;
  • rebuild index;
  • consistency po reconnect;
  • UIDVALIDITY;
  • delete/move/flags.

23.4. Contacts / Calendar

  • CRUD kontaktów;
  • zdjęcia;
  • vCard;
  • CardDAV;
  • iCalendar;
  • CalDAV;
  • invitations;
  • recurrence;
  • timezone.

23.5. PGP

  • generate/import/export;
  • sign;
  • verify;
  • encrypt;
  • decrypt;
  • missing key;
  • invalid signature;
  • key protection.

23.6. Security

  • XSS;
  • CSRF;
  • SSRF;
  • malicious MIME;
  • malformed headers;
  • unsafe SVG;
  • dangerous filenames;
  • account isolation;
  • session isolation;
  • rate limiting;
  • TLS verification;
  • secrets not logged.

23.7. Performance

  • skrzynka z dziesiątkami tysięcy wiadomości;
  • duże wiadomości;
  • duże attachmenty;
  • długotrwałe IDLE;
  • reconnect loop;
  • indeksowanie;
  • stabilność pamięci;
  • graceful shutdown;
  • restart i wznowienie synchronizacji.

24. Kryterium zakończenia RustBox 0.0.1

0.0.1 można uznać za gotową bazę dopiero wtedy, gdy: 0. WIelojezykowosc w stylu rustproxy

  1. RustBox realizuje pełny podstawowy workflow webmaila bez ręcznego korzystania z innego klienta.
  2. Foldery IMAP są w pełni zarządzalne z UI.
  3. Wiadomości można czytać, filtrować, wyszukiwać, przenosić, kopiować, archiwizować i usuwać.
  4. Composer obsługuje HTML, plain text, Markdown, attachmenty, obrazy inline, drafty, tożsamości i stopki.
  5. Prawoklik i drag & drop działają jako pełnoprawne elementy UX.
  6. Użytkownik ma dostęp do pełnych nagłówków i źródła RFC822.
  7. ManageSieve posiada zarówno edytor tekstowy, jak i kreator wizualny oraz szybkie filtry z wiadomości.
  8. Autoresponder działa przez Sieve.
  9. Kontakty i autocomplete są kompletne.
  10. OpenPGP pozwala podpisywać, szyfrować, weryfikować i odszyfrowywać pocztę.
  11. IMAP capabilities są wykrywane i wykorzystywane bez udawania niewspieranych funkcji.
  12. Shared folders, ACL i quota są obsługiwane tam, gdzie serwer je udostępnia.
  13. Powiadomienia działają przez IDLE/WebSocket.
  14. CardDAV/CalDAV i zaproszenia kalendarzowe są wdrożone.
  15. Ustawienia użytkownika obejmują wygląd, zachowanie skrzynki, composer, identities, signatures, folders, filters, autoresponder, privacy, security i sessions.
  16. UI jest spójne, bez gradientów i pseudo-ikon, ze standardowymi SVG.
  17. Aplikacja nadal składa się z jednego procesu i jednej binarki produkcyjnej.
  18. Runtime nie wymaga Node.js, Bun ani osobnego frontend servera.
  19. Oxi pozostaje śledzonym upstreamem i można bezpiecznie portować jego nowe funkcje.
  20. Testy funkcjonalne, bezpieczeństwa i stabilności przechodzą na rzeczywistych serwerach IMAP/SMTP/ManageSieve.

Dopiero po spełnieniu tych warunków należy rozważyć oznaczenie kolejnej wersji jako pierwszej publicznej.