1
import gtk, pango, webkit, gnomekeyring
2
import urllib, urllib2, json, urlparse, uuid
3
from oauth import oauth
5
from gtk import Builder
6
from gwibber.microblog.util import resources
8
from gettext import gettext as _
9
if hasattr(gettext, 'bind_textdomain_codeset'):
10
gettext.bind_textdomain_codeset('gwibber','UTF-8')
11
gettext.textdomain('gwibber-service-sohu')
14
gtk.gdk.threads_init()
16
sigmeth = oauth.OAuthSignatureMethod_HMAC_SHA1()
18
class AccountWidget(gtk.VBox):
19
"""AccountWidget: A widget that provides a user interface for configuring sohu accounts in Gwibber
22
def __init__(self, account=None, dialog=None):
23
"""Creates the account pane for configuring Sohu accounts"""
24
gtk.VBox.__init__( self, False, 20 )
25
self.ui = gtk.Builder()
26
self.ui.set_translation_domain ("gwibber")
27
self.ui.add_from_file (resources.get_ui_asset("gwibber-accounts-sohu.ui"))
28
self.ui.connect_signals(self)
29
self.vbox_settings = self.ui.get_object("vbox_settings")
30
self.pack_start(self.vbox_settings, False, False)
33
self.account = account or {}
36
if self.account.has_key("id"):
38
value = gnomekeyring.find_items_sync(gnomekeyring.ITEM_GENERIC_SECRET, {"id": str("%s/%s" % (self.account["id"], "secret_token"))})[0].secret
39
except gnomekeyring.NoMatchError:
40
has_secret_key = False
43
if self.account.has_key("access_token") and self.account.has_key("secret_token") and self.account.has_key("username") and has_secret_key and not self.dialog.condition:
44
self.ui.get_object("hbox_sohu_auth").hide()
45
self.ui.get_object("sohu_auth_done_label").set_label(_("%s has been authorized by Sohu") % self.account["username"])
46
self.ui.get_object("hbox_sohu_auth_done").show()
48
self.ui.get_object("hbox_sohu_auth_done").hide()
50
self.dialog.ui.get_object('vbox_create').hide()
52
self.ui.get_object("hbox_sohu_auth_done").hide()
54
self.dialog.ui.get_object("vbox_create").hide()
57
def on_sohu_auth_clicked(self, widget, data=None):
58
self.winsize = self.window.get_size()
60
web = webkit.WebView()
61
web.get_settings().set_property("enable-plugins", False)
62
web.load_html_string(_("<p>Please wait...</p>"), "file:///")
64
self.consumer = oauth.OAuthConsumer(*sohu.utils.get_sohu_keys())
66
request = oauth.OAuthRequest.from_consumer_and_token(self.consumer, http_method="POST",
67
callback="http://gwibber.com/0/auth.html",
68
http_url="http://api.t.sohu.com/oauth/request_token")
70
request.sign_request(sigmeth, self.consumer, token=None)
72
tokendata = urllib2.urlopen(request.http_url, request.to_postdata()).read()
73
self.token = oauth.OAuthToken.from_string(tokendata)
75
#url = "http://api.t.sohu.com/oauth/authorize?oauth_token=" + self.token.key
76
url = "http://api.t.sohu.com/oauth/authorize?oauth_token=%s&oauth_callback=%s&display=popup" % ( self.token.key, "http://gwibber.com/0/auth.html" )
79
web.set_size_request(550, 400)
80
web.connect("title-changed", self.on_sohu_auth_title_change)
82
self.scroll = gtk.ScrolledWindow()
85
self.pack_start(self.scroll, True, True, 0)
88
self.ui.get_object("vbox1").hide()
89
self.ui.get_object("vbox_advanced").hide()
90
self.dialog.infobar.set_message_type(gtk.MESSAGE_INFO)
92
def on_sohu_auth_title_change(self, web=None, title=None, data=None):
94
if title.get_title() == "Success":
96
if hasattr(self.dialog, "infobar_content_area"):
97
for child in self.dialog.infobar_content_area.get_children(): child.destroy()
98
self.dialog.infobar_content_area = self.dialog.infobar.get_content_area()
99
self.dialog.infobar_content_area.show()
100
self.dialog.infobar.show()
102
message_label = gtk.Label(_("Verifying"))
103
message_label.set_use_markup(True)
104
message_label.set_ellipsize(pango.ELLIPSIZE_END)
105
self.dialog.infobar_content_area.add(message_label)
106
self.dialog.infobar.show_all()
108
url = web.get_main_frame().get_uri()
109
data = urlparse.parse_qs(url.split("?", 1)[1])
111
self.ui.get_object("vbox1").show()
112
self.ui.get_object("vbox_advanced").show()
114
token = data["oauth_token"][0]
115
verifier = data["oauth_verifier"][0]
117
request = oauth.OAuthRequest.from_consumer_and_token(
118
self.consumer, self.token, http_method="POST",
119
http_url="http://api.t.sohu.com/oauth/access_token",
120
parameters={"oauth_verifier": str(verifier)})
121
request.sign_request(sigmeth, self.consumer, self.token)
123
tokendata = urllib2.urlopen(request.http_url, request.to_postdata()).read()
124
data = urlparse.parse_qs(tokendata)
126
atok = oauth.OAuthToken.from_string(tokendata)
128
self.account["access_token"] = data["oauth_token"][0]
129
self.account["secret_token"] = data["oauth_token_secret"][0]
131
apireq = oauth.OAuthRequest.from_consumer_and_token(
134
http_url="http://api.t.sohu.com/account/verify_credentials.json", parameters=None)
136
apireq.sign_request(sigmeth, self.consumer, atok)
138
account_data = json.loads(urllib2.urlopen(apireq.to_url()).read())
140
self.account["username"] = account_data["screen_name"]
141
self.account["user_id"] = account_data["id"]
143
if isinstance(account_data, dict):
144
if account_data.has_key("id"):
145
saved = self.dialog.on_edit_account_save()
148
self.dialog.infobar.set_message_type(gtk.MESSAGE_ERROR)
149
message_label.set_text(_("Authorization failed. Please try again."))
152
self.dialog.infobar.set_message_type(gtk.MESSAGE_ERROR)
153
message_label.set_text(_("Authorization failed. Please try again."))
156
message_label.set_text(_("Successful"))
157
self.dialog.infobar.set_message_type(gtk.MESSAGE_INFO)
158
#self.dialog.infobar.hide()
160
self.ui.get_object("hbox_sohu_auth").hide()
161
self.ui.get_object("sohu_auth_done_label").set_label(_("%s has been authorized by Sohu") % str(self.account["username"]))
162
self.ui.get_object("hbox_sohu_auth_done").show()
163
if self.dialog.ui and self.account.has_key("id") and not saved:
164
self.dialog.ui.get_object("vbox_save").show()
165
elif self.dialog.ui and not saved:
166
self.dialog.ui.get_object("vbox_create").show()
168
self.window.resize(*self.winsize)
170
if title.get_title() == "Failure":
172
self.dialog.infobar.set_message_type(gtk.MESSAGE_ERROR)
173
message_label.set_text(_("Authorization failed. Please try again."))
174
self.dialog.infobar.show_all()
176
self.ui.get_object("vbox1").show()
177
self.ui.get_object("vbox_advanced").show()
178
self.window.resize(*self.winsize)