Class: Skydrive::Client
- Inherits:
-
Object
- Object
- Skydrive::Client
- Includes:
- ActionView::Helpers::NumberHelper
- Defined in:
- lib/skydrive/client.rb
Instance Attribute Summary collapse
-
#client_id ⇒ Object
Returns the value of attribute client_id.
-
#client_secret ⇒ Object
Returns the value of attribute client_secret.
-
#guid ⇒ Object
Returns the value of attribute guid.
-
#personal_url ⇒ Object
Returns the value of attribute personal_url.
-
#refresh_token(params) ⇒ Object
Returns the value of attribute refresh_token.
-
#token ⇒ Object
Returns the value of attribute token.
Instance Method Summary collapse
- #api_call(url, headers = {}) ⇒ Object
- #format_results(results) ⇒ Object
- #get_folder_and_files(uri, folder = Skydrive::Folder.new) ⇒ Object
- #get_my_files_service ⇒ Object
- #get_personal_url(service_endpoint_uri) ⇒ Object
- #get_realm ⇒ Object
- #get_user ⇒ Object
-
#initialize(options = {}) ⇒ Client
constructor
A new instance of Client.
-
#oauth_authorize_redirect_uri(redirect_uri, options = {}) ⇒ Object
URL used to authorize this app for a sharepoint tenant.
- #request_oauth_token(code, redirect_url) ⇒ Object
Constructor Details
#initialize(options = {}) ⇒ Client
Returns a new instance of Client.
14 15 16 |
# File 'lib/skydrive/client.rb', line 14 def initialize( = {}) .each { |key, val| self.send("#{key}=", val) if self.respond_to?("#{key}=") } end |
Instance Attribute Details
#client_id ⇒ Object
Returns the value of attribute client_id.
12 13 14 |
# File 'lib/skydrive/client.rb', line 12 def client_id @client_id end |
#client_secret ⇒ Object
Returns the value of attribute client_secret.
12 13 14 |
# File 'lib/skydrive/client.rb', line 12 def client_secret @client_secret end |
#guid ⇒ Object
Returns the value of attribute guid.
12 13 14 |
# File 'lib/skydrive/client.rb', line 12 def guid @guid end |
#personal_url ⇒ Object
Returns the value of attribute personal_url.
12 13 14 |
# File 'lib/skydrive/client.rb', line 12 def personal_url @personal_url end |
#refresh_token(params) ⇒ Object
Returns the value of attribute refresh_token.
12 13 14 |
# File 'lib/skydrive/client.rb', line 12 def refresh_token @refresh_token end |
#token ⇒ Object
Returns the value of attribute token.
12 13 14 |
# File 'lib/skydrive/client.rb', line 12 def token @token end |
Instance Method Details
#api_call(url, headers = {}) ⇒ Object
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
# File 'lib/skydrive/client.rb', line 154 def api_call(url, headers = {}) url.gsub!("https:/i", "https://i") uri = URI.escape(url) pid = generate_pid headers['Authorization'] = "Bearer #{token}" unless headers.has_key? 'Authorization' headers['Accept'] = "application/json; odata=verbose" unless headers.has_key? 'Accept' c = Curl::Easy.new(uri) do |http| headers.each {|k,v| http.headers[k] = v if v } end headers = [] buffer = "" c.on_body { |data| buffer << data data.size } c.on_header { |data| headers << data data.size } c.perform Skydrive.logger.info("[#{pid}] SKYDRIVE REQUEST: #{uri.to_s}") headerOutput = c.headers.map {|k,v| "#{k}: #{v}"}.join("\n - ") Skydrive.logger.info("[#{pid}] SKYDRIVE REQUEST HEADERS:\n - #{headerOutput}") Skydrive.logger.info("[#{pid}] SKYDRIVE RESPONSE HEADERS:\n - #{headers.join(' - ')}") Skydrive.logger.info("[#{pid}] SKYDRIVE RESPONSE BODY:\n#{buffer}"); result = JSON.parse(buffer) result["d"] || result end |
#format_results(results) ⇒ Object
79 80 81 82 83 84 |
# File 'lib/skydrive/client.rb', line 79 def format_results(results) results["expires_in"] = results["expires_in"].to_i results["not_before"] = Time.at results["not_before"].to_i results["expires_on"] = Time.at results["expires_on"].to_i results end |
#get_folder_and_files(uri, folder = Skydrive::Folder.new) ⇒ Object
102 103 104 105 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 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
# File 'lib/skydrive/client.rb', line 102 def get_folder_and_files(uri, folder = Skydrive::Folder.new) data = api_call(uri) folder.icon = "folder" folder.uri = uri folder.name = data['Name'] folder.server_relative_url = data['ServerRelativeUrl'] folder.parse_parent_uri folder.files = [] folder.folders = [] files = api_call(CGI::unescape(data['Files']['__deferred']['uri']))['results'] files.each do |f| new_file = Skydrive::File.new new_file.uri = f['__metadata']['uri'] new_file.file_size = number_to_human_size(f['Length']) new_file.name = f['Name'] new_file.server_relative_url = f['ServerRelativeUrl'] new_file.time_created = Date.parse(f['TimeCreated']) new_file.time_last_modified = Date.parse(f['TimeLastModified']) new_file.title = f['Title'] new_file.content_tag = f['ContentTag'] folder.files << new_file end sub_folders = api_call(CGI::unescape(data['Folders']['__deferred']['uri']))['results'] sub_folders.each do |sf| # Non-recursively sub_folder = Skydrive::Folder.new sub_folder.parent_uri = uri sub_folder.icon = "folder" sub_folder.uri = sf['__metadata']['uri'] sub_folder.name = sf['Name'] sub_folder.server_relative_url = sf['ServerRelativeUrl'] sub_folder.files = [] sub_folder.folders = [] #special exception for the special Forms folder in the root directory if !folder.parent_uri && sub_folder.name == 'Forms' next end # Recursively # sub_folder = get_folder_and_files(sf['__metadata']['uri']) folder.folders << sub_folder end return folder end |
#get_my_files_service ⇒ Object
52 53 54 55 |
# File 'lib/skydrive/client.rb', line 52 def get_my_files_service services = api_call('https://api.office.com/discovery/v1.0/me/services', {'Accept' => nil}) services["value"].find{|v| v["capability"] = "MyFiles"} end |
#get_personal_url(service_endpoint_uri) ⇒ Object
57 58 59 |
# File 'lib/skydrive/client.rb', line 57 def get_personal_url(service_endpoint_uri) self.personal_url = api_call("#{service_endpoint_uri}/files/root/weburl", {'Accept' => nil})['value'] end |
#get_realm ⇒ Object
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/skydrive/client.rb', line 86 def get_realm #401 sharepoint challenge to get the realm resource = RestClient::Resource.new "#{personal_url}/_vti_bin/client.svc/", {headers: {'Authorization' => 'Bearer'}} www_authenticate = {} resource.get do |response, request, result| log_restclient_response(response, request, result) response.headers[:www_authenticate].scan(/[\w ]*="[^"]*"/).each do |attribute| attribute = attribute.split('=') www_authenticate[attribute.first] = attribute.last.delete('"') end end www_authenticate["Bearer realm"] end |
#get_user ⇒ Object
189 190 191 |
# File 'lib/skydrive/client.rb', line 189 def get_user api_call("#{personal_url}/_api/SP.UserProfiles.PeopleManager/GetMyProperties") end |
#oauth_authorize_redirect_uri(redirect_uri, options = {}) ⇒ Object
URL used to authorize this app for a sharepoint tenant
19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/skydrive/client.rb', line 19 def (redirect_uri, = {}) state = [:state] redirect_params = { client_id: client_id, redirect_uri: redirect_uri, response_type: 'code', resource: 'https://api.office.com/discovery/' } "https://login.windows.net/common/oauth2/authorize?" + redirect_params.map{|k,v| "#{k}=#{CGI::escape(v)}"}.join('&') + (state ? "&state=#{state}" : "") end |
#request_oauth_token(code, redirect_url) ⇒ Object
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/skydrive/client.rb', line 32 def request_oauth_token(code, redirect_url) endpoint = 'https://login.windows.net/common/oauth2/token' = { client_id: client_id, client_secret: client_secret, code: code, redirect_uri: redirect_url, resource: 'https://api.office.com/discovery/', grant_type: 'authorization_code', } RestClient.post endpoint, do |response, request, result| log_restclient_response(response, request, result) results = format_results(JSON.parse(response)) self.token = results['access_token'] self.refresh_token = results['refresh_token'] results end end |