contrast-agent 6.6.4 → 6.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (340) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -2
  3. data/.gitmodules +0 -3
  4. data/.simplecov +0 -1
  5. data/Rakefile +0 -1
  6. data/ext/cs__assess_array/cs__assess_array.c +41 -10
  7. data/ext/cs__assess_array/cs__assess_array.h +4 -1
  8. data/ext/cs__scope/cs__scope.c +1 -1
  9. data/lib/contrast/agent/assess/contrast_event.rb +2 -24
  10. data/lib/contrast/agent/assess/events/source_event.rb +7 -61
  11. data/lib/contrast/agent/assess/finalizers/hash.rb +11 -0
  12. data/lib/contrast/agent/assess/policy/dynamic_source_factory.rb +0 -55
  13. data/lib/contrast/agent/assess/policy/policy_node.rb +3 -3
  14. data/lib/contrast/agent/assess/policy/policy_node_utils.rb +0 -1
  15. data/lib/contrast/agent/assess/policy/propagation_node.rb +4 -4
  16. data/lib/contrast/agent/assess/policy/source_method.rb +24 -1
  17. data/lib/contrast/agent/assess/policy/trigger/reflected_xss.rb +7 -5
  18. data/lib/contrast/agent/assess/policy/trigger/xpath.rb +6 -1
  19. data/lib/contrast/agent/assess/policy/trigger_method.rb +40 -121
  20. data/lib/contrast/agent/assess/policy/trigger_node.rb +3 -3
  21. data/lib/contrast/agent/assess/policy/trigger_validation/redos_validator.rb +1 -1
  22. data/lib/contrast/agent/assess/policy/trigger_validation/ssrf_validator.rb +1 -1
  23. data/lib/contrast/agent/assess/policy/trigger_validation/xss_validator.rb +1 -1
  24. data/lib/contrast/agent/assess/property/evented.rb +2 -12
  25. data/lib/contrast/agent/assess/rule/provider/hardcoded_value_rule.rb +42 -82
  26. data/lib/contrast/agent/assess/rule/response/base_rule.rb +11 -27
  27. data/lib/contrast/agent/assess/rule/response/body_rule.rb +1 -3
  28. data/lib/contrast/agent/assess/rule/response/cache_control_header_rule.rb +77 -62
  29. data/lib/contrast/agent/assess/rule/response/csp_header_insecure_rule.rb +1 -1
  30. data/lib/contrast/agent/assess/rule/response/framework/rails_support.rb +6 -1
  31. data/lib/contrast/agent/assess/rule/response/header_rule.rb +5 -5
  32. data/lib/contrast/agent/assess/rule/response/hsts_header_rule.rb +1 -1
  33. data/lib/contrast/agent/assess/rule/response/x_xss_protection_header_rule.rb +1 -1
  34. data/lib/contrast/agent/assess/tracker.rb +1 -7
  35. data/lib/contrast/agent/at_exit_hook.rb +1 -7
  36. data/lib/contrast/agent/excluder.rb +224 -0
  37. data/lib/contrast/agent/exclusion_matcher.rb +25 -7
  38. data/lib/contrast/agent/inventory/database_config.rb +18 -23
  39. data/lib/contrast/agent/middleware.rb +4 -5
  40. data/lib/contrast/agent/patching/policy/after_load_patcher.rb +6 -0
  41. data/lib/contrast/agent/protect/input_analyzer/input_analyzer.rb +146 -127
  42. data/lib/contrast/agent/protect/policy/applies_command_injection_rule.rb +4 -0
  43. data/lib/contrast/agent/protect/policy/applies_path_traversal_rule.rb +20 -0
  44. data/lib/contrast/agent/protect/policy/applies_sqli_rule.rb +1 -0
  45. data/lib/contrast/agent/protect/policy/rule_applicator.rb +1 -1
  46. data/lib/contrast/agent/protect/rule/base.rb +98 -66
  47. data/lib/contrast/agent/protect/rule/base_service.rb +49 -24
  48. data/lib/contrast/agent/protect/rule/bot_blocker/bot_blocker_input_classification.rb +98 -0
  49. data/lib/contrast/agent/protect/rule/bot_blocker.rb +81 -0
  50. data/lib/contrast/agent/protect/rule/cmd_injection.rb +30 -99
  51. data/lib/contrast/agent/protect/rule/cmdi/cmdi_backdoors.rb +132 -0
  52. data/lib/contrast/agent/protect/rule/cmdi/cmdi_base_rule.rb +169 -0
  53. data/lib/contrast/agent/protect/rule/cmdi/cmdi_chained_command.rb +69 -0
  54. data/lib/contrast/agent/protect/rule/cmdi/cmdi_dangerous_path.rb +68 -0
  55. data/lib/contrast/agent/protect/rule/cmdi/cmdi_input_classification.rb +2 -58
  56. data/lib/contrast/agent/protect/rule/default_scanner.rb +1 -1
  57. data/lib/contrast/agent/protect/rule/deserialization.rb +10 -19
  58. data/lib/contrast/agent/protect/rule/http_method_tampering/http_method_tampering_input_classification.rb +2 -2
  59. data/lib/contrast/agent/protect/rule/http_method_tampering.rb +0 -11
  60. data/lib/contrast/agent/protect/rule/no_sqli/no_sqli_input_classification.rb +29 -34
  61. data/lib/contrast/agent/protect/rule/no_sqli.rb +25 -18
  62. data/lib/contrast/agent/protect/rule/path_traversal/path_traversal_input_classification.rb +61 -0
  63. data/lib/contrast/agent/protect/rule/path_traversal/path_traversal_semantic_security_bypass.rb +114 -0
  64. data/lib/contrast/agent/protect/rule/path_traversal.rb +46 -18
  65. data/lib/contrast/agent/protect/rule/sql_sample_builder.rb +49 -29
  66. data/lib/contrast/agent/protect/rule/sqli/sqli_base_rule.rb +37 -0
  67. data/lib/contrast/agent/protect/rule/sqli/sqli_input_classification.rb +2 -62
  68. data/lib/contrast/agent/protect/rule/sqli/sqli_semantic/sqli_dangerous_functions.rb +67 -0
  69. data/lib/contrast/agent/protect/rule/sqli.rb +67 -22
  70. data/lib/contrast/agent/protect/rule/unsafe_file_upload/unsafe_file_upload_input_classification.rb +39 -63
  71. data/lib/contrast/agent/protect/rule/unsafe_file_upload.rb +6 -33
  72. data/lib/contrast/agent/protect/rule/xss/reflected_xss_input_classification.rb +58 -0
  73. data/lib/contrast/agent/protect/rule/xss.rb +14 -20
  74. data/lib/contrast/agent/protect/rule/xxe.rb +15 -30
  75. data/lib/contrast/agent/protect/rule.rb +3 -1
  76. data/lib/contrast/agent/reporting/attack_result/attack_result.rb +8 -0
  77. data/lib/contrast/agent/reporting/attack_result/rasp_rule_sample.rb +70 -36
  78. data/lib/contrast/agent/reporting/attack_result/response_type.rb +9 -9
  79. data/lib/contrast/agent/reporting/attack_result/user_input.rb +11 -0
  80. data/lib/contrast/agent/reporting/details/bot_blocker_details.rb +29 -0
  81. data/lib/contrast/agent/reporting/details/cmd_injection_details.rb +30 -0
  82. data/lib/contrast/agent/reporting/details/details.rb +18 -0
  83. data/lib/contrast/agent/reporting/details/http_method_tempering_details.rb +27 -0
  84. data/lib/contrast/agent/reporting/details/ip_denylist_details.rb +35 -0
  85. data/lib/contrast/agent/reporting/details/no_sqli_details.rb +36 -0
  86. data/lib/contrast/agent/reporting/details/path_traversal_details.rb +24 -0
  87. data/lib/contrast/agent/reporting/details/path_traversal_semantic_analysis_details.rb +32 -0
  88. data/lib/contrast/agent/reporting/details/protect_rule_details.rb +17 -0
  89. data/lib/contrast/agent/reporting/details/sqli_dangerous_functions.rb +22 -0
  90. data/lib/contrast/agent/reporting/details/sqli_details.rb +36 -0
  91. data/lib/contrast/agent/reporting/details/untrusted_deserialization_details.rb +27 -0
  92. data/lib/contrast/agent/reporting/details/virtual_patch_details.rb +30 -0
  93. data/lib/contrast/agent/reporting/details/xss_details.rb +33 -0
  94. data/lib/contrast/agent/reporting/details/xss_match.rb +30 -0
  95. data/lib/contrast/agent/reporting/details/xxe_details.rb +36 -0
  96. data/lib/contrast/agent/reporting/details/xxe_match.rb +25 -0
  97. data/lib/contrast/agent/reporting/details/xxe_wrapper.rb +25 -0
  98. data/lib/contrast/agent/reporting/input_analysis/details/bot_blocker_details.rb +27 -0
  99. data/lib/contrast/agent/reporting/input_analysis/details/protect_rule_details.rb +15 -0
  100. data/lib/contrast/agent/reporting/input_analysis/input_analysis.rb +1 -2
  101. data/lib/contrast/agent/reporting/input_analysis/input_analysis_result.rb +17 -3
  102. data/lib/contrast/agent/reporting/masker/masker.rb +80 -65
  103. data/lib/contrast/agent/reporting/masker/masker_utils.rb +1 -30
  104. data/lib/contrast/agent/reporting/reporter.rb +1 -15
  105. data/lib/contrast/agent/reporting/reporting_events/agent_startup.rb +2 -2
  106. data/lib/contrast/agent/reporting/reporting_events/application_activity.rb +84 -15
  107. data/lib/contrast/agent/reporting/reporting_events/application_defend_activity.rb +13 -25
  108. data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_activity.rb +19 -24
  109. data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_sample.rb +46 -126
  110. data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_sample_activity.rb +5 -16
  111. data/lib/contrast/agent/reporting/reporting_events/application_defend_attacker_activity.rb +10 -18
  112. data/lib/contrast/agent/reporting/reporting_events/application_inventory_activity.rb +6 -14
  113. data/lib/contrast/agent/reporting/reporting_events/application_startup.rb +1 -1
  114. data/lib/contrast/agent/reporting/reporting_events/application_update.rb +0 -2
  115. data/lib/contrast/agent/reporting/reporting_events/architecture_component.rb +7 -22
  116. data/lib/contrast/agent/reporting/reporting_events/finding.rb +23 -53
  117. data/lib/contrast/agent/reporting/reporting_events/finding_event.rb +12 -9
  118. data/lib/contrast/agent/reporting/reporting_events/finding_event_signature.rb +1 -1
  119. data/lib/contrast/agent/reporting/reporting_events/finding_event_source.rb +23 -21
  120. data/lib/contrast/agent/reporting/reporting_events/finding_event_stack.rb +5 -18
  121. data/lib/contrast/agent/reporting/reporting_events/finding_event_taint_range.rb +1 -0
  122. data/lib/contrast/{api/decorators/trace_taint_range_tags.rb → agent/reporting/reporting_events/finding_event_taint_range_tags.rb} +7 -6
  123. data/lib/contrast/agent/reporting/reporting_events/finding_request.rb +40 -10
  124. data/lib/contrast/agent/reporting/reporting_events/library_discovery.rb +0 -1
  125. data/lib/contrast/agent/reporting/reporting_events/library_usage_observation.rb +1 -1
  126. data/lib/contrast/agent/reporting/reporting_events/observed_route.rb +2 -2
  127. data/lib/contrast/agent/reporting/reporting_events/poll.rb +1 -11
  128. data/lib/contrast/agent/reporting/reporting_events/preflight_message.rb +10 -14
  129. data/lib/contrast/agent/reporting/reporting_events/reporting_event.rb +11 -0
  130. data/lib/contrast/agent/reporting/reporting_events/route_coverage.rb +3 -1
  131. data/lib/contrast/agent/reporting/reporting_events/route_discovery.rb +12 -25
  132. data/lib/contrast/agent/reporting/reporting_events/route_discovery_observation.rb +8 -27
  133. data/lib/contrast/agent/reporting/reporting_utilities/audit.rb +3 -3
  134. data/lib/contrast/agent/reporting/reporting_utilities/build_preflight.rb +4 -7
  135. data/lib/contrast/agent/reporting/reporting_utilities/headers.rb +1 -1
  136. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client.rb +2 -1
  137. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client_utils.rb +3 -3
  138. data/lib/contrast/agent/reporting/reporting_utilities/response.rb +1 -1
  139. data/lib/contrast/agent/reporting/reporting_utilities/response_handler.rb +0 -3
  140. data/lib/contrast/agent/reporting/reporting_utilities/response_handler_utils.rb +1 -0
  141. data/lib/contrast/agent/reporting/settings/code_exclusion.rb +6 -1
  142. data/lib/contrast/agent/reporting/settings/exclusion_base.rb +18 -0
  143. data/lib/contrast/agent/reporting/settings/exclusions.rb +2 -1
  144. data/lib/contrast/agent/reporting/settings/input_exclusion.rb +9 -3
  145. data/lib/contrast/agent/reporting/settings/protect.rb +15 -15
  146. data/lib/contrast/agent/request.rb +4 -14
  147. data/lib/contrast/agent/request_context.rb +18 -24
  148. data/lib/contrast/agent/request_context_extend.rb +23 -164
  149. data/lib/contrast/agent/request_handler.rb +1 -11
  150. data/lib/contrast/agent/response.rb +0 -18
  151. data/lib/contrast/agent/telemetry/events/event.rb +1 -1
  152. data/lib/contrast/agent/telemetry/events/metric_event.rb +1 -1
  153. data/lib/contrast/agent/telemetry/events/startup_metrics_event.rb +3 -3
  154. data/lib/contrast/agent/thread_watcher.rb +3 -18
  155. data/lib/contrast/agent/version.rb +1 -1
  156. data/lib/contrast/agent.rb +0 -11
  157. data/lib/contrast/agent_lib/api/command_injection.rb +46 -0
  158. data/lib/contrast/agent_lib/api/init.rb +101 -0
  159. data/lib/contrast/agent_lib/api/input_tracing.rb +267 -0
  160. data/lib/contrast/agent_lib/api/method_tempering.rb +29 -0
  161. data/lib/contrast/agent_lib/api/panic.rb +87 -0
  162. data/lib/contrast/agent_lib/api/path_semantic_file_security_bypass.rb +40 -0
  163. data/lib/contrast/agent_lib/interface.rb +260 -0
  164. data/lib/contrast/agent_lib/interface_base.rb +118 -0
  165. data/lib/contrast/agent_lib/return_types/eval_result.rb +44 -0
  166. data/lib/contrast/agent_lib/test.rb +29 -0
  167. data/lib/contrast/api/communication/connection_status.rb +5 -5
  168. data/lib/contrast/components/agent.rb +13 -23
  169. data/lib/contrast/components/api.rb +10 -10
  170. data/lib/contrast/components/app_context.rb +9 -11
  171. data/lib/contrast/components/app_context_extend.rb +1 -26
  172. data/lib/contrast/components/assess.rb +92 -38
  173. data/lib/contrast/components/assess_rules.rb +36 -0
  174. data/lib/contrast/components/config.rb +49 -24
  175. data/lib/contrast/components/heap_dump.rb +1 -1
  176. data/lib/contrast/components/protect.rb +9 -6
  177. data/lib/contrast/components/ruby_component.rb +81 -0
  178. data/lib/contrast/components/sampling.rb +1 -1
  179. data/lib/contrast/components/security_logger.rb +23 -0
  180. data/lib/contrast/components/settings.rb +41 -85
  181. data/lib/contrast/config/base_configuration.rb +1 -1
  182. data/lib/contrast/config/protect_rule_configuration.rb +7 -7
  183. data/lib/contrast/config/protect_rules_configuration.rb +24 -48
  184. data/lib/contrast/config/server_configuration.rb +1 -1
  185. data/lib/contrast/config.rb +0 -6
  186. data/lib/contrast/configuration.rb +73 -18
  187. data/lib/contrast/extension/assess/array.rb +9 -0
  188. data/lib/contrast/extension/assess/exec_trigger.rb +3 -1
  189. data/lib/contrast/extension/assess/marshal.rb +3 -2
  190. data/lib/contrast/extension/assess/string.rb +0 -1
  191. data/lib/contrast/extension/delegator.rb +2 -0
  192. data/lib/contrast/extension/extension.rb +1 -1
  193. data/lib/contrast/framework/base_support.rb +0 -5
  194. data/lib/contrast/framework/grape/support.rb +1 -23
  195. data/lib/contrast/framework/manager.rb +3 -11
  196. data/lib/contrast/framework/rails/patch/action_controller_live_buffer.rb +1 -6
  197. data/lib/contrast/framework/rails/railtie.rb +0 -1
  198. data/lib/contrast/framework/rails/support.rb +5 -59
  199. data/lib/contrast/framework/sinatra/support.rb +2 -21
  200. data/lib/contrast/logger/cef_log.rb +21 -3
  201. data/lib/contrast/logger/log.rb +1 -11
  202. data/lib/contrast/tasks/config.rb +5 -10
  203. data/lib/contrast/utils/assess/event_limit_utils.rb +28 -12
  204. data/lib/contrast/utils/assess/trigger_method_utils.rb +10 -18
  205. data/lib/contrast/utils/duck_utils.rb +1 -0
  206. data/lib/contrast/utils/findings.rb +6 -5
  207. data/lib/contrast/utils/hash_digest.rb +9 -24
  208. data/lib/contrast/utils/hash_digest_extend.rb +6 -6
  209. data/lib/contrast/utils/input_classification_base.rb +156 -0
  210. data/lib/contrast/utils/invalid_configuration_util.rb +21 -58
  211. data/lib/contrast/utils/log_utils.rb +47 -17
  212. data/lib/contrast/utils/net_http_base.rb +2 -2
  213. data/lib/contrast/utils/os.rb +0 -20
  214. data/lib/contrast/utils/patching/policy/patch_utils.rb +3 -2
  215. data/lib/contrast/utils/response_utils.rb +0 -16
  216. data/lib/contrast/utils/stack_trace_utils.rb +3 -40
  217. data/lib/contrast/utils/string_utils.rb +19 -7
  218. data/lib/contrast/utils/telemetry_client.rb +13 -7
  219. data/lib/contrast.rb +7 -13
  220. data/resources/protect/policy.json +1 -2
  221. data/ruby-agent.gemspec +2 -5
  222. metadata +78 -137
  223. data/exe/contrast_service +0 -23
  224. data/lib/contrast/agent/protect/rule/cmdi/cmdi_worth_watching.rb +0 -64
  225. data/lib/contrast/agent/protect/rule/sqli/sqli_worth_watching.rb +0 -118
  226. data/lib/contrast/agent/protect/rule/unsafe_file_upload/unsafe_file_upload_matcher.rb +0 -45
  227. data/lib/contrast/agent/reaction_processor.rb +0 -47
  228. data/lib/contrast/agent/reporting/reporting_events/trace_event_source.rb +0 -30
  229. data/lib/contrast/agent/reporting/reporting_utilities/dtm_message.rb +0 -43
  230. data/lib/contrast/agent/service_heartbeat.rb +0 -35
  231. data/lib/contrast/api/communication/messaging_queue.rb +0 -129
  232. data/lib/contrast/api/communication/response_processor.rb +0 -90
  233. data/lib/contrast/api/communication/service_lifecycle.rb +0 -77
  234. data/lib/contrast/api/communication/socket.rb +0 -44
  235. data/lib/contrast/api/communication/socket_client.rb +0 -130
  236. data/lib/contrast/api/communication/speedracer.rb +0 -142
  237. data/lib/contrast/api/communication/tcp_socket.rb +0 -32
  238. data/lib/contrast/api/communication/unix_socket.rb +0 -28
  239. data/lib/contrast/api/communication.rb +0 -20
  240. data/lib/contrast/api/decorators/activity.rb +0 -33
  241. data/lib/contrast/api/decorators/address.rb +0 -59
  242. data/lib/contrast/api/decorators/agent_startup.rb +0 -57
  243. data/lib/contrast/api/decorators/application_settings.rb +0 -42
  244. data/lib/contrast/api/decorators/application_startup.rb +0 -56
  245. data/lib/contrast/api/decorators/architecture_component.rb +0 -36
  246. data/lib/contrast/api/decorators/bot_blocker.rb +0 -37
  247. data/lib/contrast/api/decorators/finding.rb +0 -29
  248. data/lib/contrast/api/decorators/http_request.rb +0 -137
  249. data/lib/contrast/api/decorators/input_analysis.rb +0 -18
  250. data/lib/contrast/api/decorators/instrumentation_mode.rb +0 -35
  251. data/lib/contrast/api/decorators/ip_denylist.rb +0 -37
  252. data/lib/contrast/api/decorators/message.rb +0 -71
  253. data/lib/contrast/api/decorators/rasp_rule_sample.rb +0 -58
  254. data/lib/contrast/api/decorators/response_type.rb +0 -17
  255. data/lib/contrast/api/decorators/route_coverage.rb +0 -91
  256. data/lib/contrast/api/decorators/server_features.rb +0 -25
  257. data/lib/contrast/api/decorators/trace_event.rb +0 -120
  258. data/lib/contrast/api/decorators/trace_event_object.rb +0 -63
  259. data/lib/contrast/api/decorators/trace_event_signature.rb +0 -69
  260. data/lib/contrast/api/decorators/trace_taint_range.rb +0 -52
  261. data/lib/contrast/api/decorators/user_input.rb +0 -51
  262. data/lib/contrast/api/decorators/virtual_patch.rb +0 -34
  263. data/lib/contrast/api/decorators.rb +0 -28
  264. data/lib/contrast/api/dtm.pb.rb +0 -852
  265. data/lib/contrast/api/settings.pb.rb +0 -500
  266. data/lib/contrast/api.rb +0 -16
  267. data/lib/contrast/components/contrast_service.rb +0 -88
  268. data/lib/contrast/config/assess_configuration.rb +0 -93
  269. data/lib/contrast/config/assess_rules_configuration.rb +0 -32
  270. data/lib/contrast/config/root_configuration.rb +0 -90
  271. data/lib/contrast/config/ruby_configuration.rb +0 -81
  272. data/lib/contrast/config/service_configuration.rb +0 -49
  273. data/lib/contrast/tasks/service.rb +0 -84
  274. data/lib/contrast/utils/input_classification.rb +0 -73
  275. data/lib/contrast/utils/preflight_util.rb +0 -13
  276. data/lib/protobuf/code_generator.rb +0 -129
  277. data/lib/protobuf/decoder.rb +0 -28
  278. data/lib/protobuf/deprecation.rb +0 -117
  279. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +0 -79
  280. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +0 -360
  281. data/lib/protobuf/descriptors.rb +0 -3
  282. data/lib/protobuf/encoder.rb +0 -11
  283. data/lib/protobuf/enum.rb +0 -365
  284. data/lib/protobuf/exceptions.rb +0 -9
  285. data/lib/protobuf/field/base_field.rb +0 -380
  286. data/lib/protobuf/field/base_field_object_definitions.rb +0 -504
  287. data/lib/protobuf/field/bool_field.rb +0 -64
  288. data/lib/protobuf/field/bytes_field.rb +0 -67
  289. data/lib/protobuf/field/double_field.rb +0 -25
  290. data/lib/protobuf/field/enum_field.rb +0 -56
  291. data/lib/protobuf/field/field_array.rb +0 -102
  292. data/lib/protobuf/field/field_hash.rb +0 -122
  293. data/lib/protobuf/field/fixed32_field.rb +0 -25
  294. data/lib/protobuf/field/fixed64_field.rb +0 -28
  295. data/lib/protobuf/field/float_field.rb +0 -43
  296. data/lib/protobuf/field/int32_field.rb +0 -21
  297. data/lib/protobuf/field/int64_field.rb +0 -34
  298. data/lib/protobuf/field/integer_field.rb +0 -23
  299. data/lib/protobuf/field/message_field.rb +0 -51
  300. data/lib/protobuf/field/sfixed32_field.rb +0 -27
  301. data/lib/protobuf/field/sfixed64_field.rb +0 -28
  302. data/lib/protobuf/field/signed_integer_field.rb +0 -29
  303. data/lib/protobuf/field/sint32_field.rb +0 -21
  304. data/lib/protobuf/field/sint64_field.rb +0 -21
  305. data/lib/protobuf/field/string_field.rb +0 -51
  306. data/lib/protobuf/field/uint32_field.rb +0 -21
  307. data/lib/protobuf/field/uint64_field.rb +0 -21
  308. data/lib/protobuf/field/varint_field.rb +0 -77
  309. data/lib/protobuf/field.rb +0 -74
  310. data/lib/protobuf/generators/base.rb +0 -85
  311. data/lib/protobuf/generators/enum_generator.rb +0 -39
  312. data/lib/protobuf/generators/extension_generator.rb +0 -27
  313. data/lib/protobuf/generators/field_generator.rb +0 -193
  314. data/lib/protobuf/generators/file_generator.rb +0 -262
  315. data/lib/protobuf/generators/group_generator.rb +0 -122
  316. data/lib/protobuf/generators/message_generator.rb +0 -104
  317. data/lib/protobuf/generators/option_generator.rb +0 -17
  318. data/lib/protobuf/generators/printable.rb +0 -160
  319. data/lib/protobuf/generators/service_generator.rb +0 -50
  320. data/lib/protobuf/lifecycle.rb +0 -33
  321. data/lib/protobuf/logging.rb +0 -39
  322. data/lib/protobuf/message/fields.rb +0 -233
  323. data/lib/protobuf/message/serialization.rb +0 -85
  324. data/lib/protobuf/message.rb +0 -241
  325. data/lib/protobuf/optionable.rb +0 -72
  326. data/lib/protobuf/tasks/compile.rake +0 -80
  327. data/lib/protobuf/tasks.rb +0 -1
  328. data/lib/protobuf/varint.rb +0 -20
  329. data/lib/protobuf/varint_pure.rb +0 -31
  330. data/lib/protobuf/version.rb +0 -3
  331. data/lib/protobuf/wire_type.rb +0 -10
  332. data/lib/protobuf.rb +0 -91
  333. data/proto/dynamic_discovery.proto +0 -46
  334. data/proto/google/protobuf/compiler/plugin.proto +0 -183
  335. data/proto/google/protobuf/descriptor.proto +0 -911
  336. data/proto/rpc.proto +0 -71
  337. data/service_executables/.gitkeep +0 -0
  338. data/service_executables/VERSION +0 -1
  339. data/service_executables/linux/contrast-service +0 -0
  340. data/service_executables/mac/contrast-service +0 -0
@@ -1,47 +0,0 @@
1
- # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
- # frozen_string_literal: true
3
-
4
- require 'contrast/agent/disable_reaction'
5
- require 'contrast/components/logger'
6
-
7
- module Contrast
8
- module Agent
9
- # Because communication between the Agent/Service and TeamServer can only be initiated by outbound connections
10
- # from the Agent/Service, we must provide a mechanism for the TeamServer to direct the Agent to take a specific
11
- # action. This action is referred to as a Reaction. This class is how we handle those Reaction messages.
12
- module ReactionProcessor
13
- extend Contrast::Components::Logger::InstanceMethods
14
-
15
- # Process the given Reactions from the application settings based on what
16
- # TeamServer has indicated. Each Reaction will result in a log message
17
- # and, optionally, an action.
18
- #
19
- # @param application_settings [Contrast::Api::Settings::ApplicationSettings]
20
- # those settings which the Service has relayed from TeamServer.
21
- def self.process application_settings
22
- return unless application_settings&.reactions&.any?
23
-
24
- application_settings.reactions.each do |reaction|
25
- # The enums are all uppercase, we need to downcase them before attempting to log.
26
- level = if reaction.log_level.nil?
27
- :error
28
- else
29
- reaction.log_level.name.downcase # rubocop:disable Security/Module/Name -- ruby logger builtin.
30
- end
31
-
32
- logger.with_level(level, reaction.message) if reaction.message
33
-
34
- case reaction.operation
35
- when Contrast::Api::Settings::Reaction::Operation::DISABLE
36
- Contrast::Agent::DisableReaction.run(reaction, level)
37
- when Contrast::Api::Settings::Reaction::Operation::NOOP
38
- # NOOP
39
- else
40
- logger.warn('ReactionProcessor received a reaction with an unknown operation',
41
- operation: reaction.operation)
42
- end
43
- end
44
- end
45
- end
46
- end
47
- end
@@ -1,30 +0,0 @@
1
- # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
- # frozen_string_literal: true
3
-
4
- require 'json'
5
- require 'contrast/components/logger'
6
- require 'contrast/utils/object_share'
7
-
8
- module Contrast
9
- module Agent
10
- module Reporting
11
- # This is the new Trace Event Source class which will include all the needed information for the new reporting
12
- # system to relay this information in the Route Observation messages.
13
- class TraceEventSource
14
- attr_accessor :name, :type
15
-
16
- def initialize
17
- @name = Contrast::Utils::ObjectShare::EMPTY_STRING
18
- @type = Contrast::Utils::ObjectShare::EMPTY_STRING
19
- end
20
-
21
- def to_controlled_hash
22
- {
23
- name: @name,
24
- type: @type
25
- }
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,43 +0,0 @@
1
- # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
- # frozen_string_literal: true
3
-
4
- require 'contrast/agent/reporting/reporting_events/application_activity'
5
- require 'contrast/api/dtm.pb'
6
-
7
- module Contrast
8
- module Agent
9
- module Reporting
10
- # Util module for checking DTM message type. It temporarily allows for the conversion from a DTM to an
11
- # EventReport.
12
- # TODO: RUBY-1438 -- remove
13
- module DtmMessage
14
- class << self
15
- # @param dtm [Contrast::Api::Dtm::Finding,Object]
16
- # @return [Boolean]
17
- def finding? dtm
18
- dtm.cs__is_a?(Contrast::Api::Dtm::Finding)
19
- end
20
-
21
- # @param dtm [Contrast::Api::Dtm::Finding,Object]
22
- # @return [Boolean]
23
- def activity? dtm
24
- dtm.cs__is_a?(Contrast::Api::Dtm::Activity)
25
- end
26
-
27
- # Converts DTM message to Reporting Event for those messages that have conversion methods crated. We use this
28
- # as we work to move away from requiring the Service.
29
- #
30
- # @param dtm [Contrast::Api::Dtm]
31
- # @return event [Contrast::Agent::Reporting::ReportingEvent, nil]
32
- def dtm_to_event dtm
33
- # For the others, we convert them.
34
- return Contrast::Agent::Reporting::Finding.convert(dtm) if finding?(dtm)
35
- return Contrast::Agent::Reporting::ApplicationActivity.convert(dtm) if activity?(dtm)
36
-
37
- nil
38
- end
39
- end
40
- end
41
- end
42
- end
43
- end
@@ -1,35 +0,0 @@
1
- # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
- # frozen_string_literal: true
3
-
4
- require 'contrast/agent/worker_thread'
5
- require 'contrast/agent/reporting/report'
6
-
7
- module Contrast
8
- module Agent
9
- # The ServiceHeartbeat functions to keep the Contrast Service alive and ensure that it maintains this Agent's
10
- # ApplicationContext.
11
- class ServiceHeartbeat < WorkerThread
12
- # Spec recommends 30 seconds, we're going with 15.
13
- REFRESH_INTERVAL_SEC = 15
14
-
15
- def start_thread!
16
- return if ::Contrast::CONTRAST_SERVICE.unnecessary?
17
- return if running?
18
-
19
- @_thread = Contrast::Agent::Thread.new do
20
- logger.info('Starting heartbeat thread.')
21
- loop do
22
- logger.info("Queue Size: #{ Contrast::Agent.messaging_queue.queue&.length }")
23
- Contrast::Agent.messaging_queue&.send_event_eventually(poll_message)
24
- clean_properties
25
- sleep(REFRESH_INTERVAL_SEC)
26
- end
27
- end
28
- end
29
-
30
- def poll_message
31
- @_poll_message ||= Contrast::Api::Dtm::Poll.new
32
- end
33
- end
34
- end
35
- end
@@ -1,129 +0,0 @@
1
- # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
- # frozen_string_literal: true
3
-
4
- require 'contrast/components/logger'
5
- require 'contrast/agent/assess/policy/trigger_method'
6
- require 'contrast/agent/worker_thread'
7
- require 'contrast/agent/reporting/reporting_utilities/audit'
8
- require 'contrast/api/dtm.pb'
9
-
10
- module Contrast
11
- module Api
12
- module Communication
13
- # Top level gateway to messaging with speedracer
14
- class MessagingQueue < Contrast::Agent::WorkerThread
15
- include Contrast::Components::Logger::InstanceMethods
16
-
17
- # @return [Contrast::Api::Communication::Speedracer, nil]
18
- attr_reader :speedracer
19
-
20
- def initialize
21
- return if ::Contrast::CONTRAST_SERVICE.unnecessary?
22
-
23
- @speedracer = Contrast::Api::Communication::Speedracer.new
24
- super
25
- end
26
-
27
- # Use this to bypass the messaging queue and leave response processing to the caller. We use this method for
28
- # those operations which are blocking, meaning they must complete for the Agent to continue operations. These
29
- # types of events include initial settings/ setup on startup and analysis required to complete before handing
30
- # execution from our pre-filter operations to the application code (i.e. Protect's input analysis).
31
- #
32
- # @param event [Contrast::Api::Dtm] One of the DTMs valid for the event field of
33
- # Contrast::Api::Dtm::Message|Contrast::Api::Dtm::Activity
34
- # @return [Contrast::Api::Settings::AgentSettings,nil]
35
- def send_event_immediately event
36
- if ::Contrast::AGENT.disabled?
37
- logger.warn('Attempted to send event immediately with Agent disabled', caller: caller, event: event)
38
- return
39
- end
40
- return if ::Contrast::CONTRAST_SERVICE.unnecessary?
41
-
42
- speedracer.return_response(event)
43
- end
44
-
45
- # A simple Queue used to hold messages that are ready to be sent to SpeedRacer but for which we do not need an
46
- # immediate response
47
- #
48
- # @return [Queue, nil]
49
- def queue
50
- return if ::Contrast::CONTRAST_SERVICE.unnecessary?
51
-
52
- @_queue ||= Queue.new
53
- end
54
-
55
- # Use this to add a message to the queue and process the response internally. We use this method for those
56
- # operations which are non-blocking, meaning they don't need to complete for the Agent to continue operations.
57
- # These types of events include any post-request messaging that occurs after execution is returned from the
58
- # application to our post-filter operations as well as those that don't alter the application's execution (i.e.
59
- # Assess' vulnerability reporting).
60
- #
61
- # @param event [Contrast::Api::Dtm, Contrast::Api::Dtm::Poll] One of the DTMs valid for the event field of
62
- # Contrast::Api::Dtm::Message|Contrast::Api::Dtm::Activity
63
- # @param force [Boolean] if we should always queue this event, even if the service isn't running, in case the
64
- # message may be ready before the service has initiated. usually for those events which happen in a separate
65
- # thread or which may occur during initialization.
66
- def send_event_eventually event, force: false
67
- if ::Contrast::AGENT.disabled?
68
- logger.warn('Attempted to queue event with Agent disabled', caller: caller, event: event)
69
- return
70
- end
71
- return if ::Contrast::CONTRAST_SERVICE.unnecessary?
72
- # If we're unable to start the Service, then we cannot afford to queue messages as this creates the potential
73
- # for a memory leak, especially if the thread responsible for de-queueing the messages is dead.
74
- return if !force && !(speedracer.status.connected? && running?)
75
-
76
- # If we're in direct communication mode, the only message we should queue is the heartbeat to keep the
77
- # service alive during Protect activities. All other messages should go through direct reporting.
78
- if ::Contrast::CONTRAST_SERVICE.use_agent_communication?
79
- return unless ::Contrast::PROTECT.enabled?
80
- return unless event.cs__is_a?(Contrast::Api::Dtm::Poll)
81
- end
82
-
83
- logger.debug('Enqueued event for sending', event_type: event.cs__class)
84
- queue << event if event
85
- end
86
-
87
- # Create the reporting thread, which will pull from the queue in order to send messages to SpeedRacer. If
88
- # SpeedRacer is not running and should be, meaning the Agent is configured to control it, then we will also
89
- # try to start that process.
90
- def start_thread!
91
- return if ::Contrast::CONTRAST_SERVICE.unnecessary?
92
-
93
- speedracer.ensure_startup!
94
- return if running?
95
-
96
- @_thread = Contrast::Agent::Thread.new do
97
- loop do
98
- event = queue.pop
99
- begin
100
- logger.debug('Dequeued event for sending', event_type: event.cs__class)
101
- speedracer.process_internally(event)
102
- rescue StandardError => e
103
- logger.error('Could not send message to service from messaging queue thread.', e)
104
- end
105
- end
106
- end
107
- logger.debug('Started background sending thread.')
108
- end
109
-
110
- # When the Agent shuts down, we terminate the message sending operations. This method clears, closes, and
111
- # destroys the queue.
112
- def delete_queue!
113
- @_queue&.clear
114
- @_queue&.close
115
- @_queue = nil
116
- end
117
-
118
- # When the Agent shuts down, we terminate the thread responsible for reporting. This method destroys that
119
- # thread and any data we would have sent with it.
120
- def stop!
121
- return unless running?
122
-
123
- super
124
- delete_queue!
125
- end
126
- end
127
- end
128
- end
129
- end
@@ -1,90 +0,0 @@
1
- # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
- # frozen_string_literal: true
3
-
4
- require 'contrast/agent/reaction_processor'
5
- require 'contrast/components/logger'
6
-
7
- module Contrast
8
- module Api
9
- module Communication
10
- # Handles processing deferred messages sent to SpeedRacer.
11
- class ResponseProcessor
12
- include Contrast::Components::Logger::InstanceMethods
13
-
14
- # Use the given response to update the Agent's server features and application settings, allowing it to reflect
15
- # the latest options configured by the user in TeamServer
16
- #
17
- # @param response [Contrast::Api::Settings::AgentSettings]
18
- def process response
19
- logger.debug('Received a response', sent_ms: response&.sent_ms)
20
-
21
- server_features = process_server_response(response)
22
- app_settings = process_application_response(response)
23
-
24
- # ReactionProcessor is a design pattern from TeamServer. Right now, there's one potential reaction, which is
25
- # disabling the agent
26
- Contrast::Agent::ReactionProcessor.process(response&.application_settings)
27
-
28
- Contrast::Logger::Log.instance.update(server_features&.log_file, server_features&.log_level)
29
- update_features(server_features, app_settings)
30
- logger.trace('Agent settings updated in response to Service', protect_on: ::Contrast::PROTECT.enabled?,
31
- assess_on: ::Contrast::ASSESS.enabled?)
32
- end
33
-
34
- private
35
-
36
- # Given some protobuf messages, update server features. This is the bridge between SpeedRacer <-> Settings.
37
- #
38
- # @param response [Contrast::Api::Settings::AgentSettings]
39
- # @return [Contrast::Api::Settings::ServerFeatures]
40
- def process_server_response response
41
- server_features = response&.server_features
42
- return unless server_features
43
-
44
- logger.trace('Agent: Received updated server features')
45
-
46
- ::Contrast::SETTINGS.update_from_server_features(server_features)
47
- server_features
48
- end
49
-
50
- # Given some protobuf messages, update application settings. This is the bridge between SpeedRacer <->
51
- # Settings.
52
- #
53
- # @param response [Contrast::Api::Settings::AgentSettings]
54
- # @return [Contrast::Api::Settings::ApplicationSettings]
55
- def process_application_response response
56
- logger.debug('[!] process_application_response', response: response)
57
- app_settings = response&.application_settings
58
- return unless app_settings
59
-
60
- logger.debug('[!] Agent: Received updated application settings', settings: app_settings)
61
- ::Contrast::SETTINGS.update_from_application_settings(app_settings)
62
- app_settings
63
- end
64
-
65
- # This can't go in the Settings component because protect and assess depend on settings
66
- # I don't think it should go into contrast_service because that only handles connection specific data.
67
- #
68
- # @param server_features
69
- # [Contrast::Api::Settings::AgentSettings, Contrast::Agent::Reporting::Settings::FeatureSettings]
70
- # @param app_settings
71
- # [Contrast::Api::Settings::ApplicationSettings, Contrast::Agent::Reporting::Settings::ApplicationSettings]
72
- def update_features server_features, app_settings
73
- logger.info('Updating features')
74
- return unless !!(server_features || app_settings)
75
- return unless ::Contrast::AGENT.enabled?
76
-
77
- logger.trace_with_time('Rebuilding rule modes') do
78
- ::Contrast::SETTINGS.build_protect_rules if ::Contrast::PROTECT.enabled?
79
- ::Contrast::AGENT.reset_ruleset
80
-
81
- logger.info('Current rule settings:')
82
-
83
- ::Contrast::PROTECT.defend_rules.each { |k, v| logger.info('Protect Rule mode set', rule: k, mode: v.mode) }
84
- logger.info('Disabled Assess Rules', rules: ::Contrast::ASSESS.disabled_rules)
85
- end
86
- end
87
- end
88
- end
89
- end
90
- end
@@ -1,77 +0,0 @@
1
- # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
- # frozen_string_literal: true
3
-
4
- require 'contrast/components/logger'
5
-
6
- module Contrast
7
- module Api
8
- module Communication
9
- # Handles local service startup. As this should only ever be invoked by the Speedracer class, which includes
10
- # this, all methods here are private.
11
- module ServiceLifecycle
12
- include Contrast::Components::Logger::InstanceMethods
13
-
14
- private
15
-
16
- # Attempt to start up a local process with SpeedRacer. This will ensure the process isn't just a zombie and is
17
- # a real functioning process.
18
- #
19
- # @return [Boolean] Did the SpeedRacer process start?
20
- def attempt_local_service_startup
21
- zombie_check
22
- service_starter_thread.join(5)
23
- is_service_started = Contrast::Utils::OS.running?
24
- if is_service_started
25
- logger.info('The bundled service was successfully started.')
26
- else
27
- logger.error('The bundled service could not be started. The agent will not function properly.')
28
- end
29
- is_service_started
30
- end
31
-
32
- # Check if there's a zombie service that exists, and wait on it if so. Currently, this only happens when trying
33
- # to initialize SpeedRacer. If there is a zombie, we'll wait until the zombie completes.
34
- def zombie_check
35
- zombie_pid_list = Contrast::Utils::OS.zombie_pids
36
- zombie_pid_list.each do |pid|
37
- Process.wait(pid.to_i)
38
- rescue Errno::ECHILD => _e
39
- # Sometimes the zombie process dies between us finding it and killing it
40
- end
41
- end
42
-
43
- # Determine the options used to set up the SpeedRacer process. Specifically, this handles if we need to adjust
44
- # where the process needs to log.
45
- #
46
- # @return [Hash] options used to spawn the SpeedRacer process
47
- def determine_startup_options
48
- return { out: :out, err: :out } if ::Contrast::CONTRAST_SERVICE.logger_path == 'STDOUT'
49
- return { out: :err, err: :err } if ::Contrast::CONTRAST_SERVICE.logger_path == 'STDERR'
50
-
51
- { out: File::NULL, err: File::NULL }
52
- end
53
-
54
- # Create a new process for the SpeedRacer. This is a separate method so we can overwrite it globally in specs.
55
- def spawn_service
56
- options = determine_startup_options
57
- logger.debug('Spawning service')
58
- spawn('contrast_service', options)
59
- end
60
-
61
- # Create a thread to start the SpeedRacer, making calls to spawn until one starts successfully. As soon as the
62
- # SpeedRacer process starts, this thread terminates.
63
- def service_starter_thread
64
- Contrast::Agent::Thread.new do
65
- # Always check to see if it already started
66
- unless Contrast::Utils::OS.running?
67
- # Spawn the service process
68
- spawn_service
69
- # Block until service is running
70
- sleep(0.1) until Contrast::Utils::OS.running?
71
- end
72
- end
73
- end
74
- end
75
- end
76
- end
77
- end
@@ -1,44 +0,0 @@
1
- # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
- # frozen_string_literal: true
3
-
4
- module Contrast
5
- module Api
6
- module Communication
7
- # Behavior common to all sockets used to communicate with the Contrast Service.
8
- module Socket
9
- SOCKET_MONITOR = Monitor.new
10
-
11
- # Send a message across the socket and read back the response.
12
- # @param marshaled [String] some marshaled form of data to be sent across the socket. Typically an encoded form
13
- # of Contrast::Api::Dtm::Message.
14
- # @return [String] some marshalled form of data returned by the socket. Typically an encoded form of
15
- # Contrast::Api::Settings::AgentSettings.
16
- def send_marshaled marshaled
17
- SOCKET_MONITOR.synchronize do
18
- socket = new_socket
19
-
20
- # write message length
21
- len = marshaled.length
22
- socket.write([len].pack(Contrast::Api::ENCODING_STRING))
23
-
24
- # write the entire message
25
- socket.write(marshaled)
26
- socket.close_write
27
-
28
- # read the response length
29
- len = socket.read(4).unpack1(Contrast::Api::ENCODING_STRING)
30
-
31
- # read expected response to end
32
- socket.read(len)
33
- end
34
- end
35
-
36
- # Override this method to return a socket. Should be interface compatible with TCPSocket, UNIXSocket, etc.
37
- # @raise[NoMethodError] abstract method, needs to be implemented
38
- def new_socket
39
- raise(NoMethodError, 'This is abstract, override it.')
40
- end
41
- end
42
- end
43
- end
44
- end
@@ -1,130 +0,0 @@
1
- # Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
2
- # frozen_string_literal: true
3
-
4
- require 'socket'
5
- require 'uri'
6
-
7
- require 'contrast/api/communication/tcp_socket'
8
- require 'contrast/api/communication/unix_socket'
9
- require 'contrast/components/logger'
10
-
11
- module Contrast
12
- module Api
13
- module Communication
14
- # SocketClient acts as a interface between the agent and the service. It instantiates a service proxy and tracks
15
- # the state of that proxy.
16
- class SocketClient
17
- include Contrast::Components::Logger::InstanceMethods
18
-
19
- def initialize
20
- @socket = init_connection
21
- end
22
-
23
- # Wrap the given DTM in a Contrast::Api::Dtm::Message and send it to the SpeedRacer for processing. The
24
- # Message is the top level object required to communicate to SpeedRacer as it encompasses the information
25
- # needed to find this process' context.
26
- #
27
- # @param event [Contrast::Api::Dtm] One of the DTMs valid for the event field of
28
- # Contrast::Api::Dtm::Message
29
- # @return [Contrast::Api::Settings::AgentSettings, nil]
30
- def send_one event
31
- msg = Contrast::Api::Dtm::Message.build(event)
32
- send_message(msg)
33
- end
34
-
35
- private
36
-
37
- # Initialize the connection to the SpeedRacer process based on the configuration provided by the user. This can
38
- # be either TCP or UDP. Note that unlike the Go and the Node Agents, we cannot use the GRPC communication
39
- # option as we cannot use Google's protobuf gems; they do not compile reliably and result in segmentation
40
- # faults in customer environments.
41
- #
42
- # @return [Contrast::Api::Communication::TcpSocket, Contrast::Api::Communication::UnixSocket]
43
- def init_connection
44
- log_connection
45
- if ::Contrast::CONTRAST_SERVICE.use_tcp?
46
- Contrast::Api::Communication::TcpSocket.new(
47
- ::Contrast::CONTRAST_SERVICE.host, ::Contrast::CONTRAST_SERVICE.port)
48
- else
49
- Contrast::Api::Communication::UnixSocket.new(::Contrast::CONTRAST_SERVICE.socket_path)
50
- end
51
- end
52
-
53
- # Log information about the connection being used to communicate between the Agent and SpeedRacer.
54
- def log_connection
55
- # The socket is set,
56
- if ::Contrast::CONFIG.root.agent.service.socket
57
- logger.info('Connecting to the Contrast Service using a UnixSocket socket',
58
- socket: ::Contrast::CONTRAST_SERVICE.socket_path)
59
- return
60
- end
61
- # The host & port are set,
62
- if ::Contrast::CONFIG.root.agent.service.host && ::Contrast::CONFIG.root.agent.service.port
63
- logger.info('Connecting to the Contrast Service using a TCP socket',
64
- host: ::Contrast::CONTRAST_SERVICE.host,
65
- port: ::Contrast::CONTRAST_SERVICE.port)
66
- return
67
- end
68
-
69
- # Or something is not set.
70
- logger.warn(
71
- log_connection_error_msg,
72
- host: ::Contrast::CONTRAST_SERVICE.host,
73
- port: ::Contrast::CONTRAST_SERVICE.port)
74
- end
75
-
76
- # If our connection isn't built properly, we need to warn the user. This builds out the context specific
77
- # message to provide that warning
78
- #
79
- # @return [String]
80
- def log_connection_error_msg
81
- if ::Contrast::CONFIG.root.agent.service.host
82
- 'Missing a required connection value to the Contrast Service. ' \
83
- '`agent.service.port` is not set. ' \
84
- 'Falling back to default TCP socket port.'
85
- elsif ::Contrast::CONFIG.root.agent.service.port
86
- 'Missing a required connection value to the Contrast Service. ' \
87
- '`agent.service.host` is not set. ' \
88
- 'Falling back to default TCP socket host.'
89
- else
90
- 'Missing a required connection value to the Contrast Service. ' \
91
- 'Neither `agent.service.socket` nor the pair of `agent.service.host` and `agent.service.port` are set. '\
92
- 'Falling back to default TCP socket.'
93
- end
94
- end
95
-
96
- # Send the given message to SpeedRacer and return the response from it.
97
- #
98
- # @param msg [Contrast::Api::Dtm::Message] the packaged message to send to SpeedRacer
99
- # @return [Contrast::Api::Settings::AgentSettings, nil]
100
- # @raise [StandardError] if unable to send a message to SpeedRacer
101
- def send_message msg
102
- return unless msg
103
-
104
- logger.debug('Sending message.', msg_id: msg.__id__, p_id: msg.pid, msg_count: msg.message_count)
105
- to_service = Contrast::Api::Dtm::Message.encode(msg)
106
- from_service = send_marshaled(to_service)
107
- response = Contrast::Api::Settings::AgentSettings.decode(from_service)
108
- logger.debug('RESPONSE FROM TS')
109
- logger.debug(from_service)
110
- logger.debug('RESPONSE FROM TS')
111
- logger.debug('Received response.', msg_id: msg.__id__, p_id: msg.pid, msg_count: msg.message_count,
112
- response_id: response&.__id__)
113
- response
114
- rescue StandardError => e
115
- logger.error('Sending failed for message.', e, msg_id: msg.__id__, p_id: msg.pid,
116
- msg_count: msg.message_count, response_id: response&.__id__)
117
- raise(e) # reraise to let SpeedRacer manage the connection
118
- end
119
-
120
- # Send the marshaled Contrast::Api::Dtm::Message across the socket used to talk to SpeedRacer
121
- #
122
- # @param marshaled [String]
123
- # @return [String] the marshaled from of Contrast::Api::Settings::AgentSettings
124
- def send_marshaled marshaled
125
- @socket.send_marshaled(marshaled)
126
- end
127
- end
128
- end
129
- end
130
- end