1
1
# frozen_string_literal: true
2
2
3
3
require_relative '../../../instrumentation/gateway'
4
- require_relative '../../../reactive/engine'
5
- require_relative '../reactive/action'
6
4
require_relative '../../../event'
7
5
8
6
module Datadog
@@ -21,31 +19,28 @@ def watch
21
19
22
20
def watch_request_action ( gateway = Instrumentation . gateway )
23
21
gateway . watch ( 'rails.request.action' , :appsec ) do |stack , gateway_request |
24
- event = nil
25
22
context = gateway_request . env [ Datadog ::AppSec ::Ext ::CONTEXT_KEY ]
26
- engine = AppSec ::Reactive ::Engine . new
27
-
28
- Rails ::Reactive ::Action . subscribe ( engine , context ) do |result |
29
- if result . match?
30
- # TODO: should this hash be an Event instance instead?
31
- event = {
32
- waf_result : result ,
33
- trace : context . trace ,
34
- span : context . span ,
35
- request : gateway_request ,
36
- actions : result . actions
37
- }
38
-
39
- # We want to keep the trace in case of security event
40
- context . trace . keep! if context . trace
41
- Datadog ::AppSec ::Event . tag_and_keep! ( context , result )
42
- context . events << event
43
-
44
- Datadog ::AppSec ::ActionsHandler . handle ( result . actions )
45
- end
46
- end
47
23
48
- Rails ::Reactive ::Action . publish ( engine , gateway_request )
24
+ persistent_data = {
25
+ 'server.request.body' => gateway_request . parsed_body ,
26
+ 'server.request.path_params' => gateway_request . route_params
27
+ }
28
+
29
+ result = context . run_waf ( persistent_data , { } , Datadog . configuration . appsec . waf_timeout )
30
+
31
+ if result . match?
32
+ Datadog ::AppSec ::Event . tag_and_keep! ( context , result )
33
+
34
+ context . events << {
35
+ waf_result : result ,
36
+ trace : context . trace ,
37
+ span : context . span ,
38
+ request : gateway_request ,
39
+ actions : result . actions
40
+ }
41
+
42
+ Datadog ::AppSec ::ActionsHandler . handle ( result . actions )
43
+ end
49
44
50
45
stack . call ( gateway_request . request )
51
46
end
0 commit comments