# 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ń: ```text 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ść ```text 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 ```text Open Open in new view --- Mark all read Create subfolder Rename Subscribe / Unsubscribe Empty Delete --- Properties Permissions ``` ### Załącznik ```text 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: ```text Insert image → upload → walidacja MIME → zapis tymczasowy → CID attachment → ``` 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: ```text 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: ```text 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: ```text Create filter → From this sender From this domain To this address Subject contains… Mailing list ``` Przykład: ```text 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: ```text 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: ```text 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: ```text 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 ```text 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: ```text Permissions ``` Przykładowe prawa: ```text 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: ```text 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: ```text 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: ```text 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: ```text ┌──────────────┬──────────────────────────┬───────────────────────────────┐ │ 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: ```text 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. ## 23.3. Search - 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.