Portál AbcLinuxu, 20. května 2024 18:25

Uzavření projektu Multiplatformní přístup pro datové schránky

3. 2. 2011 | Redakce
Články - Uzavření projektu Multiplatformní přístup pro datové schránky  

V roce 2009 byl na AbcLinuxu zahájen projekt vývoje otevřených multiplatformních řešení pro přístup k datovým schránkám.

Projekt si zpočátku kladl ambiciózní cíle. Ačkoliv se v rámci tohoto projektu nepodařilo všech vytyčených cílů dosáhnout, podařilo se zviditelnit nedostatky ne zcela ideální implementace samotných Datových schránek a nabídnout použitelné řešení pro ty z nás, kteří nemohou používat oficiální webové rozhraní pro přístup k Datovým schránkám. Zároveň jsme rádi, že mimo projektů probíhajících v rámci AbcLinuxu, se vynořila řada dalších dobrých implementací.

Protože aktivita kolem samotného projektu utichla a naopak rostl tlak na závěrečný verdikt, bylo nutné najít způsob, jakým peníze rozdělit mezi přihlášené projekty. Po posouzení jsme došli k závěru, že peníze budou rozděleny mezi projekty libisds (knihovna v C a frontend Šigofumi) a JAVA_ISDS (implementace v Javě), a to v poměru půl na půl. Uvědomujeme si, že žádný způsob rozdělení peněz není úplně fér ke všem stranám zároveň: tedy přihlášeným i nepřihlášeným projektům, projektům, které mezitím vznikly pod záštitou nejrůznějších firem a sdružení a v podstatě ani k lidem a firmám, které na vývoj přispěly.

Díky tedy patří i ostatním projektům jako dsgui (CZ.NIC, z.s.p.o.), OpenDS.cz (blue.point Solutions, s.r.o.), datové schránky pro Android (APK SOFT s.r.o.) a řadě dalších.

Výše příspěvků a celou historii bankovního účtu, kde byly v rukou Liberix, o.p.s. spravovány finance, lze vidět na transparentním kontě (přehled v PDF). Peníze tedy byly rozděleny následovně:

Zhodnocení

Před rokem jsme zveřejnili stav obou projektů. Požádali jsme oba projekty o dodatečné zhodnocení – jedno zhodnocení, které jsme dostali, je krátké (za JAVA_ISDS) a jedno je velmi dlouhé (za libisds). Bylo nám líto to dlouhé zkracovat, proto jej najdete v celém znění na druhé stránce tohoto článku. Cílem bylo čtenáře seznámit s tím, co se v projektu událo a jaký je jejich postoj k datovým schránkám.

Chtěli bychom poděkovat všem vývojářům, kteří umožnili uživatelům přistupovat k Datovým schránkám z libovolného operačního systému, což pro mnohé nepředstavuje jen „funkci navíc“, ale také v podstatě zákonnou nezbytnost. Dále chceme poděkovat sdružení Liberix, o.p.s. za důležitou spolupráci a pomoc v průběhu projektu. Děkujeme všem, kteří finančně přispěli, ale také těm, kteří nějakým způsobem pomohli při testování a rozvoji všech otevřených řešení. A na závěr přejeme těm, kterých se to týká, šťastnější ruku při volbě a implementaci technologií, které se přímo dotýkají občanů této země.

JAVA_ISDS (Václav Rosecký)

Nedávno jsem přidal přihlašování i přes certifikát. Vyřízení osobního certifikátu od Postsignum bylo docela vtipné, krátce po jeho vydání mi volali s prosbou, abych se tam stavil, protože mi zapomněli dát podepsat souhlas se zpracovanim osobnich udajů...

Připravuji se na přechod na nové testovací prostředí, které bude spuštěno v únoru.

O Datových schránkách nemám kladné mínění, ale některé změny jsem uvítal s radostí: přechod na BASIC autentizaci místo původního řešení s cookies a několikanásobným přesměrováním. Člověk se také naučí defenzivnímu programování, protože ví, že se nemůže na nic spoléhat.

libisds (Petr Písař)

Knihovna není zcela hotová. Seznam věcí, které bych rád jednou začlenil, je zapsán v souboru TODO.

Především se jedná o podporu souběžného zpracování z více vláken, možnost při překladu vypnout podporu síťových funkcí, schopnost validovat požadavky a odpovědi serveru proti XML schématu a to nejdůležitější – dopsat testy pro síťové operace.

Testováním síťových operací myslím testy funkcí jako přihlášení k datové schránce, získání seznamu zpráv, odeslání zprávy atd. V současnosti existuje testovací instance ISDS, kde je možné takové operace vyzkoušet, ale vše s patřičnou časovou prodlevou a především není možné otestovat reakci knihovny na všechny chybové stavy nebo na chybně utvořené zprávy (například hodnota času doručení by nebyla správně utvořena.).

Co tedy chybí, je nástroj, který by simuloval server, a sada testů, které by prověřily knihovnu po všech stránkách, především v okrajových případech, které se za běžného provozu nevyskytují. Protože takovou péči by si zasloužily i jiné knihovny (napsané v rozličných jazycích) a protože simulátor testů a definice testů mohou být na konkrétní knihovně nezávislé, došel jsem k závěru, že je třeba věc uchopit značně abstraktně a na jazyku knihovny nezávisle. Protože se jedná v podstatě o samostatný projekt rozsahem srovnatelný se samotnou knihovnou, rozhodl jsem se, že jej prostřednictvím firmy Red Hat Czech s. r. o. nabídnu jako zadání bakalářské práce. Pokud bude téma akademicky průchodné a až budou všechny formality hotové, studenti Fakulty informatiky Masarykovy univerzity a Fakulty informačních technologií Vysokého učení technického v Brně dostanou příležitost, jak skloubit příjemné s užitečným.

Zadání
Multiplatformní otevřená knihovna v jazyce C pro přístup k Informačnímu systému datových schránek
Řešitel
Petr Písař
Název knihovny
libisds
Licence
LGPLv3+

Vývoj

Vývoj knihovny započal podle specifikace webových služeb Informačního systému datových schránek (dále jen ISDS) platné ke dni spuštění systému, tedy 1. 7. 2009.

Po prostudování specifikace a vyzkoušení nástrojem curl, jak systém reaguje, jak se vypořádá s chybovými stavy a nakolik se drží specifikace, bylo rozhodnuto, že pro vrstvu HTTP bude použita knihovna cURL, řízení TLS bude ponecháno na kryptografické knihovně, proti které je cURL přeložena (OpenSSL, GnuTLS, NSS), vrstva SOAP bude naimplementována vlastními silami a aplikační vrstva bude obsloužena knihovnou libxml2. (Rozhodnutí ovlivnily chyby v XML schématech specifikace, nestandardní způsob autentizace klienta a svérázné použití SOAP ze strany serveru.)

Protože ISDS v některých případech zasílá zprávy zabalené do CMS, knihovna si na pomoc přibrala knihovnu gpgme, která automaticky ověřuje certifikáty proti seznamu odvolaných certifikátů a která rozlišuje certifikační politiky.

Protože specifikace zavedla zvláštní způsob vymezení obsahu zprávy, byla přibrána knihovna expat. (Určení fyzického umístění podstromu XML v binárním proudu dat.)

První kód byl do verzovacího systému vložen 16. 10. 2009, první veřejná verze 0.1 byla vydána 9. 2. 2010. Ta přinesla téměř plné pokrytí specifikace vyjma podpory dokumentů XML a autentizace asymetrickými klíči.

Verze 0.2 následovala 10. 3. 2010 a přinesla autentizaci klienta certifikátem včetně nezbytné podpory kryptografických úložišť (požadavek provozní vyhlášky), integraci s vývojářským nástrojem pkg-config, rozdělení interních testů na on-line a off-line (některé distribuce při sestavování balíčků standardně spouští testy). Rovněž přibyla možnost odeslat dokument k autorizované konverzi do listinné podoby pomocí systému Czech POINT.

Verze 0.3 (prozatím poslední) světlo světa spatřila 29. 6. 2010. Toto vydání bylo první, které plně pokrylo tehdejší standard. Jednalo se o přidání podpory pro dokumenty XML a pak změny, které přinesl nový provozní řád jako byl přechod na bezstavovou autentizaci, nová služba systému pro ověření pravosti historických zpráv (AuthenticateMessage) nebo přidání identifikátoru domovského státu vlastníka datové schránky (stát začal doručovat přihlašovací údaje zahraničním jednatelům společností). Z hlediska vývojáře sestavovací mechanismus začal podporovat výrobu statické knihovny (ano, i takové požadavky byly uživateli kladeny). Aplikační rozhraní knihovny rovněž začalo nabízet automatické opravy typů MIME (protože ze systému lezou zprávy i s neplatným typem) a rozpoznání zprávy a doručenky a jejich variant (podepsané/nepodepsané).

V současnosti (listopad roku 2010) je knihovna v udržovacím režimu, protože se autor věnuje dalším projektům. Od vydání byla do zdrojových kódu začleněna řada testů vnitřních funkcí a na jejich základě opraveny odchylky v chování nalezené v krajních případech. S uspokojením mohu konstatovat, že žádná závažná chyba nalezena nebyla.

Současný stav

Knihovna plně pokrývá současnou specifikaci. Pokud tvrdím plně, tím myslím úplně, a to včetně funkcí určených pro správu systému ze strany státního aparátu jako je zakládání nebo rušení schránek Ministerstvem vnitra, dočasné blokování schránek při nastoupení výkonu trestu odnětí svobody ze strany Vězeňské správy nebo funkcionalita nutná při resetu zapomenutého hesla prováděná úředníky Czech POINTu. Pokud je mi známo, žádná jiná úplná implementace neexistuje.

Archiv knihovny obsahuje čtyři části: Zdrojové kódy, testy knihovny, ukázky použití aplikačního rozhraní formou drobných aplikací a anglicky psanou zevrubnou dokumentaci rozhraní ISDS (oficiální dokumentace systému je pouze v češtině).

API knihovny je stručně, přesto doufám že výstižně, popsáno v komentářích jediného veřejného hlavičkového souboru isds.h.

Knihovna je plně internacionalizovaná, ve výchozím prostředí komunikuje anglicky, v českém národním prostředí česky. Textové řetězce zasílané serveru a od serveru přijaté jsou aplikaci předány vždy v kódování UTF-8. Datové typy jsou aplikaci reprezentovány způsobem obvyklým v jazyce C (datové struktury, výčtové typy) a způsobem obvyklým v prostřední POSIX (datum jako struct tm, čas jako struct timeval). Chybové stavy jsou aplikaci oznamovány formu chybových kódu, uživateli formou lokalizované textové zprávy. Aplikace si může vyžádat protokolování činnosti knihovny a to již od úrovně TLS.

Proces překladu a instalace knihovny je řízen nástroji Autoconf a Automake (potažmo skripty configure a make), linkování knihovny nástrojem libtool. Překlad i testy jsou plně paralelní. Začlenění knihovny do aplikace usnadňuje vazba na nástroj pkg-config.

Rozbalené zdrojové kódy knihovny (verze 0.3.1) včetně všech skriptů, dokumentace a testů čítají 82148 řádků, což zabírá 4 MiB, sbaleno bzipem 708 KiB. Výsledná dynamická knihovna zbavená ladicích údajů a zbytečných symbolů na architektuře MIPS3 zabírá 168 KiB.

Knihovna je testována na operačním systému GNU/Linux na architekturách x86, x86_64 a MIPS. Je součástí distribuce Fedora a Gentoo Linux. Neoficiální balíčky existují pro GNU Debian a Red Hat Enterprise Linux.

Zajímavosti

Prvním překvapením byl složitý způsob přihlašování zahrnující řadu přesměrování a žonglování s HTTP cookies. Nejenom že protokol HTTP nabízí přímočarý mechanismus přihlášení (který provozovatel objevil až po několika směsích), ale také cíl přesměrování nebyl specifikací nijak vymezen, takže se klidně mohlo stát, že by přihlašovací údaje putovaly do rukou zlotřilců. Naštěstí tento mechanismus byl nahrazen lepším. Zdá se však, že majitelé schránek s dodavateli proprietárních řešení nevychází nejlépe, protože zrušení starého způsobu původně ohlášené na červenec 2010 (PDF) bylo odloženo na říjen 2010 (dokument byl odstraněn, důkazy v diskuzi na Ábíčku) a poté přesunuto na blíže neurčený počátek roku 2011 s úpěnlivou prosbou, aby si všichni svůj software aktualizovali.

Další nástrahou, nad kterou jsem si mohl hlavu ukroutit, bylo vymezení datové zprávy v těle SOAP za účelem kryptografické manipulace. Provozovatel se rozhodl, že v XML jazyce je XMLDsigg příliš standardní řešení, a proto prohlásil, že od teď se za vstup do hašovacích funkcí považuje binární reprezentace elementu isds:dmDM. To že stejný element může mít mnoho fyzických podob (různé znakové sady, předpony jmenných prostorů, uzávorkování hodnot atributů, použití entit, dvojí zápis prázdných elementů), zřejmě autora specifikace nenapadlo. Knihovny, které jsem prohlížel se často uchylovaly k určení začátku a konce elementu prostým hledáním podřetězce. Já jsem problém vyřešil pořádně pomocí knihovny expat, která umí aplikaci vrátit fyzické umístění elementu.

Chytákem, který jinak než amatérismem se zváti nedá, je vymezení povolených formátů dokumentů, které lze do datové zprávy vložit. První ranou byla vyhláška (PDF, strana 56), která hovořila o formátu „doc“, „tiff“ a podobně. Druhou ranou byl provozní řád, který hlásal, že atribut dmMimeType nese typ MIME a dmFileDescr je volný popis dokumentu. Skutečnost však byla taková, že v dmMimeType se objevoval text „pdf“ a v dmFileDescr byl vždy název souboru. Pokud jste se pokusili odeslat například soubor /etc/hosts, tak vám ISDS vynadal, že se určitě nejedná o textový soubor. To sice již opravili, ale dosti svérázným způsobem. Místo toho, aby se opravila implementace serveru, opravena byla specifikace. Prostě se stávající stav kodifikoval. Soubor /etc/hosts sice již odeslat lze, ale /etc/resolv.conf již ne (soubor nemá povolenou příponu). Je vidět, že provozovatel žije v zajetí platformy MS Windows. Platný typ MIME server dodnes nevynucuje.

Další záludnost na autory klientů čekala v podobě jmenných prostorů, které se mění podle podle toho, jak se pánové v Software 602 vyspali. Konkrétně jde o to, že datová zpráva nepodepsaná, podepsaná odchozí, podepsaná příchozí a podepsaná doručenka mají rozdílné jmenné prostory, třebaže datové struktury jsou naprosto totožné. A proč z toho viním programátory ze Slušovic? Protože je to k vůli jejich XMLForm Filleru, který znásilnili a natlačili do webového rozhraní ISDS. Jejich aplikace totiž musí nějak poznat, jestli zpráva je odchozí nebo příchozí, aby mohla na uživatele vytáhnout správný formulář a datovou zprávu mu graficky vyobrazit. Ostatně z podobného důvodu vrací webový portál zprávy s typem application/vnd.software602.filler.xml+zip+form, třebaže se o žádný fillerový formulář nejedná (jde o datovou zprávu ze jmenného prostoru ISDS digitálně podepsanou a zabalenou do CMS, žádný fillerový formulář zabalený do zipu).

Dále musím pokárat návrháře za způsob hlášení chyb systému. Sice každá chyba má vlastní číselný kód, ale co je to platné, když úplný seznam kódů neexistuje. Navíc doprovodné textové hlášky jsou někdy česky, někdy anglicky. Asi podle toho, který Ind zrovna danou třídu psal.

Naopak se mi líbí struktura XML a samotná definiční schémata, z kterých je vidět, že lidé v Software 602 mají s XML zkušenosti. Návrh je celkem čistý, opakující se podstromy mají vlastní datové typy a kód je komentovaný. To vše usnadnilo implementaci knihovny, kdy již z počátku bylo jasné, které části kódu bude možné napsat obecně a později opakovaně použít.

Co mi vadí na SOAP rozhraní ISDS? Není úplné – nenabízí všechny funkce, které nabízí interaktivní webové rozhraní. Konkrétně není možné požádat o přidání nebo odebrání uživatele do vlastní schránky. Není možné nastavit zasílání upozorňujících e-mailů nebo textových zpráv, není možné zapnout autentizaci klienta asymetrickými klíči. Přijde mi, jako kdyby Česká pošta chtěla učinit svůj webový portál nepostradatelným.

Nakonec jedna neveselá příhoda: Během psaní klienta Šigofumi, který knihovnu libisds používá, jsem objevil bezpečnostní chybu. Když uživatel požádal o zprávu, která v jeho schránce nebyla, server mu ochotně sdělil, do jaké odchozí a příchozí schránky patří. Pokud si uživatel nějak zjistil na koho jsou dotčené schránky zřízeny (jedna z nich vždy byla veřejnoprávní, tedy legálně dohledatelná), mohl zvídavě uživatel pozorovat, kdo si s kým píše.

Výhled

Knihovna není zcela hotová. Seznam věcí, které bych rád jednou začlenil, je zapsán v souboru TODO.

Především se jedná o podporu souběžného zpracování z více vláken, možnost při překladu vypnout podporu síťových funkcí, schopnost validovat požadavky a odpovědi serveru proti XML schématu a to nejdůležitější – dopsat testy pro síťové operace.

Testováním síťových operací myslím testy funkcí jako přihlášení k datové schránce, získání seznamu zpráv, odeslání zprávy atd. V současnosti existuje testovací instance ISDS, kde je možné takové operace vyzkoušet, ale vše s patřičnou časovou prodlevou a především není možné otestovat reakci knihovny na všechny chybové stavy nebo na chybně utvořené zprávy (například hodnota času doručení by nebyla správně utvořena.).

Co tedy chybí, je nástroj, který by simuloval server, a sada testů, které by prověřily knihovnu po všech stránkách, především v okrajových případech, které se za běžného provozu nevyskytují. Protože takovou péči by si zasloužily i jiné knihovny (napsané v rozličných jazycích) a protože simulátor testů a definice testů mohou být na konkrétní knihovně nezávislé, došel jsem k závěru, že je třeba věc uchopit značně abstraktně a na jazyku knihovny nezávisle. Protože se jedná v podstatě o samostatný projekt rozsahem srovnatelný se samotnou knihovnou, rozhodl jsem se, že jej prostřednictvím firmy Red Hat Czech s. r. o. nabídnu jako zadání bakalářské práce. Pokud bude téma akademicky průchodné a až budou všechny formality hotové, studenti Fakulty informatiky Masarykovy univerzity a Fakulty informačních technologií Vysokého učení technického v Brně dostanou příležitost, jak skloubit příjemné s užitečným.

Shrnutí

Knihovna libisds dosáhla verze 0.3.1, ve které plně pokrývá specifikaci. Knihovna se stala stabilní součástí několika linuxových distribucí, nad knihovnou je vystavěna alespoň jedna aplikace. Knihovna je tudíž ve stavu vhodném k ostrému nasazení.

Knihovna je aktivně udržována a plánují se další vylepšení. Samozřejmostí je údržba souladu s měnící se specifikací ISDS.

Související články

Projekt: Multiplatformní přístup pro datové schránky
Datové schránky v Linuxu
Datové schránky: trestní oznámení
602 Form Filler – FOP

Další články z této rubriky

Týden na ITBiz: Polovina českých firem si není jistá blízkou budoucnosti svého oboru, většina ale počítá s velkým vlivem AI
Týden na ScienceMag.cz: Působivá simulace pádu do černé díry
Týden na ITBiz: Platby výkupného za ransomware vzrostly za poslední rok na pětinásobek
Týden na ScienceMag.cz: O krok blíže k molekulárním počítačům
Týden na ITBiz: Kvalita a přesnost dat generovaných AI rozhodne o důvěře zaměstnanců v umělou inteligenci

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.