#!/usr/bin/env python # -*- coding: utf-8 -*- ############################################################################ # Copyright (C) 2005 by Frederic Bourgeois # # stealth@altern.org http://traceroute.free.fr # # # # This program is free software; you can redistribute it and#or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the # # Free Software Foundation, Inc., # # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # ############################################################################ import sys,signal import locale, gettext import os import cPickle import time import pexpect import gtk.glade import codecs import marshal if (os.getuid() != 0): print "\n\n\n\nOH ! OH ! : You must be root\n\n\n\n" sys.exit(0) ## Pas finaliser try: fichier=open('/opt/gpg-password/gpg-password.conf' , 'r') fichier.close except: print "Le fichier gpg-password.conf est introuvable" sys.exit(1) conf = {} for line in file('/opt/gpg-password/gpg-password.conf'): vals = line.split('=') if len(vals)!=2: continue key, val = vals conf[key.strip()] = val.strip() KEYUSER=conf['KEYUSER'] ARTICLES = {} ######################################## class myWindow: def __init__(self): def gtk_main_quit(*args): self.exit() def on_app_destroy(*args): self.exit() def on_about_activate(*args): self.on_about_activate() def Save(*args): self.Save() def editrules(*args): self.editrules() def Select(*args): self.Select() def decrypt(*args):self.decrypt() def time_to_quit(*args):self.time_to_quit() def savecomments(*args):self.savecomments() def confirm_close(*args):self.confirm_close() def mainquit(*args):self.mainquit() def Add(*args): self.Add() def Edit(*args): self.Edit() def Select(*args): self.Select() def Erase(*args): self.Erase() def cancel_button_pressed(*args):self.cancel_button_pressed() self.xml = gtk.glade.XML('/opt/gpg-password/password2.glade') self.mainwindow = self.xml.get_widget('window1') self.treeview1 = self.xml.get_widget ("treeview1") self.textview1 = self.xml.get_widget ("textview1") self.textview2 = self.xml.get_widget ("textview2") self.entry1 = self.xml.get_widget ("entry1") self.entry2 = self.xml.get_widget ("entry2") self.entry3 = self.xml.get_widget ("entry3") self.mainwindow.connect("delete_event", self.timeto_quit) self.xml.signal_autoconnect(locals()) # Have the confirm-closing window's delete event (window close) do nothing self.confirm_close = self.xml.get_widget('ConfirmClose') self.confirm_close.connect("delete_event", self.do_nothing) self.confirm_close.hide() # Have the "Exit anyway" button close everything exit_button = self.xml.get_widget("ExitButton") exit_button.connect("clicked", self.mainquit) cancel_button = self.xml.get_widget("CancelButton") cancel_button.connect("clicked", self.cancel_button_pressed) # Do nothing self.mainwindow.connect("delete_event", self.timeto_quit) ####### Decrypt def decrypt(self): global ARTICLES if ARTICLES != {}: text = "You must restart gpg-password" buffer=self.textview1.get_buffer() buffer.set_text(text) return try: info = open('/opt/gpg-password/gpg-password2.asc') text = info.read() buffer = self.textview2.get_buffer() buffer.set_text(text) except: text = "gpg-password2.asc not found" buffer = self.textview2.get_buffer() buffer.set_text(text) ARTICLES['SAMPLE'] = 'TEST' model = gtk.TreeStore(str) for server,ip in sorted(ARTICLES.iteritems()): iter = model.append(None) #on ajoute la ligne au debut du model model.set_value(iter,0,server) iter2 = model.append(iter) #on ajoute au fils model.set_value(iter2,0,ip) self.treeview1.set_model(model) cell = gtk.CellRendererText() # le text arrive par model column 0 column = gtk.TreeViewColumn("Search: --------------- Select and Ctrl + F", cell, text = 0) self.treeview1.append_column(column) text = "Ok" buffer=self.textview2.get_buffer() buffer.set_text(text) return try: passe = self.entry3.get_text() info = pexpect.spawn('gpg --passphrase %s --output /opt/gpg-password/gpg-password2.txt --decrypt /opt/gpg-password/gpg-password2.asc' % (passe),timeout=3) time.sleep(2.0) data = open('/opt/gpg-password/gpg-password2.txt') ARTICLES = cPickle.load(data) data.close os.remove('/opt/gpg-password/gpg-password2.txt') model = gtk.TreeStore(str) for server,ip in sorted(ARTICLES.iteritems()): iter = model.append(None) #on ajoute la ligne au debut du model model.set_value(iter,0,server) iter2 = model.append(iter) #on ajoute au fils model.set_value(iter2,0,ip) self.treeview1.set_model(model) cell = gtk.CellRendererText() # le text arrive par model column 0 column = gtk.TreeViewColumn("Search: --------------- Select and Ctrl + F", cell, text = 0) self.treeview1.append_column(column) text = "Ok" buffer=self.textview2.get_buffer() buffer.set_text(text) except: text = "Bad password ? Bad configuration ?" buffer=self.textview2.get_buffer() buffer.set_text(text) def pigquit(sig,stack): os.remove('/tmp/gpg-password2') print "\n\n\n\nBad way to quit !\n\n\n\n" try: os.remove('/opt/gpg-password/gpg-password2.txt') except: print "Arrrrrrg: You kill me ! \n\n\n" gtk.main_quit() signal.signal(signal.SIGINT,pigquit) signal.signal(signal.SIGTERM, pigquit) def run(self): self.mainwindow.show_all() gtk.main() # main def do_nothing(self,confirmation_dialog,event): return True def Add(self): entry1 = self.entry1.get_text() entry2 = self.entry2.get_text() if len(entry1) != 0: ARTICLES[entry1] = entry2 selection = self.treeview1.get_selection() selected = selection.get_selected() model = gtk.TreeStore(str) for server,ip in sorted(ARTICLES.iteritems()): iter = model.append(None) #on ajoute la ligne au debut du model model.set_value(iter,0,server) iter2 = model.append(iter) #on ajoute au fils model.set_value(iter2,0,ip) text = "Add ok. Don't forget save and crypt !" self.treeview1.set_model(model) buffer=self.textview2.get_buffer() else: text = "No entry !" buffer=self.textview2.get_buffer() buffer.set_text(text) # on purge le buffer avant de quitter text1 = "" buffer1=self.textview1.get_buffer() buffer1.set_text(text1) def Erase(self): buffer1 = self.textview1.get_buffer() entry1 = buffer1.get_text(buffer1.get_start_iter(),buffer1.get_end_iter(),False) if ARTICLES.has_key(entry1) == 0: text = "Please select object" buffer=self.textview1.get_buffer() buffer.set_text(text) return try: global i model, iter = selected model.remove(iter) ARTICLES.pop(i) text = "Erase ok. Don't forget save and crypt !" buffer = self.textview2.get_buffer() buffer.set_text(text) i = 0 except: text = "Bad entry !" buffer=self.textview2.get_buffer() buffer.set_text(text) #### Menu About def on_about_activate(self): "display the about dialog" self.about.show() def on_about_quit(self, exit_button): self.about.hide() ####### Quitter l'application en supprimant le lock def time_to_quit(self): # Make sure the confirmation window is shown self.confirm_close.show() def timeto_quit(self,confirmation_dialog,event): # Make sure the confirmation window is shown self.confirm_close.show() return True def mainquit(self,quit_button): os.remove('/tmp/gpg-password2') gtk.main_quit() def cancel_button_pressed(self, cancel_button): self.Save() self.confirm_close.hide() ######### Sauvegarde des donnees def Save(self): date = time.strftime('-%d-%m-%Y-%HH%M') if ARTICLES == {}: text = "Password ?" buffer=self.textview1.get_buffer() buffer.set_text(text) return try: passe = self.entry3.get_text() os.system('mv /opt/gpg-password/gpg-password2.asc /opt/gpg-password/gpg-password2%s.asc' % (date)) os.system('touch /opt/gpg-password/gpg-password2') data=file('/opt/gpg-password/gpg-password2','w') cPickle.dump(ARTICLES,data) data.close() os.popen('gpg --passphrase %s --recipient %s --encrypt --armor /opt/gpg-password/gpg-password2' % (passe,KEYUSER)) os.remove('/opt/gpg-password/gpg-password2') text = "Save ok" buffer = self.textview1.get_buffer() buffer.set_text(text) buffer = self.textview2.get_buffer() buffer.set_text(text) except: text = "Bad configuration" buffer = self.textview2.get_buffer() buffer.set_text(text) def Select(self): global i global selected global model selection = self.treeview1.get_selection() selected = selection.get_selected() if selected: model, iter = selected # try: i = model.get_value(iter,0) if ARTICLES.has_key(i): text = i text2 = ARTICLES[i] buffer=self.textview1.get_buffer() buffer.set_text(text) buffer=self.textview2.get_buffer() buffer.set_text(text2) #except: #text = "No server selected !" #buffer=self.textview1.get_buffer() #buffer.set_text(text) def Edit(self): buffer1 = self.textview1.get_buffer() entry1 = buffer1.get_text(buffer1.get_start_iter(),buffer1.get_end_iter(),False) if len(entry1) == 0: text = "Please select object" buffer1=self.textview1.get_buffer() buffer1.set_text(text) return buffer2 = self.textview2.get_buffer() entry2 = buffer2.get_text(buffer2.get_start_iter(),buffer2.get_end_iter(),False) ARTICLES[entry1] = entry2 model = gtk.TreeStore(str) for server,ip in sorted(ARTICLES.iteritems()): iter = model.append(None) #on ajoute la ligne au debut du model model.set_value(iter,0,server) iter2 = model.append(iter) #on ajoute au fils model.set_value(iter2,0,ip) self.treeview1.set_model(model) text = "Edit ok. Don't forget save and crypt !" # on purge le buffer avant de quitter text1 = "" buffer1=self.textview1.get_buffer() buffer1.set_text(text1) buffer2=self.textview2.get_buffer() buffer2.set_text(text) ###### Save conf gpg-password pas finalise def Saveconf(self): buffer = self.textview4.get_buffer() text=buffer.get_text(buffer.get_start_iter(),buffer.get_end_iter(),False) saveconf=open("gpg-password.conf",'w') saveconf.write(text) text='Save ok'.decode('ASCII') buffer=self.textview1.get_buffer() buffer.set_text(text) try: f = open('/tmp/gpg-password2','r') f.close print "Already in use" print "Lock /tmp/gpg-password2" except: os.system('touch /tmp/gpg-password2') win=myWindow() win.run()