~ubuntu-branches/ubuntu/precise/gwibber-service-sina/precise-201203201005

« back to all changes in this revision

Viewing changes to gtk/sina/__init__.py

  • Committer: Bazaar Package Importer
  • Author(s): Ken VanDine
  • Date: 2011-06-10 09:11:33 UTC
  • Revision ID: james.westby@ubuntu.com-20110610091133-04usv8rnmraq5f4j
Tags: upstream-0.9.1
ImportĀ upstreamĀ versionĀ 0.9.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import gtk, pango, webkit, gnomekeyring
 
2
import urllib, urllib2, json, urlparse, uuid
 
3
from oauth import oauth
 
4
 
 
5
from gtk import Builder
 
6
from gwibber.microblog.util import resources
 
7
import gettext
 
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-sina')
 
12
import sina.utils
 
13
 
 
14
gtk.gdk.threads_init()
 
15
 
 
16
sigmeth = oauth.OAuthSignatureMethod_HMAC_SHA1()
 
17
 
 
18
class AccountWidget(gtk.VBox):
 
19
  """AccountWidget: A widget that provides a user interface for configuring sina accounts in Gwibber
 
20
  """
 
21
  
 
22
  def __init__(self, account=None, dialog=None):
 
23
    """Creates the account pane for configuring Sina 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-sina.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)
 
31
    self.show_all()
 
32
 
 
33
    self.account = account or {}
 
34
    self.dialog = dialog
 
35
    has_secret_key = True
 
36
    if self.account.has_key("id"):
 
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 and not self.dialog.condition:
 
44
        self.ui.get_object("hbox_sina_auth").hide()
 
45
        self.ui.get_object("sina_auth_done_label").set_label(_("%s has been authorized by Sina") % self.account["username"])
 
46
        self.ui.get_object("hbox_sina_auth_done").show()
 
47
      else:
 
48
        self.ui.get_object("hbox_sina_auth_done").hide()
 
49
        if self.dialog.ui:
 
50
          self.dialog.ui.get_object('vbox_create').hide()
 
51
    except:
 
52
      self.ui.get_object("hbox_sina_auth_done").hide()
 
53
      if self.dialog.ui:
 
54
        self.dialog.ui.get_object("vbox_create").hide()
 
55
 
 
56
 
 
57
  def on_sina_auth_clicked(self, widget, data=None):
 
58
    self.winsize = self.window.get_size()
 
59
 
 
60
    web = webkit.WebView()
 
61
    web.get_settings().set_property("enable-plugins", False)
 
62
    web.load_html_string(_("<p>Please wait...</p>"), "file:///")
 
63
 
 
64
    self.consumer = oauth.OAuthConsumer(*sina.utils.get_sina_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="http://api.t.sina.com.cn/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.t.sina.com.cn/oauth/authorize?oauth_token=" + self.token.key
 
76
 
 
77
    web.load_uri(url)
 
78
    web.set_size_request(550, 400)
 
79
    web.connect("title-changed", self.on_sina_auth_title_change)
 
80
 
 
81
    self.scroll = gtk.ScrolledWindow()
 
82
    self.scroll.add(web)
 
83
 
 
84
    self.pack_start(self.scroll, True, True, 0)
 
85
    self.show_all()
 
86
 
 
87
    self.ui.get_object("vbox1").hide()
 
88
    self.ui.get_object("vbox_advanced").hide()
 
89
    self.dialog.infobar.set_message_type(gtk.MESSAGE_INFO)
 
90
 
 
91
  def on_sina_auth_title_change(self, web=None, title=None, data=None):
 
92
    saved = False
 
93
    if title.get_title() == "Success":
 
94
 
 
95
      if hasattr(self.dialog, "infobar_content_area"):
 
96
        for child in self.dialog.infobar_content_area.get_children(): child.destroy()
 
97
      self.dialog.infobar_content_area = self.dialog.infobar.get_content_area()
 
98
      self.dialog.infobar_content_area.show()
 
99
      self.dialog.infobar.show()
 
100
 
 
101
      message_label = gtk.Label(_("Verifying"))
 
102
      message_label.set_use_markup(True)
 
103
      message_label.set_ellipsize(pango.ELLIPSIZE_END)
 
104
      self.dialog.infobar_content_area.add(message_label)
 
105
      self.dialog.infobar.show_all()
 
106
      self.scroll.hide()
 
107
      url = web.get_main_frame().get_uri()
 
108
      data = urlparse.parse_qs(url.split("?", 1)[1])
 
109
 
 
110
      self.ui.get_object("vbox1").show()
 
111
      self.ui.get_object("vbox_advanced").show()
 
112
 
 
113
      token = data["oauth_token"][0]
 
114
      verifier = data["oauth_verifier"][0]
 
115
 
 
116
      request = oauth.OAuthRequest.from_consumer_and_token(
 
117
        self.consumer, self.token, http_method="POST",
 
118
        http_url="http://api.t.sina.com.cn/oauth/access_token",
 
119
        parameters={"oauth_verifier": str(verifier)})
 
120
      request.sign_request(sigmeth, self.consumer, self.token)
 
121
 
 
122
      tokendata = urllib2.urlopen(request.http_url, request.to_postdata()).read()
 
123
      data = urlparse.parse_qs(tokendata)
 
124
 
 
125
      atok = oauth.OAuthToken.from_string(tokendata)
 
126
 
 
127
      self.account["access_token"] = data["oauth_token"][0]
 
128
      self.account["secret_token"] = data["oauth_token_secret"][0]
 
129
 
 
130
      apireq = oauth.OAuthRequest.from_consumer_and_token(
 
131
        self.consumer, atok,
 
132
        http_method="GET",
 
133
        http_url="http://api.t.sina.com.cn/account/verify_credentials.json", parameters=None)
 
134
 
 
135
      apireq.sign_request(sigmeth, self.consumer, atok)
 
136
 
 
137
      account_data = json.loads(urllib2.urlopen(apireq.to_url()).read())
 
138
 
 
139
      self.account["username"] = account_data["screen_name"]
 
140
      self.account["user_id"] = account_data["id"]
 
141
 
 
142
      if isinstance(account_data, dict):
 
143
        if account_data.has_key("id"):
 
144
          saved = self.dialog.on_edit_account_save()
 
145
        else:
 
146
          print "Failed"
 
147
          self.dialog.infobar.set_message_type(gtk.MESSAGE_ERROR)
 
148
          message_label.set_text(_("Authorization failed. Please try again.")) 
 
149
      else:
 
150
        print "Failed"
 
151
        self.dialog.infobar.set_message_type(gtk.MESSAGE_ERROR)
 
152
        message_label.set_text(_("Authorization failed. Please try again."))
 
153
 
 
154
      if saved: 
 
155
        message_label.set_text(_("Successful"))
 
156
        self.dialog.infobar.set_message_type(gtk.MESSAGE_INFO)
 
157
        #self.dialog.infobar.hide()
 
158
 
 
159
      self.ui.get_object("hbox_sina_auth").hide()
 
160
      self.ui.get_object("sina_auth_done_label").set_label(_("%s has been authorized by Sina") % str(self.account["username"]))
 
161
      self.ui.get_object("hbox_sina_auth_done").show()
 
162
      if self.dialog.ui and self.account.has_key("id") and not saved:
 
163
        self.dialog.ui.get_object("vbox_save").show()
 
164
      elif self.dialog.ui and not saved:
 
165
        self.dialog.ui.get_object("vbox_create").show()
 
166
 
 
167
    self.window.resize(*self.winsize)
 
168
 
 
169
    if title.get_title() == "Failure":
 
170
      web.hide()
 
171
      self.dialog.infobar.set_message_type(gtk.MESSAGE_ERROR)
 
172
      message_label.set_text(_("Authorization failed. Please try again."))
 
173
      self.dialog.infobar.show_all()
 
174
 
 
175
      self.ui.get_object("vbox1").show()
 
176
      self.ui.get_object("vbox_advanced").show()
 
177
      self.window.resize(*self.winsize)