troubadix 25.10.8__tar.gz → 25.10.9__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.
- {troubadix-25.10.8 → troubadix-25.10.9}/PKG-INFO +1 -1
- {troubadix-25.10.8 → troubadix-25.10.9}/pyproject.toml +1 -1
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_encoding.py +74 -11
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/__version__.py +1 -1
- troubadix-25.10.9/troubadix/plugins/encoding.py +78 -0
- troubadix-25.10.8/troubadix/plugins/encoding.py +0 -62
- {troubadix-25.10.8 → troubadix-25.10.9}/LICENSE +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/README.md +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/__init__.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/helper/__init__.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/helper/test_date_format.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/helper/test_if_block_parser.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/helper/test_linguistic_exception_handler.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/helper/test_patterns.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/helper/test_remove_comments.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/helper/test_text_utils.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/manual_tests/comment_removal_diff.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/__init__.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/fail.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/fail2.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_badwords.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_copyright_text.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_copyright_year.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_creation_date.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_cve_format.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_cvss_format.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_dependencies.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_dependency_category_order.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_deprecated_dependency.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_deprecated_functions.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_double_end_points.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_duplicate_oid.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_duplicated_script_tags.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/fail_bad_new_line.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/fail_badwords.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/fail_name_and_copyright_newline.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/fail_name_newline.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/fail_permissions.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/fail_spelling.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/fail.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/fail_badwords.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/fail_name_and_copyright_newline.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/fail_name_newline.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/fail_solution_template.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/runner/fail.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/runner/fail2.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/runner/test.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/runner/test_valid_oid.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/test.inc +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/test.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/warning.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/ok_permissions.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/test_oid.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_forking_nasl_functions.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_get_kb_on_services.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_grammar.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_http_links_in_tags.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_if_statement_syntax.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_illegal_characters.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_log_messages.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_malformed_dependencies.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_misplaced_compare_in_if.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_missing_desc_exit.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_missing_tag_solution.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_multiple_re_parameters.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_newlines.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_overlong_description_lines.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_overlong_script_tags.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_prod_svc_detect_in_vulnvt.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_qod.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_reporting_consistency.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_script_add_preference_type.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_script_calls_empty_values.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_script_calls_recommended.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_script_category.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_script_copyright.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_script_family.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_script_tag_form.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_script_tag_whitespaces.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_script_tags_mandatory.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_script_version_and_last_modification_tags.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_script_xref_form.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_script_xref_url.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_security_messages.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_set_get_kb_calls.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_severity_date.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_severity_format.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_severity_origin.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_solution_text.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_solution_type.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_spaces_before_dots.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_spaces_in_filename.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_spelling.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_tabs.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_todo_tbd.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_trailing_spaces_tabs.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_using_display.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_valid_oid.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_valid_script_tag_names.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_variable_redefinition_in_foreach.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_vt_file_permissions.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_vt_placement.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/__init__.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/changed_packages/__init__.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/changed_packages/markers/__init__.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/changed_packages/markers/test_added_epoch.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/changed_packages/markers/test_added_release.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/changed_packages/markers/test_added_udeb.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/changed_packages/markers/test_changed_update.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/changed_packages/markers/test_dropped_architecture.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/changed_packages/test_changed_packages.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/changed_packages/test_package.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/nasl/21.04/21_script.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/nasl/22.04/22_script.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/nasl/common/bar.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/nasl/common/foo.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/nasl/common/foobar.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/nasl/common/gsf/enterprise_script.nasl +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/test_changed_creation_date.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/test_changed_cves.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/test_changed_oid.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/test_dependency_graph.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/test_deprecate_vts.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/test_file_extensions.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/test_last_modification.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/test_no_solution.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/test_version_updated.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/test_argparser.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/test_helper.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/test_naslinter.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/test_reporter.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/test_results.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/tests/test_runner.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/__init__.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/argparser.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/codespell/codespell.additions +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/codespell/codespell.exclude +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/codespell/codespell.ignore +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/helper/__init__.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/helper/date_format.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/helper/helper.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/helper/if_block_parser.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/helper/linguistic_exception_handler.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/helper/patterns.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/helper/remove_comments.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/helper/text_utils.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugin.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/__init__.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/badwords.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/copyright_text.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/copyright_year.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/creation_date.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/cve_format.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/cvss_format.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/dependencies.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/dependency_category_order.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/deprecated_dependency.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/deprecated_functions.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/double_end_points.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/duplicate_oid.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/duplicated_script_tags.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/forking_nasl_functions.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/get_kb_on_services.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/grammar.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/http_links_in_tags.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/if_statement_syntax.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/illegal_characters.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/log_messages.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/malformed_dependencies.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/misplaced_compare_in_if.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/missing_desc_exit.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/missing_tag_solution.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/multiple_re_parameters.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/newlines.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/overlong_description_lines.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/overlong_script_tags.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/prod_svc_detect_in_vulnvt.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/qod.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/reporting_consistency.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/script_add_preference_type.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/script_calls_empty_values.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/script_calls_recommended.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/script_category.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/script_copyright.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/script_family.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/script_tag_form.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/script_tag_whitespaces.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/script_tags_mandatory.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/script_version_and_last_modification_tags.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/script_xref_form.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/script_xref_url.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/security_messages.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/set_get_kb_calls.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/severity_date.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/severity_format.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/severity_origin.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/solution_text.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/solution_type.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/spaces_before_dots.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/spaces_in_filename.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/spelling.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/tabs.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/todo_tbd.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/trailing_spaces_tabs.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/using_display.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/valid_oid.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/valid_script_tag_names.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/variable_assigned_in_if.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/variable_redefinition_in_foreach.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/vt_file_permissions.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/plugins/vt_placement.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/reporter.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/results.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/runner.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/__init__.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/allowed_rev_diff.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/changed_creation_date.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/changed_cves.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/changed_oid.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/changed_packages/changed_packages.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/changed_packages/marker/__init__.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/changed_packages/marker/added_epoch.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/changed_packages/marker/added_release.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/changed_packages/marker/added_udeb.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/changed_packages/marker/changed_update.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/changed_packages/marker/dropped_architecture.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/changed_packages/marker/marker.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/changed_packages/package.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/common.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/dependency_graph/__init__.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/dependency_graph/checks.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/dependency_graph/cli.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/dependency_graph/dependency_graph.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/dependency_graph/models.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/deprecate_vts.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/file_extensions.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/last_modification.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/no_solution.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/util.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/standalone_plugins/version_updated.py +0 -0
- {troubadix-25.10.8 → troubadix-25.10.9}/troubadix/troubadix.py +0 -0
|
@@ -44,6 +44,69 @@ class CheckEncodingTestCase(PluginTestCase):
|
|
|
44
44
|
|
|
45
45
|
self.assertEqual(len(results), 0)
|
|
46
46
|
|
|
47
|
+
def test_ok_iso_8859_1(self):
|
|
48
|
+
"""Test that all valid ISO-8859-1 characters pass encoding validation.
|
|
49
|
+
|
|
50
|
+
This covers the issue reported in JIRA VTOPS-281 where characters like 'ä' and '®'
|
|
51
|
+
should be valid when files are properly encoded as ISO-8859-1.
|
|
52
|
+
"""
|
|
53
|
+
with self.create_directory() as tempdir:
|
|
54
|
+
path = tempdir / "file.nasl"
|
|
55
|
+
|
|
56
|
+
# All valid ISO-8859-1 characters (0-255)
|
|
57
|
+
# ASCII printable characters (32-126) + Latin-1 supplement (160-255)
|
|
58
|
+
latin1_chars = "".join(
|
|
59
|
+
[chr(i) for i in list(range(32, 127)) + list(range(160, 256))]
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
path.write_text(
|
|
63
|
+
latin1_chars,
|
|
64
|
+
encoding="iso-8859-1",
|
|
65
|
+
)
|
|
66
|
+
content = path.read_text(encoding=CURRENT_ENCODING)
|
|
67
|
+
fake_context = self.create_file_plugin_context(
|
|
68
|
+
nasl_file=path, file_content=content, lines=content.splitlines()
|
|
69
|
+
)
|
|
70
|
+
plugin = CheckEncoding(fake_context)
|
|
71
|
+
|
|
72
|
+
results = list(plugin.run())
|
|
73
|
+
|
|
74
|
+
self.assertEqual(len(results), 0)
|
|
75
|
+
|
|
76
|
+
def test_specific_latin1_chars_utf8_encoding_fails(self):
|
|
77
|
+
"""Test that specific Latin-1 characters fail when saved as UTF-8.
|
|
78
|
+
|
|
79
|
+
This specifically tests the JIRA VTOPS-281 reported issue where 'ä' and '®'
|
|
80
|
+
cause encoding problems when saved as UTF-8 but read as ISO-8859-1.
|
|
81
|
+
"""
|
|
82
|
+
with self.create_directory() as tempdir:
|
|
83
|
+
path = tempdir / "file.nasl"
|
|
84
|
+
|
|
85
|
+
# Specific characters that were problematic: ä (U+00E4) and ® (U+00AE)
|
|
86
|
+
path.write_text(
|
|
87
|
+
"This contains ä and ® characters",
|
|
88
|
+
encoding="utf-8",
|
|
89
|
+
)
|
|
90
|
+
content = path.read_text(encoding=CURRENT_ENCODING)
|
|
91
|
+
fake_context = self.create_file_plugin_context(
|
|
92
|
+
nasl_file=path, file_content=content, lines=content.splitlines()
|
|
93
|
+
)
|
|
94
|
+
plugin = CheckEncoding(fake_context)
|
|
95
|
+
|
|
96
|
+
results = list(plugin.run())
|
|
97
|
+
|
|
98
|
+
self.assertEqual(len(results), 2)
|
|
99
|
+
self.assertIsInstance(results[0], LinterError)
|
|
100
|
+
self.assertEqual(
|
|
101
|
+
"Detected encoding 'UTF-8' is not Latin-1 compatible.",
|
|
102
|
+
results[0].message,
|
|
103
|
+
)
|
|
104
|
+
self.assertIsInstance(results[1], LinterError)
|
|
105
|
+
self.assertEqual(
|
|
106
|
+
"Likely UTF-8 multibyte sequence found in line 1",
|
|
107
|
+
results[1].message,
|
|
108
|
+
)
|
|
109
|
+
|
|
47
110
|
def test_some_invalid_characters(self):
|
|
48
111
|
with self.create_directory() as tempdir:
|
|
49
112
|
path = tempdir / "file.nasl"
|
|
@@ -61,22 +124,18 @@ class CheckEncodingTestCase(PluginTestCase):
|
|
|
61
124
|
|
|
62
125
|
results = list(plugin.run())
|
|
63
126
|
|
|
64
|
-
self.assertEqual(len(results),
|
|
127
|
+
self.assertEqual(len(results), 2)
|
|
65
128
|
|
|
66
129
|
self.assertIsInstance(results[0], LinterError)
|
|
67
130
|
self.assertEqual(
|
|
68
|
-
"
|
|
69
|
-
"Allowed encodings are ascii, latin_1.",
|
|
131
|
+
"Detected encoding 'UTF-8' is not Latin-1 compatible.",
|
|
70
132
|
results[0].message,
|
|
71
133
|
)
|
|
134
|
+
self.assertIsInstance(results[1], LinterError)
|
|
72
135
|
self.assertEqual(
|
|
73
|
-
"
|
|
136
|
+
"Likely UTF-8 multibyte sequence found in line 1",
|
|
74
137
|
results[1].message,
|
|
75
138
|
)
|
|
76
|
-
self.assertEqual(
|
|
77
|
-
"Found invalid character in line: 2",
|
|
78
|
-
results[2].message,
|
|
79
|
-
)
|
|
80
139
|
|
|
81
140
|
def test_invisible_whitespace(self):
|
|
82
141
|
with self.create_directory() as tempdir:
|
|
@@ -95,10 +154,14 @@ class CheckEncodingTestCase(PluginTestCase):
|
|
|
95
154
|
|
|
96
155
|
results = list(plugin.run())
|
|
97
156
|
|
|
98
|
-
self.assertEqual(len(results),
|
|
157
|
+
self.assertEqual(len(results), 2)
|
|
99
158
|
self.assertIsInstance(results[0], LinterError)
|
|
100
159
|
self.assertEqual(
|
|
101
|
-
"
|
|
102
|
-
"Allowed encodings are ascii, latin_1.",
|
|
160
|
+
"Detected encoding 'UTF-8' is not Latin-1 compatible.",
|
|
103
161
|
results[0].message,
|
|
104
162
|
)
|
|
163
|
+
self.assertIsInstance(results[1], LinterError)
|
|
164
|
+
self.assertEqual(
|
|
165
|
+
"Likely UTF-8 multibyte sequence found in line 1",
|
|
166
|
+
results[1].message,
|
|
167
|
+
)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Copyright (C) 2022 Greenbone AG
|
|
2
|
+
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
3
|
+
|
|
4
|
+
from typing import Iterator
|
|
5
|
+
|
|
6
|
+
import magic
|
|
7
|
+
|
|
8
|
+
from troubadix.plugin import (
|
|
9
|
+
FilePlugin,
|
|
10
|
+
LinterError,
|
|
11
|
+
LinterResult,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
# OpenVAS decodes NASL files using ISO-8859-1 (Latin-1).
|
|
15
|
+
# Files saved in other encodings (like UTF-8)
|
|
16
|
+
# will be misinterpreted and cause errors or garbled text.
|
|
17
|
+
# US-ASCII is also allowed since it's a subset of ISO-8859-1.
|
|
18
|
+
ALLOWED_ENCODINGS = ["iso-8859-1", "us-ascii"]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class CheckEncoding(FilePlugin):
|
|
22
|
+
"""
|
|
23
|
+
Check if the encoding of the NASL file is ISO-8859-1 (Latin-1) encoded.
|
|
24
|
+
Finds UTF-8 multibyte sequences that are composed of individually valid Latin-1 bytes,
|
|
25
|
+
but result in garbled text.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
name = "check_encoding"
|
|
29
|
+
|
|
30
|
+
def run(self) -> Iterator[LinterResult]:
|
|
31
|
+
with open(self.context.nasl_file, "rb") as f:
|
|
32
|
+
raw = f.read()
|
|
33
|
+
|
|
34
|
+
# Use magic to detect encoding
|
|
35
|
+
detected_encoding = magic.Magic(mime_encoding=True).from_buffer(raw)
|
|
36
|
+
|
|
37
|
+
if detected_encoding not in ALLOWED_ENCODINGS:
|
|
38
|
+
yield LinterError(
|
|
39
|
+
f"Detected encoding '{detected_encoding.upper()}' is not Latin-1 compatible.",
|
|
40
|
+
file=self.context.nasl_file,
|
|
41
|
+
plugin=self.name,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
def has_utf8_multibyte(data: bytes) -> bool:
|
|
45
|
+
"""
|
|
46
|
+
Function to detect UTF-8 multibyte sequences by checking the first two bytes.
|
|
47
|
+
UTF-8 multibyte sequences start with a lead byte followed by continuation bytes.
|
|
48
|
+
|
|
49
|
+
Lead byte ranges:
|
|
50
|
+
- 2-byte: 0xC2–0xDF (110xxxxx, excluding 0xC0–0xC1 to avoid overlongs)
|
|
51
|
+
- 3-byte: 0xE0–0xEF (1110xxxx)
|
|
52
|
+
- 4-byte: 0xF0–0xF4 (11110xxx)
|
|
53
|
+
These ranges are continuous, so we can check 0xC2–0xF4 as a single range.
|
|
54
|
+
11000010 C2 -- F4 11110111
|
|
55
|
+
|
|
56
|
+
Continuation bytes: 0x80–0xBF (10yyyyyy)
|
|
57
|
+
10000000 80 -- BF 10111111
|
|
58
|
+
|
|
59
|
+
Lead and continuation byte values are either not valid Latin-1 or special symbols
|
|
60
|
+
that are unlikely to be following each other in normal use.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
for i in range(len(data) - 1):
|
|
64
|
+
first = data[i]
|
|
65
|
+
second = data[i + 1]
|
|
66
|
+
if 0xC2 <= first <= 0xF4 and 0x80 <= second <= 0xBF:
|
|
67
|
+
return True
|
|
68
|
+
return False
|
|
69
|
+
|
|
70
|
+
lines = raw.split(b"\n")
|
|
71
|
+
for i, line_bytes in enumerate(lines, start=1):
|
|
72
|
+
if has_utf8_multibyte(line_bytes):
|
|
73
|
+
yield LinterError(
|
|
74
|
+
f"Likely UTF-8 multibyte sequence found in line {i}",
|
|
75
|
+
file=self.context.nasl_file,
|
|
76
|
+
plugin=self.name,
|
|
77
|
+
line=i,
|
|
78
|
+
)
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
# Copyright (C) 2022 Greenbone AG
|
|
2
|
-
#
|
|
3
|
-
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
4
|
-
#
|
|
5
|
-
# This program is free software: you can redistribute it and/or modify
|
|
6
|
-
# it under the terms of the GNU General Public License as published by
|
|
7
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
# (at your option) any later version.
|
|
9
|
-
#
|
|
10
|
-
# This program is distributed in the hope that it will be useful,
|
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
# GNU General Public License for more details.
|
|
14
|
-
#
|
|
15
|
-
# You should have received a copy of the GNU General Public License
|
|
16
|
-
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
-
|
|
18
|
-
import re
|
|
19
|
-
from pathlib import Path
|
|
20
|
-
from typing import Iterable, Iterator
|
|
21
|
-
|
|
22
|
-
import charset_normalizer
|
|
23
|
-
|
|
24
|
-
from troubadix.plugin import LineContentPlugin, LinterError, LinterResult
|
|
25
|
-
|
|
26
|
-
# Only the ASCII and extended ASCII for now... # https://www.ascii-code.com/
|
|
27
|
-
# CHAR_SET = r"[^\x00-\xFF]"
|
|
28
|
-
# Temporary only check for chars in between 7f-9f, like in the old Feed-QA...
|
|
29
|
-
INVALID_CHAR_PATTERN = re.compile(r"[\x7F-\x9F]")
|
|
30
|
-
|
|
31
|
-
ALLOWED_ENCODINGS = ["ascii", "latin_1"]
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class CheckEncoding(LineContentPlugin):
|
|
35
|
-
name = "check_encoding"
|
|
36
|
-
|
|
37
|
-
def check_lines(
|
|
38
|
-
self,
|
|
39
|
-
nasl_file: Path,
|
|
40
|
-
lines: Iterable[str],
|
|
41
|
-
) -> Iterator[LinterResult]:
|
|
42
|
-
match = charset_normalizer.from_path(
|
|
43
|
-
nasl_file, threshold=0.4, cp_isolation=ALLOWED_ENCODINGS
|
|
44
|
-
).best()
|
|
45
|
-
|
|
46
|
-
if not match:
|
|
47
|
-
yield LinterError(
|
|
48
|
-
f"VT uses a wrong encoding. "
|
|
49
|
-
f"Allowed encodings are {', '.join(ALLOWED_ENCODINGS)}.",
|
|
50
|
-
file=nasl_file,
|
|
51
|
-
plugin=self.name,
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
for index, line in enumerate(lines, 1):
|
|
55
|
-
encoding = INVALID_CHAR_PATTERN.search(line)
|
|
56
|
-
if encoding:
|
|
57
|
-
yield LinterError(
|
|
58
|
-
f"Found invalid character in line: {index}",
|
|
59
|
-
file=nasl_file,
|
|
60
|
-
plugin=self.name,
|
|
61
|
-
line=index,
|
|
62
|
-
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/fail_badwords.nasl
RENAMED
|
File without changes
|
|
File without changes
|
{troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/fail_name_newline.nasl
RENAMED
|
File without changes
|
|
File without changes
|
{troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/runner/fail.nasl
RENAMED
|
File without changes
|
{troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/runner/fail2.nasl
RENAMED
|
File without changes
|
{troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_files/nasl/21.04/runner/test.nasl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{troubadix-25.10.8 → troubadix-25.10.9}/tests/plugins/test_variable_redefinition_in_foreach.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/changed_packages/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/changed_packages/test_package.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{troubadix-25.10.8 → troubadix-25.10.9}/tests/standalone_plugins/test_changed_creation_date.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|