contrast-agent 6.1.2 → 6.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -3
- data/.simplecov +1 -0
- data/Rakefile +0 -27
- data/ext/cs__assess_basic_object/cs__assess_basic_object.c +7 -5
- data/ext/cs__assess_kernel/cs__assess_kernel.c +14 -3
- data/ext/cs__assess_kernel/cs__assess_kernel.h +2 -0
- data/ext/cs__assess_marshal_module/cs__assess_marshal_module.c +10 -3
- data/ext/cs__assess_marshal_module/cs__assess_marshal_module.h +2 -1
- data/ext/cs__assess_regexp/cs__assess_regexp.c +9 -7
- data/ext/{cs__assess_string_interpolation26/cs__assess_string_interpolation26.c → cs__assess_string_interpolation/cs__assess_string_interpolation.c} +14 -3
- data/ext/{cs__assess_string_interpolation26/cs__assess_string_interpolation26.h → cs__assess_string_interpolation/cs__assess_string_interpolation.h} +1 -1
- data/ext/{cs__assess_string_interpolation26 → cs__assess_string_interpolation}/extconf.rb +0 -0
- data/ext/cs__common/cs__common.c +5 -4
- data/ext/cs__contrast_patch/cs__contrast_patch.c +3 -10
- data/lib/contrast/agent/assess/events/source_event.rb +16 -12
- data/lib/contrast/agent/assess/policy/policy_node.rb +6 -0
- data/lib/contrast/agent/assess/policy/propagation_method.rb +3 -41
- data/lib/contrast/agent/assess/policy/propagation_node.rb +8 -0
- data/lib/contrast/agent/assess/policy/propagator/base.rb +2 -0
- data/lib/contrast/agent/assess/policy/source_method.rb +2 -47
- data/lib/contrast/agent/assess/policy/source_node.rb +1 -0
- data/lib/contrast/agent/assess/policy/trigger_method.rb +1 -1
- data/lib/contrast/agent/assess/policy/trigger_node.rb +8 -0
- data/lib/contrast/agent/assess/property/evented.rb +4 -18
- data/lib/contrast/agent/assess/tag.rb +19 -0
- data/lib/contrast/agent/at_exit_hook.rb +9 -8
- data/lib/contrast/agent/inventory/database_config.rb +6 -3
- data/lib/contrast/agent/inventory/dependency_analysis.rb +3 -2
- data/lib/contrast/agent/inventory/dependency_usage_analysis.rb +13 -9
- data/lib/contrast/agent/middleware.rb +4 -0
- data/lib/contrast/agent/patching/policy/after_load_patcher.rb +27 -2
- data/lib/contrast/agent/patching/policy/policy.rb +5 -0
- data/lib/contrast/agent/patching/policy/policy_node.rb +6 -0
- data/lib/contrast/agent/patching/policy/trigger_node.rb +3 -0
- data/lib/contrast/agent/protect/policy/applies_deserialization_rule.rb +3 -4
- data/lib/contrast/agent/protect/policy/applies_path_traversal_rule.rb +1 -0
- data/lib/contrast/agent/protect/policy/rule_applicator.rb +2 -2
- data/lib/contrast/agent/protect/rule/base.rb +1 -0
- data/lib/contrast/agent/protect/rule/no_sqli.rb +2 -0
- data/lib/contrast/agent/protect/rule/xss.rb +4 -0
- data/lib/contrast/agent/reporting/reporter.rb +33 -17
- data/lib/contrast/agent/reporting/reporter_heartbeat.rb +21 -15
- data/lib/contrast/agent/reporting/reporting_events/application_inventory.rb +3 -18
- data/lib/contrast/agent/reporting/reporting_events/application_update.rb +5 -24
- data/lib/contrast/agent/reporting/reporting_events/architecture_component.rb +8 -1
- data/lib/contrast/agent/reporting/reporting_events/discovered_route.rb +83 -16
- data/lib/contrast/agent/reporting/reporting_events/finding.rb +9 -3
- data/lib/contrast/agent/reporting/reporting_events/finding_event.rb +10 -1
- data/lib/contrast/agent/reporting/reporting_events/finding_event_object.rb +11 -1
- data/lib/contrast/agent/reporting/reporting_events/finding_event_parent_object.rb +11 -1
- data/lib/contrast/agent/reporting/reporting_events/finding_event_property.rb +12 -1
- data/lib/contrast/agent/reporting/reporting_events/finding_event_signature.rb +10 -1
- data/lib/contrast/agent/reporting/reporting_events/finding_event_source.rb +11 -1
- data/lib/contrast/agent/reporting/reporting_events/finding_event_stack.rb +11 -1
- data/lib/contrast/agent/reporting/reporting_events/finding_event_taint_range.rb +11 -1
- data/lib/contrast/agent/reporting/reporting_events/finding_request.rb +11 -1
- data/lib/contrast/agent/reporting/reporting_events/library_discovery.rb +29 -32
- data/lib/contrast/agent/reporting/reporting_events/library_usage_observation.rb +18 -20
- data/lib/contrast/agent/reporting/reporting_events/observed_library_usage.rb +11 -24
- data/lib/contrast/agent/reporting/reporting_events/observed_route.rb +13 -6
- data/lib/contrast/agent/reporting/reporting_events/preflight_message.rb +10 -4
- data/lib/contrast/agent/reporting/reporting_events/reporting_event.rb +10 -4
- data/lib/contrast/agent/reporting/reporting_events/route_coverage.rb +9 -0
- data/lib/contrast/agent/reporting/reporting_events/route_discovery.rb +10 -1
- data/lib/contrast/agent/reporting/reporting_events/route_discovery_observation.rb +11 -4
- data/lib/contrast/agent/reporting/reporting_events/server_activity.rb +0 -8
- data/lib/contrast/agent/reporting/reporting_utilities/audit.rb +2 -6
- data/lib/contrast/agent/reporting/reporting_utilities/dtm_message.rb +0 -32
- data/lib/contrast/agent/reporting/reporting_utilities/reporter_client.rb +1 -4
- data/lib/contrast/agent/reporting/reporting_utilities/reporter_client_utils.rb +1 -11
- data/lib/contrast/agent/reporting/reporting_utilities/response.rb +60 -2
- data/lib/contrast/agent/reporting/reporting_utilities/response_extractor.rb +32 -10
- data/lib/contrast/agent/reporting/reporting_utilities/response_handler.rb +1 -1
- data/lib/contrast/agent/reporting/reporting_utilities/response_handler_utils.rb +58 -26
- data/lib/contrast/agent/reporting/settings/application_settings.rb +8 -23
- data/lib/contrast/agent/reporting/settings/assess_server_feature.rb +27 -33
- data/lib/contrast/agent/reporting/settings/bot_blocker.rb +68 -0
- data/lib/contrast/agent/reporting/settings/code_exclusion.rb +27 -0
- data/lib/contrast/agent/reporting/settings/exclusion_base.rb +33 -0
- data/lib/contrast/agent/reporting/settings/exclusions.rb +39 -57
- data/lib/contrast/agent/reporting/settings/helpers.rb +56 -0
- data/lib/contrast/agent/reporting/settings/input_exclusion.rb +37 -0
- data/lib/contrast/agent/reporting/settings/ip_filter.rb +35 -0
- data/lib/contrast/agent/reporting/settings/keyword.rb +74 -0
- data/lib/contrast/agent/reporting/settings/log_enhancer.rb +65 -0
- data/lib/contrast/agent/reporting/settings/protect.rb +4 -2
- data/lib/contrast/agent/reporting/settings/protect_server_feature.rb +62 -115
- data/lib/contrast/agent/reporting/settings/reaction.rb +11 -2
- data/lib/contrast/agent/reporting/settings/rule_definition.rb +63 -0
- data/lib/contrast/agent/reporting/settings/sampling.rb +10 -0
- data/lib/contrast/agent/reporting/settings/sanitizer.rb +38 -0
- data/lib/contrast/agent/reporting/settings/sensitive_data_masking.rb +9 -1
- data/lib/contrast/agent/reporting/settings/sensitive_data_masking_rule.rb +7 -0
- data/lib/contrast/agent/reporting/settings/server_features.rb +8 -0
- data/lib/contrast/agent/reporting/settings/syslog.rb +176 -0
- data/lib/contrast/agent/reporting/settings/url_exclusion.rb +42 -0
- data/lib/contrast/agent/reporting/settings/validator.rb +17 -0
- data/lib/contrast/agent/request.rb +5 -7
- data/lib/contrast/agent/request_context.rb +8 -13
- data/lib/contrast/agent/request_context_extend.rb +8 -9
- data/lib/contrast/agent/request_handler.rb +10 -35
- data/lib/contrast/agent/rule_set.rb +4 -0
- data/lib/contrast/agent/service_heartbeat.rb +1 -1
- data/lib/contrast/agent/static_analysis.rb +6 -15
- data/lib/contrast/agent/telemetry/base.rb +35 -35
- data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_base.rb +2 -0
- data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_event.rb +2 -0
- data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_message.rb +5 -2
- data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_message_exception.rb +3 -0
- data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_stack_frame.rb +3 -0
- data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exceptions.rb +0 -1
- data/lib/contrast/agent/thread_watcher.rb +2 -6
- data/lib/contrast/agent/version.rb +1 -1
- data/lib/contrast/agent.rb +1 -3
- data/lib/contrast/api/communication/socket.rb +1 -0
- data/lib/contrast/api/decorators/message.rb +0 -6
- data/lib/contrast/api/decorators.rb +0 -3
- data/lib/contrast/api/dtm.pb.rb +1 -1
- data/lib/contrast/api/settings.pb.rb +1 -1
- data/lib/contrast/components/assess.rb +0 -6
- data/lib/contrast/components/config.rb +18 -2
- data/lib/contrast/config/base_configuration.rb +0 -13
- data/lib/contrast/config/root_configuration.rb +1 -0
- data/lib/contrast/config/ruby_configuration.rb +2 -9
- data/lib/contrast/configuration.rb +0 -2
- data/lib/contrast/extension/assess/eval_trigger.rb +0 -4
- data/lib/contrast/extension/assess/hash.rb +3 -2
- data/lib/contrast/extension/assess/kernel.rb +22 -0
- data/lib/contrast/extension/assess/marshal.rb +16 -0
- data/lib/contrast/extension/assess/string.rb +21 -20
- data/lib/contrast/framework/base_support.rb +13 -4
- data/lib/contrast/framework/grape/support.rb +6 -6
- data/lib/contrast/framework/manager.rb +7 -23
- data/lib/contrast/framework/manager_extend.rb +1 -1
- data/lib/contrast/framework/rails/patch/action_controller_live_buffer.rb +11 -15
- data/lib/contrast/framework/rails/support.rb +9 -2
- data/lib/contrast/framework/sinatra/support.rb +3 -2
- data/lib/contrast/logger/aliased_logging.rb +33 -26
- data/lib/contrast/utils/assess/source_method_utils.rb +0 -9
- data/lib/contrast/utils/lru_cache.rb +3 -0
- data/lib/contrast/utils/middleware_utils.rb +2 -0
- data/lib/contrast/utils/patching/policy/patch_utils.rb +5 -22
- data/lib/contrast/utils/response_utils.rb +14 -1
- data/lib/contrast/utils/telemetry.rb +9 -0
- data/lib/contrast/utils/telemetry_client.rb +7 -7
- data/lib/contrast/utils/telemetry_hash.rb +36 -12
- data/lib/contrast/utils/telemetry_identifier.rb +8 -0
- data/lib/contrast/utils/thread_tracker.rb +26 -9
- data/lib/contrast/utils/timer.rb +6 -1
- data/lib/contrast.rb +35 -3
- data/lib/protobuf/code_generator.rb +129 -0
- data/lib/protobuf/decoder.rb +28 -0
- data/lib/protobuf/deprecation.rb +117 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +79 -0
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +360 -0
- data/lib/protobuf/descriptors.rb +3 -0
- data/lib/protobuf/encoder.rb +11 -0
- data/lib/protobuf/enum.rb +365 -0
- data/lib/protobuf/exceptions.rb +9 -0
- data/lib/protobuf/field/base_field.rb +380 -0
- data/lib/protobuf/field/base_field_object_definitions.rb +504 -0
- data/lib/protobuf/field/bool_field.rb +64 -0
- data/lib/protobuf/field/bytes_field.rb +67 -0
- data/lib/protobuf/field/double_field.rb +25 -0
- data/lib/protobuf/field/enum_field.rb +56 -0
- data/lib/protobuf/field/field_array.rb +102 -0
- data/lib/protobuf/field/field_hash.rb +122 -0
- data/lib/protobuf/field/fixed32_field.rb +25 -0
- data/lib/protobuf/field/fixed64_field.rb +28 -0
- data/lib/protobuf/field/float_field.rb +43 -0
- data/lib/protobuf/field/int32_field.rb +21 -0
- data/lib/protobuf/field/int64_field.rb +34 -0
- data/lib/protobuf/field/integer_field.rb +23 -0
- data/lib/protobuf/field/message_field.rb +51 -0
- data/lib/protobuf/field/sfixed32_field.rb +27 -0
- data/lib/protobuf/field/sfixed64_field.rb +28 -0
- data/lib/protobuf/field/signed_integer_field.rb +29 -0
- data/lib/protobuf/field/sint32_field.rb +21 -0
- data/lib/protobuf/field/sint64_field.rb +21 -0
- data/lib/protobuf/field/string_field.rb +51 -0
- data/lib/protobuf/field/uint32_field.rb +21 -0
- data/lib/protobuf/field/uint64_field.rb +21 -0
- data/lib/protobuf/field/varint_field.rb +77 -0
- data/lib/protobuf/field.rb +74 -0
- data/lib/protobuf/generators/base.rb +85 -0
- data/lib/protobuf/generators/enum_generator.rb +39 -0
- data/lib/protobuf/generators/extension_generator.rb +27 -0
- data/lib/protobuf/generators/field_generator.rb +193 -0
- data/lib/protobuf/generators/file_generator.rb +262 -0
- data/lib/protobuf/generators/group_generator.rb +122 -0
- data/lib/protobuf/generators/message_generator.rb +104 -0
- data/lib/protobuf/generators/option_generator.rb +17 -0
- data/lib/protobuf/generators/printable.rb +160 -0
- data/lib/protobuf/generators/service_generator.rb +50 -0
- data/lib/protobuf/lifecycle.rb +33 -0
- data/lib/protobuf/logging.rb +39 -0
- data/lib/protobuf/message/fields.rb +233 -0
- data/lib/protobuf/message/serialization.rb +85 -0
- data/lib/protobuf/message.rb +241 -0
- data/lib/protobuf/optionable.rb +72 -0
- data/lib/protobuf/tasks/compile.rake +80 -0
- data/lib/protobuf/tasks.rb +1 -0
- data/lib/protobuf/varint.rb +20 -0
- data/lib/protobuf/varint_pure.rb +31 -0
- data/lib/protobuf/version.rb +3 -0
- data/lib/protobuf/wire_type.rb +10 -0
- data/lib/protobuf.rb +91 -0
- data/proto/dynamic_discovery.proto +46 -0
- data/proto/google/protobuf/compiler/plugin.proto +183 -0
- data/proto/google/protobuf/descriptor.proto +911 -0
- data/proto/rpc.proto +71 -0
- data/resources/assess/policy.json +2 -11
- data/ruby-agent.gemspec +2 -2
- metadata +105 -30
- data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exceptions_report.rb +0 -30
- data/lib/contrast/api/decorators/application_update.rb +0 -52
- data/lib/contrast/api/decorators/library.rb +0 -56
- data/lib/contrast/api/decorators/library_usage_update.rb +0 -31
- data/lib/contrast/framework/platform_version.rb +0 -22
@@ -3,36 +3,53 @@
|
|
3
3
|
|
4
4
|
module Contrast
|
5
5
|
module Utils
|
6
|
-
# ThreadTracker allows tracking of singleton objects across threads
|
6
|
+
# ThreadTracker allows tracking of singleton objects across threads. It acts on Thread#[] as that call is
|
7
|
+
# fiber-local where as Thread#thread_variables is not.
|
7
8
|
class ThreadTracker
|
8
|
-
|
9
|
-
|
10
|
-
#
|
11
|
-
#
|
12
|
-
|
9
|
+
# Get the given key to given value in Thread#[] or return default.
|
10
|
+
#
|
11
|
+
# @param key [Object] key used to reference the value
|
12
|
+
# @param default [Object] value to return if not present in Thread#[]
|
13
|
+
# @return [Object]
|
13
14
|
def get key, default = nil
|
14
15
|
Thread.current[key] || default
|
15
16
|
end
|
16
17
|
|
18
|
+
# Set the given key to given value in Thread#[].
|
19
|
+
#
|
20
|
+
# @param key [Object] key used to reference the value
|
21
|
+
# @param value [Object] value to store
|
17
22
|
def set key, value
|
18
23
|
Thread.current[key] = value
|
19
24
|
end
|
20
25
|
|
26
|
+
# Remove the given key from the current Thread#[] by setting it to nil.
|
27
|
+
#
|
28
|
+
# @param key [Object] key of the value to delete
|
21
29
|
def delete key
|
22
30
|
Thread.current[key] = nil
|
23
31
|
end
|
24
32
|
|
25
|
-
|
26
|
-
|
27
|
-
|
33
|
+
# Wrap the block given with a RequestContext by setting it beforehand and deleting it after.
|
34
|
+
#
|
35
|
+
# @param context [Contrast::Agent::RequestContext]
|
36
|
+
def lifespan context
|
37
|
+
set(:current_context, context)
|
38
|
+
response = yield(context)
|
28
39
|
delete(:current_context)
|
29
40
|
response
|
30
41
|
end
|
31
42
|
|
43
|
+
# Retrieve the Thread#[] RequestContext
|
44
|
+
#
|
45
|
+
# @return [Contrast::Agent::RequestContext]
|
32
46
|
def current
|
33
47
|
get(:current_context)
|
34
48
|
end
|
35
49
|
|
50
|
+
# Set the Thread#[] context to the one provided.
|
51
|
+
#
|
52
|
+
# @param context [Contrast::Agent::RequestContext]
|
36
53
|
def update_current_context context
|
37
54
|
set(:current_context, context)
|
38
55
|
end
|
data/lib/contrast/utils/timer.rb
CHANGED
@@ -6,14 +6,19 @@ module Contrast
|
|
6
6
|
# Timer is class that can track state about when an event starts and how long it takes
|
7
7
|
# Also contains utility methods to get time values in milliseconds
|
8
8
|
class Timer
|
9
|
-
|
9
|
+
# @return [Integer] the ms of the Time that this instance represents
|
10
|
+
attr_reader :start_ms
|
10
11
|
|
12
|
+
# Create a wrapper for the current time
|
13
|
+
#
|
14
|
+
# @param time [Time]
|
11
15
|
def initialize time = Time.now
|
12
16
|
@start_at = time
|
13
17
|
@start_ms = (@start_at.to_f * 1000).to_i
|
14
18
|
@events = {}
|
15
19
|
end
|
16
20
|
|
21
|
+
# @return [Integer] time, in ms
|
17
22
|
def self.now_ms
|
18
23
|
(Time.now.to_f * 1000).to_i
|
19
24
|
end
|
data/lib/contrast.rb
CHANGED
@@ -21,6 +21,39 @@ class Object
|
|
21
21
|
alias_method :cs__singleton_class, :singleton_class
|
22
22
|
end
|
23
23
|
|
24
|
+
# ActiveRecord gives access to the `String#blank?` method, which we've started using. We need to make sure that method
|
25
|
+
# actually exists.
|
26
|
+
# From https://github.com/rails/rails/blob/main/activesupport/lib/active_support/core_ext/object/blank.rb
|
27
|
+
class String
|
28
|
+
unless cs__respond_to?(:blank?)
|
29
|
+
|
30
|
+
CS__BLANK_RE = /\A[[:space:]]*\z/.cs__freeze
|
31
|
+
# A string is blank if it's empty or contains whitespaces only:
|
32
|
+
#
|
33
|
+
# ''.blank? # => true
|
34
|
+
# ' '.blank? # => true
|
35
|
+
# "\t\n\r".blank? # => true
|
36
|
+
# ' blah '.blank? # => false
|
37
|
+
#
|
38
|
+
# Unicode whitespace is supported:
|
39
|
+
#
|
40
|
+
# "\u00a0".blank? # => true
|
41
|
+
#
|
42
|
+
# @return [true, false]
|
43
|
+
def blank?
|
44
|
+
# The regexp that matches blank strings is expensive. For the case of empty
|
45
|
+
# strings we can speed up this method (~3.5x) with an empty? call. The
|
46
|
+
# penalty for the rest of strings is marginal.
|
47
|
+
empty? ||
|
48
|
+
begin
|
49
|
+
CS__BLANK_RE.match?(self)
|
50
|
+
rescue Encoding::CompatibilityError
|
51
|
+
false
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
24
57
|
if RUBY_VERSION >= '3.0.0' && RUBY_VERSION < '3.1.0'
|
25
58
|
# This fixes Ruby 3.0 issues with Module#(some instance method) patching by preventing the prepending of
|
26
59
|
# a JSON helper on protobuf load. String.instance_method(:+) is one of the most noticeable.
|
@@ -50,6 +83,7 @@ require 'contrast/components/settings'
|
|
50
83
|
require 'contrast/utils/telemetry_hash'
|
51
84
|
require 'contrast/utils/telemetry'
|
52
85
|
require 'contrast/agent/telemetry/events/exceptions/telemetry_exception_event'
|
86
|
+
require 'protobuf' # TODO: RUBY-1438
|
53
87
|
|
54
88
|
module Contrast
|
55
89
|
API = Contrast::Components::Api::Interface.new
|
@@ -66,9 +100,7 @@ module Contrast
|
|
66
100
|
end
|
67
101
|
|
68
102
|
module Contrast
|
69
|
-
TELEMETRY_EXCEPTIONS = if Contrast::Utils::Telemetry.exceptions_enabled?
|
70
|
-
Contrast::Utils::TelemetryHash.new(Contrast::Agent::Telemetry::TelemetryException::Event)
|
71
|
-
end
|
103
|
+
TELEMETRY_EXCEPTIONS = (Contrast::Utils::TelemetryHash.new if Contrast::Utils::Telemetry.exceptions_enabled?)
|
72
104
|
end
|
73
105
|
|
74
106
|
# This needs to be required very early, after component interfaces, and before instrumentation attempts
|
@@ -0,0 +1,129 @@
|
|
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
|
@@ -0,0 +1,28 @@
|
|
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
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'active_support/deprecation'
|
2
|
+
|
3
|
+
module Protobuf
|
4
|
+
if ::ActiveSupport::Deprecation.is_a?(Class)
|
5
|
+
class DeprecationBase < ::ActiveSupport::Deprecation
|
6
|
+
def deprecate_methods(*args)
|
7
|
+
deprecation_options = { :deprecator => self }
|
8
|
+
|
9
|
+
if args.last.is_a?(Hash)
|
10
|
+
args.last.merge!(deprecation_options)
|
11
|
+
else
|
12
|
+
args.push(deprecation_options)
|
13
|
+
end
|
14
|
+
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
def deprecation_warning(deprecated_method_name, message = nil, caller_backtrace = nil)
|
19
|
+
# This ensures ActiveSupport::Deprecation doesn't look for the caller, which is very costly.
|
20
|
+
super(deprecated_method_name, message, caller_backtrace) unless ENV.key?('PB_IGNORE_DEPRECATIONS')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Deprecation < DeprecationBase
|
25
|
+
def define_deprecated_methods(target_module, method_hash)
|
26
|
+
target_module.module_eval do
|
27
|
+
method_hash.each do |old_method, new_method|
|
28
|
+
alias_method old_method, new_method
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
deprecate_methods(target_module, method_hash)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class FieldDeprecation < DeprecationBase
|
37
|
+
# this is a convenience deprecator for deprecated proto fields
|
38
|
+
|
39
|
+
def deprecate_method(target_module, method_name)
|
40
|
+
deprecate_methods(target_module, method_name => target_module)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def deprecated_method_warning(method_name, target_module)
|
46
|
+
"#{target_module.name}##{method_name} field usage is deprecated"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
else
|
50
|
+
# TODO: remove this clause when Rails < 4 support is no longer needed
|
51
|
+
deprecator = ::ActiveSupport::Deprecation.clone
|
52
|
+
deprecator.instance_eval do
|
53
|
+
def new(deprecation_horizon = nil, *)
|
54
|
+
self.deprecation_horizon = deprecation_horizon if deprecation_horizon
|
55
|
+
self
|
56
|
+
end
|
57
|
+
end
|
58
|
+
Deprecation = deprecator.clone
|
59
|
+
FieldDeprecation = deprecator.clone
|
60
|
+
|
61
|
+
Deprecation.instance_eval do
|
62
|
+
def define_deprecated_methods(target_module, method_hash)
|
63
|
+
target_module.module_eval do
|
64
|
+
method_hash.each do |old_method, new_method|
|
65
|
+
alias_method old_method, new_method
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
deprecate_methods(target_module, method_hash)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
FieldDeprecation.instance_eval do
|
74
|
+
def deprecate_method(target_module, method_name)
|
75
|
+
deprecate_methods(target_module, method_name => target_module)
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def deprecated_method_warning(method_name, target_module)
|
81
|
+
"#{target_module.name}##{method_name} field usage is deprecated"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.deprecator
|
87
|
+
@deprecator ||= Deprecation.new('4.0', to_s).tap do |deprecation|
|
88
|
+
deprecation.silenced = ENV.key?('PB_IGNORE_DEPRECATIONS')
|
89
|
+
deprecation.behavior = :stderr
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.field_deprecator
|
94
|
+
@field_deprecator ||= FieldDeprecation.new.tap do |deprecation|
|
95
|
+
deprecation.silenced = ENV.key?('PB_IGNORE_DEPRECATIONS')
|
96
|
+
deprecation.behavior = :stderr
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Print Deprecation Warnings
|
101
|
+
#
|
102
|
+
# Default: true
|
103
|
+
#
|
104
|
+
# Simple boolean to define whether we want field deprecation warnings to
|
105
|
+
# be printed to stderr or not. The rpc_server has an option to set this value
|
106
|
+
# explicitly, or you can turn this option off by setting
|
107
|
+
# ENV['PB_IGNORE_DEPRECATIONS'] to a non-empty value.
|
108
|
+
#
|
109
|
+
# The rpc_server option will override the ENV setting.
|
110
|
+
def self.print_deprecation_warnings?
|
111
|
+
!field_deprecator.silenced
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.print_deprecation_warnings=(value)
|
115
|
+
field_deprecator.silenced = !value
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
##
|
4
|
+
# This file is auto-generated. DO NOT EDIT!
|
5
|
+
#
|
6
|
+
require 'protobuf'
|
7
|
+
|
8
|
+
|
9
|
+
##
|
10
|
+
# Imports
|
11
|
+
#
|
12
|
+
require 'google/protobuf/descriptor.pb'
|
13
|
+
|
14
|
+
module CSGoogle
|
15
|
+
module Protobuf
|
16
|
+
module Compiler
|
17
|
+
::Protobuf::Optionable.inject(self) { ::CSGoogle::Protobuf::FileOptions }
|
18
|
+
|
19
|
+
##
|
20
|
+
# Message Classes
|
21
|
+
#
|
22
|
+
class Version < ::Protobuf::Message; end
|
23
|
+
class CodeGeneratorRequest < ::Protobuf::Message; end
|
24
|
+
class CodeGeneratorResponse < ::Protobuf::Message
|
25
|
+
class Feature < ::Protobuf::Enum
|
26
|
+
define :FEATURE_NONE, 0
|
27
|
+
define :FEATURE_PROTO3_OPTIONAL, 1
|
28
|
+
end
|
29
|
+
|
30
|
+
class File < ::Protobuf::Message; end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
##
|
37
|
+
# File Options
|
38
|
+
#
|
39
|
+
set_option :java_package, "com.google.protobuf.compiler"
|
40
|
+
set_option :java_outer_classname, "PluginProtos"
|
41
|
+
set_option :go_package, "google.golang.org/protobuf/types/pluginpb"
|
42
|
+
|
43
|
+
|
44
|
+
##
|
45
|
+
# Message Fields
|
46
|
+
#
|
47
|
+
class Version
|
48
|
+
optional :int32, :major, 1
|
49
|
+
optional :int32, :minor, 2
|
50
|
+
optional :int32, :patch, 3
|
51
|
+
optional :string, :suffix, 4
|
52
|
+
end
|
53
|
+
|
54
|
+
class CodeGeneratorRequest
|
55
|
+
repeated :string, :file_to_generate, 1
|
56
|
+
optional :string, :parameter, 2
|
57
|
+
repeated ::CSGoogle::Protobuf::FileDescriptorProto, :proto_file, 15
|
58
|
+
optional ::CSGoogle::Protobuf::Compiler::Version, :compiler_version, 3
|
59
|
+
end
|
60
|
+
|
61
|
+
class CodeGeneratorResponse
|
62
|
+
class File
|
63
|
+
optional :string, :name, 1
|
64
|
+
optional :string, :insertion_point, 2
|
65
|
+
optional :string, :content, 15
|
66
|
+
optional ::CSGoogle::Protobuf::GeneratedCodeInfo, :generated_code_info, 16
|
67
|
+
end
|
68
|
+
|
69
|
+
optional :string, :error, 1
|
70
|
+
optional :uint64, :supported_features, 2
|
71
|
+
repeated ::CSGoogle::Protobuf::Compiler::CodeGeneratorResponse::File, :file, 15
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|