codeaudit 1.8.0__tar.gz → 1.8.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.
- {codeaudit-1.8.0 → codeaudit-1.8.1}/CHANGELOG.md +16 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/PKG-INFO +2 -2
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/codeauditcommands.md +1 -1
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/ca_api_example_basic.ipynb +1 -1
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/codeauditchecks.html +1 -1
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/demoscan.json +2 -2
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/installation.md +5 -1
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/intro.md +17 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/pyproject.toml +2 -2
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/__about__.py +1 -1
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/api_helpers.py +7 -1
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/api_interfaces.py +93 -3
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/checkmodules.py +30 -2
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/dashboard_reports.py +7 -3
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/data/secretslist.txt +2 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/dashboardapp.py +7 -1
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/pyodide/dashboardapp.html +9 -9
- codeaudit-1.8.1/src/dashboard/pyodide/deployed/dashboardapp.html +295 -0
- codeaudit-1.8.1/src/dashboard/pyodide/deployed/dashboardapp_171.js +91 -0
- codeaudit-1.8.1/src/dashboard/pyodide/deployed/dashboardapp_180.html +295 -0
- codeaudit-1.8.1/src/dashboard/pyodide/deployed/dashboardapp_180.js +91 -0
- codeaudit-1.8.1/tests/unit_tests/test_clean_import_list.py +58 -0
- codeaudit-1.8.0/src/dashboard/pyodide/deployed/dashboardapp.js +0 -91
- codeaudit-1.8.0/src/dashboard/pyodide/deployed/dashboardapp_version166.html +0 -295
- codeaudit-1.8.0/src/dashboard/pyodide/deployed/dashboardapp_version166.js +0 -91
- {codeaudit-1.8.0 → codeaudit-1.8.1}/.github/workflows/python-test.yml +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/.gitignore +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/CONTRIBUTE.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/LICENSE.txt +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/README.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/SECURITY.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/.gitignore +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/class_index.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/coverage_html_cb_dd2e7eb5.js +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/favicon_32_cb_c827f16f.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/function_index.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/index.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/keybd_closed_cb_900cfef5.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/status.json +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/style_cb_9ff733b0.css +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8___about___py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8___init___py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_altairplots_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_api_helpers_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_api_interfaces_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_api_reporting_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_checkmodules_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_codeaudit_dashboard_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_codeaudit_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_complexitycheck_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_dashboard_reports_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_filehelpfunctions_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_htmlhelpfunctions_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_issuevalidations_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_privacy_lint_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_pypi_package_scan_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_reporting_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_security_checks_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_suppression_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/cov_html/z_15dab3f49bf85fa8_totals_py.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/CLIcommands.ipynb +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/CONTRIBUTE.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/_config.yml +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/_static/nocxstyle.css +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/_toc.yml +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/about.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/apidocs/api_intro.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/apidocs/codeaudit.rst +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/apidocs/modules.rst +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/architecture.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/changelog.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/assert_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/base64_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/binding_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/builtinfunctions_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/chmod_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/directorycreation_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/dynamicimport_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/exception_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/ftp_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/hash_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/httpserver_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/input_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/loggingconf_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/marshal_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/mktemp_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/multiprocessing_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/pickle_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/random_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/shelve_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/shutil_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/subprocess_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/syscalls_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/systemcalls_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/tarfile_extract_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/xml_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checks/zipfile_check.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/checksinformation.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/cimode.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/codeauditchecks.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/codeauditoverview.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/complexitycheck.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/data_egress_implementation.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/data_exfiltration_detection.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/ca_api_example_checks.ipynb +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/ca_api_example_json.ipynb +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/ca_api_example_overview.ipynb +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/ca_api_example_scanning.ipynb +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/ca_checks.ipynb +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/demofile.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/directoryscan.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/example_risk_heatmap.ipynb +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/example_weakness_perfile_view.ipynb +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/filescan.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/modulescan.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/examples/overview.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/features.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/filescan.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/filescan.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/handling_errors.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/help.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/howtoscan.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/OO.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/ROI_logo.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/YourLogoHere.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/ai_use.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/architecture_overview.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/codeauditlogo.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/filescan_screenshot_16012026.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/modulescan_screenshot_16012026.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/nocxbanner.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/overview_linkaudit.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/images/overview_screenshot_16012026.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/implementedvalidations.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/issues.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/license.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/makeitbetter.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/markingissues.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/modulescan.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/overviewplot.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/pca_overview.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/project_philosophy.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/sponsors.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/userguide.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/warnings.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/whatissast.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/docs/whysast.md +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/filescan.png +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/__init__.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/altairplots.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/api_reporting.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/ci_workflowscan.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/complexitycheck.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/corecli.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/data/sastchecks.csv +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/filehelpfunctions.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/htmlhelpfunctions.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/issuevalidations.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/privacy_lint.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/pypi_package_scan.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/reporting.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/security_checks.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/simple.css +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/suppression.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/codeaudit/totals.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/__init__.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/module_load_validation.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/module_load_validation2.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/pyodide/dashboardapp.js +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/pyodide/dashboardapp_171.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/pyodide/dashboardapp_171.js +0 -0
- {codeaudit-1.8.0/src/dashboard/pyodide/deployed → codeaudit-1.8.1/src/dashboard/pyodide}/dashboardapp_version162.html +0 -0
- {codeaudit-1.8.0/src/dashboard/pyodide/deployed → codeaudit-1.8.1/src/dashboard/pyodide}/dashboardapp_version162.js +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/pyodide/dashboardapp_version166.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/pyodide/dashboardapp_version166.js +0 -0
- /codeaudit-1.8.0/src/dashboard/pyodide/deployed/dashboardapp_171.js → /codeaudit-1.8.1/src/dashboard/pyodide/deployed/dashboardapp.js +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/pyodide/deployed/dashboardapp_171.html +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/src/dashboard/requirements.txt +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/__init__.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/count_lines_file1.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/spytestdir/clean.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/spytestdir/elastic.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/spytestdir/example1.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/spytestdir/klyne.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/spytestdir/mixed.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/spytestdir/telemetry.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/spytestdir/telemetryfile2.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/suppression/sastsuppression_0.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/suppression/sastsuppression_1.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/suppression/sastsuppression_2.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_apicalls.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_apicalls2.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_base64.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_basicpatterns.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_chmod.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_constructspart2.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_correctexceptionuse.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_count_commentlines.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_directorycreation.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_directorycreation2.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_dynamic_import.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_edgecases.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_ftp.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_hashstrenght.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_importlib_util.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_modulecheck.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_obfuscatingbuiltins.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_oschecks.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_pylintreport.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_pypiscan.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_random.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_secretfinding.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_standardlibconstructs.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_subprocess.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_suppression.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_suppressionlogic.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_totalscheck.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_wasmsafe_funtions.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/test_zstd.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/unit_tests/__init__.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/unit_tests/test_collectsourcefiles.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/unit_tests/test_count_weaknesses.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/unit_tests/test_filehelpfunctions.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/unit_tests/test_readinsourcefile.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/allshit.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/apivalidations.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/assert.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/base64.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/chmod_things.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/codeaudit_scan.json +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/complexitycheck.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/correctcounts.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/danger_imports.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/directorycreation.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/directorycreation2.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/dunderexec_with_parsing_error.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/eval.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/eval2.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/exception.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/file3.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/file_with_warnings.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/ftp.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/gzip.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/hashcheck.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/httpserver.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/inputstatement.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/malware.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/malwareAI.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/marshal.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/modulecheck.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/multiprocessing.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/obfuscating.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/oschecks.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/pickle.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/python2_file_willnotwork.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/random.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/shelve.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/shutil.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/subprocess.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/syslibrary.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/tarfilevalidation.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/tempcheck.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/validation1.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/validation2.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/xml.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/zipfile.py +0 -0
- {codeaudit-1.8.0 → codeaudit-1.8.1}/tests/validationfiles/zstd.py +0 -0
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## Version 1.8.1:
|
|
4
|
+
|
|
5
|
+
**Added**
|
|
6
|
+
- Dashboard: Updated info text on Dashboard version.
|
|
7
|
+
- Updated secrets list for egress scanning.
|
|
8
|
+
|
|
9
|
+
**Changed**
|
|
10
|
+
- Reporting (WASM version): Updated imported modules display logic—submodules and private modules are now hidden so that only real imported external modules are shown.
|
|
11
|
+
|
|
12
|
+
**Fixed**
|
|
13
|
+
- Reporting (WASM version): Resolved an error in the imported modules.
|
|
14
|
+
|
|
15
|
+
**Documentation**
|
|
16
|
+
- Improved API documentation.
|
|
17
|
+
- Various minor improvements.
|
|
18
|
+
|
|
3
19
|
## Version 1.8.0:
|
|
4
20
|
|
|
5
21
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codeaudit
|
|
3
|
-
Version: 1.8.
|
|
3
|
+
Version: 1.8.1
|
|
4
4
|
Summary: A modern Python security source code analyzer (SAST) based on distrust.
|
|
5
5
|
Project-URL: Homepage, https://codeaudit.nocomplexity.com
|
|
6
6
|
Project-URL: Documentation, https://github.com/nocomplexity/codeaudit#readme
|
|
@@ -10,7 +10,7 @@ Author-email: Maikel Mardjan <mike@bm-support.org>
|
|
|
10
10
|
License-Expression: GPL-3.0-or-later
|
|
11
11
|
License-File: LICENSE.txt
|
|
12
12
|
Keywords: Complexity Checker,Python SAST,SAST,SAST API
|
|
13
|
-
Classifier: Development Status ::
|
|
13
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
14
14
|
Classifier: Environment :: Console
|
|
15
15
|
Classifier: Intended Audience :: Developers
|
|
16
16
|
Classifier: Intended Audience :: Science/Research
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
"id": "98422d63-ec29-49b2-bb4c-3912288cb584",
|
|
116
116
|
"metadata": {},
|
|
117
117
|
"source": [
|
|
118
|
-
"##
|
|
118
|
+
"## Security Assessment of Module Vulnerabilities\n",
|
|
119
119
|
"\n",
|
|
120
120
|
"This API retrieves security vulnerability data for external modules via the [OSV (Open Source Vulnerability) Database](https://nocomplexity.com/documents/securityarchitecture/references/vulnerabilitydatabases.html#vulnerability-databases).\n",
|
|
121
121
|
"\n",
|
|
@@ -774,4 +774,4 @@ footer {
|
|
|
774
774
|
<td>Vulnerable to path traversal attacks if used with untrusted archives.</td>
|
|
775
775
|
</tr>
|
|
776
776
|
</tbody>
|
|
777
|
-
</table><br><p>Number of implemented security validations:<b>89</b></p><p>Version of codeaudit: <b>1.8.
|
|
777
|
+
</table><br><p>Number of implemented security validations:<b>89</b></p><p>Version of codeaudit: <b>1.8.1</b><p>Because Python and cybersecurity are constantly changing, issue reports <b>SHOULD</b> specify the codeaudit version used.</p><p><b>Disclaimer:</b> <i>This SAST tool <a href="https://github.com/nocomplexity/codeaudit" target="_blank"><b>Python Code Audit</b></a> provides a powerful, automatic security analysis for Python source code. However, it's not a substitute for human review in combination with business knowledge. Undetected vulnerabilities may still exist.</i></p><p>This Python security report was created on: <b>2026-07-31 13:23</b> with <a href="https://github.com/nocomplexity/codeaudit" target="_blank"><b>Python Code Audit</b></a> version <b>1.8.1</b></p><hr><footer><div class="footer-links">Check the <a href="https://nocomplexity.com/documents/codeaudit/intro.html" target="_blank">documentation</a> for help on found issues.<br>Codeaudit is made with <span class="heart">❤</span> by cyber security professionals who advocate for <a href="https://nocomplexity.com/simplify-security/" target="_blank">open simple security solutions</a>.<br><a href="https://nocomplexity.com/documents/codeaudit/CONTRIBUTE.html" target="_blank">Join the community</a> and contribute to make this tool better!</div></footer></div></body></html>
|
|
@@ -12,7 +12,11 @@ Launch web-based version
|
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
:::{note}
|
|
15
|
-
The browser-based version runs 100% locally
|
|
15
|
+
The browser-based version runs 100% locally in your browser.
|
|
16
|
+
No data is ever sent to a server. No analytics. No telemetry.
|
|
17
|
+
|
|
18
|
+
Please note that not all functionality is available. You can perform a security scan on packages available from PyPI.
|
|
19
|
+
|
|
16
20
|
:::
|
|
17
21
|
|
|
18
22
|
## Install for full functionality
|
|
@@ -10,6 +10,23 @@
|
|
|
10
10
|
|
|
11
11
|
**Python Code Audit** is a Static Application **Security** Testing (SAST) tool used to find **security weaknesses** in Python code.
|
|
12
12
|
|
|
13
|
+
::::{grid}
|
|
14
|
+
:gutter: 3
|
|
15
|
+
|
|
16
|
+
:::{grid-item-card}
|
|
17
|
+
{octicon}`rocket;4em;caption-text` **Launch Web version**
|
|
18
|
+
|
|
19
|
+
Audit Python packages instantly. No install required. Perfect for scanning PyPI packages before you use them. Runs entirely in your browser. Zero data sent to servers. No analytics. No telemetry. Ever.
|
|
20
|
+
|
|
21
|
+
+++
|
|
22
|
+
|
|
23
|
+
```{button-link} https://nocomplexity.com/codeauditapp/dashboardapp.html
|
|
24
|
+
:color: danger
|
|
25
|
+
:align: center
|
|
26
|
+
Launch
|
|
27
|
+
```
|
|
28
|
+
:::
|
|
29
|
+
::::
|
|
13
30
|
|
|
14
31
|
::::{grid} 2
|
|
15
32
|
:class-container: text-center
|
|
@@ -19,8 +19,8 @@ classifiers = [
|
|
|
19
19
|
"Intended Audience :: Developers",
|
|
20
20
|
"Intended Audience :: Science/Research",
|
|
21
21
|
"Topic :: Security",
|
|
22
|
-
"Topic :: Software Development :: Quality Assurance",
|
|
23
|
-
"Development Status ::
|
|
22
|
+
"Topic :: Software Development :: Quality Assurance",
|
|
23
|
+
"Development Status :: 5 - Production/Stable",
|
|
24
24
|
"Programming Language :: Python",
|
|
25
25
|
"Programming Language :: Python :: 3.11",
|
|
26
26
|
"Programming Language :: Python :: 3.12",
|
|
@@ -12,7 +12,12 @@ You should have received a copy of the GNU General Public License along with thi
|
|
|
12
12
|
Function to create nice APIs. So API helper functions.
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
|
-
from codeaudit.api_interfaces import
|
|
15
|
+
from codeaudit.api_interfaces import (
|
|
16
|
+
get_modules,
|
|
17
|
+
get_overview,
|
|
18
|
+
_build_weakness_details,
|
|
19
|
+
package_imports,
|
|
20
|
+
)
|
|
16
21
|
from codeaudit.checkmodules import get_all_modules
|
|
17
22
|
from codeaudit.filehelpfunctions import (
|
|
18
23
|
collect_python_source_files,
|
|
@@ -77,6 +82,7 @@ def _codeaudit_directory_scan_wasm(input_path, nosec_flag):
|
|
|
77
82
|
"statistics_overview": package_overview,
|
|
78
83
|
"module_overview": modules_discovered,
|
|
79
84
|
}
|
|
85
|
+
|
|
80
86
|
# File scanning
|
|
81
87
|
for i, file in enumerate(files_to_check):
|
|
82
88
|
try:
|
|
@@ -31,7 +31,10 @@ from codeaudit.checkmodules import (
|
|
|
31
31
|
get_all_modules,
|
|
32
32
|
get_imported_modules_by_file,
|
|
33
33
|
get_standard_library_modules,
|
|
34
|
+
get_python_files_from_package,
|
|
34
35
|
)
|
|
36
|
+
|
|
37
|
+
|
|
35
38
|
from codeaudit.filehelpfunctions import (
|
|
36
39
|
collect_python_source_files,
|
|
37
40
|
get_filename_from_path,
|
|
@@ -152,6 +155,13 @@ def filescan(input_path, nosec=False):
|
|
|
152
155
|
try:
|
|
153
156
|
scan_output = _codeaudit_directory_scan(src_dir, nosec_flag=nosec)
|
|
154
157
|
output |= scan_output
|
|
158
|
+
# Replace the value of "imported_modules" in the nested dict
|
|
159
|
+
correct_imported_modules = package_imports(output)
|
|
160
|
+
output["module_overview"]["imported_modules"] = correct_imported_modules
|
|
161
|
+
# correct statistics for modules count in a package
|
|
162
|
+
output["statistics_overview"]["External Modules"] = len(
|
|
163
|
+
correct_imported_modules
|
|
164
|
+
)
|
|
155
165
|
finally:
|
|
156
166
|
# Cleaning up temp directory
|
|
157
167
|
tmp_handle.cleanup() # deletes everything from temp directory
|
|
@@ -310,12 +320,67 @@ def get_weakness_counts(input_file, nosec=False):
|
|
|
310
320
|
return dict(counter)
|
|
311
321
|
|
|
312
322
|
|
|
323
|
+
def package_imports(scanresult):
|
|
324
|
+
"""Return the external Python modules imported by a scanned package.
|
|
325
|
+
|
|
326
|
+
This function extracts the list of imported modules from a SAST scan and
|
|
327
|
+
filters out modules that belong to the package itself. If a package name is
|
|
328
|
+
available, the returned module names are further normalized by removing
|
|
329
|
+
imports that resolve to the package's own namespace.
|
|
330
|
+
|
|
331
|
+
Args:
|
|
332
|
+
scanresult (dict): Scan result containing package metadata. The
|
|
333
|
+
dictionary is expected to contain a ``module_overview`` mapping with
|
|
334
|
+
an ``imported_modules`` list. Optionally, it may include a
|
|
335
|
+
``package_name`` key used for additional filtering.
|
|
336
|
+
|
|
337
|
+
Returns:
|
|
338
|
+
list[str] | None: A list of external module names imported by the
|
|
339
|
+
package. Returns ``None`` if ``scanresult`` is not a dictionary or if
|
|
340
|
+
the expected ``module_overview`` or ``imported_modules`` entries are
|
|
341
|
+
missing or have an invalid type.
|
|
342
|
+
|
|
343
|
+
Example:
|
|
344
|
+
scanresult = filescan("packagename") E.g.:
|
|
345
|
+
|
|
346
|
+
>> scanresult = filescan("codeaudit") # Current version, without SAST details
|
|
347
|
+
|
|
348
|
+
>> modules_discovered = scanresult["module_overview"]
|
|
349
|
+
|
|
350
|
+
>> imported_modules = modules_discovered["imported_modules"]
|
|
351
|
+
|
|
352
|
+
>> imported_modules
|
|
353
|
+
['altair', 'fire', 'pandas', 'panel', 'pyodide.http']
|
|
354
|
+
"""
|
|
355
|
+
if not isinstance(scanresult, dict):
|
|
356
|
+
return None
|
|
357
|
+
|
|
358
|
+
module_overview = scanresult.get("module_overview")
|
|
359
|
+
if not isinstance(module_overview, dict):
|
|
360
|
+
return None
|
|
361
|
+
|
|
362
|
+
imported_modules = module_overview.get("imported_modules")
|
|
363
|
+
if not isinstance(imported_modules, list):
|
|
364
|
+
return None
|
|
365
|
+
|
|
366
|
+
package_files = set(get_python_files_from_package(scanresult))
|
|
367
|
+
external_modules = [
|
|
368
|
+
module for module in imported_modules if module not in package_files
|
|
369
|
+
]
|
|
370
|
+
|
|
371
|
+
package_name = scanresult.get("package_name")
|
|
372
|
+
if package_name:
|
|
373
|
+
external_modules = _clean_import_list(external_modules, package_name)
|
|
374
|
+
|
|
375
|
+
return external_modules
|
|
376
|
+
|
|
377
|
+
|
|
313
378
|
def get_modules(filename):
|
|
314
|
-
"""Extract
|
|
379
|
+
"""Extract modules used in a Python source file.
|
|
315
380
|
|
|
316
381
|
Analyzes the specified Python file and returns the modules imported
|
|
317
382
|
directly within the source code. This approach relies on the actual
|
|
318
|
-
imports present in the file rather than dependency declarations such as
|
|
383
|
+
imports **present** in the file rather than dependency declarations such as
|
|
319
384
|
``requirements.txt`` or ``pyproject.toml``, which may be incomplete or
|
|
320
385
|
outdated.
|
|
321
386
|
|
|
@@ -325,7 +390,7 @@ def get_modules(filename):
|
|
|
325
390
|
Returns:
|
|
326
391
|
dict: A dictionary containing discovered modules. Expected keys are:
|
|
327
392
|
- ``core_modules`` (list[str]): Standard library modules.
|
|
328
|
-
- ``imported_modules`` (list[str]):
|
|
393
|
+
- ``imported_modules`` (list[str]): Imported modules in the file and third-party modules.
|
|
329
394
|
"""
|
|
330
395
|
modules_found = get_imported_modules_by_file(filename)
|
|
331
396
|
return modules_found
|
|
@@ -756,3 +821,28 @@ def _collect_issue_lines(filename, line, context=1):
|
|
|
756
821
|
)
|
|
757
822
|
|
|
758
823
|
return code_lines
|
|
824
|
+
|
|
825
|
+
|
|
826
|
+
def _clean_import_list(modules, package):
|
|
827
|
+
"""Return a cleaned list of importable module names.
|
|
828
|
+
|
|
829
|
+
Removes the specified package, all of its submodules, and any private
|
|
830
|
+
modules whose final name component begins with an underscore.
|
|
831
|
+
|
|
832
|
+
Args:
|
|
833
|
+
modules (Iterable[str]): Module names to filter.
|
|
834
|
+
package (str): Package name to exclude.
|
|
835
|
+
|
|
836
|
+
Returns:
|
|
837
|
+
list[str]: Filtered module names.
|
|
838
|
+
"""
|
|
839
|
+
cleaned_list = [
|
|
840
|
+
module
|
|
841
|
+
for module in modules
|
|
842
|
+
if (
|
|
843
|
+
module != package
|
|
844
|
+
and not module.startswith(f"{package}.")
|
|
845
|
+
and not module.rsplit(".", 1)[-1].startswith("_")
|
|
846
|
+
)
|
|
847
|
+
]
|
|
848
|
+
return cleaned_list
|
|
@@ -19,6 +19,7 @@ import sys
|
|
|
19
19
|
import urllib.request
|
|
20
20
|
|
|
21
21
|
from codeaudit.filehelpfunctions import collect_python_source_files, read_in_source_file
|
|
22
|
+
from pathlib import Path
|
|
22
23
|
|
|
23
24
|
|
|
24
25
|
def get_imported_modules(source_code):
|
|
@@ -56,7 +57,16 @@ def get_imported_modules(source_code):
|
|
|
56
57
|
|
|
57
58
|
|
|
58
59
|
def get_standard_library_modules():
|
|
59
|
-
"""
|
|
60
|
+
"""Return the names of public Python standard library modules.
|
|
61
|
+
|
|
62
|
+
Requires Python 3.10 or later, where ``sys.stdlib_module_names`` is
|
|
63
|
+
available. Private modules (those whose names begin with ``"_"``) are
|
|
64
|
+
excluded from the result.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
list[str]: A sorted list of public standard library module names.
|
|
68
|
+
Returns an empty list if ``sys.stdlib_module_names`` is unavailable.
|
|
69
|
+
"""
|
|
60
70
|
names = []
|
|
61
71
|
if hasattr(sys, "stdlib_module_names"):
|
|
62
72
|
core_modules = sorted(list(sys.stdlib_module_names))
|
|
@@ -141,7 +151,7 @@ def get_all_modules(directory_to_scan):
|
|
|
141
151
|
|
|
142
152
|
|
|
143
153
|
def get_imported_modules_by_file(python_file_name):
|
|
144
|
-
"Function to get all modules of a single Python file - never trust requirements.txt or project.toml"
|
|
154
|
+
"Function to get all modules of a single(!) Python file - never trust requirements.txt or project.toml"
|
|
145
155
|
source = read_in_source_file(python_file_name)
|
|
146
156
|
used_modules = get_imported_modules(source)
|
|
147
157
|
core_modules = used_modules["core_modules"]
|
|
@@ -151,3 +161,21 @@ def get_imported_modules_by_file(python_file_name):
|
|
|
151
161
|
"imported_modules": sorted(external_modules),
|
|
152
162
|
}
|
|
153
163
|
return all_modules_discovered
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def get_python_files_from_package(scanresult):
|
|
167
|
+
"""Return a list of Python filenames (without .py) in a nested dict/list."""
|
|
168
|
+
filenames = []
|
|
169
|
+
|
|
170
|
+
if isinstance(scanresult, dict):
|
|
171
|
+
if "FileName" in scanresult:
|
|
172
|
+
filenames.append(Path(scanresult["FileName"]).stem)
|
|
173
|
+
|
|
174
|
+
for value in scanresult.values():
|
|
175
|
+
filenames.extend(get_python_files_from_package(value))
|
|
176
|
+
|
|
177
|
+
elif isinstance(scanresult, list):
|
|
178
|
+
for item in scanresult:
|
|
179
|
+
filenames.extend(get_python_files_from_package(item))
|
|
180
|
+
|
|
181
|
+
return filenames
|
|
@@ -15,6 +15,7 @@ API functions: Used for dashboard reporting (Panel / WASM) and notebooks, or to
|
|
|
15
15
|
from codeaudit.__about__ import __version__
|
|
16
16
|
from codeaudit.pypi_package_scan import get_latest_release_date, days_since_update
|
|
17
17
|
from codeaudit.api_reporting import total_weaknesses
|
|
18
|
+
from codeaudit.api_interfaces import _clean_import_list, package_imports
|
|
18
19
|
|
|
19
20
|
SAST_REPORT_CSS = """
|
|
20
21
|
<style>
|
|
@@ -384,17 +385,19 @@ def report_used_modules(scanresult):
|
|
|
384
385
|
return "<br><h2>⚠️ No scan result provided</h2>"
|
|
385
386
|
modules_discovered = scanresult["module_overview"]
|
|
386
387
|
core_modules = modules_discovered["core_modules"]
|
|
387
|
-
external_modules = modules_discovered["imported_modules"]
|
|
388
|
+
# external_modules = modules_discovered["imported_modules"]
|
|
389
|
+
external_modules = package_imports(scanresult)
|
|
390
|
+
package_name = scanresult.get("package_name")
|
|
391
|
+
if package_name:
|
|
392
|
+
external_modules = _clean_import_list(external_modules, package_name)
|
|
388
393
|
card1 += "<details>"
|
|
389
394
|
card1 += "<summary><b>Used Python Standard libraries</b></summary>"
|
|
390
|
-
|
|
391
395
|
card1 += (
|
|
392
396
|
"<ul>\n"
|
|
393
397
|
+ "\n".join(f" <li>{module}</li>" for module in core_modules)
|
|
394
398
|
+ "\n</ul>"
|
|
395
399
|
)
|
|
396
400
|
card1 += "</details>"
|
|
397
|
-
|
|
398
401
|
card2 = "<details>"
|
|
399
402
|
card2 += "<summary><b>Imported libraries (modules)</b></summary>"
|
|
400
403
|
card2 += (
|
|
@@ -442,6 +445,7 @@ def get_info_text():
|
|
|
442
445
|
"""
|
|
443
446
|
<p><b>Python Code Audit</b> is a Static Application Security Testing (SAST) tool used to find security weaknesses in Python code.</p>
|
|
444
447
|
<p>Use the CLI version for powerful command-line scanning with many more options.<p>
|
|
448
|
+
<p><i>This tool runs entirely in your browser. No data is ever sent to a server. No analytics. No telemetry. Ever.</i></p>
|
|
445
449
|
<br><br>
|
|
446
450
|
<a href="https://nocomplexity.com/documents/codeaudit/intro.html"
|
|
447
451
|
target="_blank"
|
|
@@ -86,6 +86,7 @@ JWT_SIGNING_KEY
|
|
|
86
86
|
JWT_TOKEN
|
|
87
87
|
KEYFILE
|
|
88
88
|
KUBE_TOKEN
|
|
89
|
+
LLM_API_KEY
|
|
89
90
|
LYFENINJA_CLIENT_SECRET
|
|
90
91
|
MASTER_KEY
|
|
91
92
|
MISTRAL_API_KEY
|
|
@@ -119,6 +120,7 @@ SESSION_KEY
|
|
|
119
120
|
SIGNING_KEY
|
|
120
121
|
SILICONFLOW_API_KEY
|
|
121
122
|
SLACK_TOKEN
|
|
123
|
+
SLACK_BOT_TOKEN
|
|
122
124
|
SMTP_PASSWORD
|
|
123
125
|
SSH_KEY
|
|
124
126
|
static_key
|
|
@@ -43,7 +43,7 @@ from codeaudit.altairplots import (
|
|
|
43
43
|
)
|
|
44
44
|
|
|
45
45
|
from codeaudit.api_helpers import _codeaudit_directory_scan_wasm
|
|
46
|
-
from codeaudit.api_interfaces import get_package_source, version
|
|
46
|
+
from codeaudit.api_interfaces import get_package_source, version, package_imports
|
|
47
47
|
|
|
48
48
|
# --- Environment Detection ---
|
|
49
49
|
IS_PYODIDE = "pyodide" in sys.modules
|
|
@@ -175,6 +175,12 @@ async def filescan_wasm(input_path, nosec=False):
|
|
|
175
175
|
try:
|
|
176
176
|
scan_output = _codeaudit_directory_scan_wasm(src_dir, nosec_flag=nosec)
|
|
177
177
|
output |= scan_output
|
|
178
|
+
# correct statistics for imported modules and modules count
|
|
179
|
+
correct_imported_modules = package_imports(output)
|
|
180
|
+
output["module_overview"]["imported_modules"] = correct_imported_modules
|
|
181
|
+
output["statistics_overview"]["External Modules"] = len(
|
|
182
|
+
correct_imported_modules
|
|
183
|
+
)
|
|
178
184
|
finally:
|
|
179
185
|
if tmp_handle:
|
|
180
186
|
tmp_handle.cleanup()
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
</div>
|
|
103
103
|
</section>
|
|
104
104
|
<div class="pn-busy-container">
|
|
105
|
-
<div id="
|
|
105
|
+
<div id="c1428a5c-5ce8-406f-a339-ecf99154f423" data-root-id="p1022" style="display: contents;"></div>
|
|
106
106
|
</div>
|
|
107
107
|
</div>
|
|
108
108
|
</header>
|
|
@@ -110,14 +110,14 @@
|
|
|
110
110
|
<aside class="mdc-drawer mdc-top-app-bar--fixed-adjust mdc-drawer--dismissible mdc-drawer--open" id="sidebar">
|
|
111
111
|
<div class="mdc-drawer__content">
|
|
112
112
|
<div class="mdc-list">
|
|
113
|
-
<div id="
|
|
113
|
+
<div id="d918edd0-838c-4f35-96b7-93e388d4fc8c" data-root-id="p1037" style="display: contents;"></div>
|
|
114
114
|
</div>
|
|
115
115
|
</div>
|
|
116
116
|
</aside>
|
|
117
117
|
|
|
118
118
|
<div class="mdc-drawer-app-content mdc-top-app-bar--fixed-adjust">
|
|
119
119
|
<main class="main-content" id="main">
|
|
120
|
-
<div id="
|
|
120
|
+
<div id="d2afc85a-cbd4-4aaa-92ad-6c9fc69fc719" data-root-id="p1023" style="display: contents;"></div>
|
|
121
121
|
</main>
|
|
122
122
|
|
|
123
123
|
<div id="pn-Modal" class="mdc-dialog">
|
|
@@ -148,10 +148,10 @@
|
|
|
148
148
|
}
|
|
149
149
|
</script>
|
|
150
150
|
|
|
151
|
-
<div id="
|
|
152
|
-
<div id="
|
|
153
|
-
<div id="
|
|
154
|
-
<div id="
|
|
151
|
+
<div id="e9ccbf6a-6f30-42d1-80c6-ada3ae97aba4" data-root-id="p1017" style="display: contents;"></div>
|
|
152
|
+
<div id="c6a7efe4-ab93-47f6-bbe3-419006d99dc8" data-root-id="p1019" style="display: contents;"></div>
|
|
153
|
+
<div id="bb9b342b-3096-47e1-ac4a-16ca03b54925" data-root-id="p1011" style="display: contents;"></div>
|
|
154
|
+
<div id="aef73531-bc99-4369-b79b-503e6ae0186c" data-root-id="p1020" style="display: contents;"></div>
|
|
155
155
|
|
|
156
156
|
</div>
|
|
157
157
|
|
|
@@ -255,7 +255,7 @@
|
|
|
255
255
|
};
|
|
256
256
|
</script>
|
|
257
257
|
<script type="application/json" id="p1052">
|
|
258
|
-
{"0d156486-1f3b-4c0e-8d22-590703d045a9":{"version":"3.8.2","title":"Python Security Code Audit","config":{"type":"object","name":"DocumentConfig","id":"p1009","attributes":{"reconnect_session":false,"notify_connection_status":false,"notifications":null}},"roots":[{"type":"object","name":"panel.models.location.Location","id":"p1011","attributes":{"name":"location","reload":false}},{"type":"object","name":"panel.models.markup.HTML","id":"p1017","attributes":{"name":"js_area","stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1015","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1051","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/bundled/theme/material.css"}}],"width":0,"height":0,"margin":0,"sizing_mode":"fixed","align":"start","disable_math":true}},{"type":"object","name":"panel.models.reactive_html.ReactiveHTML","id":"p1019","attributes":{"name":"actions","subscribed_events":{"type":"set","entries":["dom_event"]},"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"margin":0,"align":"start","data":{"type":"object","name":"MaterialTemplateActions1","id":"p1018","attributes":{"name":"MaterialTemplateActions00143","tags":["__ref:p1019"]}},"scripts":{"type":"map","entries":[["open_modal",["modal.open();\nsetTimeout(function() {{\n window.dispatchEvent(new Event(&#x27;resize&#x27;));\n}}, 200);"]],["close_modal",["modal.close()"]]]}}},{"type":"object","name":"panel.models.browser.BrowserInfo","id":"p1020","attributes":{"name":"browser_info"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1022","attributes":{"name":"busy_indicator","css_classes":["loader","light"],"stylesheets":[":host { --loading-spinner-size: 20px; }","\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1021","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/loadingspinner.css"}},{"id":"p1051"}],"min_width":20,"min_height":20,"margin":[5,10],"align":"start"}},{"type":"object","name":"panel.models.layout.Column","id":"p1023","attributes":{"name":"main-123915234890192","tags":["main"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1016","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/listpanel.css"}},{"id":"p1051"}],"min_width":0,"min_height":0,"margin":0,"sizing_mode":"stretch_both","align":"start","children":[{"type":"object","name":"panel.models.tabs.Tabs","id":"p1024","attributes":{"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"min_width":0,"min_height":0,"margin":0,"sizing_mode":"stretch_both","align":"start","tabs":[{"type":"object","name":"TabPanel","id":"p1026","attributes":{"name":"HTML00123","title":"Package Overview","child":{"type":"object","name":"panel.models.markup.HTML","id":"p1025","attributes":{"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"\u26a0\ufe0f No scan result","disable_math":true}}}},{"type":"object","name":"TabPanel","id":"p1028","attributes":{"name":"HTML00123","title":"Used Modules","child":{"type":"object","name":"Spacer","id":"p1027","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1030","attributes":{"name":"HTML00123","title":"Complexity Insights","child":{"type":"object","name":"Spacer","id":"p1029","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1032","attributes":{"name":"HTML00123","title":"Weaknesses Overview","child":{"type":"object","name":"Spacer","id":"p1031","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1034","attributes":{"name":"HTML00123","title":"Weaknesses per file","child":{"type":"object","name":"Spacer","id":"p1033","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1036","attributes":{"name":"HTML00123","title":"Weaknesses Details","child":{"type":"object","name":"Spacer","id":"p1035","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}}]}}]}},{"type":"object","name":"panel.models.layout.Column","id":"p1037","attributes":{"name":"nav-123915235720704","tags":["nav"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1016"},{"id":"p1051"}],"min_width":300,"margin":0,"sizing_mode":"stretch_width","align":"start","children":[{"type":"object","name":"panel.models.markup.HTML","id":"p1039","attributes":{"css_classes":["markdown"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1038","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/markdown.css"}},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"&lt;h2 id=&quot;package-code-security-scan&quot;&gt;Package Code Security Scan &lt;a class=&quot;header-anchor&quot; href=&quot;#package-code-security-scan&quot;&gt;\u00b6&lt;/a&gt;&lt;/h2&gt;\n"}},{"type":"object","name":"panel.models.widgets.TextInput","id":"p1040","attributes":{"subscribed_events":{"type":"set","entries":["enter-pressed"]},"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"width":300,"min_width":300,"margin":[5,10],"align":"start","title":"Python Package Name","placeholder":"Enter PyPI package (e.g., requests)...","max_length":5000}},{"type":"object","name":"panel.models.widgets.Button","id":"p1042","attributes":{"button_type":"primary","subscribed_events":{"type":"set","entries":["button_click"]},"css_classes":["solid"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1041","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/button.css"}},{"id":"p1051"}],"margin":[5,10],"align":"start","label":"Start Scan"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1043","attributes":{"css_classes":["loader","light"],"stylesheets":[":host { --loading-spinner-size: 60px; }","\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1021"},{"id":"p1051"}],"min_width":60,"min_height":60,"margin":[5,10],"align":"start","text":"&lt;span&gt;&lt;b&gt;Scanning...&lt;/b&gt;&lt;/span&gt;"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1044","attributes":{"css_classes":["markdown"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1038"},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"&lt;h3&gt;Ready to scan.&lt;/h3&gt;\n"}},{"type":"object","name":"Spacer","id":"p1045","attributes":{"name":"Spacer00130","stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"height":20,"min_height":20,"margin":0,"align":"start"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1046","attributes":{"styles":{"type":"map","entries":[["background","linear-gradient(135deg, #F0FDF4, #ECFDF5)"],["padding","18px"],["min-width","200px"],["font-size","15px"],["color","#1F2937"],["border","1px solid #D1FAE5"],["border-left","4px solid #10B981"],["border-radius","12px"],["box-shadow","0 2px 6px rgba(0, 0, 0, 0.05)"]]},"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"},"\n .bk-panel {\n background: transparent !important;\n }\n "],"min_width":0,"margin":[5,10],"sizing_mode":"stretch_width","align":"start","text":"\n &lt;p&gt;&lt;b&gt;Python Code Audit&lt;/b&gt; is a Static Application Security Testing (SAST) tool used to find security weaknesses in Python code.&lt;/p&gt;\n &lt;p&gt;Use the CLI version for powerful command-line scanning with many more options.&lt;p&gt;\n &lt;br&gt;&lt;br&gt; \n &lt;a href=&quot;https://nocomplexity.com/documents/codeaudit/intro.html&quot;\n target=&quot;_blank&quot;\n style=&quot;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background-color: #24292f;\n color: white;\n text-decoration: none;\n border-radius: 8px;\n font-weight: 600;\n font-size: 15px;\n transition: all 0.2s ease;\n width: 200px;\n &quot;&gt;Documentation\n &lt;/a&gt;\n &lt;br&gt;&lt;br&gt;\n &lt;a href=&quot;https://github.com/nocomplexity/codeaudit&quot;\n target=&quot;_blank&quot;\n style=&quot;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background-color: #24292f;\n color: white;\n text-decoration: none;\n border-radius: 8px;\n font-weight: 600;\n font-size: 15px;\n transition: all 0.2s ease;\n width: 200px;\n &quot;&gt;\n &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;\n &lt;path d=&quot;M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.66-1.455-3.66-1.455-.495-1.26-1.2-1.59-1.2-1.59-.975-.66.075-.645.075-.645 1.08.075 1.65 1.11 1.65 1.11 0.96 1.635 2.505 1.17 3.12.885.09-.69.375-1.17.675-1.44-2.55-.285-5.22-1.275-5.22-5.67 0-1.26.45-2.28 1.185-3.09-.12-.285-.51-1.425.105-2.97 0 0 .975-.315 3.195 1.185.93-.255 1.92-.375 2.91-.375s1.98.12 2.91.375c2.22-1.5 3.195-1.185 3.195-1.185.615 1.545.225 2.685.105 2.97.735.81 1.185 1.83 1.185 3.09 0 4.41-2.67 5.385-5.22 5.67.405.345.765 1.02.765 2.07 0 1.5-.015 2.715-.015 3.09 0 .315.225.69.825.57C20.565 21.795 24 17.31 24 12c0-6.63-5.37-12-12-12z&quot;/&gt;\n &lt;/svg&gt;\n GitHub\n &lt;/a&gt;\n \n ","disable_math":true}},{"type":"object","name":"Spacer","id":"p1047","attributes":{"name":"Spacer00131","stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"height":10,"min_height":10,"margin":0,"align":"start"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1048","attributes":{"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"&lt;br&gt;&lt;b&gt;Disclaimer:&lt;/b&gt; This scan only evaluates Python files. Security weaknesses can also exist in other files used by a Python package.&lt;br&gt;&lt;br&gt;This SAST tool &lt;a href=&quot;https://github.com/nocomplexity/codeaudit&quot; target=&quot;_blank&quot;&gt;Python Code Audit&lt;/a&gt; provides a powerful, automatic security analysis for Python source code. However, it&#x27;s not a substitute for human review in combination with business knowledge. Undetected vulnerabilities may still exist.&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://nocomplexity.com/documents/codeaudit/intro.html&quot;&gt;Python Code Audit&lt;/a&gt;&lt;/strong&gt; Dashboard - version 1.7.1&lt;/p&gt;","disable_math":true}}]}}],"defs":[{"type":"model","name":"ReactiveHTML1"},{"type":"model","name":"FlexBox1","properties":[{"name":"align_content","kind":"Any","default":"flex-start"},{"name":"align_items","kind":"Any","default":"flex-start"},{"name":"flex_direction","kind":"Any","default":"row"},{"name":"flex_wrap","kind":"Any","default":"wrap"},{"name":"gap","kind":"Any","default":""},{"name":"justify_content","kind":"Any","default":"flex-start"}]},{"type":"model","name":"FloatPanel1","properties":[{"name":"config","kind":"Any","default":{"type":"map"}},{"name":"contained","kind":"Any","default":true},{"name":"position","kind":"Any","default":"right-top"},{"name":"offsetx","kind":"Any","default":null},{"name":"offsety","kind":"Any","default":null},{"name":"theme","kind":"Any","default":"primary"},{"name":"status","kind":"Any","default":"normalized"}]},{"type":"model","name":"GridStack1","properties":[{"name":"ncols","kind":"Any","default":null},{"name":"nrows","kind":"Any","default":null},{"name":"allow_resize","kind":"Any","default":true},{"name":"allow_drag","kind":"Any","default":true},{"name":"state","kind":"Any","default":[]}]},{"type":"model","name":"drag1","properties":[{"name":"slider_width","kind":"Any","default":5},{"name":"slider_color","kind":"Any","default":"black"},{"name":"start","kind":"Any","default":0},{"name":"end","kind":"Any","default":100},{"name":"value","kind":"Any","default":50}]},{"type":"model","name":"click1","properties":[{"name":"terminal_output","kind":"Any","default":""},{"name":"debug_name","kind":"Any","default":""},{"name":"clears","kind":"Any","default":0}]},{"type":"model","name":"ReactiveESM1","properties":[{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"JSComponent1","properties":[{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"ReactComponent1","properties":[{"name":"use_shadow_dom","kind":"Any","default":true},{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"AnyWidgetComponent1","properties":[{"name":"use_shadow_dom","kind":"Any","default":true},{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"FastWrapper1","properties":[{"name":"object","kind":"Any","default":null},{"name":"style","kind":"Any","default":null}]},{"type":"model","name":"NotificationArea1","properties":[{"name":"js_events","kind":"Any","default":{"type":"map"}},{"name":"max_notifications","kind":"Any","default":5},{"name":"notifications","kind":"Any","default":[]},{"name":"position","kind":"Any","default":"bottom-right"},{"name":"_clear","kind":"Any","default":0},{"name":"types","kind":"Any","default":[{"type":"map","entries":[["type","warning"],["background","#ffc107"],["icon",{"type":"map","entries":[["className","fas fa-exclamation-triangle"],["tagName","i"],["color","white"]]}]]},{"type":"map","entries":[["type","info"],["background","#007bff"],["icon",{"type":"map","entries":[["className","fas fa-info-circle"],["tagName","i"],["color","white"]]}]]}]}]},{"type":"model","name":"Notification","properties":[{"name":"background","kind":"Any","default":null},{"name":"duration","kind":"Any","default":3000},{"name":"icon","kind":"Any","default":null},{"name":"message","kind":"Any","default":""},{"name":"notification_type","kind":"Any","default":null},{"name":"_rendered","kind":"Any","default":false},{"name":"_destroyed","kind":"Any","default":false}]},{"type":"model","name":"TemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"BootstrapTemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"TemplateEditor1","properties":[{"name":"layout","kind":"Any","default":[]}]},{"type":"model","name":"MaterialTemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"request_value1","properties":[{"name":"fill","kind":"Any","default":"none"},{"name":"_synced","kind":"Any","default":null},{"name":"_request_sync","kind":"Any","default":0}]}]}}
|
|
258
|
+
{"2e885c2a-1c77-4062-b0c4-c9ce5c53a26b":{"version":"3.8.2","title":"Python Security Code Audit","config":{"type":"object","name":"DocumentConfig","id":"p1009","attributes":{"reconnect_session":false,"notify_connection_status":false,"notifications":null}},"roots":[{"type":"object","name":"panel.models.location.Location","id":"p1011","attributes":{"name":"location","reload":false}},{"type":"object","name":"panel.models.markup.HTML","id":"p1017","attributes":{"name":"js_area","stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1015","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1051","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/bundled/theme/material.css"}}],"width":0,"height":0,"margin":0,"sizing_mode":"fixed","align":"start","disable_math":true}},{"type":"object","name":"panel.models.reactive_html.ReactiveHTML","id":"p1019","attributes":{"name":"actions","subscribed_events":{"type":"set","entries":["dom_event"]},"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"margin":0,"align":"start","data":{"type":"object","name":"MaterialTemplateActions1","id":"p1018","attributes":{"name":"MaterialTemplateActions00143","tags":["__ref:p1019"]}},"scripts":{"type":"map","entries":[["open_modal",["modal.open();\nsetTimeout(function() {{\n window.dispatchEvent(new Event(&#x27;resize&#x27;));\n}}, 200);"]],["close_modal",["modal.close()"]]]}}},{"type":"object","name":"panel.models.browser.BrowserInfo","id":"p1020","attributes":{"name":"browser_info"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1022","attributes":{"name":"busy_indicator","css_classes":["loader","light"],"stylesheets":[":host { --loading-spinner-size: 20px; }","\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1021","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/loadingspinner.css"}},{"id":"p1051"}],"min_width":20,"min_height":20,"margin":[5,10],"align":"start"}},{"type":"object","name":"panel.models.layout.Column","id":"p1023","attributes":{"name":"main-124303472038352","tags":["main"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1016","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/listpanel.css"}},{"id":"p1051"}],"min_width":0,"min_height":0,"margin":0,"sizing_mode":"stretch_both","align":"start","children":[{"type":"object","name":"panel.models.tabs.Tabs","id":"p1024","attributes":{"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"min_width":0,"min_height":0,"margin":0,"sizing_mode":"stretch_both","align":"start","tabs":[{"type":"object","name":"TabPanel","id":"p1026","attributes":{"name":"HTML00123","title":"Package Overview","child":{"type":"object","name":"panel.models.markup.HTML","id":"p1025","attributes":{"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"\u26a0\ufe0f No scan result","disable_math":true}}}},{"type":"object","name":"TabPanel","id":"p1028","attributes":{"name":"HTML00123","title":"Used Modules","child":{"type":"object","name":"Spacer","id":"p1027","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1030","attributes":{"name":"HTML00123","title":"Complexity Insights","child":{"type":"object","name":"Spacer","id":"p1029","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1032","attributes":{"name":"HTML00123","title":"Weaknesses Overview","child":{"type":"object","name":"Spacer","id":"p1031","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1034","attributes":{"name":"HTML00123","title":"Weaknesses per file","child":{"type":"object","name":"Spacer","id":"p1033","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}},{"type":"object","name":"TabPanel","id":"p1036","attributes":{"name":"HTML00123","title":"Weaknesses Details","child":{"type":"object","name":"Spacer","id":"p1035","attributes":{"tags":["hidden"],"margin":[5,10],"align":"start"}}}}]}}]}},{"type":"object","name":"panel.models.layout.Column","id":"p1037","attributes":{"name":"nav-124303472934400","tags":["nav"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1016"},{"id":"p1051"}],"min_width":300,"margin":0,"sizing_mode":"stretch_width","align":"start","children":[{"type":"object","name":"panel.models.markup.HTML","id":"p1039","attributes":{"css_classes":["markdown"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1038","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/markdown.css"}},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"&lt;h2 id=&quot;package-code-security-scan&quot;&gt;Package Code Security Scan &lt;a class=&quot;header-anchor&quot; href=&quot;#package-code-security-scan&quot;&gt;\u00b6&lt;/a&gt;&lt;/h2&gt;\n"}},{"type":"object","name":"panel.models.widgets.TextInput","id":"p1040","attributes":{"subscribed_events":{"type":"set","entries":["enter-pressed"]},"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"width":300,"min_width":300,"margin":[5,10],"align":"start","title":"Python Package Name","placeholder":"Enter PyPI package (e.g., requests)...","max_length":5000}},{"type":"object","name":"panel.models.widgets.Button","id":"p1042","attributes":{"button_type":"primary","subscribed_events":{"type":"set","entries":["button_click"]},"css_classes":["solid"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"type":"object","name":"ImportedStyleSheet","id":"p1041","attributes":{"url":"https://cdn.holoviz.org/panel/1.8.10/dist/css/button.css"}},{"id":"p1051"}],"margin":[5,10],"align":"start","label":"Start Scan"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1043","attributes":{"css_classes":["loader","light"],"stylesheets":[":host { --loading-spinner-size: 60px; }","\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1021"},{"id":"p1051"}],"min_width":60,"min_height":60,"margin":[5,10],"align":"start","text":"&lt;span&gt;&lt;b&gt;Scanning...&lt;/b&gt;&lt;/span&gt;"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1044","attributes":{"css_classes":["markdown"],"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1038"},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"&lt;h3&gt;Ready to scan.&lt;/h3&gt;\n"}},{"type":"object","name":"Spacer","id":"p1045","attributes":{"name":"Spacer00130","stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"height":20,"min_height":20,"margin":0,"align":"start"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1046","attributes":{"styles":{"type":"map","entries":[["background","linear-gradient(135deg, #F0FDF4, #ECFDF5)"],["padding","18px"],["min-width","200px"],["font-size","15px"],["color","#1F2937"],["border","1px solid #D1FAE5"],["border-left","4px solid #10B981"],["border-radius","12px"],["box-shadow","0 2px 6px rgba(0, 0, 0, 0.05)"]]},"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"},"\n .bk-panel {\n background: transparent !important;\n }\n "],"min_width":0,"margin":[5,10],"sizing_mode":"stretch_width","align":"start","text":"\n &lt;p&gt;&lt;b&gt;Python Code Audit&lt;/b&gt; is a Static Application Security Testing (SAST) tool used to find security weaknesses in Python code.&lt;/p&gt;\n &lt;p&gt;Use the CLI version for powerful command-line scanning with many more options.&lt;p&gt;\n &lt;br&gt;&lt;br&gt; \n &lt;a href=&quot;https://nocomplexity.com/documents/codeaudit/intro.html&quot;\n target=&quot;_blank&quot;\n style=&quot;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background-color: #24292f;\n color: white;\n text-decoration: none;\n border-radius: 8px;\n font-weight: 600;\n font-size: 15px;\n transition: all 0.2s ease;\n width: 200px;\n &quot;&gt;Documentation\n &lt;/a&gt;\n &lt;br&gt;&lt;br&gt;\n &lt;a href=&quot;https://github.com/nocomplexity/codeaudit&quot;\n target=&quot;_blank&quot;\n style=&quot;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background-color: #24292f;\n color: white;\n text-decoration: none;\n border-radius: 8px;\n font-weight: 600;\n font-size: 15px;\n transition: all 0.2s ease;\n width: 200px;\n &quot;&gt;\n &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;\n &lt;path d=&quot;M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.66-1.455-3.66-1.455-.495-1.26-1.2-1.59-1.2-1.59-.975-.66.075-.645.075-.645 1.08.075 1.65 1.11 1.65 1.11 0.96 1.635 2.505 1.17 3.12.885.09-.69.375-1.17.675-1.44-2.55-.285-5.22-1.275-5.22-5.67 0-1.26.45-2.28 1.185-3.09-.12-.285-.51-1.425.105-2.97 0 0 .975-.315 3.195 1.185.93-.255 1.92-.375 2.91-.375s1.98.12 2.91.375c2.22-1.5 3.195-1.185 3.195-1.185.615 1.545.225 2.685.105 2.97.735.81 1.185 1.83 1.185 3.09 0 4.41-2.67 5.385-5.22 5.67.405.345.765 1.02.765 2.07 0 1.5-.015 2.715-.015 3.09 0 .315.225.69.825.57C20.565 21.795 24 17.31 24 12c0-6.63-5.37-12-12-12z&quot;/&gt;\n &lt;/svg&gt;\n GitHub\n &lt;/a&gt;\n \n ","disable_math":true}},{"type":"object","name":"Spacer","id":"p1047","attributes":{"name":"Spacer00131","stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"height":10,"min_height":10,"margin":0,"align":"start"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1048","attributes":{"stylesheets":["\n:host(.pn-loading):before, .pn-loading:before {\n background-color: #c3c3c3;\n mask-size: auto calc(min(50%, 300px));\n -webkit-mask-size: auto calc(min(50%, 300px));\n}",{"id":"p1015"},{"id":"p1051"}],"margin":[5,10],"align":"start","text":"&lt;br&gt;&lt;b&gt;Disclaimer:&lt;/b&gt; This scan only evaluates Python files. Security weaknesses can also exist in other files used by a Python package.&lt;br&gt;&lt;br&gt;This SAST tool &lt;a href=&quot;https://github.com/nocomplexity/codeaudit&quot; target=&quot;_blank&quot;&gt;Python Code Audit&lt;/a&gt; provides a powerful, automatic security analysis for Python source code. However, it&#x27;s not a substitute for human review in combination with business knowledge. Undetected vulnerabilities may still exist.&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://nocomplexity.com/documents/codeaudit/intro.html&quot;&gt;Python Code Audit&lt;/a&gt;&lt;/strong&gt; Dashboard - version 1.8.0&lt;/p&gt;","disable_math":true}}]}}],"defs":[{"type":"model","name":"ReactiveHTML1"},{"type":"model","name":"FlexBox1","properties":[{"name":"align_content","kind":"Any","default":"flex-start"},{"name":"align_items","kind":"Any","default":"flex-start"},{"name":"flex_direction","kind":"Any","default":"row"},{"name":"flex_wrap","kind":"Any","default":"wrap"},{"name":"gap","kind":"Any","default":""},{"name":"justify_content","kind":"Any","default":"flex-start"}]},{"type":"model","name":"FloatPanel1","properties":[{"name":"config","kind":"Any","default":{"type":"map"}},{"name":"contained","kind":"Any","default":true},{"name":"position","kind":"Any","default":"right-top"},{"name":"offsetx","kind":"Any","default":null},{"name":"offsety","kind":"Any","default":null},{"name":"theme","kind":"Any","default":"primary"},{"name":"status","kind":"Any","default":"normalized"}]},{"type":"model","name":"GridStack1","properties":[{"name":"ncols","kind":"Any","default":null},{"name":"nrows","kind":"Any","default":null},{"name":"allow_resize","kind":"Any","default":true},{"name":"allow_drag","kind":"Any","default":true},{"name":"state","kind":"Any","default":[]}]},{"type":"model","name":"drag1","properties":[{"name":"slider_width","kind":"Any","default":5},{"name":"slider_color","kind":"Any","default":"black"},{"name":"start","kind":"Any","default":0},{"name":"end","kind":"Any","default":100},{"name":"value","kind":"Any","default":50}]},{"type":"model","name":"click1","properties":[{"name":"terminal_output","kind":"Any","default":""},{"name":"debug_name","kind":"Any","default":""},{"name":"clears","kind":"Any","default":0}]},{"type":"model","name":"ReactiveESM1","properties":[{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"JSComponent1","properties":[{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"ReactComponent1","properties":[{"name":"use_shadow_dom","kind":"Any","default":true},{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"AnyWidgetComponent1","properties":[{"name":"use_shadow_dom","kind":"Any","default":true},{"name":"esm_constants","kind":"Any","default":{"type":"map"}}]},{"type":"model","name":"FastWrapper1","properties":[{"name":"object","kind":"Any","default":null},{"name":"style","kind":"Any","default":null}]},{"type":"model","name":"NotificationArea1","properties":[{"name":"js_events","kind":"Any","default":{"type":"map"}},{"name":"max_notifications","kind":"Any","default":5},{"name":"notifications","kind":"Any","default":[]},{"name":"position","kind":"Any","default":"bottom-right"},{"name":"_clear","kind":"Any","default":0},{"name":"types","kind":"Any","default":[{"type":"map","entries":[["type","warning"],["background","#ffc107"],["icon",{"type":"map","entries":[["className","fas fa-exclamation-triangle"],["tagName","i"],["color","white"]]}]]},{"type":"map","entries":[["type","info"],["background","#007bff"],["icon",{"type":"map","entries":[["className","fas fa-info-circle"],["tagName","i"],["color","white"]]}]]}]}]},{"type":"model","name":"Notification","properties":[{"name":"background","kind":"Any","default":null},{"name":"duration","kind":"Any","default":3000},{"name":"icon","kind":"Any","default":null},{"name":"message","kind":"Any","default":""},{"name":"notification_type","kind":"Any","default":null},{"name":"_rendered","kind":"Any","default":false},{"name":"_destroyed","kind":"Any","default":false}]},{"type":"model","name":"TemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"BootstrapTemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"TemplateEditor1","properties":[{"name":"layout","kind":"Any","default":[]}]},{"type":"model","name":"MaterialTemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"request_value1","properties":[{"name":"fill","kind":"Any","default":"none"},{"name":"_synced","kind":"Any","default":null},{"name":"_request_sync","kind":"Any","default":0}]}]}}
|
|
259
259
|
</script>
|
|
260
260
|
<script type="text/javascript">
|
|
261
261
|
(function() {
|
|
@@ -264,7 +264,7 @@
|
|
|
264
264
|
(function(root) {
|
|
265
265
|
function embed_document(root) {
|
|
266
266
|
const docs_json = document.getElementById('p1052').textContent;
|
|
267
|
-
const render_items = [{"docid":"
|
|
267
|
+
const render_items = [{"docid":"2e885c2a-1c77-4062-b0c4-c9ce5c53a26b","roots":{"p1011":"bb9b342b-3096-47e1-ac4a-16ca03b54925","p1017":"e9ccbf6a-6f30-42d1-80c6-ada3ae97aba4","p1019":"c6a7efe4-ab93-47f6-bbe3-419006d99dc8","p1020":"aef73531-bc99-4369-b79b-503e6ae0186c","p1022":"c1428a5c-5ce8-406f-a339-ecf99154f423","p1023":"d2afc85a-cbd4-4aaa-92ad-6c9fc69fc719","p1037":"d918edd0-838c-4f35-96b7-93e388d4fc8c"},"root_ids":["p1011","p1017","p1019","p1020","p1022","p1023","p1037"]}];
|
|
268
268
|
root.Bokeh.embed.embed_items(docs_json, render_items);
|
|
269
269
|
}
|
|
270
270
|
if (root.Bokeh !== undefined) {
|