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,32 +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 Config
6
- # Common Configuration settings. Those in this section pertain to the
7
- # disabled assess rule functionality of the Agent.
8
- class AssessRulesConfiguration
9
- include Contrast::Config::BaseConfiguration
10
-
11
- SPEC_KEY = :disabled_rules.cs__freeze
12
- # @return [Array, nil] list of disabled assess rules
13
- attr_accessor :disabled_rules
14
-
15
- def initialize hsh = {}
16
- return unless hsh
17
-
18
- @disabled_rules = cast_disabled_rules(hsh)
19
- end
20
-
21
- private
22
-
23
- def cast_disabled_rules hsh
24
- return unless hsh
25
- return unless hsh.key?(SPEC_KEY)
26
- return hsh[SPEC_KEY] if hsh[SPEC_KEY].cs__is_a?(Array)
27
-
28
- hsh[SPEC_KEY].split(',').map(&:strip) if hsh[SPEC_KEY].cs__is_a?(String)
29
- end
30
- end
31
- end
32
- 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/components/agent'
5
- require 'contrast/components/inventory'
6
- require 'contrast/components/protect'
7
- require 'contrast/components/app_context'
8
-
9
- module Contrast
10
- module Config
11
- # The base of the Common Configuration settings.
12
- class RootConfiguration
13
- include Contrast::Config::BaseConfiguration
14
-
15
- # @return [Contrast::Components::Api::Interface]
16
- attr_writer :api
17
- # @return [Contrast::Components::Agent::Interface]
18
- attr_writer :agent
19
- # @return [Contrast::Components::AppContext::Interface]
20
- attr_writer :application
21
- # @return [Contrast::Config::ServerConfiguration]
22
- attr_writer :server
23
- # @return [Contrast::Config::AssessConfiguration]
24
- attr_writer :assess
25
- # @return [Contrast::Components::Inventory::Interface]
26
- attr_writer :inventory
27
- # @return [Contrast::Components::Protect::Interface]
28
- attr_writer :protect
29
- # @return [Contrast::Config::ServiceConfiguration]
30
- attr_writer :service
31
- # @return [Boolean, nil]
32
- attr_accessor :enable
33
-
34
- # @raise[ArgumentError]
35
- def initialize hsh = {}
36
- raise(ArgumentError, 'Expected a hash') unless hsh.is_a?(Hash)
37
-
38
- @api = Contrast::Components::Api::Interface.new(hsh[:api])
39
- @enable = hsh[:enable]
40
- @agent = Contrast::Components::Agent::Interface.new(hsh[:agent])
41
- @application = Contrast::Components::AppContext::Interface.new(hsh[:application])
42
- @server = Contrast::Config::ServerConfiguration.new(hsh[:server])
43
- @assess = Contrast::Config::AssessConfiguration.new(hsh[:assess])
44
- @inventory = Contrast::Components::Inventory::Interface.new(hsh[:inventory])
45
- @protect = Contrast::Components::Protect::Interface.new(hsh[:protect])
46
- @service = Contrast::Config::ServiceConfiguration.new(hsh[:service])
47
- end
48
-
49
- # @return [Contrast::Components::Api::Interface]
50
- def api
51
- @api ||= Contrast::Components::Api::Interface.new
52
- end
53
-
54
- # @return [Contrast::Components::Agent::Interface]
55
- def agent
56
- @agent ||= Contrast::Components::Agent::Interface.new
57
- end
58
-
59
- # @return [Contrast::Components::AppContext::Interface]
60
- def application
61
- @application ||= Contrast::Components::AppContext::Interface.new
62
- end
63
-
64
- # @return [Contrast::Config::ServerConfiguration]
65
- def server
66
- @server ||= Contrast::Config::ServerConfiguration.new
67
- end
68
-
69
- # @return [Contrast::Config::AssessConfiguration]
70
- def assess
71
- @assess ||= Contrast::Config::AssessConfiguration.new
72
- end
73
-
74
- # @return [Contrast::Components::Inventory::Interface]
75
- def inventory
76
- @inventory ||= Contrast::Components::Inventory::Interface.new
77
- end
78
-
79
- # @return [Contrast::Components::Protect::Interface]
80
- def protect
81
- @protect ||= Contrast::Components::Protect::Interface.new
82
- end
83
-
84
- # @return [Contrast::Config::ServiceConfiguration]
85
- def service
86
- @service ||= Contrast::Config::ServiceConfiguration.new
87
- end
88
- end
89
- end
90
- end
@@ -1,81 +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 Config
6
- # Common Configuration settings. Those in this section pertain to the specific settings that apply to Ruby
7
- class RubyConfiguration
8
- include Contrast::Config::BaseConfiguration
9
-
10
- DISABLED_RAKE_TASK_LIST = %w[
11
- about assets:clean assets:clobber assets:environment
12
- assets:precompile assets:precompile:all db:create db:drop db:fixtures:load db:migrate
13
- db:migrate:status db:rollback db:schema:cache:clear db:schema:cache:dump db:schema:dump
14
- db:schema:load db:seed db:setup db:structure:dump db:version doc:app graphql:install graphql:object
15
- log:clear middleware notes notes:custom rails:template rails:update routes secret spec spec:features
16
- spec:requests spec:controllers spec:helpers spec:models spec:views spec:routing spec:rcov stats
17
- test test:all test:all:db test:recent test:single test:uncommitted time:zones:all tmp:clear
18
- tmp:create webpacker:compile contrast:service:start contrast:service:status contrast:service:stop
19
- ].cs__freeze
20
-
21
- DEFAULT_UNINSTRUMENTED_NAMESPACES = %w[FactoryGirl FactoryBot].cs__freeze
22
-
23
- attr_writer :disabled_agent_rake_tasks, :exceptions, :interpolate, :propagate_yield, :require_scan,
24
- :non_request_tracking, :uninstrument_namespace
25
-
26
- def initialize hsh = {}
27
- return unless hsh
28
-
29
- @disabled_agent_rake_tasks = hsh[:disabled_agent_rake_tasks]
30
- @exceptions = Contrast::Config::ExceptionConfiguration.new(hsh[:exceptions])
31
- @interpolate = hsh[:interpolate]
32
- @propagate_yield = hsh[:propagate_yield]
33
- @require_scan = hsh[:require_scan]
34
- @non_request_tracking = hsh[:non_request_tracking]
35
- @uninstrument_namespace = hsh[:uninstrument_namespace]
36
- end
37
-
38
- # These commands being detected will result the agent disabling instrumentation, generally any command
39
- # that doesn't result in the application listening on a port can be added here, this normally includes tasks
40
- # that are ran pre-startup(like migrations) or to show information about the application(such as routes)
41
- # @return [Array, DISABLED_RAKE_TASK_LIST]
42
- def disabled_agent_rake_tasks
43
- @disabled_agent_rake_tasks.nil? ? DISABLED_RAKE_TASK_LIST : @disabled_agent_rake_tasks
44
- end
45
-
46
- # @return [Contrast::Config::ExceptionConfiguration]
47
- def exceptions
48
- @exceptions ||= Contrast::Config::ExceptionConfiguration.new
49
- end
50
-
51
- # controls whether or not we patch interpolation, either by rewrite or by funchook
52
- # @return [Boolean, Contrast::Utils::ObjectShare::TRUE]
53
- def interpolate
54
- @interpolate.nil? ? Contrast::Utils::ObjectShare::TRUE : @interpolate
55
- end
56
-
57
- # controls whether or not we patch the rb_yield block to track split propagation
58
- # @return [Boolean, Contrast::Utils::ObjectShare::TRUE]
59
- def propagate_yield
60
- @propagate_yield.nil? ? Contrast::Utils::ObjectShare::TRUE : @propagate_yield
61
- end
62
-
63
- # control whether or not we run file scanning rules on require
64
- # @return [Boolean, Contrast::Utils::ObjectShare::TRUE]
65
- def require_scan
66
- @require_scan.nil? ? Contrast::Utils::ObjectShare::TRUE : @require_scan
67
- end
68
-
69
- # controls tracking outside of request
70
- # @return [Boolean, Contrast::Utils::ObjectShare::FALSE]
71
- def non_request_tracking
72
- @non_request_tracking.nil? ? Contrast::Utils::ObjectShare::FALSE : @non_request_tracking
73
- end
74
-
75
- # @return [Array, DEFAULT_UNINSTRUMENTED_NAMESPACES]
76
- def uninstrument_namespace
77
- @uninstrument_namespace.nil? ? DEFAULT_UNINSTRUMENTED_NAMESPACES : @uninstrument_namespace
78
- end
79
- end
80
- end
81
- end
@@ -1,49 +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 Config
8
- # Common Configuration settings. Those in this section pertain to the communication between the Agent & the Service
9
- class ServiceConfiguration
10
- include Contrast::Config::BaseConfiguration
11
-
12
- # We don't set these b/c we've been asked to handle the default values of these settings differently, logging
13
- # when we have to use them.
14
- DEFAULT_HOST = '127.0.0.1' # rubocop:disable Style/IpAddresses
15
- DEFAULT_PORT = '30555'
16
-
17
- attr_writer :logger, :bypass
18
- # @return [String, nil]
19
- attr_accessor :socket
20
- # @return [String, nil]
21
- attr_accessor :port
22
- # @return [String, nil]
23
- attr_accessor :host
24
- # @return [Boolean, nil]
25
- attr_accessor :enable
26
-
27
- def initialize hsh = {}
28
- return unless hsh
29
-
30
- @enable = hsh[:enable]
31
- @host = hsh[:host]
32
- @port = hsh[:port]
33
- @socket = hsh[:socket]
34
- @logger = Contrast::Components::Logger::Interface.new(hsh[:logger])
35
- @bypass = hsh[:bypass]
36
- end
37
-
38
- # @return [Contrast::Components::Logger::Interface]
39
- def logger
40
- @logger ||= Contrast::Components::Logger::Interface.new
41
- end
42
-
43
- # @return [Boolean, false]
44
- def bypass
45
- @bypass.nil? ? false : @bypass
46
- end
47
- end
48
- end
49
- end
@@ -1,84 +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/utils/os'
5
-
6
- module Contrast
7
- # A Rake task designed to allow control of the Contrast Service as a stand
8
- # alone executable rather than one managed by the Agent running in a process
9
- # forked from the application
10
- module Service
11
- extend Rake::DSL
12
- # Start the service if it is not already running
13
- def self.start_service
14
- puts('Starting Contrast Service')
15
- service_log = ::Contrast::CONTRAST_SERVICE.logger_path
16
- if File.writable?(service_log)
17
- spawn('contrast_service', out: File::NULL, err: service_log)
18
- else
19
- spawn('contrast_service', %i[out err] => File::NULL)
20
- end
21
-
22
- watcher = Contrast::Agent::Thread.new do
23
- sleep(0.05) until Contrast::Utils::OS.running?
24
- end
25
- watcher.join(1)
26
- puts(Contrast::Utils::OS.running? ? 'Contrast Service started successfully.' : 'Contrast Service did not start.')
27
- end
28
-
29
- # Stop the service if it is running
30
- def self.stop_service
31
- pid = `ps aux | grep contrast-servic[e] | awk '{print $2}'`
32
- `kill #{ pid }` if pid
33
- end
34
-
35
- namespace :contrast do
36
- namespace :service do
37
- desc 'Starts the Contrast Service'
38
- task :start do
39
- if Contrast::Utils::OS.running?
40
- puts 'Contrast Service already running. No need to start'
41
- else
42
- start_service
43
- end
44
- end
45
- end
46
- end
47
-
48
- namespace :contrast do
49
- namespace :service do
50
- desc 'Prints the status of the Contrast Service'
51
- task :status do
52
- if Contrast::Utils::OS.running?
53
- puts 'online'
54
- else
55
- puts 'offline'
56
- end
57
- end
58
- end
59
- end
60
-
61
- namespace :contrast do
62
- namespace :service do
63
- desc 'Stops the Contrast Service'
64
- task :stop do
65
- if Contrast::Utils::OS.running?
66
- puts 'Stopping Contrast Service'
67
- stop_service
68
- watcher = Contrast::Agent::Thread.new do
69
- sleep(0.05) while Contrast::Utils::OS.running?
70
- end
71
- watcher.join(1)
72
- if Contrast::Utils::OS.running?
73
- puts 'Contrast Service did not stop.'
74
- else
75
- puts 'Contrast Service stopped successfully.'
76
- end
77
- else
78
- puts 'Contrast Service is not already running. No need to stop.'
79
- end
80
- end
81
- end
82
- end
83
- end
84
- end
@@ -1,73 +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/utils/object_share'
5
- require 'contrast/agent/reporting/input_analysis/input_type'
6
- require 'contrast/agent/reporting/input_analysis/score_level'
7
- require 'contrast/agent/protect/input_analyzer/input_analyzer'
8
-
9
- module Contrast
10
- module Agent
11
- module Protect
12
- module Rule
13
- # This module will include all the similar information for all input classifications
14
- # between different rules
15
- module InputClassificationBase
16
- include Contrast::Agent::Reporting::InputType
17
- include Contrast::Agent::Reporting::ScoreLevel
18
-
19
- # Input Classification stage is done to determine if an user input is
20
- # WORTHWATCHING or to be ignored.
21
- #
22
- # @param input_type [Contrast::Agent::Reporting::InputType] The type of the user input.
23
- # @param value [String, Array<String>] the value of the input.
24
- # @param input_analysis [Contrast::Agent::Reporting::InputAnalysis] Holds all the results from the
25
- # agent analysis from the current
26
- # Request.
27
- # @return ia [Contrast::Agent::Reporting::InputAnalysis] with updated results.
28
- def classify input_type, value, input_analysis # rubocop:disable Lint/UnusedMethodArgument
29
- return false unless input_analysis.request
30
-
31
- true
32
- end
33
-
34
- # Creates new isntance of InputAnalysisResult with basic info.
35
- #
36
- # @param rule_id [String] The name of the Protect Rule.
37
- # @param input_type [Contrast::Agent::Reporting::InputType] The type of the user input.
38
- # @param value [String, Array<String>] the value of the input.
39
- # @param path [String] the path of the current request context.
40
- #
41
- # @return res [Contrast::Agent::Reporting::InputAnalysisResult]
42
- def new_ia_result rule_id, input_type, path, value = nil
43
- res = Contrast::Agent::Reporting::InputAnalysisResult.new
44
- res.rule_id = rule_id
45
- res.input_type = input_type
46
- res.path = path
47
- res.value = value
48
- res
49
- end
50
-
51
- # This methods checks if input is value that matches a key in the input.
52
- #
53
- # @param request [Contrast::Agent::Request] the current request context.
54
- # @param result [Contrast::Agent::Reporting::InputAnalysisResult] result to be updated.
55
- # @param input_type [Contrast::Agent::Reporting::InputType] The type of the user input.
56
- # @param value [String, Array<String>] the value of the input.
57
- #
58
- # @return result [Contrast::Agent::Reporting::InputAnalysisResult] updated with key result.
59
- def add_needed_key request, result, input_type, value
60
- case input_type
61
- when COOKIE_VALUE
62
- result.key = request.cookies.key(value)
63
- when PARAMETER_VALUE
64
- result.key = request.parameters.key(value)
65
- else
66
- result.key
67
- end
68
- end
69
- end
70
- end
71
- end
72
- end
73
- end
@@ -1,13 +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 Utils
6
- # Utility for generating preflight message token
7
- module PreflightUtil
8
- def self.create_preflight finding
9
- "#{ finding.rule_id },#{ finding.hash_code }"
10
- end
11
- end
12
- end
13
- end
@@ -1,129 +0,0 @@
1
- require 'active_support/core_ext/module/aliasing'
2
- require 'protobuf/generators/file_generator'
3
-
4
- module Protobuf
5
- class CodeGenerator
6
-
7
- CodeGeneratorFatalError = Class.new(RuntimeError)
8
-
9
- def self.fatal(message)
10
- fail CodeGeneratorFatalError, message
11
- end
12
-
13
- def self.print_tag_warning_suppress
14
- STDERR.puts "Suppress tag warning output with PB_NO_TAG_WARNINGS=1."
15
- def self.print_tag_warning_suppress; end # rubocop:disable Lint/DuplicateMethods, Lint/NestedMethodDefinition
16
- end
17
-
18
- def self.warn(message)
19
- STDERR.puts("[WARN] #{message}")
20
- end
21
-
22
- private
23
-
24
- attr_accessor :request
25
-
26
- public
27
-
28
- def initialize(request_bytes)
29
- @request_bytes = request_bytes
30
- self.request = ::CSGoogle::Protobuf::Compiler::CodeGeneratorRequest.decode(request_bytes)
31
- end
32
-
33
- def eval_unknown_extensions!
34
- request.proto_file.each do |file_descriptor|
35
- ::Protobuf::Generators::FileGenerator.new(file_descriptor).eval_unknown_extensions!
36
- end
37
- self.request = ::CSGoogle::Protobuf::Compiler::CodeGeneratorRequest.decode(@request_bytes)
38
- end
39
-
40
- def generate_file(file_descriptor)
41
- ::Protobuf::Generators::FileGenerator.new(file_descriptor).generate_output_file
42
- end
43
-
44
- def response_bytes
45
- generated_files = request.proto_file.map do |file_descriptor|
46
- generate_file(file_descriptor)
47
- end
48
-
49
- ::CSGoogle::Protobuf::Compiler::CodeGeneratorResponse.encode(
50
- :file => generated_files,
51
- :supported_features => supported_features,
52
- )
53
- end
54
-
55
- def supported_features
56
- # The only available feature is proto3 with optional fields.
57
- # This is backwards compatible with proto2 optional fields.
58
- ::CSGoogle::Protobuf::Compiler::CodeGeneratorResponse::Feature::FEATURE_PROTO3_OPTIONAL.to_i
59
- end
60
-
61
- Protobuf::Field::BaseField.module_eval do
62
- def define_set_method!
63
- end
64
-
65
- def set_without_options(message_instance, bytes)
66
- return message_instance[name] = decode(bytes) unless repeated?
67
-
68
- if map?
69
- hash = message_instance[name]
70
- entry = decode(bytes)
71
- # decoded value could be nil for an
72
- # enum value that is not recognized
73
- hash[entry.key] = entry.value unless entry.value.nil?
74
- return hash[entry.key]
75
- end
76
-
77
- return message_instance[name] << decode(bytes) unless packed?
78
-
79
- array = message_instance[name]
80
- stream = StringIO.new(bytes)
81
-
82
- if wire_type == ::Protobuf::WireType::VARINT
83
- array << decode(Varint.decode(stream)) until stream.eof?
84
- elsif wire_type == ::Protobuf::WireType::FIXED64
85
- array << decode(stream.read(8)) until stream.eof?
86
- elsif wire_type == ::Protobuf::WireType::FIXED32
87
- array << decode(stream.read(4)) until stream.eof?
88
- end
89
- end
90
-
91
- # Sets a MessageField that is known to be an option.
92
- # We must allow fields to be set one at a time, as option syntax allows us to
93
- # set each field within the option using a separate "option" line.
94
- def set_with_options(message_instance, bytes)
95
- if message_instance[name].is_a?(::Protobuf::Message)
96
- gp = CSGoogle::Protobuf
97
- if message_instance.is_a?(gp::EnumOptions) || message_instance.is_a?(gp::EnumValueOptions) ||
98
- message_instance.is_a?(gp::FieldOptions) || message_instance.is_a?(gp::FileOptions) ||
99
- message_instance.is_a?(gp::MethodOptions) || message_instance.is_a?(gp::ServiceOptions) ||
100
- message_instance.is_a?(gp::MessageOptions)
101
-
102
- original_field = message_instance[name]
103
- decoded_field = decode(bytes)
104
- decoded_field.each_field do |subfield, subvalue|
105
- option_set(original_field, subfield, subvalue) { decoded_field.field?(subfield.tag) }
106
- end
107
- return
108
- end
109
- end
110
-
111
- set_without_options(message_instance, bytes)
112
- end
113
- alias_method :set, :set_with_options
114
-
115
- def option_set(message_field, subfield, subvalue)
116
- return unless yield
117
- if subfield.repeated?
118
- message_field[subfield.tag].concat(subvalue)
119
- elsif message_field[subfield.tag] && subvalue.is_a?(::Protobuf::Message)
120
- subvalue.each_field do |f, v|
121
- option_set(message_field[subfield.tag], f, v) { subvalue.field?(f.tag) }
122
- end
123
- else
124
- message_field[subfield.tag] = subvalue
125
- end
126
- end
127
- end
128
- end
129
- end
@@ -1,28 +0,0 @@
1
- module Protobuf
2
- class Decoder
3
-
4
- # Read bytes from +stream+ and pass to +message+ object.
5
- def self.decode_each_field(stream)
6
- until stream.eof?
7
- bits = Varint.decode(stream)
8
- wire_type = bits & 0x07
9
- tag = bits >> 3
10
-
11
- bytes = if wire_type == ::Protobuf::WireType::VARINT
12
- Varint.decode(stream)
13
- elsif wire_type == ::Protobuf::WireType::LENGTH_DELIMITED
14
- value_length = Varint.decode(stream)
15
- stream.read(value_length)
16
- elsif wire_type == ::Protobuf::WireType::FIXED64
17
- stream.read(8)
18
- elsif wire_type == ::Protobuf::WireType::FIXED32
19
- stream.read(4)
20
- else
21
- fail InvalidWireType, wire_type
22
- end
23
-
24
- yield(tag, bytes)
25
- end
26
- end
27
- end
28
- end