oa-oauth 0.2.5 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'http://rubygems.org'
2
+
3
+ platforms :jruby do
4
+ gem 'jruby-openssl', '~> 0.7'
5
+ end
6
+
7
+ gemspec
@@ -28,12 +28,14 @@ module OmniAuth
28
28
  autoload :Mixi, 'omniauth/strategies/mixi'
29
29
  autoload :Netflix, 'omniauth/strategies/netflix'
30
30
  autoload :Qzone, 'omniauth/strategies/qzone'
31
+ autoload :Plurk, 'omniauth/strategies/plurk'
31
32
  autoload :Rdio, 'omniauth/strategies/rdio'
32
33
  autoload :Renren, 'omniauth/strategies/renren'
33
34
  autoload :Salesforce, 'omniauth/strategies/salesforce'
34
35
  autoload :SmugMug, 'omniauth/strategies/smug_mug'
35
36
  autoload :SoundCloud, 'omniauth/strategies/sound_cloud'
36
37
  autoload :T163, 'omniauth/strategies/t163'
38
+ autoload :TB, 'omniauth/strategies/taobao'
37
39
  autoload :Teambox, 'omniauth/strategies/teambox'
38
40
  autoload :ThirtySevenSignals, 'omniauth/strategies/thirty_seven_signals'
39
41
  autoload :Tqq, 'omniauth/strategies/tqq'
@@ -49,5 +51,6 @@ module OmniAuth
49
51
  autoload :Yahoo, 'omniauth/strategies/yahoo'
50
52
  autoload :Yammer, 'omniauth/strategies/yammer'
51
53
  autoload :YouTube, 'omniauth/strategies/you_tube'
54
+ autoload :Mailru, 'omniauth/strategies/mailru'
52
55
  end
53
56
  end
@@ -45,7 +45,7 @@ module OmniAuth
45
45
 
46
46
  def user_info
47
47
  {
48
- 'nickname' => user_data["link"].split('/').last,
48
+ 'nickname' => user_data["username"],
49
49
  'email' => (user_data["email"] if user_data["email"]),
50
50
  'first_name' => user_data["first_name"],
51
51
  'last_name' => user_data["last_name"],
@@ -20,9 +20,9 @@ module OmniAuth
20
20
  :authorize_path => '/accounts/OAuthAuthorizeToken'
21
21
  }
22
22
 
23
- google_contacts_auth = "http://www.google.com/m8/feeds"
23
+ google_contacts_auth = "www.google.com/m8/feeds"
24
24
  options[:scope] ||= google_contacts_auth
25
- options[:scope] << " #{google_contacts_auth}" unless options[:scope].include?(google_contacts_auth)
25
+ options[:scope] << " http://#{google_contacts_auth}" unless options[:scope] =~ %r[http[s]?:\/\/#{google_contacts_auth}]
26
26
 
27
27
  super(app, :google, consumer_key, consumer_secret, client_options, options)
28
28
  end
@@ -30,6 +30,14 @@ module OmniAuth
30
30
  @data ||= MultiJson.decode(@access_token.get("/users/me.json"))
31
31
  end
32
32
 
33
+ def refresh_token
34
+ @refresh_token ||= @access_token.refresh_token
35
+ end
36
+
37
+ def token_expires_at
38
+ @expires_at ||= @access_token.expires_at
39
+ end
40
+
33
41
  def request_phase
34
42
  options[:scope] ||= "read"
35
43
  super
@@ -56,7 +64,7 @@ module OmniAuth
56
64
  OmniAuth::Utils.deep_merge(super, {
57
65
  'uid' => user_data["url"].split('/').last,
58
66
  'user_info' => user_info,
59
- 'extra' => {'user_hash' => user_data}
67
+ 'extra' => {'user_hash' => user_data, 'refresh_token' => refresh_token, 'token_expires_at' => token_expires_at}
60
68
  })
61
69
  end
62
70
  end
@@ -28,26 +28,27 @@ module OmniAuth
28
28
  end
29
29
 
30
30
  def user_hash(access_token)
31
- person = MulitXml.parse(@access_token.get('/v1/people/~:(id,first-name,last-name,headline,member-url-resources,picture-url,location,public-profile-url)').body).xpath('person')
31
+ person = MultiXml.parse(@access_token.get('/v1/people/~:(id,first-name,last-name,headline,member-url-resources,picture-url,location,public-profile-url)').body)['person']
32
32
 
33
33
  hash = {
34
- 'id' => person.xpath('id').text,
35
- 'first_name' => person.xpath('first-name').text,
36
- 'last_name' => person.xpath('last-name').text,
37
- 'nickname' => person.xpath('public-profile-url').text.split('/').last,
38
- 'location' => person.xpath('location/name').text,
39
- 'image' => person.xpath('picture-url').text,
40
- 'description' => person.xpath('headline').text,
41
- 'public_profile_url' => person.xpath('public-profile-url').text,
42
- 'urls' => person.css('member-url-resources member-url').inject({}) do |h,element|
43
- h[element.xpath('name').text] = element.xpath('url').text
44
- h
45
- end
34
+ 'id' => person['id'],
35
+ 'first_name' => person['first_name'],
36
+ 'last_name' => person['last_name'],
37
+ 'nickname' => person['public_profile_url'].split('/').last,
38
+ 'location' => person['location']['name'],
39
+ 'image' => person['picture_url'],
40
+ 'description' => person['headline'],
41
+ 'public_profile_url' => person['public_profile_url']
46
42
  }
47
-
48
- hash['urls']['LinkedIn'] = person.xpath('public-profile-url').text
43
+ hash['urls']={}
44
+ member_urls = person['member_url_resources']['member_url']
45
+ if (!member_urls.nil?) and (!member_urls.empty?)
46
+ [member_urls].flatten.each do |url|
47
+ hash['urls']["#{url['name']}"]=url['url']
48
+ end
49
+ end
50
+ hash['urls']['LinkedIn'] = person['public_profile_url']
49
51
  hash['name'] = "#{hash['first_name']} #{hash['last_name']}"
50
-
51
52
  hash
52
53
  end
53
54
  end
@@ -0,0 +1,107 @@
1
+ require 'omniauth/oauth'
2
+ require 'multi_json'
3
+
4
+ module OmniAuth
5
+ module Strategies
6
+ #
7
+ # Authenticate to Vkontakte utilizing OAuth 2.0 and retrieve
8
+ # basic user information.
9
+ # documentation available here:
10
+ # http://api.mail.ru/docs/guides/oauth/sites/
11
+ #
12
+ # @example Basic Usage
13
+ # use OmniAuth::Strategies::Mailru, 'API Key', 'Secret Key', :private_key => 'Private Key'
14
+ class Mailru < OAuth2
15
+ # @param [Rack Application] app standard middleware application parameter
16
+ # @param [String] api_key the application id as [registered in Mailru]
17
+ # @param [String] secret_key the application secret as [registered in Mailru]
18
+ def initialize(app, api_key = nil, secret_key = nil, options = {}, &block)
19
+ client_options = {
20
+ :site => 'https://connect.mail.ru',
21
+ :authorize_path => '/oauth/authorize',
22
+ :access_token_path => '/oauth/token'
23
+ }
24
+
25
+ @private_key = options[:private_key]
26
+
27
+ super(app, :mailru, api_key, secret_key, client_options, options, &block)
28
+ end
29
+
30
+ protected
31
+
32
+ def request_phase
33
+ options[:response_type] ||= 'code'
34
+ super
35
+ end
36
+
37
+ def calculate_signature(params)
38
+ str = params['uids'] + (params.sort.collect { |c| "#{c[0]}=#{c[1]}" }).join('') + @private_key
39
+ Digest::MD5.hexdigest(str)
40
+ end
41
+
42
+ def user_data
43
+ request_params = {
44
+ 'method' => 'users.getInfo',
45
+ 'app_id' => client_id,
46
+ 'session_key' => @access_token.token,
47
+ 'uids' => @access_token['x_mailru_vid']
48
+ }
49
+
50
+ request_params.merge!('sig' => calculate_signature(request_params))
51
+ @data ||= MultiJson.decode(client.request(:get, 'http://www.appsmail.ru/platform/api', request_params))[0]
52
+ end
53
+
54
+ #"uid": "15410773191172635989",
55
+ #"first_name": "Евгений",
56
+ #"last_name": "Маслов",
57
+ #"nick": "maslov",
58
+ #"sex": 0,
59
+ #"birthday": "15.02.1980",
60
+ #"has_pic": 1,
61
+ #"pic": "http://avt.appsmail.ru/mail/emaslov/_avatar",
62
+ #"pic_small": "http://avt.appsmail.ru/mail/emaslov/_avatarsmall",
63
+ #"pic_big": "http://avt.appsmail.ru/mail/emaslov/_avatarbig",
64
+ #"link": "http://my.mail.ru/mail/emaslov/",
65
+ #"referer_type": "",
66
+ #"referer_id": "",
67
+ #"is_online": 1,
68
+ #"vip" : 1,
69
+ #"location": {
70
+ # "country": {
71
+ # "name": "Россия",
72
+ # "id": "24"
73
+ # },
74
+ # "city": {
75
+ # "name": "Москва",
76
+ # "id": "25"
77
+ # },
78
+ # "region": {
79
+ # "name": "Москва",
80
+ # "id": "999999"
81
+ # }
82
+ #}
83
+
84
+ def user_info
85
+ {
86
+ 'nickname' => user_data['nick'],
87
+ 'email' => user_data['email'],
88
+ 'first_name' => user_data["first_name"],
89
+ 'last_name' => user_data["last_name"],
90
+ 'name' => "#{user_data['first_name']} #{user_data['last_name']}",
91
+ 'image' => @data['pic'],
92
+ 'urls' => {
93
+ 'Mailru' => user_data["link"]
94
+ }
95
+ }
96
+ end
97
+
98
+ def auth_hash
99
+ OmniAuth::Utils.deep_merge(super, {
100
+ 'uid' => user_data['uid'],
101
+ 'user_info' => user_info,
102
+ 'extra' => {'user_hash' => user_data}
103
+ })
104
+ end
105
+ end
106
+ end
107
+ end
@@ -31,15 +31,13 @@ module OmniAuth
31
31
  request_token = consumer.get_request_token(:oauth_callback => callback_url)
32
32
  session['oauth'] ||= {}
33
33
  session['oauth'][name.to_s] = {'callback_confirmed' => request_token.callback_confirmed?, 'request_token' => request_token.token, 'request_secret' => request_token.secret}
34
- r = Rack::Response.new
35
34
 
36
35
  if request_token.callback_confirmed?
37
- r.redirect(request_token.authorize_url(options[:authorize_params]))
36
+ redirect request_token.authorize_url(options[:authorize_params])
38
37
  else
39
- r.redirect(request_token.authorize_url(options[:authorize_params].merge(:oauth_callback => callback_url)))
38
+ redirect request_token.authorize_url(options[:authorize_params].merge(:oauth_callback => callback_url))
40
39
  end
41
40
 
42
- r.finish
43
41
  rescue ::Timeout::Error => e
44
42
  fail!(:timeout, e)
45
43
  end
@@ -49,7 +49,7 @@ module OmniAuth
49
49
  end
50
50
 
51
51
  def callback_url
52
- full_host + callback_path
52
+ full_host + script_name + callback_path
53
53
  end
54
54
 
55
55
  protected
@@ -64,22 +64,15 @@ module OmniAuth
64
64
  end
65
65
 
66
66
  @access_token = build_access_token
67
-
68
- if @access_token.expires? && @access_token.expires_in <= 0
69
- client.request(:post, client.access_token_url, {
70
- 'client_id' => client_id,
71
- 'grant_type' => 'refresh_token',
72
- 'client_secret' => client_secret,
73
- 'refresh_token' => @access_token.refresh_token
74
- }.merge(options))
75
- @access_token = client.web_server.get_access_token(verifier, {:redirect_uri => callback_url}.merge(options))
76
- end
67
+ @access_token = client.web_server.refresh_access_token(@access_token.refresh_token) if @access_token.expired?
77
68
 
78
69
  super
79
70
  rescue ::OAuth2::HTTPError, ::OAuth2::AccessDenied, CallbackError => e
80
71
  fail!(:invalid_credentials, e)
81
72
  rescue ::MultiJson::DecodeError => e
82
73
  fail!(:invalid_response, e)
74
+ rescue ::Timeout::Error, ::Errno::ETIMEDOUT => e
75
+ fail!(:timeout, e)
83
76
  end
84
77
 
85
78
  def build_access_token
@@ -89,7 +82,7 @@ module OmniAuth
89
82
 
90
83
  def auth_hash
91
84
  credentials = {'token' => @access_token.token}
92
- credentials.merge('refresh_token' => @access_token.refresh_token) if @access_token.expires?
85
+ credentials.merge!('refresh_token' => @access_token.refresh_token) if @access_token.expires?
93
86
 
94
87
  OmniAuth::Utils.deep_merge(super, {'credentials' => credentials})
95
88
  end
@@ -0,0 +1,58 @@
1
+ require 'omniauth/oauth'
2
+ require 'multi_json'
3
+
4
+ module OmniAuth
5
+ module Strategies
6
+ #
7
+ # Authenticate to Plurk via OAuth and retrieve basic user info.
8
+ #
9
+ # Please note that this strategy relies on Plurk API 2.0,
10
+ # which is still in Beta.
11
+ #
12
+ # Usage:
13
+ # use OmniAuth::Strategies::Plurk
14
+ class Plurk < OmniAuth::Strategies::OAuth
15
+
16
+ # @param [Rack Application] app standard middleware application parameter
17
+ # @param [String] client_key App key [registered on plurk] (http://www.plurk.com/PlurkApp/register)
18
+ # @param [String] client_secret App secret registered on plurk
19
+ def initialize(app, client_key = nil, client_secret = nil, options = {}, &block)
20
+ client_options = { :site => 'http://www.plurk.com',
21
+ :request_token_path => '/OAuth/request_token',
22
+ :access_token_path => '/OAuth/access_token',
23
+ :authorize_path => '/OAuth/authorize' }
24
+
25
+ super(app, :plurk, client_key, client_secret, client_options, options)
26
+ end
27
+
28
+ def auth_hash
29
+ user = self.user_hash
30
+ OmniAuth::Utils.deep_merge(super, {
31
+ 'uid' => user['id'],
32
+ 'user_info' => user_info,
33
+ 'extra' => {'user_hash' => user_hash}
34
+ })
35
+ end
36
+
37
+ def user_info
38
+ user = self.user_hash
39
+ {
40
+ 'name' => user['full_name'],
41
+ 'nickname' => user['display_name'] || user['nick_name'],
42
+ 'location' => user['location'],
43
+ 'image' => if user['has_profile_image'] == 1
44
+ "http://avatars.plurk.com/#{user['id']}-medium#{user['avatar']}.gif"
45
+ else
46
+ "http://www.plurk.com/static/default_medium.gif"
47
+ end,
48
+ 'urls' => { 'Plurk' => 'http://plurk.com/' + user['nick_name']}
49
+ }
50
+ end
51
+
52
+ def user_hash
53
+ @user_hash ||= MultiJson.decode(@access_token.get('/APP/Profile/getOwnProfile').body)['user_info']
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,79 @@
1
+ require 'omniauth/oauth'
2
+ require 'multi_json'
3
+ require 'digest/md5'
4
+ require 'net/http'
5
+
6
+ module OmniAuth
7
+ module Strategies
8
+ # Authenticate to Renren utilizing OAuth 2.0 and retrieve
9
+ # basic user information.
10
+ #
11
+ # @example Basic Usage
12
+ # use OmniAuth::Strategies::TB, 'client_id', 'client_secret'
13
+ class TB < OAuth2
14
+ # @param [Rack Application] app standard middleware application parameter
15
+ # @param [String] client_id the app key at taobao open platform
16
+ # @param [String] client_secret the app secret at taobao open platform
17
+ # @option options [String]
18
+
19
+ def initialize(app, client_id = nil, client_secret = nil, options = {}, &block)
20
+ client_options = {
21
+ :site => "https://oauth.taobao.com/",
22
+ :authorize_url => "/authorize",
23
+ :access_token_url => "/token"
24
+ }
25
+
26
+ super(app, :tb, client_id, client_secret, client_options, options, &block)
27
+ end
28
+
29
+ def user_data
30
+ # TODO to be moved in options
31
+ url = 'http://gw.api.taobao.com/router/rest'
32
+
33
+ query_param = {
34
+ :app_key => client_id,
35
+
36
+ # TODO to be moved in options
37
+ # TODO add more default fields (http://my.open.taobao.com/apidoc/index.htm#categoryId:1-dataStructId:3)
38
+ :fields => 'user_id,uid,nick,sex,buyer_credit,seller_credit,location,created,last_visit,birthday,type,status,alipay_no,alipay_account,alipay_account,email,consumer_protection,alipay_bind',
39
+ :format => 'json',
40
+ :method => 'taobao.user.get',
41
+ :session => @access_token.token,
42
+ :sign_method => 'md5',
43
+ :timestamp => Time.now.strftime("%Y-%m-%d %H:%M:%S"),
44
+ :v => '2.0'
45
+ }
46
+ query_param = generate_sign(query_param)
47
+ res = Net::HTTP.post_form(URI.parse(url), query_param)
48
+ @data ||= MultiJson.decode(res.body)["user_get_response"]["user"]
49
+ end
50
+
51
+ def request_phase
52
+ options[:state] ||= '1'
53
+ super
54
+ end
55
+
56
+ def user_info
57
+ {
58
+ 'name' => user_data["nick"],
59
+ 'email' => (user_data["email"] if user_data["email"]),
60
+ }
61
+ end
62
+
63
+ def auth_hash
64
+ OmniAuth::Utils.deep_merge(super, {
65
+ 'uid' => user_data['uid'],
66
+ 'user_info' => user_info,
67
+ 'extra' => {'user_hash' => user_data}
68
+ })
69
+ end
70
+
71
+ def generate_sign(params)
72
+ str = client_secret + (params.sort.collect { |k, v| "#{k}#{v}" }).join + client_secret
73
+ params["sign"] = Digest::MD5.hexdigest(str).upcase!
74
+ params
75
+ end
76
+
77
+ end
78
+ end
79
+ end
@@ -29,17 +29,19 @@ module OmniAuth
29
29
 
30
30
  def user_data
31
31
  # http://vkontakte.ru/developers.php?o=-17680044&p=Description+of+Fields+of+the+fields+Parameter
32
- @fields ||= ['uid', 'first_name', 'last_name', 'nickname', 'domain', 'sex', 'city', 'country', 'timezone', 'photo', 'photo_big']
32
+ @fields ||= ['uid', 'first_name', 'last_name', 'nickname', 'domain', 'sex', 'bdate', 'city', 'country', 'timezone', 'photo', 'photo_big']
33
33
 
34
34
  # http://vkontakte.ru/developers.php?o=-1&p=getProfiles
35
35
  @data ||= MultiJson.decode(@access_token.get("https://api.vkontakte.ru/method/getProfiles?uid=#{@access_token['user_id']}&fields=#{@fields.join(',')}&access_token=#{@access_token.token}"))['response'][0]
36
36
 
37
37
  # we need these 2 additional requests since vkontakte returns only ids of the City and Country
38
38
  # http://vkontakte.ru/developers.php?o=-17680044&p=getCities
39
- @city ||= MultiJson.decode(@access_token.get("https://api.vkontakte.ru/method/getCities?cids=#{@data['city']}&access_token=#{@access_token.token}"))['response'][0]['name']
39
+ cities = MultiJson.decode(@access_token.get("https://api.vkontakte.ru/method/getCities?cids=#{@data['city']}&access_token=#{@access_token.token}"))['response']
40
+ @city ||= cities.first['name'] if cities && cities.first
40
41
 
41
42
  # http://vkontakte.ru/developers.php?o=-17680044&p=getCountries
42
- @country ||= MultiJson.decode(@access_token.get("https://api.vkontakte.ru/method/getCountries?cids=#{@data['country']}&access_token=#{@access_token}"))['response'][0]['name']
43
+ countries = MultiJson.decode(@access_token.get("https://api.vkontakte.ru/method/getCountries?cids=#{@data['country']}&access_token=#{@access_token}"))['response']
44
+ @country ||= countries.first['name'] if countries && countries.first
43
45
  end
44
46
 
45
47
  def request_phase
@@ -49,10 +51,11 @@ module OmniAuth
49
51
 
50
52
  def user_info
51
53
  {
52
- 'firstname' => @data['first_name'],
54
+ 'first_name' => @data['first_name'],
53
55
  'last_name' => @data['last_name'],
54
56
  'name' => "#{@data['first_name']} #{@data['last_name']}",
55
57
  'nickname' => @data['nickname'],
58
+ 'birth_date' => @data['bdate'],
56
59
  'image' => @data['photo'],
57
60
  'location' => "#{@country}, #{@city}",
58
61
  'urls' => {
@@ -7,7 +7,7 @@ module OmniAuth
7
7
  MINOR = 2
8
8
  end
9
9
  unless defined?(::OmniAuth::Version::PATCH)
10
- PATCH = 5
10
+ PATCH = 6
11
11
  end
12
12
  unless defined?(::OmniAuth::Version::PRE)
13
13
  PRE = nil
@@ -3,7 +3,6 @@ require File.expand_path('../lib/omniauth/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
5
  gem.add_runtime_dependency 'faraday', '~> 0.6.1'
6
- gem.add_runtime_dependency 'jruby-openssl', '~> 0.7.3' if RUBY_PLATFORM == 'java'
7
6
  gem.add_runtime_dependency 'multi_json', '~> 1.0.0'
8
7
  gem.add_runtime_dependency 'multi_xml', '~> 0.2.2'
9
8
  gem.add_runtime_dependency 'oa-core', OmniAuth::Version::STRING
@@ -16,7 +15,7 @@ Gem::Specification.new do |gem|
16
15
  gem.add_development_dependency 'rspec', '~> 2.5'
17
16
  gem.add_development_dependency 'simplecov', '~> 0.4'
18
17
  gem.add_development_dependency 'webmock', '~> 1.6'
19
- gem.add_development_dependency 'yard', '~> 0.6'
18
+ gem.add_development_dependency 'yard', '~> 0.7'
20
19
  gem.add_development_dependency 'ZenTest', '~> 4.5'
21
20
  gem.name = 'oa-oauth'
22
21
  gem.version = OmniAuth::Version::STRING
@@ -0,0 +1,5 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe OmniAuth::Strategies::Mailru do
4
+ it_should_behave_like "an oauth2 strategy"
5
+ end
@@ -0,0 +1,5 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe OmniAuth::Strategies::Plurk do
4
+ it_should_behave_like 'an oauth strategy'
5
+ end
@@ -0,0 +1,5 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe OmniAuth::Strategies::TB do
4
+ it_should_behave_like "an oauth2 strategy"
5
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: oa-oauth
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.5
5
+ version: 0.2.6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Michael Bleigh
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2011-04-29 00:00:00 Z
14
+ date: 2011-05-20 00:00:00 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: faraday
@@ -54,7 +54,7 @@ dependencies:
54
54
  requirements:
55
55
  - - "="
56
56
  - !ruby/object:Gem::Version
57
- version: 0.2.5
57
+ version: 0.2.6
58
58
  type: :runtime
59
59
  version_requirements: *id004
60
60
  - !ruby/object:Gem::Dependency
@@ -164,7 +164,7 @@ dependencies:
164
164
  requirements:
165
165
  - - ~>
166
166
  - !ruby/object:Gem::Version
167
- version: "0.6"
167
+ version: "0.7"
168
168
  type: :development
169
169
  version_requirements: *id014
170
170
  - !ruby/object:Gem::Dependency
@@ -192,6 +192,7 @@ files:
192
192
  - .gemtest
193
193
  - .rspec
194
194
  - .yardopts
195
+ - Gemfile
195
196
  - LICENSE
196
197
  - README.rdoc
197
198
  - Rakefile
@@ -215,12 +216,14 @@ files:
215
216
  - lib/omniauth/strategies/instagram.rb
216
217
  - lib/omniauth/strategies/instapaper.rb
217
218
  - lib/omniauth/strategies/linked_in.rb
219
+ - lib/omniauth/strategies/mailru.rb
218
220
  - lib/omniauth/strategies/meetup.rb
219
221
  - lib/omniauth/strategies/miso.rb
220
222
  - lib/omniauth/strategies/mixi.rb
221
223
  - lib/omniauth/strategies/netflix.rb
222
224
  - lib/omniauth/strategies/oauth.rb
223
225
  - lib/omniauth/strategies/oauth2.rb
226
+ - lib/omniauth/strategies/plurk.rb
224
227
  - lib/omniauth/strategies/qzone.rb
225
228
  - lib/omniauth/strategies/rdio.rb
226
229
  - lib/omniauth/strategies/renren.rb
@@ -228,6 +231,7 @@ files:
228
231
  - lib/omniauth/strategies/smug_mug.rb
229
232
  - lib/omniauth/strategies/sound_cloud.rb
230
233
  - lib/omniauth/strategies/t163.rb
234
+ - lib/omniauth/strategies/taobao.rb
231
235
  - lib/omniauth/strategies/teambox.rb
232
236
  - lib/omniauth/strategies/thirty_seven_signals.rb
233
237
  - lib/omniauth/strategies/tqq.rb
@@ -263,16 +267,19 @@ files:
263
267
  - spec/omniauth/strategies/hyves_spec.rb
264
268
  - spec/omniauth/strategies/identica_spec.rb
265
269
  - spec/omniauth/strategies/linked_in_spec.rb
270
+ - spec/omniauth/strategies/mailru_spec.rb
266
271
  - spec/omniauth/strategies/meetup_spec.rb
267
272
  - spec/omniauth/strategies/miso_spec.rb
268
273
  - spec/omniauth/strategies/netflix_spec.rb
269
274
  - spec/omniauth/strategies/oauth2_spec.rb
270
275
  - spec/omniauth/strategies/oauth_spec.rb
276
+ - spec/omniauth/strategies/plurk_spec.rb
271
277
  - spec/omniauth/strategies/rdio_spec.rb
272
278
  - spec/omniauth/strategies/salesforce_spec.rb
273
279
  - spec/omniauth/strategies/smug_mug_spec.rb
274
280
  - spec/omniauth/strategies/sound_cloud_spec.rb
275
281
  - spec/omniauth/strategies/t163_spec.rb
282
+ - spec/omniauth/strategies/taobao_spec.rb
276
283
  - spec/omniauth/strategies/teambox_spec.rb
277
284
  - spec/omniauth/strategies/thirty_seven_signals_spec.rb
278
285
  - spec/omniauth/strategies/trade_me_spec.rb
@@ -311,7 +318,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
311
318
  requirements: []
312
319
 
313
320
  rubyforge_project:
314
- rubygems_version: 1.7.2
321
+ rubygems_version: 1.8.2
315
322
  signing_key:
316
323
  specification_version: 3
317
324
  summary: OAuth strategies for OmniAuth.
@@ -333,16 +340,19 @@ test_files:
333
340
  - spec/omniauth/strategies/hyves_spec.rb
334
341
  - spec/omniauth/strategies/identica_spec.rb
335
342
  - spec/omniauth/strategies/linked_in_spec.rb
343
+ - spec/omniauth/strategies/mailru_spec.rb
336
344
  - spec/omniauth/strategies/meetup_spec.rb
337
345
  - spec/omniauth/strategies/miso_spec.rb
338
346
  - spec/omniauth/strategies/netflix_spec.rb
339
347
  - spec/omniauth/strategies/oauth2_spec.rb
340
348
  - spec/omniauth/strategies/oauth_spec.rb
349
+ - spec/omniauth/strategies/plurk_spec.rb
341
350
  - spec/omniauth/strategies/rdio_spec.rb
342
351
  - spec/omniauth/strategies/salesforce_spec.rb
343
352
  - spec/omniauth/strategies/smug_mug_spec.rb
344
353
  - spec/omniauth/strategies/sound_cloud_spec.rb
345
354
  - spec/omniauth/strategies/t163_spec.rb
355
+ - spec/omniauth/strategies/taobao_spec.rb
346
356
  - spec/omniauth/strategies/teambox_spec.rb
347
357
  - spec/omniauth/strategies/thirty_seven_signals_spec.rb
348
358
  - spec/omniauth/strategies/trade_me_spec.rb
@@ -358,4 +368,3 @@ test_files:
358
368
  - spec/omniauth/strategies/you_tube_spec.rb
359
369
  - spec/spec_helper.rb
360
370
  - spec/support/shared_examples.rb
361
- has_rdoc: