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
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
25 self.window = None
26 self.notebook = None
27 self.pages = {}
28 self.finished = {}
29
30 log.debug("Created Conduit login window")
31
33 for url in self.pages.keys():
34 self._delete_page(url)
35 return True
36
39
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
46 browser = self.pages[url]
47 browserWidget = browser.widget()
48 browser.stop_load()
49
50
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
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
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
81 browser = browserImplKlass()
82 browser.connect("open_uri",self._on_open_uri)
83
84
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
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
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
114 browser = self.pages[url]
115 browserWidget = browser.widget()
116
117
118 idx = self.notebook.page_num(browserWidget)
119 self.notebook.set_current_page(idx)
120
121
122 browserWidget.show_now()
123 return False
124
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
136
137 time.sleep(0.1)
138
139 log.debug("FINISHED LOGIN (thread: %s)" % thread.get_ident())
140
141
142 testFunc = kwargs.get("login_function",None)
143 if testFunc != None and testFunc():
144 return
145 else:
146 raise Exception("Login failure")
147
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):
181