Class: Flickr::OAuthClient
- Inherits:
-
Object
- Object
- Flickr::OAuthClient
show all
- Defined in:
- lib/flickr/oauth_client.rb
Defined Under Namespace
Classes: FailedResponse, UnknownSignatureMethod
Instance Attribute Summary collapse
Class Method Summary
collapse
-
.authorization_header(url, params) ⇒ Object
-
.encode_value(v) ⇒ Object
-
.escape(s) ⇒ Object
-
.gen_default_params ⇒ Object
-
.gen_nonce ⇒ Object
-
.gen_timestamp ⇒ Object
-
.parse_response(text) ⇒ Object
-
.sign_hmac_sha1(method, url, params, token_secret, consumer_secret) ⇒ Object
-
.sign_plaintext(method, url, params, token_secret, consumer_secret) ⇒ Object
-
.sign_rsa_sha1(method, url, params, token_secret, consumer_secret) ⇒ Object
-
.signature_base_string(method, url, params) ⇒ Object
Instance Method Summary
collapse
-
#access_token(url, token_secret, oauth_params = {}) ⇒ Object
-
#authorize_url(url, oauth_params = {}) ⇒ Object
-
#initialize(consumer_key, consumer_secret) ⇒ OAuthClient
constructor
A new instance of OAuthClient.
-
#post_form(url, token_secret, oauth_params = {}, params = {}) ⇒ Object
-
#post_multipart(url, token_secret, oauth_params = {}, params = {}) ⇒ Object
-
#request_token(url, oauth_params = {}) ⇒ Object
Constructor Details
#initialize(consumer_key, consumer_secret) ⇒ OAuthClient
Returns a new instance of OAuthClient.
79
80
81
82
|
# File 'lib/flickr/oauth_client.rb', line 79
def initialize(consumer_key, consumer_secret)
@consumer_key, @consumer_secret = consumer_key, consumer_secret
self.proxy = nil
end
|
Instance Attribute Details
#ca_file ⇒ Object
Returns the value of attribute ca_file.
75
76
77
|
# File 'lib/flickr/oauth_client.rb', line 75
def ca_file
@ca_file
end
|
#ca_path ⇒ Object
Returns the value of attribute ca_path.
76
77
78
|
# File 'lib/flickr/oauth_client.rb', line 76
def ca_path
@ca_path
end
|
#check_certificate ⇒ Object
Returns the value of attribute check_certificate.
74
75
76
|
# File 'lib/flickr/oauth_client.rb', line 74
def check_certificate
@check_certificate
end
|
#proxy ⇒ Object
Returns the value of attribute proxy.
73
74
75
|
# File 'lib/flickr/oauth_client.rb', line 73
def proxy
@proxy
end
|
#user_agent ⇒ Object
Returns the value of attribute user_agent.
72
73
74
|
# File 'lib/flickr/oauth_client.rb', line 72
def user_agent
@user_agent
end
|
Class Method Details
66
67
68
69
|
# File 'lib/flickr/oauth_client.rb', line 66
def (url, params)
params_norm = params.map { |k, v| %(#{escape(k)}="#{escape(v)}") }.sort.join(', ')
%(OAuth realm="#{url.to_s}", #{params_norm})
end
|
.encode_value(v) ⇒ Object
17
18
19
20
|
# File 'lib/flickr/oauth_client.rb', line 17
def encode_value(v)
v = v.to_s.encode('utf-8').force_encoding('ascii-8bit') if RUBY_VERSION >= '1.9'
v.to_s
end
|
.escape(s) ⇒ Object
22
23
24
25
26
|
# File 'lib/flickr/oauth_client.rb', line 22
def escape(s)
encode_value(s).gsub(/[^a-zA-Z0-9\-\.\_\~]/) do |special|
special.unpack("C*").map { |i| sprintf("%%%02X", i) }.join
end
end
|
.gen_default_params ⇒ Object
57
58
59
60
61
62
63
64
|
# File 'lib/flickr/oauth_client.rb', line 57
def gen_default_params
{
:oauth_version => "1.0",
:oauth_signature_method => 'HMAC-SHA1',
:oauth_nonce => gen_nonce,
:oauth_timestamp => gen_timestamp,
}
end
|
.gen_nonce ⇒ Object
55
|
# File 'lib/flickr/oauth_client.rb', line 55
def gen_nonce; [OpenSSL::Random.random_bytes(32)].pack('m0').gsub(/\n$/,'') end
|
.gen_timestamp ⇒ Object
53
|
# File 'lib/flickr/oauth_client.rb', line 53
def gen_timestamp; Time.now.to_i end
|
.parse_response(text) ⇒ Object
28
|
# File 'lib/flickr/oauth_client.rb', line 28
def parse_response(text); Hash[text.split('&').map { |s| s.split('=') }] end
|
.sign_hmac_sha1(method, url, params, token_secret, consumer_secret) ⇒ Object
46
47
48
49
50
51
|
# File 'lib/flickr/oauth_client.rb', line 46
def sign_hmac_sha1(method, url, params, token_secret, consumer_secret)
text = signature_base_string(method, url, params)
key = "#{escape(consumer_secret)}&#{escape(token_secret)}"
digest = OpenSSL::Digest::SHA1.new
[OpenSSL::HMAC.digest(digest, key, text)].pack('m0').gsub(/\n$/,'')
end
|
.sign_plaintext(method, url, params, token_secret, consumer_secret) ⇒ Object
35
36
37
|
# File 'lib/flickr/oauth_client.rb', line 35
def sign_plaintext(method, url, params, token_secret, consumer_secret)
"#{escape(consumer_secret)}&#{escape(token_secret)}"
end
|
.sign_rsa_sha1(method, url, params, token_secret, consumer_secret) ⇒ Object
39
40
41
42
43
44
|
# File 'lib/flickr/oauth_client.rb', line 39
def sign_rsa_sha1(method, url, params, token_secret, consumer_secret)
text = signature_base_string(method, url, params)
key = OpenSSL::PKey::RSA.new(consumer_secret)
digest = OpenSSL::Digest::SHA1.new
[key.sign(digest, text)].pack('m0').gsub(/\n$/,'')
end
|
.signature_base_string(method, url, params) ⇒ Object
30
31
32
33
|
# File 'lib/flickr/oauth_client.rb', line 30
def signature_base_string(method, url, params)
params_norm = params.map { |k, v| "#{escape(k)}=#{escape(v)}" }.sort.join('&')
"#{method.to_s.upcase}&#{escape(url)}&#{escape(params_norm)}"
end
|
Instance Method Details
#access_token(url, token_secret, oauth_params = {}) ⇒ Object
96
97
98
99
|
# File 'lib/flickr/oauth_client.rb', line 96
def access_token(url, token_secret, oauth_params = {})
r = post_form(url, token_secret, oauth_params)
OAuthClient.parse_response(r.body)
end
|
#authorize_url(url, oauth_params = {}) ⇒ Object
89
90
91
92
93
94
|
# File 'lib/flickr/oauth_client.rb', line 89
def authorize_url(url, oauth_params = {})
params_norm = oauth_params.map { |k, v| "#{OAuthClient.escape(k)}=#{OAuthClient.escape(v)}" }.sort.join('&')
url = URI.parse(url)
url.query = url.query ? "#{url.query}&#{params_norm}" : params_norm
url.to_s
end
|
#post_form(url, token_secret, oauth_params = {}, params = {}) ⇒ Object
101
102
103
104
|
# File 'lib/flickr/oauth_client.rb', line 101
def post_form(url, token_secret, oauth_params = {}, params = {})
encoded_params = Hash[*params.map { |k, v| [OAuthClient.encode_value(k), OAuthClient.encode_value(v)]}.flatten]
post(url, token_secret, oauth_params, params) { |request| request.form_data = encoded_params }
end
|
#post_multipart(url, token_secret, oauth_params = {}, params = {}) ⇒ Object
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
# File 'lib/flickr/oauth_client.rb', line 106
def post_multipart(url, token_secret, oauth_params = {}, params = {})
post(url, token_secret, oauth_params, params) do |request|
boundary = "Flickr#{OAuthClient.gen_nonce}"
request['Content-type'] = "multipart/form-data, boundary=#{boundary}"
request.body = ''
params.each do |k, v|
if v.respond_to? :read
basename = File.basename(v.path.to_s) if v.respond_to? :path
basename ||= File.basename(v.base_uri.to_s) if v.respond_to? :base_uri
basename ||= "unknown"
request.body << "--#{boundary}\r\n" <<
"Content-Disposition: form-data; name=\"#{OAuthClient.encode_value(k)}\"; filename=\"#{OAuthClient.encode_value(basename)}\"\r\n" <<
"Content-Transfer-Encoding: binary\r\n" <<
"Content-Type: image/jpeg\r\n\r\n" <<
v.read << "\r\n"
else
request.body << "--#{boundary}\r\n" <<
"Content-Disposition: form-data; name=\"#{OAuthClient.encode_value(k)}\"\r\n\r\n" <<
"#{OAuthClient.encode_value(v)}\r\n"
end
end
request.body << "--#{boundary}--"
end
end
|
#request_token(url, oauth_params = {}) ⇒ Object
84
85
86
87
|
# File 'lib/flickr/oauth_client.rb', line 84
def request_token(url, oauth_params = {})
r = post_form(url, nil, {:oauth_callback => 'oob'}.merge(oauth_params))
OAuthClient.parse_response(r.body)
end
|