connectors_sdk 8.2.0.0 → 8.3.0.0.pre.20220517T144653Z
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/connectors_sdk/atlassian/config.rb +27 -0
- data/lib/connectors_sdk/atlassian/custom_client.rb +87 -0
- data/lib/connectors_sdk/base/adapter.rb +7 -8
- data/lib/connectors_sdk/base/authorization.rb +89 -0
- data/lib/connectors_sdk/base/custom_client.rb +1 -2
- data/lib/connectors_sdk/base/extractor.rb +3 -2
- data/lib/connectors_sdk/base/http_call_wrapper.rb +135 -0
- data/lib/connectors_sdk/base/registry.rb +5 -3
- data/lib/connectors_sdk/confluence/adapter.rb +216 -0
- data/lib/connectors_sdk/confluence/custom_client.rb +143 -0
- data/lib/connectors_sdk/confluence/extractor.rb +265 -0
- data/lib/connectors_sdk/confluence_cloud/authorization.rb +64 -0
- data/lib/connectors_sdk/confluence_cloud/custom_client.rb +61 -0
- data/lib/connectors_sdk/confluence_cloud/extractor.rb +59 -0
- data/lib/connectors_sdk/confluence_cloud/http_call_wrapper.rb +59 -0
- data/lib/connectors_sdk/helpers/atlassian_time_formatter.rb +10 -0
- data/lib/connectors_sdk/office365/adapter.rb +7 -7
- data/lib/connectors_sdk/office365/config.rb +1 -0
- data/lib/connectors_sdk/office365/custom_client.rb +25 -64
- data/lib/connectors_sdk/office365/extractor.rb +18 -34
- data/lib/connectors_sdk/share_point/adapter.rb +24 -12
- data/lib/connectors_sdk/share_point/authorization.rb +14 -62
- data/lib/connectors_sdk/share_point/extractor.rb +2 -2
- data/lib/connectors_sdk/share_point/http_call_wrapper.rb +24 -83
- data/lib/connectors_shared/exception_tracking.rb +4 -4
- data/lib/connectors_shared/extraction_utils.rb +109 -0
- data/lib/connectors_shared/job_status.rb +18 -0
- data/lib/connectors_shared/middleware/basic_auth.rb +27 -0
- data/lib/connectors_shared/middleware/bearer_auth.rb +27 -0
- data/lib/connectors_shared/middleware/restrict_hostnames.rb +73 -0
- data/lib/connectors_shared/monitor.rb +3 -3
- data/lib/connectors_shared.rb +1 -0
- data/lib/stubs/enterprise_search/exception_tracking.rb +43 -0
- metadata +23 -5
@@ -11,11 +11,11 @@ require 'connectors_sdk/base/adapter'
|
|
11
11
|
module ConnectorsSdk
|
12
12
|
module Office365
|
13
13
|
class Adapter < ConnectorsSdk::Base::Adapter
|
14
|
-
def self.
|
14
|
+
def self.es_document_from_file(_file)
|
15
15
|
raise NotImplementedError
|
16
16
|
end
|
17
17
|
|
18
|
-
def self.
|
18
|
+
def self.es_document_from_folder(_folder)
|
19
19
|
raise NotImplementedError
|
20
20
|
end
|
21
21
|
|
@@ -26,7 +26,7 @@ module ConnectorsSdk
|
|
26
26
|
@item = item
|
27
27
|
end
|
28
28
|
|
29
|
-
def self.
|
29
|
+
def self.convert_id_to_es_id(_id)
|
30
30
|
raise NotImplementedError
|
31
31
|
end
|
32
32
|
|
@@ -41,10 +41,10 @@ module ConnectorsSdk
|
|
41
41
|
ConnectorsSdk::Office365::Adapter.normalize_path("#{parent_folder_path}/#{item.name}")
|
42
42
|
end
|
43
43
|
|
44
|
-
def
|
44
|
+
def to_es_document
|
45
45
|
{
|
46
46
|
:_fields_to_preserve => ConnectorsSdk::Office365::Adapter.fields_to_preserve,
|
47
|
-
:id => self.class.
|
47
|
+
:id => self.class.convert_id_to_es_id(item.id),
|
48
48
|
:path => get_path(item),
|
49
49
|
:title => item.name,
|
50
50
|
:url => item.webUrl,
|
@@ -96,7 +96,7 @@ module ConnectorsSdk
|
|
96
96
|
end
|
97
97
|
|
98
98
|
class FileGraphItem < GraphItem
|
99
|
-
def self.
|
99
|
+
def self.convert_id_to_es_id(_id)
|
100
100
|
raise NotImplementedError
|
101
101
|
end
|
102
102
|
|
@@ -132,7 +132,7 @@ module ConnectorsSdk
|
|
132
132
|
end
|
133
133
|
|
134
134
|
class PackageGraphItem < GraphItem
|
135
|
-
def self.
|
135
|
+
def self.convert_id_to_es_id(id)
|
136
136
|
raise NotImplementedError
|
137
137
|
end
|
138
138
|
|
@@ -6,9 +6,11 @@
|
|
6
6
|
|
7
7
|
# frozen_string_literal: true
|
8
8
|
|
9
|
+
require 'hashie/mash'
|
10
|
+
|
9
11
|
require 'connectors_sdk/base/custom_client'
|
12
|
+
require 'connectors_sdk/office365/extractor'
|
10
13
|
require 'connectors_shared'
|
11
|
-
require 'hashie/mash'
|
12
14
|
|
13
15
|
module ConnectorsSdk
|
14
16
|
module Office365
|
@@ -50,7 +52,6 @@ module ConnectorsSdk
|
|
50
52
|
def initialize(access_token:, cursors: {}, ensure_fresh_auth: nil)
|
51
53
|
@access_token = access_token
|
52
54
|
@cursors = cursors || {}
|
53
|
-
@cursors[ConnectorsSdk::Office365::Extractor::DRIVE_IDS_CURSOR_KEY] ||= {}
|
54
55
|
super(:ensure_fresh_auth => ensure_fresh_auth)
|
55
56
|
end
|
56
57
|
|
@@ -75,12 +76,11 @@ module ConnectorsSdk
|
|
75
76
|
# recently created groups (new Private Team site will be there) to reduce friction and index this site
|
76
77
|
# earlier.
|
77
78
|
# See: https://github.com/elastic/ent-search/pull/3581
|
78
|
-
share_point_sites = (sites(:fields => %w[id]) + recent_share_point_group_sites(:fields => %[id]))
|
79
|
+
share_point_sites = (sites(:fields => %w[id,name]) + recent_share_point_group_sites(:fields => %w[id,name]))
|
79
80
|
|
80
81
|
share_point_sites
|
81
|
-
.
|
82
|
-
.
|
83
|
-
.map { |site_id| site_drives(site_id, :fields => fields) }
|
82
|
+
.uniq(&:id)
|
83
|
+
.map { |site| site_drives(site, :fields => fields) }
|
84
84
|
.flatten
|
85
85
|
.compact
|
86
86
|
end
|
@@ -102,47 +102,32 @@ module ConnectorsSdk
|
|
102
102
|
request_all(:endpoint => 'sites/', :fields => fields, :additional_query_params => { :search => '', :top => 10 })
|
103
103
|
end
|
104
104
|
|
105
|
-
def site_drives(
|
105
|
+
def site_drives(site, fields: [])
|
106
106
|
document_libraries(
|
107
|
-
request_all(:endpoint => "sites/#{
|
108
|
-
)
|
107
|
+
request_all(:endpoint => "sites/#{site.id}/drives/", :fields => fields)
|
108
|
+
).map do |drive|
|
109
|
+
drive.site_name = site.name
|
110
|
+
drive
|
111
|
+
end
|
109
112
|
rescue ClientError => e
|
110
113
|
ConnectorsShared::Logger.info("Received response of #{e.status_code} trying to get drive for Site with Id = #{site_id}: #{e.message}")
|
111
114
|
nil
|
112
115
|
end
|
113
116
|
|
114
|
-
def list_items(drive_id, fields: []
|
117
|
+
def list_items(drive_id, fields: [])
|
115
118
|
# MSFT Graph API does not have a recursive list items, have to do this dfs style
|
116
|
-
|
117
|
-
stack = if break_after_page && cursors['page_cursor'].present?
|
118
|
-
cursors.delete('page_cursor')
|
119
|
-
else
|
120
|
-
[get_root_item(drive_id, ['id']).id]
|
121
|
-
end
|
122
|
-
|
119
|
+
stack = [get_root_item(drive_id, ['id']).id]
|
123
120
|
# We rely on the id field below to perform our DFS
|
124
121
|
fields_with_id = fields.any? ? fields | ['id'] : fields
|
125
|
-
yielded = 0
|
126
122
|
while stack.any?
|
127
123
|
folder_id = stack.pop
|
128
|
-
item_children(drive_id, folder_id, :fields => fields_with_id
|
124
|
+
item_children(drive_id, folder_id, :fields => fields_with_id) do |item|
|
129
125
|
if item.folder
|
130
126
|
stack << item.id
|
131
127
|
end
|
132
128
|
yield item
|
133
|
-
|
134
|
-
yielded += 1
|
135
129
|
end
|
136
130
|
|
137
|
-
if break_after_page && yielded >= 100
|
138
|
-
if cursors['item_children_next_link'].present?
|
139
|
-
stack << folder_id
|
140
|
-
end
|
141
|
-
if stack.any?
|
142
|
-
cursors['page_cursor'] = stack.dup
|
143
|
-
break
|
144
|
-
end
|
145
|
-
end
|
146
131
|
end
|
147
132
|
end
|
148
133
|
|
@@ -150,19 +135,16 @@ module ConnectorsSdk
|
|
150
135
|
request_endpoint(:endpoint => "drives/#{drive_id}/items/#{item_id}/permissions").value
|
151
136
|
end
|
152
137
|
|
153
|
-
def list_changes(drive_id:, start_delta_link: nil, last_modified: nil
|
138
|
+
def list_changes(drive_id:, start_delta_link: nil, last_modified: nil)
|
154
139
|
query_params = { :'$select' => %w(id content.downloadUrl lastModifiedDateTime lastModifiedBy root deleted file folder package name webUrl createdBy createdDateTime size).join(',') }
|
155
140
|
response =
|
156
|
-
if
|
157
|
-
request_json(:url => cursors.delete('page_cursor'))
|
158
|
-
elsif start_delta_link.nil?
|
141
|
+
if start_delta_link.nil?
|
159
142
|
endpoint = "drives/#{drive_id}/root/delta"
|
160
143
|
request_endpoint(:endpoint => endpoint, :query_params => query_params)
|
161
144
|
else
|
162
145
|
request_json(:url => start_delta_link, :query_params => query_params)
|
163
146
|
end
|
164
147
|
|
165
|
-
yielded = 0
|
166
148
|
loop do
|
167
149
|
response.value.each do |change|
|
168
150
|
# MSFT Graph API does not allow us to view "changes" in chronological order, so if there is no cursor,
|
@@ -170,25 +152,18 @@ module ConnectorsSdk
|
|
170
152
|
# since to get another cursor, we would have to go through all the changes anyway
|
171
153
|
next if last_modified.present? && Time.parse(change.lastModifiedDateTime) < last_modified
|
172
154
|
next if change.root # We don't want to index the root of the drive
|
173
|
-
|
174
155
|
yield change
|
175
|
-
yielded += 1
|
176
|
-
end
|
177
|
-
|
178
|
-
if break_after_page && yielded >= 100 && response['@odata.nextLink'].present?
|
179
|
-
cursors['page_cursor'] = response['@odata.nextLink']
|
180
|
-
break
|
181
156
|
end
|
182
157
|
|
183
158
|
break if response['@odata.nextLink'].nil?
|
184
159
|
response = request_json(:url => response['@odata.nextLink'])
|
185
160
|
end
|
186
161
|
|
187
|
-
cursors[
|
162
|
+
cursors[drive_id] = response['@odata.deltaLink']
|
188
163
|
end
|
189
164
|
|
190
165
|
def get_latest_delta_link(drive_id)
|
191
|
-
cursors[
|
166
|
+
cursors[drive_id] || exhaustively_get_delta_link(drive_id)
|
192
167
|
end
|
193
168
|
|
194
169
|
def exhaustively_get_delta_link(drive_id)
|
@@ -208,6 +183,7 @@ module ConnectorsSdk
|
|
208
183
|
def download_item(download_url)
|
209
184
|
request(:url => download_url) do |request|
|
210
185
|
request.options.params_encoder = Office365DownloadParamsEncoder
|
186
|
+
request.options.timeout = 30
|
211
187
|
end.body
|
212
188
|
end
|
213
189
|
|
@@ -233,7 +209,7 @@ module ConnectorsSdk
|
|
233
209
|
|
234
210
|
groups(:fields => %w(id createdDateTime))
|
235
211
|
.select { |group| group.createdDateTime > created_date_time_threshold }
|
236
|
-
.map { |group| group_root_site(group.id, :fields =>
|
212
|
+
.map { |group| group_root_site(group.id, :fields => fields) }.compact
|
237
213
|
end
|
238
214
|
|
239
215
|
def document_libraries(drives)
|
@@ -261,30 +237,15 @@ module ConnectorsSdk
|
|
261
237
|
request_endpoint(:endpoint => "drives/#{drive_id}/root", :query_params => query_params)
|
262
238
|
end
|
263
239
|
|
264
|
-
def item_children(drive_id, item_id, fields: [],
|
265
|
-
|
266
|
-
|
267
|
-
response =
|
268
|
-
request_json(:url => next_link)
|
269
|
-
else
|
270
|
-
endpoint = "drives/#{drive_id}/items/#{item_id}/children"
|
271
|
-
query_params = transform_fields_to_request_query_params(fields)
|
272
|
-
request_endpoint(:endpoint => endpoint, :query_params => query_params)
|
273
|
-
end
|
240
|
+
def item_children(drive_id, item_id, fields: [], &block)
|
241
|
+
endpoint = "drives/#{drive_id}/items/#{item_id}/children"
|
242
|
+
query_params = transform_fields_to_request_query_params(fields)
|
243
|
+
response = request_endpoint(:endpoint => endpoint, :query_params => query_params)
|
274
244
|
|
275
|
-
yielded = 0
|
276
245
|
loop do
|
277
246
|
response.value.each(&block)
|
278
247
|
next_link = response['@odata.nextLink']
|
279
|
-
|
280
248
|
break if next_link.nil?
|
281
|
-
|
282
|
-
yielded += response.value.size
|
283
|
-
if break_after_page && yielded >= 100
|
284
|
-
cursors['item_children_next_link'] = next_link
|
285
|
-
break
|
286
|
-
end
|
287
|
-
|
288
249
|
response = request_json(:url => next_link)
|
289
250
|
end
|
290
251
|
end
|
@@ -14,52 +14,34 @@ module ConnectorsSdk
|
|
14
14
|
class Extractor < ConnectorsSdk::Base::Extractor
|
15
15
|
DRIVE_IDS_CURSOR_KEY = 'drive_ids'.freeze
|
16
16
|
|
17
|
-
def yield_document_changes(modified_since: nil,
|
17
|
+
def yield_document_changes(modified_since: nil, &block)
|
18
18
|
drives_to_index.each do |drive|
|
19
19
|
drive_id = drive.id
|
20
|
-
|
21
|
-
if break_after_page
|
22
|
-
current_drive_id = config.cursors['current_drive_id']
|
23
|
-
if current_drive_id.present? && current_drive_id > drive_id # they come alpha sorted
|
24
|
-
next
|
25
|
-
end
|
26
|
-
config.cursors['current_drive_id'] = drive_id
|
27
|
-
end
|
28
|
-
|
29
20
|
drive_owner_name = drive.dig(:owner, :user, :displayName)
|
30
21
|
drive_name = drive.name
|
22
|
+
site_name = drive.site_name
|
31
23
|
|
32
24
|
drive_id_to_delta_link = config.cursors.fetch(DRIVE_IDS_CURSOR_KEY, {})
|
33
25
|
begin
|
34
26
|
if start_delta_link = drive_id_to_delta_link[drive_id]
|
35
27
|
log_debug("Starting an incremental crawl with cursor for #{service_type.classify} with drive_id: #{drive_id}")
|
36
28
|
begin
|
37
|
-
yield_changes(drive_id, :start_delta_link => start_delta_link, :drive_owner_name => drive_owner_name, :drive_name => drive_name, :
|
29
|
+
yield_changes(drive_id, :start_delta_link => start_delta_link, :drive_owner_name => drive_owner_name, :drive_name => drive_name, :site_name => site_name, &block)
|
38
30
|
rescue ConnectorsSdk::Office365::CustomClient::Office365InvalidCursorsError
|
39
31
|
log_warn("Error listing changes with start_delta_link: #{start_delta_link}, falling back to full crawl")
|
40
|
-
yield_drive_items(drive_id, :drive_owner_name => drive_owner_name, :drive_name => drive_name, :
|
32
|
+
yield_drive_items(drive_id, :drive_owner_name => drive_owner_name, :drive_name => drive_name, :site_name => site_name, &block)
|
41
33
|
end
|
42
34
|
elsif modified_since.present?
|
43
35
|
log_debug("Starting an incremental crawl using last_modified (no cursor found) for #{service_type.classify} with drive_id: #{drive_id}")
|
44
|
-
yield_changes(drive_id, :last_modified => modified_since, :drive_owner_name => drive_owner_name, :drive_name => drive_name, :
|
36
|
+
yield_changes(drive_id, :last_modified => modified_since, :drive_owner_name => drive_owner_name, :drive_name => drive_name, :site_name => site_name, &block)
|
45
37
|
else
|
46
38
|
log_debug("Starting a full crawl #{service_type.classify} with drive_id: #{drive_id}")
|
47
|
-
yield_drive_items(drive_id, :drive_owner_name => drive_owner_name, :drive_name => drive_name, :
|
39
|
+
yield_drive_items(drive_id, :drive_owner_name => drive_owner_name, :drive_name => drive_name, :site_name => site_name, &block)
|
48
40
|
end
|
49
41
|
rescue ConnectorsSdk::Office365::CustomClient::ClientError => e
|
50
42
|
log_warn("Error searching and listing drive #{drive_id}")
|
51
43
|
capture_exception(e)
|
52
44
|
end
|
53
|
-
|
54
|
-
if break_after_page && (config.cursors['page_cursor'].present? || config.cursors['item_children_next_link'].present?)
|
55
|
-
break
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
if break_after_page && config.cursors['page_cursor'].blank? && config.cursors['item_children_next_link'].blank?
|
60
|
-
@completed = true
|
61
|
-
config.overwrite_cursors!(retrieve_latest_cursors)
|
62
|
-
log_debug("Completed #{modified_since.nil? ? 'full' : 'incremental'} extraction")
|
63
45
|
end
|
64
46
|
|
65
47
|
nil
|
@@ -132,7 +114,7 @@ module ConnectorsSdk
|
|
132
114
|
@existing_drive_item_ids ||= Set.new.tap do |ids|
|
133
115
|
drives_to_index.each do |drive|
|
134
116
|
client.list_items(drive.id) do |item|
|
135
|
-
ids <<
|
117
|
+
ids << convert_id_to_es_id(item.id)
|
136
118
|
end
|
137
119
|
end
|
138
120
|
end
|
@@ -142,7 +124,7 @@ module ConnectorsSdk
|
|
142
124
|
raise NotImplementedError
|
143
125
|
end
|
144
126
|
|
145
|
-
def
|
127
|
+
def convert_id_to_es_id(_id)
|
146
128
|
raise NotImplementedError
|
147
129
|
end
|
148
130
|
|
@@ -156,11 +138,12 @@ module ConnectorsSdk
|
|
156
138
|
ConnectorsShared::ExceptionTracking.capture_exception(office365_client_error, options)
|
157
139
|
end
|
158
140
|
|
159
|
-
def yield_drive_items(drive_id, drive_owner_name:, drive_name:,
|
160
|
-
client.list_items(drive_id
|
141
|
+
def yield_drive_items(drive_id, drive_owner_name:, drive_name:, site_name:, &block)
|
142
|
+
client.list_items(drive_id) do |item|
|
161
143
|
yield_single_document_change(:identifier => "Office365 change: #{item&.id} (#{Office365::Adapter::GraphItem.get_path(item)})") do
|
162
144
|
item.drive_owner_name = drive_owner_name
|
163
145
|
item.drive_name = drive_name
|
146
|
+
item.site_name = site_name
|
164
147
|
yield_create_or_update(drive_id, item, &block)
|
165
148
|
end
|
166
149
|
end
|
@@ -170,15 +153,16 @@ module ConnectorsSdk
|
|
170
153
|
if item.deleted.nil?
|
171
154
|
yield_create_or_update(drive_id, item, &block)
|
172
155
|
else
|
173
|
-
yield :delete,
|
156
|
+
yield :delete, convert_id_to_es_id(item.id)
|
174
157
|
end
|
175
158
|
end
|
176
159
|
|
177
|
-
def yield_changes(drive_id, drive_owner_name:, drive_name:, start_delta_link: nil, last_modified: nil,
|
178
|
-
client.list_changes(:drive_id => drive_id, :start_delta_link => start_delta_link, :last_modified => last_modified
|
160
|
+
def yield_changes(drive_id, drive_owner_name:, drive_name:, site_name:, start_delta_link: nil, last_modified: nil, &block)
|
161
|
+
client.list_changes(:drive_id => drive_id, :start_delta_link => start_delta_link, :last_modified => last_modified) do |item|
|
179
162
|
yield_single_document_change(:identifier => "Office365 change: #{item&.id} (#{Office365::Adapter::GraphItem.get_path(item)})") do
|
180
163
|
item.drive_owner_name = drive_owner_name
|
181
164
|
item.drive_name = drive_name
|
165
|
+
item.site_name = site_name
|
182
166
|
yield_correct_actions_and_converted_item(drive_id, item, &block)
|
183
167
|
end
|
184
168
|
end
|
@@ -210,11 +194,11 @@ module ConnectorsSdk
|
|
210
194
|
|
211
195
|
def generate_document(item)
|
212
196
|
if item.file
|
213
|
-
adapter.
|
197
|
+
adapter.es_document_from_file(item)
|
214
198
|
elsif item.folder
|
215
|
-
adapter.
|
199
|
+
adapter.es_document_from_folder(item)
|
216
200
|
elsif item.package
|
217
|
-
adapter.
|
201
|
+
adapter.es_document_from_package(item)
|
218
202
|
else
|
219
203
|
raise "Unexpected Office 365 item type for item #{item}"
|
220
204
|
end
|
@@ -10,36 +10,48 @@ require 'connectors_sdk/office365/adapter'
|
|
10
10
|
|
11
11
|
module ConnectorsSdk
|
12
12
|
module SharePoint
|
13
|
+
module SitePrefix
|
14
|
+
def get_path(item)
|
15
|
+
item.site_name.present? ? "/sites/#{item.site_name}#{super}" : super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
13
19
|
class Adapter < Office365::Adapter
|
14
20
|
generate_id_helpers :share_point, 'share_point'
|
15
21
|
|
16
|
-
def self.
|
17
|
-
FileGraphItem.new(file).
|
22
|
+
def self.es_document_from_file(file)
|
23
|
+
FileGraphItem.new(file).to_es_document
|
18
24
|
end
|
19
25
|
|
20
|
-
def self.
|
21
|
-
FolderGraphItem.new(folder).
|
26
|
+
def self.es_document_from_folder(folder)
|
27
|
+
FolderGraphItem.new(folder).to_es_document
|
22
28
|
end
|
23
29
|
|
24
|
-
def self.
|
25
|
-
PackageGraphItem.new(package).
|
30
|
+
def self.es_document_from_package(package)
|
31
|
+
PackageGraphItem.new(package).to_es_document
|
26
32
|
end
|
27
33
|
|
28
34
|
class FileGraphItem < Office365::Adapter::FileGraphItem
|
29
|
-
|
30
|
-
|
35
|
+
include SitePrefix
|
36
|
+
|
37
|
+
def self.convert_id_to_es_id(id)
|
38
|
+
ConnectorsSdk::SharePoint::Adapter.share_point_id_to_es_id(id)
|
31
39
|
end
|
32
40
|
end
|
33
41
|
|
34
42
|
class FolderGraphItem < Office365::Adapter::FolderGraphItem
|
35
|
-
|
36
|
-
|
43
|
+
include SitePrefix
|
44
|
+
|
45
|
+
def self.convert_id_to_es_id(id)
|
46
|
+
ConnectorsSdk::SharePoint::Adapter.share_point_id_to_es_id(id)
|
37
47
|
end
|
38
48
|
end
|
39
49
|
|
40
50
|
class PackageGraphItem < Office365::Adapter::PackageGraphItem
|
41
|
-
|
42
|
-
|
51
|
+
include SitePrefix
|
52
|
+
|
53
|
+
def self.convert_id_to_es_id(id)
|
54
|
+
ConnectorsSdk::SharePoint::Adapter.share_point_id_to_es_id(id)
|
43
55
|
end
|
44
56
|
end
|
45
57
|
end
|
@@ -6,70 +6,12 @@
|
|
6
6
|
|
7
7
|
# frozen_string_literal: true
|
8
8
|
|
9
|
-
require '
|
10
|
-
require 'signet'
|
11
|
-
require 'signet/oauth_2'
|
12
|
-
require 'signet/oauth_2/client'
|
9
|
+
require 'connectors_sdk/base/authorization'
|
13
10
|
|
14
11
|
module ConnectorsSdk
|
15
12
|
module SharePoint
|
16
|
-
class Authorization
|
13
|
+
class Authorization < ConnectorsSdk::Base::Authorization
|
17
14
|
class << self
|
18
|
-
def authorization_url
|
19
|
-
'https://login.microsoftonline.com/common/oauth2/v2.0/authorize'
|
20
|
-
end
|
21
|
-
|
22
|
-
def token_credential_uri
|
23
|
-
'https://login.microsoftonline.com/common/oauth2/v2.0/token'
|
24
|
-
end
|
25
|
-
|
26
|
-
def authorization_uri(params)
|
27
|
-
missing = missing_fields(params, %w[client_id])
|
28
|
-
unless missing.blank?
|
29
|
-
raise ConnectorsShared::ClientError.new("Missing required fields: #{missing.join(', ')}")
|
30
|
-
end
|
31
|
-
|
32
|
-
params[:response_type] = 'code'
|
33
|
-
params[:additional_parameters] = { :prompt => 'consent' }
|
34
|
-
client = oauth_client(params)
|
35
|
-
client.authorization_uri.to_s
|
36
|
-
end
|
37
|
-
|
38
|
-
def access_token(params)
|
39
|
-
missing = missing_fields(params, %w[client_id client_secret code redirect_uri])
|
40
|
-
unless missing.blank?
|
41
|
-
raise ConnectorsShared::ClientError.new("Missing required fields: #{missing.join(', ')}")
|
42
|
-
end
|
43
|
-
|
44
|
-
params[:grant_type] = 'authorization_code'
|
45
|
-
client = oauth_client(params)
|
46
|
-
client.fetch_access_token
|
47
|
-
end
|
48
|
-
|
49
|
-
def refresh(params)
|
50
|
-
missing = missing_fields(params, %w[client_id client_secret refresh_token])
|
51
|
-
unless missing.blank?
|
52
|
-
raise ConnectorsShared::ClientError.new("Missing required fields: #{missing.join(', ')}")
|
53
|
-
end
|
54
|
-
|
55
|
-
params[:grant_type] = 'refresh_token'
|
56
|
-
client = oauth_client(params)
|
57
|
-
client.refresh!
|
58
|
-
rescue StandardError => e
|
59
|
-
ConnectorsShared::ExceptionTracking.log_exception(e)
|
60
|
-
raise ConnectorsShared::TokenRefreshFailedError
|
61
|
-
end
|
62
|
-
|
63
|
-
def oauth_client(params)
|
64
|
-
options = params.merge(
|
65
|
-
:authorization_uri => authorization_url,
|
66
|
-
:token_credential_uri => token_credential_uri,
|
67
|
-
:scope => oauth_scope
|
68
|
-
)
|
69
|
-
options[:state] = JSON.dump(options[:state]) if options[:state]
|
70
|
-
Signet::OAuth2::Client.new(options)
|
71
|
-
end
|
72
|
-
|
73
15
|
def oauth_scope
|
74
16
|
%w[
|
75
17
|
User.ReadBasic.All
|
@@ -82,8 +24,18 @@ module ConnectorsSdk
|
|
82
24
|
]
|
83
25
|
end
|
84
26
|
|
85
|
-
|
86
|
-
|
27
|
+
private
|
28
|
+
|
29
|
+
def authorization_url
|
30
|
+
'https://login.microsoftonline.com/common/oauth2/v2.0/authorize'
|
31
|
+
end
|
32
|
+
|
33
|
+
def token_credential_uri
|
34
|
+
'https://login.microsoftonline.com/common/oauth2/v2.0/token'
|
35
|
+
end
|
36
|
+
|
37
|
+
def additional_parameters
|
38
|
+
{ :prompt => 'consent' }
|
87
39
|
end
|
88
40
|
end
|
89
41
|
end
|
@@ -15,8 +15,8 @@ module ConnectorsSdk
|
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
|
-
def
|
19
|
-
ConnectorsSdk::SharePoint::Adapter.
|
18
|
+
def convert_id_to_es_id(id)
|
19
|
+
ConnectorsSdk::SharePoint::Adapter.share_point_id_to_es_id(id)
|
20
20
|
end
|
21
21
|
|
22
22
|
def adapter
|