Files
sepot/CHANGELOG.md
T
Julius Joska 90a1390716 fix: reliable first-message send, QR routing, auto-lock recovery
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).
2026-07-18 19:53:41 +02:00

206 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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í.