connectors_sdk 8.2.0.0 → 8.3.0.0.pre.20220517T144653Z
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|