logstash-input-elasticsearch 4.23.0 → 4.23.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 330a1fd55cb3fa00918a73dcd41b66e63ce81d6fc79dc68f4209385429e588d4
4
- data.tar.gz: 5ba0377bcaaa9b428a4a848e32fff5019353ca7f6b3c8bb77944156d05230d6f
3
+ metadata.gz: 4659e2475716f4e770b355e8fc7d05aac897efe0f392b78845e1d2d72278b82c
4
+ data.tar.gz: dc57e5eb3592d4106a04a68be952e72863a0d9315f0458880871c54d2827531a
5
5
  SHA512:
6
- metadata.gz: 8be2dc35edde5b3b83c2c5711941c58c9aa3e45330e3785fef21269af134e13d031e10cdc324cf31e35b6c42a48f215f9ff2e8d58bc3a77fcc0c5a31c2084998
7
- data.tar.gz: b0456a0a04f365a34e35d6b8f8040e75a4d9a0f73718a2958f3c87823e5e41a5b04308b8f1710b8d5aa57091015aba273f308c75bd79c61494fecea4baf00d8e
6
+ metadata.gz: 383efe321bc63ee288e974edc589b2edffcf659a8fab8d82edc8290aaf77c02965e0ddc3ba40154cdfa667a3176741c01f7b929ef41f49424e2a333e09c23bfa
7
+ data.tar.gz: d7a5461caba35b6d20ec3034d94489f1ecbd1f74fb51904b2eb6e077756ee68342e9d2b06b55722b4ad40b1f71dfbe071e2381c183e6a38a29912e0b16a7380f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 4.23.1
2
+ - Support base64-encoded and Elastic Cloud (`essu_`-prefixed) API keys in the `api_key` option; reject unrecognized formats at startup. [#276](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/276)
3
+
1
4
  ## 4.23.0
2
5
  - ES|QL support [#235](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/235)
3
6
 
data/docs/index.asciidoc CHANGED
@@ -401,10 +401,12 @@ input plugins.
401
401
 
402
402
  Authenticate using Elasticsearch API key. Note that this option also requires enabling the <<plugins-{type}s-{plugin}-ssl_enabled>> option.
403
403
 
404
- Format is `id:api_key` where `id` and `api_key` are as returned by the
404
+ The format is `id:api_key`, where `id` and `api_key` are as returned by the
405
405
  Elasticsearch
406
406
  {ref}/security-api-create-api-key.html[Create
407
- API key API].
407
+ API key API]. The base64-encoded form of that pair is also accepted, as is an
408
+ https://www.elastic.co/docs/deploy-manage/api-keys/elastic-cloud-api-keys[Elastic Cloud API key]
409
+ (prefixed with `essu_`), which is used as-is.
408
410
 
409
411
  [id="plugins-{type}s-{plugin}-ca_trusted_fingerprint"]
410
412
  ===== `ca_trusted_fingerprint`
@@ -215,7 +215,8 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
215
215
  config :cloud_auth, :validate => :password
216
216
 
217
217
  # Authenticate using Elasticsearch API key.
218
- # format is id:api_key (as returned by https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html[Create API key])
218
+ # Format is either the `id:api_key` pair (as returned by https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html[Create API key]),
219
+ # its base64-encoded form, or an https://www.elastic.co/docs/deploy-manage/api-keys/elastic-cloud-api-keys[Elastic Cloud API key] (prefixed with `essu_`) can be used.
219
220
  config :api_key, :validate => :password
220
221
 
221
222
  # Set the address of a forward HTTP proxy.
@@ -599,12 +600,40 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
599
600
  end
600
601
 
601
602
  def setup_api_key(api_key)
602
- return {} unless (api_key && api_key.value)
603
+ return {} unless (api_key&.value)
603
604
 
604
- token = ::Base64.strict_encode64(api_key.value)
605
+ token = resolve_api_key(api_key.value)
605
606
  { 'Authorization' => "ApiKey #{token}" }
606
607
  end
607
608
 
609
+ # Resolves the `api_key` value into the credential used in the
610
+ # `Authorization: ApiKey` header. An already base64-encoded key and an Elastic
611
+ # Cloud API key are used as-is; a raw `id:api_key` pair is base64-encoded. An
612
+ # unrecognized value is rejected so a malformed key surfaces at startup rather
613
+ # than as a later authentication failure.
614
+ def resolve_api_key(key_value)
615
+ if base64?(key_value) || cloud_api_key?(key_value)
616
+ key_value
617
+ elsif key_value.match?(/\A[^:]+:[^:]+\z/)
618
+ Base64.strict_encode64(key_value)
619
+ else
620
+ raise LogStash::ConfigurationError, "Invalid api_key format. Expected a base64-encoded key, an 'id:api_key' pair, or a Cloud API key (essu_ prefix)."
621
+ end
622
+ end
623
+
624
+ # Elastic Cloud API keys (such as the unified Serverless keys) are opaque
625
+ # tokens prefixed with `essu_` that Elasticsearch accepts verbatim in the
626
+ # `Authorization: ApiKey` header, with no base64 encoding.
627
+ def cloud_api_key?(string)
628
+ string.match?(/\Aessu_.+/)
629
+ end
630
+
631
+ def base64?(string)
632
+ string == Base64.strict_encode64(Base64.strict_decode64(string))
633
+ rescue ArgumentError
634
+ false
635
+ end
636
+
608
637
  def prepare_user_agent
609
638
  os_name = java.lang.System.getProperty('os.name')
610
639
  os_version = java.lang.System.getProperty('os.version')
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-input-elasticsearch'
4
- s.version = '4.23.0'
4
+ s.version = ::File.read('version').split("\n").first
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Reads query results from an Elasticsearch cluster"
7
7
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
11
11
  s.require_paths = ["lib"]
12
12
 
13
13
  # Files
14
- s.files = Dir["lib/**/*","spec/**/*","*.gemspec","*.md","CONTRIBUTORS","Gemfile","LICENSE","NOTICE.TXT", "vendor/jar-dependencies/**/*.jar", "vendor/jar-dependencies/**/*.rb", "VERSION", "docs/**/*"]
14
+ s.files = Dir["lib/**/*","spec/**/*","*.gemspec","*.md","CONTRIBUTORS","Gemfile","LICENSE","NOTICE.TXT", "vendor/jar-dependencies/**/*.jar", "vendor/jar-dependencies/**/*.rb", "VERSION", "version", "docs/**/*"]
15
15
 
16
16
  # Tests
17
17
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
@@ -1 +1 @@
1
- 2024-12-26T22:27:15+00:00
1
+ 2026-01-23T17:38:25+01:00
@@ -1,7 +1,7 @@
1
1
  -----BEGIN CERTIFICATE-----
2
2
  MIIDFTCCAf2gAwIBAgIBATANBgkqhkiG9w0BAQsFADA0MTIwMAYDVQQDEylFbGFz
3
- dGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTAeFw0yNDEyMjYy
4
- MjI3MTVaFw0yNTEyMjYyMjI3MTVaMDQxMjAwBgNVBAMTKUVsYXN0aWMgQ2VydGlm
3
+ dGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTAeFw0yNjAxMjMx
4
+ NjM4MjVaFw0yNzAxMjMxNjM4MjVaMDQxMjAwBgNVBAMTKUVsYXN0aWMgQ2VydGlm
5
5
  aWNhdGUgVG9vbCBBdXRvZ2VuZXJhdGVkIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
6
6
  AQ8AMIIBCgKCAQEArUe66xG4Y2zO13gRC+rBwyvxe+c01pqV6ukw6isIbJIQWs1/
7
7
  QfEMhUwYwKs6/UXxK+VwardcA2zYwngXbGGEtms+mpUfH5CdJnrqW7lHz1BVK4yH
@@ -10,10 +10,10 @@ QfEMhUwYwKs6/UXxK+VwardcA2zYwngXbGGEtms+mpUfH5CdJnrqW7lHz1BVK4yH
10
10
  i4lUiR6Uo9D6WMFjeRYFF7GolCy/I1SzWBmmOnNhQLO5VxcNG4ldhBcapZeGwE98
11
11
  m/5lxLIwgFR9ZP8bXdxZTWLC58/LQ2NqOjA9mwIDAQABozIwMDAPBgNVHRMBAf8E
12
12
  BTADAQH/MB0GA1UdDgQWBBTIJMnuftpfkxNCOkbF0R4xgcKQRjANBgkqhkiG9w0B
13
- AQsFAAOCAQEAhfg/cmXc4Uh90yiXU8jOW8saQjTsq4ZMDQiLfJsNmNNYmHFN0vhv
14
- lJRI1STdy7+GpjS5QbrMjQIxWSS8X8xysE4Rt81IrWmLuao35TRFyoiE1seBQ5sz
15
- p/BxZUe57JvWi9dyzv2df4UfWFdGBhzdr80odZmz4i5VIv6qCKJKsGikcuLpepmp
16
- E/UKnKHeR/dFWsxzA9P2OzHTUNBMOOA2PyAUL49pwoChwJeOWN/zAgwMWLbuHFG0
17
- IN0u8swAmeH98QdvzbhiOatGNpqfTNvQEDc19yVjfXKpBVZQ79WtronYSqrbrUa1
18
- T2zD8bIVP7CdddD/UmpT1SSKh4PJxudy5Q==
13
+ AQsFAAOCAQEAgZPz/e29AepHZu8uuO6+75b6Uf88m8x5m7XL13m9+vTTSqLvCiBw
14
+ JCf5caO73iOx8AlTT2iSlKPAS/7ogik5anZziqweHmBakb+HNQcUB4Vv4VBo5Ai3
15
+ SdOm28uu4EznVLUILPUHl4FQGxhn6ba1tLEWgxlD/ynBtfcmh9UFtBqIawrpAArv
16
+ TKwGBSkcSxh/yOIo+qbyBh9EyxxlGW/Z08m9qjNqHATDxCelcTsQLhCHkvNShR4j
17
+ v1sFw5XQ8H3zQU6w4WzV81A3K8erIU8WnvdisXLk0T1VB5KURy4+UDyw44tOAPD2
18
+ vBq3gYLgcVEMYVfOWCzDy7LS49leXRzAOA==
19
19
  -----END CERTIFICATE-----
@@ -1 +1 @@
1
- b1e955819b0d14f64f863adb103c248ddacf2e17bea48d04ee4b57c64814ccc4
1
+ 28c468dcfc5ed4626eeb748a91093c272dda52804c62e2ee1d8fd31c182009ae
@@ -1,7 +1,7 @@
1
1
  -----BEGIN CERTIFICATE-----
2
2
  MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADA0MTIwMAYDVQQDEylFbGFz
3
- dGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTAeFw0yNDEyMjYy
4
- MjI3MTVaFw0yNTEyMjYyMjI3MTVaMA0xCzAJBgNVBAMTAmVzMIIBIjANBgkqhkiG
3
+ dGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTAeFw0yNjAxMjMx
4
+ NjM4MjVaFw0yNzAxMjMxNjM4MjVaMA0xCzAJBgNVBAMTAmVzMIIBIjANBgkqhkiG
5
5
  9w0BAQEFAAOCAQ8AMIIBCgKCAQEArZLZvLSWDK7Ul+AaBnjU81dsfaow8zOjCC5V
6
6
  V21nXpYzQJoQbuWcvGYxwL7ZDs2ca4Wc8BVCj1NDduHuP7U+QIlUdQpl8kh5a0Zz
7
7
  36pcFw7UyF51/AzWixJrht/Azzkb5cpZtE22ZK0KhS4oCsjJmTN0EABAsGhDI9/c
@@ -10,17 +10,17 @@ MjNrUC7iP0dvfOuzAPp7ufY83h98jKKXUYV24snbbvmqoWI6GQQNSG/sEo1+1UGH
10
10
  hQNM3zcKKsjEMomBzVBc4SV3KXO0d/jGdDtlqsm2oXqlTMdtGwIDAQABo2cwZTAY
11
11
  BgNVHREEETAPgg1lbGFzdGljc2VhcmNoMAkGA1UdEwQCMAAwHQYDVR0OBBYEFFQU
12
12
  K+6Cg2kExRj1xSDzEi4kkgKXMB8GA1UdIwQYMBaAFMgkye5+2l+TE0I6RsXRHjGB
13
- wpBGMA0GCSqGSIb3DQEBCwUAA4IBAQB6cZ7IrDzcAoOZgAt9RlOe2yzQeH+alttp
14
- CSQVINjJotS1WvmtqjBB6ArqLpXIGU89TZsktNe/NQJzgYSaMnlIuHVLFdxJYmwU
15
- T1cP6VC/brmqP/dd5y7VWE7Lp+Wd5CxKl/WY+9chmgc+a1fW/lnPEJJ6pca1Bo8b
16
- byIL0yY2IUv4R2eh1IyQl9oGH1GOPLgO7cY04eajxYcOVA2eDSItoyDtrJfkFP/P
17
- UXtC1JAkvWKuujFEiBj0AannhroWlp3gvChhBwCuCAU0KXD6g8BE8tn6oT1+FW7J
18
- avSfHxAe+VHtYhF8sJ8jrdm0d7E4GKS9UR/pkLAL1JuRdJ1VkPx3
13
+ wpBGMA0GCSqGSIb3DQEBCwUAA4IBAQCDFHoe8ntx/D69gb8uVQhUDI2ERb0Hocbh
14
+ BpQVidsKEv220zmZW3O9PX0aN4j3e4HUeRNSdLmtN+sXJ1xCMjHlzA5z5wYJOk2y
15
+ 4B/eCOzHoHfvR+l5NUSemZ5mk8V+gThGydPmLZBN3afjzd3NJ7NVaCA8cyKwe2jr
16
+ AMrIdGL5usoBSdbd7Ww0nWhLhqxmmV79+orCwAPJxkzsgFDK+vfIw4VHERXNoIPe
17
+ WKVBGpUCFPSfosLo9fSziNDXL71CrWZlPXt3Otip4QKQV5sZI2zxm1JtHdHX6Ul1
18
+ X7xkcUR5cOF0InxefGl9VHIZTYC5kSzAz95WV068j2Jxgu28GRP5
19
19
  -----END CERTIFICATE-----
20
20
  -----BEGIN CERTIFICATE-----
21
21
  MIIDFTCCAf2gAwIBAgIBATANBgkqhkiG9w0BAQsFADA0MTIwMAYDVQQDEylFbGFz
22
- dGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTAeFw0yNDEyMjYy
23
- MjI3MTVaFw0yNTEyMjYyMjI3MTVaMDQxMjAwBgNVBAMTKUVsYXN0aWMgQ2VydGlm
22
+ dGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTAeFw0yNjAxMjMx
23
+ NjM4MjVaFw0yNzAxMjMxNjM4MjVaMDQxMjAwBgNVBAMTKUVsYXN0aWMgQ2VydGlm
24
24
  aWNhdGUgVG9vbCBBdXRvZ2VuZXJhdGVkIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
25
25
  AQ8AMIIBCgKCAQEArUe66xG4Y2zO13gRC+rBwyvxe+c01pqV6ukw6isIbJIQWs1/
26
26
  QfEMhUwYwKs6/UXxK+VwardcA2zYwngXbGGEtms+mpUfH5CdJnrqW7lHz1BVK4yH
@@ -29,10 +29,10 @@ QfEMhUwYwKs6/UXxK+VwardcA2zYwngXbGGEtms+mpUfH5CdJnrqW7lHz1BVK4yH
29
29
  i4lUiR6Uo9D6WMFjeRYFF7GolCy/I1SzWBmmOnNhQLO5VxcNG4ldhBcapZeGwE98
30
30
  m/5lxLIwgFR9ZP8bXdxZTWLC58/LQ2NqOjA9mwIDAQABozIwMDAPBgNVHRMBAf8E
31
31
  BTADAQH/MB0GA1UdDgQWBBTIJMnuftpfkxNCOkbF0R4xgcKQRjANBgkqhkiG9w0B
32
- AQsFAAOCAQEAhfg/cmXc4Uh90yiXU8jOW8saQjTsq4ZMDQiLfJsNmNNYmHFN0vhv
33
- lJRI1STdy7+GpjS5QbrMjQIxWSS8X8xysE4Rt81IrWmLuao35TRFyoiE1seBQ5sz
34
- p/BxZUe57JvWi9dyzv2df4UfWFdGBhzdr80odZmz4i5VIv6qCKJKsGikcuLpepmp
35
- E/UKnKHeR/dFWsxzA9P2OzHTUNBMOOA2PyAUL49pwoChwJeOWN/zAgwMWLbuHFG0
36
- IN0u8swAmeH98QdvzbhiOatGNpqfTNvQEDc19yVjfXKpBVZQ79WtronYSqrbrUa1
37
- T2zD8bIVP7CdddD/UmpT1SSKh4PJxudy5Q==
32
+ AQsFAAOCAQEAgZPz/e29AepHZu8uuO6+75b6Uf88m8x5m7XL13m9+vTTSqLvCiBw
33
+ JCf5caO73iOx8AlTT2iSlKPAS/7ogik5anZziqweHmBakb+HNQcUB4Vv4VBo5Ai3
34
+ SdOm28uu4EznVLUILPUHl4FQGxhn6ba1tLEWgxlD/ynBtfcmh9UFtBqIawrpAArv
35
+ TKwGBSkcSxh/yOIo+qbyBh9EyxxlGW/Z08m9qjNqHATDxCelcTsQLhCHkvNShR4j
36
+ v1sFw5XQ8H3zQU6w4WzV81A3K8erIU8WnvdisXLk0T1VB5KURy4+UDyw44tOAPD2
37
+ vBq3gYLgcVEMYVfOWCzDy7LS49leXRzAOA==
38
38
  -----END CERTIFICATE-----
@@ -1,7 +1,7 @@
1
1
  -----BEGIN CERTIFICATE-----
2
2
  MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADA0MTIwMAYDVQQDEylFbGFz
3
- dGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTAeFw0yNDEyMjYy
4
- MjI3MTVaFw0yNTEyMjYyMjI3MTVaMA0xCzAJBgNVBAMTAmVzMIIBIjANBgkqhkiG
3
+ dGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTAeFw0yNjAxMjMx
4
+ NjM4MjVaFw0yNzAxMjMxNjM4MjVaMA0xCzAJBgNVBAMTAmVzMIIBIjANBgkqhkiG
5
5
  9w0BAQEFAAOCAQ8AMIIBCgKCAQEArZLZvLSWDK7Ul+AaBnjU81dsfaow8zOjCC5V
6
6
  V21nXpYzQJoQbuWcvGYxwL7ZDs2ca4Wc8BVCj1NDduHuP7U+QIlUdQpl8kh5a0Zz
7
7
  36pcFw7UyF51/AzWixJrht/Azzkb5cpZtE22ZK0KhS4oCsjJmTN0EABAsGhDI9/c
@@ -10,10 +10,10 @@ MjNrUC7iP0dvfOuzAPp7ufY83h98jKKXUYV24snbbvmqoWI6GQQNSG/sEo1+1UGH
10
10
  hQNM3zcKKsjEMomBzVBc4SV3KXO0d/jGdDtlqsm2oXqlTMdtGwIDAQABo2cwZTAY
11
11
  BgNVHREEETAPgg1lbGFzdGljc2VhcmNoMAkGA1UdEwQCMAAwHQYDVR0OBBYEFFQU
12
12
  K+6Cg2kExRj1xSDzEi4kkgKXMB8GA1UdIwQYMBaAFMgkye5+2l+TE0I6RsXRHjGB
13
- wpBGMA0GCSqGSIb3DQEBCwUAA4IBAQB6cZ7IrDzcAoOZgAt9RlOe2yzQeH+alttp
14
- CSQVINjJotS1WvmtqjBB6ArqLpXIGU89TZsktNe/NQJzgYSaMnlIuHVLFdxJYmwU
15
- T1cP6VC/brmqP/dd5y7VWE7Lp+Wd5CxKl/WY+9chmgc+a1fW/lnPEJJ6pca1Bo8b
16
- byIL0yY2IUv4R2eh1IyQl9oGH1GOPLgO7cY04eajxYcOVA2eDSItoyDtrJfkFP/P
17
- UXtC1JAkvWKuujFEiBj0AannhroWlp3gvChhBwCuCAU0KXD6g8BE8tn6oT1+FW7J
18
- avSfHxAe+VHtYhF8sJ8jrdm0d7E4GKS9UR/pkLAL1JuRdJ1VkPx3
13
+ wpBGMA0GCSqGSIb3DQEBCwUAA4IBAQCDFHoe8ntx/D69gb8uVQhUDI2ERb0Hocbh
14
+ BpQVidsKEv220zmZW3O9PX0aN4j3e4HUeRNSdLmtN+sXJ1xCMjHlzA5z5wYJOk2y
15
+ 4B/eCOzHoHfvR+l5NUSemZ5mk8V+gThGydPmLZBN3afjzd3NJ7NVaCA8cyKwe2jr
16
+ AMrIdGL5usoBSdbd7Ww0nWhLhqxmmV79+orCwAPJxkzsgFDK+vfIw4VHERXNoIPe
17
+ WKVBGpUCFPSfosLo9fSziNDXL71CrWZlPXt3Otip4QKQV5sZI2zxm1JtHdHX6Ul1
18
+ X7xkcUR5cOF0InxefGl9VHIZTYC5kSzAz95WV068j2Jxgu28GRP5
19
19
  -----END CERTIFICATE-----
@@ -810,14 +810,50 @@ describe LogStash::Inputs::Elasticsearch, :ecs_compatibility_support do
810
810
  end
811
811
 
812
812
  context "with ssl" do
813
- let(:config) { super().merge({ 'api_key' => LogStash::Util::Password.new('foo:bar'), "ssl_enabled" => true }) }
813
+ let(:api_key_value) { nil }
814
+ let(:config) { super().merge("ssl_enabled" => true, 'api_key' => LogStash::Util::Password.new(api_key_value)) }
815
+ let(:encoded_api_key) { Base64.strict_encode64('foo:bar') }
814
816
 
815
- it "should set authorization" do
816
- plugin.register
817
- client = plugin.send(:client)
818
- auth_header = extract_transport(client).options[:transport_options][:headers]['Authorization']
817
+ shared_examples "a plugin that sets the ApiKey authorization header" do
818
+ it "correctly sets the Authorization header" do
819
+ plugin.register
820
+ client = plugin.send(:client)
821
+ auth_header = extract_transport(client).options[:transport_options][:headers]['Authorization']
822
+
823
+ expect(auth_header).to eql("ApiKey #{encoded_api_key}")
824
+ end
825
+ end
826
+
827
+ context "with a non-encoded API key" do
828
+ let(:api_key_value) { "foo:bar" }
829
+ it_behaves_like "a plugin that sets the ApiKey authorization header"
830
+ end
831
+
832
+ context "with an encoded API key" do
833
+ let(:api_key_value) { encoded_api_key }
834
+ it_behaves_like "a plugin that sets the ApiKey authorization header"
835
+ end
836
+
837
+ context "with an Elastic Cloud API key (essu_ prefix)" do
838
+ # The suffix is intentionally not canonical base64: a Cloud key is opaque
839
+ # and must be forwarded verbatim regardless of its payload encoding.
840
+ let(:api_key_value) { "essu_VFZGblZreFhTekJ4ZDB4M2NHUnZRMEU2YzNWd1pYSnpaV055WlhRPQ==AAAAAAAA" }
819
841
 
820
- expect( auth_header ).to eql "ApiKey #{Base64.strict_encode64('foo:bar')}"
842
+ it "sets the Authorization header verbatim without re-encoding" do
843
+ plugin.register
844
+ client = plugin.send(:client)
845
+ auth_header = extract_transport(client).options[:transport_options][:headers]['Authorization']
846
+
847
+ expect(auth_header).to eql("ApiKey #{api_key_value}")
848
+ end
849
+ end
850
+
851
+ context "with an unrecognized api_key format" do
852
+ let(:api_key_value) { "not-a-valid-key" }
853
+
854
+ it "fails registration with a configuration error" do
855
+ expect { plugin.register }.to raise_error(LogStash::ConfigurationError, /Invalid api_key format/)
856
+ end
821
857
  end
822
858
 
823
859
  context 'user also set' do
data/version ADDED
@@ -0,0 +1 @@
1
+ 4.23.1
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-elasticsearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.23.0
4
+ version: 4.23.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-06-06 00:00:00.000000000 Z
10
+ date: 2026-07-17 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
13
+ name: logstash-core-plugin-api
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - ">="
@@ -19,7 +19,6 @@ dependencies:
19
19
  - - "<="
20
20
  - !ruby/object:Gem::Version
21
21
  version: '2.99'
22
- name: logstash-core-plugin-api
23
22
  type: :runtime
24
23
  prerelease: false
25
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -31,12 +30,12 @@ dependencies:
31
30
  - !ruby/object:Gem::Version
32
31
  version: '2.99'
33
32
  - !ruby/object:Gem::Dependency
33
+ name: logstash-mixin-ecs_compatibility_support
34
34
  requirement: !ruby/object:Gem::Requirement
35
35
  requirements:
36
36
  - - "~>"
37
37
  - !ruby/object:Gem::Version
38
38
  version: '1.3'
39
- name: logstash-mixin-ecs_compatibility_support
40
39
  type: :runtime
41
40
  prerelease: false
42
41
  version_requirements: !ruby/object:Gem::Requirement
@@ -45,12 +44,12 @@ dependencies:
45
44
  - !ruby/object:Gem::Version
46
45
  version: '1.3'
47
46
  - !ruby/object:Gem::Dependency
47
+ name: logstash-mixin-event_support
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  requirements:
50
50
  - - "~>"
51
51
  - !ruby/object:Gem::Version
52
52
  version: '1.0'
53
- name: logstash-mixin-event_support
54
53
  type: :runtime
55
54
  prerelease: false
56
55
  version_requirements: !ruby/object:Gem::Requirement
@@ -59,12 +58,12 @@ dependencies:
59
58
  - !ruby/object:Gem::Version
60
59
  version: '1.0'
61
60
  - !ruby/object:Gem::Dependency
61
+ name: logstash-mixin-validator_support
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
66
  version: '1.0'
67
- name: logstash-mixin-validator_support
68
67
  type: :runtime
69
68
  prerelease: false
70
69
  version_requirements: !ruby/object:Gem::Requirement
@@ -73,12 +72,12 @@ dependencies:
73
72
  - !ruby/object:Gem::Version
74
73
  version: '1.0'
75
74
  - !ruby/object:Gem::Dependency
75
+ name: logstash-mixin-scheduler
76
76
  requirement: !ruby/object:Gem::Requirement
77
77
  requirements:
78
78
  - - "~>"
79
79
  - !ruby/object:Gem::Version
80
80
  version: '1.0'
81
- name: logstash-mixin-scheduler
82
81
  type: :runtime
83
82
  prerelease: false
84
83
  version_requirements: !ruby/object:Gem::Requirement
@@ -87,6 +86,7 @@ dependencies:
87
86
  - !ruby/object:Gem::Version
88
87
  version: '1.0'
89
88
  - !ruby/object:Gem::Dependency
89
+ name: elasticsearch
90
90
  requirement: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - ">="
@@ -95,7 +95,6 @@ dependencies:
95
95
  - - "<"
96
96
  - !ruby/object:Gem::Version
97
97
  version: '9'
98
- name: elasticsearch
99
98
  type: :runtime
100
99
  prerelease: false
101
100
  version_requirements: !ruby/object:Gem::Requirement
@@ -107,12 +106,12 @@ dependencies:
107
106
  - !ruby/object:Gem::Version
108
107
  version: '9'
109
108
  - !ruby/object:Gem::Dependency
109
+ name: logstash-mixin-ca_trusted_fingerprint_support
110
110
  requirement: !ruby/object:Gem::Requirement
111
111
  requirements:
112
112
  - - "~>"
113
113
  - !ruby/object:Gem::Version
114
114
  version: '1.0'
115
- name: logstash-mixin-ca_trusted_fingerprint_support
116
115
  type: :runtime
117
116
  prerelease: false
118
117
  version_requirements: !ruby/object:Gem::Requirement
@@ -121,12 +120,12 @@ dependencies:
121
120
  - !ruby/object:Gem::Version
122
121
  version: '1.0'
123
122
  - !ruby/object:Gem::Dependency
123
+ name: logstash-mixin-normalize_config_support
124
124
  requirement: !ruby/object:Gem::Requirement
125
125
  requirements:
126
126
  - - "~>"
127
127
  - !ruby/object:Gem::Version
128
128
  version: '1.0'
129
- name: logstash-mixin-normalize_config_support
130
129
  type: :runtime
131
130
  prerelease: false
132
131
  version_requirements: !ruby/object:Gem::Requirement
@@ -135,12 +134,12 @@ dependencies:
135
134
  - !ruby/object:Gem::Version
136
135
  version: '1.0'
137
136
  - !ruby/object:Gem::Dependency
137
+ name: tzinfo
138
138
  requirement: !ruby/object:Gem::Requirement
139
139
  requirements:
140
140
  - - ">="
141
141
  - !ruby/object:Gem::Version
142
142
  version: '0'
143
- name: tzinfo
144
143
  type: :runtime
145
144
  prerelease: false
146
145
  version_requirements: !ruby/object:Gem::Requirement
@@ -149,12 +148,12 @@ dependencies:
149
148
  - !ruby/object:Gem::Version
150
149
  version: '0'
151
150
  - !ruby/object:Gem::Dependency
151
+ name: tzinfo-data
152
152
  requirement: !ruby/object:Gem::Requirement
153
153
  requirements:
154
154
  - - ">="
155
155
  - !ruby/object:Gem::Version
156
156
  version: '0'
157
- name: tzinfo-data
158
157
  type: :runtime
159
158
  prerelease: false
160
159
  version_requirements: !ruby/object:Gem::Requirement
@@ -163,12 +162,12 @@ dependencies:
163
162
  - !ruby/object:Gem::Version
164
163
  version: '0'
165
164
  - !ruby/object:Gem::Dependency
165
+ name: manticore
166
166
  requirement: !ruby/object:Gem::Requirement
167
167
  requirements:
168
168
  - - ">="
169
169
  - !ruby/object:Gem::Version
170
170
  version: 0.7.1
171
- name: manticore
172
171
  type: :runtime
173
172
  prerelease: false
174
173
  version_requirements: !ruby/object:Gem::Requirement
@@ -177,12 +176,12 @@ dependencies:
177
176
  - !ruby/object:Gem::Version
178
177
  version: 0.7.1
179
178
  - !ruby/object:Gem::Dependency
179
+ name: logstash-codec-plain
180
180
  requirement: !ruby/object:Gem::Requirement
181
181
  requirements:
182
182
  - - ">="
183
183
  - !ruby/object:Gem::Version
184
184
  version: '0'
185
- name: logstash-codec-plain
186
185
  type: :development
187
186
  prerelease: false
188
187
  version_requirements: !ruby/object:Gem::Requirement
@@ -191,12 +190,12 @@ dependencies:
191
190
  - !ruby/object:Gem::Version
192
191
  version: '0'
193
192
  - !ruby/object:Gem::Dependency
193
+ name: logstash-devutils
194
194
  requirement: !ruby/object:Gem::Requirement
195
195
  requirements:
196
196
  - - ">="
197
197
  - !ruby/object:Gem::Version
198
198
  version: '0'
199
- name: logstash-devutils
200
199
  type: :development
201
200
  prerelease: false
202
201
  version_requirements: !ruby/object:Gem::Requirement
@@ -205,12 +204,12 @@ dependencies:
205
204
  - !ruby/object:Gem::Version
206
205
  version: '0'
207
206
  - !ruby/object:Gem::Dependency
207
+ name: timecop
208
208
  requirement: !ruby/object:Gem::Requirement
209
209
  requirements:
210
210
  - - ">="
211
211
  - !ruby/object:Gem::Version
212
212
  version: '0'
213
- name: timecop
214
213
  type: :development
215
214
  prerelease: false
216
215
  version_requirements: !ruby/object:Gem::Requirement
@@ -219,12 +218,12 @@ dependencies:
219
218
  - !ruby/object:Gem::Version
220
219
  version: '0'
221
220
  - !ruby/object:Gem::Dependency
221
+ name: cabin
222
222
  requirement: !ruby/object:Gem::Requirement
223
223
  requirements:
224
224
  - - "~>"
225
225
  - !ruby/object:Gem::Version
226
226
  version: '0.6'
227
- name: cabin
228
227
  type: :development
229
228
  prerelease: false
230
229
  version_requirements: !ruby/object:Gem::Requirement
@@ -233,12 +232,12 @@ dependencies:
233
232
  - !ruby/object:Gem::Version
234
233
  version: '0.6'
235
234
  - !ruby/object:Gem::Dependency
235
+ name: webrick
236
236
  requirement: !ruby/object:Gem::Requirement
237
237
  requirements:
238
238
  - - ">="
239
239
  - !ruby/object:Gem::Version
240
240
  version: '0'
241
- name: webrick
242
241
  type: :development
243
242
  prerelease: false
244
243
  version_requirements: !ruby/object:Gem::Requirement
@@ -247,12 +246,12 @@ dependencies:
247
246
  - !ruby/object:Gem::Version
248
247
  version: '0'
249
248
  - !ruby/object:Gem::Dependency
249
+ name: rufus-scheduler
250
250
  requirement: !ruby/object:Gem::Requirement
251
251
  requirements:
252
252
  - - "~>"
253
253
  - !ruby/object:Gem::Version
254
254
  version: 3.0.9
255
- name: rufus-scheduler
256
255
  type: :development
257
256
  prerelease: false
258
257
  version_requirements: !ruby/object:Gem::Requirement
@@ -300,13 +299,13 @@ files:
300
299
  - spec/inputs/integration/elasticsearch_esql_spec.rb
301
300
  - spec/inputs/integration/elasticsearch_spec.rb
302
301
  - spec/inputs/paginated_search_spec.rb
302
+ - version
303
303
  homepage: https://elastic.co/logstash
304
304
  licenses:
305
305
  - Apache License (2.0)
306
306
  metadata:
307
307
  logstash_plugin: 'true'
308
308
  logstash_group: input
309
- post_install_message:
310
309
  rdoc_options: []
311
310
  require_paths:
312
311
  - lib
@@ -321,8 +320,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
321
320
  - !ruby/object:Gem::Version
322
321
  version: '0'
323
322
  requirements: []
324
- rubygems_version: 3.3.26
325
- signing_key:
323
+ rubygems_version: 3.6.3
326
324
  specification_version: 4
327
325
  summary: Reads query results from an Elasticsearch cluster
328
326
  test_files: