GnuPG GUI?

Fórumok

Sziasztok,

Ismer valaki olyan grafikus GnuPG frontend-et, amely egy .gpg fájlra klikkelve megnyitja az abban található fájlt - majd szerkesztés és bezárás után visszaírja a titkosított anyagba? Tehát ha van egy szoveg.txt.gpg fájlom, akkor a jelszó bekérése után a .txt kiterjesztéshez rendelt alapértelmezett programmal megnyitja.

Ha nincs ilyen akkor leprogramoznám, mert sokszor használom, de feleslegesen nem állnék neki.

Itt már megoldottam ezt shell alapon, de rendes GUI-t szeretnék.

Köszi.

Változás: teljesen újraírtam a shell verziót Ruby-ban, mert a mime típusok és az egyszerűbbnek tűnő feladat bonyolodása miatt hatékonyabb és gyorsabb lesz így.

Új kód itt található. Ezzel megoldottam az xdg-open kérdését is, már csak több tesztelés kell.

Hozzászólások

Mivel mindenképpen shell parancsokat kell használnom, ezért maradok a shell-nél, és a régi megoldásomat pofozom át kicsit.

Most xdg-open-t használok a fájl megnyitására, így a kiterjesztés alapján automatikusan a hozzátartozó alkalmazásban nyitja meg a fájlt. Publikus kulcsú .gpg fájlokhoz van.

Forráskód itt. Példa:

echo hello > szia.txt
gpg -e -r nevem szia.txt
rm szia.txt
./gpg_open.sh szia.txt.gpg

Itt feljön a pinentry és bekéri a jelszót, majd kibontja a fájlt és hozzányitja az alkalmazást. A progim megnézi, hogy milyen kulcs ID-vel lett eredetileg titkosítva, és az alkalmazás bezárása után ugyanazzal titkosítja vissza.

Még tesztelem. Ami nem szép, viszont legalább csúnya megoldás, az az, hogy nem találtam módot rá egy .gpg fájlról információt kinyerni, hogy megtudjam, milyen módon lett betitkosítva. Úgymint publikus vagy szimmetrikus titkosítás, illetve az előbbinél a kulcs id stb.

Ezt jelenleg úgy oldom meg, hogy parsolom a gpg stderr kimenetét. Egyetlen szépséghibája, hogy ha szimmetrikus (jelszavas) titkosításra futtatjuk, akkor csak a pinentry-s jelszó bekérés után tudom dobni a hibaüzenetet, hogy a fájl nem publikus kulcsú titkosítású.

Csak publikus kulcsú titkosítással készített fájlt akarok támogatni 3 ok miatt:
1) a pinentry-ből nem tudom kinyerni a közben beírt jelszót ami a visszatitkosításhoz kellene - és saját pinentry-t zenity-vel meg hasonló gányolással nem akarok csinálni
2) a publikus kulcsú titkosításnál a becsomagoláshoz nem kell jelszó
3) a publikus kulcsú titkosítás erőssége a kulcsunktól függ, nem a jelszó hosszától

Meg van az első grafikus felület alatt is teljesen működő verzió. Az szivatott meg, hogy gpg-nek kell a --no-tty kapcsoló, hogy ne oda akarja kinyomni az output-ot, mivel nincs ilyen eszköz ilyenkor.

Most már működik úgyis, hogy a grafikus felület alatt hozzátársítom a .gpg típusú fájlokhoz a script-emet.

Újabb változás: mostantól nézi a script, hogy konzolból vagy GUI-ból lett-e indítva. Ha előbbi, akkor a terminálba printeli a hibaüzenetet (ha van), ha utóbbi, akkor zenity-vel dobom ki a képernyőre.

Ez is kell mindenképpen, mert GUI alól ezelőtt nem volt látható, ha volt hibaüzenet.

Kieg.: ezt az alábbi paranccsal vizsgálom:

if [ -z $(stty) ]; then

Vagyis stty kimenete zero-e vagy sem. Van ennél szabványosabb megoldás, hogy megtudjuk, konzolból lett-e futtatva a script?

Ez szép, köszi! :)

Szerk.: de ugye most meg továbbra is kell az stty, mert Ruby alatt csinálom. Más szabványos megoldás? Pl. környezeti változóban nem lehet erről infó, hogy GUI alól indult-e a process?

Szerk2.: ahogy nézem, ha GUI alól indítom, akkor a TERM változó értéke Gnome 2 alatt "dumb", XFCE alatt "linux". Ez szabvány lehet valamennyire?

Seahorse + Gedit. Szepen muzsikalnak egyutt, foleg, ha felrakod a kettot osszekoto plugint.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

A következőt használom erre:

#!/bin/sh
PASSFILE=$1
export SAVE_PASSFILE="gpg --no-use-agent -a -o ${PASSFILE} -c -"
OPEN_PASSFILE="gpg --no-use-agent -d ${PASSFILE}"
umask 177 &&
if [ -e ${PASSFILE} ]; then
ed \!"$OPEN_PASSFILE"
else
touch ${PASSFILE} &&
ed ${PASSFILE}
fi

menteni a következőképpen lehet:
w !$SAVE_PASSFILE

Azért tetszik mert a HDD-n csak titkosított file van, meg azért is mert én írtam. :)
Az ed elég barátságtalan editor, de mással nem tudtam megoldani a mentés részt.

Szíves felhasználásra.

Ugye ed-et használsz szövegszerkesztőnek, hogy abba nyissa bele a text fájlodat. De én - ahogy feljebb is írtam - nem txt fájlokat akarok szerkesztgetni, hanem bármilyen fájlt. Pl.: munka.xls.gpg - és úgy, hogy a visszatitkosításkor ne kelljen jelszót gépelni, hanem csak 1x, a megnyitásnál.

Jujj de szívtam az xdg-open paranccsal. Ez azt csinálja, hogy megnyitja a fájlhoz az alkalmazást, de nem vár, hanem egyből kilép. Ráadásul nem ő forkolja az új folyamatot, ezért arról sehonnét nem tudok infót gyűjteni, és ezért nem tudok várakozni enenk a folyamatnak a végére. Tehát ez nem működik sehogy:

xdg-open file.txt && wait

Ezért az xdg-mime paranccsal kell kibányásznom lépésenként az infót, hogy milyen típus fajta, ahhoz milyen .desktop tartozik, majd ez milyen binárist tartalmaz. Itt látható a patch.

Még finomítanom kell rajta, mert Debian / XFCE környezetben nem működik megfelelően - de nem a script-em, hanem az xdg-mime nem adja vissza a megfelelő típust.

Újabb szívás, mert az xdg-mime nem megbízható, tartalom alapján is ítél. Pl. a .gnumeric típust .gzip-nek jelenti le Debian / XFCE alatt.

Visszatérek az xdg-open parancshoz, mert az megbízható. De hogyan tudnék várakozni az általa megnyitott alkalmazás kilépésre wait paranccsal? Erre valakinek ötlet?

Ugye lsof-al sem vagyunk kisegítve, mert nem tudható, hogy mire kell várakozni. Se PID, se parancs név.

Ugye xdg-open forkol, de nem subshell lesz. Arra is gondoltam, hogy begyűjtön az xdg-open előtti összes PID-et, majd a parancs utánival összehasonlítom, így megkaphatnám, hogy milyen új PID-ek keletkeztek. De ez hülyeség, mert közben más is indíthat új folyamatot.

Végül leimplementáltam az xdg-open-t és átírtam Ruby-ra az egészet, lásd a bekezdést.

Ok, let me guess: dekodolod a fajlt, kirakod valahova, ahol az app meg tudja nyitni. Ez egy uj fajl lesz, jo esellyel csak az az app fugg rajta, amelyik eppen megnyitotta. Hopp, mar tudjuk is az app nevet, a PID-jet, es minden fontosabb infot rola.

#justthinking.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Így gondoltam először én is, de mégsem jó, mivel sok csapda lehet. Mi van ha a társított alkalmazás csak egy wrapper script, és újabb folyamatot forkol például?

Semmiképpen nem 100%-osan megbízható megoldás szerintem. Most a saját open-emet pofozgatom, igazából teljesen jó lesz ez így - attól függetlenül hogy telepítve van-e az xdg-utils.

Már csak azt nem tudom, hogy hol változik, hogy a mime típusnak mi az elsődleges. Tehát tegyük fel hogy van gedit és geany telepítve. Nézzük az alábbit:


$ grep "^text/plain" /usr/share/applications/mimeinfo.cache 
text/plain=gedit.desktop;fedora-geany.desktop;

Ha a társítást felcserélem (jobb egérgomb / tulajdonságok, és az Open With értékét átllítom), attól még nem változik a sorrend a mimeinfo.cache fájlban. Akkor hol változhat? (XFCE és Gnome alatt is ua.)

Szerk.: rákerestem "find -mmin -1" paranccsal, és ez a megoldás:
/home/user/.local/share/applications/defaults.list (XFCE)
/home/user/.local/share/applications/mimeapps.list (Gnome 2)

Szerk2.: ugye Gnome2 alatt az xdg-open a gvfs-open-t használja, annak meg néztem egy strace kimenetet. Hát elég csúnya olyan szempontból, hogy sok fajta mime fájlban matat - tehát ha rendesen le akarom implementálni, akkor az nagy munka.

Akkor marad a kérdés: hogy tudnám elkapni az xdg-open által megnyitott alkalmazás PID-jét? Mert akkor azt subshell-ként hoznám létre, és valahogy így tudna működni:

(PID=grep valahogy valahol) && wait PID

"Így gondoltam először én is, de mégsem jó, mivel sok csapda lehet. Mi van ha a társított alkalmazás csak egy wrapper script, és újabb folyamatot forkol például?"

Mi lenne? Semmi. Addig kell varakoznod, amig _valami_ fogja az illeto fajlt. Lenyegtelen, hogy micsoda. Ha lejart egy PID-re a varakozas, akkor megint ranezel lsof-fal (mondjuk egy fel masodperces lauf utan), hogy erdeklodott-e meg valaki? Ha igen, megvan a PID-je, mehetunk tovabb varakozoba. Nem fogja senki? Akkor lehet becsomagolni telire a dolgokat. Persze, lehet hijackelni ugy, hogy valami mas is ralockol, mondjuk valami sharedet, es igy amikor az app kilepett, lenyulhatja az adatokat.
De ez ellen amugy se vagy vedve, mivel egyszer kititkositod valahova a fajlt, onnan pedig barmikor ki lehet olvasni a contentjet, hiszen az lsof forditva is mukodik (szia, tudok egy PID-et, erdekelne az altala nyitott fajlok listaja, mondjuk, most...), tehat az igazi megoldas a Truecrypt.

Ehhez kepest mar nem tunik olyan nagy visszalepesnek az lsof figyelese.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

De nem mutat semmit az lsof - ez a gond.

Egyébként tovább jutottam a dologgal. -> man proc, ezen belül /proc/pid/stat - ennek a fájlnak az 5. tagja a process group id, vagyis pgid, és ez megegyezik a ruby-s folyamatom pid-jével, ha ő az, akit forkolt az xdg-open. A kód is kész, szépen megtalálom a pid-et. Stimmel a pname is (gedit). Most jön a következő gond:

Így hogy már tudom a pid-et, hogyan várakozzak rá? Vagyis a befejezésére? Ugyanis a Process.wait osztály, vagy a bash beépített wait-je, vagy a C man 2 waitpid -je mind mind csakis gyermek folyamatra tudnak várakozni. És így hibát kapok, mert ez nem gyermek folyamat, mivel az xdg hívás forkolta tovább. A szülő pid-jére 1-est ad.

Pollingolni sem szép megoldás, mert bezáródhat a várakozás alatt a folyamat, és jöhet egy új ugyanolyan PID értékkel.

Most keresgéltem a /proc/PID mappában valami egyedi azonosítót, amire tudnék pollingolni pl. 0.1 sec időnként, hogy megvan-e még - ha nincs, akkor végeztem, a fájlt visszacsomagolom. De semmi ilyen egyedi azonosítót vagy tartalmat nem találok.

Erre ötlet valakinek?

Most mi van? :)

Indítsd el a legfelső szintű programot ("whatever") így:


(
  exec 3>&1
  whatever 4>&1 >&3 3>&- \
  | read 3>&-
)

Ennek hatására az alábbiak fognak történni:

  1. A cucc egy subshell-ben fut.
  2. Az exec sor dup2-vel oda irányítja (nyitja) a subshell 3-as fd-jét, ahova az stdout amúgy is mutat. Ezt azért kell külön sorba tenni, mert a következő sorban pipeline-t fogunk építeni, és ott már nem tudjuk teljes biztonsággal megakadályozni, hogy a pipe redirection minden más redirection előtt érvénybe lépjen. Vagyis a whatever program már nem férne hozzá az eredeti (fő shell-)stdout-hoz.
  3. Nézzük a pipeline-t. Az első tag némi redirection után lefuttatja a kérdéses programot (amely forkol, aztán elpatkol, a gyereke viszont nem, te meg arra akarsz várni). A második tag egy shell script, amely stdin-ről olvas egy sort, ill. EOF-ig, ha az előbb jön. Ennek a pipeline-nak akkor van vége, ha az utolsó elem befejeződik, ami jelen esetben a read.
  4. A pipeline mindkét tagja örökli a subshell-től az fd3-at. A read-nél ezt simán lezárjuk (bár nem lenne feltétlenül szükséges.
  5. A whatever örökli az fd3-at (ami a rendes shell script-ed stdout-jára van ráállítva), illetve kapott egy stdout-ot, ami a pipe-ra mutat. Ezen reszelünk egyet -- az átirányítások balról jobbra hajtódnak végre:
    1. Az fd4-et átirányítjuk az stdout alatti file description-re (nem descriptor-ra!), ami jelenleg a pipe.
    2. Az stdout-ot a pipe helyett áttoljuk az fd3 alatti file description-re (nem descriptor-ra!) így a whatever program (és az összes gyereke) stdout-ja a fő shell script stdout-ja lesz, ahogy illik.
    3. A 3-as fd-re már nincs szükségünk, lezárjuk.
  6. A whatever program, valamint összes gyereke fd4 "néven" rendelkezni fog egy referenciával a pipe-ra. Erről a programok nem fognak tudni (nem ők nyitották). Gond csak akkor lehet, ha valamelyik processz a fában szándékosan lezárja mindenét, amit nem ő maga nyitott meg (ez néha értelmes dolog, de ritka), illetve ha valamelyik processz a fában kifejezetten a 4-es fd-t manipulálja valamilyen célból (pl. valami hasonló shell script -- ez is valószínűtlen). Természetesen fstat()-tal is ránézhet bármelyik processz az fd4-ére, illetve beleírhat stb, de ez nagyon valószínűtlen. Jó esetben az összes gyerekprocessz rendelkezni fog egy write referenciával. A legutolsó write referencia akkor fog megszűnni, amikor az utolsó gyerekprocessz is kilép, a read pedig ekkor fog egy EOF-ot kapni.
  7. Amikor a subshell végül befejeződik, akkor természetesen az fd3-ja is véget ér.

Nem teszteltem :)

Kiegészítés: a kód tömöríthető pl. így:


(
  whatever 4>&1 >&3 3>&- \
  | read 3>&-
) 3>&1

Nem jó sajnos. Előb lefut a shell script, mielőtt bezárnám a txt fájlhoz hozzányitott gedit-et. A wait-nél kellene várakoznia szerintem. Ugye azt szeretném, hogy addig várakozzon a wait sornál a script végrehajtása, amíg be nem zárom az xdg-open által forkolt GUI alkalmazást. De, mint ahogy Rózsi vonata, ez sem vár :)


#!/bin/bash

echo hello > szia.txt

(
  exec 3>&1
  xdg-open szia.txt 4>&1 >&3 3>&- \
  | read 3>&-
)

wait

echo "VEGE"

Belenéztem ebbe az xdg-open-be. Szerintem ez GNOME alatt nem maga forkolja le (akár közvetlenül, akár közvetve) az editort, hanem valami socket-en beszól a window-manager-nek, és az nyitja meg.

xdg-open --> gnome-open --> g_app_info_launch_default_for_uri(). Ennek van egy opcionális GAppLaunchContext paramétere. Szerintem itt nem sima fork()-ról van szó, hanem a fentiről.

Amíg fut a gedit, nézd meg pstree-vel, hogy ki a szülője.

... Ja, látom most már, fent írtad, hogy nem fork :)

Kicsit okosítottam az xdg-open implementációm: az adott kiterjesztéshez tartozó MIME típusnál az összes bejegyzett alkalmazást végignézi hátulról előre (hogy a legfrisebb társítást vegye előre), és az első létező alkalmazás nevét adja vissza.

Subscribe: nagyon érdekel, hogy oldod meg a filenyitottság-érzékelést.

Még azon tűnődök, hogy nem lehetne valamit a signal-okkal játszani? A poliing-ot akarom mindenképpen elkerülni. Vagy valami file descriptor-t kihámozni a /proc/PID/-ből, aztán bele írni úgy, hogy valami módon a művelet addig várakozzon, amíg be nem zár az alkalmazás.

Hogy lehetne idegen folyamatra vagy PID-re várakozni standard módon polling nélkül?

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

A kód itt található.

Csak végig scrolloztam az egészet, nem is nagyon olvastam a kódot, de egy valami rögtön szemet szúrt!

info("info: data has been reencrypted back successfully")

Nem tudom, hogy ez így helyes-e de az én megérzésem az, hogy nem... :) Most vagy reencrypted vagy encrypted back.
Olyan mintha magyarul azt mondanád: az adatok sikeresen vissza lettek újratitkosítva.

Persze nem kötekedni akarok, csak megjegyeztem.

Nem gondolnád hogy az "encrypt back" jobban leírja a folyamatot, mint a "re-encrypt"? Mert az újra titkosításon érthetném azt is, hogy másfajta módon betitkosítom ismételten, tehát mintha érzésre jobban visszaadná az előbbi, hogy ugyanolyan módon csomagolom vissza a fájlt, mint ahogy eredetileg volt.

Sok éve volt egy (kicsit hasonló) problémám. Nálam anno az is gondot okozott, hogy a felhívott progi mindenféle köztes állományokat is létrehozott. Ezeket képtelenség volt a végén rendesen, nyom nélkül letakarítani. A vége az lett, hogy hogy röptében csináltam egy ramdisk-et, abban dolgoztam, majd a végén dd-vel felsóztam a helyét.

legtöbb journaling (ill. flash-re rakott akármilyen) filesystem-nél hatástalan lesz... Esetleg rakd egy védett temp dirbe a /dev/shm alatt (és irányítsd oda a TMPDIR változót is, remélhetőleg az app figyelembe fogja venni), de ha van titkosítatlan swap-od, akkor még mindig "megszökhet" az alkalmazásból.

Nem jo otlet a swap off. Mar ugy ertem, hogy biztonsagi szempontbol persze, igazad van, csak ez mar scope violation lenne. Ez az alkalmazas arra valo, hogy megnyithatova es szerkeszthetove tegye a gpg-vel lezart fajlokat, viszont a rendszerbe nyulkalashoz

1) eleve nincs is joga, a swap off root-koteles muvelet
2) es ha userkent lenne is ra joga, akkor sem tehetne meg, mert tullepne a hataskoret. A swap rendszerbeallitas, tul sok mindent befolyasol a lete/nem lete. Ha pl. aktivan hasznalva van a swap, es kikapcsolja, akkor akar crasht is csinalhat -> adatvesztes.

Szoval nem.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Nekem speciel titkosított (hw-es).

Meg ugye kérdés, hogy ki ellen szeretnénk védekezni. Nekem a titkosított partícióm mellé kell csak egy olyan eszköz, hogy ha nem vagyok a gépnél és valamiért nincs lock-olva, akkor bizonyos doksira klikkelve ne legyen hozzáférhető másoknak. Illetve ha én megnyitom, akkor visszazárás után is titkosított maradjon.

Felmerült még egy nehéz kérdés: ha több .gpg-s fájlt nyitok meg, és a kiterjesztésük egyforma, és ha a másik fájlt ugyanabban az app-ban nyija meg, akkor az app cmdline stringje már nem fogja tartalmazni a második fájlt, mivel a cmdline már nem is fog változni - mert ugye még mindig ugyanaz az app fut, csak benyitott még egy fájt.

És sajnos nem megállapítható általánosságban egy fájlról, hogy egy GUI app által nyitva van-e, mert megnyitás után valszeg azonnal lazárja a fájlt. Ezért se fuser, se lsof nem segít.

Illetve másik gond: a system() hívás csak az új app megnyitásánál vár. Tehát ha pl futtatunk egy ilyet: system("gedit file1.txt"), majd egy teljesen új shellben egy másik text fájlt nyitunk: system("gedit file2.txt"), akkor csak az első system hívásnál várakozik az app bezárására. A másodiknál is belenyitja a fájlt, de átszalad rajta. Tehát még az sem lenne megoldás, hogy megadnám az app nevét.

Egyelőre ezért több egyforma fájl megnyitásánál nem működik megfelelően a progim egyelőre.

Az a jo, hogy mindenbol altalanos szabalyokat faragsz :-)
A Gedit-nel ez pl. azert van igy, mert nala letezik olyan, hogy tavvezerles, meg singleinstance. Ha pl. mcedit-eket nyitogatnal, a masodik system() parancs se lepne ki.

Egyebkent pedig szerintem pont emiatt nem vagott ebbe igy bele senki, mert nagyon sok app vigyaz arra, hogy ha mar amugy is zaballja a memoriat, akkor legalabb ne 2, 3, 4, n peldanyban tegye, es ezeket meg ha lehet is mas modira szoktatni (a firefoxot pl. lehet), akkor se akarja senki.

Nekem egyre inkabb az az erzesem, hogy ezt inkabb valami gvfs/KIO plugin szintjen kene megoldani. Viszont igy nem lenne DE fuggo. Cserebe mukodne.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

(Mellékszál.)

Azok a programok, amelyek írói nem akarták jobban tudni a user-nél, hogy mit akar a user, felkészültek mindkét lehetőségre. Példaként a NEdit-et fogom megemlíteni. Indítási módok:

  • nedit: előtérben futó editor
  • nedit -server: szintén előtérben futó editor, amely nc-től fogad parancsokat az X szerveren keresztül
  • nc: parancsot küld "nedit -server"-nek, majd kilép. Be lehet úgy állítani az nc-t, hogy ha még nem fut "nedit -server", akkor indít egyet a háttérben. (A nedit normálisan előtérben marad.)
  • Mind az nc, mind a "nedit -server" fogad olyan kapcsolót, hogy "-svrname XXXX". Ezzel több "nedit -server"-t lehet egymástól függetleníteni.

Felhasználási módok:

  • bármit szerkeszteni akarok, "nc" (indít egy szervert, ha nincs; ha van, abba dobja bele a file-t)
  • ha több forrásfán dolgozom párhuzamosan, és nem akarom, hogy a tags file-ok illetve a file buffer tab-ok keveredjenek, akkor az -svrname kapcsolót használom. Pl. két fa esetén van két nedit szerverem, 1-1 ablakkal, egyikben N füllel, másikban M füllel, valamint mindegyik szerverbe be van töltve az adott fa tags file-ja. (Többet is be tud tölteni, azonban olyan nagy az átfedés a tag-ek között, hogy túl gyakran kellene a találati listából kézzel kiválasztani, melyik fára gondoltam.)
  • a git commit editorom egy sima "nedit", nem szerver-, hanem egyszeri, előtérben futó módban, amely független minden mástól.