~om26er/ubuntu/maverick/gwibber/gwibber-fix-674894

« back to all changes in this revision

Viewing changes to gwibber/lib/gtk/twitter.py

  • Committer: Bazaar Package Importer
  • Author(s): Ken VanDine
  • Date: 2010-08-23 23:35:05 UTC
  • mfrom: (1.1.27 upstream)
  • Revision ID: james.westby@ubuntu.com-20100823233505-09ia0jkzi9l0ukqg
Tags: 2.31.91-0ubuntu1
* New upstream release
  - Port twitter service to OAuth, basic auth is no longer
    supported (LP: #627565)
  - Delay setting the position of the vertical splitter
  - Fix PerformOp for single operation, including delete and 
    like (LP: #616798)
  - Make the string for the Translate action i18n 
    friendly (Vadim Rutkovsky)
  - Convert identi.ca groups (!) to hashtags (#) for re-denting if 
    global_retweet is true (Vadim Rutkovsky) (LP: #539786)
  - Handle null responses gracefully (James Ogley) (LP: #623309)
  - recognize valid unicode URLs (LP: #333390)
  - Don't crash if there is an invalid value for a preference (LP: #623335)
* debian/gwibber-service.install
  - Install files needed for twitter oauth

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#
2
 
# Copyright (C) 2010 Canonical Ltd
3
 
#
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.
7
 
#
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.
12
 
#
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/>.
15
 
#
16
 
# Copyright (C) 2010 Ken VanDine <ken.vandine@canonical.com>
17
 
#
18
 
# Twitter widgets for Gwibber
19
 
#
 
1
import gtk, webkit, gnomekeyring
 
2
import urllib, urllib2, json, urlparse, uuid
 
3
from oauth import oauth
20
4
 
21
 
import gtk
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 _
 
10
 
 
11
gtk.gdk.threads_init()
 
12
 
 
13
sigmeth = oauth.OAuthSignatureMethod_HMAC_SHA1()
24
14
 
25
15
class AccountWidget(gtk.VBox):
26
16
  """AccountWidget: A widget that provides a user interface for configuring twitter accounts in Gwibber
27
17
  """
28
18
  
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)
38
28
    self.show_all()
39
 
    if dialog:
40
 
      dialog.get_object("vbox_create").show()
 
29
 
 
30
    self.account = account or {}
 
31
    self.dialog = dialog
 
32
    has_secret_key = True
 
33
    if self.account.has_key("id"):
 
34
      try:
 
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
 
38
 
 
39
    try:
 
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()
 
44
      else:
 
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"))
 
47
        if self.dialog:
 
48
          self.dialog.get_object('vbox_create').hide()
 
49
    except:
 
50
      self.ui.get_object("hbox_twitter_auth_done").hide()
 
51
      if self.dialog:
 
52
        self.dialog.get_object("vbox_create").hide()
 
53
 
 
54
 
 
55
  def on_twitter_auth_clicked(self, widget, data=None):
 
56
    self.winsize = self.window.get_size()
 
57
 
 
58
    web = webkit.WebView()
 
59
    web.load_html_string(_("<p>Please wait...</p>"), "file:///")
 
60
 
 
61
    self.consumer = oauth.OAuthConsumer(*resources.get_twitter_keys())
 
62
 
 
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")
 
66
 
 
67
    request.sign_request(sigmeth, self.consumer, token=None)
 
68
 
 
69
    tokendata = urllib2.urlopen(request.http_url, request.to_postdata()).read()
 
70
    self.token = oauth.OAuthToken.from_string(tokendata)
 
71
 
 
72
    url = "http://api.twitter.com/oauth/authorize?oauth_token=" + self.token.key
 
73
 
 
74
    web.open(url)
 
75
    web.set_size_request(550, 400)
 
76
    web.connect("title-changed", self.on_twitter_auth_title_change)
 
77
 
 
78
    scroll = gtk.ScrolledWindow()
 
79
    scroll.add(web)
 
80
 
 
81
    self.pack_start(scroll, True, True, 0)
 
82
    self.show_all()
 
83
 
 
84
    self.ui.get_object("vbox1").hide()
 
85
    self.ui.get_object("expander1").hide()
 
86
 
 
87
  def on_twitter_auth_title_change(self, web=None, title=None, data=None):
 
88
    if title.get_title() == "Success":
 
89
      try:
 
90
        url = web.get_main_frame().get_uri()
 
91
        data = urlparse.parse_qs(url.split("?", 1)[1])
 
92
        
 
93
        token = data["oauth_token"][0]
 
94
        verifier = data["oauth_verifier"][0]
 
95
 
 
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)
 
101
 
 
102
        tokendata = urllib2.urlopen(request.http_url, request.to_postdata()).read()
 
103
        data = urlparse.parse_qs(tokendata)
 
104
 
 
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]
 
109
 
 
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()
 
115
        elif self.dialog:
 
116
          self.dialog.get_object("vbox_create").show()
 
117
      except:
 
118
        pass
 
119
 
 
120
      web.hide()
 
121
      self.window.resize(*self.winsize)
 
122
      self.ui.get_object("vbox1").show()
 
123
      self.ui.get_object("expander1").show()
 
124
 
 
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()
 
129
 
 
130
      web.hide()
 
131
      self.window.resize(*self.winsize)