conan 2.13.0__tar.gz → 2.14.0__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.
- {conan-2.13.0/conan.egg-info → conan-2.14.0}/PKG-INFO +1 -1
- {conan-2.13.0 → conan-2.14.0}/conan/__init__.py +1 -1
- {conan-2.13.0 → conan-2.14.0}/conan/api/conan_api.py +9 -0
- conan-2.14.0/conan/api/subapi/audit.py +159 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/config.py +3 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/export.py +2 -4
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/install.py +7 -6
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/local.py +2 -4
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/workspace.py +10 -0
- conan-2.14.0/conan/cli/commands/audit.py +195 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/workspace.py +7 -6
- conan-2.14.0/conan/cli/formatters/audit/vulnerabilities.py +271 -0
- conan-2.14.0/conan/internal/api/audit/providers.py +208 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/profile/profile_loader.py +1 -1
- {conan-2.13.0 → conan-2.14.0}/conan/internal/conan_app.py +22 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/default_settings.py +2 -1
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/cpp_info.py +26 -16
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/requires.py +1 -1
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/cmakedeps.py +1 -1
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/templates/target_configuration.py +6 -18
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps2/cmakedeps.py +12 -6
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps2/target_configuration.py +44 -11
- {conan-2.13.0 → conan-2.14.0}/conan/tools/env/environment.py +1 -1
- {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/msbuilddeps.py +2 -2
- {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/visual.py +1 -1
- {conan-2.13.0 → conan-2.14.0/conan.egg-info}/PKG-INFO +1 -1
- {conan-2.13.0 → conan-2.14.0}/conan.egg-info/SOURCES.txt +6 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/graph/compute_pid.py +7 -3
- {conan-2.13.0 → conan-2.14.0}/conans/client/graph/graph_binaries.py +3 -2
- {conan-2.13.0 → conan-2.14.0}/conans/client/graph/graph_builder.py +17 -6
- {conan-2.13.0 → conan-2.14.0}/conans/client/graph/install_graph.py +13 -1
- {conan-2.13.0 → conan-2.14.0}/conans/client/hook_manager.py +1 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/installer.py +2 -4
- {conan-2.13.0 → conan-2.14.0}/conans/client/rest_client_local_recipe_index.py +4 -7
- conan-2.14.0/conans/model/__init__.py +0 -0
- conan-2.14.0/conans/util/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/LICENSE.md +0 -0
- {conan-2.13.0 → conan-2.14.0}/MANIFEST.in +0 -0
- {conan-2.13.0 → conan-2.14.0}/README.md +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/input.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/model/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/model/list.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/model/refs.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/model/remote.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/output.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/cache.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/command.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/download.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/graph.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/list.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/lockfile.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/new.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/profiles.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/remotes.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/remove.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/search.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/api/subapi/upload.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/args.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/cli.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/command.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/build.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/cache.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/config.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/create.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/download.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/editable.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/export.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/export_pkg.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/graph.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/inspect.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/install.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/list.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/lock.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/new.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/pkglist.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/profile.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/remote.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/remove.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/search.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/source.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/test.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/upload.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/commands/version.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/exit_codes.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/__init__.py +0 -0
- {conan-2.13.0/conan/internal/api → conan-2.14.0/conan/cli/formatters/audit}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/graph/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/graph/build_order_html.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/graph/graph.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/graph/graph_info_text.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/graph/info_graph_dot.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/graph/info_graph_html.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/list/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/list/list.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/formatters/list/search_table_html.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/printers/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cli/printers/graph.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cps/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/cps/cps.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/errors.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/__init__.py +0 -0
- {conan-2.13.0/conan/internal/api/config → conan-2.14.0/conan/internal/api}/__init__.py +0 -0
- {conan-2.13.0/conan/internal/api/detect → conan-2.14.0/conan/internal/api/audit}/__init__.py +0 -0
- {conan-2.13.0/conan/internal/api/install → conan-2.14.0/conan/internal/api/config}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/config/config_installer.py +0 -0
- {conan-2.13.0/conan/internal/api/list → conan-2.14.0/conan/internal/api/detect}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/detect/detect_api.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/detect/detect_vs.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/export.py +0 -0
- {conan-2.13.0/conan/internal/api/local → conan-2.14.0/conan/internal/api/install}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/install/generators.py +0 -0
- {conan-2.13.0/conan/internal/api/new → conan-2.14.0/conan/internal/api/list}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/list/query_parse.py +0 -0
- {conan-2.13.0/conan/internal/api/profile → conan-2.14.0/conan/internal/api/local}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/local/editable.py +0 -0
- {conan-2.13.0/conan/internal/api/remotes → conan-2.14.0/conan/internal/api/new}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/alias_new.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/autoools_exe.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/autotools_lib.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/basic.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/bazel_7_exe.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/bazel_7_lib.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/bazel_exe.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/bazel_lib.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/cmake_exe.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/cmake_lib.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/local_recipes_index.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/meson_exe.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/meson_lib.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/msbuild_exe.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/msbuild_lib.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/qbs_lib.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/new/workspace.py +0 -0
- {conan-2.13.0/conan/internal/cache → conan-2.14.0/conan/internal/api/profile}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/profile/detect.py +0 -0
- {conan-2.13.0/conan/internal/cache/db → conan-2.14.0/conan/internal/api/remotes}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/remotes/encrypt.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/remotes/localdb.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/api/uploader.py +0 -0
- {conan-2.13.0/conan/internal/model → conan-2.14.0/conan/internal/cache}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/cache.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/conan_reference_layout.py +0 -0
- {conan-2.13.0/conan/test → conan-2.14.0/conan/internal/cache/db}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/db/cache_database.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/db/packages_table.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/db/recipes_table.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/db/table.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/home_paths.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/cache/integrity_check.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/deploy.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/errors.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/internal_tools.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/methods.py +0 -0
- {conan-2.13.0/conan/test/assets → conan-2.14.0/conan/internal/model}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/conan_file.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/conanfile_interface.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/conf.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/dependencies.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/info.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/layout.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/lockfile.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/manifest.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/options.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/pkg_type.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/profile.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/recipe_ref.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/settings.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/version.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/version_range.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/model/workspace.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/paths.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/runner/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/runner/docker.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/runner/output.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/runner/ssh.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/internal/runner/wsl.py +0 -0
- {conan-2.13.0/conan/test/utils → conan-2.14.0/conan/test}/__init__.py +0 -0
- {conan-2.13.0/conan/tools/cmake/cmakedeps2 → conan-2.14.0/conan/test/assets}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/test/assets/autotools.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/test/assets/cmake.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/test/assets/genconanfile.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/test/assets/sources.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/test/assets/visual_project_files.py +0 -0
- {conan-2.13.0/conan/tools/system → conan-2.14.0/conan/test/utils}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/test/utils/artifactory.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/test/utils/env.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/test/utils/file_server.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/test/utils/mocks.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/test/utils/profiles.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/test/utils/scm.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/test/utils/server_launcher.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/test/utils/test_files.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/test/utils/tools.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/android/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/android/utils.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/apple/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/apple/apple.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/apple/xcodebuild.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/apple/xcodedeps.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/apple/xcodetoolchain.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/build/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/build/cppstd.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/build/cpu.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/build/cross_building.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/build/cstd.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/build/flags.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/build/stdcpp_library.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmake.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/templates/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/templates/config.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/templates/config_version.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/templates/macros.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/templates/target_data.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps/templates/targets.py +0 -0
- {conan-2.13.0/conans → conan-2.14.0/conan/tools/cmake/cmakedeps2}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps2/config.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps2/config_version.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/cmakedeps2/targets.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/layout.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/presets.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/toolchain/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/toolchain/blocks.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/toolchain/toolchain.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cmake/utils.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cps/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/cps/cps_deps.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/env/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/env/virtualbuildenv.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/env/virtualrunenv.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/files/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/files/conandata.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/files/copy_pattern.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/files/files.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/files/packager.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/files/patches.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/files/symlinks/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/files/symlinks/symlinks.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/autotools.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/autotoolsdeps.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/autotoolstoolchain.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/get_gnu_triplet.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/gnudeps_flags.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/gnutoolchain.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/makedeps.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/pkgconfig.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/gnu/pkgconfigdeps.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/google/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/google/bazel.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/google/bazeldeps.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/google/layout.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/google/toolchain.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/intel/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/intel/intel_cc.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/layout/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/meson/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/meson/helpers.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/meson/meson.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/meson/toolchain.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/layout.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/msbuild.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/nmakedeps.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/nmaketoolchain.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/subsystems.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/microsoft/toolchain.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/premake/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/premake/premake.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/premake/premakedeps.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/qbs/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/qbs/common.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/qbs/qbs.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/qbs/qbsdeps.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/qbs/qbsprofile.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/ros/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/ros/rosenv.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/sbom/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/sbom/cyclonedx.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/scm/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/scm/git.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/scons/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/scons/sconsdeps.py +0 -0
- {conan-2.13.0/conans/client → conan-2.14.0/conan/tools/system}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan/tools/system/package_manager.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan.egg-info/dependency_links.txt +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan.egg-info/entry_points.txt +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan.egg-info/requires.txt +0 -0
- {conan-2.13.0 → conan-2.14.0}/conan.egg-info/top_level.txt +0 -0
- {conan-2.13.0/conans/client/downloaders → conan-2.14.0/conans}/__init__.py +0 -0
- {conan-2.13.0/conans/client/graph → conan-2.14.0/conans/client}/__init__.py +0 -0
- {conan-2.13.0/conans/model → conan-2.14.0/conans/client/downloaders}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/downloaders/caching_file_downloader.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/downloaders/download_cache.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/downloaders/file_downloader.py +0 -0
- {conan-2.13.0/conans/util → conan-2.14.0/conans/client/graph}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/graph/build_mode.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/graph/compatibility.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/graph/graph.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/graph/graph_error.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/graph/profile_node_definer.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/graph/provides.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/graph/proxy.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/graph/python_requires.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/graph/range_resolver.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/loader.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/loader_txt.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/migrations.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/pkg_sign.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/remote_manager.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/rest/__init__.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/rest/auth_manager.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/rest/client_routes.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/rest/conan_requester.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/rest/file_uploader.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/rest/remote_credentials.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/rest/rest_client.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/rest/rest_client_v2.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/rest/rest_routes.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/source.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/client/subsystems.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/conan.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/conan_server.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/migrations.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/model/package_ref.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/model/recipe_ref.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/requirements.txt +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/requirements_dev.txt +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/requirements_runner.txt +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/requirements_server.txt +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/util/config_parser.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/util/dates.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/util/files.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/util/locks.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/util/runners.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/conans/util/thread.py +0 -0
- {conan-2.13.0 → conan-2.14.0}/pyproject.toml +0 -0
- {conan-2.13.0 → conan-2.14.0}/setup.cfg +0 -0
- {conan-2.13.0 → conan-2.14.0}/setup.py +0 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import os
|
|
1
2
|
import sys
|
|
2
3
|
|
|
3
4
|
from conan.api.output import init_colorama
|
|
5
|
+
from conan.api.subapi.audit import AuditAPI
|
|
4
6
|
from conan.api.subapi.cache import CacheAPI
|
|
5
7
|
from conan.api.subapi.command import CommandAPI
|
|
6
8
|
from conan.api.subapi.local import LocalAPI
|
|
@@ -31,10 +33,16 @@ class ConanAPI:
|
|
|
31
33
|
not be created directly.
|
|
32
34
|
"""
|
|
33
35
|
def __init__(self, cache_folder=None):
|
|
36
|
+
"""
|
|
37
|
+
:param cache_folder: Conan cache/home folder. It will have less priority than the
|
|
38
|
+
"home_folder" defined in a Workspace.
|
|
39
|
+
"""
|
|
34
40
|
|
|
35
41
|
version = sys.version_info
|
|
36
42
|
if version.major == 2 or version.minor < 6:
|
|
37
43
|
raise ConanException("Conan needs Python >= 3.6")
|
|
44
|
+
if cache_folder is not None and not os.path.isabs(cache_folder):
|
|
45
|
+
raise ConanException("cache_folder has to be an absolute path")
|
|
38
46
|
|
|
39
47
|
init_colorama(sys.stderr)
|
|
40
48
|
self.workspace = WorkspaceAPI(self)
|
|
@@ -62,6 +70,7 @@ class ConanAPI:
|
|
|
62
70
|
self.cache = CacheAPI(self)
|
|
63
71
|
self.lockfile = LockfileAPI(self)
|
|
64
72
|
self.local = LocalAPI(self)
|
|
73
|
+
self.audit = AuditAPI(self)
|
|
65
74
|
|
|
66
75
|
_check_conan_version(self)
|
|
67
76
|
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import binascii
|
|
2
|
+
import json
|
|
3
|
+
import os
|
|
4
|
+
import base64
|
|
5
|
+
|
|
6
|
+
from conan.internal.api.audit.providers import ConanCenterProvider, PrivateProvider
|
|
7
|
+
from conan.errors import ConanException
|
|
8
|
+
from conan.internal.api.remotes.encrypt import encode, decode
|
|
9
|
+
from conan.internal.model.recipe_ref import RecipeReference
|
|
10
|
+
from conans.util.files import save, load
|
|
11
|
+
|
|
12
|
+
CONAN_CENTER_AUDIT_PROVIDER_NAME = "conancenter"
|
|
13
|
+
CYPHER_KEY = "private"
|
|
14
|
+
|
|
15
|
+
class AuditAPI:
|
|
16
|
+
"""
|
|
17
|
+
This class provides the functionality to scan references for vulnerabilities.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def __init__(self, conan_api):
|
|
21
|
+
self.conan_api = conan_api
|
|
22
|
+
self._home_folder = conan_api.home_folder
|
|
23
|
+
self._providers_path = os.path.join(self._home_folder, "audit_providers.json")
|
|
24
|
+
self._provider_cls = {
|
|
25
|
+
"conan-center-proxy": ConanCenterProvider,
|
|
26
|
+
"private": PrivateProvider,
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
def scan(self, deps_graph, provider):
|
|
30
|
+
"""
|
|
31
|
+
Scan a given recipe for vulnerabilities in its dependencies.
|
|
32
|
+
"""
|
|
33
|
+
refs = sorted(set(RecipeReference.loads(f"{node.ref.name}/{node.ref.version}")
|
|
34
|
+
for node in deps_graph.nodes[1:]), key= lambda ref: ref.name)
|
|
35
|
+
return provider.get_cves(refs)
|
|
36
|
+
|
|
37
|
+
def list(self, references, provider):
|
|
38
|
+
"""
|
|
39
|
+
List the vulnerabilities of the given reference.
|
|
40
|
+
"""
|
|
41
|
+
refs = [RecipeReference.loads(ref) for ref in references]
|
|
42
|
+
for ref in refs:
|
|
43
|
+
ref.validate_ref()
|
|
44
|
+
return provider.get_cves(refs)
|
|
45
|
+
|
|
46
|
+
def get_provider(self, provider_name):
|
|
47
|
+
"""
|
|
48
|
+
Get the provider by name.
|
|
49
|
+
"""
|
|
50
|
+
# TODO: More work remains to be done here, hardcoded for now for testing
|
|
51
|
+
providers = _load_providers(self._providers_path)
|
|
52
|
+
if provider_name not in providers:
|
|
53
|
+
add_arguments = (
|
|
54
|
+
"--url=https://audit.conan.io/ --type=conan-center-proxy"
|
|
55
|
+
if provider_name == CONAN_CENTER_AUDIT_PROVIDER_NAME
|
|
56
|
+
else "--url=<url> --type=<type>"
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
register_message = (
|
|
60
|
+
f"If you don't have a valid token, register at: https://audit.conan.io/register."
|
|
61
|
+
if provider_name == CONAN_CENTER_AUDIT_PROVIDER_NAME
|
|
62
|
+
else ""
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
raise ConanException(
|
|
66
|
+
f"Provider '{provider_name}' not found. Please specify a valid provider name or add it using: "
|
|
67
|
+
f"'conan audit provider add {provider_name} {add_arguments} --token=<token>'\n"
|
|
68
|
+
f"{register_message}"
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
provider_data = providers[provider_name]
|
|
72
|
+
safe_provider_name = provider_name.replace("-", "_")
|
|
73
|
+
env_token = os.getenv(f"CONAN_AUDIT_PROVIDER_TOKEN_{safe_provider_name.upper()}")
|
|
74
|
+
|
|
75
|
+
if env_token:
|
|
76
|
+
# Always override the token with the environment variable
|
|
77
|
+
provider_data["token"] = env_token
|
|
78
|
+
elif "token" in provider_data:
|
|
79
|
+
try:
|
|
80
|
+
provider_data["token"] = decode(base64.standard_b64decode(provider_data["token"]).decode(), CYPHER_KEY)
|
|
81
|
+
except binascii.Error as e:
|
|
82
|
+
raise ConanException(f"Invalid token format for provider '{provider_name}'. The token might be corrupt.")
|
|
83
|
+
|
|
84
|
+
provider_cls = self._provider_cls.get(provider_data["type"])
|
|
85
|
+
|
|
86
|
+
return provider_cls(self.conan_api, provider_name, provider_data)
|
|
87
|
+
|
|
88
|
+
def list_providers(self):
|
|
89
|
+
"""
|
|
90
|
+
Get all available providers.
|
|
91
|
+
"""
|
|
92
|
+
providers = _load_providers(self._providers_path)
|
|
93
|
+
result = []
|
|
94
|
+
for name, provider_data in providers.items():
|
|
95
|
+
provider_cls = self._provider_cls.get(provider_data["type"])
|
|
96
|
+
result.append(provider_cls(self.conan_api, name, provider_data))
|
|
97
|
+
return result
|
|
98
|
+
|
|
99
|
+
def add_provider(self, name, url, provider_type):
|
|
100
|
+
"""
|
|
101
|
+
Add a provider.
|
|
102
|
+
"""
|
|
103
|
+
providers = _load_providers(self._providers_path)
|
|
104
|
+
if name in providers:
|
|
105
|
+
raise ConanException(f"Provider '{name}' already exists")
|
|
106
|
+
|
|
107
|
+
if provider_type not in self._provider_cls:
|
|
108
|
+
raise ConanException(f"Provider type '{provider_type}' not found")
|
|
109
|
+
|
|
110
|
+
providers[name] = {
|
|
111
|
+
"name": name,
|
|
112
|
+
"url": url,
|
|
113
|
+
"type": provider_type
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
_save_providers(self._providers_path, providers)
|
|
117
|
+
|
|
118
|
+
def remove_provider(self, provider_name):
|
|
119
|
+
"""
|
|
120
|
+
Remove a provider.
|
|
121
|
+
"""
|
|
122
|
+
providers = _load_providers(self._providers_path)
|
|
123
|
+
if provider_name not in providers:
|
|
124
|
+
raise ConanException(f"Provider '{provider_name}' not found")
|
|
125
|
+
|
|
126
|
+
del providers[provider_name]
|
|
127
|
+
|
|
128
|
+
_save_providers(self._providers_path, providers)
|
|
129
|
+
|
|
130
|
+
def auth_provider(self, provider, token):
|
|
131
|
+
"""
|
|
132
|
+
Authenticate a provider.
|
|
133
|
+
"""
|
|
134
|
+
if not provider:
|
|
135
|
+
raise ConanException("Provider not found")
|
|
136
|
+
|
|
137
|
+
providers = _load_providers(self._providers_path)
|
|
138
|
+
|
|
139
|
+
assert provider.name in providers
|
|
140
|
+
providers[provider.name]["token"] = base64.standard_b64encode(encode(token, CYPHER_KEY).encode()).decode()
|
|
141
|
+
setattr(provider, "token", token)
|
|
142
|
+
_save_providers(self._providers_path, providers)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def _load_providers(providers_path):
|
|
146
|
+
if not os.path.exists(providers_path):
|
|
147
|
+
default_providers = {
|
|
148
|
+
CONAN_CENTER_AUDIT_PROVIDER_NAME: {
|
|
149
|
+
"url": "https://audit.conan.io/",
|
|
150
|
+
"type": "conan-center-proxy"
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
save(providers_path, json.dumps(default_providers, indent=4))
|
|
154
|
+
|
|
155
|
+
return json.loads(load(providers_path))
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def _save_providers(providers_path, providers):
|
|
159
|
+
save(providers_path, json.dumps(providers, indent=4))
|
|
@@ -20,6 +20,7 @@ from conan.internal.model.conf import ConfDefinition, BUILT_IN_CONFS, CORE_CONF_
|
|
|
20
20
|
from conan.internal.model.pkg_type import PackageType
|
|
21
21
|
from conan.api.model import RecipeReference
|
|
22
22
|
from conan.internal.model.settings import Settings
|
|
23
|
+
from conans.client.hook_manager import HookManager
|
|
23
24
|
from conans.util.files import load, save, rmdir, remove
|
|
24
25
|
|
|
25
26
|
|
|
@@ -29,6 +30,7 @@ class ConfigAPI:
|
|
|
29
30
|
self.conan_api = conan_api
|
|
30
31
|
self._new_config = None
|
|
31
32
|
self._cli_core_confs = None
|
|
33
|
+
self.hook_manager = HookManager(HomePaths(conan_api.home_folder).hooks_path)
|
|
32
34
|
|
|
33
35
|
def home(self):
|
|
34
36
|
return self.conan_api.cache_folder
|
|
@@ -234,3 +236,4 @@ class ConfigAPI:
|
|
|
234
236
|
if self._new_config is not None:
|
|
235
237
|
self._new_config.clear()
|
|
236
238
|
self._populate_global_conf()
|
|
239
|
+
self.hook_manager = HookManager(HomePaths(self.conan_api.home_folder).hooks_path)
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
from conan.api.output import ConanOutput
|
|
2
2
|
from conan.internal.cache.cache import PkgCache
|
|
3
|
-
from conan.internal.cache.home_paths import HomePaths
|
|
4
3
|
from conan.internal.conan_app import ConanApp
|
|
5
4
|
from conan.internal.api.export import cmd_export
|
|
6
5
|
from conan.internal.methods import run_package_method
|
|
7
6
|
from conans.client.graph.graph import BINARY_BUILD, RECIPE_INCACHE
|
|
8
|
-
from conans.client.hook_manager import HookManager
|
|
9
7
|
from conan.api.model import PkgReference
|
|
10
8
|
from conans.util.files import mkdir
|
|
11
9
|
|
|
@@ -18,13 +16,13 @@ class ExportAPI:
|
|
|
18
16
|
def export(self, path, name, version, user, channel, lockfile=None, remotes=None):
|
|
19
17
|
ConanOutput().title("Exporting recipe to the cache")
|
|
20
18
|
app = ConanApp(self.conan_api)
|
|
21
|
-
hook_manager =
|
|
19
|
+
hook_manager = self.conan_api.config.hook_manager
|
|
22
20
|
return cmd_export(app, hook_manager, self.conan_api.config.global_conf, path, name, version,
|
|
23
21
|
user, channel, graph_lock=lockfile, remotes=remotes)
|
|
24
22
|
|
|
25
23
|
def export_pkg(self, deps_graph, source_folder, output_folder):
|
|
26
24
|
cache = PkgCache(self.conan_api.cache_folder, self.conan_api.config.global_conf)
|
|
27
|
-
hook_manager =
|
|
25
|
+
hook_manager = self.conan_api.config.hook_manager
|
|
28
26
|
|
|
29
27
|
# The graph has to be loaded with build_mode=[ref.name], so that node is not tried
|
|
30
28
|
# to be downloaded from remotes
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import os
|
|
2
2
|
|
|
3
3
|
from conan.internal.api.install.generators import write_generators
|
|
4
|
-
from conan.internal.cache.home_paths import HomePaths
|
|
5
4
|
from conan.internal.conan_app import ConanBasicApp
|
|
6
5
|
from conan.internal.deploy import do_deploys
|
|
7
6
|
|
|
8
7
|
from conans.client.graph.install_graph import InstallGraph
|
|
9
|
-
from conans.client.hook_manager import HookManager
|
|
10
8
|
from conans.client.installer import BinaryInstaller
|
|
11
9
|
from conan.errors import ConanInvalidConfiguration
|
|
12
10
|
|
|
@@ -22,7 +20,8 @@ class InstallAPI:
|
|
|
22
20
|
:param remotes:
|
|
23
21
|
"""
|
|
24
22
|
app = ConanBasicApp(self.conan_api)
|
|
25
|
-
installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages
|
|
23
|
+
installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages,
|
|
24
|
+
self.conan_api.config.hook_manager)
|
|
26
25
|
install_graph = InstallGraph(deps_graph)
|
|
27
26
|
install_graph.raise_errors()
|
|
28
27
|
install_order = install_graph.install_order()
|
|
@@ -35,7 +34,8 @@ class InstallAPI:
|
|
|
35
34
|
:param graph: Dependency graph to intall packages for
|
|
36
35
|
"""
|
|
37
36
|
app = ConanBasicApp(self.conan_api)
|
|
38
|
-
installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages
|
|
37
|
+
installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages,
|
|
38
|
+
self.conan_api.config.hook_manager)
|
|
39
39
|
installer.install_system_requires(graph, only_info)
|
|
40
40
|
|
|
41
41
|
def install_sources(self, graph, remotes):
|
|
@@ -45,7 +45,8 @@ class InstallAPI:
|
|
|
45
45
|
:param graph: Dependency graph to install packages for
|
|
46
46
|
"""
|
|
47
47
|
app = ConanBasicApp(self.conan_api)
|
|
48
|
-
installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages
|
|
48
|
+
installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages,
|
|
49
|
+
self.conan_api.config.hook_manager)
|
|
49
50
|
installer.install_sources(graph, remotes)
|
|
50
51
|
|
|
51
52
|
# TODO: Look for a better name
|
|
@@ -86,7 +87,7 @@ class InstallAPI:
|
|
|
86
87
|
if gen not in final_generators:
|
|
87
88
|
final_generators.append(gen)
|
|
88
89
|
conanfile.generators = final_generators
|
|
89
|
-
hook_manager =
|
|
90
|
+
hook_manager = self.conan_api.config.hook_manager
|
|
90
91
|
write_generators(conanfile, hook_manager, self.conan_api.home_folder,
|
|
91
92
|
envs_generation=envs_generation)
|
|
92
93
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import os
|
|
2
2
|
|
|
3
3
|
from conan.cli import make_abs_path
|
|
4
|
-
from conan.internal.cache.home_paths import HomePaths
|
|
5
4
|
from conan.internal.conan_app import ConanApp
|
|
6
5
|
from conan.internal.api.local.editable import EditablePackages
|
|
7
6
|
from conan.internal.methods import run_build_method, run_source_method
|
|
@@ -9,7 +8,6 @@ from conans.client.graph.graph import CONTEXT_HOST
|
|
|
9
8
|
from conans.client.graph.profile_node_definer import initialize_conanfile_profile
|
|
10
9
|
from conan.internal.errors import conanfile_exception_formatter
|
|
11
10
|
from conan.errors import ConanException
|
|
12
|
-
from conans.client.hook_manager import HookManager
|
|
13
11
|
from conan.api.model import RecipeReference
|
|
14
12
|
from conans.util.files import chdir
|
|
15
13
|
|
|
@@ -93,13 +91,13 @@ class LocalAPI:
|
|
|
93
91
|
conanfile.folders.set_base_build(None)
|
|
94
92
|
conanfile.folders.set_base_package(None)
|
|
95
93
|
|
|
96
|
-
hook_manager =
|
|
94
|
+
hook_manager = self._conan_api.config.hook_manager
|
|
97
95
|
run_source_method(conanfile, hook_manager)
|
|
98
96
|
|
|
99
97
|
def build(self, conanfile):
|
|
100
98
|
""" calls the 'build()' method of the current (user folder) conanfile.py
|
|
101
99
|
"""
|
|
102
|
-
hook_manager =
|
|
100
|
+
hook_manager = self._conan_api.config.hook_manager
|
|
103
101
|
conanfile.folders.set_base_package(conanfile.folders.base_build)
|
|
104
102
|
conanfile.folders.set_base_pkg_metadata(os.path.join(conanfile.build_folder, "metadata"))
|
|
105
103
|
run_build_method(conanfile, hook_manager)
|
|
@@ -122,6 +122,16 @@ class WorkspaceAPI:
|
|
|
122
122
|
v["output_folder"]))
|
|
123
123
|
return editables
|
|
124
124
|
|
|
125
|
+
def select_editables(self, paths):
|
|
126
|
+
filtered_refs = [self.editable_from_path(p) for p in paths or []]
|
|
127
|
+
editables = self.editable_packages
|
|
128
|
+
requires = [ref for ref in editables]
|
|
129
|
+
if filtered_refs:
|
|
130
|
+
ConanOutput().info(f"Filtering and installing only selected editable packages")
|
|
131
|
+
requires = [ref for ref in requires if ref in filtered_refs]
|
|
132
|
+
ConanOutput().info(f"Filtered references: {requires}")
|
|
133
|
+
return requires
|
|
134
|
+
|
|
125
135
|
@property
|
|
126
136
|
def products(self):
|
|
127
137
|
self._check_ws()
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
from conan.api.conan_api import ConanAPI
|
|
5
|
+
from conan.api.input import UserInput
|
|
6
|
+
from conan.api.model import MultiPackagesList
|
|
7
|
+
from conan.api.output import cli_out_write, ConanOutput
|
|
8
|
+
from conan.api.subapi.audit import CONAN_CENTER_AUDIT_PROVIDER_NAME
|
|
9
|
+
from conan.cli import make_abs_path
|
|
10
|
+
from conan.cli.args import common_graph_args, validate_common_graph_args
|
|
11
|
+
from conan.cli.command import conan_command, conan_subcommand
|
|
12
|
+
from conan.cli.formatters.audit.vulnerabilities import text_vuln_formatter, json_vuln_formatter, \
|
|
13
|
+
html_vuln_formatter
|
|
14
|
+
from conan.cli.printers import print_profiles
|
|
15
|
+
from conan.cli.printers.graph import print_graph_basic
|
|
16
|
+
from conan.errors import ConanException
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _add_provider_arg(subparser):
|
|
20
|
+
subparser.add_argument("-p", "--provider", help="Provider to use for scanning")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@conan_subcommand(formatters={"text": text_vuln_formatter,
|
|
24
|
+
"json": json_vuln_formatter,
|
|
25
|
+
"html": html_vuln_formatter})
|
|
26
|
+
def audit_scan(conan_api: ConanAPI, parser, subparser, *args):
|
|
27
|
+
"""
|
|
28
|
+
Scan a given recipe for vulnerabilities in its dependencies.
|
|
29
|
+
"""
|
|
30
|
+
common_graph_args(subparser)
|
|
31
|
+
# Needed for the validation of args, but this should usually be left as False here
|
|
32
|
+
# TODO: Do we then want to hide it in the --help?
|
|
33
|
+
subparser.add_argument("--build-require", action='store_true', default=False,
|
|
34
|
+
help='Whether the provided reference is a build-require')
|
|
35
|
+
|
|
36
|
+
_add_provider_arg(subparser)
|
|
37
|
+
args = parser.parse_args(*args)
|
|
38
|
+
|
|
39
|
+
# This comes from install command
|
|
40
|
+
|
|
41
|
+
validate_common_graph_args(args)
|
|
42
|
+
# basic paths
|
|
43
|
+
cwd = os.getcwd()
|
|
44
|
+
path = conan_api.local.get_conanfile_path(args.path, cwd, py=None) if args.path else None
|
|
45
|
+
|
|
46
|
+
# Basic collaborators: remotes, lockfile, profiles
|
|
47
|
+
remotes = conan_api.remotes.list(args.remote) if not args.no_remote else []
|
|
48
|
+
overrides = eval(args.lockfile_overrides) if args.lockfile_overrides else None
|
|
49
|
+
lockfile = conan_api.lockfile.get_lockfile(lockfile=args.lockfile, conanfile_path=path, cwd=cwd,
|
|
50
|
+
partial=args.lockfile_partial, overrides=overrides)
|
|
51
|
+
profile_host, profile_build = conan_api.profiles.get_profiles_from_args(args)
|
|
52
|
+
print_profiles(profile_host, profile_build)
|
|
53
|
+
|
|
54
|
+
# Graph computation (without installation of binaries)
|
|
55
|
+
gapi = conan_api.graph
|
|
56
|
+
if path:
|
|
57
|
+
deps_graph = gapi.load_graph_consumer(path, args.name, args.version, args.user, args.channel,
|
|
58
|
+
profile_host, profile_build, lockfile, remotes,
|
|
59
|
+
# TO DISCUSS: defaulting to False the is_build_require
|
|
60
|
+
args.update, is_build_require=args.build_require)
|
|
61
|
+
else:
|
|
62
|
+
deps_graph = gapi.load_graph_requires(args.requires, args.tool_requires, profile_host,
|
|
63
|
+
profile_build, lockfile, remotes, args.update)
|
|
64
|
+
print_graph_basic(deps_graph)
|
|
65
|
+
deps_graph.report_graph_error()
|
|
66
|
+
|
|
67
|
+
if deps_graph.error:
|
|
68
|
+
return {"error": deps_graph.error}
|
|
69
|
+
|
|
70
|
+
provider = conan_api.audit.get_provider(args.provider or CONAN_CENTER_AUDIT_PROVIDER_NAME)
|
|
71
|
+
|
|
72
|
+
return conan_api.audit.scan(deps_graph, provider)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@conan_subcommand(formatters={"text": text_vuln_formatter,
|
|
76
|
+
"json": json_vuln_formatter,
|
|
77
|
+
"html": html_vuln_formatter})
|
|
78
|
+
def audit_list(conan_api: ConanAPI, parser, subparser, *args):
|
|
79
|
+
"""
|
|
80
|
+
List the vulnerabilities of the given reference.
|
|
81
|
+
"""
|
|
82
|
+
subparser.add_argument("reference", help="Reference to list vulnerabilities for", nargs="?")
|
|
83
|
+
subparser.add_argument("-l", "--list", help="pkglist file to list vulnerabilities for", default=None)
|
|
84
|
+
subparser.add_argument("-r", "--remote", help="Remote to use for listing", default=None)
|
|
85
|
+
_add_provider_arg(subparser)
|
|
86
|
+
args = parser.parse_args(*args)
|
|
87
|
+
|
|
88
|
+
if not args.reference and not args.list:
|
|
89
|
+
raise ConanException("Please specify a reference or a pkglist file")
|
|
90
|
+
|
|
91
|
+
if args.reference and args.list:
|
|
92
|
+
raise ConanException("Please specify a reference or a pkglist file, not both")
|
|
93
|
+
|
|
94
|
+
provider = conan_api.audit.get_provider(args.provider or CONAN_CENTER_AUDIT_PROVIDER_NAME)
|
|
95
|
+
|
|
96
|
+
references = []
|
|
97
|
+
if args.list:
|
|
98
|
+
listfile = make_abs_path(args.list)
|
|
99
|
+
multi_package_list = MultiPackagesList.load(listfile)
|
|
100
|
+
cache_name = "Local Cache" if not args.remote else args.remote
|
|
101
|
+
package_list = multi_package_list[cache_name]
|
|
102
|
+
refs_to_list = package_list.serialize()
|
|
103
|
+
references = list(refs_to_list.keys())
|
|
104
|
+
if not references: # the package list might contain only refs, no revs
|
|
105
|
+
ConanOutput().warning("Nothing to list, package list do not contain recipe revisions")
|
|
106
|
+
else:
|
|
107
|
+
references = [args.reference]
|
|
108
|
+
return conan_api.audit.list(references, provider)
|
|
109
|
+
|
|
110
|
+
def text_provider_formatter(providers_action):
|
|
111
|
+
providers = providers_action[0]
|
|
112
|
+
action = providers_action[1]
|
|
113
|
+
|
|
114
|
+
if action == "remove":
|
|
115
|
+
cli_out_write("Provider removed successfully.")
|
|
116
|
+
elif action == "add":
|
|
117
|
+
cli_out_write("Provider added successfully.")
|
|
118
|
+
elif action == "auth":
|
|
119
|
+
cli_out_write("Provider authentication added.")
|
|
120
|
+
elif action == "list":
|
|
121
|
+
if not providers:
|
|
122
|
+
cli_out_write("No providers found.")
|
|
123
|
+
else:
|
|
124
|
+
for provider in providers:
|
|
125
|
+
if provider:
|
|
126
|
+
cli_out_write(f"{provider.name} (type: {provider.type}) - {provider.url}")
|
|
127
|
+
|
|
128
|
+
def json_provider_formatter(providers_action):
|
|
129
|
+
ret = []
|
|
130
|
+
for provider in providers_action[0]:
|
|
131
|
+
if provider:
|
|
132
|
+
ret.append({"name": provider.name, "url": provider.url, "type": provider.type})
|
|
133
|
+
cli_out_write(json.dumps(ret, indent=4))
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
@conan_subcommand(formatters={"text": text_provider_formatter, "json": json_provider_formatter})
|
|
137
|
+
def audit_provider(conan_api, parser, subparser, *args):
|
|
138
|
+
"""
|
|
139
|
+
Manage security providers for the 'conan audit' command.
|
|
140
|
+
"""
|
|
141
|
+
|
|
142
|
+
subparser.add_argument("action", choices=["add", "list", "auth", "remove"], help="Action to perform from 'add', 'list' , 'remove' or 'auth'")
|
|
143
|
+
subparser.add_argument("name", help="Provider name", nargs="?")
|
|
144
|
+
|
|
145
|
+
subparser.add_argument("--url", help="Provider URL")
|
|
146
|
+
subparser.add_argument("--type", help="Provider type", choices=["conan-center-proxy", "private"])
|
|
147
|
+
subparser.add_argument("--token", help="Provider token")
|
|
148
|
+
args = parser.parse_args(*args)
|
|
149
|
+
|
|
150
|
+
if args.action == "add":
|
|
151
|
+
if not args.name or not args.url or not args.type:
|
|
152
|
+
raise ConanException("Name, URL and type are required to add a provider")
|
|
153
|
+
if " " in args.name:
|
|
154
|
+
raise ConanException("Name cannot contain spaces")
|
|
155
|
+
conan_api.audit.add_provider(args.name, args.url, args.type)
|
|
156
|
+
|
|
157
|
+
if not args.token:
|
|
158
|
+
user_input = UserInput(conan_api.config.get("core:non_interactive"))
|
|
159
|
+
ConanOutput().write(f"Please enter a token for {args.name} the provider: ")
|
|
160
|
+
token = user_input.get_password()
|
|
161
|
+
else:
|
|
162
|
+
token = args.token
|
|
163
|
+
|
|
164
|
+
provider = conan_api.audit.get_provider(args.name)
|
|
165
|
+
if token:
|
|
166
|
+
conan_api.audit.auth_provider(provider, token)
|
|
167
|
+
|
|
168
|
+
return [provider], args.action
|
|
169
|
+
elif args.action == "remove":
|
|
170
|
+
if not args.name:
|
|
171
|
+
raise ConanException("Name required to remove a provider")
|
|
172
|
+
conan_api.audit.remove_provider(args.name)
|
|
173
|
+
return [], args.action
|
|
174
|
+
elif args.action == "list":
|
|
175
|
+
providers = conan_api.audit.list_providers()
|
|
176
|
+
return providers, args.action
|
|
177
|
+
elif args.action == "auth":
|
|
178
|
+
if not args.name:
|
|
179
|
+
raise ConanException("Name is required to authenticate on a provider")
|
|
180
|
+
if not args.token:
|
|
181
|
+
user_input = UserInput(conan_api.config.get("core:non_interactive"))
|
|
182
|
+
ConanOutput().write(f"Please enter a token for {args.name} the provider: ")
|
|
183
|
+
token = user_input.get_password()
|
|
184
|
+
else:
|
|
185
|
+
token = args.token
|
|
186
|
+
|
|
187
|
+
provider = conan_api.audit.get_provider(args.name)
|
|
188
|
+
conan_api.audit.auth_provider(provider, token)
|
|
189
|
+
return [provider], args.action
|
|
190
|
+
|
|
191
|
+
@conan_command(group="Security")
|
|
192
|
+
def audit(conan_api, parser, *args):
|
|
193
|
+
"""
|
|
194
|
+
Find vulnerabilities in your dependencies.
|
|
195
|
+
"""
|
|
@@ -50,8 +50,7 @@ def workspace_add(conan_api: ConanAPI, parser, subparser, *args):
|
|
|
50
50
|
subparser.add_argument('path', nargs="?",
|
|
51
51
|
help='Path to the package folder in the user workspace')
|
|
52
52
|
add_reference_args(subparser)
|
|
53
|
-
subparser.add_argument("--ref",
|
|
54
|
-
help="Open and add this reference")
|
|
53
|
+
subparser.add_argument("--ref", help="Open and add this reference")
|
|
55
54
|
subparser.add_argument("-of", "--output-folder",
|
|
56
55
|
help='The root output folder for generated and build files')
|
|
57
56
|
group = subparser.add_mutually_exclusive_group()
|
|
@@ -78,9 +77,10 @@ def workspace_add(conan_api: ConanAPI, parser, subparser, *args):
|
|
|
78
77
|
@conan_subcommand()
|
|
79
78
|
def workspace_remove(conan_api: ConanAPI, parser, subparser, *args):
|
|
80
79
|
"""
|
|
81
|
-
Remove packages
|
|
80
|
+
Remove packages from the current workspace
|
|
82
81
|
"""
|
|
83
|
-
subparser.add_argument('path',
|
|
82
|
+
subparser.add_argument('path',
|
|
83
|
+
help='Path to the package folder in the user workspace')
|
|
84
84
|
args = parser.parse_args(*args)
|
|
85
85
|
removed = conan_api.workspace.remove(make_abs_path(args.path))
|
|
86
86
|
ConanOutput().info(f"Removed from workspace: {removed}")
|
|
@@ -170,6 +170,8 @@ def workspace_install(conan_api: ConanAPI, parser, subparser, *args):
|
|
|
170
170
|
Install the workspace as a monolith, installing only external dependencies to the workspace,
|
|
171
171
|
generating a single result (generators, etc) for the whole workspace.
|
|
172
172
|
"""
|
|
173
|
+
subparser.add_argument("path", nargs="*",
|
|
174
|
+
help="Install only these editable packages, not all")
|
|
173
175
|
subparser.add_argument("-g", "--generator", action="append", help='Generators to use')
|
|
174
176
|
subparser.add_argument("-of", "--output-folder",
|
|
175
177
|
help='The root output folder for generated and build files')
|
|
@@ -191,8 +193,7 @@ def workspace_install(conan_api: ConanAPI, parser, subparser, *args):
|
|
|
191
193
|
|
|
192
194
|
conan_api.workspace.info() # FIXME: Just to force error if WS not enabled
|
|
193
195
|
# Build a dependency graph with all editables as requirements
|
|
194
|
-
|
|
195
|
-
requires = [ref for ref in editables]
|
|
196
|
+
requires = conan_api.workspace.select_editables(args.path)
|
|
196
197
|
if not requires:
|
|
197
198
|
raise ConanException("This workspace cannot be installed, it doesn't have any editable")
|
|
198
199
|
deps_graph = conan_api.graph.load_graph_requires(requires, [],
|