datadome_module 1.1.0 → 1.2.0

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: ddcdafc8d1dc67d5820375afd61d2c14492245b14df2d52537176ed7baa7c52c
4
- data.tar.gz: d657d8a0738e8ba53f5b3a34a57794a0827357ae1061fe72f2295e10895ab7d9
3
+ metadata.gz: da078c3d8b29968135733910234cfc5c523f256aa12a96377db4d29705b28dc6
4
+ data.tar.gz: db0ee5c87fe7937e8340ecf1ccc79dee48e77f29c11feed9adc95e659ad5ecc9
5
5
  SHA512:
6
- metadata.gz: d973f4d93db659e56d72896712a9bfddfcbaff2b0c4df1c70117d5b15d6e57ccfa6625e890899f0a7d8022692f1a0afd5e0502652ac152e4c4d503822294526f
7
- data.tar.gz: 8b7ca8e955384b9e335d251c2fe9a8f301f5a241f30843a67407c573a03642aa05d2fce840ace443ecd4501ee69992109d15e290cba976a4d23080a21dbe62c9
6
+ metadata.gz: 438a444b14b372e7b468ac14bcc3d596ccbd8b3a1ae532a7d619d4f22581516cb7ee92fa4bdc84c8bbbc41647500dca62bee8e4e68b6d40634fde65e7c4ff4e8
7
+ data.tar.gz: bcaeeb008b4e593e4028e41fd9f0be4e5f5672b6aa11154a0e655fde5e63188e84cc4fe358ff1194b68385c633217ff499baf37286103a9d283bed14fbb4063e
data/lib/constants.rb CHANGED
@@ -1,4 +1,4 @@
1
- MODULE_VERSION = '1.1.0'
1
+ MODULE_VERSION = '1.2.0'
2
2
  MODULE_NAME = 'datadome_module'
3
3
 
4
4
  VALIDATE_REQUEST_PATH = '/validate-request'
@@ -23,14 +23,38 @@ class DataDomeModule
23
23
  return @app.call(env) unless assessment_result
24
24
  return assessment_result.response_array unless assessment_result.legitimate_request?
25
25
 
26
+ enrich_request_headers(env, assessment_result.request_headers)
26
27
  status, headers, payload = @app.call(env)
27
- headers = headers.merge(assessment_result.headers)
28
+
29
+ # Merge the headers from DataDome with the original headers
30
+ headers = headers.merge(assessment_result.headers) do |key, request_header_val, datadome_header_val|
31
+ if key.downcase == "set-cookie" && request_header_val
32
+ # Handle the merge for cookies when the protected request has at least one cookie
33
+ # If the original request contains one cookie, ensure it's in an array format for uniform handling
34
+ request_header_val = [request_header_val] unless request_header_val.is_a?(Array)
35
+
36
+ # Remove any cookies that start with 'datadome=' from the original request's cookies
37
+ request_header_val.reject! { |cookie| cookie.downcase.start_with?("datadome=") }
38
+
39
+ # Return the cookies merged with the new value of the datadome cookie
40
+ [datadome_header_val, *request_header_val]
41
+ else
42
+ # For DataDome headers other than 'Set-Cookie', return the value.
43
+ datadome_header_val
44
+ end
45
+ end
28
46
 
29
47
  [status, headers, payload]
30
48
  end
31
49
 
32
50
  private
33
51
 
52
+ def enrich_request_headers(env, request_headers)
53
+ request_headers.each do |header_name, header_value|
54
+ env["HTTP_#{header_name.upcase.tr('-', '_')}"] = header_value
55
+ end
56
+ end
57
+
34
58
  def datadome_assessment(request)
35
59
  return unless datadome_assessment_enabled?
36
60
  return if endpoint_hidden_from_datadome?(request)
@@ -25,7 +25,8 @@ class ProcessAssessment
25
25
  Response.new(
26
26
  status: dd_response.status,
27
27
  headers: headers_hash(dd_response),
28
- payload: dd_response.body
28
+ payload: dd_response.body,
29
+ request_headers: request_headers_hash(dd_response)
29
30
  )
30
31
  rescue Faraday::TimeoutError
31
32
  MD.logger.error("#{self.class}: Protection API request timed out")
@@ -55,6 +56,14 @@ class ProcessAssessment
55
56
  end
56
57
  end
57
58
 
59
+ def request_headers_hash(dd_response)
60
+ header_names = dd_response.headers['X-DataDome-Request-Headers']&.split || []
61
+
62
+ header_names.each_with_object({}) do |header, hash|
63
+ hash[header] = dd_response.headers[header]
64
+ end
65
+ end
66
+
58
67
  def client
59
68
  Faraday.new(api_uri) do |builder|
60
69
  builder.request :url_encoded
data/lib/request_data.rb CHANGED
@@ -9,6 +9,7 @@ class RequestData
9
9
  DATA_LIMITS = {
10
10
  SecCHDeviceMemory: 8,
11
11
  SecCHUAMobile: 8,
12
+ SecFetchStorageAccess: 8,
12
13
  SecFetchUser: 8,
13
14
  TlsProtocol: 8,
14
15
  SecCHUAArch: 16,
@@ -117,6 +118,7 @@ class RequestData
117
118
  'SecFetchDest': headers['HTTP_SEC_FETCH_DEST'],
118
119
  'SecFetchMode': headers['HTTP_SEC_FETCH_MODE'],
119
120
  'SecFetchSite': headers['HTTP_SEC_FETCH_SITE'],
121
+ 'SecFetchStorageAccess': headers['HTTP_SEC_FETCH_STORAGE_ACCESS'],
120
122
  'SecFetchUser': headers['HTTP_SEC_FETCH_USER'],
121
123
  'ServerHostname': headers['HTTP_HOST'],
122
124
  'ServerName': Socket.gethostname,
data/lib/response.rb CHANGED
@@ -2,12 +2,13 @@
2
2
 
3
3
  class Response
4
4
 
5
- attr_reader :headers
5
+ attr_reader :headers, :request_headers
6
6
 
7
- def initialize(status: 200, headers: {}, payload: nil)
7
+ def initialize(status: 200, headers: {}, payload: nil, request_headers: {})
8
8
  @status = status
9
9
  @headers = headers
10
10
  @payload = payload
11
+ @request_headers = request_headers
11
12
  end
12
13
 
13
14
  def response_array
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadome_module
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - DataDome
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-24 00:00:00.000000000 Z
11
+ date: 2026-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday