connectors_sdk 8.3.0.0 → 8.3.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 21bd11a44ed7c45fa04b218346fda20d946b97ec8f7025c2cfb8c8f92321d6a3
4
- data.tar.gz: b388f972974f32c59d719b809975229125e293045dd35559546fefe5485e1fc3
3
+ metadata.gz: 929c0ce8ad8eaf2ab34849ee4f0b476c37e5cfe12994bf73aa183be58c350213
4
+ data.tar.gz: 9e7189b26959b4bb74e097a6e0a2effb3ade9a0b730dbccee5c23f5d0cedebd1
5
5
  SHA512:
6
- metadata.gz: 88aa76506d6f2af049ea2a2ff54797270cef692319dd9ca647d33903a9fb3bb8bb274d9d99a3f94fe4d54cfce1722b31d63203cd157b627ccf3b2ca541b63523
7
- data.tar.gz: 3faf8e16b18c0abd4f13fa988de8a6bb03e95bce5738389f132748fc17a230a9e516eb8b9f898d60aeb8a869f1ad1dadbb8606178e01be7d9ccc63ca98dcf681
6
+ metadata.gz: 6ea84dda6c9c5980b2fa089e2ac049a8ce1d27ff98761f20bb5e760dbbf6851c452cdcb35e40d274cff0c692da37e9a77be029fd286bc38672ea3597ab013db7
7
+ data.tar.gz: 837884527017d23bb33a1370f6500db9b8d37afee351ffd6243d852309120f69d2dd1bcf18a70556785d2b460e011276b8d7b621d09c631519c7aa95603b32e9
@@ -9,6 +9,7 @@
9
9
  require 'faraday_middleware'
10
10
 
11
11
  require 'connectors_shared/middleware/bearer_auth'
12
+ require 'connectors_shared/middleware/basic_auth'
12
13
  require 'connectors_shared/middleware/restrict_hostnames'
13
14
  require 'connectors_sdk/base/custom_client'
14
15
 
@@ -30,10 +31,12 @@ module ConnectorsSdk
30
31
 
31
32
  MEDIA_API_BASE_URL = 'https://api.media.atlassian.com'
32
33
 
33
- attr_reader :base_url, :access_token
34
+ attr_reader :base_url, :access_token, :basic_auth_token
34
35
 
35
- def initialize(base_url:, access_token:, ensure_fresh_auth: nil)
36
+ def initialize(base_url:, access_token: nil, basic_auth_token: nil, ensure_fresh_auth: nil)
37
+ raise 'Either access_token or basic_auth_token must be provided' unless access_token.present? || basic_auth_token.present?
36
38
  @access_token = access_token
39
+ @basic_auth_token = basic_auth_token
37
40
  super(:base_url => base_url, :ensure_fresh_auth => ensure_fresh_auth)
38
41
  end
39
42
 
@@ -42,11 +45,17 @@ module ConnectorsSdk
42
45
  end
43
46
 
44
47
  def additional_middleware
45
- [
46
- ::FaradayMiddleware::FollowRedirects,
47
- [ConnectorsShared::Middleware::RestrictHostnames, { :allowed_hosts => [base_url, MEDIA_API_BASE_URL] }],
48
- [ConnectorsShared::Middleware::BearerAuth, { :bearer_auth_token => @access_token }]
48
+ result = [
49
+ FaradayMiddleware::FollowRedirects,
50
+ [ConnectorsShared::Middleware::RestrictHostnames, { :allowed_hosts => [base_url, MEDIA_API_BASE_URL] }]
49
51
  ]
52
+ if @access_token.present?
53
+ result.append([ConnectorsShared::Middleware::BearerAuth, { :bearer_auth_token => @access_token }])
54
+ elsif @basic_auth_token.present?
55
+ result.append([ConnectorsShared::Middleware::BasicAuth, { :basic_auth_token => @basic_auth_token }])
56
+ else
57
+ raise 'Either access token or basic auth must be provided'
58
+ end
50
59
  end
51
60
 
52
61
  def update_auth_data!(new_access_token)
@@ -30,8 +30,10 @@ module ConnectorsSdk
30
30
  # loading plugins (might replace this with a directory scan and conventions on names)
31
31
  require_relative '../share_point/connector'
32
32
  require_relative '../confluence_cloud/connector'
33
+ require_relative '../gitlab/connector'
33
34
 
34
35
  REGISTRY.register(ConnectorsSdk::SharePoint::Connector::SERVICE_TYPE, ConnectorsSdk::SharePoint::Connector)
35
36
  REGISTRY.register(ConnectorsSdk::ConfluenceCloud::Connector::SERVICE_TYPE, ConnectorsSdk::ConfluenceCloud::Connector)
37
+ REGISTRY.register(ConnectorsSdk::GitLab::Connector::SERVICE_TYPE, ConnectorsSdk::GitLab::Connector)
36
38
  end
37
39
  end
@@ -6,6 +6,7 @@
6
6
 
7
7
  # frozen_string_literal: true
8
8
 
9
+ require 'base64'
9
10
  require 'connectors_sdk/atlassian/config'
10
11
  require 'connectors_sdk/confluence_cloud/extractor'
11
12
  require 'connectors_sdk/confluence_cloud/authorization'
@@ -29,23 +30,19 @@ module ConnectorsSdk
29
30
  'Confluence Cloud'
30
31
  end
31
32
 
32
- def connection_requires_redirect
33
- true
34
- end
35
-
36
33
  def configurable_fields
37
34
  [
38
35
  {
39
36
  'key' => 'base_url',
40
- 'label' => 'Base URL'
37
+ 'label' => 'Confluence Cloud Base URL'
41
38
  },
42
39
  {
43
- 'key' => 'client_id',
44
- 'label' => 'Client ID'
40
+ 'key' => 'confluence_user_email',
41
+ 'label' => 'Confluence user email'
45
42
  },
46
43
  {
47
- 'key' => 'client_secret',
48
- 'label' => 'Client Secret'
44
+ 'key' => 'confluence_api_token',
45
+ 'label' => 'Confluence user REST API Token'
49
46
  },
50
47
  ]
51
48
  end
@@ -61,7 +58,10 @@ module ConnectorsSdk
61
58
  end
62
59
 
63
60
  def client(params)
64
- ConnectorsSdk::ConfluenceCloud::CustomClient.new(:base_url => base_url(params[:cloud_id]), :access_token => params[:access_token])
61
+ ConnectorsSdk::ConfluenceCloud::CustomClient.new(
62
+ :base_url => extract_base_url(params),
63
+ :basic_auth_token => extract_basic_auth_token(params)
64
+ )
65
65
  end
66
66
 
67
67
  def custom_client_error
@@ -69,7 +69,11 @@ module ConnectorsSdk
69
69
  end
70
70
 
71
71
  def config(params)
72
- ConnectorsSdk::Atlassian::Config.new(:base_url => "#{params[:external_connector_base_url]}/wiki", :cursors => params.fetch(:cursors, {}) || {})
72
+ ConnectorsSdk::Atlassian::Config.new(
73
+ :base_url => extract_base_url(params),
74
+ :cursors => params.fetch(:cursors, {}) || {},
75
+ :index_permissions => params[:index_permissions] || false
76
+ )
73
77
  end
74
78
 
75
79
  def health_check(params)
@@ -79,6 +83,28 @@ module ConnectorsSdk
79
83
  def base_url(cloud_id)
80
84
  "https://api.atlassian.com/ex/confluence/#{cloud_id}"
81
85
  end
86
+
87
+ def is_basic_auth(params)
88
+ login = params.fetch('confluence_user_email', nil)
89
+ api_token = params.fetch('confluence_api_token', nil)
90
+ login.present? && api_token.present?
91
+ end
92
+
93
+ def extract_basic_auth_token(params)
94
+ login = params.fetch('confluence_user_email', nil)
95
+ api_token = params.fetch('confluence_api_token', nil)
96
+ nil unless login.present? && api_token.present?
97
+ Base64.strict_encode64("#{login}:#{api_token}")
98
+ end
99
+
100
+ def extract_base_url(params)
101
+ # From Confluence API documentation:
102
+ # Requests that use OAuth 2.0 (3LO) are made via api.atlassian.com (not https://your-domain.atlassian.net).
103
+ if is_basic_auth(params)
104
+ return params[:base_url].end_with?('/wiki') ? params[:base_url] : "#{params[:base_url]}/wiki"
105
+ end
106
+ base_url(params[:cloud_id])
107
+ end
82
108
  end
83
109
  end
84
110
  end
@@ -52,7 +52,8 @@ module ConnectorsSdk
52
52
  def download(item)
53
53
  content = item[:content]
54
54
  parent_id = content.dig('container', 'id')
55
- client.download("#{client.base_url}/wiki/rest/api/content/#{parent_id}/child/attachment/#{content['id']}/download").body
55
+ base_url = client.base_url.end_with?('/wiki') ? client.base_url : "#{client.base_url}/wiki"
56
+ client.download("#{base_url}/rest/api/content/#{parent_id}/child/attachment/#{content['id']}/download").body
56
57
  end
57
58
  end
58
59
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
5
+ # or more contributor license agreements. Licensed under the Elastic License;
6
+ # you may not use this file except in compliance with the Elastic License.
7
+ #
8
+ require 'hashie/mash'
9
+ require 'connectors_sdk/base/adapter'
10
+
11
+ module ConnectorsSdk
12
+ module GitLab
13
+ class Adapter < ConnectorsSdk::Base::Adapter
14
+ # it's important to have this to generate ID converters between the GitLab ID and the
15
+ # Enterprise Search document ID. The Enterprise Search document ID will be prefixed with the service type,
16
+ # in our case - `gitlab`.
17
+ generate_id_helpers :gitlab, 'gitlab'
18
+
19
+ def self.to_es_document(type, source_doc)
20
+ result = {
21
+ :id => gitlab_id_to_es_id(source_doc[:id]),
22
+ :type => type,
23
+ :url => source_doc[:web_url],
24
+ :body => source_doc[:description],
25
+ :title => source_doc[:name],
26
+ :created_at => source_doc[:created_at],
27
+ :last_modified_at => source_doc[:last_activity_at],
28
+ :visibility => source_doc[:visibility],
29
+ :namespace => if source_doc[:namespace].nil?
30
+ nil
31
+ else
32
+ source_doc[:namespace][:name]
33
+ end
34
+ }
35
+ if source_doc[:_allow_permissions].present?
36
+ result[:_allow_permissions] = source_doc[:_allow_permissions]
37
+ end
38
+ result
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,26 @@
1
+ #
2
+ # Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ # or more contributor license agreements. Licensed under the Elastic License;
4
+ # you may not use this file except in compliance with the Elastic License.
5
+ #
6
+
7
+ # frozen_string_literal: true
8
+
9
+ require 'connectors_sdk/base/config'
10
+
11
+ module ConnectorsSdk
12
+ module GitLab
13
+ class Config < ConnectorsSdk::Base::Config
14
+ attr_reader :index_permissions
15
+
16
+ def initialize(cursors:, index_permissions: false)
17
+ super(:cursors => cursors)
18
+ @index_permissions = index_permissions || false
19
+ end
20
+
21
+ def to_h
22
+ super.merge(:index_permissions => index_permissions)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,71 @@
1
+ #
2
+ # Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ # or more contributor license agreements. Licensed under the Elastic License;
4
+ # you may not use this file except in compliance with the Elastic License.
5
+ #
6
+
7
+ # frozen_string_literal: true
8
+
9
+ require 'connectors_sdk/base/connector'
10
+ require 'connectors_sdk/gitlab/custom_client'
11
+ require 'connectors_sdk/gitlab/adapter'
12
+ require 'connectors_sdk/gitlab/config'
13
+ require 'connectors_sdk/gitlab/extractor'
14
+ require 'rack/utils'
15
+
16
+ module ConnectorsSdk
17
+ module GitLab
18
+ class Connector < ConnectorsSdk::Base::Connector
19
+ SERVICE_TYPE = 'gitlab'
20
+
21
+ def display_name
22
+ 'GitLab Connector'
23
+ end
24
+
25
+ def configurable_fields
26
+ [
27
+ {
28
+ 'key' => 'api_token',
29
+ 'label' => 'API Token'
30
+ },
31
+ {
32
+ 'key' => 'base_url',
33
+ 'label' => 'Base URL'
34
+ }
35
+ ]
36
+ end
37
+
38
+ private
39
+
40
+ def client(params)
41
+ ConnectorsSdk::GitLab::CustomClient.new(
42
+ :base_url => params[:base_url] || ConnectorsSdk::GitLab::API_BASE_URL,
43
+ :api_token => params[:api_token]
44
+ )
45
+ end
46
+
47
+ def config(params)
48
+ ConnectorsSdk::GitLab::Config.new(
49
+ :cursors => params.fetch(:cursors, {}) || {},
50
+ :index_permissions => params.fetch(:index_permissions, false)
51
+ )
52
+ end
53
+
54
+ def extractor_class
55
+ ConnectorsSdk::GitLab::Extractor
56
+ end
57
+
58
+ def custom_client_error
59
+ ConnectorsSdk::GitLab::CustomClient::ClientError
60
+ end
61
+
62
+ def health_check(params)
63
+ # let's do a simple call
64
+ response = client(params).get('user')
65
+ unless response.present? && response.status == 200
66
+ raise "Health check failed with response status #{response.status} and body #{response.body}"
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,40 @@
1
+ #
2
+ # Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ # or more contributor license agreements. Licensed under the Elastic License;
4
+ # you may not use this file except in compliance with the Elastic License.
5
+ #
6
+ require 'faraday_middleware/response/follow_redirects'
7
+ require 'connectors_sdk/base/custom_client'
8
+ require 'connectors_shared/middleware/bearer_auth'
9
+ require 'connectors_shared/middleware/basic_auth'
10
+ require 'connectors_shared/middleware/restrict_hostnames'
11
+
12
+ module ConnectorsSdk
13
+ module GitLab
14
+ API_BASE_URL = 'https://gitlab.com/api/v4'
15
+
16
+ class CustomClient < ConnectorsSdk::Base::CustomClient
17
+ class ClientError < ConnectorsShared::ClientError
18
+ attr_reader :status_code, :endpoint
19
+
20
+ def initialize(status_code, endpoint)
21
+ @status_code = status_code
22
+ @endpoint = endpoint
23
+ end
24
+ end
25
+
26
+ def initialize(base_url:, api_token:, ensure_fresh_auth: nil)
27
+ @api_token = api_token
28
+ super(:base_url => base_url, :ensure_fresh_auth => ensure_fresh_auth)
29
+ end
30
+
31
+ def additional_middleware
32
+ [
33
+ ::FaradayMiddleware::FollowRedirects,
34
+ [ConnectorsShared::Middleware::RestrictHostnames, { :allowed_hosts => [base_url, API_BASE_URL] }],
35
+ [ConnectorsShared::Middleware::BearerAuth, { :bearer_auth_token => @api_token }]
36
+ ]
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,123 @@
1
+ #
2
+ # Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ # or more contributor license agreements. Licensed under the Elastic License;
4
+ # you may not use this file except in compliance with the Elastic License.
5
+ #
6
+
7
+ # frozen_string_literal: true
8
+
9
+ require 'connectors_sdk/base/extractor'
10
+ require 'connectors_sdk/gitlab/custom_client'
11
+ require 'connectors_sdk/gitlab/adapter'
12
+ require 'connectors_sdk/gitlab/config'
13
+ require 'rack/utils'
14
+
15
+ module ConnectorsSdk
16
+ module GitLab
17
+ class Extractor < ConnectorsSdk::Base::Extractor
18
+ PAGE_SIZE = 100 # max is 100
19
+
20
+ def yield_document_changes(modified_since: nil)
21
+ query_params = {
22
+ :pagination => :keyset,
23
+ :per_page => PAGE_SIZE,
24
+ :order_by => :id,
25
+ :sort => :desc
26
+ }
27
+ # looks like it's an incremental sync
28
+ if modified_since.present?
29
+ date_since = modified_since.is_a?(Time) ? modified_since : Time.new(modified_since)
30
+ query_params[:last_activity_after] = date_since.iso8601
31
+ end
32
+
33
+ next_page_link = nil
34
+
35
+ loop do
36
+ if next_page_link.present?
37
+ if (matcher = /(https?:[^>]*)/.match(next_page_link))
38
+ clean_query = URI.parse(matcher.captures[0]).query
39
+ query_params = Rack::Utils.parse_query(clean_query)
40
+ else
41
+ raise "Next page link has unexpected format: #{next_page_link}"
42
+ end
43
+ end
44
+ response = client.get('projects', query_params)
45
+
46
+ JSON.parse(response.body).map do |doc|
47
+ doc = doc.with_indifferent_access
48
+ if config.index_permissions
49
+ doc = doc.merge(project_permissions(doc[:id], doc[:visibility]))
50
+ end
51
+ yield :create_or_update, ConnectorsSdk::GitLab::Adapter.to_es_document(:project, doc), nil
52
+ end
53
+
54
+ next_page_link = response.headers['Link'] || nil
55
+ break unless next_page_link.present?
56
+ end
57
+ end
58
+
59
+ def yield_deleted_ids(ids)
60
+ if ids.present?
61
+ ids.each do |id|
62
+ response = client.get("projects/#{id}")
63
+ if response.status == 404
64
+ # not found - assume deleted
65
+ yield id
66
+ else
67
+ unless response.success?
68
+ raise "Could not get a project by ID: #{id}, response code: #{response.status}, response: #{response.body}"
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ def yield_permissions(source_user_id)
76
+ result = []
77
+ if source_user_id.present?
78
+ result.push("user:#{source_user_id}")
79
+
80
+ user_response = client.get("users/#{source_user_id}")
81
+ if user_response.success?
82
+ username = JSON.parse(user_response.body).with_indifferent_access[:username]
83
+ query = { :external => true, :username => username }
84
+ external_response = client.get('users', query)
85
+ if external_response.success?
86
+ external_users = Hashie::Array.new(JSON.parse(external_response.body))
87
+ if external_users.empty?
88
+ # the user is not external
89
+ result.push('type:internal')
90
+ end
91
+ else
92
+ raise "Could not check external user status by ID: #{source_user_id}"
93
+ end
94
+ else
95
+ raise "User isn't found by ID: #{source_user_id}"
96
+ end
97
+ end
98
+ yield result
99
+ end
100
+
101
+ private
102
+
103
+ def project_permissions(id, visibility)
104
+ result = []
105
+ if visibility.to_sym == :public || !config.index_permissions
106
+ # visible-to-all
107
+ return {}
108
+ end
109
+ if visibility.to_sym == :internal
110
+ result.push('type:internal')
111
+ end
112
+ response = client.get("projects/#{id}/members/all")
113
+ if response.success?
114
+ members = Hashie::Array.new(JSON.parse(response.body))
115
+ result.concat(members.map { |user| "user:#{user[:id]}" })
116
+ else
117
+ raise "Could not get project members by project ID: #{id}, response code: #{response.status}, response: #{response.body}"
118
+ end
119
+ { :_allow_permissions => result }
120
+ end
121
+ end
122
+ end
123
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: connectors_sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.3.0.0
4
+ version: 8.3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-25 00:00:00.000000000 Z
11
+ date: 2022-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -52,6 +52,118 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: tzinfo-data
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: faraday
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: faraday_middleware
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: forwardable
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: hashie
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: httpclient
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: signet
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
55
167
  description: ''
56
168
  email: ent-search-dev@elastic.co
57
169
  executables: []
@@ -77,6 +189,11 @@ files:
77
189
  - lib/connectors_sdk/confluence_cloud/connector.rb
78
190
  - lib/connectors_sdk/confluence_cloud/custom_client.rb
79
191
  - lib/connectors_sdk/confluence_cloud/extractor.rb
192
+ - lib/connectors_sdk/gitlab/adapter.rb
193
+ - lib/connectors_sdk/gitlab/config.rb
194
+ - lib/connectors_sdk/gitlab/connector.rb
195
+ - lib/connectors_sdk/gitlab/custom_client.rb
196
+ - lib/connectors_sdk/gitlab/extractor.rb
80
197
  - lib/connectors_sdk/helpers/atlassian_time_formatter.rb
81
198
  - lib/connectors_sdk/office365/adapter.rb
82
199
  - lib/connectors_sdk/office365/config.rb
@@ -99,13 +216,12 @@ files:
99
216
  - lib/connectors_shared/middleware/bearer_auth.rb
100
217
  - lib/connectors_shared/middleware/restrict_hostnames.rb
101
218
  - lib/connectors_shared/monitor.rb
102
- - lib/stubs/enterprise_search/exception_tracking.rb
103
219
  homepage: https://github.com/elastic/connectors
104
220
  licenses:
105
221
  - Elastic-2.0
106
222
  metadata:
107
- revision: 8fe65b05c8d8c89d62d73e7d717238a5393d42f5
108
- repository: git@github.com:elastic/connectors.git
223
+ revision: ae98106feeebb94ba10c0f52dc49f3054eaa36c0
224
+ repository: git@github.com:elastic/ent-search-connectors.git
109
225
  post_install_message:
110
226
  rdoc_options: []
111
227
  require_paths:
@@ -1,43 +0,0 @@
1
- #
2
- # Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
- # or more contributor license agreements. Licensed under the Elastic License;
4
- # you may not use this file except in compliance with the Elastic License.
5
- #
6
-
7
- module EnterpriseSearch
8
- class ExceptionTracking
9
- def self.capture_message(message, context = {})
10
- AppConfig.connectors_logger.error { "Error: #{message}. Context: #{context.inspect}" }
11
-
12
- # When the method is called from a rescue block, our return value may leak outside of its
13
- # intended scope, so let's explicitly return nil here to be safe.
14
- nil
15
- end
16
-
17
- def self.log_exception(exception, message = nil, context: nil, logger: AppConfig.connectors_logger)
18
- logger.error { message } if message
19
- logger.error { generate_stack_trace(exception) }
20
- logger.error { "Context: #{context.inspect}" } if context
21
- end
22
-
23
- def self.generate_error_message(exception, message, context)
24
- context = { :message_id => exception.id }.merge(context || {}) if exception.respond_to?(:id)
25
- context_message = context && "Context: #{context.inspect}"
26
- ['Exception', message, exception.class.to_s, exception.message, context_message]
27
- .compact
28
- .map { |part| part.to_s.dup.force_encoding('UTF-8') }
29
- .join(': ')
30
- end
31
-
32
- def self.generate_stack_trace(exception)
33
- full_message = exception.full_message
34
-
35
- cause = exception
36
- while cause.cause != cause && (cause = cause.cause)
37
- full_message << "Cause:\n#{cause.full_message}"
38
- end
39
-
40
- full_message.dup.force_encoding('UTF-8')
41
- end
42
- end
43
- end