Végre sikerült minden szempontból megoldanom azokat a kérdéseket, amelyeket fontosnak tartottam. Tesztelés hiányzik még, esetleg KDE 4 alatt ha megnézné valaki, hálás lennék.
Először is Köszi Lacos! :D Durva mód örültem a megoldásnak, mert szerettem volna mindenképpen egy olyat is, ahol nem feltétlen kell polling, és már pár napja szívtem vele. :) Habár teszteltem, és a mappa létezésére való kérés (valószívűleg csak egy stat rendszerparancs a Ruby részéről a File.directory? kérés) nem eszik "semmit".
Az strace hack egyáltalán nem zavar. Akkor hívom csak meg, ha létezik a rendszeren. Egyébként pedig polling-olok, vagyis kicsit várva sleep-el újra kérdezem a /proc/PID lista alapján, hogy melyik az az alkalmazás, amelyik megnyitotta az xdg-open-nel a fájlomat.
A működésről:Ez egy GUI megoldás. A célom, hogy egy file.ods.gpg vagy akármilyen .gpg kiterjesztésű fájlra klikkelve desktop-on bekérje a jelszót, és nyissa meg a fájl típusához tartozó programot - majd ha a felhasználó bezárja a programot, akkor titkosítsa vissza a fájlt kérdés nélkül. Ezért a .gpg kiterjesztéshez érdemes hozzátársítani a script-emet.
A GUI-hoz kell működő megoldott gpg agent. Ez Gnome alatt működik - XFCE alatt nincs alapból, de beállítható. Ha nincs agent, attól még továbbra is működik a program terminálból indítva - ez is megoldás ekkor, csak a parancsikont nem Application, hanem Application in terminal vagy hasonló módon kell létrehozni - ekkor csak annyi a csúnyaság, hogy az alkalmazás idejére ott figyel egy terminál is a háttérben. Ez nem gond. Vagy ez, vagy állítsunk be gpg agent-et. Egyébként Gnome alatt amin tesztelem, akkor is létrehozza az agent-et gpg, ha nem fut. Tehát asztali környezet függő.
Megjegyzések:
1) Tettem a Ruby verzióba is trap kódot - vagyis ha kap egy INT vagy TERM jelet, akkor törli a kicsomagolt titkosítatlan fájlt (alapból a rendszertől kérek temp fájlt, amely a /tmp alatt jön létre, és a nevébe beleveszem az open_gpg nevet, erre lehet keresni is, elvileg KILL jelet kivéve sosem szabad hátra maradni ennek a 2 fájlnak, amely közül egyik a kicsomagolt fájl, a másik pedig a gpg STDERR kimenete)
2) A temp fájlok végéhez hozzáteszem a kiterjesztést, mert úgy láttem, hogy előfordulhat, hogy ha nincs bejegyezve alkalmazás az adott kiterjesztéshez, attól még így jobban ki tudja találni xdg-open a szükséges app nevét.
3) Ugye az általam egyszerűnek gondolt dolgot 3 fő probléma akasztotta meg, amelyre nem számítottam:
- az egyik az, hogy "xdg-open fájlneve" parancsot meghívva megnyitja a fájlt a típusa alapján hozzárendelt alapértelmezett alkalmazásban, de _nem vár_. Tehát a system parancsnál tovább fut a kódom, mert az csak az xdg-open befejezésére vár, de itt még nem áll meg a történet, mert az tovább nyitja az alkalmazást, ami viszont nem gyermek folyamat lesz, és ezért nem lehet rá várakozni a rendszer vagy shell "wait" funkciójával. Ha gyermek folyamat lenne, akkor nem lett volna szívés és egy wait elég lett volna. De szép is lett volna :)
- a másik annak kiderítése, hogy mi lett végül a PID-je annak a folyamatnak, amelyet xdg-open hozzányitott a fájlhoz. A megnyitott alkalmazás megállapítását végezetül nem process group ID alapján teszem meg, hanem a /proc/PID/cmdline alapján. Ez tartalmazza a temp fájlom nevét. Pl. geany./tmp/XXXXXXXX.txt. És mivel véletlen szerű a név, ezért csak ez fogja tartalmazni, tehát megbízható megoldásnak tartom.
- a harmadik, hogy nem tudom megállapítani egy .gpg fájlról, hogy milyen módon lett betitkosítva. Az kell nekem, hogy szimmetrikus, vagy asszimetrikus módon lett-e. Ugye azt már leírtam, hogy a praktikussága és biztonsága miatt akarok csak publikus kulcsú titkosítást támogatni, mert egyrészt a gpg-agent-ben jobban megbízok a kulcs tárolására, mintha zenity-vel én implementálok le valamit és memóriában tartom a jelszót, ami ugye kell a program befejeztekor, hogy vissza tudjam titkosítani a tartalmat. Ez publikus kulcsúnál nem áll fent ugye, mert a titkosításhoz nem kell a privát jelszó, mivel a publikus kulccsal titkosít. Megunknak meg vegyük a fáradságot létrehozni egy kulcsot, és azt használni mindenhova a különböző gyenge jelszavak helyett. Szóval ennek a módját a gpg STDERR kimenetéből állapítom meg, amiben szerepen a "public key is" mondat, amely után megtalálom a kulcs ID-t. Remélem, hogy ez régóta standard a gpg verziókban és nem változik sűrűn.
4) Ha nincs gpg-agent, akkor ikon-ból indítva ez segíthet: "xterm -e '/home/user/open_gpg.rb file.valami.gpg'"
5) A program végén visszadob egy üzenetet a sikeres visszatitkosításról - úgy gondolom ez is fontos. Ekkor már törölve van a kritikus kicsomagolt fájl.
6) Van lehetőség fix alkalmazás név megadására is, ekkor a script utáni első paraméter nem a fájl neve, hanem az alkalmazás neve, és után jön a fájl neve, tehát pl:. :/open_gpg.rb gedit hello.txt.gpg