Completed
Push — master ( b7118a...c3970f )
by John
01:10
created

Client.set_oauth2_client()   A

Complexity

Conditions 3

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 3
dl 0
loc 9
rs 9.6666
1
require 'base64'
2
require 'faraday'
3
require 'faraday_middleware'
4
require 'faraday_middleware/oauth2_refresh'
5
require 'oauth2'
6
7
module RingCentralSdk::REST
8
  class Client
9
10
    ACCESS_TOKEN_TTL  = 600             # 10 minutes
11
    REFRESH_TOKEN_TTL = 36000           # 10 hours
12
    REFRESH_TOKEN_TTL_REMEMBER = 604800 # 1 week
13
    ACCOUNT_PREFIX    = '/account/'
14
    ACCOUNT_ID        = '~'
15
    AUTHZ_ENDPOINT    = '/restapi/oauth/authorize'
16
    TOKEN_ENDPOINT    = '/restapi/oauth/token'
17
    REVOKE_ENDPOINT   = '/restapi/oauth/revoke'
18
    API_VERSION       = 'v1.0'
19
    URL_PREFIX        = '/restapi'
20
21
    attr_accessor :server_url
22
23
    attr_reader   :http
24
    attr_reader   :oauth2client
25
    attr_reader   :token
26
    attr_reader   :user_agent
27
    attr_reader   :redirect_uri
28
29
    attr_reader   :messages
30
31
    def initialize(app_key, app_secret, server_url=RingCentralSdk::RC_SERVER_SANDBOX, opts={})
32
      @app_key      = app_key.to_s
33
      @app_secret   = app_secret.to_s
34
      @server_url   = server_url
35
      @token        = nil
36
      @http         = nil
37
      @redirect_uri = ''
38
      @user_agent   = get_user_agent()
39
      @oauth2client = new_oauth2_client()
40
      if opts.is_a?(Hash)
41
        @redirect_uri = opts.has_key?(:redirect_uri) ? opts[:redirect_uri] : ''
42
        if opts.has_key?(:username) && opts.has_key?(:password)
43
          extension = opts.has_key?(:extension) ? opts[:extension] : ''
44
          authorize_password(opts[:username], extension, opts[:password])
45
        end
46
      end
47
      @messages = RingCentralSdk::REST::Messages.new(self)
48
    end
49
50
    def get_api_version_url()
51
      return @server_url + URL_PREFIX + '/' + API_VERSION 
52
    end
53
54
    def create_url(url, add_server=false, add_method=nil, add_token=false)
55
      built_url = ''
56
      has_http = !url.index('http://').nil? && !url.index('https://').nil?
57
58
      if add_server && ! has_http
59
        built_url += @server_url
60
      end
61
62
      if url.index(URL_PREFIX).nil? && ! has_http
63
        built_url += URL_PREFIX + '/' + API_VERSION + '/'
64
      end
65
66
      if url.index('/') == 0
67
        if built_url =~ /\/$/
68
          built_url += url.gsub(/^\//, '')
69
        else
70
          built_url += url
71
        end
72
      else # no /
73
        if built_url =~ /\/$/
74
          built_url += url
75
        else
76
          built_url += '/' + url
77
        end
78
      end
79
80
      return built_url
81
    end
82
83
    def create_urls(urls, add_server=false, add_method=nil, add_token=false)
84
      unless urls.is_a?(Array)
85
        raise "URLs is not an array"
86
      end
87
      built_urls = []
88
      urls.each do |url|
89
        built_urls.push(create_url(url, add_server, add_method, add_token))
90
      end
91
      return built_urls
92
    end
93
94
    def authorize_url(opts={})
95
      if ! opts.has_key?(:redirect_uri) && @redirect_uri.to_s.length>0
96
        opts[:redirect_uri] = @redirect_uri.to_s
97
      end
98
      @oauth2client.auth_code.authorize_url(opts)
99
    end
100
101
    def authorize_code(code, opts={})
102
      if ! opts.has_key?(:redirect_uri) && @redirect_uri.to_s.length>0
103
        opts[:redirect_uri] = @redirect_uri.to_s
104
      end
105
      token = @oauth2client.auth_code.get_token(code, opts)
106
      set_token(token)
107
      return token
108
    end
109
110
    def authorize_password(username, extension='', password='', remember=false)
111
      token = @oauth2client.password.get_token(username, password, {
112
        :extension => extension,
113
        :headers   => { 'Authorization' => 'Basic ' + get_api_key() } })
114
      set_token(token)
115
      return token
116
    end
117
118
    def set_token(token)
119
      if token.is_a?(Hash)
120
        token = OAuth2::AccessToken::from_hash(@oauth2client, token)
121
      end
122
123
      unless token.is_a?(OAuth2::AccessToken)
124
        raise "Token is not a OAuth2::AccessToken"
125
      end
126
127
      @token = token
128
129
      @http = Faraday.new(:url => get_api_version_url()) do |conn|
130
        conn.request  :oauth2_refresh, @token
131
        conn.request  :json
132
        conn.request  :url_encoded
133
        conn.headers['User-Agent'] = @user_agent
134
        conn.headers['Rc-User-Agent'] = @user_agent
135
        conn.response :json, :content_type => /\bjson$/
136
        conn.adapter  Faraday.default_adapter
137
      end
138
    end
139
140
    def new_oauth2_client()
141
      return OAuth2::Client.new(@app_key, @app_secret,
142
        :site          => @server_url,
143
        :authorize_url => AUTHZ_ENDPOINT,
144
        :token_url     => TOKEN_ENDPOINT)
145
    end
146
147
    def set_oauth2_client(client=nil)
148
      if client.nil?
149
        @oauth2client = new_oauth2_client()
150
      elsif client.is_a?(OAuth2::Client)
151
        @oauth2client = client
152
      else
153
        raise "client is not an OAuth2::Client"
154
      end
155
    end
156
157
    def get_api_key()
158
      api_key = (@app_key.is_a?(String) && @app_secret.is_a?(String)) \
159
        ? Base64.encode64("#{@app_key}:#{@app_secret}").gsub(/[\s\t\r\n]/,'') : ''
160
      return api_key
161
    end
162
163
    def send_request(request=nil)
164
      unless request.is_a?(RingCentralSdk::REST::Request::Base)
165
        raise 'Request is not a RingCentralSdk::REST::Request::Base'
166
      end
167
168
      if request.method.downcase == 'post'
169
        resp       =  @http.post do |req|
170
          req.url request.url
171
          req.headers['Content-Type'] = request.content_type if request.content_type
172
          req.body = request.body if request.body
173
        end
174
        return resp
175
      end
176
    end
177
178
    def get_user_agent()
179
      ua = "ringcentral-sdk-ruby/#{RingCentralSdk::VERSION} %s/%s %s" % [
180
        (RUBY_ENGINE rescue nil or "ruby"),
181
        RUBY_VERSION,
182
        RUBY_PLATFORM
183
      ]
184
      return ua.strip
185
    end
186
187
    def create_subscription()
188
      return RingCentralSdk::REST::Subscription.new(self)
189
    end
190
191
    alias_method :authorize, :authorize_password
192
    alias_method :login, :authorize_password
193
    private :get_api_version_url
194
  end
195
end
196