troubadix 25.10.10__tar.gz → 25.11.1__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.10.10 → troubadix-25.11.1}/PKG-INFO +1 -1
  2. {troubadix-25.10.10 → troubadix-25.11.1}/pyproject.toml +1 -1
  3. troubadix-25.11.1/tests/plugins/test_script_add_preference_id.py +165 -0
  4. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/__version__.py +1 -1
  5. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/helper/text_utils.py +26 -0
  6. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/__init__.py +2 -0
  7. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/http_links_in_tags.py +2 -0
  8. troubadix-25.11.1/troubadix/plugins/script_add_preference_id.py +53 -0
  9. {troubadix-25.10.10 → troubadix-25.11.1}/LICENSE +0 -0
  10. {troubadix-25.10.10 → troubadix-25.11.1}/README.md +0 -0
  11. {troubadix-25.10.10 → troubadix-25.11.1}/tests/__init__.py +0 -0
  12. {troubadix-25.10.10 → troubadix-25.11.1}/tests/helper/__init__.py +0 -0
  13. {troubadix-25.10.10 → troubadix-25.11.1}/tests/helper/test_date_format.py +0 -0
  14. {troubadix-25.10.10 → troubadix-25.11.1}/tests/helper/test_if_block_parser.py +0 -0
  15. {troubadix-25.10.10 → troubadix-25.11.1}/tests/helper/test_linguistic_exception_handler.py +0 -0
  16. {troubadix-25.10.10 → troubadix-25.11.1}/tests/helper/test_patterns.py +0 -0
  17. {troubadix-25.10.10 → troubadix-25.11.1}/tests/helper/test_remove_comments.py +0 -0
  18. {troubadix-25.10.10 → troubadix-25.11.1}/tests/helper/test_text_utils.py +0 -0
  19. {troubadix-25.10.10 → troubadix-25.11.1}/tests/manual_tests/comment_removal_diff.py +0 -0
  20. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/__init__.py +0 -0
  21. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/fail.nasl +0 -0
  22. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/fail2.nasl +0 -0
  23. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test.nasl +0 -0
  24. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_badwords.py +0 -0
  25. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_copyright_text.py +0 -0
  26. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_copyright_year.py +0 -0
  27. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_creation_date.py +0 -0
  28. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_cve_format.py +0 -0
  29. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_cvss_format.py +0 -0
  30. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_dependencies.py +0 -0
  31. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_dependency_category_order.py +0 -0
  32. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_deprecated_dependency.py +0 -0
  33. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_deprecated_functions.py +0 -0
  34. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_double_end_points.py +0 -0
  35. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_duplicate_oid.py +0 -0
  36. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_duplicated_script_tags.py +0 -0
  37. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_encoding.py +0 -0
  38. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/fail_bad_new_line.nasl +0 -0
  39. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/fail_badwords.nasl +0 -0
  40. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/fail_name_and_copyright_newline.nasl +0 -0
  41. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/fail_name_newline.nasl +0 -0
  42. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/fail_permissions.nasl +0 -0
  43. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/fail_spelling.nasl +0 -0
  44. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/nasl/21.04/fail.nasl +0 -0
  45. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/nasl/21.04/fail_badwords.nasl +0 -0
  46. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/nasl/21.04/fail_name_and_copyright_newline.nasl +0 -0
  47. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/nasl/21.04/fail_name_newline.nasl +0 -0
  48. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/nasl/21.04/fail_solution_template.nasl +0 -0
  49. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/nasl/21.04/runner/fail.nasl +0 -0
  50. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/nasl/21.04/runner/fail2.nasl +0 -0
  51. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/nasl/21.04/runner/test.nasl +0 -0
  52. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/nasl/21.04/runner/test_valid_oid.nasl +0 -0
  53. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/nasl/21.04/test.inc +0 -0
  54. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/nasl/21.04/test.nasl +0 -0
  55. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/nasl/warning.nasl +0 -0
  56. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/ok_permissions.nasl +0 -0
  57. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_files/test_oid.nasl +0 -0
  58. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_forking_nasl_functions.py +0 -0
  59. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_get_kb_on_services.py +0 -0
  60. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_grammar.py +0 -0
  61. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_http_links_in_tags.py +0 -0
  62. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_if_statement_syntax.py +0 -0
  63. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_illegal_characters.py +0 -0
  64. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_log_messages.py +0 -0
  65. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_malformed_dependencies.py +0 -0
  66. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_misplaced_compare_in_if.py +0 -0
  67. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_missing_desc_exit.py +0 -0
  68. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_missing_tag_solution.py +0 -0
  69. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_multiple_re_parameters.py +0 -0
  70. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_newlines.py +0 -0
  71. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_overlong_description_lines.py +0 -0
  72. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_overlong_script_tags.py +0 -0
  73. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_prod_svc_detect_in_vulnvt.py +0 -0
  74. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_qod.py +0 -0
  75. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_reporting_consistency.py +0 -0
  76. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_script_add_preference_type.py +0 -0
  77. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_script_calls_empty_values.py +0 -0
  78. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_script_calls_recommended.py +0 -0
  79. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_script_category.py +0 -0
  80. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_script_copyright.py +0 -0
  81. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_script_family.py +0 -0
  82. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_script_tag_form.py +0 -0
  83. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_script_tag_whitespaces.py +0 -0
  84. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_script_tags_mandatory.py +0 -0
  85. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_script_version_and_last_modification_tags.py +0 -0
  86. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_script_xref_form.py +0 -0
  87. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_script_xref_url.py +0 -0
  88. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_security_messages.py +0 -0
  89. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_set_get_kb_calls.py +0 -0
  90. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_severity_date.py +0 -0
  91. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_severity_format.py +0 -0
  92. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_severity_origin.py +0 -0
  93. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_solution_text.py +0 -0
  94. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_solution_type.py +0 -0
  95. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_spaces_before_dots.py +0 -0
  96. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_spaces_in_filename.py +0 -0
  97. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_spelling.py +0 -0
  98. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_tabs.py +0 -0
  99. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_todo_tbd.py +0 -0
  100. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_trailing_spaces_tabs.py +0 -0
  101. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_using_display.py +0 -0
  102. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_valid_oid.py +0 -0
  103. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_valid_script_tag_names.py +0 -0
  104. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_variable_redefinition_in_foreach.py +0 -0
  105. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_vt_file_permissions.py +0 -0
  106. {troubadix-25.10.10 → troubadix-25.11.1}/tests/plugins/test_vt_placement.py +0 -0
  107. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/__init__.py +0 -0
  108. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/changed_packages/__init__.py +0 -0
  109. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/changed_packages/markers/__init__.py +0 -0
  110. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/changed_packages/markers/test_added_epoch.py +0 -0
  111. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/changed_packages/markers/test_added_release.py +0 -0
  112. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/changed_packages/markers/test_added_udeb.py +0 -0
  113. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/changed_packages/markers/test_changed_update.py +0 -0
  114. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/changed_packages/markers/test_dropped_architecture.py +0 -0
  115. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/changed_packages/test_changed_packages.py +0 -0
  116. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/changed_packages/test_package.py +0 -0
  117. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/nasl/21.04/21_script.nasl +0 -0
  118. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/nasl/22.04/22_script.nasl +0 -0
  119. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/nasl/common/bar.nasl +0 -0
  120. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/nasl/common/foo.nasl +0 -0
  121. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/nasl/common/foobar.nasl +0 -0
  122. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/nasl/common/gsf/enterprise_script.nasl +0 -0
  123. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/test_changed_creation_date.py +0 -0
  124. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/test_changed_cves.py +0 -0
  125. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/test_changed_oid.py +0 -0
  126. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/test_dependency_graph.py +0 -0
  127. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/test_deprecate_vts.py +0 -0
  128. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/test_file_extensions.py +0 -0
  129. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/test_last_modification.py +0 -0
  130. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/test_no_solution.py +0 -0
  131. {troubadix-25.10.10 → troubadix-25.11.1}/tests/standalone_plugins/test_version_updated.py +0 -0
  132. {troubadix-25.10.10 → troubadix-25.11.1}/tests/test_argparser.py +0 -0
  133. {troubadix-25.10.10 → troubadix-25.11.1}/tests/test_helper.py +0 -0
  134. {troubadix-25.10.10 → troubadix-25.11.1}/tests/test_naslinter.py +0 -0
  135. {troubadix-25.10.10 → troubadix-25.11.1}/tests/test_reporter.py +0 -0
  136. {troubadix-25.10.10 → troubadix-25.11.1}/tests/test_results.py +0 -0
  137. {troubadix-25.10.10 → troubadix-25.11.1}/tests/test_runner.py +0 -0
  138. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/__init__.py +0 -0
  139. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/argparser.py +0 -0
  140. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/codespell/codespell.additions +0 -0
  141. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/codespell/codespell.exclude +0 -0
  142. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/codespell/codespell.ignore +0 -0
  143. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/helper/__init__.py +0 -0
  144. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/helper/date_format.py +0 -0
  145. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/helper/helper.py +0 -0
  146. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/helper/if_block_parser.py +0 -0
  147. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/helper/linguistic_exception_handler.py +0 -0
  148. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/helper/patterns.py +0 -0
  149. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/helper/remove_comments.py +0 -0
  150. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugin.py +0 -0
  151. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/badwords.py +0 -0
  152. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/copyright_text.py +0 -0
  153. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/copyright_year.py +0 -0
  154. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/creation_date.py +0 -0
  155. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/cve_format.py +0 -0
  156. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/cvss_format.py +0 -0
  157. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/dependencies.py +0 -0
  158. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/dependency_category_order.py +0 -0
  159. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/deprecated_dependency.py +0 -0
  160. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/deprecated_functions.py +0 -0
  161. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/double_end_points.py +0 -0
  162. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/duplicate_oid.py +0 -0
  163. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/duplicated_script_tags.py +0 -0
  164. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/encoding.py +0 -0
  165. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/forking_nasl_functions.py +0 -0
  166. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/get_kb_on_services.py +0 -0
  167. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/grammar.py +0 -0
  168. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/if_statement_syntax.py +0 -0
  169. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/illegal_characters.py +0 -0
  170. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/log_messages.py +0 -0
  171. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/malformed_dependencies.py +0 -0
  172. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/misplaced_compare_in_if.py +0 -0
  173. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/missing_desc_exit.py +0 -0
  174. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/missing_tag_solution.py +0 -0
  175. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/multiple_re_parameters.py +0 -0
  176. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/newlines.py +0 -0
  177. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/overlong_description_lines.py +0 -0
  178. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/overlong_script_tags.py +0 -0
  179. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/prod_svc_detect_in_vulnvt.py +0 -0
  180. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/qod.py +0 -0
  181. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/reporting_consistency.py +0 -0
  182. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/script_add_preference_type.py +0 -0
  183. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/script_calls_empty_values.py +0 -0
  184. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/script_calls_recommended.py +0 -0
  185. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/script_category.py +0 -0
  186. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/script_copyright.py +0 -0
  187. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/script_family.py +0 -0
  188. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/script_tag_form.py +0 -0
  189. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/script_tag_whitespaces.py +0 -0
  190. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/script_tags_mandatory.py +0 -0
  191. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/script_version_and_last_modification_tags.py +0 -0
  192. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/script_xref_form.py +0 -0
  193. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/script_xref_url.py +0 -0
  194. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/security_messages.py +0 -0
  195. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/set_get_kb_calls.py +0 -0
  196. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/severity_date.py +0 -0
  197. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/severity_format.py +0 -0
  198. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/severity_origin.py +0 -0
  199. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/solution_text.py +0 -0
  200. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/solution_type.py +0 -0
  201. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/spaces_before_dots.py +0 -0
  202. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/spaces_in_filename.py +0 -0
  203. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/spelling.py +0 -0
  204. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/tabs.py +0 -0
  205. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/todo_tbd.py +0 -0
  206. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/trailing_spaces_tabs.py +0 -0
  207. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/using_display.py +0 -0
  208. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/valid_oid.py +0 -0
  209. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/valid_script_tag_names.py +0 -0
  210. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/variable_assigned_in_if.py +0 -0
  211. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/variable_redefinition_in_foreach.py +0 -0
  212. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/vt_file_permissions.py +0 -0
  213. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/plugins/vt_placement.py +0 -0
  214. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/reporter.py +0 -0
  215. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/results.py +0 -0
  216. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/runner.py +0 -0
  217. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/__init__.py +0 -0
  218. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/allowed_rev_diff.py +0 -0
  219. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/changed_creation_date.py +0 -0
  220. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/changed_cves.py +0 -0
  221. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/changed_oid.py +0 -0
  222. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/changed_packages/changed_packages.py +0 -0
  223. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/changed_packages/marker/__init__.py +0 -0
  224. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/changed_packages/marker/added_epoch.py +0 -0
  225. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/changed_packages/marker/added_release.py +0 -0
  226. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/changed_packages/marker/added_udeb.py +0 -0
  227. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/changed_packages/marker/changed_update.py +0 -0
  228. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/changed_packages/marker/dropped_architecture.py +0 -0
  229. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/changed_packages/marker/marker.py +0 -0
  230. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/changed_packages/package.py +0 -0
  231. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/common.py +0 -0
  232. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/dependency_graph/__init__.py +0 -0
  233. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/dependency_graph/checks.py +0 -0
  234. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/dependency_graph/cli.py +0 -0
  235. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/dependency_graph/dependency_graph.py +0 -0
  236. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/dependency_graph/models.py +0 -0
  237. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/deprecate_vts.py +0 -0
  238. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/file_extensions.py +0 -0
  239. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/last_modification.py +0 -0
  240. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/no_solution.py +0 -0
  241. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/util.py +0 -0
  242. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/standalone_plugins/version_updated.py +0 -0
  243. {troubadix-25.10.10 → troubadix-25.11.1}/troubadix/troubadix.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: troubadix
3
- Version: 25.10.10
3
+ Version: 25.11.1
4
4
  Summary: A linting and QA check tool for NASL files
5
5
  License: GPL-3.0-or-later
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "troubadix"
3
- version = "25.10.10"
3
+ version = "25.11.1"
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,165 @@
1
+ # SPDX-License-Identifier: GPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2025 Greenbone AG
3
+ from pathlib import Path
4
+
5
+ from troubadix.plugin import LinterError
6
+ from troubadix.plugins.script_add_preference_id import (
7
+ CheckScriptAddPreferenceId,
8
+ iter_script_add_preference_values,
9
+ )
10
+
11
+ from . import PluginTestCase
12
+
13
+
14
+ class CheckScriptAddPreferenceIdTestCase(PluginTestCase):
15
+ def test_unique_ids(self):
16
+ path = Path("some/file.nasl")
17
+ contents = [
18
+ """
19
+ script_add_preference(name:"Bar", type:"entry", value:"baz");
20
+ script_add_preference(name:"Baz", type:"radio", value:"qux");
21
+ script_add_preference(name:"Foo", type:"radio", value:"bar");
22
+ """,
23
+ """
24
+ script_add_preference(name:"Bar", type:"entry", value:"baz", id:1);
25
+ script_add_preference(name:"Baz", type:"radio", value:"qux");
26
+ script_add_preference(name:"Foo", type:"radio", value:"bar", id:3);
27
+ """,
28
+ """
29
+ script_add_preference(name:"Bar", type:"entry", value:"baz", id:2);
30
+ script_add_preference(name:"Baz", type:"radio", value:"qux", id:1);
31
+ script_add_preference(name:"Foo", type:"radio", value:"bar", id:3);
32
+ """,
33
+ """
34
+ script_add_preference(name:"Bar", type:"entry", value:"baz", id:1);
35
+ script_add_preference(name:"Baz", type:"radio", value:"qux", id:2);
36
+ script_add_preference(name:"Foo", type:"radio", value:"bar", id:3);
37
+ """,
38
+ ]
39
+
40
+ for content in contents:
41
+ with self.subTest(content=content):
42
+ fake_context = self.create_file_plugin_context(
43
+ nasl_file=path, file_content=content
44
+ )
45
+ plugin = CheckScriptAddPreferenceId(fake_context)
46
+
47
+ results = list(plugin.run())
48
+
49
+ self.assertEqual(len(results), 0)
50
+
51
+ def test_duplicate_id(self):
52
+ path = Path("some/file.nasl")
53
+ contents = [
54
+ (
55
+ """
56
+ script_add_preference(name:"Bar", type:"entry", value:"baz", id:1);
57
+ script_add_preference(name:"Baz", type:"radio", value:"qux");
58
+ script_add_preference(name:"Foo", type:"radio", value:"bar", id:2);
59
+ """,
60
+ "2",
61
+ ),
62
+ (
63
+ """
64
+ script_add_preference(name:"Bar", type:"entry", value:"baz");
65
+ script_add_preference(name:"Baz", type:"radio", value:"qux", id:1);
66
+ script_add_preference(name:"Foo", type:"radio", value:"bar", id:2);
67
+ """,
68
+ "1",
69
+ ),
70
+ (
71
+ """
72
+ script_add_preference(name:"Bar", type:"entry", value:"baz", id:1);
73
+ script_add_preference(name:"Baz", type:"radio", value:"qux", id:3);
74
+ script_add_preference(name:"Foo", type:"radio", value:"bar", id:1);
75
+ """,
76
+ "1",
77
+ ),
78
+ (
79
+ """
80
+ script_add_preference(name:"Bar", type:"entry", value:"baz", id:2);
81
+ script_add_preference(name:"Baz", type:"radio", value:"qux", id:1);
82
+ script_add_preference(name:"Foo", type:"radio", value:"bar", id:1);
83
+ """,
84
+ "1",
85
+ ),
86
+ (
87
+ """
88
+ script_add_preference(name:"Bar", type:"entry", value:"baz");
89
+ script_add_preference(name:"Baz", type:"radio", value:"qux", id:1);
90
+ script_add_preference(name:"Foo", type:"radio", value:"bar", id:3);
91
+ """,
92
+ "1",
93
+ ),
94
+ (
95
+ """
96
+ script_add_preference(name:"Bar", type:"entry", value:"baz", id:2);
97
+ script_add_preference(name:"Baz", type:"radio", value:"qux");
98
+ script_add_preference(name:"Foo", type:"radio", value:"bar", id:3);
99
+ """,
100
+ "2",
101
+ ),
102
+ ]
103
+
104
+ for content, expected_id in contents:
105
+ with self.subTest(content=content):
106
+ fake_context = self.create_file_plugin_context(
107
+ nasl_file=path, file_content=content
108
+ )
109
+ plugin = CheckScriptAddPreferenceId(fake_context)
110
+
111
+ results = list(plugin.run())
112
+
113
+ self.assertEqual(len(results), 1)
114
+ self.assertIsInstance(results[0], LinterError)
115
+ self.assertEqual(
116
+ f"script_add_preference id {expected_id} is used multiple times",
117
+ results[0].message,
118
+ )
119
+
120
+ def test_multiple_errors(self):
121
+ content = """
122
+ script_add_preference(name:"Bar", type:"entry", value:"baz"); #1
123
+ script_add_preference(name:"Baz", type:"radio", value:"qux"); #2
124
+ script_add_preference(name:"Foo", type:"radio", value:"bar"); #3
125
+ script_add_preference(name:"Bar", type:"entry", value:"baz", id:2);
126
+ script_add_preference(name:"Bar", type:"entry", value:"baz", id:2);
127
+ script_add_preference(name:"Baz", type:"radio", value:"qux", id:1);
128
+ script_add_preference(name:"Foo", type:"radio", value:"bar", id:3);
129
+ script_add_preference(name:"Foo", type:"radio", value:"bar"); #8
130
+ script_add_preference(name:"Foo", type:"radio", value:"bar", id:8);
131
+ """
132
+ expected_ids = [2, 2, 1, 3, 8]
133
+ path = Path("some/file.nasl")
134
+ fake_context = self.create_file_plugin_context(
135
+ nasl_file=path, file_content=content
136
+ )
137
+ plugin = CheckScriptAddPreferenceId(fake_context)
138
+
139
+ results = list(plugin.run())
140
+
141
+ self.assertEqual(len(results), 5)
142
+ self.assertIsInstance(results[0], LinterError)
143
+ for index, id in enumerate(expected_ids):
144
+ self.assertEqual(
145
+ f"script_add_preference id {id} is used multiple times",
146
+ results[index].message,
147
+ )
148
+
149
+ def test_iter_script_add_preference_values_handles_semicolon_in_value(self):
150
+ content = (
151
+ "script_add_preference("
152
+ 'name:"Network type", type:"radio", '
153
+ 'value:"Mixed (use RFC 1918);Private LAN;Public WAN (Internet);Public LAN", '
154
+ "id:8);"
155
+ )
156
+
157
+ values = list(iter_script_add_preference_values(content))
158
+
159
+ self.assertEqual(len(values), 1)
160
+ self.assertEqual(
161
+ values[0],
162
+ 'name:"Network type", type:"radio", '
163
+ 'value:"Mixed (use RFC 1918);Private LAN;Public WAN (Internet);Public LAN", '
164
+ "id:8",
165
+ )
@@ -2,4 +2,4 @@
2
2
 
3
3
  # THIS IS AN AUTOGENERATED FILE. DO NOT TOUCH!
4
4
 
5
- __version__ = "25.10.10"
5
+ __version__ = "25.11.1"
@@ -78,3 +78,29 @@ def is_position_in_string(text: str, position: int) -> bool:
78
78
  string_state.process_next_char(char)
79
79
 
80
80
  return string_state.in_string
81
+
82
+
83
+ def find_matching_brace(
84
+ text: str, opening_pos: int, braces: tuple[str, str] = ("(", ")")
85
+ ) -> int | None:
86
+ """
87
+ Return the index of the matching closing brace for the brace at opening_pos.
88
+ """
89
+ opening, closing = braces
90
+ depth = 1
91
+ string_state = StringState()
92
+
93
+ for pos in range(opening_pos + 1, len(text)):
94
+ char = text[pos]
95
+ string_state.process_next_char(char)
96
+
97
+ if string_state.in_string:
98
+ continue
99
+
100
+ if char == opening:
101
+ depth += 1
102
+ elif char == closing:
103
+ depth -= 1
104
+ if depth == 0:
105
+ return pos
106
+ return None
@@ -53,6 +53,7 @@ from .overlong_script_tags import CheckOverlongScriptTags
53
53
  from .prod_svc_detect_in_vulnvt import CheckProdSvcDetectInVulnvt
54
54
  from .qod import CheckQod
55
55
  from .reporting_consistency import CheckReportingConsistency
56
+ from .script_add_preference_id import CheckScriptAddPreferenceId
56
57
  from .script_add_preference_type import CheckScriptAddPreferenceType
57
58
  from .script_calls_empty_values import CheckScriptCallsEmptyValues
58
59
  from .script_calls_recommended import CheckScriptCallsRecommended
@@ -151,6 +152,7 @@ _FILE_PLUGINS = [
151
152
  CheckWrongSetGetKBCalls,
152
153
  CheckSpacesBeforeDots,
153
154
  CheckIfStatementSyntax,
155
+ CheckScriptAddPreferenceId,
154
156
  ]
155
157
 
156
158
  # plugins checking all files
@@ -176,6 +176,8 @@ class CheckHttpLinksInTags(FilePlugin):
176
176
  # For example: 'http://[::1]/'.
177
177
  "http://[::1]/",
178
178
  "https://[::1]/",
179
+ "https://target",
180
+ "http://target",
179
181
  ]
180
182
 
181
183
  return any(
@@ -0,0 +1,53 @@
1
+ # SPDX-License-Identifier: GPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2025 Greenbone AG
3
+
4
+ import re
5
+ from collections.abc import Iterator
6
+ from pathlib import Path
7
+
8
+ from troubadix.helper.text_utils import find_matching_brace
9
+ from troubadix.plugin import FileContentPlugin, LinterError, LinterResult
10
+
11
+ SCRIPT_CALL_PATTERN = re.compile(r"script_add_preference\s*\(")
12
+ ID_PATTERN = re.compile(r"id\s*:\s*(?P<id>\d+)")
13
+
14
+
15
+ def iter_script_add_preference_values(
16
+ source: str,
17
+ ) -> Iterator[str]:
18
+ for match in SCRIPT_CALL_PATTERN.finditer(source):
19
+ opening_paren = match.end() - 1
20
+ closing_paren = find_matching_brace(source, opening_paren, ("(", ")"))
21
+ if closing_paren is None:
22
+ continue
23
+ yield source[opening_paren + 1 : closing_paren]
24
+
25
+
26
+ class CheckScriptAddPreferenceId(FileContentPlugin):
27
+ name = "check_script_add_preference_id"
28
+
29
+ def check_content(
30
+ self, nasl_file: Path, file_content: str
31
+ ) -> Iterator[LinterResult]:
32
+ if (
33
+ nasl_file.suffix == ".inc"
34
+ or "script_add_preference" not in file_content
35
+ ):
36
+ return
37
+
38
+ seen_ids: set[int] = set()
39
+
40
+ for index, value in enumerate(
41
+ iter_script_add_preference_values(file_content), 1
42
+ ):
43
+ id_match = ID_PATTERN.search(value)
44
+ pref_id = int(id_match.group("id")) if id_match else index
45
+
46
+ if pref_id in seen_ids:
47
+ yield LinterError(
48
+ f"script_add_preference id {pref_id} is used multiple times",
49
+ file=nasl_file,
50
+ plugin=self.name,
51
+ )
52
+
53
+ seen_ids.add(pref_id)
File without changes
File without changes