#!/usr/bin/env python
#

from gi.repository import Gtk, GObject, GLib, Gdk
import subprocess
import os
import sys
import threading
import signal
import string
import re

class EmailConfig(object):
	builder = None
	auth = False
	show = False

	def __init__(self):
		self.builder = Gtk.Builder()

		self.builder.add_from_file("email_config.glade")
		self.builder.connect_signals(self)

		self.window = self.builder.get_object("mainWindow")
		self.window.set_title("Email advanced configuration")

		self.window.connect("delete-event", Gtk.main_quit)
		self.window.show()

		if os.path.exists("/etc/NetworkManager/muttrc") == True:
			self.builder.get_object("button1").set_sensitive(False)
			self.builder.get_object("entry1").set_sensitive(False)
                        self.builder.get_object("entry2").set_sensitive(False)
                        self.builder.get_object("checkbutton1").set_sensitive(False)

			auth = False

			for line in open('/etc/NetworkManager/muttrc').readlines():
				if string.find(line, "#SERVER=") != -1:
					self.builder.get_object("entry1").set_text(line[8:-1])
				elif string.find(line, "#PORT=") != -1:
					self.builder.get_object("entry2").set_text(line[6:-1])
				elif string.find(line, "#USERNAME=") != -1:
					auth = True
					self.builder.get_object("entry3").set_text(line[10:-1])
				elif auth == True and string.find(line, "#PASSWORD=") != -1:
					auth = True
					self.builder.get_object("entry4").set_text(line[10:-1])
			
			if auth == True:
				self.builder.get_object("checkbutton1").set_active(True)

			self.builder.get_object("entry3").set_sensitive(False)
	                self.builder.get_object("entry4").set_sensitive(False)
	                self.builder.get_object("entry4").set_visibility(False)
	                self.builder.get_object("checkbutton2").set_sensitive(False)
		else:
			self.builder.get_object("button2").set_sensitive(False)

	def do_gui(self, function, *args, **kw):
                def idle_func():
                        Gdk.threads_enter()
                        try:
                                while Gtk.events_pending():
                                        Gtk.main_iteration()
                                function(*args, **kw)
                                return False
                        finally:
                                Gdk.threads_leave()
                GObject.idle_add(idle_func, priority=GObject.PRIORITY_DEFAULT)

	def enable_auth(self, *args):
		if self.auth == False:
			self.builder.get_object("entry3").set_sensitive(True)
			self.builder.get_object("entry4").set_sensitive(True)
			self.builder.get_object("checkbutton2").set_sensitive(True)
			self.auth = True
		else:
			self.builder.get_object("entry3").set_sensitive(False)
                        self.builder.get_object("entry4").set_sensitive(False)
                        self.builder.get_object("checkbutton2").set_sensitive(False)
			self.auth = False

	def show_password(self, *args):
		if self.show == False:
			self.builder.get_object("entry4").set_visibility(True)
			self.show = True
		else:
			self.builder.get_object("entry4").set_visibility(False)
			self.show = False

	def config_cancel(self, *args):
		Gtk.main_quit()

	def config_save(self, *args):
		server = self.builder.get_object("entry1").get_text()

		if server == "" or server == None:
			self.dialog1 = self.builder.get_object("messagedialog1")
                        Gdk.threads_enter()
                        self.response1 = self.dialog1.run()
                        Gdk.threads_leave()
                        if self.response1 == Gtk.ResponseType.OK:
                                self.do_gui(self.dialog1.hide)
				return

		if re.match("^[a-zA-Z0-9.-]+$", server) == None:
			self.dialog2 = self.builder.get_object("messagedialog2")
                        Gdk.threads_enter()
                        self.response2 = self.dialog2.run()
                        Gdk.threads_leave()
                        if self.response2 == Gtk.ResponseType.OK:
                                self.do_gui(self.dialog2.hide)
                                return
	
                port = self.builder.get_object("entry2").get_text()

		if port == "" or port == None:
			self.dialog3 = self.builder.get_object("messagedialog3")
                        Gdk.threads_enter()
                        self.response3 = self.dialog3.run()
                        Gdk.threads_leave()
                        if self.response3 == Gtk.ResponseType.OK:
                                self.do_gui(self.dialog3.hide)
                                return

		if re.match("^[0-9]+$", port) == None:
                        self.dialog4 = self.builder.get_object("messagedialog4")
                        Gdk.threads_enter()
                        self.response4 = self.dialog4.run()
                        Gdk.threads_leave()
                        if self.response4 == Gtk.ResponseType.OK:
                                self.do_gui(self.dialog4.hide)
                                return

                if self.auth == True:
                        username = self.builder.get_object("entry3").get_text()

			if username == "" or username == None:
				self.dialog5 = self.builder.get_object("messagedialog5")
	                        Gdk.threads_enter()
	                        self.response5 = self.dialog5.run()
	                        Gdk.threads_leave()
	                        if self.response5 == Gtk.ResponseType.OK:
        	                        self.do_gui(self.dialog5.hide)
        	                        return

			if re.match("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+$", username) == None:
				if re.match("^[a-zA-Z0-9._%+-]+$", username) == None:
					self.dialog6 = self.builder.get_object("messagedialog6")
                                	Gdk.threads_enter()
                                	self.response6 = self.dialog6.run()
                                	Gdk.threads_leave()
                                	if self.response6 == Gtk.ResponseType.OK:
                                	        self.do_gui(self.dialog6.hide)
                                	        return

                        password = self.builder.get_object("entry4").get_text()

			if password == "" or password == None:
				self.dialog7 = self.builder.get_object("messagedialog7")
	                        Gdk.threads_enter()
         	                self.response7 = self.dialog7.run()
                	        Gdk.threads_leave()
                	        if self.response7 == Gtk.ResponseType.OK:
                	                self.do_gui(self.dialog7.hide)
                	                return

                        if re.match("^[a-zA-Z0-9`~!@#$%^&*()-_=+,<.>/?;:'\"[\]{}]+$", password) == None:
                                self.dialog8 = self.builder.get_object("messagedialog8")
                                Gdk.threads_enter()
                                self.response8 = self.dialog8.run()
                                Gdk.threads_leave()
                                if self.response8 == Gtk.ResponseType.OK:
                                        self.do_gui(self.dialog8.hide)
                                        return

			muttrc = ""
			muttrc += "#SERVER=" + server + "\n"
			muttrc += "#PORT=" + port + "\n"
			muttrc += "#USERNAME=" + username + "\n"
			muttrc += "#PASSWORD=" + password + "\n"
			muttrc += "\n"
			muttrc += "set smtp_url = \"smtp://" + username + "@" + server + ":" + port + "/\"\n"
			muttrc += "set smtp_pass = \"" + password + "\""
		else:
			muttrc = ""
			muttrc += "#SERVER=" + server + "\n"
                        muttrc += "#PORT=" + port + "\n"
			muttrc += "\n"
			muttrc += "set smtp_url = \"smtp://" + server + ":" + port + "/\""

		subprocess.call("rm -f /etc/NetworkManager/muttrc 2> /dev/null", shell=True)

		f = open('/etc/NetworkManager/muttrc', 'a')
		f.write(muttrc)
		f.close()	

		self.builder.get_object("entry1").set_sensitive(False)
                self.builder.get_object("entry2").set_sensitive(False)
                self.builder.get_object("checkbutton1").set_sensitive(False)
                self.builder.get_object("entry3").set_sensitive(False)
                self.builder.get_object("entry4").set_sensitive(False)
                self.builder.get_object("checkbutton2").set_sensitive(False)
		self.builder.get_object("button2").set_sensitive(True)
		self.builder.get_object("button1").set_sensitive(False)

		if self.show == True:
			self.builder.get_object("checkbutton2").set_active(False)
	
	def config_remove(self, *args):
		subprocess.call("rm -f /etc/NetworkManager/muttrc 2> /dev/null", shell=True)

		self.builder.get_object("entry1").set_sensitive(True)
                self.builder.get_object("entry2").set_sensitive(True)
		self.builder.get_object("checkbutton1").set_sensitive(True)

		if self.auth == False:
			self.builder.get_object("entry3").set_sensitive(False)
			self.builder.get_object("entry4").set_sensitive(False)

			if self.show == True:
				self.builder.get_object("entry4").set_visibility(True)
			else:
				self.builder.get_object("entry4").set_visibility(False)
			self.builder.get_object("checkbutton2").set_sensitive(False)
		else:
			self.builder.get_object("entry3").set_sensitive(True)
                        self.builder.get_object("entry4").set_sensitive(True)

			if self.show == True:
				self.builder.get_object("entry4").set_visibility(True)
			else:
                        	self.builder.get_object("entry4").set_visibility(False)
                        self.builder.get_object("checkbutton2").set_sensitive(True)

		self.builder.get_object("button2").set_sensitive(False)
		self.builder.get_object("button1").set_sensitive(True)

def signal_handler(signum, frame):
        print "[ email_gui][00000000] Signal caught."
        sys.exit()

        return

def main():
        signal.signal(signal.SIGINT, signal_handler)
        signal.signal(signal.SIGTERM, signal_handler)

	app = EmailConfig()
	Gtk.main()

	return

if __name__ == "__main__":
	main()
