A héten jelent meg a Drupal 7.20 verziója, ami egy olyan javítást tartalmazott, ami az Insert modulnál hibás működést eredményezett. Mivel mi - az Integral Vision csapata - is számos projektben használjuk az Insert modult, nem volt kérdés, hogy beszállunk a hiba javításába. Mindösszesen négy nap kellett ahhoz, hogy a verzió megjelenésétől, a hiba felfedezésén, javításán keresztül, a közösségi tesztelés után megjelenjen a javított verzió. A javítás csak az újonnan beszúrt képek problémájára jelent gyógyírt. Ha vannak olyan képeid, amiket régen szúrtál be, és közben törölted az automatikusan legyártással készülő leszármazottakat, akkor jó hírünk van. A javítás keretében készítettünk egy olyan modult, ami megoldja ezt a problémádat is. Nézzük részletesen miről is van szó.

A Drupal hetes verziójába bekerült az Image Cache modul funkcionalitása, mely lehetővé teszi, hogy feltöltött képekből készített, különböző méretű verziók legyártása ne a feltöltés pillanatában, hanem a felhasználás során kerüljenek legyártásra. Ez jó, hisz lehet számost képméretünk, amik az első esetben sokszor feleslegesen foglalják a helyet a háttértáron, míg utóbbi esetben csak akkor, ha történik rájuk hivatkozást.

Ezt úgy éri el a modul, hogy bejegyzi a fájlrendszer erre a célra feltartott könyvtárának elérési útvonalát saját magára. Ekkor, ha a webszerver nem talál egy fájlt az adott könyvtárban, akkor átadja a vezérlést a Drupalnak, ami meghívja a modul megfelelő függvényét. Ez a függvény azután legyártja a megfelelő méretű képet, elmenti, majd kiszolgálja. Így az először arra látogató, a képet megnéző felhasználó is látni fogja a képet, míg a későbbiekben érkezőknek, a webszerver, a már létező fájlt fogja kiszolgálni. Amennyiben változik a sminkünk, és a teljes szélességű képméret már nem x, hanem y pixel széles, akkor csak egy helyen kell módosítanunk ezt a beállítást, és a modul automatikusan legyártja nekünk az összes képet újra. Vagyis igazából akkor, amikor szükségünk lesz rá, mert valaki megnézte azt.

Ezzel a nagyszerű megoldással van(igazából volt) egy probléma. Ha gonosz támadók megszereznek egy olyan képhivatkozást, ami még nem került legyártásra, és ennek a hivatkozásnak a lekérésével elárasztják a szervert. Jobb esetben azt érik “csak” el, hogy a szerverünk, a terhelést nem bírva elérhetetlennél válik. Rosszabb esetben, ha megfelelő teljesítményű a szerverünk, elfogyhat a rendelkezésünkre álló háttértár, és a szerverünk maradandó károsodást szenvedhet.

A probléma megoldására azt találták ki a Drupal fejlesztői, hogy minden ilyen képhivatkozás végére beszúrnak egy tokent. Ez a token kívülről nem kitalálható, tehát csak úgy nem lehet egy olyan url-t generálni amin még le nem gyártott kép (nem)figyel. Ehhez az image_style_url() függvényt módosították, így azok a képhivatkozások, amik programozottan, ennek a függvénynek a felhasználásával kerülnek a html kimenetbe, továbbra is jól fognak működni. Probléma csak ott lesz, ahol a linkeket saját függvénnyel állítják elő, vagy kézzel szúrják be a hivatkozásokat.

Mivel az Insert modul saját függvényt használ a képhivatkozások előállítására, ezért szükség volt arra, hogy azt módosítsuk úgy, hogy a token a link végére kerüljön.

Miután megtaláltuk a probléma okát, nem volt más hátra, mint utána nézni, hogy van-e már bejelentett hibajegy a témában. Az egész csapat nekiesett az isseue queue-nak, végül Szilárd talált egyet, de az le volt zárva, mint később kiderült tévesen. Mire elkészítettem a foltot, már újranyitották, így nem volt más dolgom, mint feltölteni a foltot és needs review-ra állítani a hibajegyet.

Az ilyen feltöltés azért is praktikus, azon túl, hogy megosztjuk a közösséggel a hibajavítást, mivel így lehetőségünk nyílik arra, hogy könnyedén beillesszük a projekt .make fájljába a foltot. Így mi a délutáni release-ban már nyugodtan használhattuk a 7.20 verziót, hiszen ott figyelt benne az Insert modul hibajavítása.

Egy olyan megjegyzés érkezett, ami érintette a foltot. @David_Rothstein javasolta, hogy úgy készítsük el azt, hogy a korábbi Drupal 7-es verziókkal is együttműködjön a javított Insert modul. Ezt természetesen átvezettük és feltettük az újabb javítást.

@micz_ rámutatott arra, hogy így a korábban létrehozott tartalmakban található le nem generált képhivatkozásokkal baj lehet, ha valamiért törölni kell a legyártott fájlokat. (lásd fenti példa a sminkváltásra) Ezért készítettem egy kis modult, ami egy szűrő, melyet, ha bekapcsolsz, akkor megoldja ezt a problémát. Egyelőre ez még sandbox modult, de terveim szerint hamarosan éles modullá teszem.

@przemekz felvetette, hogy a File (Field) Paths modullal nem működik ez a javítás, de mint kiderült ez nem az Insert modul, hanem a File (Filed) Paths modul hibája. Gyorsan felvettem egy hibajegyet, hogy a modul fejlesztői nekikezdhessenek a hiba javításának.

Mivel számtalan ember tesztelte a javítást, de senki nem érezte magában a bátorságot, hogy áttegye az issue-t RTBC állapotba, felmentem a #drupal.hu irc csatornára és megkértem a srácokat, hogy nézzék át, és ha úgy látják, akkor tegyék RTBC-be azt. Pár kérdés megválaszolása után végül alippai tolta át az issue-t a közösség által tesztelt állapotba. Nem volt más hátra, mint várni a modul fejlesztőjére.

Végül szombat este 11-kor csíptem el quicksketch-t a #drupal-contribute csatornán, aki megígérte, hogy ez lesz az első dolga aznap. Ekkor tudatosult bennem, hogy milyen nagyszerű is egy ilyen nemzetközi közösségben dolgozni, hisz amíg én alszok, a többiek éppen akkor dolgoznak, hisz éppen akkor van reggel a föld másik oldalán. :)

Ma reggel örömmel láttam, hogy az Insert modul 7.x-1.3 verziója már megjelent, így hétfőtől azt használhatjuk az összes projektünkben.