contrast-agent 6.7.0 → 6.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (221) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -2
  3. data/.simplecov +0 -1
  4. data/Rakefile +0 -1
  5. data/ext/cs__assess_array/cs__assess_array.c +41 -10
  6. data/ext/cs__assess_array/cs__assess_array.h +4 -1
  7. data/lib/contrast/agent/assess/policy/trigger_method.rb +2 -2
  8. data/lib/contrast/agent/assess/policy/trigger_validation/redos_validator.rb +1 -1
  9. data/lib/contrast/agent/assess/policy/trigger_validation/ssrf_validator.rb +1 -1
  10. data/lib/contrast/agent/assess/policy/trigger_validation/xss_validator.rb +1 -1
  11. data/lib/contrast/agent/excluder.rb +52 -34
  12. data/lib/contrast/agent/exclusion_matcher.rb +21 -9
  13. data/lib/contrast/agent/middleware.rb +4 -4
  14. data/lib/contrast/agent/patching/policy/after_load_patcher.rb +6 -0
  15. data/lib/contrast/agent/protect/input_analyzer/input_analyzer.rb +146 -127
  16. data/lib/contrast/agent/protect/policy/applies_path_traversal_rule.rb +20 -0
  17. data/lib/contrast/agent/protect/policy/rule_applicator.rb +1 -1
  18. data/lib/contrast/agent/protect/rule/base.rb +45 -53
  19. data/lib/contrast/agent/protect/rule/base_service.rb +48 -24
  20. data/lib/contrast/agent/protect/rule/bot_blocker/bot_blocker_input_classification.rb +98 -0
  21. data/lib/contrast/agent/protect/rule/bot_blocker.rb +81 -0
  22. data/lib/contrast/agent/protect/rule/cmd_injection.rb +18 -1
  23. data/lib/contrast/agent/protect/rule/cmdi/cmdi_backdoors.rb +8 -5
  24. data/lib/contrast/agent/protect/rule/cmdi/cmdi_base_rule.rb +22 -22
  25. data/lib/contrast/agent/protect/rule/cmdi/cmdi_chained_command.rb +69 -0
  26. data/lib/contrast/agent/protect/rule/cmdi/cmdi_dangerous_path.rb +68 -0
  27. data/lib/contrast/agent/protect/rule/cmdi/cmdi_input_classification.rb +2 -58
  28. data/lib/contrast/agent/protect/rule/default_scanner.rb +1 -1
  29. data/lib/contrast/agent/protect/rule/deserialization.rb +3 -14
  30. data/lib/contrast/agent/protect/rule/http_method_tampering/http_method_tampering_input_classification.rb +2 -2
  31. data/lib/contrast/agent/protect/rule/http_method_tampering.rb +0 -11
  32. data/lib/contrast/agent/protect/rule/no_sqli/no_sqli_input_classification.rb +29 -34
  33. data/lib/contrast/agent/protect/rule/no_sqli.rb +25 -18
  34. data/lib/contrast/agent/protect/rule/path_traversal/path_traversal_input_classification.rb +61 -0
  35. data/lib/contrast/agent/protect/rule/path_traversal/path_traversal_semantic_security_bypass.rb +114 -0
  36. data/lib/contrast/agent/protect/rule/path_traversal.rb +38 -12
  37. data/lib/contrast/agent/protect/rule/sql_sample_builder.rb +33 -15
  38. data/lib/contrast/agent/protect/rule/sqli/sqli_base_rule.rb +0 -14
  39. data/lib/contrast/agent/protect/rule/sqli/sqli_input_classification.rb +2 -62
  40. data/lib/contrast/agent/protect/rule/sqli.rb +70 -0
  41. data/lib/contrast/agent/protect/rule/unsafe_file_upload/unsafe_file_upload_input_classification.rb +39 -63
  42. data/lib/contrast/agent/protect/rule/unsafe_file_upload.rb +6 -33
  43. data/lib/contrast/agent/protect/rule/xss/reflected_xss_input_classification.rb +58 -0
  44. data/lib/contrast/agent/protect/rule/xss.rb +14 -20
  45. data/lib/contrast/agent/protect/rule/xxe.rb +4 -24
  46. data/lib/contrast/agent/reporting/attack_result/rasp_rule_sample.rb +18 -39
  47. data/lib/contrast/agent/reporting/attack_result/response_type.rb +9 -9
  48. data/lib/contrast/agent/reporting/details/ip_denylist_details.rb +10 -2
  49. data/lib/contrast/agent/reporting/details/virtual_patch_details.rb +8 -2
  50. data/lib/contrast/agent/reporting/input_analysis/details/bot_blocker_details.rb +27 -0
  51. data/lib/contrast/agent/reporting/input_analysis/details/protect_rule_details.rb +15 -0
  52. data/lib/contrast/agent/reporting/input_analysis/input_analysis.rb +1 -2
  53. data/lib/contrast/agent/reporting/input_analysis/input_analysis_result.rb +16 -2
  54. data/lib/contrast/agent/reporting/masker/masker.rb +2 -0
  55. data/lib/contrast/agent/reporting/reporter.rb +1 -14
  56. data/lib/contrast/agent/reporting/reporting_events/application_activity.rb +15 -12
  57. data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_activity.rb +3 -3
  58. data/lib/contrast/agent/reporting/reporting_events/application_defend_attack_sample.rb +1 -2
  59. data/lib/contrast/agent/reporting/reporting_events/application_update.rb +0 -2
  60. data/lib/contrast/agent/reporting/reporting_events/architecture_component.rb +0 -1
  61. data/lib/contrast/agent/reporting/reporting_events/finding.rb +4 -4
  62. data/lib/contrast/agent/reporting/reporting_events/finding_request.rb +0 -5
  63. data/lib/contrast/agent/reporting/reporting_events/library_discovery.rb +0 -1
  64. data/lib/contrast/agent/reporting/reporting_events/poll.rb +1 -11
  65. data/lib/contrast/agent/reporting/reporting_events/route_discovery.rb +0 -1
  66. data/lib/contrast/agent/reporting/reporting_events/route_discovery_observation.rb +0 -1
  67. data/lib/contrast/agent/reporting/reporting_utilities/audit.rb +2 -2
  68. data/lib/contrast/agent/reporting/reporting_utilities/response.rb +1 -1
  69. data/lib/contrast/agent/reporting/reporting_utilities/response_handler.rb +0 -3
  70. data/lib/contrast/agent/reporting/reporting_utilities/response_handler_utils.rb +1 -0
  71. data/lib/contrast/agent/reporting/settings/code_exclusion.rb +6 -1
  72. data/lib/contrast/agent/reporting/settings/exclusion_base.rb +18 -0
  73. data/lib/contrast/agent/reporting/settings/exclusions.rb +2 -1
  74. data/lib/contrast/agent/reporting/settings/input_exclusion.rb +9 -3
  75. data/lib/contrast/agent/reporting/settings/protect.rb +15 -15
  76. data/lib/contrast/agent/request.rb +2 -14
  77. data/lib/contrast/agent/request_context.rb +6 -9
  78. data/lib/contrast/agent/request_context_extend.rb +9 -148
  79. data/lib/contrast/agent/thread_watcher.rb +3 -18
  80. data/lib/contrast/agent/version.rb +1 -1
  81. data/lib/contrast/agent.rb +0 -11
  82. data/lib/contrast/agent_lib/api/command_injection.rb +46 -0
  83. data/lib/contrast/agent_lib/api/init.rb +101 -0
  84. data/lib/contrast/agent_lib/api/input_tracing.rb +267 -0
  85. data/lib/contrast/agent_lib/api/method_tempering.rb +29 -0
  86. data/lib/contrast/agent_lib/api/panic.rb +87 -0
  87. data/lib/contrast/agent_lib/api/path_semantic_file_security_bypass.rb +40 -0
  88. data/lib/contrast/agent_lib/interface.rb +260 -0
  89. data/lib/contrast/agent_lib/interface_base.rb +118 -0
  90. data/lib/contrast/agent_lib/return_types/eval_result.rb +44 -0
  91. data/lib/contrast/agent_lib/test.rb +29 -0
  92. data/lib/contrast/api/communication/connection_status.rb +5 -5
  93. data/lib/contrast/components/agent.rb +0 -14
  94. data/lib/contrast/components/app_context.rb +0 -2
  95. data/lib/contrast/components/app_context_extend.rb +0 -25
  96. data/lib/contrast/components/config.rb +1 -18
  97. data/lib/contrast/components/protect.rb +4 -1
  98. data/lib/contrast/components/ruby_component.rb +1 -1
  99. data/lib/contrast/components/settings.rb +37 -89
  100. data/lib/contrast/config/protect_rule_configuration.rb +7 -7
  101. data/lib/contrast/config/protect_rules_configuration.rb +20 -58
  102. data/lib/contrast/configuration.rb +1 -10
  103. data/lib/contrast/extension/assess/array.rb +9 -0
  104. data/lib/contrast/extension/delegator.rb +2 -0
  105. data/lib/contrast/framework/manager.rb +3 -1
  106. data/lib/contrast/framework/rails/railtie.rb +0 -1
  107. data/lib/contrast/framework/rails/support.rb +0 -1
  108. data/lib/contrast/tasks/config.rb +1 -8
  109. data/lib/contrast/utils/duck_utils.rb +1 -0
  110. data/lib/contrast/utils/input_classification_base.rb +156 -0
  111. data/lib/contrast/utils/os.rb +0 -20
  112. data/lib/contrast/utils/response_utils.rb +0 -16
  113. data/lib/contrast/utils/stack_trace_utils.rb +3 -15
  114. data/lib/contrast/utils/string_utils.rb +10 -7
  115. data/lib/contrast.rb +2 -3
  116. data/resources/protect/policy.json +1 -2
  117. data/ruby-agent.gemspec +2 -5
  118. metadata +42 -112
  119. data/exe/contrast_service +0 -23
  120. data/lib/contrast/agent/protect/rule/cmdi/cmdi_worth_watching.rb +0 -64
  121. data/lib/contrast/agent/protect/rule/sqli/sqli_worth_watching.rb +0 -118
  122. data/lib/contrast/agent/protect/rule/unsafe_file_upload/unsafe_file_upload_matcher.rb +0 -45
  123. data/lib/contrast/agent/reaction_processor.rb +0 -47
  124. data/lib/contrast/agent/service_heartbeat.rb +0 -35
  125. data/lib/contrast/api/communication/messaging_queue.rb +0 -128
  126. data/lib/contrast/api/communication/response_processor.rb +0 -90
  127. data/lib/contrast/api/communication/service_lifecycle.rb +0 -77
  128. data/lib/contrast/api/communication/socket.rb +0 -44
  129. data/lib/contrast/api/communication/socket_client.rb +0 -130
  130. data/lib/contrast/api/communication/speedracer.rb +0 -138
  131. data/lib/contrast/api/communication/tcp_socket.rb +0 -32
  132. data/lib/contrast/api/communication/unix_socket.rb +0 -28
  133. data/lib/contrast/api/communication.rb +0 -20
  134. data/lib/contrast/api/decorators/address.rb +0 -59
  135. data/lib/contrast/api/decorators/agent_startup.rb +0 -56
  136. data/lib/contrast/api/decorators/application_settings.rb +0 -43
  137. data/lib/contrast/api/decorators/application_startup.rb +0 -56
  138. data/lib/contrast/api/decorators/bot_blocker.rb +0 -37
  139. data/lib/contrast/api/decorators/http_request.rb +0 -137
  140. data/lib/contrast/api/decorators/input_analysis.rb +0 -18
  141. data/lib/contrast/api/decorators/instrumentation_mode.rb +0 -35
  142. data/lib/contrast/api/decorators/ip_denylist.rb +0 -37
  143. data/lib/contrast/api/decorators/message.rb +0 -67
  144. data/lib/contrast/api/decorators/rasp_rule_sample.rb +0 -52
  145. data/lib/contrast/api/decorators/response_type.rb +0 -17
  146. data/lib/contrast/api/decorators/server_features.rb +0 -25
  147. data/lib/contrast/api/decorators/user_input.rb +0 -51
  148. data/lib/contrast/api/decorators/virtual_patch.rb +0 -34
  149. data/lib/contrast/api/decorators.rb +0 -22
  150. data/lib/contrast/api/dtm.pb.rb +0 -363
  151. data/lib/contrast/api/settings.pb.rb +0 -500
  152. data/lib/contrast/api.rb +0 -16
  153. data/lib/contrast/components/contrast_service.rb +0 -88
  154. data/lib/contrast/components/service.rb +0 -55
  155. data/lib/contrast/tasks/service.rb +0 -84
  156. data/lib/contrast/utils/input_classification.rb +0 -73
  157. data/lib/protobuf/code_generator.rb +0 -129
  158. data/lib/protobuf/decoder.rb +0 -28
  159. data/lib/protobuf/deprecation.rb +0 -117
  160. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +0 -79
  161. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +0 -360
  162. data/lib/protobuf/descriptors.rb +0 -3
  163. data/lib/protobuf/encoder.rb +0 -11
  164. data/lib/protobuf/enum.rb +0 -365
  165. data/lib/protobuf/exceptions.rb +0 -9
  166. data/lib/protobuf/field/base_field.rb +0 -380
  167. data/lib/protobuf/field/base_field_object_definitions.rb +0 -504
  168. data/lib/protobuf/field/bool_field.rb +0 -64
  169. data/lib/protobuf/field/bytes_field.rb +0 -67
  170. data/lib/protobuf/field/double_field.rb +0 -25
  171. data/lib/protobuf/field/enum_field.rb +0 -56
  172. data/lib/protobuf/field/field_array.rb +0 -102
  173. data/lib/protobuf/field/field_hash.rb +0 -122
  174. data/lib/protobuf/field/fixed32_field.rb +0 -25
  175. data/lib/protobuf/field/fixed64_field.rb +0 -28
  176. data/lib/protobuf/field/float_field.rb +0 -43
  177. data/lib/protobuf/field/int32_field.rb +0 -21
  178. data/lib/protobuf/field/int64_field.rb +0 -34
  179. data/lib/protobuf/field/integer_field.rb +0 -23
  180. data/lib/protobuf/field/message_field.rb +0 -51
  181. data/lib/protobuf/field/sfixed32_field.rb +0 -27
  182. data/lib/protobuf/field/sfixed64_field.rb +0 -28
  183. data/lib/protobuf/field/signed_integer_field.rb +0 -29
  184. data/lib/protobuf/field/sint32_field.rb +0 -21
  185. data/lib/protobuf/field/sint64_field.rb +0 -21
  186. data/lib/protobuf/field/string_field.rb +0 -51
  187. data/lib/protobuf/field/uint32_field.rb +0 -21
  188. data/lib/protobuf/field/uint64_field.rb +0 -21
  189. data/lib/protobuf/field/varint_field.rb +0 -77
  190. data/lib/protobuf/field.rb +0 -74
  191. data/lib/protobuf/generators/base.rb +0 -85
  192. data/lib/protobuf/generators/enum_generator.rb +0 -39
  193. data/lib/protobuf/generators/extension_generator.rb +0 -27
  194. data/lib/protobuf/generators/field_generator.rb +0 -193
  195. data/lib/protobuf/generators/file_generator.rb +0 -262
  196. data/lib/protobuf/generators/group_generator.rb +0 -122
  197. data/lib/protobuf/generators/message_generator.rb +0 -104
  198. data/lib/protobuf/generators/option_generator.rb +0 -17
  199. data/lib/protobuf/generators/printable.rb +0 -160
  200. data/lib/protobuf/generators/service_generator.rb +0 -50
  201. data/lib/protobuf/lifecycle.rb +0 -33
  202. data/lib/protobuf/logging.rb +0 -39
  203. data/lib/protobuf/message/fields.rb +0 -233
  204. data/lib/protobuf/message/serialization.rb +0 -85
  205. data/lib/protobuf/message.rb +0 -241
  206. data/lib/protobuf/optionable.rb +0 -72
  207. data/lib/protobuf/tasks/compile.rake +0 -80
  208. data/lib/protobuf/tasks.rb +0 -1
  209. data/lib/protobuf/varint.rb +0 -20
  210. data/lib/protobuf/varint_pure.rb +0 -31
  211. data/lib/protobuf/version.rb +0 -3
  212. data/lib/protobuf/wire_type.rb +0 -10
  213. data/lib/protobuf.rb +0 -91
  214. data/proto/dynamic_discovery.proto +0 -46
  215. data/proto/google/protobuf/compiler/plugin.proto +0 -183
  216. data/proto/google/protobuf/descriptor.proto +0 -911
  217. data/proto/rpc.proto +0 -71
  218. data/service_executables/.gitkeep +0 -0
  219. data/service_executables/VERSION +0 -1
  220. data/service_executables/linux/contrast-service +0 -0
  221. data/service_executables/mac/contrast-service +0 -0
@@ -1,77 +0,0 @@
1
- require 'protobuf/field/base_field'
2
-
3
- module Protobuf
4
- module Field
5
- class VarintField < BaseField
6
-
7
- ##
8
- # Constants
9
- #
10
- INT32_MAX = 2**31 - 1
11
- INT32_MIN = -2**31
12
- INT64_MAX = 2**63 - 1
13
- INT64_MIN = -2**63
14
- UINT32_MAX = 2**32 - 1
15
- UINT64_MAX = 2**64 - 1
16
-
17
- ##
18
- # Class Methods
19
- #
20
-
21
- def self.default
22
- 0
23
- end
24
-
25
- def self.encode(value)
26
- ::Protobuf::Varint.encode(value)
27
- end
28
-
29
- ##
30
- # Public Instance Methods
31
- #
32
- def acceptable?(val)
33
- int_val = if val.is_a?(Integer)
34
- return true if val >= 0 && val < INT32_MAX # return quickly for smallest integer size, hot code path
35
- val
36
- elsif val.is_a?(Numeric)
37
- val.to_i
38
- else
39
- Integer(val, 10)
40
- end
41
-
42
- int_val >= self.class.min && int_val <= self.class.max
43
- rescue
44
- false
45
- end
46
-
47
- def coerce!(val)
48
- if val.is_a?(Integer) && val >= 0 && val <= INT32_MAX
49
- val
50
- else
51
- fail TypeError, "Expected value of type '#{type_class}' for field #{name}, but got '#{val.class}'" unless acceptable?(val)
52
-
53
- if val.is_a?(Integer) || val.is_a?(Numeric)
54
- val.to_i
55
- else
56
- Integer(val, 10)
57
- end
58
- end
59
- rescue ArgumentError
60
- fail TypeError, "Expected value of type '#{type_class}' for field #{name}, but got '#{val.class}'"
61
- end
62
-
63
- def decode(value)
64
- value
65
- end
66
-
67
- def encode(value)
68
- ::Protobuf::Field::VarintField.encode(value)
69
- end
70
-
71
- def wire_type
72
- ::Protobuf::WireType::VARINT
73
- end
74
-
75
- end
76
- end
77
- end
@@ -1,74 +0,0 @@
1
- require 'protobuf/field/base_field'
2
- require 'protobuf/field/bytes_field'
3
- require 'protobuf/field/float_field'
4
- require 'protobuf/field/message_field'
5
- require 'protobuf/field/varint_field'
6
- require 'protobuf/field/string_field'
7
- require 'protobuf/field/double_field'
8
- require 'protobuf/field/enum_field'
9
- require 'protobuf/field/integer_field'
10
- require 'protobuf/field/signed_integer_field'
11
- require 'protobuf/field/uint32_field'
12
- require 'protobuf/field/uint64_field'
13
- require 'protobuf/field/int32_field'
14
- require 'protobuf/field/int64_field'
15
- require 'protobuf/field/sint32_field'
16
- require 'protobuf/field/sint64_field'
17
- require 'protobuf/field/bool_field'
18
- require 'protobuf/field/sfixed32_field'
19
- require 'protobuf/field/sfixed64_field'
20
- require 'protobuf/field/fixed32_field'
21
- require 'protobuf/field/fixed64_field'
22
-
23
- module Protobuf
24
- module Field
25
-
26
- PRIMITIVE_FIELD_MAP = {
27
- :double => ::Protobuf::Field::DoubleField,
28
- :float => ::Protobuf::Field::FloatField,
29
- :int32 => ::Protobuf::Field::Int32Field,
30
- :int64 => ::Protobuf::Field::Int64Field,
31
- :uint32 => ::Protobuf::Field::Uint32Field,
32
- :uint64 => ::Protobuf::Field::Uint64Field,
33
- :sint32 => ::Protobuf::Field::Sint32Field,
34
- :sint64 => ::Protobuf::Field::Sint64Field,
35
- :fixed32 => ::Protobuf::Field::Fixed32Field,
36
- :fixed64 => ::Protobuf::Field::Fixed64Field,
37
- :sfixed32 => ::Protobuf::Field::Sfixed32Field,
38
- :sfixed64 => ::Protobuf::Field::Sfixed64Field,
39
- :string => ::Protobuf::Field::StringField,
40
- :bytes => ::Protobuf::Field::BytesField,
41
- :bool => ::Protobuf::Field::BoolField,
42
- }.freeze
43
-
44
- def self.build(message_class, rule, type, name, tag, simple_name, options = {})
45
- field_class(type).new(message_class, rule, field_type(type), name, tag, simple_name, options)
46
- end
47
-
48
- # Returns the field class for primitives,
49
- # EnumField for types that inherit from Protobuf::Enum,
50
- # and MessageField for types that inherit from Protobuf::Message.
51
- #
52
- def self.field_class(type)
53
- if PRIMITIVE_FIELD_MAP.key?(type)
54
- PRIMITIVE_FIELD_MAP[type]
55
- elsif type < ::Protobuf::Enum
56
- EnumField
57
- elsif type < ::Protobuf::Message
58
- MessageField
59
- elsif type < ::Protobuf::Field::BaseField
60
- type
61
- else
62
- fail ArgumentError, "Invalid field type #{type}"
63
- end
64
- end
65
-
66
- # Returns the mapped type for primitives,
67
- # otherwise the given type is returned.
68
- #
69
- def self.field_type(type)
70
- PRIMITIVE_FIELD_MAP.fetch(type) { type }
71
- end
72
-
73
- end
74
- end
@@ -1,85 +0,0 @@
1
- require 'protobuf/generators/printable'
2
-
3
- module Protobuf
4
- module Generators
5
- class Base
6
- include ::Protobuf::Generators::Printable
7
-
8
- def self.validate_tags(type_name, tags)
9
- return if tags.empty?
10
-
11
- unique_tags = tags.uniq
12
-
13
- if unique_tags.size < tags.size
14
- ::Protobuf::CodeGenerator.fatal("#{type_name} object has duplicate tags. Expected #{unique_tags.size} tags, but got #{tags.size}. Suppress with PB_NO_TAG_WARNINGS=1.")
15
- end
16
-
17
- unless ENV.key?('PB_NO_TAG_WARNINGS')
18
- expected_size = tags.max - tags.min + 1
19
- if tags.size < expected_size
20
- ::Protobuf::CodeGenerator.print_tag_warning_suppress
21
- ::Protobuf::CodeGenerator.warn("#{type_name} object should have #{expected_size} tags (#{tags.min}..#{tags.max}), but found #{tags.size} tags.")
22
- end
23
- end
24
- end
25
-
26
- attr_reader :descriptor, :namespace, :options
27
-
28
- def initialize(descriptor, indent_level = 0, options = {})
29
- @descriptor = descriptor
30
- @options = options
31
- @namespace = @options.fetch(:namespace) { [] }
32
- init_printer(indent_level)
33
- end
34
-
35
- def fully_qualified_type_namespace
36
- ".#{type_namespace.join('.')}"
37
- end
38
-
39
- def run_once(label)
40
- tracker_ivar = "@_#{label}_compiled"
41
- value_ivar = "@_#{label}_compiled_value"
42
-
43
- if instance_variable_get(tracker_ivar)
44
- return instance_variable_get(value_ivar)
45
- end
46
-
47
- return_value = yield
48
- instance_variable_set(tracker_ivar, true)
49
- instance_variable_set(value_ivar, return_value)
50
- return_value
51
- end
52
-
53
- def to_s
54
- compile
55
- print_contents # see Printable
56
- end
57
-
58
- def type_namespace
59
- @type_namespace ||= @namespace + [descriptor.name]
60
- end
61
-
62
- def serialize_value(value)
63
- case value
64
- when Message
65
- fields = value.each_field.map do |field, inner_value|
66
- next unless value.field?(field.name)
67
- serialized_inner_value = serialize_value(inner_value)
68
- "#{field.fully_qualified_name.inspect} => #{serialized_inner_value}"
69
- end.compact
70
- "{ #{fields.join(', ')} }"
71
- when Enum
72
- "::#{value.parent_class}::#{value.name}"
73
- when String
74
- value.inspect
75
- when nil
76
- "nil"
77
- when Array
78
- '[' + value.map { |x| serialize_value(x) }.join(', ') + ']'
79
- else
80
- value
81
- end
82
- end
83
- end
84
- end
85
- end
@@ -1,39 +0,0 @@
1
- require 'protobuf/generators/base'
2
- require 'protobuf/generators/option_generator'
3
-
4
- module Protobuf
5
- module Generators
6
- class EnumGenerator < Base
7
-
8
- def compile
9
- run_once(:compile) do
10
- tags = []
11
-
12
- print_class(descriptor.name, :enum) do
13
- if descriptor.options
14
- print OptionGenerator.new(descriptor.options, current_indent).to_s
15
- puts
16
- end
17
-
18
- descriptor.value.each do |enum_value_descriptor|
19
- tags << enum_value_descriptor.number
20
- puts build_value(enum_value_descriptor)
21
- end
22
- end
23
-
24
- unless descriptor.options.try(:allow_alias)
25
- self.class.validate_tags(fully_qualified_type_namespace, tags)
26
- end
27
- end
28
- end
29
-
30
- def build_value(enum_value_descriptor)
31
- name = enum_value_descriptor.name
32
- name.upcase! if ENV.key?('PB_UPCASE_ENUMS')
33
- number = enum_value_descriptor.number
34
- "define :#{name}, #{number}"
35
- end
36
-
37
- end
38
- end
39
- end
@@ -1,27 +0,0 @@
1
- require 'protobuf/generators/base'
2
- require 'protobuf/generators/group_generator'
3
-
4
- module Protobuf
5
- module Generators
6
- class ExtensionGenerator < Base
7
-
8
- def initialize(message_type, field_descriptors, indent_level)
9
- super(nil, indent_level)
10
- @message_type = modulize(message_type)
11
- @field_descriptors = field_descriptors
12
- end
13
-
14
- def compile
15
- run_once(:compile) do
16
- print_class(@message_type, :message) do
17
- group = GroupGenerator.new(current_indent)
18
- group.add_extension_fields(@field_descriptors)
19
- group.order = [:extension_field]
20
- print group.to_s
21
- end
22
- end
23
- end
24
-
25
- end
26
- end
27
- end
@@ -1,193 +0,0 @@
1
- require 'protobuf/generators/base'
2
-
3
- module Protobuf
4
- module Generators
5
- class FieldGenerator < Base
6
-
7
- ##
8
- # Constants
9
- #
10
- PROTO_INFINITY_DEFAULT = /^inf$/i
11
- PROTO_NEGATIVE_INFINITY_DEFAULT = /^-inf$/i
12
- PROTO_NAN_DEFAULT = /^nan$/i
13
- RUBY_INFINITY_DEFAULT = '::Float::INFINITY'.freeze
14
- RUBY_NEGATIVE_INFINITY_DEFAULT = '-::Float::INFINITY'.freeze
15
- RUBY_NAN_DEFAULT = '::Float::NAN'.freeze
16
-
17
- ##
18
- # Attributes
19
- #
20
- attr_reader :field_options
21
-
22
- def initialize(field_descriptor, enclosing_msg_descriptor, indent_level)
23
- super(field_descriptor, indent_level)
24
- @enclosing_msg_descriptor = enclosing_msg_descriptor
25
- end
26
-
27
- def applicable_options
28
- # Note on the strange use of `#inspect`:
29
- # :boom.inspect #=> ":boom"
30
- # :".boom.foo".inspect #=> ":\".boom.foo\""
31
- # An alternative to `#inspect` would be always adding double quotes,
32
- # but the generatated code looks un-idiomatic:
33
- # ":\"#{:boom}\"" #=> ":\"boom\"" <-- Note the unnecessary double quotes
34
- @applicable_options ||= field_options.map { |k, v| "#{k.inspect} => #{v}" }
35
- end
36
-
37
- def default_value
38
- @default_value ||= begin
39
- if defaulted?
40
- case descriptor.type.name
41
- when :TYPE_ENUM
42
- enum_default_value
43
- when :TYPE_STRING, :TYPE_BYTES
44
- string_default_value
45
- when :TYPE_FLOAT, :TYPE_DOUBLE
46
- float_double_default_value
47
- else
48
- verbatim_default_value
49
- end
50
- end
51
- end
52
- end
53
-
54
- def defaulted?
55
- descriptor.respond_to_has_and_present?(:default_value)
56
- end
57
-
58
- def deprecated?
59
- descriptor.options.try(:deprecated?) { false }
60
- end
61
-
62
- def extension?
63
- descriptor.respond_to_has_and_present?(:extendee)
64
- end
65
-
66
- def compile
67
- run_once(:compile) do
68
- field_definition = if map?
69
- ["map #{map_key_type_name}", map_value_type_name, name, number, applicable_options]
70
- else
71
- ["#{label} #{type_name}", name, number, applicable_options]
72
- end
73
- puts field_definition.flatten.compact.join(', ')
74
- end
75
- end
76
-
77
- def label
78
- @label ||= descriptor.label.name.to_s.downcase.sub(/label_/, '') # required, optional, repeated
79
- end
80
-
81
- def name
82
- @name ||= descriptor.name.to_sym.inspect
83
- end
84
-
85
- def number
86
- @number ||= descriptor.number
87
- end
88
-
89
- def field_options
90
- @field_options ||= begin
91
- opts = {}
92
- opts[:default] = default_value if defaulted?
93
- opts[:packed] = 'true' if packed?
94
- opts[:deprecated] = 'true' if deprecated?
95
- opts[:extension] = 'true' if extension?
96
- if descriptor.options
97
- descriptor.options.each_field do |field_option|
98
- next unless descriptor.options.field?(field_option.name)
99
- option_value = descriptor.options[field_option.name]
100
- opts[field_option.fully_qualified_name] = serialize_value(option_value)
101
- end
102
- end
103
- opts
104
- end
105
- end
106
-
107
- def packed?
108
- descriptor.options.try(:packed?) { false }
109
- end
110
-
111
- # Determine the field type
112
- def type_name
113
- @type_name ||= determine_type_name(descriptor)
114
- end
115
-
116
- # If this field is a map field, this returns a message descriptor that
117
- # represents the entries in the map. Returns nil if this field is not
118
- # a map field.
119
- def map_entry
120
- @map_entry ||= determine_map_entry
121
- end
122
-
123
- def map?
124
- !map_entry.nil?
125
- end
126
-
127
- def map_key_type_name
128
- return nil if map_entry.nil?
129
- determine_type_name(map_entry.field.find { |v| v.name == 'key' && v.number == 1 })
130
- end
131
-
132
- def map_value_type_name
133
- return nil if map_entry.nil?
134
- determine_type_name(map_entry.field.find { |v| v.name == 'value' && v.number == 2 })
135
- end
136
-
137
- private
138
-
139
- def enum_default_value
140
- optionally_upcased_default =
141
- if ENV.key?('PB_UPCASE_ENUMS')
142
- verbatim_default_value.upcase
143
- else
144
- verbatim_default_value
145
- end
146
- "#{type_name}::#{optionally_upcased_default}"
147
- end
148
-
149
- def float_double_default_value
150
- case verbatim_default_value
151
- when PROTO_INFINITY_DEFAULT then
152
- RUBY_INFINITY_DEFAULT
153
- when PROTO_NEGATIVE_INFINITY_DEFAULT then
154
- RUBY_NEGATIVE_INFINITY_DEFAULT
155
- when PROTO_NAN_DEFAULT then
156
- RUBY_NAN_DEFAULT
157
- else
158
- verbatim_default_value
159
- end
160
- end
161
-
162
- def string_default_value
163
- %("#{verbatim_default_value.gsub(/'/, '\\\\\'')}")
164
- end
165
-
166
- def verbatim_default_value
167
- descriptor.default_value
168
- end
169
-
170
- def determine_type_name(descriptor)
171
- case descriptor.type.name
172
- when :TYPE_MESSAGE, :TYPE_ENUM, :TYPE_GROUP then
173
- modulize(descriptor.type_name)
174
- else
175
- type_name = descriptor.type.name.to_s.downcase.sub(/^type_/, '')
176
- ":#{type_name}"
177
- end
178
- end
179
-
180
- def determine_map_entry
181
- return nil if @enclosing_msg_descriptor.nil?
182
- return nil unless descriptor.label.name == :LABEL_REPEATED && descriptor.type.name == :TYPE_MESSAGE
183
- # find nested message type
184
- name_parts = descriptor.type_name.split(".")
185
- return nil if name_parts.size < 2 || name_parts[-2] != @enclosing_msg_descriptor.name
186
- nested = @enclosing_msg_descriptor.nested_type.find { |e| e.name == name_parts[-1] }
187
- return nested if !nested.nil? && nested.options.try(:map_entry?)
188
- nil
189
- end
190
-
191
- end
192
- end
193
- end