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.
- checksums.yaml +4 -4
- data/.gitignore +3 -2
- data/.gitmodules +0 -3
- data/.simplecov +0 -1
- data/Rakefile +0 -1
- data/ext/cs__assess_array/cs__assess_array.c +41 -10
- data/ext/cs__assess_array/cs__assess_array.h +4 -1
- data/ext/cs__scope/cs__scope.c +1 -1
- data/lib/contrast/agent/assess/contrast_event.rb +2 -24
- data/lib/contrast/agent/assess/events/source_event.rb +7 -61
- data/lib/contrast/agent/assess/finalizers/hash.rb +11 -0
- data/lib/contrast/agent/assess/policy/dynamic_source_factory.rb +0 -55
- data/lib/contrast/agent/assess/policy/policy_node.rb +3 -3
- data/lib/contrast/agent/assess/policy/policy_node_utils.rb +0 -1
- data/lib/contrast/agent/assess/policy/propagation_node.rb +4 -4
- data/lib/contrast/agent/assess/policy/source_method.rb +24 -1
- data/lib/contrast/agent/assess/policy/trigger/reflected_xss.rb +7 -5
- data/lib/contrast/agent/assess/policy/trigger/xpath.rb +6 -1
- data/lib/contrast/agent/assess/policy/trigger_method.rb +40 -121
- data/lib/contrast/agent/assess/policy/trigger_node.rb +3 -3
- data/lib/contrast/agent/assess/policy/trigger_validation/redos_validator.rb +1 -1
- data/lib/contrast/agent/assess/policy/trigger_validation/ssrf_validator.rb +1 -1
- data/lib/contrast/agent/assess/policy/trigger_validation/xss_validator.rb +1 -1
- data/lib/contrast/agent/assess/property/evented.rb +2 -12
- data/lib/contrast/agent/assess/rule/provider/hardcoded_value_rule.rb +42 -82
- data/lib/contrast/agent/assess/rule/response/base_rule.rb +11 -27
- data/lib/contrast/agent/assess/rule/response/body_rule.rb +1 -3
- data/lib/contrast/agent/assess/rule/response/cache_control_header_rule.rb +77 -62
- data/lib/contrast/agent/assess/rule/response/csp_header_insecure_rule.rb +1 -1
- data/lib/contrast/agent/assess/rule/response/framework/rails_support.rb +6 -1
- data/lib/contrast/agent/assess/rule/response/header_rule.rb +5 -5
- data/lib/contrast/agent/assess/rule/response/hsts_header_rule.rb +1 -1
- data/lib/contrast/agent/assess/rule/response/x_xss_protection_header_rule.rb +1 -1
- data/lib/contrast/agent/assess/tracker.rb +1 -7
- data/lib/contrast/agent/at_exit_hook.rb +1 -7
- data/lib/contrast/agent/excluder.rb +224 -0
- data/lib/contrast/agent/exclusion_matcher.rb +25 -7
- data/lib/contrast/agent/inventory/database_config.rb +18 -23
- data/lib/contrast/agent/middleware.rb +4 -5
- data/lib/contrast/agent/patching/policy/after_load_patcher.rb +6 -0
- data/lib/contrast/agent/protect/input_analyzer/input_analyzer.rb +146 -127
- data/lib/contrast/agent/protect/policy/applies_command_injection_rule.rb +4 -0
- data/lib/contrast/agent/protect/policy/applies_path_traversal_rule.rb +20 -0
- data/lib/contrast/agent/protect/policy/applies_sqli_rule.rb +1 -0
- data/lib/contrast/agent/protect/policy/rule_applicator.rb +1 -1
- data/lib/contrast/agent/protect/rule/base.rb +98 -66
- data/lib/contrast/agent/protect/rule/base_service.rb +49 -24
- data/lib/contrast/agent/protect/rule/bot_blocker/bot_blocker_input_classification.rb +98 -0
- data/lib/contrast/agent/protect/rule/bot_blocker.rb +81 -0
- data/lib/contrast/agent/protect/rule/cmd_injection.rb +30 -99
- data/lib/contrast/agent/protect/rule/cmdi/cmdi_backdoors.rb +132 -0
- data/lib/contrast/agent/protect/rule/cmdi/cmdi_base_rule.rb +169 -0
- data/lib/contrast/agent/protect/rule/cmdi/cmdi_chained_command.rb +69 -0
- data/lib/contrast/agent/protect/rule/cmdi/cmdi_dangerous_path.rb +68 -0
- data/lib/contrast/agent/protect/rule/cmdi/cmdi_input_classification.rb +2 -58
- data/lib/contrast/agent/protect/rule/default_scanner.rb +1 -1
- data/lib/contrast/agent/protect/rule/deserialization.rb +10 -19
- data/lib/contrast/agent/protect/rule/http_method_tampering/http_method_tampering_input_classification.rb +2 -2
- data/lib/contrast/agent/protect/rule/http_method_tampering.rb +0 -11
- data/lib/contrast/agent/protect/rule/no_sqli/no_sqli_input_classification.rb +29 -34
- data/lib/contrast/agent/protect/rule/no_sqli.rb +25 -18
- data/lib/contrast/agent/protect/rule/path_traversal/path_traversal_input_classification.rb +61 -0
- data/lib/contrast/agent/protect/rule/path_traversal/path_traversal_semantic_security_bypass.rb +114 -0
- data/lib/contrast/agent/protect/rule/path_traversal.rb +46 -18
- data/lib/contrast/agent/protect/rule/sql_sample_builder.rb +49 -29
- data/lib/contrast/agent/protect/rule/sqli/sqli_base_rule.rb +37 -0
- data/lib/contrast/agent/protect/rule/sqli/sqli_input_classification.rb +2 -62
- data/lib/contrast/agent/protect/rule/sqli/sqli_semantic/sqli_dangerous_functions.rb +67 -0
- data/lib/contrast/agent/protect/rule/sqli.rb +67 -22
- data/lib/contrast/agent/protect/rule/unsafe_file_upload/unsafe_file_upload_input_classification.rb +39 -63
- data/lib/contrast/agent/protect/rule/unsafe_file_upload.rb +6 -33
- data/lib/contrast/agent/protect/rule/xss/reflected_xss_input_classification.rb +58 -0
- data/lib/contrast/agent/protect/rule/xss.rb +14 -20
- data/lib/contrast/agent/protect/rule/xxe.rb +15 -30
- data/lib/contrast/agent/protect/rule.rb +3 -1
- data/lib/contrast/agent/reporting/attack_result/attack_result.rb +8 -0
- data/lib/contrast/agent/reporting/attack_result/rasp_rule_sample.rb +70 -36
- data/lib/contrast/agent/reporting/attack_result/response_type.rb +9 -9
- data/lib/contrast/agent/reporting/attack_result/user_input.rb +11 -0
- data/lib/contrast/agent/reporting/details/bot_blocker_details.rb +29 -0
- data/lib/contrast/agent/reporting/details/cmd_injection_details.rb +30 -0
- data/lib/contrast/agent/reporting/details/details.rb +18 -0
- data/lib/contrast/agent/reporting/details/http_method_tempering_details.rb +27 -0
- data/lib/contrast/agent/reporting/details/ip_denylist_details.rb +35 -0
- data/lib/contrast/agent/reporting/details/no_sqli_details.rb +36 -0
- data/lib/contrast/agent/reporting/details/path_traversal_details.rb +24 -0
- data/lib/contrast/agent/reporting/details/path_traversal_semantic_analysis_details.rb +32 -0
- data/lib/contrast/agent/reporting/details/protect_rule_details.rb +17 -0
- data/lib/contrast/agent/reporting/details/sqli_dangerous_functions.rb +22 -0
- data/lib/contrast/agent/reporting/details/sqli_details.rb +36 -0
- data/lib/contrast/agent/reporting/details/untrusted_deserialization_details.rb +27 -0
- data/lib/contrast/agent/reporting/details/virtual_patch_details.rb +30 -0
- data/lib/contrast/agent/reporting/details/xss_details.rb +33 -0
- data/lib/contrast/agent/reporting/details/xss_match.rb +30 -0
- data/lib/contrast/agent/reporting/details/xxe_details.rb +36 -0
- data/lib/contrast/agent/reporting/details/xxe_match.rb +25 -0
- data/lib/contrast/agent/reporting/details/xxe_wrapper.rb +25 -0
- data/lib/contrast/agent/reporting/input_analysis/details/bot_blocker_details.rb +27 -0
- data/lib/contrast/agent/reporting/input_analysis/details/protect_rule_details.rb +15 -0
- data/lib/contrast/agent/reporting/input_analysis/input_analysis.rb +1 -2
- data/lib/contrast/agent/reporting/input_analysis/input_analysis_result.rb +17 -3
- data/lib/contrast/agent/reporting/masker/masker.rb +80 -65
- data/lib/contrast/agent/reporting/masker/masker_utils.rb +1 -30
- data/lib/contrast/agent/reporting/reporter.rb +1 -15
- data/lib/contrast/agent/reporting/reporting_events/agent_startup.rb +2 -2
- data/lib/contrast/agent/reporting/reporting_events/application_activity.rb +84 -15
- data/lib/contrast/agent/reporting/reporting_events/application_defend_activity.rb +13 -25
- data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_activity.rb +19 -24
- data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_sample.rb +46 -126
- data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_sample_activity.rb +5 -16
- data/lib/contrast/agent/reporting/reporting_events/application_defend_attacker_activity.rb +10 -18
- data/lib/contrast/agent/reporting/reporting_events/application_inventory_activity.rb +6 -14
- data/lib/contrast/agent/reporting/reporting_events/application_startup.rb +1 -1
- data/lib/contrast/agent/reporting/reporting_events/application_update.rb +0 -2
- data/lib/contrast/agent/reporting/reporting_events/architecture_component.rb +7 -22
- data/lib/contrast/agent/reporting/reporting_events/finding.rb +23 -53
- data/lib/contrast/agent/reporting/reporting_events/finding_event.rb +12 -9
- data/lib/contrast/agent/reporting/reporting_events/finding_event_signature.rb +1 -1
- data/lib/contrast/agent/reporting/reporting_events/finding_event_source.rb +23 -21
- data/lib/contrast/agent/reporting/reporting_events/finding_event_stack.rb +5 -18
- data/lib/contrast/agent/reporting/reporting_events/finding_event_taint_range.rb +1 -0
- data/lib/contrast/{api/decorators/trace_taint_range_tags.rb → agent/reporting/reporting_events/finding_event_taint_range_tags.rb} +7 -6
- data/lib/contrast/agent/reporting/reporting_events/finding_request.rb +40 -10
- data/lib/contrast/agent/reporting/reporting_events/library_discovery.rb +0 -1
- data/lib/contrast/agent/reporting/reporting_events/library_usage_observation.rb +1 -1
- data/lib/contrast/agent/reporting/reporting_events/observed_route.rb +2 -2
- data/lib/contrast/agent/reporting/reporting_events/poll.rb +1 -11
- data/lib/contrast/agent/reporting/reporting_events/preflight_message.rb +10 -14
- data/lib/contrast/agent/reporting/reporting_events/reporting_event.rb +11 -0
- data/lib/contrast/agent/reporting/reporting_events/route_coverage.rb +3 -1
- data/lib/contrast/agent/reporting/reporting_events/route_discovery.rb +12 -25
- data/lib/contrast/agent/reporting/reporting_events/route_discovery_observation.rb +8 -27
- data/lib/contrast/agent/reporting/reporting_utilities/audit.rb +3 -3
- data/lib/contrast/agent/reporting/reporting_utilities/build_preflight.rb +4 -7
- data/lib/contrast/agent/reporting/reporting_utilities/headers.rb +1 -1
- data/lib/contrast/agent/reporting/reporting_utilities/reporter_client.rb +2 -1
- data/lib/contrast/agent/reporting/reporting_utilities/reporter_client_utils.rb +3 -3
- data/lib/contrast/agent/reporting/reporting_utilities/response.rb +1 -1
- data/lib/contrast/agent/reporting/reporting_utilities/response_handler.rb +0 -3
- data/lib/contrast/agent/reporting/reporting_utilities/response_handler_utils.rb +1 -0
- data/lib/contrast/agent/reporting/settings/code_exclusion.rb +6 -1
- data/lib/contrast/agent/reporting/settings/exclusion_base.rb +18 -0
- data/lib/contrast/agent/reporting/settings/exclusions.rb +2 -1
- data/lib/contrast/agent/reporting/settings/input_exclusion.rb +9 -3
- data/lib/contrast/agent/reporting/settings/protect.rb +15 -15
- data/lib/contrast/agent/request.rb +4 -14
- data/lib/contrast/agent/request_context.rb +18 -24
- data/lib/contrast/agent/request_context_extend.rb +23 -164
- data/lib/contrast/agent/request_handler.rb +1 -11
- data/lib/contrast/agent/response.rb +0 -18
- data/lib/contrast/agent/telemetry/events/event.rb +1 -1
- data/lib/contrast/agent/telemetry/events/metric_event.rb +1 -1
- data/lib/contrast/agent/telemetry/events/startup_metrics_event.rb +3 -3
- data/lib/contrast/agent/thread_watcher.rb +3 -18
- data/lib/contrast/agent/version.rb +1 -1
- data/lib/contrast/agent.rb +0 -11
- data/lib/contrast/agent_lib/api/command_injection.rb +46 -0
- data/lib/contrast/agent_lib/api/init.rb +101 -0
- data/lib/contrast/agent_lib/api/input_tracing.rb +267 -0
- data/lib/contrast/agent_lib/api/method_tempering.rb +29 -0
- data/lib/contrast/agent_lib/api/panic.rb +87 -0
- data/lib/contrast/agent_lib/api/path_semantic_file_security_bypass.rb +40 -0
- data/lib/contrast/agent_lib/interface.rb +260 -0
- data/lib/contrast/agent_lib/interface_base.rb +118 -0
- data/lib/contrast/agent_lib/return_types/eval_result.rb +44 -0
- data/lib/contrast/agent_lib/test.rb +29 -0
- data/lib/contrast/api/communication/connection_status.rb +5 -5
- data/lib/contrast/components/agent.rb +13 -23
- data/lib/contrast/components/api.rb +10 -10
- data/lib/contrast/components/app_context.rb +9 -11
- data/lib/contrast/components/app_context_extend.rb +1 -26
- data/lib/contrast/components/assess.rb +92 -38
- data/lib/contrast/components/assess_rules.rb +36 -0
- data/lib/contrast/components/config.rb +49 -24
- data/lib/contrast/components/heap_dump.rb +1 -1
- data/lib/contrast/components/protect.rb +9 -6
- data/lib/contrast/components/ruby_component.rb +81 -0
- data/lib/contrast/components/sampling.rb +1 -1
- data/lib/contrast/components/security_logger.rb +23 -0
- data/lib/contrast/components/settings.rb +41 -85
- data/lib/contrast/config/base_configuration.rb +1 -1
- data/lib/contrast/config/protect_rule_configuration.rb +7 -7
- data/lib/contrast/config/protect_rules_configuration.rb +24 -48
- data/lib/contrast/config/server_configuration.rb +1 -1
- data/lib/contrast/config.rb +0 -6
- data/lib/contrast/configuration.rb +73 -18
- data/lib/contrast/extension/assess/array.rb +9 -0
- data/lib/contrast/extension/assess/exec_trigger.rb +3 -1
- data/lib/contrast/extension/assess/marshal.rb +3 -2
- data/lib/contrast/extension/assess/string.rb +0 -1
- data/lib/contrast/extension/delegator.rb +2 -0
- data/lib/contrast/extension/extension.rb +1 -1
- data/lib/contrast/framework/base_support.rb +0 -5
- data/lib/contrast/framework/grape/support.rb +1 -23
- data/lib/contrast/framework/manager.rb +3 -11
- data/lib/contrast/framework/rails/patch/action_controller_live_buffer.rb +1 -6
- data/lib/contrast/framework/rails/railtie.rb +0 -1
- data/lib/contrast/framework/rails/support.rb +5 -59
- data/lib/contrast/framework/sinatra/support.rb +2 -21
- data/lib/contrast/logger/cef_log.rb +21 -3
- data/lib/contrast/logger/log.rb +1 -11
- data/lib/contrast/tasks/config.rb +5 -10
- data/lib/contrast/utils/assess/event_limit_utils.rb +28 -12
- data/lib/contrast/utils/assess/trigger_method_utils.rb +10 -18
- data/lib/contrast/utils/duck_utils.rb +1 -0
- data/lib/contrast/utils/findings.rb +6 -5
- data/lib/contrast/utils/hash_digest.rb +9 -24
- data/lib/contrast/utils/hash_digest_extend.rb +6 -6
- data/lib/contrast/utils/input_classification_base.rb +156 -0
- data/lib/contrast/utils/invalid_configuration_util.rb +21 -58
- data/lib/contrast/utils/log_utils.rb +47 -17
- data/lib/contrast/utils/net_http_base.rb +2 -2
- data/lib/contrast/utils/os.rb +0 -20
- data/lib/contrast/utils/patching/policy/patch_utils.rb +3 -2
- data/lib/contrast/utils/response_utils.rb +0 -16
- data/lib/contrast/utils/stack_trace_utils.rb +3 -40
- data/lib/contrast/utils/string_utils.rb +19 -7
- data/lib/contrast/utils/telemetry_client.rb +13 -7
- data/lib/contrast.rb +7 -13
- data/resources/protect/policy.json +1 -2
- data/ruby-agent.gemspec +2 -5
- metadata +78 -137
- data/exe/contrast_service +0 -23
- data/lib/contrast/agent/protect/rule/cmdi/cmdi_worth_watching.rb +0 -64
- data/lib/contrast/agent/protect/rule/sqli/sqli_worth_watching.rb +0 -118
- data/lib/contrast/agent/protect/rule/unsafe_file_upload/unsafe_file_upload_matcher.rb +0 -45
- data/lib/contrast/agent/reaction_processor.rb +0 -47
- data/lib/contrast/agent/reporting/reporting_events/trace_event_source.rb +0 -30
- data/lib/contrast/agent/reporting/reporting_utilities/dtm_message.rb +0 -43
- data/lib/contrast/agent/service_heartbeat.rb +0 -35
- data/lib/contrast/api/communication/messaging_queue.rb +0 -129
- data/lib/contrast/api/communication/response_processor.rb +0 -90
- data/lib/contrast/api/communication/service_lifecycle.rb +0 -77
- data/lib/contrast/api/communication/socket.rb +0 -44
- data/lib/contrast/api/communication/socket_client.rb +0 -130
- data/lib/contrast/api/communication/speedracer.rb +0 -142
- data/lib/contrast/api/communication/tcp_socket.rb +0 -32
- data/lib/contrast/api/communication/unix_socket.rb +0 -28
- data/lib/contrast/api/communication.rb +0 -20
- data/lib/contrast/api/decorators/activity.rb +0 -33
- data/lib/contrast/api/decorators/address.rb +0 -59
- data/lib/contrast/api/decorators/agent_startup.rb +0 -57
- data/lib/contrast/api/decorators/application_settings.rb +0 -42
- data/lib/contrast/api/decorators/application_startup.rb +0 -56
- data/lib/contrast/api/decorators/architecture_component.rb +0 -36
- data/lib/contrast/api/decorators/bot_blocker.rb +0 -37
- data/lib/contrast/api/decorators/finding.rb +0 -29
- data/lib/contrast/api/decorators/http_request.rb +0 -137
- data/lib/contrast/api/decorators/input_analysis.rb +0 -18
- data/lib/contrast/api/decorators/instrumentation_mode.rb +0 -35
- data/lib/contrast/api/decorators/ip_denylist.rb +0 -37
- data/lib/contrast/api/decorators/message.rb +0 -71
- data/lib/contrast/api/decorators/rasp_rule_sample.rb +0 -58
- data/lib/contrast/api/decorators/response_type.rb +0 -17
- data/lib/contrast/api/decorators/route_coverage.rb +0 -91
- data/lib/contrast/api/decorators/server_features.rb +0 -25
- data/lib/contrast/api/decorators/trace_event.rb +0 -120
- data/lib/contrast/api/decorators/trace_event_object.rb +0 -63
- data/lib/contrast/api/decorators/trace_event_signature.rb +0 -69
- data/lib/contrast/api/decorators/trace_taint_range.rb +0 -52
- data/lib/contrast/api/decorators/user_input.rb +0 -51
- data/lib/contrast/api/decorators/virtual_patch.rb +0 -34
- data/lib/contrast/api/decorators.rb +0 -28
- data/lib/contrast/api/dtm.pb.rb +0 -852
- data/lib/contrast/api/settings.pb.rb +0 -500
- data/lib/contrast/api.rb +0 -16
- data/lib/contrast/components/contrast_service.rb +0 -88
- data/lib/contrast/config/assess_configuration.rb +0 -93
- data/lib/contrast/config/assess_rules_configuration.rb +0 -32
- data/lib/contrast/config/root_configuration.rb +0 -90
- data/lib/contrast/config/ruby_configuration.rb +0 -81
- data/lib/contrast/config/service_configuration.rb +0 -49
- data/lib/contrast/tasks/service.rb +0 -84
- data/lib/contrast/utils/input_classification.rb +0 -73
- data/lib/contrast/utils/preflight_util.rb +0 -13
- data/lib/protobuf/code_generator.rb +0 -129
- data/lib/protobuf/decoder.rb +0 -28
- data/lib/protobuf/deprecation.rb +0 -117
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +0 -79
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +0 -360
- data/lib/protobuf/descriptors.rb +0 -3
- data/lib/protobuf/encoder.rb +0 -11
- data/lib/protobuf/enum.rb +0 -365
- data/lib/protobuf/exceptions.rb +0 -9
- data/lib/protobuf/field/base_field.rb +0 -380
- data/lib/protobuf/field/base_field_object_definitions.rb +0 -504
- data/lib/protobuf/field/bool_field.rb +0 -64
- data/lib/protobuf/field/bytes_field.rb +0 -67
- data/lib/protobuf/field/double_field.rb +0 -25
- data/lib/protobuf/field/enum_field.rb +0 -56
- data/lib/protobuf/field/field_array.rb +0 -102
- data/lib/protobuf/field/field_hash.rb +0 -122
- data/lib/protobuf/field/fixed32_field.rb +0 -25
- data/lib/protobuf/field/fixed64_field.rb +0 -28
- data/lib/protobuf/field/float_field.rb +0 -43
- data/lib/protobuf/field/int32_field.rb +0 -21
- data/lib/protobuf/field/int64_field.rb +0 -34
- data/lib/protobuf/field/integer_field.rb +0 -23
- data/lib/protobuf/field/message_field.rb +0 -51
- data/lib/protobuf/field/sfixed32_field.rb +0 -27
- data/lib/protobuf/field/sfixed64_field.rb +0 -28
- data/lib/protobuf/field/signed_integer_field.rb +0 -29
- data/lib/protobuf/field/sint32_field.rb +0 -21
- data/lib/protobuf/field/sint64_field.rb +0 -21
- data/lib/protobuf/field/string_field.rb +0 -51
- data/lib/protobuf/field/uint32_field.rb +0 -21
- data/lib/protobuf/field/uint64_field.rb +0 -21
- data/lib/protobuf/field/varint_field.rb +0 -77
- data/lib/protobuf/field.rb +0 -74
- data/lib/protobuf/generators/base.rb +0 -85
- data/lib/protobuf/generators/enum_generator.rb +0 -39
- data/lib/protobuf/generators/extension_generator.rb +0 -27
- data/lib/protobuf/generators/field_generator.rb +0 -193
- data/lib/protobuf/generators/file_generator.rb +0 -262
- data/lib/protobuf/generators/group_generator.rb +0 -122
- data/lib/protobuf/generators/message_generator.rb +0 -104
- data/lib/protobuf/generators/option_generator.rb +0 -17
- data/lib/protobuf/generators/printable.rb +0 -160
- data/lib/protobuf/generators/service_generator.rb +0 -50
- data/lib/protobuf/lifecycle.rb +0 -33
- data/lib/protobuf/logging.rb +0 -39
- data/lib/protobuf/message/fields.rb +0 -233
- data/lib/protobuf/message/serialization.rb +0 -85
- data/lib/protobuf/message.rb +0 -241
- data/lib/protobuf/optionable.rb +0 -72
- data/lib/protobuf/tasks/compile.rake +0 -80
- data/lib/protobuf/tasks.rb +0 -1
- data/lib/protobuf/varint.rb +0 -20
- data/lib/protobuf/varint_pure.rb +0 -31
- data/lib/protobuf/version.rb +0 -3
- data/lib/protobuf/wire_type.rb +0 -10
- data/lib/protobuf.rb +0 -91
- data/proto/dynamic_discovery.proto +0 -46
- data/proto/google/protobuf/compiler/plugin.proto +0 -183
- data/proto/google/protobuf/descriptor.proto +0 -911
- data/proto/rpc.proto +0 -71
- data/service_executables/.gitkeep +0 -0
- data/service_executables/VERSION +0 -1
- data/service_executables/linux/contrast-service +0 -0
- 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
|
data/lib/protobuf/decoder.rb
DELETED
@@ -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
|