Adminer 6.0.0
Začnu prosbou. Adminer má na GitHubu už jen o 400 ⭐ míň než phpMyAdmin, kvůli jehož těžkopádnosti jsem začal na mrštné alternativně pracovat. Pokud vy nebo vaši známí Adminer používáte, dejte mu prosím hvězdičku.
Při vývoji Admineru jsem se dostal do totálního flow. Při řešení jedné věci mě napadly dvě další a todo list byl večer často dvakrát delší než ráno. Adminer 6.0.0 obsahuje více než 130 změn a nebudu je tady všechny vypisovat. Vyberu jen to nejzajímavější:
Bezpečnost
Adminer už od verze 4.6.3 zakazuje přihlášení bez hesla. Hlavně uživatelům SQLite to komplikuje život. Pro ně jsem vytvořil stránku, kde si můžou stáhnout Adminer pro SQLite chráněný heslem dle jejich výběru.
Nově jsem zakázal i přihlášení k serverům, které se spokojí s jakýmkoliv heslem. Plugin login-password-less na tyto změny reaguje a nově v něm lze použít stejné heslo pro SQLite jako máte třeba pro MySQL.
„Operátor“ SQL v Admineru používám třeba pro práci s JSON. Je ale samozřejmě nebezpečný, do SQL příkazu lze pomocí něj doplnit jakýkoliv kód. SameSite cookies používané Adminerem riziko snižují, ale doplnil jsem dvě další ochrany:
- Jeho použití vyžaduje poslání
Sec-Fetch-Site: same-site. - V PostgreSQL se dotaz spustí jako
READ ONLYa nelze spustit víc dotazů.
Vzhled
Chtěl jsem vypíchnout data v databázi a potlačit uživatelské rozhraní Admineru. Třeba skrytím opakujících se odkazů a jejich zobrazením až při najetí myši. Vzhled byl mnohem vzdušnější, ale zároveň vypadal děravý a na první pohled nebylo jasné, kde jakou funkci najdu. Částečná průhlednost rozhraní Admineru zase působila dojmem, že jsou odkazy disabled, tento experiment je k dispozici v pluginu menu-links (volba hover). Nakonec jsem jen checkboxy a odkazy zobrazované v řádcích tabulky vystrčil mimo tabulku, s čímž jsem spokojen. Původní chování lze vrátit pomocí vlastního vzhledu. Přemýšlel jsem, jak se zbavit opakujících se odkazů vypsat v menu. Některé vzhledy je skrývají, jiné je vymění za ikonu. Ale já zhruba stejně často používám vypsání a strukturu tabulky a jakékoliv skrytí mě zmate. U ikony musím vždycky přemýšlet, jestli znamená to nebo ono, navíc vůbec není jasné, že by měla dělat něco jiného než odkaz z názvu tabulky. U explicitního vypsat přemýšlet nikdy nemusím.
Počet ošetřovaných znaků v URL jsem snížil na minimum. Z dřívějších ošklivých URL where%5B0%5D%5Bcol%5D je pěkně čitelné where[0][col]. Týká se to i formulářů, které nepředávají nevyplněná políčka, takže jsou URL mnohem kratší. Z této pro běžného uživatele neviditelné změny mám velkou radost.
Editační funkce bez parametru (např. NOW()) nově skryjí vstupní políčko. Zvažoval jsem to udělat i při výběru hodnoty NULL, ale tam mi vyhovuje, že stačí do vstupního políčka začít psát a NULL samo zmizí.
Blbuvzdornost
Adminer měl řadu kontrol konfigurace PHP, např. proti překročení max_input_vars nebo upload_max_filesize. Ty se ale provedly, až když bylo pozdě – po odeslání formuláře. Nyní se provádí už při jeho vyplňování.
Nové verze Admineru se pomocí <noscript><iframe sandbox> nově kontrolují i s vypnutým JavaScriptem. Kontrolu verzí jsem doplnil také k pluginům, pluginům ovladačů a vzhledům, které by měly být vždy ve stejné verzi jako Adminer. Nebyly k tomu potřeba žádné nové requesty – Adminer si s sebou prostě nese verze pluginů a vzhledů, které k němu pasují. Pokud jste si nějaký plugin vědomě změnili a kontrola vás otravuje, stačí přejmenovat jeho soubor. U vzhledů pak změnit první řádek v adminer.css.
Import/export
Export obecného SQL příkazu byl v některých případech problém. Mohl obsahovat proměnné nebo stavové informace, které při exportu chyběly. Vyřešil jsem to tak, že pokud to jde, použijí se pro export přímo data z vypsané tabulky, což je i rychlejší.
Import a export si dřív každý ovladač dělal po svém a obzvlášť v pluginech ovladačů to nefungovalo moc dobře. Teď jsem to sjednotil a ovladače si jen registrují své odlišnosti – např. pokud podporují UPSERT.
V PostgreSQL jsem problém s cizími klíči vyřešil tak, že se všechny DROP TABLE a TRUNCATE provedou na začátku.
Pluginy
- Od Davida Grudla jsem převzal plugin pro zobrazení varovného pruhu na produkčních serverech. (remote-color)
- Vytvořil jsem plugin vyžadující přihlášení pomocí passkey. (login-passkey)
- Další plugin dovoluje importovat CSV soubory. To už Adminer dávno umí do strutury existujících tabulek, plugin dokáže strukturu tabulek odvodit z dat. (import-csv)
- Adminer Editor defaultně zobrazuje obrázky, teď jsem tuto možnost dal i Admineru. (select-image)
- Osm nepoužívaných pluginů jsem smazal.
Interní změny
Z některých interních změn mám možná ještě větší radost než z toho, co je vidět navenek – hlavně z obsluhy JavaScriptových událostí.
| Dávno | <a onclick="return aClick(this, 1, event);"> |
|---|---|
| Od 4.4.0 | <a><script nonce="OGY1MDBkYjNhNGRmYjAwNWU5OGJjNjMwM2Q1Nzg1MWQ=">qsl('a').onclick = partial(aClick, 1);</script> |
| Nově | <a data-onclick='aClick(1)'> |
Nový zápis je plně kompatibilní s CSP a neumožňuje přímé spuštění kódu. Je to jen přehledněji zapsané JSON pole. Zjednodušilo to i obsluhu událostí v HTML kódu poslaného přes AJAX, kterou druhý způsob přímo neumožňoval.
Pro závislosti Admineru používám Git submoduly, které jsou pro mě mnohem pohodlnější než Composer. Ale pro lidi, co instinktivně píšou git clone; composer i jsem doplnil i podporu pro composer i. Nově to nainstaluje i ESLint, který se při composer check nyní spouští spolu s PHP_CS a PHPStan.
Nechal jsem zjistit velikosti všech verzí Admineru. I přes velký nárůst funkčnosti nové verze se mi téměř podařilo zachovat velikost zkompilovaného souboru díky jednoduchému triku. Pro komprimaci překladů se používá komprimační tabulka angličtiny (funkce
deflate_init).
- V kořenovém adresáři už bylo moc souborů, proto jsem část z nich přesunul do podadresářů.
- Maximální délku řádek jsem zkrátil z 250 na už celkem přijatelných 200 znaků.
- Hlavní větev v Gitu jsem přejmenoval z
masternamain. - Sjednotil jsem úroveň požadovaného JavaScriptu. Některé obraty používaly zbytečně nové konstrukce, jiné zase zbytečně staré. Teď by měl fungovat jakýkoliv prohlížeč s podporou ES6, tedy kterýkoliv od roku 2018.
- End-to-end testy jsem přehodil z neudržovaného Katalonu na headless Playwright.
Web
Vyměnil jsem tabulky v demu. Demo nově funguje i s PostgreSQL.
Závěr
Většina změn vznikla s asistencí Claude Opus 5. Někteří lidi se bojí, že AI asistence může kód zamořit technickým dluhem. To je jistě pravda, pokud vývojář všechny změny bezduše odbouchne Enterem. Ale pokud si pořádně projde plán, vyjedná v něm změny a pak totéž udělá i s vygenerovaným kódem, kvalita kódu stoupne a technický dluh naopak klesne. Je to jako párové programování s pozorným kolegou – něco napadne mě, něco jeho a společně vzniklý kód je lepší, než kdyby ho kdokoliv z nás psal samostatně. Sám dělám při asistovaném vývoji odhadem tak dvakrát víc důležitých rozhodnutí, než když jsem na to sám.

