#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author : Steven Harper
# License : GNU GENERAL PUBLIC LICENSE V2
# 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; version 2 of the License.
#
# 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.
import pygtk
pygtk.require('2.0')
import gtk
import commands
import time
import os
import sys
import warnings
import random
from threading import Thread
import EasyCryptConfig
import EasyCryptPopupMenu
import gettext
import popen2
import optparse
APP_PATH="/usr/share/applications/easycrypt.desktop"
#WEBSITE="https://launchpad.net/easycrypt"
WEBSITE="http://www.squeezedonkey.com/wiki/linux/index.php?title=EasyCrypt"
CMD_TEST_TRUECRYPT="which truecrypt"
CMD_TEST_TRUECRYPT_VERSION_43a="truecrypt --version"
CMD_TEST_TRUECRYPT_VERSION_6x="truecrypt -t --version"
BASIC_SUDO_COMMAND = "sudo"
URL_TRUECRYPT_DOWNLOAD="http://www.truecrypt.org/downloads.php"
# Size presets
SIZE_PRESETS = {1: "690",2: "4000",3: "8000"}
SIZE_LABELS = ["CD (690MB)","DVD5 (4000MB)","DVD9 (8000MB)"]
DEBUG = False
SPACE = 0
# normal debug function
# just call debug(your text)
def debug(text, add = False, remove = False):
global DEBUG
global SPACE
if DEBUG:
if remove and SPACE >= 3:
SPACE = SPACE - 3
if SPACE == 0:
print text
else:
print ' '*(SPACE+1) + '|--' + text
if add:
SPACE = SPACE + 3
#debug for beginning of function
def debug_begin(text):
debug('[**]['+text+']', True, False)
#debug for end of function
def debug_end(text):
debug("[**][end "+text+']', False, True)
class TrueCryptCommandRunner4_3a(Thread):
def __init__(self, command, cryptLocation, mountPoint, pw, pw2, keyfile, keyfile2, job):
Thread.__init__(self)
self.theCommand = command
self.theCryptLocation = cryptLocation
self.theMountPoint = mountPoint
self.thePw = pw
self.thePw2 = pw2
self.theKeyfile = keyfile
self.theKeyfile2 = keyfile2
self.theJob = job
self.doneRunning = False
def run(self):
print "TrueCryptCommandRunner4_3a job:",self.theJob,self.theCommand
self.returnVal = ""
if self.theJob == "create":
fout, fin, ferr = os.popen3(self.theCommand)
fout.write(self.thePw+"\n")
fout.flush()
fout.write(self.thePw+"\n")
fout.flush()
fout.write(self.theKeyfile+"\n")
fout.flush()
if len(self.theKeyfile) > 0:
fout.write("\n")
fout.flush()
errStr = ferr.readline()
print "err:",errStr
if errStr.find("truecrypt: Password must be composed only of US-ASCII") > -1 :
self.doneRunning = True
self.returnVal = errStr
return
line = fin.readline()
lastLine = ""
while len(line) > 0 and len(lastLine) > 0:
lastLine = line
line = fin.readline()
self.returnVal = ferr.readline()
ferr.close()
fin.close()
fout.close()
if self.theJob == "open":
mounts = commands.getoutput("gksudo \"echo pie\"")
fin, fout = popen2.popen2(self.theCommand)
fout.write(self.theCryptLocation+"\n")
fout.flush()
fout.write(self.theMountPoint+"\n")
fout.flush()
fout.write("n\n")
fout.flush()
fout.write(self.theKeyfile+"\n")
fout.flush()
if len(self.theKeyfile) > 0:
fout.write("\n")
fout.flush()
fout.write(self.thePw+"\n")
fout.flush()
fin.readlines()
fin.close()
fout.close()
if self.theJob == "change":
fout, fin, ferr = os.popen3(self.theCommand)
fout.write(self.theKeyfile+"\n")
fout.flush()
if len(self.theKeyfile) > 0:
fout.write("\n")
fout.flush()
fout.write(self.thePw+"\n")
fout.flush()
fout.write(self.theKeyfile2+"\n")
fout.flush()
if len(self.theKeyfile2) > 0:
fout.write("\n")
fout.flush()
fout.write(self.thePw2+"\n")
fout.flush()
fout.write(self.thePw2+"\n")
fout.flush()
self.returnVal = ferr.readline()
ferr.close;
fin.close()
fout.close()
self.doneRunning = True
class TrueCryptCommandRunner5_1(Thread):
def __init__(self, command, cryptLocation, mountPoint, pw, pw2, keyfile, keyfile2, job):
Thread.__init__(self)
self.theCommand = command
self.theCryptLocation = cryptLocation
self.theMountPoint = mountPoint
self.thePw = pw
self.thePw2 = pw2
self.theKeyfile = keyfile
self.theKeyfile2 = keyfile2
self.theJob = job
self.doneRunning = False
def run(self):
print "TrueCryptCommandRunner5_1 job:",self.theJob,self.theCommand
self.returnVal = ""
if self.theJob == "create":
fout, fin, ferr = os.popen3(self.theCommand)
fout.write("1\n")
fout.flush()
fout.write(self.thePw+"\n")
fout.flush()
if len(self.thePw) < 12:
fout.write("y\n")
fout.flush()
fout.write(self.thePw+"\n")
fout.flush()
fout.write(self.theKeyfile+"\n")
fout.flush()
if len(self.theKeyfile) > 0:
fout.write("\n")
fout.flush()
errStr = ferr.readline()
print "err:",errStr
if errStr.find("Password must contain only ASCII characters") > -1 :
self.doneRunning = True
self.returnVal = errStr
return
line = fin.readline()
lastLine = ""
while len(line) > 0 and len(lastLine) > 0:
lastLine = line
line = fin.readline()
self.returnVal = ferr.readline()
ferr.close()
fin.close()
fout.close()
if self.theJob == "open":
mounts = commands.getoutput("gksudo \"echo pie\"")
fout, fin, ferr = os.popen3(self.theCommand)
fout.write(self.theCryptLocation+"\n")
fout.flush()
if len(self.theMountPoint) >0:
fout.write(self.theMountPoint+"\n")
fout.flush()
fout.write(self.thePw+"\n")
fout.flush()
fout.write(self.theKeyfile+"\n")
fout.flush()
if len(self.theKeyfile) > 0:
fout.write("\n")
fout.flush()
fout.write("n\n")
fout.flush()
errStr = fin.readline()
print "read:",errStr
errStr = fin.readline()
print "read:",errStr
if errStr.find("Incorrect password"):
self.doneRunning = True
self.returnVal = errStr
return
fin.readlines()
ferr.close()
fin.close()
fout.close()
if self.theJob == "change":
fout, fin, ferr = os.popen3(self.theCommand)
fout.write(self.thePw+"\n")
fout.flush()
fout.write(self.thePw2+"\n")
fout.flush()
if len(self.thePw2) < 20:
fout.write("y\n")
fout.flush()
fout.write(self.thePw2+"\n")
fout.flush()
fout.write(self.theKeyfile2+"\n")
fout.flush()
if len(self.theKeyfile2) > 0:
fout.write("\n")
fout.flush()
self.returnVal = ferr.readline()
ferr.close;
fin.close()
fout.close()
self.doneRunning = True
class ThreadedCommandRunner(Thread):
def __init__ (self, command):
Thread.__init__(self)
self.theCommand = command
self.doneRunning = False
def run(self):
debug_begin("ThreadedCommandRunner job: " + self.theCommand)
commandOutput = commands.getoutput(self.theCommand)
self.doneRunning = True
debug_end("ThreadedCommandRunner job: " + self.theCommand)
class SizeOfCrypt(Thread):
def __init__ (self, EasyCryptInstance):
Thread.__init__(self)
self.returnString = 0
self.done = False;
self.EasyCryptInstance = EasyCryptInstance
def run(self):
cryptLocation = self.EasyCryptInstance.selectedCrypt
debug_begin("SizeOfCrypt Started " + cryptLocation)
while (not self.done):
try :
statResult = os.stat(cryptLocation)
self.returnString = statResult[6]
#raise OSError if file does not exist
except OSError:
pass
time.sleep(0.1)
debug_end("SizeOfCrypt Started " + cryptLocation)
def encodeFilePath(passedString):
encodedString = passedString.replace(' ', '\\ ')
return encodedString
def decodeFilePath(passedString):
decodedString = passedString.replace('\\ ', ' ')
return decodedString
def intToStr(passedInt):
theInt = {'int' : passedInt}
theIntStr = "%(int).0f" %theInt
return theIntStr
class EasyCrypt:
root=os.getcwd()
LANGSXML_PATH = os.path.join(root, "data/langs.xml")
ICON_PATH_WINDOW = os.path.join(root, "icons/easycrypt.png")
ICON_PATH_TRAY = os.path.join(root, "icons/easycrypt_tray.png")
IMAGE_ABOUT_SPLASH = os.path.join(root, "icons/about_splash.png")
IMAGE_WELCOME_SPLASH = os.path.join(root, "icons/easycrypt.png")
US_FULLPATH=__file__
CRYPT_MOUNT_POINT = "/media/"
CRYPT_MOUNT_POINT_STD = "crypt"
transLoc = os.path.join(root, "locale")
try:
t = gettext.translation("easycrypt", transLoc)
except :
print "failed to load localised text, defaulting to English (en)"
t = gettext.translation("easycrypt", transLoc, languages=['en'])
_ = t.ugettext
t.install()
def __init__(self):
debug_begin('function __init__ EasyCrypt')
self.version = "0.2.3.2"
debug("Easy Crypt "+self.version+" ("+time.strftime("%Y/%m/%d %H:%M:%S", time.localtime())+")")
debug("root is " + self.root)
self.isExpert = False
self.afterSelectCryptDoAction = ""
self.selectedKeyFile = ""
self.needsOpenAsUser = True
# count used for mountpoints in expert mode, such as cryptname-1, cryptname-2 ..
self.some_count = 0
self.home = os.path.expanduser( "~/" )
debug("home is " + self.home)
self.default_crypt = os.path.join(self.home,".easycrypt-crypt")
self.default_mount = os.path.join(self.CRYPT_MOUNT_POINT, self.CRYPT_MOUNT_POINT_STD)
configPath = os.path.join(self.home,".config/easycrypt.conf")
self.hasTrueCryptV4_3a = False
self.hasTrueCryptV5_0 = False
self.hasTrueCryptV5_1 = False
self.hasTrueCryptV5_X = False
self.hasTrueCryptV6_1 = False
self.hasTrueCryptV6_X = False
self.truecrypt_high_version = ""
needToSeeWelcome = False
if not os.path.exists(decodeFilePath(configPath)):
debug("first run show them the welcome")
needToSeeWelcome = True
# Load or default the config
self.easyCryptConfig = EasyCryptConfig.EasyCryptConfig(configPath)
self.crypt_path = self.easyCryptConfig.getOption("crypt")
self.crypt_rand = self.easyCryptConfig.getOption("crypt-gen-random")
self.setting_mode = self.easyCryptConfig.getOption("mode")
if self.setting_mode == _("expert"):
self.isExpert = True
# self.currentCrypts is now a dictionnary :
# keys are filenames, values are mountpoints
self.currentCrypts = {}
# selectedCrypt contains the name of the currently selected crypt
# it is a key in currentCrypts
self.selectedCrypt = ""
if not self.isExpert :
#first time we launch EasyCrypt, we have no crypt, so don't assume we have one here
#next time, we may have deleted default crypt or default mount
if os.path.isfile(self.default_crypt) and os.path.exists(decodeFilePath(self.default_mount)) :
self.currentCrypts[self.default_crypt] = self.default_mount
self.selectedCrypt = self.default_crypt
self.sudo_command = "gksudo"
sudo = commands.getoutput("which gksudo")
if len(sudo) > 0:
self.sudo_command = "gksudo"
else :
sudo = commands.getoutput("which kdesud")
if len(sudo) > 0:
self.sudo_command = "kdesud"
debug("sudo command will be " + self.sudo_command)
# Create the status icon object
self.status_icon = gtk.StatusIcon()
self.updateTrayIcon()
self.status_icon.connect('popup-menu', self.trayIconClicked)
self.status_icon.connect('activate', self.trayIconLeftClicked)
self.popup_menu = EasyCryptPopupMenu.EasyCryptPopupMenu(self)
self.status_icon.set_visible(True)
if (needToSeeWelcome):
self.showWelcomeWindow()
debug_end('function __init__ EasyCrypt')
def updateTrayIcon(self):
debug_begin('function updateTrayIcon')
trayText = _("Easy Crypt")
if self.isExpert :
#if we have keys
if len(self.currentCrypts) > 0 :
#iterate over dictionnary
for k in self.currentCrypts.items():
#k is in the form (crypt_name, crypt_mountpoint)
trayText = trayText + "\n" + k[0] + " : " + k[1]
# otherelse, no crypt opened
else :
trayText = trayText + "\n" + _("No Crypts Open")
else :
if self.checkOpened() :
trayText = trayText + "\n" + _("Crypt opened")
else :
trayText = trayText + "\n" + _("Crypt not opened")
self.status_icon.set_tooltip(trayText)
self.status_icon.set_from_file( self.ICON_PATH_TRAY)
debug_end('function updateTrayIcon')
def chooseNewCryptLocation(self):
debug_begin('function chooseNewCryptLocation')
dialog = gtk.FileChooserDialog(_("New Crypt Location"),None,gtk.FILE_CHOOSER_ACTION_SAVE,(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN, gtk.RESPONSE_OK))
dialog.set_default_response(gtk.RESPONSE_OK)
dialog.set_show_hidden(True)
dialog.set_do_overwrite_confirmation(True)
dialog.set_current_folder(self.home)
response = dialog.run()
if response == gtk.RESPONSE_OK:
debug(dialog.get_filename() + ' selected')
self.workingFolder = dialog.get_current_folder()
cryptName = encodeFilePath(dialog.get_filename())
self.selectedCrypt = cryptName
cryptMount = self.calculateMountPoint()
self.currentCrypts[cryptName] = cryptMount
elif response == gtk.RESPONSE_CANCEL:
debug('Closed, no files selected')
self.selectedCrypt = ""
dialog.destroy()
debug_end('function chooseNewCryptLocation')
def selectCurrentCryptLocation(self):
debug_begin('function selectCurrentCryptLocation')
dialog = gtk.FileChooserDialog(_("Open Existing Crypt"),None,gtk.FILE_CHOOSER_ACTION_OPEN,(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN, gtk.RESPONSE_OK))
dialog.set_default_response(gtk.RESPONSE_OK)
dialog.set_show_hidden(True)
dialog.set_current_folder(self.home)
#dialog.set_do_overwrite_confirmation(True)
response = dialog.run()
if response == gtk.RESPONSE_OK:
debug(dialog.get_filename() + ' selected')
cryptName = encodeFilePath(dialog.get_filename())
self.selectedCrypt = cryptName
cryptMount = self.calculateMountPoint()
self.currentCrypts[cryptName] = cryptMount
elif response == gtk.RESPONSE_CANCEL:
debug('Closed, no files selected')
self.selectedCrypt = ""
dialog.destroy()
debug_end('function selectCurrentCryptLocation')
def clearKeyFile(self, event, type):
debug_begin('function clearKeyFile')
if type == "new":
self.selectedKeyFileNew = ""
self.textbox_select_keyfile_new.set_text(self.selectedKeyFileNew)
else:
self.selectedKeyFile = ""
self.textbox_select_keyfile.set_text(self.selectedKeyFile)
debug_end('function clearKeyFile')
def selectKeyFile(self, event, type):
debug_begin('function selectKeyFile')
dialog = gtk.FileChooserDialog(_("Select Keyfile"),None,gtk.FILE_CHOOSER_ACTION_OPEN,(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN, gtk.RESPONSE_OK))
dialog.set_default_response(gtk.RESPONSE_OK)
dialog.set_show_hidden(False)
dialog.set_current_folder(self.home)
#dialog.set_do_overwrite_confirmation(True)
response = dialog.run()
if response == gtk.RESPONSE_OK:
debug(dialog.get_filename() + ' selected')
if type == "new":
self.selectedKeyFileNew = dialog.get_filename()
self.textbox_select_keyfile_new.set_text(self.selectedKeyFileNew)
else:
self.selectedKeyFile = dialog.get_filename()
self.textbox_select_keyfile.set_text(self.selectedKeyFile)
elif response == gtk.RESPONSE_CANCEL:
debug('Closed, no file selected')
if type == "new":
self.selectedKeyFileNew = ""
else :
self.selectedKeyFile = ""
dialog.destroy()
debug_end('function selectKeyFile')
def fileTypeAtLocation(self,workingFolder):
debug_begin('function fileTypeAtLocation')
mounts = commands.getoutput("cat /proc/mounts")
lines = mounts.splitlines(False)
highest = -1
detectedType = "none"
workingFolder = workingFolder+"/"
for v in lines:
elements = v.split()
if len(elements) > 2:
location = elements[1] + "/"
type = elements[2]
match = workingFolder.find(location)
if match != -1:
match = match+len(location)
#print workingFolder,location,match
if match > highest and type != "rootfs":
highest = match
detectedType = type
debug_end('function fileTypeAtLocation')
return detectedType
def howMuchSpaceInKb(self):
debug_begin('function howMuchSpaceInKb')
detectedType = self.fileTypeAtLocation(self.workingFolder)
capMax = False
if detectedType == "vfat":
debug("max size is 2000")
capMax = True
debug("df -Pk "+self.workingFolder+" | tail -1 | awk {'print $4'}")
checkAmountLeft = commands.getoutput("df -Pk "+self.workingFolder+" | tail -1 | awk {'print $4'}")
debug("size left " + checkAmountLeft)
if capMax:
cap = 2000 * 1024
if int(checkAmountLeft) > cap:
debug("capped")
return cap
else :
debug("dont need to cap")
debug_end('function howMuchSpaceInKb')
return int(checkAmountLeft)
def checkWeAreAlone(self):
debug_begin('function checkWeAreAlone')
debug("checking : ps -ef | grep \"pyt[h]on "+self.US_FULLPATH+"\"")
checkAnother = commands.getoutput("ps -ef | grep \"pyt[h]on "+self.US_FULLPATH+"\"")
lines = checkAnother.splitlines(False)
if len(lines) > 1:
print "We are not alone, another trycrypt appears to be running!\n" + checkAnother
debug_end('function checkWeAreAlone')
return True
debug_end('function checkWeAreAlone')
return False
def getTextForCommandChange(self, crypt_rand, cryptLocation):
debug_begin('function getTextForCommandChange')
if self.hasTrueCryptV4_3a:
debug_end('function getTextForCommandChange')
return "truecrypt --o --random-source "+crypt_rand+" -C " +cryptLocation
else:
if self.hasTrueCryptV5_1 or self.hasTrueCryptV5_X or self.hasTrueCryptV6_1 or self.hasTrueCryptV6_X:
debug_end('function getTextForCommandChange')
return "truecrypt -t --random-source="+crypt_rand+" -C " +cryptLocation
debug_end('function getTextForCommandChange')
return ""
def getTextForCommandCreate(self, encType,hashType,fsType,sizeInMB,targetSizeInBytes,crypt_rand,cryptLocation) :
debug_begin('function getTextForCommandCreate')
if self.hasTrueCryptV4_3a:
debug_end('function getTextForCommandCreate')
return "truecrypt --disable-progress --encryption "+encType+" --hash "+hashType+" --filesystem "+fsType+" --size "+sizeInMB+" --type normal --random-source "+crypt_rand+" --o -c "+cryptLocation
else:
if self.hasTrueCryptV5_1 or self.hasTrueCryptV5_X or self.hasTrueCryptV6_1 or self.hasTrueCryptV6_X:
debug_end('function getTextForCommandCreate')
return "truecrypt -t --encryption="+encType+" --hash="+hashType+" --filesystem="+fsType+" --size="+targetSizeInBytes+" --random-source="+crypt_rand+" -c "+cryptLocation
else:
debug_end('function getTextForCommandCreate')
return "truecrypt -t --encryption="+encType+" --hash="+hashType+" --filesystem="+fsType+" --size="+targetSizeInBytes+" --random-source="+crypt_rand+" -c "+cryptLocation
debug_end('function getTextForCommandCreate')
return ""
def getTextForCommandClose(self):
debug_begin('function getTextForCommandClose')
if self.hasTrueCryptV4_3a:
debug_end('function getTextForCommandClose')
return "truecrypt -d"
else:
if self.hasTrueCryptV5_1 or self.hasTrueCryptV5_X or self.hasTrueCryptV6_1 or self.hasTrueCryptV6_X:
debug_end('function getTextForCommandClose')
return "truecrypt -t -d"
else:
debug_end('function getTextForCommandClose')
return "truecrypt -t -d"
debug_end('function getTextForCommandClose')
return ""
def getTextForCommandListOpened(self):
debug_begin('function getTextForCommandListOpened')
if self.hasTrueCryptV4_3a:
debug_end('function getTextForCommandListOpened')
return self.sudo_command+" \"truecrypt -l\""
else:
if self.hasTrueCryptV5_1 or self.hasTrueCryptV5_X or self.hasTrueCryptV6_1 or self.hasTrueCryptV6_X:
debug_end('function getTextForCommandListOpened')
return "truecrypt -t -l"
else:
debug_end('function getTextForCommandListOpened')
return "truecrypt -t -l"
debug_end('function getTextForCommandListOpened')
return ""
def getTextForCommandOpen(self, asUser, fstype):
debug_begin('function getTextForCommandOpen')
if self.hasTrueCryptV4_3a:
if asUser:
debug_end('function getTextForCommandOpen')
return "truecrypt -u -i"
else :
debug_end('function getTextForCommandOpen')
return "truecrypt -i"
else:
if self.hasTrueCryptV5_1 or self.hasTrueCryptV5_X or self.hasTrueCryptV6_1 or self.hasTrueCryptV6_X:
if asUser:
debug_end('function getTextForCommandOpen')
return "truecrypt -t --mount"
else:
debug_end('function getTextForCommandOpen')
return "truecrypt -t --mount --filesystem="+fstype
else:
if asUser:
debug_end('function getTextForCommandOpen')
return "truecrypt -t --mount"
else:
debug_end('function getTextForCommandOpen')
return "truecrypt -t --mount --filesystem="+fstype
debug_end('function getTextForCommandOpen')
return ""
def determinTruecryptVersion(self):
debug_begin('function determinTruecryptVersion')
self.hasTrueCryptV4_3a = False
self.hasTrueCryptV5_0 = False
self.hasTrueCryptV5_1 = False
self.hasTrueCryptV5_X = False
self.hasTrueCryptV6_1 = False
self.truecrypt_high_version = ""
outputString = commands.getoutput(CMD_TEST_TRUECRYPT_VERSION_6x)
if outputString == "TrueCrypt 6.1" :
debug("found 6.1")
debug("detected 6.1")
self.hasTrueCryptV6_1 = True
else :
if outputString == "TrueCrypt 6.0a" :
debug("found 6.0a")
debug("detected 6.0a")
self.hasTrueCryptV6_1 = True
else :
if outputString.find("TrueCrypt 6.1") > -1:
debug("found 6.X")
self.hasTrueCryptV6_X = True
else :
if outputString == "TrueCrypt 5.1" :
debug("found 5.1")
debug("detected 5.1")
self.hasTrueCryptV5_1 = True
else :
if outputString == "TrueCrypt 5.0" :
debug("detected 5.0")
self.hasTrueCryptV5_0 = True
else :
if outputString.find("TrueCrypt 5.") > -1 :
debug("detected 5.x")
self.hasTrueCryptV5_X = True
self.truecrypt_high_version = outputString.replace("TrueCrypt ","",1)
else:
outputString = commands.getoutput(CMD_TEST_TRUECRYPT_VERSION_43a)
lines = outputString.splitlines(False)
if len(lines) > 0 :
debug("got enough lines")
if lines[0] == "truecrypt 4.3a" :
debug("detected 4.3")
self.hasTrueCryptV4_3a = True
debug_end('function determinTruecryptVersion')
def lookForTruecrypt(self):
debug_begin('function lookForTruecrypt')
debug("looking for truecrypt")
outputString = commands.getoutput(CMD_TEST_TRUECRYPT)
if len(outputString) == 0:
debug("no truecrypt")
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, _("You don't seem to have Truecrypt installed\n\nCan I please open a Browser for you to get it?") + '\n' + URL_TRUECRYPT_DOWNLOAD)
dialog.set_title(_("TrueCrypt not Installed"))
dialog.width, dialog.height = dialog.get_size()
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
ret = dialog.run()
if ret==gtk.RESPONSE_YES:
debug("they clicked yes")
self.gotourl(URL_TRUECRYPT_DOWNLOAD)
else:
debug("they clicked no")
dialog.destroy()
debug_end('function lookForTruecrypt')
return False
else :
debug("found truecrypt")
self.determinTruecryptVersion()
if self.hasTrueCryptV5_0:
debug("bad truecrypt")
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, _("The version of TrueCrypt you have is not Compatible\n\nCan I please open a Browser for you so you can update TrueCrypt?\n\nMay I suggest you get either 4.3a or 5.1\n") + '\n' + URL_TRUECRYPT_DOWNLOAD)
dialog.set_title(_("TrueCrypt version not Compatible"))
dialog.width, dialog.height = dialog.get_size()
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
ret = dialog.run()
if ret==gtk.RESPONSE_YES:
debug("they clicked yes")
self.gotourl(URL_TRUECRYPT_DOWNLOAD)
else:
debug("they clicked no")
dialog.destroy()
debug_end('function lookForTruecrypt')
return False
debug_end('function lookForTruecrypt')
return True
def checkOpened(self):
debug_begin('function checkOpened')
detectMounted = commands.getoutput(self.getTextForCommandListOpened())
cryptLocation = decodeFilePath(self.selectedCrypt)
lines = detectMounted.splitlines(False)
if self.hasTrueCryptV4_3a:
for v in lines:
debug("current mount " + v)
location = v.find(decodeFilePath(cryptLocation))
if location > -1:
debug("found at " + str(location))
if location + len(decodeFilePath(cryptLocation)) == len(v):
debug("hurrah")
debug_end('function checkOpened')
return True
else:
debug("red herring")
else:
if self.hasTrueCryptV5_1 or self.hasTrueCryptV5_X or self.hasTrueCryptV6_1 or self.hasTrueCryptV6_X:
for v in lines:
debug("current mount " + v)
location = v.find(decodeFilePath(cryptLocation)+" ")
if location > -1:
debug("hurrah")
debug_end('function checkOpened')
return True
else:
for v in lines:
debug("current mount " + v)
location = v.find(decodeFilePath(cryptLocation)+" ")
if location > -1:
debug("hurrah")
debug_end('function checkOpened')
return True
debug_end('function checkOpened')
return False
def makeRandom(self):
debug_begin('function makeRandom')
debug(commands.getoutput("touch "+self.crypt_rand))
file = open(self.crypt_rand,"w")
for i in range(0, 700, 1) :
file.write(random.choice('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890'))
file.close()
debug_end('function makeRandom')
def removeRandom(self):
debug_begin('function removeRandom')
try :
os.unlink(self.crypt_rand)
# "no such file or directory" raises OSError
except OSError,e :
print e.strerror + " : " + e.filename
debug_end('function removeRandom')
def calculateMountPoint(self):
debug_begin('function calculateMountPoint')
cryptLocation = self.selectedCrypt
cryptName = self.CRYPT_MOUNT_POINT_STD
if self.easyCryptConfig.getOption("use_filename_as_mountname") == "yes":
bits = os.path.split(cryptLocation)
cryptName = bits[1]
else:
if self.isExpert:
cryptName = cryptName + "-" + str(self.some_count)
self.some_count = self.some_count + 1
debug('cryptName : '+cryptName)
debug('Mount point : '+os.path.join(self.CRYPT_MOUNT_POINT, cryptName))
debug_end('function calculateMountPoint')
return os.path.join(self.CRYPT_MOUNT_POINT, cryptName)
def openCrypt(self, withMountPoint, asUser):
debug_begin('function openCrypt')
debug("Opening crypt with mount point : " + str(withMountPoint))
cryptLocation = self.selectedCrypt
mountPoint = self.currentCrypts[self.selectedCrypt]
debug("Mount point for crypt : " + mountPoint)
fstype = ""
if withMountPoint == True :
debug("Opening "+cryptLocation+" at "+mountPoint)
debug("checking mountpoint "+decodeFilePath(mountPoint))
if not os.path.exists(decodeFilePath(mountPoint)):
debug("need to make mountpoint "+mountPoint)
debug(commands.getoutput(self.sudo_command+" \"mkdir -p "+encodeFilePath(mountPoint)+"\""))
else :
debug("defaulting mount point as blank")
fstype = "none"
mountPoint = ""
asUserBit = ""
if asUser:
asUserBit = " -u"
else:
if len(fstype) == 0:
fstype = "ext3"
password = self.textbox_password_value
if self.isExpert and self.easyCryptConfig.getOption("show_keyfile_options") == "yes":
if len(self.selectedKeyFile) > 0:
if len(self.textbox_password_value) == 0:
password = ""
commandOpenAsUser = self.getTextForCommandOpen(asUser, fstype)
debug(BASIC_SUDO_COMMAND+" "+commandOpenAsUser)
if self.hasTrueCryptV4_3a:
opener = TrueCryptCommandRunner4_3a(BASIC_SUDO_COMMAND+" "+commandOpenAsUser,decodeFilePath(cryptLocation),decodeFilePath(mountPoint), password, "",self.selectedKeyFile , "", "open")
else :
if self.hasTrueCryptV5_1 or self.hasTrueCryptV5_X or self.hasTrueCryptV6_1 or self.hasTrueCryptV6_X:
opener = TrueCryptCommandRunner5_1(BASIC_SUDO_COMMAND+" "+commandOpenAsUser,decodeFilePath(cryptLocation),decodeFilePath(mountPoint), password, "",self.selectedKeyFile , "", "open")
else :
opener = TrueCryptCommandRunner5_1(BASIC_SUDO_COMMAND+" "+commandOpenAsUser,decodeFilePath(cryptLocation),decodeFilePath(mountPoint), password, "",self.selectedKeyFile , "", "open")
opener.start()
while not opener.doneRunning :
time.sleep(0.2)
while gtk.events_pending():
gtk.main_iteration()
if not self.checkOpened() :
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("Incorrect Password, please try again"))
dialog.set_title(_("Wrong Password"))
dialog.width, dialog.height = dialog.get_size()
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
ret = dialog.run()
dialog.destroy()
debug_end('function openCrypt')
return False
self.updateTrayIcon()
debug_end('function openCrypt')
return True
def closeCrypt(self, removeFromList):
debug_begin('function closeCrypt')
if self.selectedCrypt != "":
mountPoint = self.currentCrypts[self.selectedCrypt]
if not removeFromList:
cryptLocation = self.selectedCrypt
debug("getting mapper name for : " + cryptLocation)
commandToRun = self.getTextForCommandListOpened()
debug( commandToRun + " | grep "+cryptLocation)
mount = commands.getoutput(commandToRun + " | grep "+cryptLocation)
debug("got mount line " + mount)
lines = mount.split()
if len(lines) > 0:
if self.hasTrueCryptV4_3a:
debug("possible line " + lines[0])
mountPoint = lines[0]
else :
if self.hasTrueCryptV5_1 or self.hasTrueCryptV5_X or self.hasTrueCryptV6_1 or self.hasTrueCryptV6_X:
debug("possible line " + lines[1])
mountPoint = lines[1]
debug( "Closing Crypt " + mountPoint)
debug("output of closing crypt : "+ commands.getoutput(self.sudo_command+" \""+self.getTextForCommandClose()+" "+mountPoint+"\""))
#remove the crypt from the list
if self.isExpert and removeFromList:
del(self.currentCrypts[self.selectedCrypt])
self.selectedCrypt = ""
self.updateTrayIcon()
else :
debug("Crypt not selected")
debug_end('function closeCrypt')
def closeAllCrypts(self):
debug_begin('function closeAllCrypts')
debug("Closing All Crypts")
if self.isExpert :
#if we have opened crypts, we will iterate
for k in self.currentCrypts.items():
#k is in the form (crypt_name, crypt_mountpoint)
mountPoint = k[1]
debug("closing "+mountPoint)
# we only close the crypts WE opened
# if somebody else opened crypts via a console, don't close them
# as we are not aware of them here
debug(commands.getoutput(self.sudo_command+" \""+self.getTextForCommandClose()+" "+mountPoint+"\""))
# now, let's empty our crypt dictionnary
self.currentCrypts.clear()
self.selectedCrypt = ""
else :
if self.checkOpened():
mountPoint = self.currentCrypts[self.selectedCrypt]
debug("closing " + mountPoint)
debug(commands.getoutput(self.sudo_command+" \""+self.getTextForCommandClose()+" "+mountPoint+"\""))
debug("closed all")
self.updateTrayIcon()
debug_end('function closeAllCrypts')
def deleteCrypt(self):
debug_begin('function deleteCrypt')
cryptLocation = self.selectedCrypt
debug("deleting crypt " + cryptLocation)
debug(commands.getoutput("rm "+cryptLocation))
debug_end('function deleteCrypt')
def makeCrypt(self, cryptSize):
debug_begin('function makeCrypt')
self.lastCreateNeedsChowning = False
cryptLocation = self.selectedCrypt
if self.checkOpened() :
debug("crypt mounted - unmounting")
self.closeCrypt(True)
debug("ok lets bosh the old one")
self.deleteCrypt()
values = {'size' : cryptSize}
valuesBytes = {'size' : cryptSize * 1024 *1024}
targetSizeInBytes = cryptSize * 1024 *1024
size = "%(size).0fM" %values
sizeInBytes = "%(size).0f" %valuesBytes
self.makeRandom()
current = SizeOfCrypt(self)
current.start()
debug(commands.getoutput(self.sudo_command+" echo \"need this to make crypt silently\""))
fsType_choice=""
encType = "AES"
hashType = "WHIRLPOOL"
fsType = "FAT"
if self.isExpert :
iter = self.cbo_encType.get_active_iter()
encType = self.cbo_encType.get_model().get_value(iter, 0)
iter = self.cbo_hashType.get_active_iter()
hashType = self.cbo_hashType.get_model().get_value(iter, 0)
iter = self.cbo_fsType.get_active_iter()
fsType_choice = self.cbo_fsType.get_model().get_value(iter, 0)
debug("chosen fs : "+fsType_choice)
if fsType_choice != "FAT":
fsType = "NONE"
password = self.textbox_password_value
self.needsOpenAsUser = True
keyfilePath = ""
if self.isExpert and self.easyCryptConfig.getOption("show_keyfile_options") == "yes":
if len(self.selectedKeyFile) > 0:
if len(self.textbox_password_value) == 0:
password = ""
keyfilePath = self.selectedKeyFile
commandToRun = self.getTextForCommandCreate(encType,hashType,fsType,str(size),str(sizeInBytes),self.crypt_rand,cryptLocation)
debug(commandToRun)
if self.hasTrueCryptV4_3a:
maker = TrueCryptCommandRunner4_3a(commandToRun,cryptLocation,"", password, "", keyfilePath, "", "create")
else :
if self.hasTrueCryptV5_1 or self.hasTrueCryptV5_X or self.hasTrueCryptV6_1 or self.hasTrueCryptV6_X:
maker = TrueCryptCommandRunner5_1(commandToRun,cryptLocation,"", password, "", keyfilePath, "", "create")
else :
maker = TrueCryptCommandRunner5_1(commandToRun,cryptLocation,"", password, "", keyfilePath, "", "create")
maker.start()
while not maker.doneRunning :
time.sleep(0.2)
percentDone = (float(current.returnString) / targetSizeInBytes) *100
debug("done : " + str(percentDone))
self.progressbar.set_value(percentDone)
currentValues = {'size' : (float(current.returnString))/1024/1024}
self.progressbar.set_text("%(size).0fMB" %currentValues)
while gtk.events_pending():
gtk.main_iteration()
current.done = True
self.removeRandom()
if maker.returnVal.find("ASCII") > -1 :
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("To maintain portability,\n\nPassword must be composed only of US-ASCII printable characters\n\nPlease choose another password"))
dialog.set_title(_("Password Problem"))
dialog.width, dialog.height = dialog.get_size()
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
ret = dialog.run()
dialog.destroy()
self.textbox_password.set_text("")
self.textbox_password_retype.set_text("")
self.textbox_password.grab_focus()
debug_end('function makeCrypt')
return False
if self.isExpert:
if fsType_choice != "FAT":
self.changeFormat(fsType_choice)
if fsType_choice != "NTFS" :
self.lastCreateNeedsChowning = True
debug_end('function makeCrypt')
return True
def changeOwnership(self):
debug_begin('function changeOwnership')
currentUser = commands.getoutput("whoami")
mount = encodeFilePath(self.currentCrypts[self.selectedCrypt])
theCommand = self.sudo_command+" \"chown "+currentUser+" "+mount+"\""
debug(theCommand)
maker = ThreadedCommandRunner(theCommand)
maker.start()
while not maker.doneRunning :
while gtk.events_pending():
gtk.main_iteration()
debug("done")
debug_end('function changeOwnership')
def changeFormat(self, format):
debug_begin('function changeFormat')
self.openCrypt(False, False)
cryptLocation = self.selectedCrypt
debug("getting mapper name for : "+cryptLocation)
commandToRun = self.getTextForCommandListOpened()
debug(commandToRun+" | grep "+cryptLocation)
mount = commands.getoutput(commandToRun+" | grep "+cryptLocation)
debug("got mount line " + mount)
lines = mount.split()
if len(lines) > 0:
if self.hasTrueCryptV4_3a:
debug("possible line " + lines[0])
mountPoint = lines[0]
else :
if self.hasTrueCryptV5_1 or self.hasTrueCryptV5_X or self.hasTrueCryptV6_1 or self.hasTrueCryptV6_X:
debug("possible line " + lines[2])
mountPoint = lines[2]
formatString = "mkfs -t ext3"
if format == "EXT3":
formatSting = "mkfs -t ext3"
if format == "EXT2":
formatSting = "mkfs -t ext2"
if format == "NTFS":
formatSting = "mkfs -t ntfs"
maker = ThreadedCommandRunner(self.sudo_command+" \""+formatSting+" "+mountPoint+"\"")
maker.start()
while not maker.doneRunning :
while gtk.events_pending():
gtk.main_iteration()
self.needsOpenAsUser = False
debug("opened without mount")
self.closeCrypt(False)
debug_end('function changeFormat')
def changePassword(self, event):
debug_begin('function changePassword')
cryptLocation = self.selectedCrypt
debug("changing password for "+cryptLocation)
if (len(self.textbox_change_password_current.get_text()) > 0 and len(self.textbox_change_password.get_text()) > 0) or (self.isExpert and self.easyCryptConfig.getOption("show_keyfile_options") == "yes" and (len(self.selectedKeyFile) > 0 or len(self.selectedKeyFileNew) > 0)) :
if self.textbox_change_password.get_text() == self.textbox_change_password_retype.get_text() :
debug("we can do it")
debug(commands.getoutput(self.sudo_command+" echo \"need this to change crypt silently\""))
self.makeRandom()
password = self.textbox_change_password_current.get_text()
newPassword = self.textbox_change_password.get_text()
keyfilePath = ""
keyfilePathNew = ""
if self.isExpert and self.easyCryptConfig.getOption("show_keyfile_options") == "yes":
if len(self.selectedKeyFile) > 0:
if len(self.textbox_change_password_current.get_text()) == 0:
password = ""
keyfilePath = self.selectedKeyFile
if len(self.selectedKeyFileNew) > 0:
if len(self.textbox_change_password.get_text()) == 0:
newPassword = ""
keyfilePathNew = self.selectedKeyFileNew
commandToRun = self.getTextForCommandChange(self.crypt_rand,cryptLocation)
debug(commandToRun)
if self.hasTrueCryptV4_3a:
changer = TrueCryptCommandRunner4_3a(commandToRun, cryptLocation, "", password,newPassword,keyfilePath,keyfilePathNew, "change")
else :
if self.hasTrueCryptV5_1 or self.hasTrueCryptV5_X or self.hasTrueCryptV6_1 or self.hasTrueCryptV6_X:
changer = TrueCryptCommandRunner5_1(commandToRun, cryptLocation, "", password,newPassword,keyfilePath,keyfilePathNew, "change")
if self.hasTrueCryptV5_1 or self.hasTrueCryptV5_X or self.hasTrueCryptV6_1 or self.hasTrueCryptV6_X:
self.closeCrypt(False)
changer.start()
while not changer.doneRunning :
time.sleep(0.2)
while gtk.events_pending():
gtk.main_iteration()
debug(changer.returnVal)
#commandOutput = commands.getoutput("truecrypt -k "+keyfilePath+" --keyfile-add "+keyfilePathNew+" --o --random-source "+self.crypt_rand+" -C " +cryptLocation)
#print commandOutput
if len( changer.returnVal) > 0:
debug("err")
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("Incorrect Password, please try again"))
dialog.set_title(_("Wrong Password"))
dialog.width, dialog.height = dialog.get_size()
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
ret = dialog.run()
dialog.destroy()
self.textbox_change_password_current.set_text("")
self.textbox_change_password_current.grab_focus()
else :
if self.hasTrueCryptV5_1 or self.hasTrueCryptV5_X or self.hasTrueCryptV6_1 or self.hasTrueCryptV6_X:
self.textbox_password_value = newPassword
self.selectedKeyFile = keyfilePathNew
self.openCrypt(True,True)
self.password_change_window.hide()
self.removeRandom()
else :
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("The two Passwords you entered do not Match\n\nPlease re-enter them"))
dialog.set_title(_("Passwords Must Match"))
dialog.width, dialog.height = dialog.get_size()
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
ret = dialog.run()
dialog.destroy()
self.textbox_change_password.set_text("")
self.textbox_change_password_retype.set_text("")
self.textbox_change_password.grab_focus()
debug_end('function changePassword')
def afterPasswordDoAction(self, event):
debug_begin('function afterPasswordDoAction')
self.textbox_password_value = self.textbox_password.get_text()
if len(self.textbox_password_value) > 0 or (self.isExpert and self.easyCryptConfig.getOption("show_keyfile_options") == "yes" and len(self.selectedKeyFile) > 0):
debug("got password now doing action " + self.nextAction)
if self.nextAction == "open" :
mountAsUser = True
if self.isUnixFS.get_active() == gtk.TRUE:
mountAsUser = False
if self.isExpert and self.easyCryptConfig.getOption("modifiable_mount_path") == "yes":
self.currentCrypts[self.selectedCrypt] = self.textbox_mountPath.get_text()
if self.openCrypt(True, mountAsUser):
self.password_window.hide()
if self.nextAction == "create" :
if self.textbox_password.get_text() == self.textbox_password_retype.get_text() :
if self.makeCrypt(self.crypt_size.get_value()):
if self.openCrypt(True, self.needsOpenAsUser):
if self.lastCreateNeedsChowning:
debug("need to chown mount")
self.changeOwnership()
debug("hiding create window")
self.password_window.hide()
else :
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("The two Passwords you entered do not Match\n\nPlease re-enter them"))
dialog.set_title(_("Passwords Must Match"))
dialog.width, dialog.height = dialog.get_size()
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
ret = dialog.run()
dialog.destroy()
self.textbox_password.set_text("")
self.textbox_password_retype.set_text("")
self.textbox_password.grab_focus()
debug_end('function afterPasswordDoAction')
def selectCrypt(self):
debug_begin('function selectCrypt')
if not self.isExpert :
self.selectedCrypt = self.default_crypt
debug_end('function selectCrypt')
def toggleShowPasswordsCreate(self,button):
debug_begin('function toggleShowPasswordsCreate')
if self.showPasswords.get_active() == gtk.FALSE :
self.textbox_password.set_visibility( gtk.FALSE )
self.textbox_password_retype.set_visibility( gtk.FALSE )
else :
self.textbox_password.set_visibility( gtk.TRUE )
self.textbox_password_retype.set_visibility( gtk.TRUE )
debug_end('function toggleShowPasswordsCreate')
def getCryptPasswordThenAction(self, action):
debug_begin('function getCryptPasswordsThenAction')
self.nextAction = action
self.password_window = gtk.Window( gtk.WINDOW_TOPLEVEL )
if action == "open":
self.password_window.set_title(_("Opening Crypt"))
if action =="create" :
self.password_window.set_title(_("Make New Crypt"))
self.password_window.set_border_width( 5 )
self.password_window.set_position( gtk.WIN_POS_CENTER )
self.password_window.set_modal( gtk.FALSE )
self.password_window.set_resizable(gtk.FALSE)
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
# Register events
self.password_window.connect( "delete_event", self.onDelete_password_window )
#window.show()
self.password_window.resize(380,10)
table = gtk.Table( rows=3, columns=2, homogeneous=gtk.FALSE )
self.password_window.add(table)
tableVPos = 0
label_title = gtk.Label()
label_title.set_markup(''+_("Enter CRYPT Password")+'')
table.attach(label_title, 0, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
label_title.show()
tableVPos=tableVPos+1
self.textbox_password = gtk.Entry( max=0 )
self.textbox_password.set_text("")
self.textbox_password.set_visibility( gtk.FALSE )
self.textbox_password.set_invisible_char( '*' )
table.attach(self.textbox_password, 0, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
self.textbox_password.set_activates_default(True)
self.textbox_password.show()
tableVPos=tableVPos+1
if action == "create":
spaceleft = self.howMuchSpaceInKb()
spaceleft = spaceleft / 1024
self.lastSpaceLeft = spaceleft
label_retype = gtk.Label()
label_retype.set_markup(''+_("Retype Password")+'')
table.attach(label_retype, 0, 1, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
label_retype.show()
alignment = gtk.Alignment( 1.0, 0.0, 0.0, 0.0 )
self.showPasswords = gtk.CheckButton(_("Show Passwords"))
alignment.add( self.showPasswords )
table.attach( alignment, 1, 2, tableVPos, tableVPos+1 )
alignment.show()
self.showPasswords.set_active( gtk.FALSE )
self.showPasswords.show()
self.showPasswords.connect("toggled", self.toggleShowPasswordsCreate)
tableVPos=tableVPos+1
self.textbox_password_retype = gtk.Entry( max=0 )
self.textbox_password_retype.set_text("")
self.textbox_password_retype.set_visibility( gtk.FALSE )
self.textbox_password_retype.set_invisible_char( '*' )
table.attach(self.textbox_password_retype, 0, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
self.textbox_password_retype.set_activates_default(True)
self.textbox_password_retype.show()
tableVPos=tableVPos+1
if self.isExpert and self.easyCryptConfig.getOption("show_keyfile_options") == "yes":
label_optional_keyfile = gtk.Label()
label_optional_keyfile.set_markup(''+_("Optional Keyfile")+'')
table.attach(label_optional_keyfile, 0, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
label_optional_keyfile.show()
tableVPos=tableVPos+1
self.textbox_select_keyfile = gtk.Entry( max=0 )
self.textbox_select_keyfile.set_text("")
table.attach(self.textbox_select_keyfile, 0, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
self.textbox_select_keyfile.show()
tableVPos=tableVPos+1
button_clear_keyfile = gtk.Button( _("Clear Keyfile") )
table.attach( button_clear_keyfile, 0, 1, tableVPos, tableVPos+1, ypadding=1 )
button_clear_keyfile.connect( "clicked", self.clearKeyFile, "")
button_clear_keyfile.show()
self.selectedKeyFile = ""
button_select_keyfile = gtk.Button( _("Select Keyfile") )
table.attach( button_select_keyfile, 1, 2, tableVPos, tableVPos+1, ypadding=1 )
button_select_keyfile.connect( "clicked", self.selectKeyFile, "")
button_select_keyfile.show()
tableVPos=tableVPos+1
if action == "open":
if self.isExpert and self.easyCryptConfig.getOption("modifiable_mount_path") == "yes":
label_mountPath = gtk.Label()
label_mountPath.set_markup(''+_("Mount Path")+'')
table.attach(label_mountPath, 0, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
label_mountPath.show()
tableVPos=tableVPos+1
self.textbox_mountPath = gtk.Entry( max=0 )
self.textbox_mountPath.set_text(self.currentCrypts[self.selectedCrypt])
table.attach(self.textbox_mountPath, 0, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
self.textbox_mountPath.set_activates_default(True)
self.textbox_mountPath.show()
tableVPos=tableVPos+1
self.isUnixFS = gtk.CheckButton(_("Unix Filesystem (e.g. ext3)"))
table.attach( self.isUnixFS, 0, 2, tableVPos, tableVPos+1 )
self.isUnixFS.set_active( gtk.FALSE )
self.isUnixFS.show()
tableVPos=tableVPos+1
if action == "create":
# Add label: Select Crypt Size
label_select_size = gtk.Label()
label_select_size.set_markup(''+_("Select Crypt Size")+'')
table.attach( label_select_size, 0, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1 )
label_select_size.show()
tableVPos=tableVPos+1
# Add GTK.ENTRY for manually entering the crypt size
self.crypt_size_txt = gtk.Entry( max=0 )
table.attach( self.crypt_size_txt, 1, 2, tableVPos, tableVPos+1 )
self.crypt_size_txt.show()
self.crypt_size_txt.set_text("50")
self.crypt_size_txt.set_activates_default(True)
self.crypt_size_txt.connect("changed", self.formatSizeValueFromEntry)
# Add Combobox with presets
self.cbo_size_preset=gtk.combo_box_new_text()
self.cbo_size_preset.append_text(_("Manual Size"))
for i,textLabel in enumerate(SIZE_LABELS ):
self.cbo_size_preset.append_text(textLabel)
table.attach( self.cbo_size_preset, 0, 1, tableVPos, tableVPos+1, xpadding=2,ypadding=1 )
self.cbo_size_preset.connect("changed", self.formatSizeValueFromPresets)
self.cbo_size_preset.show()
self.cbo_size_preset.set_active(0)
tableVPos=tableVPos+1
# Add GTK.HSCALE for selecting the crypt size
self.crypt_size = gtk.HScale()
self.crypt_size.show()
table.attach(self.crypt_size, 0, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
self.crypt_size.set_digits(0)
self.crypt_size.set_update_policy(gtk.UPDATE_CONTINUOUS)
self.crypt_size.set_value_pos(gtk.POS_TOP)
self.crypt_size.set_range(1,spaceleft)
self.crypt_size.set_increments(1, 10)
self.crypt_size.set_value(50)
self.crypt_size.connect("change-value", self.formatSizeValue)
#self.volume.connect("change-value", self.changevolume)
tableVPos=tableVPos+1
if self.isExpert:
label_encType = gtk.Label()
label_encType.set_markup(_("Encryption Algorithm"))
table.attach(label_encType, 0, 1, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
label_encType.show()
self.cbo_encType=gtk.combo_box_new_text()
self.cbo_encType.append_text("AES")
self.cbo_encType.append_text("Serpent")
self.cbo_encType.append_text("Twofish")
self.cbo_encType.append_text("AES-Twofish")
self.cbo_encType.append_text("AES-Twofish-Serpent")
self.cbo_encType.append_text("Serpent-AES")
self.cbo_encType.append_text("Serpent-Twofish-AES")
self.cbo_encType.append_text("Twofish-Serpent")
self.cbo_encType.set_active(0)
table.attach(self.cbo_encType, 1, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
self.cbo_encType.show()
tableVPos=tableVPos+1
label_hashType = gtk.Label()
label_hashType.set_markup(_("Hash Algorithm"))
table.attach(label_hashType, 0, 1, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
label_hashType.show()
self.cbo_hashType=gtk.combo_box_new_text()
self.cbo_hashType.append_text("Whirlpool")
self.cbo_hashType.append_text("SHA-1")
self.cbo_hashType.append_text("RIPEMD-160")
self.cbo_hashType.set_active(0)
table.attach(self.cbo_hashType, 1, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
self.cbo_hashType.show()
tableVPos=tableVPos+1
label_fsType = gtk.Label()
label_fsType.set_markup(_("File System Format"))
table.attach(label_fsType, 0, 1, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
label_fsType.show()
self.cbo_fsType=gtk.combo_box_new_text()
self.cbo_fsType.append_text("FAT")
self.cbo_fsType.append_text("EXT3")
if self.hasTrueCryptV4_3a :
self.cbo_fsType.append_text("EXT2")
ntfs = commands.getoutput("which mkfs.ntfs")
if len(ntfs) > 0:
self.cbo_fsType.append_text("NTFS")
self.cbo_fsType.set_active(0)
table.attach(self.cbo_fsType, 1, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
self.cbo_fsType.show()
tableVPos=tableVPos+1
# Display progressbar
self.progressbar = gtk.ProgressBar()
self.progressbar.show()
self.progressbar.set_value(0)
self.progressbar.set_text("0MB")
table.attach(self.progressbar, 0, 2, tableVPos, tableVPos+1,xpadding=5,ypadding=5)
tableVPos=tableVPos+1
# Add 'Cancel' button
button_cancel = gtk.Button( stock=gtk.STOCK_CANCEL )
table.attach( button_cancel, 0, 1, tableVPos, tableVPos+1, ypadding=1 )
button_cancel.connect( "clicked", self.onDelete_password_window )
button_cancel.show()
# Add 'Open' button
if action == "open":
button_open = gtk.Button( stock=gtk.STOCK_OPEN )
if action =="create" :
button_open = gtk.Button( stock=gtk.STOCK_NEW )
table.attach( button_open, 1, 2, tableVPos, tableVPos+1, ypadding=1 )
button_open.connect( "clicked", self.afterPasswordDoAction )
button_open.show()
tableVPos=tableVPos+1
button_open.set_flags(gtk.CAN_DEFAULT)
button_open.grab_default()
self.password_window.set_default(button_open)
table.show()
self.password_window.show()
debug_end('function getCryptPasswordsThenAction')
def toggleShowPasswordsChange(self,button):
debug_begin('function toggleShowPasswordsChange')
if self.showPasswordsChange.get_active() == gtk.FALSE :
self.textbox_change_password_current.set_visibility( gtk.FALSE )
self.textbox_change_password.set_visibility( gtk.FALSE )
self.textbox_change_password_retype.set_visibility( gtk.FALSE )
else :
self.textbox_change_password_current.set_visibility( gtk.TRUE )
self.textbox_change_password.set_visibility( gtk.TRUE )
self.textbox_change_password_retype.set_visibility( gtk.TRUE )
debug_end('function toggleShowPasswordsChange')
def changePasswordWindow(self):
debug_begin('function changePasswordsWindow')
self.password_change_window = gtk.Window( gtk.WINDOW_TOPLEVEL )
self.password_change_window.set_title(_("Change Password"))
self.password_change_window.set_border_width( 5 )
self.password_change_window.set_position( gtk.WIN_POS_CENTER )
self.password_change_window.set_modal( gtk.FALSE )
self.password_change_window.set_resizable(gtk.FALSE)
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
# Register events
self.password_change_window.connect( "delete_event", self.onDelete_change_password_window )
#window.show()
self.password_change_window.resize(380,10)
table = gtk.Table( rows=3, columns=1, homogeneous=gtk.FALSE )
self.password_change_window.add(table)
label_title = gtk.Label()
label_title.set_markup(''+_("Change Crypt Password")+'')
table.attach(label_title, 0, 2, 0, 1,xpadding=2,ypadding=1)
label_title.show()
alignment = gtk.Alignment( 1.0, 0.0, 0.0, 0.0 )
self.showPasswordsChange = gtk.CheckButton(_("Show Passwords"))
alignment.add( self.showPasswordsChange )
table.attach( alignment, 0, 2, 1, 2 )
alignment.show()
self.showPasswordsChange.set_active( gtk.FALSE )
self.showPasswordsChange.show()
self.showPasswordsChange.connect("toggled", self.toggleShowPasswordsChange)
label_current = gtk.Label()
label_current.set_markup(_("Current Password"))
table.attach(label_current, 0, 1, 2, 3,xpadding=2,ypadding=1)
label_current.show()
self.textbox_change_password_current = gtk.Entry( max=0 )
self.textbox_change_password_current.set_text("")
self.textbox_change_password_current.set_visibility( gtk.FALSE )
self.textbox_change_password_current.set_invisible_char( '*' )
table.attach(self.textbox_change_password_current, 1, 2, 2, 3,xpadding=2,ypadding=1)
self.textbox_change_password_current.set_activates_default(True)
self.textbox_change_password_current.show()
label_new = gtk.Label()
label_new.set_markup(_("New Password"))
table.attach(label_new, 0, 1, 3, 4,xpadding=2,ypadding=1)
label_new.show()
self.textbox_change_password = gtk.Entry( max=0 )
self.textbox_change_password.set_text("")
self.textbox_change_password.set_visibility( gtk.FALSE )
self.textbox_change_password.set_invisible_char( '*' )
table.attach(self.textbox_change_password, 1, 2, 3, 4,xpadding=2,ypadding=1)
self.textbox_change_password.set_activates_default(True)
self.textbox_change_password.show()
label_retype = gtk.Label()
label_retype.set_markup(_("Retype New Password"))
table.attach(label_retype, 0, 1, 4, 5,xpadding=2,ypadding=1)
label_retype.show()
self.textbox_change_password_retype = gtk.Entry( max=0 )
self.textbox_change_password_retype.set_text("")
self.textbox_change_password_retype.set_visibility( gtk.FALSE )
self.textbox_change_password_retype.set_invisible_char( '*' )
table.attach(self.textbox_change_password_retype, 1, 2, 4, 5,xpadding=2,ypadding=1)
self.textbox_change_password_retype.set_activates_default(True)
self.textbox_change_password_retype.show()
tableVPos = 5
if self.isExpert and self.easyCryptConfig.getOption("show_keyfile_options") == "yes":
label_optional_keyfile = gtk.Label()
label_optional_keyfile.set_markup(''+_("Optional Keyfiles")+'')
table.attach(label_optional_keyfile, 0, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
label_optional_keyfile.show()
tableVPos=tableVPos+1
self.textbox_select_keyfile = gtk.Entry( max=0 )
self.textbox_select_keyfile.set_text("")
table.attach(self.textbox_select_keyfile, 0, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
self.textbox_select_keyfile.show()
tableVPos=tableVPos+1
button_clear_keyfile = gtk.Button( _("Clear Current Keyfile") )
table.attach( button_clear_keyfile, 0, 1, tableVPos, tableVPos+1, ypadding=1 )
button_clear_keyfile.connect( "clicked", self.clearKeyFile, "")
button_clear_keyfile.show()
self.selectedKeyFile = ""
button_select_keyfile = gtk.Button( _("Select Current Keyfile") )
table.attach( button_select_keyfile, 1, 2, tableVPos, tableVPos+1, ypadding=1 )
button_select_keyfile.connect( "clicked", self.selectKeyFile, "")
button_select_keyfile.show()
tableVPos=tableVPos+1
self.textbox_select_keyfile_new = gtk.Entry( max=0 )
self.textbox_select_keyfile_new.set_text("")
table.attach(self.textbox_select_keyfile_new, 0, 2, tableVPos, tableVPos+1,xpadding=2,ypadding=1)
self.textbox_select_keyfile_new.show()
tableVPos=tableVPos+1
button_clear_keyfile_new = gtk.Button( _("Clear New Keyfile") )
table.attach( button_clear_keyfile_new, 0, 1, tableVPos, tableVPos+1, ypadding=1 )
button_clear_keyfile_new.connect( "clicked", self.clearKeyFile, "new")
button_clear_keyfile_new.show()
self.selectedKeyFileNew = ""
button_select_keyfile_new = gtk.Button( _("Select New Keyfile") )
table.attach( button_select_keyfile_new, 1, 2, tableVPos, tableVPos+1, ypadding=1 )
button_select_keyfile_new.connect( "clicked", self.selectKeyFile, "new")
button_select_keyfile_new.show()
tableVPos=tableVPos+1
# Add 'Cancel' button
button_cancel = gtk.Button( stock=gtk.STOCK_CANCEL )
table.attach( button_cancel, 0, 1, tableVPos, tableVPos+1, ypadding=1 )
button_cancel.connect( "clicked", self.onDelete_change_password_window )
button_cancel.show()
button_ok = gtk.Button( stock=gtk.STOCK_OK )
table.attach( button_ok, 1, 2, tableVPos, tableVPos+1, ypadding=1 )
button_ok.connect( "clicked", self.changePassword )
button_ok.show()
button_ok.set_flags(gtk.CAN_DEFAULT)
button_ok.grab_default()
self.password_change_window.set_default(button_ok)
table.show()
self.password_change_window.show()
debug_end('function changePasswordsWindow')
def selectCryptFromList(self):
debug_begin('function selectCryptFromList')
debug('self.currentCrypts : ' + str(self.currentCrypts))
#if we have no crypts opened
if len(self.currentCrypts) == 0:
if self.afterSelectCryptDoAction == "changepassword" :
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("Please open the Crypt you wish to change."))
dialog.set_title(_("Open the Crypt first"))
dialog.width, dialog.height = dialog.get_size()
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
ret = dialog.run()
dialog.destroy()
debug_end('function selectCryptFromList')
return
self.select_crypt_window = gtk.Window( gtk.WINDOW_TOPLEVEL )
self.select_crypt_window.set_title(_("Select an Open Crypt"))
self.select_crypt_window.set_border_width( 5 )
self.select_crypt_window.set_position( gtk.WIN_POS_CENTER )
self.select_crypt_window.set_modal( gtk.TRUE )
self.select_crypt_window.set_resizable(gtk.FALSE)
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
# Register events
self.select_crypt_window.connect( "delete_event", self.onDelete_select_crypt_window )
#window.show()
self.select_crypt_window.resize(380,10)
table = gtk.Table( rows=3, columns=1, homogeneous=gtk.FALSE )
self.select_crypt_window.add(table)
label_title = gtk.Label()
label_title.set_markup(''+_("Choose a Crypt")+'')
table.attach(label_title, 0, 2, 0, 1,xpadding=2,ypadding=1)
label_title.show()
largestPos = 0
numMounted = 0
i = 0
self.selectedButtons = {}
# we iterate over the crypt, sorted in alphabetical order
for k in sorted(self.currentCrypts.keys()):
mountPoint = self.currentCrypts[k]
button = gtk.Button(decodeFilePath(mountPoint)+" ("+decodeFilePath(k)+")")
table.attach( button, 0, 2, i+1, i+2, ypadding=1 )
# pass the index and crypt name to the function
button.connect( "clicked", self.chooseAnOpenCrypt, i , k)
button.show()
self.selectedButtons[i] = button
numMounted = numMounted+1
i = i+1
# as we incremented i a last time, just give largestPos i+1
largestPos = i+1
if self.afterSelectCryptDoAction == "close" and numMounted > 1 :
button = gtk.Button(_("Close All Crypts") )
table.attach( button, 0, 2, largestPos+1, largestPos+2, ypadding=1 )
button.connect( "clicked", self.closeAllCryptsSelectOption )
button.show()
largestPos = largestPos+2
button = gtk.Button(stock=gtk.STOCK_CANCEL)
table.attach( button, 0, 2, largestPos+1, largestPos+2, ypadding=1 )
button.connect( "clicked", self.onDelete_select_crypt_window )
button.show()
table.show()
self.select_crypt_window.show()
debug_end('function selectCryptFromList')
def closeAllCryptsSelectOption(self, event):
debug_begin('function closeAllCryptsSelectOption')
self.closeAllCrypts();
self.select_crypt_window.hide()
debug_end('function closeAllCryptsSelectOption')
def chooseAnOpenCrypt(self, event, i, crypt_name):
debug_begin('function chooseAnOpenCrypt')
debug("Selected item "+str(i))
self.selectedCrypt = crypt_name
if self.afterSelectCryptDoAction == "close":
debug("Closing selected")
self.closeCrypt(True)
if (self.isExpert):
debug("hiding button "+str(i))
self.selectedButtons[i].hide()
numMounted = 0
# if a crypt is still open, don't close window
if len(self.currentCrypts) > 0 :
debug_end('function chooseAnOpenCrypt')
return
if self.afterSelectCryptDoAction == "changepassword":
debug("Changing Password")
self.changePasswordWindow()
self.select_crypt_window.hide()
debug_end('function chooseAnOpenCrypt')
def formatSizeValue(self, scale, scroll, value):
debug_begin('function formatSizeValue')
# Update crypt_size_txt value
if value > self.lastSpaceLeft :
value = self.lastSpaceLeft
self.crypt_size_txt.set_text("%.f" % value)
# Return dict containing crypt size
values = {'size' : value}
debug_end('function formatSizeValue')
return "%(size).0fMB" %values
# Get the crypt size from the entry box
def formatSizeValueFromEntry(self, entry, boing=None):
debug_begin('function formatSizeValueFromEntry')
try:
# Cast from string to float
v = int(entry.get_text())
values = {'size' : v}
# Update slider with value
self.crypt_size.set_value(v)
# Detect to see if its in list
gotMatch = False
for i,item in enumerate(SIZE_PRESETS):
#print v,SIZE_PRESETS[item]
if v == int(SIZE_PRESETS[item]):
self.cbo_size_preset.set_active(i+1)
gotMatch = True
if not gotMatch :
self.cbo_size_preset.set_active(0)
debug_end('function formatSizeValueFromEntry')
return "%(size).0fMB" %values
except:
debug("ignoring text")
debug_end('function formatSizeValueFromEntry')
# Get the crypt size from the presets combobox
def formatSizeValueFromPresets(self, cbo):
debug_begin('function formatSizeValueFromPresets')
# Get active element from preset combobox
selectedItem = cbo.get_active()
if selectedItem > 0:
selectedValue = SIZE_PRESETS[cbo.get_active()]
v = float(selectedValue)
if v > self.lastSpaceLeft :
cbo.set_active(0)
debug_end('function formatSizeValueFromPresets')
return
values = {'size' : v}
# Update slider and entry with size value
self.crypt_size.set_value(v)
self.crypt_size_txt.set_text("%(size).0f" %values)
debug_end('function formatSizeValueFromPresets')
return "%(size).0fMB" %values
def showWelcomeWindow(self):
debug_begin('function showWelcomeWindow')
self.welcome_window = gtk.Window( gtk.WINDOW_TOPLEVEL )
self.welcome_window.set_title(_("Welcome to Easy Crypt"))
self.welcome_window.set_border_width( 5 )
self.welcome_window.set_position( gtk.WIN_POS_CENTER )
self.welcome_window.set_modal( gtk.TRUE )
self.welcome_window.set_resizable(gtk.FALSE)
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
# Register events
self.welcome_window.connect( "delete_event", self.onDelete_welcome )
#window.show()
self.welcome_window.resize(380,150)
table = gtk.Table( rows=5, columns=2, homogeneous=gtk.FALSE )
self.welcome_window.add(table)
label_title = gtk.Label()
label_title.set_markup(''+_("Welcome to Easy Crypt")+'\n\n'+_("To access Easy Crypt, Right click on the Easy Crypt icon in the System Tray")+'\n\n'+_("Easy Crypt has defaulted to normal mode, in this mode the crypt file is hidden,\nto see it you will have to enable 'Show Hidden Files' (shortcut CTRL+h)")+'\n'+_("The crypt files default location in normal mode is:")+'\n\n'+self.default_crypt+'\n\n'+_("To store crypts elsewhere, use the Tray Icon to change the preferences to expert mode\nExpert mode has many additional features")+'\n')
table.attach(label_title, 0, 2, 0, 1,xpadding=2,ypadding=1)
label_title.show()
splash = gtk.Image()
splash.set_from_file(self.IMAGE_WELCOME_SPLASH)
table.attach(splash, 0, 2, 1, 2,xpadding=2,ypadding=1)
splash.show()
# Add 'Close' button
button_close = gtk.Button( stock=gtk.STOCK_CLOSE )
table.attach( button_close, 0, 1, 2, 3, ypadding=1 )
button_close.connect( "clicked", self.onDelete_welcome )
button_close.show()
# Add 'Setup' button
button_createCrypt = gtk.Button( _("Setup Crypt Now"))
table.attach( button_createCrypt, 1, 2, 2, 3, ypadding=1 )
button_createCrypt.connect( "clicked", self.doFirstCreateEvent )
button_createCrypt.show()
button_createCrypt.set_flags(gtk.CAN_DEFAULT)
button_createCrypt.grab_default()
self.welcome_window.set_default(button_createCrypt)
label_title = gtk.Label(_("Version") +' '+self.version)
table.attach(label_title, 0, 2, 3, 4,xpadding=2,ypadding=1)
label_title.show()
table.show()
self.welcome_window.show()
debug_end('function showWelcomeWindow')
def showAboutWindow(self):
debug_begin('function showAboutWindow')
self.about_window = gtk.Window( gtk.WINDOW_TOPLEVEL )
self.about_window.set_title(_("About Easy Crypt"))
self.about_window.set_border_width( 5 )
self.about_window.set_position( gtk.WIN_POS_CENTER )
self.about_window.set_modal( gtk.FALSE )
self.about_window.set_resizable(gtk.FALSE)
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
# Register events
self.about_window.connect( "delete_event", self.onDelete_about )
#window.show()
self.about_window.resize(380,150)
table = gtk.Table( rows=5, columns=1, homogeneous=gtk.FALSE )
self.about_window.add(table)
label_title = gtk.Label()
label_title.set_markup(''+_("Easy Crypt")+'\n '+_("Version") +' '+self.version)
table.attach(label_title, 0, 1, 0, 1,xpadding=2,ypadding=1)
label_title.show()
splash = gtk.Image()
splash.set_from_file(self.IMAGE_ABOUT_SPLASH)
table.attach(splash, 0, 1, 1, 2,xpadding=2,ypadding=1)
splash.show()
# Add 'Website' button
button_visit = gtk.Button( label=_("Visit _Easy Crypt Website") )
button_visit.set_use_underline(True)
table.attach( button_visit, 0, 1, 2, 3, ypadding=1 )
button_visit.connect( "clicked", self.gotourlMain )
button_visit.show()
# Add 'Website' button
button_visit = gtk.Button( label=_("Visit _TrueCrypt Website") )
button_visit.set_use_underline(True)
table.attach( button_visit, 0, 1, 3, 4, ypadding=1 )
button_visit.connect( "clicked", self.gotoTrueCryptWebsite )
button_visit.show()
label_blurb = gtk.Label()
truecryptDetectionText = _("TrueCrypt not Installed")
if self.hasTrueCryptV4_3a:
truecryptDetectionText = _("Detected TrueCrypt Version") + ": 4.3"
else:
if self.hasTrueCryptV5_0:
truecryptDetectionText = _("Detected TrueCrypt Version") + ": 5.0"
else:
if self.hasTrueCryptV5_1:
truecryptDetectionText = _("Detected TrueCrypt Version") + ": 5.1"
else :
if self.hasTrueCryptV5_X:
truecryptDetectionText = _("Detected TrueCrypt Version") + ": " + self.truecrypt_high_version
else :
if self.hasTrueCryptV6_1:
truecryptDetectionText = _("Detected TrueCrypt Version") + ": 6.1"
else :
if self.hasTrueCryptV6_X:
truecryptDetectionText = _("Detected TrueCrypt Version") + ": 6.X"
label_blurb.set_markup('\n'+_("Written by Steven Harper")+'\n\n'+_("Uses the most Excellent Truecrypt")+'\n\n'+truecryptDetectionText+'\n')
table.attach(label_blurb, 0, 1, 4, 5,xpadding=2,ypadding=1)
label_blurb.show()
# Add 'Close' button
button_close = gtk.Button( stock=gtk.STOCK_CLOSE )
table.attach( button_close, 0, 1, 5, 6, ypadding=1 )
button_close.connect( "clicked", self.onDelete_about )
button_close.show()
table.show()
self.about_window.show()
debug_end('function showAboutWindow')
def gotoTrueCryptWebsite(self, event):
debug_begin('function gotoTrueCryptWebsite')
self.gotourl(URL_TRUECRYPT_DOWNLOAD)
debug_end('function gotoTrueCryptWebsite')
def gotourlMain(self, event):
debug_begin('function gotourlMain')
self.gotourl(WEBSITE)
debug_end('function gotourlMain')
def gotourl( self, location):
debug_begin('function gotourl')
os.system("/usr/bin/x-www-browser "+location+" &")
debug_end('function gotourl')
def trayIconLeftClicked(self, status_icon):
debug_begin('function trayIconLeftClicked')
self.popup_menu.menu.popup (None, None, gtk.status_icon_position_menu, 0, 0, self.status_icon)
debug_end('function trayIconLeftClicked')
def trayIconClicked(self, status_icon, button, activate_time):
debug_begin('function trayIconClicked')
debug("clicked tray "+ str(button))
self.popup_menu.menu.popup(None, None, gtk.status_icon_position_menu, button, activate_time, self.status_icon)
debug_end('function trayIconClicked')
def doChangePasswordEvent(self,menuItem):
debug_begin('function doChangePasswordEvent')
if self.isExpert:
self.afterSelectCryptDoAction = "changepassword"
self.selectCryptFromList()
else :
self.changePasswordWindow()
debug_end('function doChangePasswordEvent')
def doFirstCreateEvent(self, event):
debug_begin('function doFirstCreateEvent')
self.workingFolder = self.home
self.welcome_window.hide()
self.getCryptPasswordThenAction("create")
debug_end('function doFirstCreateEvent')
def doReCreateEvent(self,menuItem):
debug_begin('function doReCreateEvent')
if not os.path.exists(decodeFilePath(self.default_crypt)):
self.workingFolder = self.home
self.getCryptPasswordThenAction("create")
else :
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, _("WARNING\n\nRe Creating a Crypt will Destory it's contents\n\nAre you Sure?"))
dialog.set_title(_("Warning"))
dialog.width, dialog.height = dialog.get_size()
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
ret = dialog.run()
if ret==gtk.RESPONSE_YES:
self.workingFolder = self.home
self.getCryptPasswordThenAction("create")
else:
debug("they clicked no")
dialog.destroy()
debug_end('function doReCreateEvent')
def doConfigEvent(self,menuItem):
debug_begin('function doConfigEvent')
self.showConfigWindow()
debug_end('function doConfigEvent')
def doCreateEvent(self,menuItem):
debug_begin('function doCreateEvent')
if self.lookForTruecrypt():
self.chooseNewCryptLocation()
if self.selectedCrypt != "":
for k in sorted(self.currentCrypts.keys()):
mountPoint = self.currentCrypts[k]
#if we try to create a new crypt in another crypt
if self.selectedCrypt.find(mountPoint+"/") > -1 :
del(self.currentCrypts[self.selectedCrypt])
self.selectedCrypt = ""
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("A crypt cannot be stored within another crypt\n\nPlease select another location"))
dialog.set_title(_("Unable to make crypt"))
dialog.width, dialog.height = dialog.get_size()
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
ret = dialog.run()
dialog.destroy()
self.doCreateEvent(None)
debug_end('function doCreateEvent')
return
self.getCryptPasswordThenAction("create")
debug_end('function doCreateEvent')
def doOpenEvent(self,menuItem):
debug_begin('function doOpenEvent')
if self.lookForTruecrypt():
self.workingFolder = self.home
if self.isExpert:
self.selectCurrentCryptLocation()
if self.selectedCrypt != "":
cryptLocation = self.selectedCrypt
if not self.checkOpened():
debug("Checking for crypt " + cryptLocation)
if not os.path.exists(decodeFilePath(cryptLocation)):
debug("need to make crypt " + cryptLocation)
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("There is no Crypt made\n\nWe need to make a new Crypt"))
dialog.set_title(_("No Crypt found"))
dialog.width, dialog.height = dialog.get_size()
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
ret = dialog.run()
dialog.destroy()
self.getCryptPasswordThenAction("create")
else:
self.getCryptPasswordThenAction("open")
else:
if self.isExpert:
debug("Already Opened")
self.selectedCrypt = ""
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("This Crypt is already open"))
dialog.set_title(_("Crypt already open"))
dialog.width, dialog.height = dialog.get_size()
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
ret = dialog.run()
dialog.destroy()
debug_end('function doOpenEvent')
def doCloseEvent(self,menuItem):
debug_begin('function doCloseEvent')
if self.isExpert:
self.afterSelectCryptDoAction = "close"
self.selectCryptFromList()
else:
self.closeCrypt(True)
debug_end('function doCloseEvent')
def showConfigWindow(self):
debug_begin('function doShowConfigWindow')
self.config_window = gtk.Window( gtk.WINDOW_TOPLEVEL )
self.config_window.set_title(_("Preferences"))
self.config_window.set_border_width( 5 )
self.config_window.set_position( gtk.WIN_POS_CENTER )
self.config_window.set_modal( gtk.TRUE )
self.config_window.set_resizable(gtk.FALSE)
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
# Register eventsICON_PATH_WRONGFIRMWAR
self.config_window.connect( "delete_event", self.onDelete_config )
#window.show()
self.config_window.resize(450,10)
table = gtk.Table( rows=3, columns=2, homogeneous=gtk.FALSE )
self.config_window.add(table)
labelExpertOptions = gtk.Label()
labelExpertOptions.set_markup(''+_("General Options")+'')
table.attach( labelExpertOptions, 0, 2, 0, 1 )
labelExpertOptions.show()
# authtype here
self.lbl_mode=gtk.Label(_("Easy Crypt Mode "))
self.lbl_mode.set_alignment(0, 0.5)
self.cbo_mode=gtk.combo_box_new_text()
if (self.easyCryptConfig.getOption("mode") == _("expert")):
self.cbo_mode.append_text(_("expert"))
self.cbo_mode.append_text(_("normal"))
else:
self.cbo_mode.append_text(_("normal"))
self.cbo_mode.append_text(_("expert"))
self.cbo_mode.set_active(0)
# Attach combobox and label
table.attach( self.lbl_mode, 0, 1, 1, 2 )
self.lbl_mode.show()
table.attach( self.cbo_mode, 1, 2, 1, 2, ypadding=0 )
self.cbo_mode.show()
# Checkbox for Autostart on login
alignment = gtk.Alignment( 0.0, 0.0, 0.0, 0.0 )
self.autostart_on_login = gtk.CheckButton(_("Auto Start on Login"))
alignment.add( self.autostart_on_login )
table.attach( alignment, 0, 2, 2, 3 )
alignment.show()
if self.easyCryptConfig.getOption("autostart_on_login") == "yes":
self.autostart_on_login.set_active( gtk.TRUE )
else:
self.autostart_on_login.set_active( gtk.FALSE )
self.autostart_on_login.show()
# Checkbox for Use Only Stock Icons
alignment = gtk.Alignment( 0.0, 0.0, 0.0, 0.0 )
self.use_stock_icons = gtk.CheckButton(_("Use Standard Theme Icons"))
alignment.add( self.use_stock_icons )
table.attach( alignment, 0, 2, 3, 4 )
alignment.show()
if self.easyCryptConfig.getOption("use_stock_icons") == "yes":
self.use_stock_icons.set_active( gtk.TRUE )
else:
self.use_stock_icons.set_active( gtk.FALSE )
self.use_stock_icons.show()
separator = gtk.HSeparator()
table.attach( separator, 0, 2, 4, 5 )
separator.show()
labelExpertOptions = gtk.Label()
labelExpertOptions.set_markup('\n'+_("Expert Options")+'')
table.attach( labelExpertOptions, 0, 2, 5, 6 )
labelExpertOptions.show()
# Checkbox for Use Crypt filename as mount name
alignment = gtk.Alignment( 0.0, 0.0, 0.0, 0.0 )
self.use_filename_as_mountname = gtk.CheckButton(_("Use Crypt filename as mount name"))
alignment.add( self.use_filename_as_mountname )
table.attach( alignment, 0, 2, 6, 7 )
alignment.show()
if self.easyCryptConfig.getOption("use_filename_as_mountname") == "yes":
self.use_filename_as_mountname.set_active( gtk.TRUE )
else:
self.use_filename_as_mountname.set_active( gtk.FALSE )
self.use_filename_as_mountname.show()
# Checkbox for Use Crypt filename as mount name
alignment = gtk.Alignment( 0.0, 0.0, 0.0, 0.0 )
self.show_keyfile_options = gtk.CheckButton(_("Show Keyfile options"))
alignment.add( self.show_keyfile_options )
table.attach( alignment, 0, 2, 7, 8 )
alignment.show()
if self.easyCryptConfig.getOption("show_keyfile_options") == "yes":
self.show_keyfile_options.set_active( gtk.TRUE )
else:
self.show_keyfile_options.set_active( gtk.FALSE )
self.show_keyfile_options.show()
# Checkbox for Modify Mount Path
alignment = gtk.Alignment( 0.0, 0.0, 0.0, 0.0 )
self.show_modifiable_mount_path_options = gtk.CheckButton(_("Modifiable Mount Path"))
alignment.add( self.show_modifiable_mount_path_options )
table.attach( alignment, 0, 2, 8, 9 )
alignment.show()
if self.easyCryptConfig.getOption("modifiable_mount_path") == "yes":
self.show_modifiable_mount_path_options.set_active( gtk.TRUE )
else:
self.show_modifiable_mount_path_options.set_active( gtk.FALSE )
self.show_modifiable_mount_path_options.show()
# Add 'Save' button
button_close = gtk.Button( stock=gtk.STOCK_CANCEL )
table.attach( button_close, 0, 1, 9, 10, ypadding=1 )
button_close.connect( "clicked", self.onDelete_config )
button_close.show()
# Add 'Save' button
button_save = gtk.Button( stock=gtk.STOCK_OK )
table.attach( button_save, 1, 2, 9, 10, ypadding=1 )
button_save.connect( "clicked", self.saveConfig )
button_save.show()
table.show()
self.config_window.show()
debug_end('function doShowConfigWindow')
def saveConfig(self, event):
debug_begin('function saveConfig')
modeChanged = True;
iter = self.cbo_mode.get_active_iter()
selectedMode = self.cbo_mode.get_model().get_value(iter, 0)
debug("setting mode to "+selectedMode+" old setting "+self.easyCryptConfig.getOption("mode"))
if selectedMode == self.easyCryptConfig.getOption("mode"):
modeChanged = False
self.easyCryptConfig.setOption("mode",selectedMode)
if self.autostart_on_login.get_active() == gtk.TRUE :
self.easyCryptConfig.setOption("autostart_on_login","yes")
else:
self.easyCryptConfig.setOption("autostart_on_login","no")
if self.use_stock_icons.get_active() == gtk.TRUE :
self.easyCryptConfig.setOption("use_stock_icons","yes")
else:
self.easyCryptConfig.setOption("use_stock_icons","no")
if self.use_filename_as_mountname.get_active() == gtk.TRUE :
self.easyCryptConfig.setOption("use_filename_as_mountname","yes")
else:
self.easyCryptConfig.setOption("use_filename_as_mountname","no")
if self.show_keyfile_options.get_active() == gtk.TRUE :
self.easyCryptConfig.setOption("show_keyfile_options","yes")
else:
self.easyCryptConfig.setOption("show_keyfile_options","no")
if self.show_modifiable_mount_path_options.get_active() == gtk.TRUE :
self.easyCryptConfig.setOption("modifiable_mount_path","yes")
else:
self.easyCryptConfig.setOption("modifiable_mount_path","no")
# Now Save
self.easyCryptConfig.writeConfig()
# Now do Any actions needed
if self.easyCryptConfig.getOption("autostart_on_login") == "yes":
self.createAutoStartOnLoginFile()
else :
self.removeAutoStartOnLoginFile()
self.onDelete_config(None, None)
if modeChanged:
needWarn = False
if self.isExpert:
# note this is still the old one
if len(self.currentCrypts) > 0:
needWarn = True
else:
# note this is if the old setting was normal
if self.checkOpened():
needWarn = True
if needWarn:
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("You have changed the Mode\n\nAny Crypts you have open will now be closed."))
dialog.width, dialog.height = dialog.get_size()
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
ret = dialog.run()
dialog.destroy()
self.closeAllCrypts()
self.currentCrypts.clear()
self.selectedCrypt = ""
if self.easyCryptConfig.getOption("mode") == _("normal"):
self.isExpert = False
else :
self.isExpert = True
self.popup_menu = EasyCryptPopupMenu.EasyCryptPopupMenu(self)
if not self.isExpert :
self.currentCrypts[self.default_crypt] = self.default_mount
self.selectedCrypt = self.default_crypt
self.updateTrayIcon()
debug_end('function saveConfig')
def removeAutoStartOnLoginFile(self):
debug_begin('function removeAutoStartOnLoginFile')
autoThere = False
if os.path.exists(os.path.join(self.home, ".config/autostart/easycrypt.desktop")):
debug("Found one!")
autoThere = True
if autoThere :
#Replace this with proper Python one
debug("Removing old autostart on login")
outputString = commands.getoutput("rm ~/.config/autostart/easycrypt.desktop")
if len(outputString) > 0 : debug(outputString)
debug_end('function removeAutoStartOnLoginFile')
def createAutoStartOnLoginFile(self):
debug_begin('function createAutoStartOnLoginFile')
if not os.path.exists(os.path.join(self.home, ".config/autostart")):
outputString = commands.getoutput("mkdir -p ~/.config/autostart")
if len(outputString) > 0 : debug(outputString)
outputString = commands.getoutput("cp "+APP_PATH +" ~/.config/autostart/")
if len(outputString) > 0 :debug(outputString)
debug_end('function createAutoStartOnLoginFile')
def onDelete_about( self, widget, data=None ):
debug_begin('function onDelete_about')
self.about_window.destroy()
debug_end('function onDelete_about')
def onDelete_welcome( self, widget, data=None ):
debug_begin('function onDelete_welcome')
self.welcome_window.destroy()
debug_end('function onDelete_welcome')
def onDelete_password_window( self, widget, data=None ):
debug_begin('function onDelete_password_window')
if self.isExpert:
if self.selectedCrypt != "":
debug("clearing crypt from list")
del(self.currentCrypts[self.selectedCrypt])
self.selectedCrypt = ""
self.password_window.destroy()
debug_end('function onDelete_password_window')
def onDelete_change_password_window( self, widget, data=None ):
debug_begin('function onDelete_change_password_window')
self.password_change_window.destroy()
debug_end('function onDelete_change_password_window')
def onDelete_select_crypt_window( self, widget, data=None ):
debug_begin('function onDelete_select_crypt_window')
self.select_crypt_window.destroy()
debug_end('function onDelete_select_crypt_window')
def onDelete_config( self, widget, data=None ):
debug_begin('function onDelete_config')
self.config_window.destroy()
debug_end('function onDelete_config')
def showAboutWindowEvent(self,menuItem):
debug_begin('function showAboutWindowEvent')
self.showAboutWindow()
debug_end('function showAboutWindowEvent')
def hide(self):
debug_begin('function hide')
self.window.hide()
debug_end('function hide')
def onDelete(self, widget, data=None ):
debug_begin('function onDelete')
self.exit(None)
debug_end('function onDelete')
return gtk.TRUE
def exit(self, event):
debug_begin('function exit')
needToPrompt = False
if self.isExpert :
# if we have some crypts open, do some stuff
if len(self.currentCrypts) > 0 :
needToPrompt = True
dialogText = _("Easy Crypt still has the following Crypts open")+"\n"
for k in sorted(self.currentCrypts.keys()):
mountPoint = self.currentCrypts[k]
dialogText = dialogText + "\n" + decodeFilePath(k) + " : " + decodeFilePath(mountPoint)
# at the end, add end of message
dialogText = dialogText + "\n\n"+_("These Crypts will be closed if you close Easy Crypt")
else :
if self.checkOpened() :
needToPrompt = True
dialogText = _("Easy Crypt still has the Crypt Open\n\nThe Crypt will be closed if you close Easy Crypt")
if needToPrompt:
dialogText = dialogText + "\n\n" + _("Are you sure you want to close Easy Crypt?")
dialog = gtk.MessageDialog( None, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, dialogText)
dialog.set_title(_("Are you sure"))
dialog.width, dialog.height = dialog.get_size()
icon = gtk.gdk.pixbuf_new_from_file(self.ICON_PATH_WINDOW)
gtk.window_set_default_icon_list( (icon) )
ret = dialog.run()
if ret==gtk.RESPONSE_YES:
debug("they clicked yes")
self.closeAllCrypts();
dialog.destroy()
debug_end('function exit')
gtk.main_quit(0)
else:
debug("they clicked no")
dialog.destroy()
else :
gtk.main_quit(0)
debug_end('function exit')
def main(self):
gtk.main()
def start():
warnings.filterwarnings( action="ignore", category=DeprecationWarning)
theEasyCrypt = EasyCrypt()
#parse options
parser = optparse.OptionParser()
parser.add_option("-d", "--debug", dest="debug",action="store_true", default = False, help=theEasyCrypt._("enable debug output to console"))
(options, args) = parser.parse_args()
global DEBUG
DEBUG = options.debug
if theEasyCrypt.checkWeAreAlone():
exit(0)
try:
theEasyCrypt.lookForTruecrypt()
theEasyCrypt.main()
except KeyboardInterrupt:
debug("closing")
theEasyCrypt.closeAllCrypts()
if __name__ == "__main__":
start()