Class: Flickr::OAuthClient

Inherits:
Object
  • Object
show all
Defined in:
lib/flickr/oauth_client.rb

Defined Under Namespace

Classes: FailedResponse, UnknownSignatureMethod

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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_fileObject

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_pathObject

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_certificateObject

Returns the value of attribute check_certificate.



74
75
76
# File 'lib/flickr/oauth_client.rb', line 74

def check_certificate
  @check_certificate
end

#proxyObject

Returns the value of attribute proxy.



73
74
75
# File 'lib/flickr/oauth_client.rb', line 73

def proxy
  @proxy
end

#user_agentObject

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

.authorization_header(url, params) ⇒ Object



66
67
68
69
# File 'lib/flickr/oauth_client.rb', line 66

def authorization_header(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_paramsObject



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_nonceObject



55
# File 'lib/flickr/oauth_client.rb', line 55

def gen_nonce; [OpenSSL::Random.random_bytes(32)].pack('m0').gsub(/\n$/,'') end

.gen_timestampObject



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