123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- import json
- CHECK_AUTH_JS = """
- var code = document.getElementById("code");
- var access_denied = document.getElementById("access_denied");
- var result;
-
- if (code) {
- result = {authorized: true, code: code.value};
- } else if (access_denied) {
- result = {authorized: false, message: access_denied.innerText};
- } else {
- result = {};
- }
- window.status = JSON.stringify(result);
- """
- def _on_webview_status_bar_changed(webview, status, dialog):
- if status:
- authorization = json.loads(status)
- if authorization.has_key("authorized"):
- dialog.set_data("authorization_code", authorization["code"])
- dialog.response(0)
- def get_code(url, size=(640, 480), title="Google authentication"):
- """Open a GTK webkit window and return the access code."""
- import gtk
- import webkit
- dialog = gtk.Dialog(title=title)
- webview = webkit.WebView()
- scrolled = gtk.ScrolledWindow()
- scrolled.add(webview)
- dialog.get_children()[0].add(scrolled)
- webview.load_uri(url)
- dialog.resize(*size)
- dialog.show_all()
- dialog.connect("delete-event",
- lambda event, data: dialog.response(1))
- webview.connect("load-finished",
- lambda view, frame: view.execute_script(CHECK_AUTH_JS))
- webview.connect("status-bar-text-changed",
- _on_webview_status_bar_changed, dialog)
- dialog.set_data("authorization_code", None)
- status = dialog.run()
- dialog.destroy()
- while gtk.events_pending():
- gtk.main_iteration(False)
- return dialog.get_data("authorization_code")
|