2
# Copyright (C) 2010 Canonical Ltd
4
# This program is free software: you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License version 2 as
6
# published by the Free Software Foundation.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program. If not, see <http://www.gnu.org/licenses/>.
16
# Copyright (C) 2010 Ken VanDine <ken.vandine@canonical.com>
18
# Twitter widgets for Gwibber
1
import gtk, webkit, gnomekeyring
2
import urllib, urllib2, json, urlparse, uuid
3
from oauth import oauth
22
5
from gtk import Builder
23
6
import gwibber.microblog
7
from gwibber.microblog import twitter
8
from gwibber.microblog.util import resources
9
from gettext import gettext as _
11
gtk.gdk.threads_init()
13
sigmeth = oauth.OAuthSignatureMethod_HMAC_SHA1()
25
15
class AccountWidget(gtk.VBox):
26
16
"""AccountWidget: A widget that provides a user interface for configuring twitter accounts in Gwibber
29
19
def __init__(self, account=None, dialog=None):
30
"""Creates the account pane for configuring twitter accounts"""
20
"""Creates the account pane for configuring Twitter accounts"""
31
21
gtk.VBox.__init__( self, False, 20 )
32
22
self.ui = gtk.Builder()
33
23
self.ui.set_translation_domain ("gwibber")
36
26
self.vbox_settings = self.ui.get_object("vbox_settings")
37
27
self.pack_start(self.vbox_settings, False, False)
40
dialog.get_object("vbox_create").show()
30
self.account = account or {}
33
if self.account.has_key("id"):
35
value = gnomekeyring.find_items_sync(gnomekeyring.ITEM_GENERIC_SECRET, {"id": str("%s/%s" % (self.account["id"], "secret_token"))})[0].secret
36
except gnomekeyring.NoMatchError:
37
has_secret_key = False
40
if self.account.has_key("access_token") and self.account.has_key("secret_token") and self.account.has_key("username") and has_secret_key:
41
self.ui.get_object("hbox_twitter_auth").hide()
42
self.ui.get_object("fb_auth_done_label").set_label(_("%s has been authorized by Twitter") % self.account["username"])
43
self.ui.get_object("hbox_twitter_auth_done").show()
45
self.ui.get_object("hbox_twitter_auth_done").hide()
46
self.ui.get_object("twitter_auth_button").modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("red"))
48
self.dialog.get_object('vbox_create').hide()
50
self.ui.get_object("hbox_twitter_auth_done").hide()
52
self.dialog.get_object("vbox_create").hide()
55
def on_twitter_auth_clicked(self, widget, data=None):
56
self.winsize = self.window.get_size()
58
web = webkit.WebView()
59
web.load_html_string(_("<p>Please wait...</p>"), "file:///")
61
self.consumer = oauth.OAuthConsumer(*resources.get_twitter_keys())
63
request = oauth.OAuthRequest.from_consumer_and_token(self.consumer, http_method="POST",
64
callback="http://gwibber.com/0/auth.html",
65
http_url="https://api.twitter.com/oauth/request_token")
67
request.sign_request(sigmeth, self.consumer, token=None)
69
tokendata = urllib2.urlopen(request.http_url, request.to_postdata()).read()
70
self.token = oauth.OAuthToken.from_string(tokendata)
72
url = "http://api.twitter.com/oauth/authorize?oauth_token=" + self.token.key
75
web.set_size_request(550, 400)
76
web.connect("title-changed", self.on_twitter_auth_title_change)
78
scroll = gtk.ScrolledWindow()
81
self.pack_start(scroll, True, True, 0)
84
self.ui.get_object("vbox1").hide()
85
self.ui.get_object("expander1").hide()
87
def on_twitter_auth_title_change(self, web=None, title=None, data=None):
88
if title.get_title() == "Success":
90
url = web.get_main_frame().get_uri()
91
data = urlparse.parse_qs(url.split("?", 1)[1])
93
token = data["oauth_token"][0]
94
verifier = data["oauth_verifier"][0]
96
request = oauth.OAuthRequest.from_consumer_and_token(
97
self.consumer, self.token,
98
http_url="https://api.twitter.com/oauth/access_token",
99
parameters={"oauth_verifier": str(verifier)})
100
request.sign_request(sigmeth, self.consumer, self.token)
102
tokendata = urllib2.urlopen(request.http_url, request.to_postdata()).read()
103
data = urlparse.parse_qs(tokendata)
105
self.account["access_token"] = data["oauth_token"][0]
106
self.account["secret_token"] = data["oauth_token_secret"][0]
107
self.account["username"] = data["screen_name"][0]
108
self.account["user_id"] = data["user_id"][0]
110
self.ui.get_object("hbox_twitter_auth").hide()
111
self.ui.get_object("fb_auth_done_label").set_label(_("%s has been authorized by Twitter") % str(self.account["username"]))
112
self.ui.get_object("hbox_twitter_auth_done").show()
113
if self.dialog and self.account.has_key("id"):
114
self.dialog.get_object("vbox_save").show()
116
self.dialog.get_object("vbox_create").show()
121
self.window.resize(*self.winsize)
122
self.ui.get_object("vbox1").show()
123
self.ui.get_object("expander1").show()
125
if title.get_title() == "Failure":
126
d = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR,
127
gtk.BUTTONS_OK, _("Authorization failed. Please try again."))
128
if d.run(): d.destroy()
131
self.window.resize(*self.winsize)