90a1390716
Fixes reported by testers and found in an app review: - First message right after install no longer fails. Before the app finished registering with the relay, the outgoing message could crash on a null delivery address. The profile field is now optional and the send path throws a clear "still connecting, try again shortly" error while registration completes in the background. - The QR code and share link now appear only once the delivery address is ready. Previously a link generated before the first connection lacked routing, so the other side could not send the first message. The screen now shows a connecting state and reactively swaps in the QR when ready. - Incomplete contact links are rejected on import instead of failing at first send, with a clear prompt to ask for a fresh link. - Auto-lock no longer silences the app: after locking and unlocking, messaging is restarted (it previously stayed dead until app restart). - Group messages are marked failed on a non-per-member send error instead of hanging in the "sending" state forever. - Hardened the relay client against a rare duplicate connection when toggling Tor or locking mid-connect, and fromShareString now rejects a delivery address of the wrong length. - Pin unifiedpush below 6.2.0 to drop the webcrypto dependency (its native framework lacks LC_ENCRYPTION_INFO and blocked the iOS upload). - Skip Android release lint (network dependency check hangs on the build host and adds no value for a Flutter app).
206 lines
10 KiB
Markdown
206 lines
10 KiB
Markdown
# Changelog
|
||
|
||
Všechny podstatné změny v aplikaci Šepot. Formát dle
|
||
[Keep a Changelog](https://keepachangelog.com/cs/1.1.0/),
|
||
verzování dle [ajtak standardu](#verzování).
|
||
|
||
## [1.1.1] – 2026-07-18
|
||
|
||
### Opraveno
|
||
- **Odeslání první zprávy hned po instalaci už neselže.** Krátce po
|
||
založení účtu, než se aplikace stihla připojit k relayi, mohla zpráva
|
||
spadnout s hláškou „Odeslání selhalo". Nově se v tu chvíli ukáže
|
||
srozumitelné „Šepot se ještě připojuje — zkus to za chvíli" a připojení
|
||
proběhne na pozadí.
|
||
- **QR kód a odkaz se ukážou až s doručovací adresou.** Když sis chtěl
|
||
ukázat vlastní QR dřív, než se aplikace poprvé připojila, vygeneroval se
|
||
neúplný odkaz — protistrana pak nemohla poslat první zprávu („Kontakt
|
||
nemá doručovací adresu"). Nově se místo neúplného kódu ukáže stav
|
||
připojování a QR se objeví, jakmile je hotové.
|
||
- **Neúplný odkaz kontaktu se odmítne při přidání**, ne až při prvním
|
||
odeslání — s jasnou výzvou požádat protistranu o nový odkaz.
|
||
- **Zamčení po nečinnosti už neumlčí aplikaci.** Po automatickém zamknutí
|
||
a opětovném odemčení se zprávy zase přijímají i odesílají — dřív mohl
|
||
messaging zůstat po odemčení vypnutý až do restartu aplikace.
|
||
- **Skupinová zpráva se při chybě neodeslání označí jako neodeslaná**
|
||
místo aby zůstala navždy ve stavu „odesílá se".
|
||
- Ošetřeno vzácné zdvojení spojení s relayem při rychlém přepnutí Toru
|
||
nebo zamčení během připojování.
|
||
|
||
### Změněno
|
||
- Interní úklid závislostí notifikací (odstraněna nepoužívaná větev, která
|
||
komplikovala sestavení verze pro iOS).
|
||
|
||
## [1.1.0] – 2026-07-13
|
||
|
||
### Přidáno
|
||
- **Náhled fotky před odesláním.** Vyfocená nebo vybraná fotka už
|
||
neodchází okamžitě — otevře se náhled, kde jde fotku otočit, kreslit
|
||
po ní prstem (7 barev, krok zpět), přidat na ni text (tažením se
|
||
přesouvá, klepnutím upraví) a připojit popisek. Odejde až po klepnutí
|
||
na Odeslat; zavření náhledu nic nepošle.
|
||
|
||
### Opraveno
|
||
- **Nastavení se nevykreslilo** — obrazovka místo obsahu ukazovala
|
||
chybovou hlášku „Tahle obrazovka se nevykreslila". Profilová karta
|
||
předávala do překladu otisk klíče jako objekt místo textu.
|
||
- Avatar s iniciálami spadl na prázdném jménu nebo jménu s dvojitou
|
||
mezerou; iniciály se nově skládají po grafémech, takže nerozpůlí emoji.
|
||
- **Písma se dodávají v aplikaci** (Inter, JetBrains Mono — OFL).
|
||
Aplikace dřív stahovala fonty za běhu z Google CDN — síťový požadavek
|
||
na cizí server navíc a binárka odlišná od zveřejněného zdroje.
|
||
- **Trvale vadná příchozí zpráva už neotravuje frontu.** Zpráva, jejíž
|
||
obsah nejde po dešifrování zpracovat (poškozená pole od upraveného
|
||
klienta), se potvrdí a zahodí — dřív se doručovala donekonečna při
|
||
každém připojení. Nedešifrovatelné obálky fronta dál drží.
|
||
- Příloha s poškozeným náhledem od protistrany shodila vykreslení
|
||
bubliny; vadný náhled se nově zahodí při příjmu a base64 krypto polí
|
||
příloh se validuje.
|
||
- Zachycení výměny důvěryhodního kořene relaye (signál MITM) na
|
||
pozadí — dřív tichá neošetřená výjimka, teď příznak čitelný pro UI.
|
||
- PNG bez průhlednosti (screenshoty, upravené fotky) se posílají jako
|
||
JPEG — několikanásobně menší přenos; PNG zůstává jen pro obrázky se
|
||
skutečnou průhledností.
|
||
|
||
## [1.0.0] – 2026-07-11
|
||
|
||
První ostrá verze. Šepot je od 11. 7. 2026 open source — kompletní
|
||
zdrojový kód aplikace i serveru je veřejný na
|
||
[gitea.ajtak.it/julius.joska/sepot](https://gitea.ajtak.it/julius.joska/sepot)
|
||
(zrcadlo [github.com/juliusjoska/sepot](https://github.com/juliusjoska/sepot)).
|
||
|
||
### Přidáno
|
||
- **Aplikace mluví pěti jazyky: česky, anglicky, německy, rusky
|
||
a italsky.** Jazyk se řídí systémem (neznámé jazyky spadnou na
|
||
angličtinu), nebo ho přepneš ručně v Nastavení → Obecné. Přeložené
|
||
jsou i notifikace, chybové hlášky, iOS dialogy oprávnění a chybová
|
||
obrazovka startu; volba jazyka funguje už na zamykací obrazovce.
|
||
- **Připojení přes Tor.** Přepínač v Nastavení → Připojení (Android,
|
||
vyžaduje Orbot): provoz na server jde přes síť Tor a skryje tvou IP
|
||
adresu. Přepnutí přestaví spojení za běhu, bez restartu aplikace.
|
||
- **Skupinové konverzace.** Skupinu (až 128 členů) založíš z Kontaktů,
|
||
posílat do ní jde všechno co do běžného chatu — text, fotky, přílohy,
|
||
hlasovky, reakce, odpovědi i mizící zprávy. Menu nabízí seznam členů,
|
||
přejmenování a odchod. Zprávy jsou end-to-end šifrované každému členovi
|
||
zvlášť, takže platí stejná ochrana jako v běžné konverzaci; server
|
||
o skupině neví nic.
|
||
|
||
### Opraveno
|
||
- Automatický zámek, změna PINu i nátlakový PIN ověřeny na zařízení.
|
||
|
||
## [0.3.2] – 2026-07-10
|
||
|
||
### Přidáno
|
||
- **Smazání účtu maže i server.** „Smazat všechna data" nově kromě
|
||
lokálního wipe odregistruje účet z relaye (`DELETE /v1/identity`):
|
||
smaže se registrace identity, záznamy zařízení, distribuční klíče,
|
||
push token i fronta nedoručených zpráv. Když je zařízení offline,
|
||
aplikace na to upozorní a zbytek řeší podpora@sepot.cz.
|
||
|
||
### Opraveno
|
||
- iOS: privacy manifest (`PrivacyInfo.xcprivacy`) je součástí Xcode
|
||
projektu — konec ručního vkládání při každém buildu (ITMS-91053).
|
||
- iOS: `Info.plist` měl dvakrát `CFBundleDisplayName` (jednou bez
|
||
diakritiky) a povoloval landscape, ačkoli je aplikace zamčená na
|
||
portrét. Sjednoceno.
|
||
|
||
## [0.3.1] – 2026-07-09
|
||
|
||
### Opraveno
|
||
- **Nahlašování už nevybízí k vkládání obsahu zpráv.** Formulář dřív nabízel
|
||
„pokud chceš něco doložit, vlož to do popisu sám“. U hlášení o ohrožení
|
||
dítěte by to znamenalo, že se k provozovateli dostane materiál, jehož
|
||
držení je trestné — a k posouzení ho stejně nesmí použít. Nově formulář
|
||
obsah odmítá a u této kategorie odkazuje na STOPonline.cz a Policii ČR.
|
||
|
||
## [0.3.0] – 2026-07-09
|
||
|
||
Nahlašování zneužití a standardy ochrany dětí — bez nich Šepot nesmí do
|
||
obchodů (Google Play UGC policy, Child Safety Standards, App Store 1.2).
|
||
|
||
### Přidáno
|
||
- **Nahlášení zneužití** — Nastavení → Bezpečnost → Nahlásit zneužití, nebo
|
||
z menu konverzace. Do teď „nahlásit“ jen zablokovalo kontakt a nikam
|
||
nedošlo; nově hlášení dorazí provozovateli. Kategorie zahrnují ohrožení
|
||
dítěte (CSAE), které se řeší přednostně.
|
||
- **Standardy ochrany dětí** — veřejný dokument na
|
||
[sepot.cz/bezpecnost-deti](https://sepot.cz/bezpecnost-deti), odkaz přímo
|
||
z nastavení.
|
||
- **Deklarace exportní compliance** (`ITSAppUsesNonExemptEncryption`) —
|
||
Šepot používá vlastní E2E šifrování, což se Applu hlásí pravdivě.
|
||
|
||
### Opraveno
|
||
- **iOS: bílá obrazovka po spuštění.** Nativní knihovna libsignal se na
|
||
iPhonu nenačetla (framework je v `Frameworks/`, ale není zalinkovaný, a
|
||
výchozí loader ho hledal v kořeni `.app`). Start teď knihovnu načítá přes
|
||
`@rpath` a navíc už nikdy neskončí němou plochou — když se šifrovací
|
||
jádro nespustí, objeví se čitelná chybová obrazovka s textem k odeslání.
|
||
- Verze uvedená v Nastavení → O aplikaci ukazovala pořád `0.1.0`.
|
||
|
||
### Poznámka k soukromí
|
||
Hlášení neodchází přes relay, ale na webový server sepot.cz — ten se při
|
||
odeslání dozví IP adresu odesílatele. Aplikace na to upozorňuje ještě před
|
||
odesláním. Obsah zpráv se neodesílá nikdy; do hlášení jde jen to, co
|
||
uživatel sám napíše.
|
||
|
||
## [0.2.0] – 2026-07-08
|
||
|
||
Velká funkční vlna — z E2E základu je plnohodnotný soukromý messenger.
|
||
|
||
### Přidáno
|
||
- **Jádro chatu** — odpovědi na zprávy, reakce emotikonem, úprava a mazání
|
||
odeslaných zpráv.
|
||
- **Hlasové zprávy** — nahrávání mikrofonem přímo v chatu, přehrávání
|
||
s průběhem. Šifrované per-file, plaintext audio nikdy nejde na disk.
|
||
- **Obnova účtu ze zálohovací fráze** — 24 slov vrátí tvoji identitu
|
||
(stejný SEP kód, kontakty tě dál poznají).
|
||
- **Šifrované zálohy historie** — export/import konverzací; zálohu dešifruje
|
||
jen tvoje identita.
|
||
- **Blokování a nahlášení kontaktu** — příchozí zprávy od blokovaného se
|
||
zahodí.
|
||
- **Potvrzení přečtení** (volitelné, výchozí vypnuto).
|
||
- **Smazat u mě** — lokální smazání zprávy vedle „Smazat pro všechny".
|
||
- **Zabezpečení obrazovky** — blok screenshotů a skrytí obsahu v přepínači
|
||
aplikací.
|
||
- **Nátlakový (decoy) PIN** — druhý PIN otevře prázdnou aplikaci; skutečná
|
||
data zůstanou skrytá.
|
||
- **Nativní iOS push (APNs)** — bez závislosti na Googlu.
|
||
|
||
### Změněno
|
||
- **Sjednocené logo** napříč launcherem, splash obrazovkou i uvnitř aplikace.
|
||
- **Čistší pole pro psaní** — jeden tenký obrys, ikony uvnitř, nižší profil.
|
||
- **Bubliny se scalují** podle délky zprávy.
|
||
|
||
### Opraveno
|
||
- **Doručenky (✓✓)** se povýší i u offline příjemce, jakmile si zprávu
|
||
vyzvedne.
|
||
- **Náhledy fotek** už neukazují předchozí obrázek (chyba recyklace v seznamu).
|
||
|
||
### Bezpečnost
|
||
- Zálohy i decoy PIN stojí na oddělených šifrovaných databázích a klíčích
|
||
odvozených z identity.
|
||
|
||
## [0.1.0] – 2026-07-04
|
||
|
||
První beta.
|
||
|
||
### Přidáno
|
||
- **End-to-end šifrované zprávy** (libsignal, PQXDH + Double Ratchet,
|
||
sealed sender) přes vlastní relay (WSS + Tor onion).
|
||
- **Fotky a dokumenty** — šifrované přílohy.
|
||
- **Ověření kontaktu** přes safety number a QR.
|
||
- **Mizící zprávy** s per-konverzace TTL.
|
||
- **PIN (Argon2id) a biometrické odemčení**, šifrovaná lokální DB (SQLCipher).
|
||
- **Push** — UnifiedPush (výchozí), FCM (opt-in).
|
||
- Bez telefonního čísla, bez e-mailu, bez reklam.
|
||
|
||
---
|
||
|
||
## Verzování
|
||
|
||
- **versionName `0.MINOR.PATCH`** v betě → **`1.0.0` = veřejné vydání**.
|
||
- **MINOR** = nová várka funkcí / milník (0.2.0 → 0.3.0 → 0.4.0…).
|
||
- **PATCH** = jen opravy chyb a drobnosti (0.2.1, 0.2.2…).
|
||
- **Build number** (`+N`) roste `+1` při každém uploadu, nezávisle na
|
||
versionName, stejný pro iOS i Android. Uživatel ho nevidí.
|