1358 lines
28 KiB
Markdown
1358 lines
28 KiB
Markdown
# 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
|
|
→ <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:
|
|
|
|
```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.
|