cosmos 4.5.0-java → 4.5.1-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +2 -1
  3. data/Rakefile +10 -8
  4. data/autohotkey/tools/cmd_extractor.ahk +11 -9
  5. data/autohotkey/tools/cmd_sender.ahk +1 -1
  6. data/autohotkey/tools/cmd_sequence.ahk +1 -1
  7. data/autohotkey/tools/data_viewer.ahk +1 -1
  8. data/autohotkey/tools/limits_monitor.ahk +1 -1
  9. data/autohotkey/tools/packet_viewer.ahk +1 -1
  10. data/autohotkey/tools/script_runner.ahk +1 -1
  11. data/autohotkey/tools/test_runner2.ahk +1 -1
  12. data/autohotkey/tools/tlm_grapher.ahk +1 -1
  13. data/autohotkey/tools/tlm_grapher3.ahk +1 -1
  14. data/autohotkey/tools/tlm_viewer.ahk +1 -1
  15. data/autohotkey/tools/tlm_viewer2.ahk +1 -1
  16. data/autohotkey/tools/tlm_viewer5.ahk +1 -1
  17. data/bin/xtce_converter +1 -1
  18. data/data/crc.txt +403 -403
  19. data/demo/Rakefile +4 -4
  20. data/demo/config/data/crc.txt +210 -210
  21. data/ext/cosmos/ext/buffered_file/buffered_file.c +2 -2
  22. data/ext/cosmos/ext/config_parser/config_parser.c +1 -2
  23. data/ext/cosmos/ext/line_graph/line_graph.c +53 -94
  24. data/ext/cosmos/ext/platform/platform.c +56 -21
  25. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +4 -8
  26. data/ext/cosmos/ext/structure/structure.c +12 -0
  27. data/install/Rakefile +4 -4
  28. data/install/config/data/crc.txt +129 -129
  29. data/lib/cosmos/config/config_parser.rb +2 -10
  30. data/lib/cosmos/core_ext/class.rb +10 -0
  31. data/lib/cosmos/core_ext/time.rb +2 -2
  32. data/lib/cosmos/dart/lib/dart_common.rb +3 -3
  33. data/lib/cosmos/dart/spec/dart/dart_database_cleaner_spec.rb +2 -2
  34. data/lib/cosmos/gui/qt.rb +10 -10
  35. data/lib/cosmos/gui/qt_tool.rb +7 -0
  36. data/lib/cosmos/gui/text/completion_text_edit.rb +2 -0
  37. data/lib/cosmos/interfaces/tcpip_server_interface.rb +3 -3
  38. data/lib/cosmos/io/io_multiplexer.rb +6 -2
  39. data/lib/cosmos/io/json_drb.rb +1 -1
  40. data/lib/cosmos/packets/packet.rb +8 -8
  41. data/lib/cosmos/packets/packet_config.rb +1 -1
  42. data/lib/cosmos/packets/parsers/xtce_converter.rb +10 -10
  43. data/lib/cosmos/packets/parsers/xtce_parser.rb +3 -0
  44. data/lib/cosmos/packets/structure.rb +16 -12
  45. data/lib/cosmos/script/api_shared.rb +10 -0
  46. data/lib/cosmos/script/script.rb +2 -2
  47. data/lib/cosmos/tools/cmd_tlm_server/api.rb +10 -8
  48. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +1 -1
  49. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +29 -26
  50. data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +1 -1
  51. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +5 -2
  52. data/lib/cosmos/tools/test_runner/test.rb +1 -1
  53. data/lib/cosmos/tools/test_runner/test_runner.rb +4 -4
  54. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +3 -3
  55. data/lib/cosmos/tools/tlm_viewer/widgets/canvasdot_widget.rb +2 -0
  56. data/lib/cosmos/top_level.rb +1 -1
  57. data/lib/cosmos/utilities/simulated_target.rb +1 -1
  58. data/lib/cosmos/version.rb +4 -4
  59. data/spec/core_ext/class_spec.rb +54 -0
  60. data/spec/interfaces/serial_interface_spec.rb +1 -5
  61. data/spec/packet_logs/packet_log_reader_spec.rb +1 -1
  62. data/spec/system/system_spec.rb +1 -1
  63. data/spec/tools/cmd_tlm_server/api_spec.rb +12 -12
  64. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +2 -2
  65. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +4 -3
  66. data/spec/utilities/logger_spec.rb +3 -3
  67. data/test/performance/Rakefile +4 -4
  68. data/test/performance/config/data/crc.txt +67 -48
  69. metadata +2 -2
@@ -196,7 +196,7 @@ module Cosmos
196
196
  # TODO: Handle nonunique item names
197
197
  if item.array_size
198
198
  # Requiring parameterRef for argument arrays appears to be a defect in the schema
199
- xml['xtce'].send("Array#{type}RefEntry".intern, :parameterRef => item.name) do
199
+ xml['xtce'].public_send("Array#{type}RefEntry".intern, :parameterRef => item.name) do
200
200
  set_fixed_value(xml, item) if !packed
201
201
  xml['xtce'].DimensionList do
202
202
  xml['xtce'].Dimension do
@@ -211,9 +211,9 @@ module Cosmos
211
211
  end
212
212
  else
213
213
  if packed
214
- xml['xtce'].send("#{type}RefEntry".intern, "#{type.downcase}Ref".intern => item.name)
214
+ xml['xtce'].public_send("#{type}RefEntry".intern, "#{type.downcase}Ref".intern => item.name)
215
215
  else
216
- xml['xtce'].send("#{type}RefEntry".intern, "#{type.downcase}Ref".intern => item.name) do
216
+ xml['xtce'].public_send("#{type}RefEntry".intern, "#{type.downcase}Ref".intern => item.name) do
217
217
  set_fixed_value(xml, item)
218
218
  end
219
219
  end
@@ -256,7 +256,7 @@ module Cosmos
256
256
  attrs[:shortDescription] = item.description if item.description
257
257
  attrs[:arrayTypeRef] = (item.name + '_Type')
258
258
  attrs[:numberOfDimensions] = '1' # COSMOS Only supports one-dimensional arrays
259
- xml['xtce'].send('Array' + param_or_arg + 'Type', attrs)
259
+ xml['xtce'].public_send('Array' + param_or_arg + 'Type', attrs)
260
260
  end
261
261
  end
262
262
 
@@ -289,7 +289,7 @@ module Cosmos
289
289
  encoding = 'unsigned'
290
290
  end
291
291
  if item.states
292
- xml['xtce'].send('Enumerated' + param_or_arg + 'Type', attrs) do
292
+ xml['xtce'].public_send('Enumerated' + param_or_arg + 'Type', attrs) do
293
293
  to_xtce_endianness(item, xml)
294
294
  to_xtce_units(item, xml)
295
295
  xml['xtce'].IntegerDataEncoding(:sizeInBits => item.bit_size, :encoding => encoding)
@@ -308,7 +308,7 @@ module Cosmos
308
308
  type_string = 'Integer' + param_or_arg + 'Type'
309
309
  attrs[:signed] = signed
310
310
  end
311
- xml['xtce'].send(type_string, attrs) do
311
+ xml['xtce'].public_send(type_string, attrs) do
312
312
  to_xtce_endianness(item, xml)
313
313
  to_xtce_units(item, xml)
314
314
  if (item.read_conversion and item.read_conversion.class == PolynomialConversion) or (item.write_conversion and item.write_conversion.class == PolynomialConversion)
@@ -330,7 +330,7 @@ module Cosmos
330
330
  attrs = { :name => (item.name + '_Type'), :sizeInBits => item.bit_size }
331
331
  attrs[:initialValue] = item.default if item.default and !item.array_size
332
332
  attrs[:shortDescription] = item.description if item.description
333
- xml['xtce'].send('Float' + param_or_arg + 'Type', attrs) do
333
+ xml['xtce'].public_send('Float' + param_or_arg + 'Type', attrs) do
334
334
  to_xtce_endianness(item, xml)
335
335
  to_xtce_units(item, xml)
336
336
  if (item.read_conversion and item.read_conversion.class == PolynomialConversion) or (item.write_conversion and item.write_conversion.class == PolynomialConversion)
@@ -359,7 +359,7 @@ module Cosmos
359
359
  end
360
360
  end
361
361
  attrs[:shortDescription] = item.description if item.description
362
- xml['xtce'].send(string_or_binary + param_or_arg + 'Type', attrs) do
362
+ xml['xtce'].public_send(string_or_binary + param_or_arg + 'Type', attrs) do
363
363
  # Don't call to_xtce_endianness for Strings or Blocks
364
364
  to_xtce_units(item, xml)
365
365
  if string_or_binary == 'String'
@@ -382,9 +382,9 @@ module Cosmos
382
382
 
383
383
  def to_xtce_item(item, param_or_arg, xml)
384
384
  if item.array_size
385
- xml['xtce'].send(param_or_arg, :name => item.name, "#{param_or_arg.downcase}TypeRef" => item.name + '_ArrayType')
385
+ xml['xtce'].public_send(param_or_arg, :name => item.name, "#{param_or_arg.downcase}TypeRef" => item.name + '_ArrayType')
386
386
  else
387
- xml['xtce'].send(param_or_arg, :name => item.name, "#{param_or_arg.downcase}TypeRef" => item.name + '_Type')
387
+ xml['xtce'].public_send(param_or_arg, :name => item.name, "#{param_or_arg.downcase}TypeRef" => item.name + '_Type')
388
388
  end
389
389
  end
390
390
 
@@ -59,6 +59,9 @@ module Cosmos
59
59
  end
60
60
 
61
61
  def parse(filename, target_name)
62
+ # Fortify complains about Path Manipulation here
63
+ # We have previously validated the file is a .xtce file in packet_config
64
+ # The file is opened read-only and then immediately parsed by Nokogiri
62
65
  doc = File.open(filename) { |f| Nokogiri::XML(f, nil, nil, Nokogiri::XML::ParseOptions::STRICT | Nokogiri::XML::ParseOptions::NOBLANKS) }
63
66
  # Determine the @current_target_name
64
67
  xtce_process_element(doc.root)
@@ -462,21 +462,14 @@ module Cosmos
462
462
  extend(MethodMissing)
463
463
  end
464
464
 
465
- protected
466
-
467
- MUTEX = Mutex.new
468
-
469
- def setup_mutex
470
- return if @mutex
471
- MUTEX.synchronize do
472
- @mutex ||= Mutex.new
473
- end
474
- end
475
-
476
465
  # Take the structure mutex to ensure the buffer does not change while you perform activities
477
466
  def synchronize
478
467
  setup_mutex()
479
- @mutex.synchronize {|| yield}
468
+ if @mutex.owned?
469
+ yield
470
+ else
471
+ @mutex.synchronize {|| yield}
472
+ end
480
473
  end
481
474
 
482
475
  # Take the structure mutex to ensure the buffer does not change while you perform activities
@@ -509,6 +502,17 @@ module Cosmos
509
502
  end
510
503
  end
511
504
 
505
+ protected
506
+
507
+ MUTEX = Mutex.new
508
+
509
+ def setup_mutex
510
+ return if @mutex
511
+ MUTEX.synchronize do
512
+ @mutex ||= Mutex.new
513
+ end
514
+ end
515
+
512
516
  module MethodMissing
513
517
  # Method missing provides reading/writing item values as if they were methods to the class
514
518
  def method_missing(name, value = nil)
@@ -832,6 +832,8 @@ module Cosmos
832
832
  while true
833
833
  work_start = Time.now.sys
834
834
  value = tlm_variable(target_name, packet_name, item_name, value_type)
835
+ # Fortify: Dynamic Code Evaluation: Code Injection
836
+ # TODO: Is there anyway to sanitize the exp_to_eval?
835
837
  if eval(exp_to_eval)
836
838
  return true, value
837
839
  end
@@ -846,6 +848,8 @@ module Cosmos
846
848
 
847
849
  if canceled
848
850
  value = tlm_variable(target_name, packet_name, item_name, value_type)
851
+ # Fortify: Dynamic Code Evaluation: Code Injection
852
+ # TODO: Is there anyway to sanitize the exp_to_eval?
849
853
  if eval(exp_to_eval)
850
854
  return true, value
851
855
  else
@@ -886,6 +890,8 @@ module Cosmos
886
890
 
887
891
  while true
888
892
  work_start = Time.now.sys
893
+ # Fortify: Dynamic Code Evaluation: Code Injection
894
+ # TODO: Is there anyway to sanitize the exp_to_eval?
889
895
  if eval(exp_to_eval, context)
890
896
  return true
891
897
  end
@@ -899,6 +905,8 @@ module Cosmos
899
905
  canceled = cosmos_script_sleep(sleep_time)
900
906
 
901
907
  if canceled
908
+ # Fortify: Dynamic Code Evaluation: Code Injection
909
+ # TODO: Is there anyway to sanitize the exp_to_eval?
902
910
  if eval(exp_to_eval, context)
903
911
  return true
904
912
  else
@@ -914,6 +922,8 @@ module Cosmos
914
922
  string = "value " + comparison_to_eval
915
923
  check_str = "CHECK: #{_upcase(target_name, packet_name, item_name)} #{comparison_to_eval}"
916
924
  value_str = "with value == #{value}"
925
+ # Fortify: Dynamic Code Evaluation: Code Injection
926
+ # TODO: Is there anyway to sanitize the comparison_to_eval?
917
927
  if eval(string)
918
928
  Logger.info "#{check_str} success #{value_str}"
919
929
  else
@@ -62,7 +62,7 @@ module Cosmos
62
62
  @cmd_tlm_server.disconnect
63
63
  else
64
64
  if $disconnect_all_targets
65
- return @disconnected.send(method_name, *method_params)
65
+ return @disconnected.public_send(method_name, *method_params)
66
66
  elsif $disconnected_targets
67
67
  name_string = nil
68
68
  if method_params[0].is_a?(String)
@@ -79,7 +79,7 @@ module Cosmos
79
79
  if name_string
80
80
  target = name_string.split(" ")[0]
81
81
  if $disconnected_targets.include?(target)
82
- return @disconnected.send(method_name, *method_params)
82
+ return @disconnected.public_send(method_name, *method_params)
83
83
  end
84
84
  end
85
85
  end
@@ -591,14 +591,16 @@ module Cosmos
591
591
  end
592
592
 
593
593
  # Update current value table
594
- cvt_packet.buffer = packet.buffer(false)
595
- cvt_packet.received_time = received_time
596
-
597
- # The interface does the following line, but I don't think inject_tlm should because it could confuse the interface
598
- target.tlm_cnt += 1
599
- packet.received_count += 1
600
- cvt_packet.received_count += 1
601
- CmdTlmServer.instance.identified_packet_callback(packet)
594
+ cvt_packet.synchronize do
595
+ cvt_packet.buffer = packet.buffer(false)
596
+ cvt_packet.received_time = received_time
597
+
598
+ # The interface does the following line, but I don't think inject_tlm should because it could confuse the interface
599
+ target.tlm_cnt += 1
600
+ packet.received_count += 1
601
+ cvt_packet.received_count += 1
602
+ CmdTlmServer.instance.identified_packet_callback(cvt_packet)
603
+ end
602
604
 
603
605
  # Find the interface for this target
604
606
  interface = target.interface
@@ -96,7 +96,7 @@ module Cosmos
96
96
  button_layout.addWidget(button, location[0], location[1])
97
97
  button.connect(SIGNAL('clicked()')) do
98
98
  begin
99
- CmdTlmServer.instance.send(method, 'ALL')
99
+ CmdTlmServer.instance.public_send(method, 'ALL')
100
100
  rescue Exception => error
101
101
  statusBar.showMessage(error.message)
102
102
  end
@@ -148,51 +148,54 @@ module Cosmos
148
148
  if packet.identified?
149
149
  begin
150
150
  # Preidentifed packet - place it into the current value table
151
- identified_packet = System.telemetry.update!(packet.target_name,
152
- packet.packet_name,
153
- packet.buffer)
151
+ identified_packet = System.telemetry.packet(packet.target_name, packet.packet_name)
154
152
  rescue RuntimeError
155
153
  # Packet identified but we don't know about it
156
154
  # Clear packet_name and target_name and try to identify
157
155
  Logger.warn "Received unknown identified telemetry: #{packet.target_name} #{packet.packet_name}"
158
156
  packet.target_name = nil
159
157
  packet.packet_name = nil
160
- identified_packet = System.telemetry.identify!(packet.buffer,
161
- @interface.target_names)
158
+ identified_packet = System.telemetry.identify(packet.buffer, @interface.target_names)
162
159
  end
163
160
  else
164
161
  # Packet needs to be identified
165
- identified_packet = System.telemetry.identify!(packet.buffer,
166
- @interface.target_names)
162
+ identified_packet = System.telemetry.identify(packet.buffer, @interface.target_names)
167
163
  end
168
164
  end
169
165
 
170
- if identified_packet
166
+ unknown = false
167
+ unless identified_packet
168
+ unknown = true
169
+ identified_packet = System.telemetry.packet('UNKNOWN', 'UNKNOWN')
170
+ end
171
+
172
+ identified_packet.synchronize do
173
+ identified_packet.buffer = packet.buffer unless packet.stored
171
174
  identified_packet.received_time = packet.received_time
172
175
  identified_packet.stored = packet.stored
173
176
  identified_packet.extra = packet.extra
174
177
  packet = identified_packet
175
- else
176
- unknown_packet = System.telemetry.update!('UNKNOWN', 'UNKNOWN', packet.buffer)
177
- unknown_packet.received_time = packet.received_time
178
- unknown_packet.stored = packet.stored
179
- unknown_packet.extra = packet.extra
180
- packet = unknown_packet
181
- data_length = packet.length
182
- string = "#{@interface.name} - Unknown #{data_length} byte packet starting: "
183
- num_bytes_to_print = [UNKNOWN_BYTES_TO_PRINT, data_length].min
184
- data_to_print = packet.buffer(false)[0..(num_bytes_to_print - 1)]
185
- data_to_print.each_byte do |byte|
186
- string << sprintf("%02X", byte)
178
+
179
+ if unknown
180
+ data_length = packet.length
181
+ string = "#{@interface.name} - Unknown #{data_length} byte packet starting: "
182
+ num_bytes_to_print = [UNKNOWN_BYTES_TO_PRINT, data_length].min
183
+ data_to_print = packet.buffer(false)[0..(num_bytes_to_print - 1)]
184
+ data_to_print.each_byte do |byte|
185
+ string << sprintf("%02X", byte)
186
+ end
187
+ Logger.error string
187
188
  end
188
- Logger.error string
189
- end
190
189
 
191
- target = System.targets[packet.target_name]
192
- target.tlm_cnt += 1 if target
193
- packet.received_count += 1
194
- @identified_packet_callback.call(packet) if @identified_packet_callback
190
+ target = System.targets[packet.target_name]
191
+ target.tlm_cnt += 1 if target
192
+ packet.received_count += 1
193
+ @identified_packet_callback.call(packet) if @identified_packet_callback
195
194
 
195
+ # So we can release the mutex
196
+ packet = packet.clone
197
+ end
198
+
196
199
  # Write to routers
197
200
  @interface.routers.each do |router|
198
201
  begin
@@ -86,7 +86,7 @@ module Cosmos
86
86
  return if @sleeper.sleep(@initial_delay)
87
87
  loop do
88
88
  start = Time.now
89
- check_methods.each {|method| self.send(method.intern) }
89
+ check_methods.each {|method| self.public_send(method.intern) }
90
90
  now = Time.now
91
91
  @status = "#{now.formatted}: Checking groups took #{now - start}s"
92
92
  sleep_time = @task_delay - (now - start)
@@ -973,8 +973,10 @@ module Cosmos
973
973
  if debug_text =~ /^@\S+$/ || @script_binding.local_variables.include?(debug_text.to_sym)
974
974
  debug_text = "puts #{debug_text}" # Automatically add puts to print it
975
975
  end
976
+ # Fortify: Dynamic Code Evaluation: Code Injection
976
977
  eval(debug_text, @script_binding, 'debug', 1)
977
978
  else
979
+ # Fortify: Dynamic Code Evaluation: Code Injection
978
980
  Object.class_eval(debug_text, 'debug', 1)
979
981
  end
980
982
  handle_output_io()
@@ -1489,7 +1491,7 @@ module Cosmos
1489
1491
  @@output_thread = nil
1490
1492
  end
1491
1493
 
1492
- @script.setReadOnly(false)
1494
+ @script.setReadOnly(false) unless @script.read_only
1493
1495
  @script.stop_highlight unless uncaught_exception
1494
1496
  select_tab_and_destroy_tabs_after_index(0)
1495
1497
  remove_tabs()
@@ -1722,7 +1724,8 @@ module Cosmos
1722
1724
  @active_script.setPlainText(data)
1723
1725
  end
1724
1726
  mark_breakpoints(filename)
1725
-
1727
+ @active_script.read_only = !File.writable?(filename)
1728
+ @active_script.setReadOnly(@active_script.read_only)
1726
1729
  @active_script.stop_highlight
1727
1730
  end
1728
1731
 
@@ -176,7 +176,7 @@ module Cosmos
176
176
  end
177
177
  end
178
178
 
179
- object.send(method_name)
179
+ object.public_send(method_name)
180
180
  result.result = :PASS
181
181
 
182
182
  if defined? ScriptRunnerFrame
@@ -865,13 +865,13 @@ module Cosmos
865
865
  suite = CustomTestSuite.new
866
866
  begin
867
867
  # Remove any previously defined suite setup methods
868
- CustomTestSuite.send(:remove_method, :setup)
868
+ CustomTestSuite.public_send(:remove_method, :setup)
869
869
  rescue NameError
870
870
  # NameError is raised if no setup method was defined
871
871
  end
872
872
  begin
873
873
  # Remove any previously defined suite teardown methods
874
- CustomTestSuite.send(:remove_method, :teardown)
874
+ CustomTestSuite.public_send(:remove_method, :teardown)
875
875
  rescue NameError
876
876
  # NameError is raised if no teardown method was defined
877
877
  end
@@ -884,7 +884,7 @@ module Cosmos
884
884
  inst = @@test_suites.detect {|my_suite| my_suite.class.to_s == suite_node.text}
885
885
  # Create a lambda which will call that one setup method
886
886
  body = lambda { inst.setup }
887
- CustomTestSuite.send(:define_method, :setup, &body)
887
+ CustomTestSuite.public_send(:define_method, :setup, &body)
888
888
  end
889
889
  if test_node.text == 'teardown'
890
890
  cur_suite.teardown = true
@@ -892,7 +892,7 @@ module Cosmos
892
892
  inst = @@test_suites.detect {|my_suite| my_suite.class.to_s == suite_node.text}
893
893
  # Create a lambda which will call that one teardown method
894
894
  body = lambda { inst.teardown}
895
- CustomTestSuite.send(:define_method, :teardown, &body)
895
+ CustomTestSuite.public_send(:define_method, :teardown, &body)
896
896
  end
897
897
  end
898
898
 
@@ -455,7 +455,7 @@ module Cosmos
455
455
  def self.post_options_parsed_hook(options)
456
456
  if options.input_files or options.dart
457
457
  normalize_config_options(options)
458
-
458
+
459
459
  # Process config file
460
460
  raise "Configuration File must be specified for command line processing" unless options.config_file
461
461
 
@@ -675,7 +675,7 @@ module Cosmos
675
675
  process_args = [batch_name, @input_filenames, @log_dir, output_extension, @batch_filenames, @packet_log_frame.time_start, @packet_log_frame.time_end]
676
676
  end
677
677
 
678
- @tlm_extractor_processor.send(process_method, *process_args) do |input_file_index, packet_count, file_progress|
678
+ @tlm_extractor_processor.public_send(process_method, *process_args) do |input_file_index, packet_count, file_progress|
679
679
  # Handle Cancel
680
680
  break if @cancel
681
681
 
@@ -760,7 +760,7 @@ module Cosmos
760
760
  process_args = [batch_name, @log_dir, output_extension, @batch_filenames, @packet_log_frame.time_start, @packet_log_frame.time_end, @dart_meta_frame.meta_filters]
761
761
  end
762
762
 
763
- @tlm_extractor_processor.send(process_method, *process_args) do |percentage, message|
763
+ @tlm_extractor_processor.public_send(process_method, *process_args) do |percentage, message|
764
764
  # Handle Cancel
765
765
  break if @cancel
766
766
  progress_dialog.append_text(message)
@@ -61,6 +61,8 @@ module Cosmos
61
61
  end
62
62
 
63
63
  def eval_str(string_to_eval)
64
+ # Fortify: Dynamic Code Evaluation: Code Injection
65
+ # TODO: Not sure how to sanitize this string
64
66
  @screen.instance_eval(string_to_eval)
65
67
  end
66
68
 
@@ -397,7 +397,7 @@ module Cosmos
397
397
  # @param hashing_algorithm [String] Hashing algorithm to use
398
398
  # @return [Digest::<algorithm>] The hashing sum object
399
399
  def self.hash_files(filenames, additional_data = nil, hashing_algorithm = 'MD5')
400
- digest = Digest.const_get(hashing_algorithm).send('new')
400
+ digest = Digest.const_get(hashing_algorithm).public_send('new')
401
401
 
402
402
  Cosmos.set_working_dir do
403
403
  filenames.each do |filename|
@@ -37,7 +37,7 @@ module Cosmos
37
37
  @tlm_packets.each do |name, packet|
38
38
  ids = packet.id_items
39
39
  ids.each do |id|
40
- packet.send((id.name + '=').to_sym, id.id_value)
40
+ packet.public_send((id.name + '=').to_sym, id.id_value)
41
41
  end
42
42
  end
43
43
 
@@ -1,12 +1,12 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- COSMOS_VERSION = '4.5.0'
3
+ COSMOS_VERSION = '4.5.1'
4
4
  module Cosmos
5
5
  module Version
6
6
  MAJOR = '4'
7
7
  MINOR = '5'
8
- PATCH = '0'
9
- BUILD = '627198e20200543f157cc4c2ffde5d7df5180ae2'
8
+ PATCH = '1'
9
+ BUILD = 'cb4647f6e93fcfb1dd38500288ecf5e1a6f79c76'
10
10
  end
11
- VERSION = '4.5.0'
11
+ VERSION = '4.5.1'
12
12
  end
@@ -31,6 +31,60 @@ describe Class do
31
31
  my = MyClass.new
32
32
  expect(MyClass.test).to eql "Test"
33
33
  expect(my.test).to eql "Test"
34
+ # No accessor methods are created
35
+ expect { my.test = "Blah" }.to raise_error(NoMethodError)
36
+ end
37
+
38
+ it "does not allow arbitrary code" do
39
+ expect {
40
+ class MyClass
41
+ instance_attr_reader "test;puts 'HI'"
42
+ end
43
+ }.to raise_error(ArgumentError)
44
+
45
+ expect {
46
+ class MyClass
47
+ instance_attr_reader "test\nputs 'HI'"
48
+ end
49
+ }.to raise_error(ArgumentError)
50
+ end
51
+ end
52
+
53
+ describe "instance_attr_accessor" do
54
+ it "adds instance attribute readers for class variables" do
55
+ class MyClass
56
+ instance_attr_accessor :test
57
+ @@instance = nil
58
+ def self.instance
59
+ @@instance ||= self.new
60
+ return @@instance
61
+ end
62
+ def initialize
63
+ @test = "Test"
64
+ @@instance = self
65
+ end
66
+ end
67
+
68
+ my = MyClass.new
69
+ expect(MyClass.test).to eql "Test"
70
+ expect(my.test).to eql "Test"
71
+ my.test = "Blah"
72
+ expect(MyClass.test).to eql "Blah"
73
+ expect(my.test).to eql "Blah"
74
+ end
75
+
76
+ it "does not allow arbitrary code" do
77
+ expect {
78
+ class MyClass
79
+ instance_attr_accessor "test;puts 'HI'"
80
+ end
81
+ }.to raise_error(ArgumentError)
82
+
83
+ expect {
84
+ class MyClass
85
+ instance_attr_accessor "test\nputs 'HI'"
86
+ end
87
+ }.to raise_error(ArgumentError)
34
88
  end
35
89
  end
36
90
  end
@@ -9,14 +9,11 @@
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
11
  if RUBY_ENGINE == 'ruby' or Gem.win_platform?
12
-
13
12
  require 'spec_helper'
14
13
  require 'cosmos/interfaces/serial_interface'
15
14
 
16
15
  module Cosmos
17
-
18
- describe SerialInterface do
19
-
16
+ describe SerialInterface, :if => `change port /query 2>&1` !~ /No serial ports/ do
20
17
  describe "initialize" do
21
18
  it "initializes the instance variables" do
22
19
  i = SerialInterface.new('COM1','COM1','9600','NONE','1','0','0','burst')
@@ -66,5 +63,4 @@ if RUBY_ENGINE == 'ruby' or Gem.win_platform?
66
63
  end
67
64
  end
68
65
  end
69
-
70
66
  end
@@ -206,7 +206,7 @@ module Cosmos
206
206
  end
207
207
 
208
208
  # Corrupt the second config
209
- second_config_path = System.instance.send(:find_configuration, second_config_name)
209
+ second_config_path = System.instance.public_send(:find_configuration, second_config_name)
210
210
  md5 = File.basename(second_config_path, '.*')
211
211
  Zip::File.open(second_config_path) do |zip|
212
212
  zip.file.rename(File.join(md5, 'system.txt'), File.join(md5, 'system2.txt'))
@@ -359,7 +359,7 @@ module Cosmos
359
359
  expect(System.telemetry.packets('SYSTEM').keys).not_to include "TEST2"
360
360
 
361
361
  # Now remove system.txt from the third configuration and try to load it again to cause an error
362
- #third_config_path = System.instance.send(:find_configuration, third_config_name)
362
+ #third_config_path = System.instance.public_send(:find_configuration, third_config_name)
363
363
  #FileUtils.mv File.join(third_config_path, 'system.txt'), File.join(third_config_path, 'system2.txt')
364
364
  #result, err = System.load_configuration(third_config_name)
365
365
  #expect(result).to eql original_config_name
@@ -102,12 +102,12 @@ DOC
102
102
  end
103
103
 
104
104
  def test_cmd_unknown(method)
105
- expect { @api.send(method,"BLAH COLLECT with TYPE NORMAL") }.to raise_error(/does not exist/)
106
- expect { @api.send(method,"INST UNKNOWN with TYPE NORMAL") }.to raise_error(/does not exist/)
107
- expect { @api.send(method,"INST COLLECT with BLAH NORMAL") }.to raise_error(/does not exist/)
108
- expect { @api.send(method,"BLAH","COLLECT","TYPE"=>"NORMAL") }.to raise_error(/does not exist/)
109
- expect { @api.send(method,"INST","UNKNOWN","TYPE"=>"NORMAL") }.to raise_error(/does not exist/)
110
- expect { @api.send(method,"INST","COLLECT","BLAH"=>"NORMAL") }.to raise_error(/does not exist/)
105
+ expect { @api.public_send(method,"BLAH COLLECT with TYPE NORMAL") }.to raise_error(/does not exist/)
106
+ expect { @api.public_send(method,"INST UNKNOWN with TYPE NORMAL") }.to raise_error(/does not exist/)
107
+ expect { @api.public_send(method,"INST COLLECT with BLAH NORMAL") }.to raise_error(/does not exist/)
108
+ expect { @api.public_send(method,"BLAH","COLLECT","TYPE"=>"NORMAL") }.to raise_error(/does not exist/)
109
+ expect { @api.public_send(method,"INST","UNKNOWN","TYPE"=>"NORMAL") }.to raise_error(/does not exist/)
110
+ expect { @api.public_send(method,"INST","COLLECT","BLAH"=>"NORMAL") }.to raise_error(/does not exist/)
111
111
  end
112
112
 
113
113
  describe "cmd" do
@@ -571,12 +571,12 @@ DOC
571
571
  end
572
572
 
573
573
  def test_tlm_unknown(method)
574
- expect { @api.send(method,"BLAH HEALTH_STATUS COLLECTS") }.to raise_error(/does not exist/)
575
- expect { @api.send(method,"INST UNKNOWN COLLECTS") }.to raise_error(/does not exist/)
576
- expect { @api.send(method,"INST HEALTH_STATUS BLAH") }.to raise_error(/does not exist/)
577
- expect { @api.send(method,"BLAH","HEALTH_STATUS","COLLECTS") }.to raise_error(/does not exist/)
578
- expect { @api.send(method,"INST","UNKNOWN","COLLECTS") }.to raise_error(/does not exist/)
579
- expect { @api.send(method,"INST","HEALTH_STATUS","BLAH") }.to raise_error(/does not exist/)
574
+ expect { @api.public_send(method,"BLAH HEALTH_STATUS COLLECTS") }.to raise_error(/does not exist/)
575
+ expect { @api.public_send(method,"INST UNKNOWN COLLECTS") }.to raise_error(/does not exist/)
576
+ expect { @api.public_send(method,"INST HEALTH_STATUS BLAH") }.to raise_error(/does not exist/)
577
+ expect { @api.public_send(method,"BLAH","HEALTH_STATUS","COLLECTS") }.to raise_error(/does not exist/)
578
+ expect { @api.public_send(method,"INST","UNKNOWN","COLLECTS") }.to raise_error(/does not exist/)
579
+ expect { @api.public_send(method,"INST","HEALTH_STATUS","BLAH") }.to raise_error(/does not exist/)
580
580
  end
581
581
 
582
582
  describe "tlm" do
@@ -165,7 +165,7 @@ module Cosmos
165
165
  expect(running_threads.length).to eql(2)
166
166
  expect(bt.instance_variable_get("@threads").length).to eq 1
167
167
  expect(bt.instance_variable_get("@threads")[0].alive?).to eq true
168
- sleep 1.1 # Allow the thread to crash
168
+ sleep 2 # Allow the thread to crash
169
169
  expect(running_threads.length).to eql(1)
170
170
  expect(bt.instance_variable_get("@threads")[0]).to be_nil
171
171
  expect(stdout.string).to match("unexpectedly died")
@@ -178,7 +178,7 @@ module Cosmos
178
178
  expect(running_threads.length).to eql(2)
179
179
  expect(bt.instance_variable_get("@threads").length).to eq 1
180
180
  expect(bt.instance_variable_get("@threads")[0].alive?).to eq true
181
- sleep 1.1 # Allow the thread to crash
181
+ sleep 2 # Allow the thread to crash
182
182
  expect(running_threads.length).to eql(1)
183
183
  expect(bt.instance_variable_get("@threads")[0]).to be_nil
184
184
  expect(stdout.string).to match("unexpectedly died")