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.
Files changed (220) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -3
  3. data/.simplecov +1 -0
  4. data/Rakefile +0 -27
  5. data/ext/cs__assess_basic_object/cs__assess_basic_object.c +7 -5
  6. data/ext/cs__assess_kernel/cs__assess_kernel.c +14 -3
  7. data/ext/cs__assess_kernel/cs__assess_kernel.h +2 -0
  8. data/ext/cs__assess_marshal_module/cs__assess_marshal_module.c +10 -3
  9. data/ext/cs__assess_marshal_module/cs__assess_marshal_module.h +2 -1
  10. data/ext/cs__assess_regexp/cs__assess_regexp.c +9 -7
  11. data/ext/{cs__assess_string_interpolation26/cs__assess_string_interpolation26.c → cs__assess_string_interpolation/cs__assess_string_interpolation.c} +14 -3
  12. data/ext/{cs__assess_string_interpolation26/cs__assess_string_interpolation26.h → cs__assess_string_interpolation/cs__assess_string_interpolation.h} +1 -1
  13. data/ext/{cs__assess_string_interpolation26 → cs__assess_string_interpolation}/extconf.rb +0 -0
  14. data/ext/cs__common/cs__common.c +5 -4
  15. data/ext/cs__contrast_patch/cs__contrast_patch.c +3 -10
  16. data/lib/contrast/agent/assess/events/source_event.rb +16 -12
  17. data/lib/contrast/agent/assess/policy/policy_node.rb +6 -0
  18. data/lib/contrast/agent/assess/policy/propagation_method.rb +3 -41
  19. data/lib/contrast/agent/assess/policy/propagation_node.rb +8 -0
  20. data/lib/contrast/agent/assess/policy/propagator/base.rb +2 -0
  21. data/lib/contrast/agent/assess/policy/source_method.rb +2 -47
  22. data/lib/contrast/agent/assess/policy/source_node.rb +1 -0
  23. data/lib/contrast/agent/assess/policy/trigger_method.rb +1 -1
  24. data/lib/contrast/agent/assess/policy/trigger_node.rb +8 -0
  25. data/lib/contrast/agent/assess/property/evented.rb +4 -18
  26. data/lib/contrast/agent/assess/tag.rb +19 -0
  27. data/lib/contrast/agent/at_exit_hook.rb +9 -8
  28. data/lib/contrast/agent/inventory/database_config.rb +6 -3
  29. data/lib/contrast/agent/inventory/dependency_analysis.rb +3 -2
  30. data/lib/contrast/agent/inventory/dependency_usage_analysis.rb +13 -9
  31. data/lib/contrast/agent/middleware.rb +4 -0
  32. data/lib/contrast/agent/patching/policy/after_load_patcher.rb +27 -2
  33. data/lib/contrast/agent/patching/policy/policy.rb +5 -0
  34. data/lib/contrast/agent/patching/policy/policy_node.rb +6 -0
  35. data/lib/contrast/agent/patching/policy/trigger_node.rb +3 -0
  36. data/lib/contrast/agent/protect/policy/applies_deserialization_rule.rb +3 -4
  37. data/lib/contrast/agent/protect/policy/applies_path_traversal_rule.rb +1 -0
  38. data/lib/contrast/agent/protect/policy/rule_applicator.rb +2 -2
  39. data/lib/contrast/agent/protect/rule/base.rb +1 -0
  40. data/lib/contrast/agent/protect/rule/no_sqli.rb +2 -0
  41. data/lib/contrast/agent/protect/rule/xss.rb +4 -0
  42. data/lib/contrast/agent/reporting/reporter.rb +33 -17
  43. data/lib/contrast/agent/reporting/reporter_heartbeat.rb +21 -15
  44. data/lib/contrast/agent/reporting/reporting_events/application_inventory.rb +3 -18
  45. data/lib/contrast/agent/reporting/reporting_events/application_update.rb +5 -24
  46. data/lib/contrast/agent/reporting/reporting_events/architecture_component.rb +8 -1
  47. data/lib/contrast/agent/reporting/reporting_events/discovered_route.rb +83 -16
  48. data/lib/contrast/agent/reporting/reporting_events/finding.rb +9 -3
  49. data/lib/contrast/agent/reporting/reporting_events/finding_event.rb +10 -1
  50. data/lib/contrast/agent/reporting/reporting_events/finding_event_object.rb +11 -1
  51. data/lib/contrast/agent/reporting/reporting_events/finding_event_parent_object.rb +11 -1
  52. data/lib/contrast/agent/reporting/reporting_events/finding_event_property.rb +12 -1
  53. data/lib/contrast/agent/reporting/reporting_events/finding_event_signature.rb +10 -1
  54. data/lib/contrast/agent/reporting/reporting_events/finding_event_source.rb +11 -1
  55. data/lib/contrast/agent/reporting/reporting_events/finding_event_stack.rb +11 -1
  56. data/lib/contrast/agent/reporting/reporting_events/finding_event_taint_range.rb +11 -1
  57. data/lib/contrast/agent/reporting/reporting_events/finding_request.rb +11 -1
  58. data/lib/contrast/agent/reporting/reporting_events/library_discovery.rb +29 -32
  59. data/lib/contrast/agent/reporting/reporting_events/library_usage_observation.rb +18 -20
  60. data/lib/contrast/agent/reporting/reporting_events/observed_library_usage.rb +11 -24
  61. data/lib/contrast/agent/reporting/reporting_events/observed_route.rb +13 -6
  62. data/lib/contrast/agent/reporting/reporting_events/preflight_message.rb +10 -4
  63. data/lib/contrast/agent/reporting/reporting_events/reporting_event.rb +10 -4
  64. data/lib/contrast/agent/reporting/reporting_events/route_coverage.rb +9 -0
  65. data/lib/contrast/agent/reporting/reporting_events/route_discovery.rb +10 -1
  66. data/lib/contrast/agent/reporting/reporting_events/route_discovery_observation.rb +11 -4
  67. data/lib/contrast/agent/reporting/reporting_events/server_activity.rb +0 -8
  68. data/lib/contrast/agent/reporting/reporting_utilities/audit.rb +2 -6
  69. data/lib/contrast/agent/reporting/reporting_utilities/dtm_message.rb +0 -32
  70. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client.rb +1 -4
  71. data/lib/contrast/agent/reporting/reporting_utilities/reporter_client_utils.rb +1 -11
  72. data/lib/contrast/agent/reporting/reporting_utilities/response.rb +60 -2
  73. data/lib/contrast/agent/reporting/reporting_utilities/response_extractor.rb +32 -10
  74. data/lib/contrast/agent/reporting/reporting_utilities/response_handler.rb +1 -1
  75. data/lib/contrast/agent/reporting/reporting_utilities/response_handler_utils.rb +58 -26
  76. data/lib/contrast/agent/reporting/settings/application_settings.rb +8 -23
  77. data/lib/contrast/agent/reporting/settings/assess_server_feature.rb +27 -33
  78. data/lib/contrast/agent/reporting/settings/bot_blocker.rb +68 -0
  79. data/lib/contrast/agent/reporting/settings/code_exclusion.rb +27 -0
  80. data/lib/contrast/agent/reporting/settings/exclusion_base.rb +33 -0
  81. data/lib/contrast/agent/reporting/settings/exclusions.rb +39 -57
  82. data/lib/contrast/agent/reporting/settings/helpers.rb +56 -0
  83. data/lib/contrast/agent/reporting/settings/input_exclusion.rb +37 -0
  84. data/lib/contrast/agent/reporting/settings/ip_filter.rb +35 -0
  85. data/lib/contrast/agent/reporting/settings/keyword.rb +74 -0
  86. data/lib/contrast/agent/reporting/settings/log_enhancer.rb +65 -0
  87. data/lib/contrast/agent/reporting/settings/protect.rb +4 -2
  88. data/lib/contrast/agent/reporting/settings/protect_server_feature.rb +62 -115
  89. data/lib/contrast/agent/reporting/settings/reaction.rb +11 -2
  90. data/lib/contrast/agent/reporting/settings/rule_definition.rb +63 -0
  91. data/lib/contrast/agent/reporting/settings/sampling.rb +10 -0
  92. data/lib/contrast/agent/reporting/settings/sanitizer.rb +38 -0
  93. data/lib/contrast/agent/reporting/settings/sensitive_data_masking.rb +9 -1
  94. data/lib/contrast/agent/reporting/settings/sensitive_data_masking_rule.rb +7 -0
  95. data/lib/contrast/agent/reporting/settings/server_features.rb +8 -0
  96. data/lib/contrast/agent/reporting/settings/syslog.rb +176 -0
  97. data/lib/contrast/agent/reporting/settings/url_exclusion.rb +42 -0
  98. data/lib/contrast/agent/reporting/settings/validator.rb +17 -0
  99. data/lib/contrast/agent/request.rb +5 -7
  100. data/lib/contrast/agent/request_context.rb +8 -13
  101. data/lib/contrast/agent/request_context_extend.rb +8 -9
  102. data/lib/contrast/agent/request_handler.rb +10 -35
  103. data/lib/contrast/agent/rule_set.rb +4 -0
  104. data/lib/contrast/agent/service_heartbeat.rb +1 -1
  105. data/lib/contrast/agent/static_analysis.rb +6 -15
  106. data/lib/contrast/agent/telemetry/base.rb +35 -35
  107. data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_base.rb +2 -0
  108. data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_event.rb +2 -0
  109. data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_message.rb +5 -2
  110. data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_message_exception.rb +3 -0
  111. data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exception_stack_frame.rb +3 -0
  112. data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exceptions.rb +0 -1
  113. data/lib/contrast/agent/thread_watcher.rb +2 -6
  114. data/lib/contrast/agent/version.rb +1 -1
  115. data/lib/contrast/agent.rb +1 -3
  116. data/lib/contrast/api/communication/socket.rb +1 -0
  117. data/lib/contrast/api/decorators/message.rb +0 -6
  118. data/lib/contrast/api/decorators.rb +0 -3
  119. data/lib/contrast/api/dtm.pb.rb +1 -1
  120. data/lib/contrast/api/settings.pb.rb +1 -1
  121. data/lib/contrast/components/assess.rb +0 -6
  122. data/lib/contrast/components/config.rb +18 -2
  123. data/lib/contrast/config/base_configuration.rb +0 -13
  124. data/lib/contrast/config/root_configuration.rb +1 -0
  125. data/lib/contrast/config/ruby_configuration.rb +2 -9
  126. data/lib/contrast/configuration.rb +0 -2
  127. data/lib/contrast/extension/assess/eval_trigger.rb +0 -4
  128. data/lib/contrast/extension/assess/hash.rb +3 -2
  129. data/lib/contrast/extension/assess/kernel.rb +22 -0
  130. data/lib/contrast/extension/assess/marshal.rb +16 -0
  131. data/lib/contrast/extension/assess/string.rb +21 -20
  132. data/lib/contrast/framework/base_support.rb +13 -4
  133. data/lib/contrast/framework/grape/support.rb +6 -6
  134. data/lib/contrast/framework/manager.rb +7 -23
  135. data/lib/contrast/framework/manager_extend.rb +1 -1
  136. data/lib/contrast/framework/rails/patch/action_controller_live_buffer.rb +11 -15
  137. data/lib/contrast/framework/rails/support.rb +9 -2
  138. data/lib/contrast/framework/sinatra/support.rb +3 -2
  139. data/lib/contrast/logger/aliased_logging.rb +33 -26
  140. data/lib/contrast/utils/assess/source_method_utils.rb +0 -9
  141. data/lib/contrast/utils/lru_cache.rb +3 -0
  142. data/lib/contrast/utils/middleware_utils.rb +2 -0
  143. data/lib/contrast/utils/patching/policy/patch_utils.rb +5 -22
  144. data/lib/contrast/utils/response_utils.rb +14 -1
  145. data/lib/contrast/utils/telemetry.rb +9 -0
  146. data/lib/contrast/utils/telemetry_client.rb +7 -7
  147. data/lib/contrast/utils/telemetry_hash.rb +36 -12
  148. data/lib/contrast/utils/telemetry_identifier.rb +8 -0
  149. data/lib/contrast/utils/thread_tracker.rb +26 -9
  150. data/lib/contrast/utils/timer.rb +6 -1
  151. data/lib/contrast.rb +35 -3
  152. data/lib/protobuf/code_generator.rb +129 -0
  153. data/lib/protobuf/decoder.rb +28 -0
  154. data/lib/protobuf/deprecation.rb +117 -0
  155. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +79 -0
  156. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +360 -0
  157. data/lib/protobuf/descriptors.rb +3 -0
  158. data/lib/protobuf/encoder.rb +11 -0
  159. data/lib/protobuf/enum.rb +365 -0
  160. data/lib/protobuf/exceptions.rb +9 -0
  161. data/lib/protobuf/field/base_field.rb +380 -0
  162. data/lib/protobuf/field/base_field_object_definitions.rb +504 -0
  163. data/lib/protobuf/field/bool_field.rb +64 -0
  164. data/lib/protobuf/field/bytes_field.rb +67 -0
  165. data/lib/protobuf/field/double_field.rb +25 -0
  166. data/lib/protobuf/field/enum_field.rb +56 -0
  167. data/lib/protobuf/field/field_array.rb +102 -0
  168. data/lib/protobuf/field/field_hash.rb +122 -0
  169. data/lib/protobuf/field/fixed32_field.rb +25 -0
  170. data/lib/protobuf/field/fixed64_field.rb +28 -0
  171. data/lib/protobuf/field/float_field.rb +43 -0
  172. data/lib/protobuf/field/int32_field.rb +21 -0
  173. data/lib/protobuf/field/int64_field.rb +34 -0
  174. data/lib/protobuf/field/integer_field.rb +23 -0
  175. data/lib/protobuf/field/message_field.rb +51 -0
  176. data/lib/protobuf/field/sfixed32_field.rb +27 -0
  177. data/lib/protobuf/field/sfixed64_field.rb +28 -0
  178. data/lib/protobuf/field/signed_integer_field.rb +29 -0
  179. data/lib/protobuf/field/sint32_field.rb +21 -0
  180. data/lib/protobuf/field/sint64_field.rb +21 -0
  181. data/lib/protobuf/field/string_field.rb +51 -0
  182. data/lib/protobuf/field/uint32_field.rb +21 -0
  183. data/lib/protobuf/field/uint64_field.rb +21 -0
  184. data/lib/protobuf/field/varint_field.rb +77 -0
  185. data/lib/protobuf/field.rb +74 -0
  186. data/lib/protobuf/generators/base.rb +85 -0
  187. data/lib/protobuf/generators/enum_generator.rb +39 -0
  188. data/lib/protobuf/generators/extension_generator.rb +27 -0
  189. data/lib/protobuf/generators/field_generator.rb +193 -0
  190. data/lib/protobuf/generators/file_generator.rb +262 -0
  191. data/lib/protobuf/generators/group_generator.rb +122 -0
  192. data/lib/protobuf/generators/message_generator.rb +104 -0
  193. data/lib/protobuf/generators/option_generator.rb +17 -0
  194. data/lib/protobuf/generators/printable.rb +160 -0
  195. data/lib/protobuf/generators/service_generator.rb +50 -0
  196. data/lib/protobuf/lifecycle.rb +33 -0
  197. data/lib/protobuf/logging.rb +39 -0
  198. data/lib/protobuf/message/fields.rb +233 -0
  199. data/lib/protobuf/message/serialization.rb +85 -0
  200. data/lib/protobuf/message.rb +241 -0
  201. data/lib/protobuf/optionable.rb +72 -0
  202. data/lib/protobuf/tasks/compile.rake +80 -0
  203. data/lib/protobuf/tasks.rb +1 -0
  204. data/lib/protobuf/varint.rb +20 -0
  205. data/lib/protobuf/varint_pure.rb +31 -0
  206. data/lib/protobuf/version.rb +3 -0
  207. data/lib/protobuf/wire_type.rb +10 -0
  208. data/lib/protobuf.rb +91 -0
  209. data/proto/dynamic_discovery.proto +46 -0
  210. data/proto/google/protobuf/compiler/plugin.proto +183 -0
  211. data/proto/google/protobuf/descriptor.proto +911 -0
  212. data/proto/rpc.proto +71 -0
  213. data/resources/assess/policy.json +2 -11
  214. data/ruby-agent.gemspec +2 -2
  215. metadata +105 -30
  216. data/lib/contrast/agent/telemetry/events/exceptions/telemetry_exceptions_report.rb +0 -30
  217. data/lib/contrast/api/decorators/application_update.rb +0 -52
  218. data/lib/contrast/api/decorators/library.rb +0 -56
  219. data/lib/contrast/api/decorators/library_usage_update.rb +0 -31
  220. data/lib/contrast/framework/platform_version.rb +0 -22
@@ -0,0 +1,380 @@
1
+ require 'active_support/core_ext/hash/slice'
2
+ require 'protobuf/field/field_array'
3
+ require 'protobuf/field/field_hash'
4
+ require 'protobuf/field/base_field_object_definitions'
5
+
6
+ module Protobuf
7
+ module Field
8
+ class BaseField
9
+ include ::Protobuf::Logging
10
+ ::Protobuf::Optionable.inject(self, false) { ::CSGoogle::Protobuf::FieldOptions }
11
+
12
+ ##
13
+ # Constants
14
+ #
15
+ OBJECT_MODULE = ::Protobuf::Field::BaseFieldObjectDefinitions
16
+ PACKED_TYPES = [
17
+ ::Protobuf::WireType::VARINT,
18
+ ::Protobuf::WireType::FIXED32,
19
+ ::Protobuf::WireType::FIXED64,
20
+ ].freeze
21
+
22
+ ##
23
+ # Attributes
24
+ #
25
+ attr_reader :default_value, :message_class, :name, :fully_qualified_name, :options, :rule, :tag, :type_class
26
+
27
+ ##
28
+ # Class Methods
29
+ #
30
+
31
+ def self.default
32
+ nil
33
+ end
34
+
35
+ ##
36
+ # Constructor
37
+ #
38
+
39
+ def initialize(message_class, rule, type_class, fully_qualified_name, tag, simple_name, options)
40
+ @message_class = message_class
41
+ @name = simple_name || fully_qualified_name
42
+ @fully_qualified_name = fully_qualified_name
43
+ @rule = rule
44
+ @tag = tag
45
+ @type_class = type_class
46
+ # Populate the option hash with all the original default field options, for backwards compatibility.
47
+ # However, both default and custom options should ideally be accessed through the Optionable .{get,get!}_option functions.
48
+ @options = options.slice(:ctype, :packed, :deprecated, :lazy, :jstype, :weak, :uninterpreted_option, :default, :extension)
49
+ options.each do |option_name, value|
50
+ set_option(option_name, value)
51
+ end
52
+
53
+ @extension = options.key?(:extension)
54
+ @deprecated = options.key?(:deprecated)
55
+ @required = rule == :required
56
+ @repeated = rule == :repeated
57
+ @optional = rule == :optional
58
+ @packed = @repeated && options.key?(:packed)
59
+
60
+ validate_packed_field if packed?
61
+ define_accessor(simple_name, fully_qualified_name) if simple_name
62
+ set_repeated_message!
63
+ set_map!
64
+ @value_from_values = nil
65
+ @value_from_values_for_serialization = nil
66
+ @field_predicate = nil
67
+ @field_and_present_predicate = nil
68
+ @set_field = nil
69
+ @set_method = nil
70
+ @to_message_hash = nil
71
+ @to_message_hash_string_keys = nil
72
+ @encode_to_stream = nil
73
+
74
+ define_value_from_values!
75
+ define_value_from_values_for_serialization!
76
+ define_field_predicate!
77
+ define_field_and_present_predicate!
78
+ define_set_field!
79
+ define_set_method!
80
+ define_to_message_hash!
81
+ define_encode_to_stream!
82
+ set_default_value!
83
+ end
84
+
85
+ ##
86
+ # Public Instance Methods
87
+ #
88
+
89
+ def acceptable?(_value)
90
+ true
91
+ end
92
+
93
+ def coerce!(value)
94
+ value
95
+ end
96
+
97
+ def decode(_bytes)
98
+ fail NotImplementedError, "#{self.class.name}##{__method__}"
99
+ end
100
+
101
+ def default
102
+ options[:default]
103
+ end
104
+
105
+ def set_default_value!
106
+ @default_value ||= if optional? || required?
107
+ typed_default_value
108
+ elsif map?
109
+ ::Protobuf::Field::FieldHash.new(self).freeze
110
+ elsif repeated?
111
+ ::Protobuf::Field::FieldArray.new(self).freeze
112
+ else
113
+ fail "Unknown field label -- something went very wrong"
114
+ end
115
+ end
116
+
117
+ def define_encode_to_stream!
118
+ @encode_to_stream = if repeated? && packed?
119
+ OBJECT_MODULE::RepeatedPackedEncodeToStream.new(self)
120
+ elsif repeated?
121
+ OBJECT_MODULE::RepeatedNotPackedEncodeToStream.new(self)
122
+ elsif message? || type_class == ::Protobuf::Field::BytesField
123
+ OBJECT_MODULE::BytesEncodeToStream.new(self)
124
+ elsif type_class == ::Protobuf::Field::StringField
125
+ OBJECT_MODULE::StringEncodeToStream.new(self)
126
+ else
127
+ OBJECT_MODULE::BaseEncodeToStream.new(self)
128
+ end
129
+ end
130
+
131
+ def encode_to_stream(value, stream)
132
+ @encode_to_stream.call(value, stream)
133
+ end
134
+
135
+ def define_field_predicate!
136
+ @field_predicate = if repeated?
137
+ OBJECT_MODULE::RepeatedFieldPredicate.new(self)
138
+ else
139
+ OBJECT_MODULE::BaseFieldPredicate.new(self)
140
+ end
141
+ end
142
+
143
+ def field?(values)
144
+ @field_predicate.call(values)
145
+ end
146
+
147
+ def define_field_and_present_predicate!
148
+ @field_and_present_predicate = if !repeated? && type_class == ::Protobuf::Field::BoolField # boolean present check
149
+ OBJECT_MODULE::BoolFieldAndPresentPredicate.new(self)
150
+ else
151
+ OBJECT_MODULE::BaseFieldAndPresentPredicate.new(self)
152
+ end
153
+ end
154
+
155
+ def field_and_present?(values)
156
+ @field_and_present_predicate.call(values)
157
+ end
158
+
159
+ def define_value_from_values!
160
+ @value_from_values = if map?
161
+ OBJECT_MODULE::MapValueFromValues.new(self)
162
+ elsif repeated?
163
+ OBJECT_MODULE::RepeatedFieldValueFromValues.new(self)
164
+ elsif type_class == ::Protobuf::Field::BoolField # boolean present check
165
+ OBJECT_MODULE::BoolFieldValueFromValues.new(self)
166
+ else
167
+ OBJECT_MODULE::BaseFieldValueFromValues.new(self)
168
+ end
169
+ end
170
+
171
+ def value_from_values(values)
172
+ @value_from_values.call(values)
173
+ end
174
+
175
+ def define_value_from_values_for_serialization!
176
+ @value_from_values_for_serialization = if map?
177
+ OBJECT_MODULE::MapValueFromValuesForSerialization.new(self)
178
+ elsif repeated?
179
+ OBJECT_MODULE::RepeatedFieldValueFromValuesForSerialization.new(self)
180
+ elsif type_class == ::Protobuf::Field::BoolField # boolean present check
181
+ OBJECT_MODULE::BoolFieldValueFromValuesForSerialization.new(self)
182
+ else
183
+ OBJECT_MODULE::BaseFieldValueFromValuesForSerialization.new(self)
184
+ end
185
+ end
186
+
187
+ def value_from_values_for_serialization(values)
188
+ @value_from_values_for_serialization.call(values)
189
+ end
190
+
191
+ def define_set_field!
192
+ @set_field = if map? && required?
193
+ OBJECT_MODULE::RequiredMapSetField.new(self)
194
+ elsif repeated? && required?
195
+ OBJECT_MODULE::RequiredRepeatedSetField.new(self)
196
+ elsif type_class == ::Protobuf::Field::StringField && required?
197
+ OBJECT_MODULE::RequiredStringSetField.new(self)
198
+ elsif required?
199
+ OBJECT_MODULE::RequiredBaseSetField.new(self)
200
+ elsif map?
201
+ OBJECT_MODULE::MapSetField.new(self)
202
+ elsif repeated?
203
+ OBJECT_MODULE::RepeatedSetField.new(self)
204
+ elsif type_class == ::Protobuf::Field::StringField
205
+ OBJECT_MODULE::StringSetField.new(self)
206
+ else
207
+ OBJECT_MODULE::BaseSetField.new(self)
208
+ end
209
+ end
210
+
211
+ def set_field(values, value, ignore_nil_for_repeated, message_instance)
212
+ @set_field.call(values, value, ignore_nil_for_repeated, message_instance)
213
+ end
214
+
215
+ def define_to_message_hash!
216
+ if message? || enum? || repeated? || map?
217
+ @to_message_hash = OBJECT_MODULE::ToHashValueToMessageHash.new(self)
218
+ @to_message_hash_string_keys = OBJECT_MODULE::ToHashValueToMessageHashWithStringKey.new(self)
219
+ else
220
+ @to_message_hash = OBJECT_MODULE::BaseToMessageHash.new(self)
221
+ @to_message_hash_string_keys = OBJECT_MODULE::BaseToMessageHashWithStringKey.new(self)
222
+ end
223
+ end
224
+
225
+ def to_message_hash(values, result)
226
+ @to_message_hash.call(values, result)
227
+ end
228
+
229
+ def to_message_hash_with_string_key(values, result)
230
+ @to_message_hash_string_keys.call(values, result)
231
+ end
232
+
233
+ def deprecated?
234
+ @deprecated
235
+ end
236
+
237
+ def encode(_value)
238
+ fail NotImplementedError, "#{self.class.name}##{__method__}"
239
+ end
240
+
241
+ def extension?
242
+ @extension
243
+ end
244
+
245
+ def enum?
246
+ false
247
+ end
248
+
249
+ def message?
250
+ false
251
+ end
252
+
253
+ def set_map!
254
+ set_repeated_message!
255
+ @is_map = repeated_message? && type_class.get_option!(:map_entry)
256
+ end
257
+
258
+ def map?
259
+ @is_map
260
+ end
261
+
262
+ def optional?
263
+ @optional
264
+ end
265
+
266
+ def packed?
267
+ @packed
268
+ end
269
+
270
+ def repeated?
271
+ @repeated
272
+ end
273
+
274
+ def set_repeated_message!
275
+ @repeated_message = repeated? && message?
276
+ end
277
+
278
+ def repeated_message?
279
+ @repeated_message
280
+ end
281
+
282
+ def required?
283
+ @required
284
+ end
285
+
286
+ def define_set_method!
287
+ @set_method = if map?
288
+ OBJECT_MODULE::MapSetMethod.new(self)
289
+ elsif repeated? && packed?
290
+ OBJECT_MODULE::RepeatedPackedSetMethod.new(self)
291
+ elsif repeated?
292
+ OBJECT_MODULE::RepeatedNotPackedSetMethod.new(self)
293
+ else
294
+ OBJECT_MODULE::BaseSetMethod.new(self)
295
+ end
296
+ end
297
+
298
+ def set(message_instance, bytes)
299
+ @set_method.call(message_instance, bytes)
300
+ end
301
+
302
+ def tag_encoded
303
+ @tag_encoded ||= begin
304
+ case
305
+ when repeated? && packed?
306
+ ::Protobuf::Field::VarintField.encode((tag << 3) | ::Protobuf::WireType::LENGTH_DELIMITED)
307
+ else
308
+ ::Protobuf::Field::VarintField.encode((tag << 3) | wire_type)
309
+ end
310
+ end
311
+ end
312
+
313
+ # FIXME: add packed, deprecated, extension options to to_s output
314
+ def to_s
315
+ "#{rule} #{type_class} #{name} = #{tag} #{default ? "[default=#{default.inspect}]" : ''}"
316
+ end
317
+
318
+ ::Protobuf.deprecator.define_deprecated_methods(self, :type => :type_class)
319
+
320
+ def wire_type
321
+ ::Protobuf::WireType::VARINT
322
+ end
323
+
324
+ def fully_qualified_name_only!
325
+ @name = @fully_qualified_name
326
+
327
+ ##
328
+ # Recreate all of the meta methods as they may have used the original `name` value
329
+ #
330
+ define_value_from_values!
331
+ define_value_from_values_for_serialization!
332
+ define_field_predicate!
333
+ define_field_and_present_predicate!
334
+ define_set_field!
335
+ define_set_method!
336
+ define_to_message_hash!
337
+ define_encode_to_stream!
338
+ end
339
+
340
+ private
341
+
342
+ ##
343
+ # Private Instance Methods
344
+ #
345
+
346
+ def define_accessor(simple_field_name, fully_qualified_field_name)
347
+ message_class.class_eval do
348
+ define_method("#{simple_field_name}!") do
349
+ @values[fully_qualified_field_name] if field?(fully_qualified_field_name)
350
+ end
351
+ end
352
+
353
+ message_class.class_eval do
354
+ define_method(simple_field_name) { self[fully_qualified_field_name] }
355
+ define_method("#{simple_field_name}=") { |v| set_field(fully_qualified_field_name, v, false) }
356
+ end
357
+
358
+ return unless deprecated?
359
+
360
+ ::Protobuf.field_deprecator.deprecate_method(message_class, simple_field_name)
361
+ ::Protobuf.field_deprecator.deprecate_method(message_class, "#{simple_field_name}!")
362
+ ::Protobuf.field_deprecator.deprecate_method(message_class, "#{simple_field_name}=")
363
+ end
364
+
365
+ def typed_default_value
366
+ if default.nil?
367
+ self.class.default
368
+ else
369
+ default
370
+ end
371
+ end
372
+
373
+ def validate_packed_field
374
+ if packed? && ! ::Protobuf::Field::BaseField::PACKED_TYPES.include?(wire_type)
375
+ fail "Can't use packed encoding for '#{type_class}' type"
376
+ end
377
+ end
378
+ end
379
+ end
380
+ end