Package conduit :: Module Web
[hide private]

Source Code for Module conduit.Web

  1  """ 
  2  Functions for dealing with web urls, generally used for 
  3  logging into web sites for authorization 
  4  """ 
  5  import sys 
  6  import os 
  7  import gobject 
  8  import time 
  9  import thread 
 10  import logging 
 11  log = logging.getLogger("Web") 
 12   
 13  import conduit 
 14  import conduit.utils.Singleton as Singleton 
 15  import conduit.platform.WebBrowserSystem as WebBrowserSystem 
 16   
17 -class LoginWindow(Singleton.Singleton):
18 """ 19 The ConduitLogin object needs to be a singleton so that we 20 only have one window with multiple tabs, and so we can guarentee 21 that it runs in the GUI thread 22 """ 23
24 - def __init__(self):
25 self.window = None 26 self.notebook = None 27 self.pages = {} 28 self.finished = {} 29 30 log.debug("Created Conduit login window")
31
32 - def _on_window_closed(self, *args):
33 for url in self.pages.keys(): 34 self._delete_page(url) 35 return True
36
37 - def _on_tab_close_clicked(self, button, url):
38 self._delete_page(url)
39
40 - def _on_open_uri(self, *args):
41 log.debug("LINK CLICKED (thread: %s)" % thread.get_ident())
42
43 - def _delete_page(self, url):
44 log.debug("DELETE PAGE (thread: %s)" % thread.get_ident()) 45 #get the original objects 46 browser = self.pages[url] 47 browserWidget = browser.widget() 48 browser.stop_load() 49 50 #remove the page and any refs 51 idx = self.notebook.page_num(browserWidget) 52 self.notebook.remove_page(idx) 53 del(self.pages[url]) 54 55 if self.notebook.get_n_pages() == 0: 56 self.window.hide_all() 57 58 #notify 59 self.finished[url] = True
60
61 - def _create_page(self, name, url, browserImplKlass):
62 log.debug("CREATE PAGE: %s (thread: %s)" % (url,thread.get_ident())) 63 if url in self.pages: 64 return False 65 66 import gtk 67 #lazy init to save a bit of time 68 if self.window == None: 69 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 70 self.window.set_title("Conduit Login Manager") 71 self.window.set_border_width(12) 72 self.window.connect('delete-event', self._on_window_closed) 73 self.notebook = gtk.Notebook() 74 self.window.add(self.notebook) 75 76 self.window.set_default_size(700, 600) 77 self.window.set_position(gtk.WIN_POS_CENTER) 78 self.window.show_all() 79 80 #create object and connect signals 81 browser = browserImplKlass() 82 browser.connect("open_uri",self._on_open_uri) 83 84 #create the tab label 85 tab_button = gtk.Button() 86 tab_button.connect('clicked', self._on_tab_close_clicked, url) 87 tab_label = gtk.Label(name) 88 tab_box = gtk.HBox(False, 2) 89 #Add icon to button 90 icon_box = gtk.HBox(False, 0) 91 image = gtk.Image() 92 image.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_MENU) 93 tab_button.set_relief(gtk.RELIEF_NONE) 94 icon_box.pack_start(image, True, False, 0) 95 tab_button.add(icon_box) 96 tab_box.pack_start(tab_label, False) 97 tab_box.pack_start(tab_button, False) 98 tab_box.show_all() 99 100 #add to notebook 101 browserWidget = browser.widget() 102 self.notebook.append_page(child=browserWidget, tab_label=tab_box) 103 self.pages[url] = browser 104 105 browserWidget.show_now() 106 browser.load_url(url) 107 return False
108
109 - def _raise_page(self, url):
110 log.debug("RAISE PAGE (thread: %s)" % thread.get_ident()) 111 self.window.show_all() 112 113 #get the original objects 114 browser = self.pages[url] 115 browserWidget = browser.widget() 116 117 #make page current 118 idx = self.notebook.page_num(browserWidget) 119 self.notebook.set_current_page(idx) 120 121 #show 122 browserWidget.show_now() 123 return False
124
125 - def wait_for_login(self, name, url, **kwargs):
126 log.debug("LOGIN (thread: %s)" % thread.get_ident()) 127 128 if url in self.pages: 129 gobject.idle_add(self._raise_page, url) 130 else: 131 gobject.idle_add(self._create_page, name, url, kwargs["browserImplKlass"]) 132 self.finished[url] = False 133 134 while not self.finished[url] and not conduit.GLOBALS.cancelled: 135 #We can/need to sleep here because the GUI work is going on in the main thread 136 #and gtk.main needs to iterate 137 time.sleep(0.1) 138 139 log.debug("FINISHED LOGIN (thread: %s)" % thread.get_ident()) 140 141 #call the test function 142 testFunc = kwargs.get("login_function",None) 143 if testFunc != None and testFunc(): 144 return 145 else: 146 raise Exception("Login failure")
147
148 -class LoginMagic(object):
149 """ 150 Performs all the magic to log into a website to authenticate. Uses 151 either the system browser, or conduits own one. 152 """
153 - def __init__(self, name, url, **kwargs):
154 browser = kwargs.get("browser",conduit.GLOBALS.settings.get("web_login_browser")) 155 log.info("Logging in using browser: %s" % browser) 156 157 #instantiate the browser 158 if browser == "system": 159 login = WebBrowserSystem.WebBrowserImpl() 160 else: 161 try: 162 if browser == "gtkmozembed": 163 from conduit.platform.WebBrowserMozilla import WebBrowserImpl 164 elif browser == "webkit": 165 from conduit.platform.WebBrowserWebkit import WebBrowserImpl 166 else: 167 log.warn("Unknown browser type") 168 return 169 170 kwargs["browserImplKlass"] = WebBrowserImpl 171 login = LoginWindow() 172 173 except ImportError: 174 login = None 175 176 if login: 177 #blocks/times out until the user logs in or gives up 178 login.wait_for_login(name, url, **kwargs) 179 else: 180 log.warn("Error setting up browser")
181