~pablo-a-saavedra/gwibber/yammer-integration

« back to all changes in this revision

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

  • Committer: Ken VanDine
  • Date: 2010-09-01 01:56:24 UTC
  • mfrom: (738.1.4 gwibber-2.30-oauth)
  • Revision ID: ken.vandine@canonical.com-20100901015624-kjxjz78ozdd3dt42
Tags: 2.30.2
Merged twitter/oauth branch

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
 
4
import string
20
5
 
21
 
import gtk
22
6
from gtk import Builder
23
7
import gwibber.microblog
 
8
from gwibber.microblog import twitter
 
9
from gwibber.microblog.util import resources
 
10
from gettext import gettext as _
 
11
 
 
12
gtk.gdk.threads_init()
 
13
 
 
14
sigmeth = oauth.OAuthSignatureMethod_HMAC_SHA1()
24
15
 
25
16
class AccountWidget(gtk.VBox):
26
17
  """AccountWidget: A widget that provides a user interface for configuring twitter accounts in Gwibber
27
18
  """
28
19
  
29
20
  def __init__(self, account=None, dialog=None):
30
 
    """Creates the account pane for configuring twitter accounts"""
 
21
    """Creates the account pane for configuring Twitter accounts"""
31
22
    gtk.VBox.__init__( self, False, 20 )
32
23
    self.ui = gtk.Builder()
33
24
    self.ui.set_translation_domain ("gwibber")
35
26
    self.ui.connect_signals(self)
36
27
    self.vbox_settings = self.ui.get_object("vbox_settings")
37
28
    self.pack_start(self.vbox_settings, False, False)
38
 
    self.vbox_settings.show_all()
39
 
    if dialog:
40
 
      dialog.get_object("vbox_create").show()
 
29
    self.show_all()
 
30
 
 
31
    self.account = account or {}
 
32
    self.dialog = dialog
 
33
    has_secret_key = True
 
34
    self.is_new = True
 
35
    if self.account.has_key("_id"):
 
36
      self.is_new = False
 
37
      try:
 
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
 
41
 
 
42
    try:
 
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:
 
44
        self.ui.get_object("hbox_twitter_auth").hide()
 
45
        self.ui.get_object("fb_auth_done_label").set_label(_("%s has been authorized by Twitter") % self.account["username"])
 
46
        self.ui.get_object("hbox_twitter_auth_done").show()
 
47
      else:
 
48
        self.ui.get_object("hbox_twitter_auth_done").hide()
 
49
        self.ui.get_object("twitter_auth_button").modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("red"))
 
50
        if self.dialog:
 
51
          self.dialog.get_object('vbox_create').hide()
 
52
    except:
 
53
      self.ui.get_object("hbox_twitter_auth_done").hide()
 
54
      if self.dialog:
 
55
        self.dialog.get_object("vbox_create").hide()
 
56
 
 
57
 
 
58
  def on_twitter_auth_clicked(self, widget, data=None):
 
59
    self.winsize = self.window.get_size()
 
60
 
 
61
    web = webkit.WebView()
 
62
    web.load_html_string(_("<p>Please wait...</p>"), "file:///")
 
63
 
 
64
    self.consumer = oauth.OAuthConsumer(*resources.get_twitter_keys())
 
65
 
 
66
    request = oauth.OAuthRequest.from_consumer_and_token(self.consumer, http_method="POST",
 
67
        callback="http://gwibber.com/0/auth.html",
 
68
        http_url="https://api.twitter.com/oauth/request_token")
 
69
 
 
70
    request.sign_request(sigmeth, self.consumer, token=None)
 
71
 
 
72
    tokendata = urllib2.urlopen(request.http_url, request.to_postdata()).read()
 
73
    self.token = oauth.OAuthToken.from_string(tokendata)
 
74
 
 
75
    url = "http://api.twitter.com/oauth/authorize?oauth_token=" + self.token.key
 
76
 
 
77
    web.open(url)
 
78
    web.set_size_request(550, 400)
 
79
    web.connect("title-changed", self.on_twitter_auth_title_change)
 
80
 
 
81
    scroll = gtk.ScrolledWindow()
 
82
    scroll.add(web)
 
83
 
 
84
    self.pack_start(scroll, True, True, 0)
 
85
    self.show_all()
 
86
 
 
87
    self.ui.get_object("vbox1").hide()
 
88
    self.ui.get_object("expander1").hide()
 
89
 
 
90
  def on_twitter_auth_title_change(self, web=None, title=None, data=None):
 
91
    if title.get_title() == "Success":
 
92
      try:
 
93
        url = web.get_main_frame().get_uri()
 
94
        data = urlparse.parse_qs(url.split("?", 1)[1])
 
95
      
 
96
        token = data["oauth_token"][0]
 
97
        verifier = data["oauth_verifier"][0]
 
98
 
 
99
        request = oauth.OAuthRequest.from_consumer_and_token(
 
100
          self.consumer, self.token,
 
101
          http_url="https://api.twitter.com/oauth/access_token",
 
102
          parameters={"oauth_verifier": str(verifier)})
 
103
        request.sign_request(sigmeth, self.consumer, self.token)
 
104
 
 
105
        tokendata = urllib2.urlopen(request.http_url, request.to_postdata()).read()
 
106
        data = urlparse.parse_qs(tokendata)
 
107
 
 
108
        self.account["access_token"] = data["oauth_token"][0]
 
109
        self.account["username"] = data["screen_name"][0]
 
110
        self.account["user_id"] = data["user_id"][0]
 
111
 
 
112
        if "_id" not in self.account:
 
113
          valid = string.ascii_letters + string.digits + "-"
 
114
          aId = "twitter-%s" % self.account["username"]
 
115
          self.account["_id"] = "".join((x for x in aId if x in valid)).lower()
 
116
 
 
117
        self.account["secret_token"] = ":KEYRING:%s" % \
 
118
          gnomekeyring.item_create_sync(
 
119
            gnomekeyring.get_default_keyring_sync(),
 
120
            gnomekeyring.ITEM_GENERIC_SECRET,
 
121
            "Gwibber pref: %s/%s" % (self.account["_id"], "secret_token"),
 
122
            {"id": str("%s/%s" % (self.account["_id"], "secret_token"))},
 
123
           str(data["oauth_token_secret"][0]), True)
 
124
 
 
125
        if self.account.has_key("password"): self.account["password"] = "DELETED"
 
126
 
 
127
        self.ui.get_object("hbox_twitter_auth").hide()
 
128
        self.ui.get_object("fb_auth_done_label").set_label(_("%s has been authorized by Twitter") % str(self.account["username"]))
 
129
        self.ui.get_object("hbox_twitter_auth_done").show()
 
130
        if self.dialog and self.is_new:
 
131
          self.dialog.get_object("vbox_create").show()
 
132
        elif self.dialog:
 
133
          self.dialog.get_object("vbox_save").show()
 
134
      except:
 
135
        pass
 
136
 
 
137
      web.hide()
 
138
      self.window.resize(*self.winsize)
 
139
      self.ui.get_object("vbox1").show()
 
140
      self.ui.get_object("expander1").show()
 
141
 
 
142
    if title.get_title() == "Failure":
 
143
      d = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR,
 
144
        gtk.BUTTONS_OK, _("Authorization failed. Please try again."))
 
145
      if d.run(): d.destroy()
 
146
 
 
147
      web.hide()
 
148
      self.window.resize(*self.winsize)