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