troubadix 25.7.2__tar.gz → 25.7.3__tar.gz

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 (243) hide show
  1. {troubadix-25.7.2 → troubadix-25.7.3}/PKG-INFO +1 -1
  2. {troubadix-25.7.2 → troubadix-25.7.3}/pyproject.toml +1 -1
  3. troubadix-25.7.3/tests/helper/test_if_block_parser.py +251 -0
  4. troubadix-25.7.3/tests/plugins/test_if_statement_syntax.py +166 -0
  5. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_using_display.py +0 -15
  6. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/__version__.py +1 -1
  7. troubadix-25.7.3/troubadix/helper/if_block_parser.py +250 -0
  8. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/__init__.py +2 -0
  9. troubadix-25.7.3/troubadix/plugins/if_statement_syntax.py +41 -0
  10. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/using_display.py +6 -13
  11. troubadix-25.7.2/tests/helper/test_if_block_parser.py +0 -216
  12. troubadix-25.7.2/troubadix/helper/if_block_parser.py +0 -200
  13. {troubadix-25.7.2 → troubadix-25.7.3}/LICENSE +0 -0
  14. {troubadix-25.7.2 → troubadix-25.7.3}/README.md +0 -0
  15. {troubadix-25.7.2 → troubadix-25.7.3}/tests/__init__.py +0 -0
  16. {troubadix-25.7.2 → troubadix-25.7.3}/tests/helper/__init__.py +0 -0
  17. {troubadix-25.7.2 → troubadix-25.7.3}/tests/helper/test_date_format.py +0 -0
  18. {troubadix-25.7.2 → troubadix-25.7.3}/tests/helper/test_linguistic_exception_handler.py +0 -0
  19. {troubadix-25.7.2 → troubadix-25.7.3}/tests/helper/test_patterns.py +0 -0
  20. {troubadix-25.7.2 → troubadix-25.7.3}/tests/helper/test_remove_comments.py +0 -0
  21. {troubadix-25.7.2 → troubadix-25.7.3}/tests/helper/test_text_utils.py +0 -0
  22. {troubadix-25.7.2 → troubadix-25.7.3}/tests/manual_tests/comment_removal_diff.py +0 -0
  23. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/__init__.py +0 -0
  24. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/fail.nasl +0 -0
  25. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/fail2.nasl +0 -0
  26. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test.nasl +0 -0
  27. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_badwords.py +0 -0
  28. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_copyright_text.py +0 -0
  29. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_copyright_year.py +0 -0
  30. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_creation_date.py +0 -0
  31. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_cve_format.py +0 -0
  32. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_cvss_format.py +0 -0
  33. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_dependencies.py +0 -0
  34. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_dependency_category_order.py +0 -0
  35. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_deprecated_dependency.py +0 -0
  36. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_deprecated_functions.py +0 -0
  37. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_double_end_points.py +0 -0
  38. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_duplicate_oid.py +0 -0
  39. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_duplicated_script_tags.py +0 -0
  40. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_encoding.py +0 -0
  41. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/fail_bad_new_line.nasl +0 -0
  42. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/fail_badwords.nasl +0 -0
  43. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/fail_name_and_copyright_newline.nasl +0 -0
  44. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/fail_name_newline.nasl +0 -0
  45. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/fail_permissions.nasl +0 -0
  46. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/fail_spelling.nasl +0 -0
  47. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/nasl/21.04/fail.nasl +0 -0
  48. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/nasl/21.04/fail_badwords.nasl +0 -0
  49. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/nasl/21.04/fail_name_and_copyright_newline.nasl +0 -0
  50. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/nasl/21.04/fail_name_newline.nasl +0 -0
  51. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/nasl/21.04/fail_solution_template.nasl +0 -0
  52. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/nasl/21.04/runner/fail.nasl +0 -0
  53. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/nasl/21.04/runner/fail2.nasl +0 -0
  54. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/nasl/21.04/runner/test.nasl +0 -0
  55. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/nasl/21.04/runner/test_valid_oid.nasl +0 -0
  56. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/nasl/21.04/test.inc +0 -0
  57. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/nasl/21.04/test.nasl +0 -0
  58. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/nasl/warning.nasl +0 -0
  59. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/ok_permissions.nasl +0 -0
  60. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_files/test_oid.nasl +0 -0
  61. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_forking_nasl_functions.py +0 -0
  62. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_get_kb_on_services.py +0 -0
  63. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_grammar.py +0 -0
  64. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_http_links_in_tags.py +0 -0
  65. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_illegal_characters.py +0 -0
  66. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_log_messages.py +0 -0
  67. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_malformed_dependencies.py +0 -0
  68. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_misplaced_compare_in_if.py +0 -0
  69. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_missing_desc_exit.py +0 -0
  70. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_missing_tag_solution.py +0 -0
  71. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_multiple_re_parameters.py +0 -0
  72. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_newlines.py +0 -0
  73. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_overlong_description_lines.py +0 -0
  74. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_overlong_script_tags.py +0 -0
  75. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_prod_svc_detect_in_vulnvt.py +0 -0
  76. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_qod.py +0 -0
  77. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_reporting_consistency.py +0 -0
  78. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_script_add_preference_type.py +0 -0
  79. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_script_calls_empty_values.py +0 -0
  80. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_script_calls_recommended.py +0 -0
  81. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_script_category.py +0 -0
  82. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_script_copyright.py +0 -0
  83. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_script_family.py +0 -0
  84. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_script_tag_form.py +0 -0
  85. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_script_tag_whitespaces.py +0 -0
  86. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_script_tags_mandatory.py +0 -0
  87. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_script_version_and_last_modification_tags.py +0 -0
  88. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_script_xref_form.py +0 -0
  89. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_script_xref_url.py +0 -0
  90. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_security_messages.py +0 -0
  91. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_set_get_kb_calls.py +0 -0
  92. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_severity_date.py +0 -0
  93. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_severity_format.py +0 -0
  94. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_severity_origin.py +0 -0
  95. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_solution_text.py +0 -0
  96. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_solution_type.py +0 -0
  97. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_spaces_before_dots.py +0 -0
  98. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_spaces_in_filename.py +0 -0
  99. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_spelling.py +0 -0
  100. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_tabs.py +0 -0
  101. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_todo_tbd.py +0 -0
  102. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_trailing_spaces_tabs.py +0 -0
  103. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_valid_oid.py +0 -0
  104. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_valid_script_tag_names.py +0 -0
  105. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_variable_redefinition_in_foreach.py +0 -0
  106. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_vt_file_permissions.py +0 -0
  107. {troubadix-25.7.2 → troubadix-25.7.3}/tests/plugins/test_vt_placement.py +0 -0
  108. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/__init__.py +0 -0
  109. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/changed_packages/__init__.py +0 -0
  110. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/changed_packages/markers/__init__.py +0 -0
  111. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/changed_packages/markers/test_added_epoch.py +0 -0
  112. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/changed_packages/markers/test_added_release.py +0 -0
  113. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/changed_packages/markers/test_added_udeb.py +0 -0
  114. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/changed_packages/markers/test_changed_update.py +0 -0
  115. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/changed_packages/markers/test_dropped_architecture.py +0 -0
  116. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/changed_packages/test_changed_packages.py +0 -0
  117. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/changed_packages/test_package.py +0 -0
  118. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/nasl/21.04/21_script.nasl +0 -0
  119. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/nasl/22.04/22_script.nasl +0 -0
  120. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/nasl/common/bar.nasl +0 -0
  121. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/nasl/common/foo.nasl +0 -0
  122. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/nasl/common/foobar.nasl +0 -0
  123. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/nasl/common/gsf/enterprise_script.nasl +0 -0
  124. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/test_changed_creation_date.py +0 -0
  125. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/test_changed_cves.py +0 -0
  126. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/test_changed_oid.py +0 -0
  127. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/test_dependency_graph.py +0 -0
  128. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/test_deprecate_vts.py +0 -0
  129. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/test_file_extensions.py +0 -0
  130. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/test_last_modification.py +0 -0
  131. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/test_no_solution.py +0 -0
  132. {troubadix-25.7.2 → troubadix-25.7.3}/tests/standalone_plugins/test_version_updated.py +0 -0
  133. {troubadix-25.7.2 → troubadix-25.7.3}/tests/test_argparser.py +0 -0
  134. {troubadix-25.7.2 → troubadix-25.7.3}/tests/test_helper.py +0 -0
  135. {troubadix-25.7.2 → troubadix-25.7.3}/tests/test_naslinter.py +0 -0
  136. {troubadix-25.7.2 → troubadix-25.7.3}/tests/test_reporter.py +0 -0
  137. {troubadix-25.7.2 → troubadix-25.7.3}/tests/test_results.py +0 -0
  138. {troubadix-25.7.2 → troubadix-25.7.3}/tests/test_runner.py +0 -0
  139. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/__init__.py +0 -0
  140. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/argparser.py +0 -0
  141. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/codespell/codespell.additions +0 -0
  142. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/codespell/codespell.exclude +0 -0
  143. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/codespell/codespell.ignore +0 -0
  144. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/helper/__init__.py +0 -0
  145. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/helper/date_format.py +0 -0
  146. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/helper/helper.py +0 -0
  147. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/helper/linguistic_exception_handler.py +0 -0
  148. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/helper/patterns.py +0 -0
  149. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/helper/remove_comments.py +0 -0
  150. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/helper/text_utils.py +0 -0
  151. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugin.py +0 -0
  152. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/badwords.py +0 -0
  153. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/copyright_text.py +0 -0
  154. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/copyright_year.py +0 -0
  155. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/creation_date.py +0 -0
  156. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/cve_format.py +0 -0
  157. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/cvss_format.py +0 -0
  158. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/dependencies.py +0 -0
  159. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/dependency_category_order.py +0 -0
  160. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/deprecated_dependency.py +0 -0
  161. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/deprecated_functions.py +0 -0
  162. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/double_end_points.py +0 -0
  163. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/duplicate_oid.py +0 -0
  164. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/duplicated_script_tags.py +0 -0
  165. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/encoding.py +0 -0
  166. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/forking_nasl_functions.py +0 -0
  167. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/get_kb_on_services.py +0 -0
  168. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/grammar.py +0 -0
  169. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/http_links_in_tags.py +0 -0
  170. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/illegal_characters.py +0 -0
  171. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/log_messages.py +0 -0
  172. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/malformed_dependencies.py +0 -0
  173. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/misplaced_compare_in_if.py +0 -0
  174. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/missing_desc_exit.py +0 -0
  175. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/missing_tag_solution.py +0 -0
  176. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/multiple_re_parameters.py +0 -0
  177. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/newlines.py +0 -0
  178. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/overlong_description_lines.py +0 -0
  179. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/overlong_script_tags.py +0 -0
  180. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/prod_svc_detect_in_vulnvt.py +0 -0
  181. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/qod.py +0 -0
  182. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/reporting_consistency.py +0 -0
  183. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/script_add_preference_type.py +0 -0
  184. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/script_calls_empty_values.py +0 -0
  185. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/script_calls_recommended.py +0 -0
  186. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/script_category.py +0 -0
  187. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/script_copyright.py +0 -0
  188. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/script_family.py +0 -0
  189. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/script_tag_form.py +0 -0
  190. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/script_tag_whitespaces.py +0 -0
  191. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/script_tags_mandatory.py +0 -0
  192. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/script_version_and_last_modification_tags.py +0 -0
  193. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/script_xref_form.py +0 -0
  194. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/script_xref_url.py +0 -0
  195. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/security_messages.py +0 -0
  196. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/set_get_kb_calls.py +0 -0
  197. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/severity_date.py +0 -0
  198. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/severity_format.py +0 -0
  199. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/severity_origin.py +0 -0
  200. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/solution_text.py +0 -0
  201. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/solution_type.py +0 -0
  202. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/spaces_before_dots.py +0 -0
  203. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/spaces_in_filename.py +0 -0
  204. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/spelling.py +0 -0
  205. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/tabs.py +0 -0
  206. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/todo_tbd.py +0 -0
  207. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/trailing_spaces_tabs.py +0 -0
  208. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/valid_oid.py +0 -0
  209. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/valid_script_tag_names.py +0 -0
  210. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/variable_assigned_in_if.py +0 -0
  211. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/variable_redefinition_in_foreach.py +0 -0
  212. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/vt_file_permissions.py +0 -0
  213. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/plugins/vt_placement.py +0 -0
  214. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/reporter.py +0 -0
  215. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/results.py +0 -0
  216. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/runner.py +0 -0
  217. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/__init__.py +0 -0
  218. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/allowed_rev_diff.py +0 -0
  219. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/changed_creation_date.py +0 -0
  220. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/changed_cves.py +0 -0
  221. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/changed_oid.py +0 -0
  222. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/changed_packages/changed_packages.py +0 -0
  223. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/changed_packages/marker/__init__.py +0 -0
  224. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/changed_packages/marker/added_epoch.py +0 -0
  225. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/changed_packages/marker/added_release.py +0 -0
  226. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/changed_packages/marker/added_udeb.py +0 -0
  227. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/changed_packages/marker/changed_update.py +0 -0
  228. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/changed_packages/marker/dropped_architecture.py +0 -0
  229. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/changed_packages/marker/marker.py +0 -0
  230. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/changed_packages/package.py +0 -0
  231. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/common.py +0 -0
  232. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/dependency_graph/__init__.py +0 -0
  233. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/dependency_graph/checks.py +0 -0
  234. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/dependency_graph/cli.py +0 -0
  235. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/dependency_graph/dependency_graph.py +0 -0
  236. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/dependency_graph/models.py +0 -0
  237. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/deprecate_vts.py +0 -0
  238. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/file_extensions.py +0 -0
  239. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/last_modification.py +0 -0
  240. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/no_solution.py +0 -0
  241. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/util.py +0 -0
  242. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/standalone_plugins/version_updated.py +0 -0
  243. {troubadix-25.7.2 → troubadix-25.7.3}/troubadix/troubadix.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: troubadix
3
- Version: 25.7.2
3
+ Version: 25.7.3
4
4
  Summary: A linting and QA check tool for NASL files
5
5
  License: GPL-3.0-or-later
6
6
  Author: Greenbone
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "troubadix"
3
- version = "25.7.2"
3
+ version = "25.7.3"
4
4
  description = "A linting and QA check tool for NASL files"
5
5
  authors = ["Greenbone <info@greenbone.net>"]
6
6
  license = "GPL-3.0-or-later"
@@ -0,0 +1,251 @@
1
+ # SPDX-License-Identifier: GPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2025 Greenbone AG
3
+
4
+ import unittest
5
+
6
+ from troubadix.helper.if_block_parser import IfErrorType, find_if_statements
7
+
8
+
9
+ class FindIfStatementsTestCase(unittest.TestCase):
10
+ def test_empty_input(self):
11
+ result = find_if_statements("")
12
+ self.assertEqual(len(result.statements), 0)
13
+ self.assertEqual(len(result.errors), 0)
14
+
15
+ def test_inline_single_expression(self):
16
+ content = 'if(TRUE) display("inline");'
17
+ result = find_if_statements(content)
18
+
19
+ self.assertEqual(1, len(result.statements))
20
+ self.assertEqual("TRUE", result.statements[0].condition)
21
+ self.assertEqual('display("inline")', result.statements[0].outcome)
22
+ # Check that position is correct (start at 'if', end at semicolon)
23
+ self.assertEqual(0, result.statements[0].if_start)
24
+ self.assertEqual(len(content), result.statements[0].if_end)
25
+
26
+ def test_single_line_with_newline(self):
27
+ content = 'if(TRUE)\n display("single line");'
28
+ result = find_if_statements(content)
29
+
30
+ self.assertEqual(1, len(result.statements))
31
+ self.assertEqual("TRUE", result.statements[0].condition)
32
+ self.assertEqual('display("single line")', result.statements[0].outcome)
33
+
34
+ def test_standard_block(self):
35
+ content = 'if(TRUE) {\n display("block");\n}'
36
+ result = find_if_statements(content)
37
+
38
+ self.assertEqual(1, len(result.statements))
39
+ self.assertEqual("TRUE", result.statements[0].condition)
40
+ self.assertEqual('display("block");', result.statements[0].outcome)
41
+ # Check position spans from 'if' to the closing brace
42
+ self.assertEqual(0, result.statements[0].if_start)
43
+ self.assertEqual(len(content), result.statements[0].if_end)
44
+
45
+ def test_block_brace_on_newline(self):
46
+ content = 'if(TRUE)\n{\n display("block");\n}'
47
+ result = find_if_statements(content)
48
+
49
+ self.assertEqual(1, len(result.statements))
50
+ self.assertEqual("TRUE", result.statements[0].condition)
51
+ self.assertEqual('display("block");', result.statements[0].outcome)
52
+
53
+ def test_empty_block(self):
54
+ content = "if(TRUE)\n{\n}"
55
+ result = find_if_statements(content)
56
+
57
+ self.assertEqual(1, len(result.statements))
58
+ self.assertEqual("TRUE", result.statements[0].condition)
59
+ self.assertEqual("", result.statements[0].outcome)
60
+
61
+ def test_compact_block(self):
62
+ content = "if(TRUE){}"
63
+ result = find_if_statements(content)
64
+
65
+ self.assertEqual(1, len(result.statements))
66
+ self.assertEqual("TRUE", result.statements[0].condition)
67
+ self.assertEqual("", result.statements[0].outcome)
68
+
69
+ def test_multiple_if_statements(self):
70
+ content = """
71
+ if(cond1) display("one");
72
+ if(cond2) {
73
+ display("two");
74
+ }
75
+ if(cond3)
76
+ display("three");
77
+ """
78
+ result = find_if_statements(content)
79
+ self.assertEqual(3, len(result.statements))
80
+
81
+ self.assertEqual("cond1", result.statements[0].condition)
82
+ self.assertEqual('display("one")', result.statements[0].outcome)
83
+
84
+ self.assertEqual("cond2", result.statements[1].condition)
85
+ self.assertEqual('display("two");', result.statements[1].outcome)
86
+
87
+ self.assertEqual("cond3", result.statements[2].condition)
88
+ self.assertEqual('display("three")', result.statements[2].outcome)
89
+
90
+ def test_nested_if_statements(self):
91
+ content = """
92
+ if(outer) {
93
+ if(inner1) {
94
+ display("nested block");
95
+ }
96
+ if(inner2) display("nested inline");
97
+ }
98
+ """
99
+ result = find_if_statements(content)
100
+ self.assertEqual(3, len(result.statements))
101
+
102
+ self.assertEqual("outer", result.statements[0].condition)
103
+ self.assertIn("if(inner1)", result.statements[0].outcome)
104
+ self.assertIn("if(inner2)", result.statements[0].outcome)
105
+
106
+ self.assertEqual("inner1", result.statements[1].condition)
107
+ self.assertIn('display("nested block")', result.statements[1].outcome)
108
+
109
+ self.assertEqual("inner2", result.statements[2].condition)
110
+ self.assertEqual(
111
+ 'display("nested inline")', result.statements[2].outcome
112
+ )
113
+
114
+ def test_complex_condition(self):
115
+ content = (
116
+ 'if (a == 1 && b > 2 || c != "string") { display("complex"); }'
117
+ )
118
+ result = find_if_statements(content)
119
+
120
+ self.assertEqual(1, len(result.statements))
121
+ self.assertEqual(
122
+ 'a == 1 && b > 2 || c != "string"', result.statements[0].condition
123
+ )
124
+ self.assertEqual('display("complex");', result.statements[0].outcome)
125
+
126
+ def test_if_with_problematic_stuff(self):
127
+ # escape single quote and backslash, function call in condition
128
+ content = r"if(some_func('\'\\')) display('\'test\\');"
129
+ result = find_if_statements(content)
130
+
131
+ self.assertEqual(1, len(result.statements))
132
+ self.assertEqual(r"some_func('\'\\')", result.statements[0].condition)
133
+ self.assertEqual(r"display('\'test\\')", result.statements[0].outcome)
134
+
135
+ def test_unclosed_parenthesis(self):
136
+ content = "if(unclosed condition\ndisplay();"
137
+ result = find_if_statements(content)
138
+ self.assertEqual(len(result.statements), 0)
139
+ self.assertEqual(len(result.errors), 1)
140
+ self.assertEqual(result.errors[0].error_type.name, "UNCLOSED_CONDITION")
141
+
142
+ def test_no_statement_after_condition(self):
143
+ content = "if(condition)"
144
+ result = find_if_statements(content)
145
+ self.assertEqual(len(result.statements), 0)
146
+ self.assertEqual(len(result.errors), 1)
147
+ self.assertEqual(result.errors[0].error_type.name, "MISSING_OUTCOME")
148
+
149
+ def test_useless_semicolon(self):
150
+ content = "if(condition);"
151
+ result = find_if_statements(content)
152
+ self.assertEqual(len(result.statements), 0)
153
+ self.assertEqual(len(result.errors), 1)
154
+ self.assertEqual(
155
+ result.errors[0].error_type.name, "TERMINATED_AFTER_CONDITION"
156
+ )
157
+
158
+ def test_unclosed_block_brace(self):
159
+ content = "if(condition) {\ndisplay();\n# Missing closing brace"
160
+ result = find_if_statements(content)
161
+ self.assertEqual(len(result.statements), 0)
162
+ self.assertEqual(len(result.errors), 1)
163
+ self.assertEqual(result.errors[0].error_type.name, "UNCLOSED_BODY")
164
+
165
+ def test_no_semicolon_in_single_expression(self):
166
+ content = "if(condition) display()" # Missing semicolon
167
+ result = find_if_statements(content)
168
+ self.assertEqual(len(result.statements), 0)
169
+ self.assertEqual(len(result.errors), 1)
170
+ self.assertEqual(result.errors[0].error_type.name, "MISSING_STATEMENT")
171
+
172
+ def test_complex_condition_with_unmatched_brace(self):
173
+ content = "if(func(1, 2) || check(a) { display(); }" # Missing closing ) in condition
174
+ result = find_if_statements(content)
175
+ self.assertEqual(len(result.statements), 0)
176
+ self.assertEqual(len(result.errors), 1)
177
+ self.assertEqual(result.errors[0].error_type.name, "UNCLOSED_CONDITION")
178
+
179
+ def test_position_info_in_error_message(self):
180
+ content = "# Some comment\nif(bad) something" # No semicolon
181
+ result = find_if_statements(content)
182
+ self.assertEqual(len(result.statements), 0)
183
+ self.assertEqual(len(result.errors), 1)
184
+ self.assertEqual(result.errors[0].line, 2)
185
+
186
+ def test_condition_and_statement_positions_block(self):
187
+ content = 'if(TRUE) {\n display("block");\n}'
188
+ result = find_if_statements(content)
189
+
190
+ self.assertEqual(1, len(result.statements))
191
+ # Check condition position (inside parentheses)
192
+ self.assertEqual(3, result.statements[0].condition_start)
193
+ self.assertEqual(7, result.statements[0].condition_end)
194
+ # Check outcome position (inside braces)
195
+ self.assertEqual(10, result.statements[0].outcome_start)
196
+ self.assertEqual(31, result.statements[0].outcome_end)
197
+
198
+ def test_condition_and_statement_positions_single(self):
199
+ content = 'if(num > 5) display("inline");'
200
+ result = find_if_statements(content)
201
+
202
+ self.assertEqual(1, len(result.statements))
203
+ # Check condition position (inside parentheses)
204
+ self.assertEqual(3, result.statements[0].condition_start)
205
+ self.assertEqual(10, result.statements[0].condition_end)
206
+ # Check outcome position (after parenthesis to semicolon)
207
+ self.assertEqual(12, result.statements[0].outcome_start)
208
+ self.assertEqual(29, result.statements[0].outcome_end)
209
+
210
+ def test_mixed_valid_and_invalid_if_statements(self):
211
+ content = """
212
+ if(a > 0) display("ok1");
213
+ if(b > 0) ;
214
+ if(c > 0) {
215
+ display("ok2");
216
+ }
217
+ if(d > 0)
218
+ if(e > 0) display("ok3");
219
+ if(f > 0 display();
220
+ """
221
+ result = find_if_statements(content)
222
+ self.assertEqual(4, len(result.statements))
223
+ self.assertEqual(2, len(result.errors))
224
+ self.assertEqual("a > 0", result.statements[0].condition)
225
+ self.assertEqual(
226
+ IfErrorType.TERMINATED_AFTER_CONDITION,
227
+ result.errors[0].error_type,
228
+ )
229
+ self.assertEqual(
230
+ IfErrorType.UNCLOSED_CONDITION, result.errors[1].error_type
231
+ )
232
+
233
+ def test_multiple_nested_inline_if_statements(self):
234
+ content = """
235
+ if(a > 0)
236
+
237
+ if(b > 0)
238
+
239
+ if(c > 0)
240
+
241
+ display("deep");
242
+ """
243
+ result = find_if_statements(content)
244
+ # Should parse 3 nested if statements
245
+ self.assertEqual(3, len(result.statements))
246
+ self.assertEqual("a > 0", result.statements[0].condition)
247
+ self.assertIn("if(b > 0)", result.statements[0].outcome)
248
+ self.assertEqual("b > 0", result.statements[1].condition)
249
+ self.assertIn("if(c > 0)", result.statements[1].outcome)
250
+ self.assertEqual("c > 0", result.statements[2].condition)
251
+ self.assertEqual('display("deep")', result.statements[2].outcome)
@@ -0,0 +1,166 @@
1
+ # SPDX-License-Identifier: GPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2025 Greenbone AG
3
+
4
+ from pathlib import Path
5
+
6
+ from troubadix.plugins.if_statement_syntax import CheckIfStatementSyntax
7
+
8
+ from . import PluginTestCase
9
+
10
+
11
+ class CheckIfStatementSyntaxTestCase(PluginTestCase):
12
+ """Test cases for the CheckIfStatementSyntax plugin."""
13
+
14
+ def test_valid_if_statements(self):
15
+ nasl_file = Path(__file__).parent / "test.nasl"
16
+ content = """
17
+ if(condition) {
18
+ display("block statement");
19
+ }
20
+
21
+ if(another_condition) display("single statement");
22
+
23
+ if(nested_condition) {
24
+ if(inner_condition) {
25
+ display("nested");
26
+ }
27
+ }
28
+ """
29
+
30
+ fake_context = self.create_file_plugin_context(
31
+ nasl_file=nasl_file, file_content=content
32
+ )
33
+ plugin = CheckIfStatementSyntax(fake_context)
34
+
35
+ results = list(plugin.run())
36
+
37
+ self.assertEqual(len(results), 0)
38
+
39
+ def test_unclosed_parenthesis(self):
40
+ nasl_file = Path(__file__).parent / "test.nasl"
41
+ content = """
42
+ if(unclosed_condition {
43
+ display("this should fail");
44
+ }
45
+ """
46
+
47
+ fake_context = self.create_file_plugin_context(
48
+ nasl_file=nasl_file, file_content=content
49
+ )
50
+ plugin = CheckIfStatementSyntax(fake_context)
51
+
52
+ results = list(plugin.run())
53
+
54
+ self.assertEqual(len(results), 1)
55
+ self.assertIn("Unclosed parenthesis", results[0].message)
56
+ self.assertIn("line 2", results[0].message)
57
+
58
+ def test_unclosed_brace(self):
59
+ nasl_file = Path(__file__).parent / "test.nasl"
60
+ content = """
61
+ if(condition) {
62
+ display("missing closing brace");
63
+ # Missing closing brace
64
+ """
65
+
66
+ fake_context = self.create_file_plugin_context(
67
+ nasl_file=nasl_file, file_content=content
68
+ )
69
+ plugin = CheckIfStatementSyntax(fake_context)
70
+
71
+ results = list(plugin.run())
72
+
73
+ self.assertEqual(len(results), 1)
74
+ self.assertIn("Unclosed brace", results[0].message)
75
+
76
+ def test_missing_statement(self):
77
+ nasl_file = Path(__file__).parent / "test.nasl"
78
+ content = """
79
+ if(condition)
80
+ # No statement follows
81
+ """
82
+
83
+ fake_context = self.create_file_plugin_context(
84
+ nasl_file=nasl_file, file_content=content
85
+ )
86
+ plugin = CheckIfStatementSyntax(fake_context)
87
+
88
+ results = list(plugin.run())
89
+
90
+ self.assertEqual(len(results), 1)
91
+ self.assertIn("Missing statement", results[0].message)
92
+
93
+ def test_semicolon_after_condition(self):
94
+ nasl_file = Path(__file__).parent / "test.nasl"
95
+ content = """
96
+ if(condition);
97
+ {
98
+ display("this will always execute");
99
+ }
100
+ """
101
+
102
+ fake_context = self.create_file_plugin_context(
103
+ nasl_file=nasl_file, file_content=content
104
+ )
105
+ plugin = CheckIfStatementSyntax(fake_context)
106
+
107
+ results = list(plugin.run())
108
+
109
+ self.assertEqual(len(results), 1)
110
+ self.assertIn("Semicolon after if condition", results[0].message)
111
+
112
+ def test_missing_semicolon_in_expression(self):
113
+ nasl_file = Path(__file__).parent / "test.nasl"
114
+ content = """
115
+ if(condition) display("missing semicolon")
116
+ # No semicolon at end of expression
117
+ """
118
+
119
+ fake_context = self.create_file_plugin_context(
120
+ nasl_file=nasl_file, file_content=content
121
+ )
122
+ plugin = CheckIfStatementSyntax(fake_context)
123
+
124
+ results = list(plugin.run())
125
+
126
+ self.assertEqual(len(results), 1)
127
+ self.assertIn("Missing expression", results[0].message)
128
+
129
+ def test_comment_handling(self):
130
+ nasl_file = Path(__file__).parent / "test.nasl"
131
+ content = """
132
+ # This comment has an unclosed if(condition that should be ignored
133
+ if(real_condition) {
134
+ # Another comment with if(fake
135
+ display("real code");
136
+ }
137
+ """
138
+
139
+ fake_context = self.create_file_plugin_context(
140
+ nasl_file=nasl_file, file_content=content
141
+ )
142
+ plugin = CheckIfStatementSyntax(fake_context)
143
+
144
+ results = list(plugin.run())
145
+
146
+ self.assertEqual(len(results), 0)
147
+
148
+ def test_complex_nested_error(self):
149
+ nasl_file = Path(__file__).parent / "test.nasl"
150
+ content = """
151
+ if(outer_condition) {
152
+ if(inner_condition { # Missing closing parenthesis
153
+ display("nested error");
154
+ }
155
+ }
156
+ """
157
+
158
+ fake_context = self.create_file_plugin_context(
159
+ nasl_file=nasl_file, file_content=content
160
+ )
161
+ plugin = CheckIfStatementSyntax(fake_context)
162
+
163
+ results = list(plugin.run())
164
+
165
+ self.assertEqual(len(results), 1)
166
+ self.assertIn("Unclosed parenthesis", results[0].message)
@@ -131,18 +131,3 @@ class CheckUsingDisplayTestCase(PluginTestCase):
131
131
  results = list(plugin.run())
132
132
 
133
133
  self.assertEqual(0, len(results))
134
-
135
- def test_propagate_if_parser_error(self):
136
- path = Path("some/file.nasl")
137
- content = "if (Foo);\ndisplay('Foo');"
138
- fake_context = self.create_file_plugin_context(
139
- nasl_file=path, file_content=content
140
- )
141
- plugin = CheckUsingDisplay(fake_context)
142
-
143
- results = list(plugin.run())
144
-
145
- # only one result for if parser error,
146
- # display call not part of result due to early exit of entire run.
147
- self.assertEqual(1, len(results))
148
- self.assertIn("Semicolon after if condition", results[0].message)
@@ -2,4 +2,4 @@
2
2
 
3
3
  # THIS IS AN AUTOGENERATED FILE. DO NOT TOUCH!
4
4
 
5
- __version__ = "25.7.2"
5
+ __version__ = "25.7.3"