├── Cargo.toml ├── .gitignore ├── media ├── ks.png └── screen.png ├── keyscope ├── src │ ├── bin │ │ ├── cli │ │ │ ├── mod.rs │ │ │ ├── exit.rs │ │ │ ├── out.rs │ │ │ └── cmd.rs │ │ └── keyscope.rs │ ├── lib.rs │ ├── errors.rs │ ├── config.rs │ ├── providers.rs │ └── config.yaml ├── tests │ ├── cli_tests.rs │ └── cmd │ │ ├── external-config.trycmd │ │ ├── external-config.in │ │ └── config.yaml │ │ ├── main.trycmd │ │ ├── requirements.trycmd │ │ ├── reporter.trycmd │ │ ├── validate.trycmd │ │ └── providers.trycmd ├── examples │ └── validate.rs └── Cargo.toml ├── rustfmt.toml ├── CHANGELOG.md ├── yarn.lock ├── custom-defs.example.yaml ├── rustwrap.yaml ├── .github └── workflows │ ├── build.yml │ └── release.yml ├── LICENSE.txt ├── README.md └── Cargo.lock /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = ["keyscope"] 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | node_modules/ 3 | pkg/ 4 | dist/ 5 | keyscope/junit-out -------------------------------------------------------------------------------- /media/ks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOps/keyscope/HEAD/media/ks.png -------------------------------------------------------------------------------- /media/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpectralOps/keyscope/HEAD/media/screen.png -------------------------------------------------------------------------------- /keyscope/src/bin/cli/mod.rs: -------------------------------------------------------------------------------- 1 | mod cmd; 2 | pub mod exit; 3 | mod out; 4 | 5 | pub use cmd::*; 6 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | unstable_features = true 2 | group_imports = "StdExternalCrate" 3 | format_strings = true 4 | -------------------------------------------------------------------------------- /keyscope/tests/cli_tests.rs: -------------------------------------------------------------------------------- 1 | #[test] 2 | fn cli_tests() { 3 | let t = trycmd::TestCases::new(); 4 | t.case("tests/cmd/*.trycmd"); 5 | } 6 | -------------------------------------------------------------------------------- /keyscope/src/lib.rs: -------------------------------------------------------------------------------- 1 | pub use self::errors::Error; 2 | 3 | pub mod config; 4 | pub mod errors; 5 | pub mod providers; 6 | 7 | pub type Result = std::result::Result; 8 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 1.1.0 (next) 4 | 5 | * Added IBM COS (cloud object storage) 6 | * Added IBM IAM 7 | * Added IBM Cloudant (legacy) 8 | * Added Artifactory (JFrog) 9 | * Added Softlayer 10 | * Added Elastic Cloud 11 | * Added Github Enterprise 12 | * Added Square 13 | * Updated to latest service-policy-kit, supporting invalid responses 14 | -------------------------------------------------------------------------------- /keyscope/src/errors.rs: -------------------------------------------------------------------------------- 1 | //! A module for defining keyscope errors 2 | 3 | #[derive(thiserror::Error, Debug)] 4 | pub enum Error { 5 | #[error("provider not exists")] 6 | ProviderNotExists, 7 | 8 | #[error("validation not supported for provider")] 9 | ValidationNotSupported, 10 | 11 | #[error("empty arguments")] 12 | EmptyArguments, 13 | 14 | #[error("parameters not valid for provider")] 15 | KeyValidationParamsAreNotValid, 16 | } 17 | -------------------------------------------------------------------------------- /keyscope/examples/validate.rs: -------------------------------------------------------------------------------- 1 | use std::env; 2 | 3 | fn main() { 4 | let github_key = env::args().nth(1).unwrap_or_default(); 5 | 6 | let params = vec![github_key]; 7 | let res = match keyscope::providers::GITHUB.key_validate(¶ms) { 8 | Ok(res) => res, 9 | Err(err) => { 10 | eprintln!("Error occurred during validation: {err}"); 11 | std::process::exit(1); 12 | } 13 | }; 14 | println!("Key validation: {}", res.ok); 15 | } 16 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | lodash@^4.17.21: 6 | version "4.17.21" 7 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 8 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 9 | 10 | yaml@^1.10.2: 11 | version "1.10.2" 12 | resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" 13 | integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== 14 | -------------------------------------------------------------------------------- /custom-defs.example.yaml: -------------------------------------------------------------------------------- 1 | providers: 2 | hookbin: 3 | validation: 4 | request: 5 | params: 6 | - name: hookbin_1 7 | desc: hookbin ID (https://hookb.in) 8 | - name: hookbin_2 9 | desc: fake key to put as a query param 10 | id: "postbin:validation" 11 | desc: "Postbin: valid key" 12 | uri: "https://hookb.in/{{hookbin_1}}?q={{hookbin_2}}" 13 | method: post 14 | response: 15 | status_code: "200" 16 | body: ok 17 | examples: 18 | ok: 19 | status_code: "201" 20 | body: hello 21 | err: 22 | status_code: "500" 23 | -------------------------------------------------------------------------------- /keyscope/tests/cmd/external-config.trycmd: -------------------------------------------------------------------------------- 1 | ```console 2 | $ keyscope providers --config config.yaml --no-banner 3 | custom:validation 4 | keyscope validate custom -p custom_1 5 | 6 | custom_2:validation 7 | keyscope validate custom_2 -p custom_2_1 -p custom_2_2 8 | 9 | Total 2 providers available. 10 | 11 | ``` 12 | 13 | ```console 14 | $ keyscope requirements unexisting-provider --config config.yaml --no-banner 15 | ? 1 16 | ❗ params not found `keyscope providers` to see all available providers 17 | 18 | ``` 19 | 20 | ```console 21 | $ keyscope requirements custom --config config.yaml --no-banner 22 | provider custom requires: 23 | - param: custom_1 24 | desc: custom token 25 | optional: false 26 | 27 | To use from the CLI, run: 28 | keyscope validate custom -p PARAM1 -p PARAM2 ... 29 | 30 | ``` 31 | 32 | ```console 33 | $ keyscope validate custom -p test --config config.yaml --no-banner --dry-run 34 | • custom:validation: started 35 | ✔ custom:validation: ok [..] 36 | 37 | Ran 1 interactions with 1 checks in [..] 38 | 39 | ``` 40 | -------------------------------------------------------------------------------- /keyscope/tests/cmd/external-config.in/config.yaml: -------------------------------------------------------------------------------- 1 | providers: 2 | custom: 3 | validation: 4 | request: 5 | id: "custom:validation" 6 | desc: "custom: valid API credentials" 7 | params: 8 | - name: custom_1 9 | desc: custom token 10 | uri: https://example 11 | method: get 12 | headers: 13 | Authorization: 14 | - token {{custom_1}} 15 | response: 16 | status_code: "200" 17 | invalid: 18 | status_code: "5\\d\\d" 19 | 20 | custom_2: 21 | validation: 22 | request: 23 | id: "custom_2:validation" 24 | desc: "custom_2: valid token" 25 | params: 26 | - name: custom_2_1 27 | desc: custom_2 token 28 | - name: custom_2_2 29 | desc: custom_2 token 30 | uri: https://example 31 | headers: 32 | Authorization: 33 | - "Bearer {{custom_1}}" 34 | response: 35 | status_code: "200" 36 | invalid: 37 | status_code: "5\\d\\d" 38 | 39 | -------------------------------------------------------------------------------- /keyscope/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "keyscope" 3 | version = "1.4.2" 4 | edition = "2021" 5 | rust-version = "1.80.0" 6 | license = "Apache-2.0" 7 | readme = "../README.md" 8 | description = "Keyscope is a key and secret workflow " 9 | repository = "https://github.com/SpectralOps/keyscope" 10 | 11 | 12 | [features] 13 | default = ["cli"] 14 | cli = ["dep:clap", "dep:tracing-subscriber", "dep:console"] 15 | 16 | [[bin]] 17 | name = "keyscope" 18 | required-features = ["cli"] 19 | 20 | [dependencies] 21 | # CLI 22 | clap = { version = "4.5.4", features = ["derive"], optional = true } 23 | 24 | # Logger 25 | tracing = { version = "0.1.40" } 26 | tracing-subscriber = { version = "0.3.16", features = [ 27 | "env-filter", 28 | ], optional = true } 29 | service_policy_kit = { version = "0.7.1" } 30 | serde = { version = "1.0.200" } 31 | serde_derive = "1.0.200" 32 | serde_yaml = { version = "0.9.34" } 33 | serde_variant = { version = "0.1.3" } 34 | thiserror = { version = "1.0.59" } 35 | anyhow = { version = "1.0.82" } 36 | console = { version = "0.15.8", optional = true } 37 | 38 | [dev-dependencies] 39 | trycmd = { version = "0.15.1" } 40 | -------------------------------------------------------------------------------- /rustwrap.yaml: -------------------------------------------------------------------------------- 1 | repo: spectralops/keyscope 2 | targets: 3 | - platform: win32 4 | arch: x64 5 | url_template: https://github.com/spectralops/keyscope/releases/download/v__VERSION__/keyscope-x86_64-windows.zip 6 | - platform: linux 7 | arch: x64 8 | url_template: https://github.com/spectralops/keyscope/releases/download/v__VERSION__/keyscope-x86_64-linux.tar.xz 9 | - platform: darwin 10 | arch: x64 11 | url_template: https://github.com/spectralops/keyscope/releases/download/v__VERSION__/keyscope-x86_64-macos.tar.xz 12 | - platform: darwin 13 | arch: arm64 14 | url_template: https://github.com/spectralops/keyscope/releases/download/v__VERSION__/keyscope-aarch64-macos.tar.xz 15 | brew: 16 | name: mm 17 | publish: true 18 | tap: spectralops/homebrew-tap 19 | recipe_fname: keyscope.rb 20 | recipe_template: | 21 | class Keyscope < Formula 22 | desc "Keyscope is a key and secret workflow (validation, invalidation, etc.) tool built in Rust" 23 | homepage "http://github.com/spectralops/keyscope" 24 | url "__URL__" 25 | version "__VERSION__" 26 | sha256 "__SHA__" 27 | 28 | def install 29 | bin.install "keyscope" 30 | end 31 | end 32 | 33 | -------------------------------------------------------------------------------- /keyscope/tests/cmd/main.trycmd: -------------------------------------------------------------------------------- 1 | ```console 2 | $ keyscope 3 | ? 2 4 | Keyscope is a key and secret workflow 5 | 6 | Usage: keyscope[EXE] [OPTIONS] 7 | 8 | Commands: 9 | validate Validate keys 10 | requirements Show provider requirements (params) 11 | providers Show provider list 12 | help Print this message or the help of the given subcommand(s) 13 | 14 | Options: 15 | -n, --no-banner Don't show the banner 16 | -v, --verbose Log level 17 | -c, --config Path to configuration file 18 | -h, --help Print help 19 | -V, --version Print version 20 | 21 | ``` 22 | 23 | ```console 24 | $ keyscope --help 25 | Keyscope is a key and secret workflow 26 | 27 | Usage: keyscope[EXE] [OPTIONS] 28 | 29 | Commands: 30 | validate Validate keys 31 | requirements Show provider requirements (params) 32 | providers Show provider list 33 | help Print this message or the help of the given subcommand(s) 34 | 35 | Options: 36 | -n, --no-banner Don't show the banner 37 | -v, --verbose Log level 38 | -c, --config Path to configuration file 39 | -h, --help Print help 40 | -V, --version Print version 41 | 42 | ``` 43 | -------------------------------------------------------------------------------- /keyscope/tests/cmd/requirements.trycmd: -------------------------------------------------------------------------------- 1 | ```console 2 | $ keyscope requirements --help 3 | Show provider requirements (params) 4 | 5 | Usage: keyscope[EXE] requirements [OPTIONS] 6 | 7 | Arguments: 8 | Specify the provider to validate for 9 | 10 | Options: 11 | -n, --no-banner Don't show the banner 12 | -v, --verbose Log level 13 | -c, --config Path to configuration file 14 | -h, --help Print help 15 | -V, --version Print version 16 | 17 | ``` 18 | 19 | ```console 20 | $ keyscope requirements 21 | ? 2 22 | error: the following required arguments were not provided: 23 | 24 | 25 | Usage: keyscope[EXE] requirements 26 | 27 | For more information, try '--help'. 28 | 29 | ``` 30 | 31 | ```console 32 | $ keyscope requirements unexisting-provider --no-banner 33 | ? 1 34 | ❗ params not found `keyscope providers` to see all available providers 35 | 36 | ``` 37 | 38 | ```console 39 | $ keyscope requirements tester --no-banner 40 | provider tester requires: 41 | - param: tester_1 42 | desc: hookbin ID (https://hookb.in) 43 | optional: false 44 | - param: tester_2 45 | desc: fake key to put as a query param 46 | optional: false 47 | 48 | To use from the CLI, run: 49 | keyscope validate tester -p PARAM1 -p PARAM2 ... 50 | 51 | ``` 52 | -------------------------------------------------------------------------------- /keyscope/src/config.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | use std::sync::LazyLock; 3 | 4 | use serde_derive::{Deserialize, Serialize}; 5 | 6 | use crate::{providers, Error, Result}; 7 | 8 | pub static DEFAULT_CONFIG: LazyLock = 9 | LazyLock::new(|| serde_yaml::from_str(include_str!("config.yaml")).unwrap()); 10 | 11 | #[derive(Debug, Serialize, Deserialize)] 12 | pub struct Definitions { 13 | pub providers: HashMap, 14 | } 15 | 16 | impl From for Config { 17 | fn from(definitions: Definitions) -> Self { 18 | let providers = definitions 19 | .providers 20 | .into_iter() 21 | .map(|(name, config)| providers::Provider::new(name, config)) 22 | .collect(); 23 | 24 | Self { providers } 25 | } 26 | } 27 | 28 | #[derive(Debug, Serialize)] 29 | pub struct Config { 30 | pub providers: Vec, 31 | } 32 | 33 | impl Default for Config { 34 | fn default() -> Self { 35 | let providers: Vec = providers::all_providers(); 36 | Self { providers } 37 | } 38 | } 39 | 40 | impl Config { 41 | /// Get provider by name 42 | /// 43 | /// # Errors 44 | /// 45 | /// Return [`Error`] if provider not exists 46 | pub fn get_providers(&self, name: &str) -> Result<&providers::Provider> { 47 | self.providers 48 | .iter() 49 | .find(|p| p.name() == name) 50 | .ok_or(Error::ProviderNotExists) 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /keyscope/src/bin/keyscope.rs: -------------------------------------------------------------------------------- 1 | mod cli; 2 | 3 | use clap::Parser; 4 | use console::style; 5 | use tracing::level_filters::LevelFilter; 6 | use tracing_subscriber::EnvFilter; 7 | 8 | pub const BANNER: &str = r" 9 | __ 10 | / /_____ __ ________________ ____ ___ 11 | / // / _ \/ / / / ___/ ___/ __ \/ __ \/ _ \ 12 | / cmd, 38 | Err(err) => cli::exit::CmdResult::error_with_message(err.to_string().as_str()), 39 | } 40 | .exit(); 41 | } 42 | 43 | pub fn tracing(verbose: bool) { 44 | let level = if verbose { 45 | LevelFilter::DEBUG 46 | } else { 47 | LevelFilter::OFF 48 | }; 49 | tracing_subscriber::fmt() 50 | .with_env_filter( 51 | EnvFilter::builder() 52 | .with_default_directive(level.into()) 53 | .from_env_lossy(), 54 | ) 55 | .with_line_number(true) 56 | .with_target(true) 57 | .init(); 58 | } 59 | -------------------------------------------------------------------------------- /keyscope/tests/cmd/reporter.trycmd: -------------------------------------------------------------------------------- 1 | ```console 2 | $ keyscope validate tester -p arg1 -p arg2 --no-banner --reporter stdout 3 | ? 1 4 | • tester:validation: started 5 | ✗ tester:validation: error [..] 6 | └─ error: error sending request for url (https://hookb.in/arg1?q=arg1) 7 | 8 | Ran 1 interactions with 1 checks in [..] 9 | 10 | ``` 11 | 12 | ```console 13 | $ keyscope validate tester -p arg1 -p arg2 --no-banner --reporter json 14 | ? 1 15 | {"interactions":[{"examples":{"err":{"request_id":null,"status_code":"500"},"ok":{"body":"hello","request_id":null,"status_code":"201"}},"invalid":{"request_id":null,"status_code":"5//d//d"},"request":{"desc":"Tester: valid key","id":"tester:validation","method":"post","params":[{"desc":"hookbin ID (https://hookb.in)","name":"tester_1","optional":false},{"desc":"fake key to put as a query param","name":"tester_2","optional":false}],"uri":"https://hookb.in/{{tester_1}}?q={{tester_1}}"},"response":{"request_id":null,"status_code":"200"}}],"results":[{"duration":{"nanos":[..],"secs":[..]},"error":"error sending request for url (https://hookb.in/arg1?q=arg1)","kind":"content","request":{"desc":"Tester: valid key","id":"tester:validation","method":"post","params":[{"desc":"hookbin ID (https://hookb.in)","name":"tester_1","optional":false},{"desc":"fake key to put as a query param","name":"tester_2","optional":false}],"uri":"https://hookb.in/{{tester_1}}?q={{tester_1}}"},"response":null,"violations":[]}]} 16 | 17 | ``` 18 | 19 | ```console 20 | $ keyscope validate tester -p arg1 -p arg2 --no-banner --reporter junit 21 | ? 1 22 | wrote: junit-out/junit.xml 23 | 24 | ``` 25 | 26 | ```console 27 | $ keyscope validate tester -p arg1 -p arg2 --no-banner --reporter quiet 28 | ? 1 29 | 30 | ``` -------------------------------------------------------------------------------- /keyscope/src/bin/cli/exit.rs: -------------------------------------------------------------------------------- 1 | //! A module for handling command line exits with custom messages and exit 2 | //! codes. 3 | //! 4 | //! This module provides a convenient way to handle command line exits with 5 | //! custom messages and exit codes. 6 | use std::process::exit; 7 | 8 | /// Represents a command exit object with a custom message and exit code. 9 | #[derive(Debug)] 10 | pub struct CmdResult { 11 | /// The exit code associated with the exit. 12 | pub code: i32, 13 | /// The optional message associated with the exit. 14 | pub message: Option, 15 | } 16 | 17 | impl CmdResult { 18 | /// Creates a new [`CmdExit`] instance with an error message and exit code 1. 19 | #[must_use] 20 | pub fn error_with_message(message: &str) -> Self { 21 | Self { 22 | code: 1, 23 | message: Some(format!("❗ {message}")), 24 | } 25 | } 26 | /// Creates a new [`CmdExit`] instance exit code 1. 27 | #[must_use] 28 | pub const fn error() -> Self { 29 | Self { 30 | code: 1, 31 | message: None, 32 | } 33 | } 34 | 35 | /// Creates a new [`CmdExit`] instance with a success message and exit code 0. 36 | #[must_use] 37 | pub fn ok_with_message(message: &str) -> Self { 38 | Self { 39 | code: 0, 40 | message: Some(message.to_string()), 41 | } 42 | } 43 | 44 | /// Creates a new [`CmdExit`] instance with a success message and exit code 0 without any message. 45 | #[must_use] 46 | pub const fn ok() -> Self { 47 | Self { 48 | code: 0, 49 | message: None, 50 | } 51 | } 52 | 53 | /// Exits the command line with the configured message and exit code. 54 | pub fn exit(&self) { 55 | if let Some(message) = &self.message { 56 | eprintln!("{message}"); 57 | } 58 | 59 | exit(self.code); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /keyscope/tests/cmd/validate.trycmd: -------------------------------------------------------------------------------- 1 | ```console 2 | $ keyscope validate --help 3 | Validate keys 4 | 5 | Usage: keyscope[EXE] validate [OPTIONS] 6 | 7 | Arguments: 8 | 9 | Specify the provider to validate for 10 | 11 | Options: 12 | -d, --dry-run 13 | Dry run with examples given in `EXAMPLE_KEY` 14 | 15 | -r, --reporter 16 | Reporter to use 17 | 18 | [default: stdout] 19 | 20 | Possible values: 21 | - stdout: Export to the console STDOUT 22 | - json: Json format 23 | - junit: Junit format 24 | - quiet: disable check results 25 | 26 | -f, --flip 27 | Flip the meaning of success 28 | 29 | -n, --no-banner 30 | Don't show the banner 31 | 32 | -p, --params 33 | List of parameters 34 | 35 | -v, --verbose 36 | Log level 37 | 38 | -c, --config 39 | Path to configuration file 40 | 41 | -h, --help 42 | Print help (see a summary with '-h') 43 | 44 | -V, --version 45 | Print version 46 | 47 | ``` 48 | 49 | ```console 50 | $ keyscope validate unexisting-provider --no-banner 51 | ? 1 52 | ❗ params not found `keyscope providers` to see all available providers 53 | 54 | ``` 55 | 56 | ```console 57 | $ keyscope validate tester --no-banner 58 | ? 1 59 | ❗ empty arguments 60 | 61 | ``` 62 | 63 | ```console 64 | $ keyscope validate tester -p arg1 --no-banner 65 | ? 1 66 | ❗ parameters not valid for provider 67 | 68 | ``` 69 | 70 | ```console 71 | $ keyscope validate github -p arg1 --no-banner 72 | ? 1 73 | • github:validation: started 74 | ✗ github:validation: failed [..] 75 | 76 | Ran 1 interactions with 1 checks in [..] 77 | 78 | ``` 79 | 80 | ```console 81 | $ keyscope validate github -p arg1 --no-banner --dry-run 82 | • github:validation: started 83 | ✔ github:validation: ok [..] 84 | 85 | Ran 1 interactions with 1 checks in [..] 86 | 87 | ``` 88 | 89 | ```console 90 | $ keyscope validate github -p arg1 --no-banner --dry-run --flip 91 | ? 1 92 | • github:validation: started 93 | ✔ github:validation: ok [..] 94 | 95 | Ran 1 interactions with 1 checks in [..] 96 | 97 | ``` 98 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - master 7 | schedule: 8 | - cron: '00 01 * * *' 9 | 10 | env: 11 | RUST_TOOLCHAIN: stable 12 | TOOLCHAIN_PROFILE: minimal 13 | 14 | jobs: 15 | check: 16 | name: Check 17 | runs-on: ubuntu-latest 18 | steps: 19 | - name: Checkout sources 20 | uses: actions/checkout@v2 21 | 22 | - name: Install stable toolchain 23 | uses: actions-rs/toolchain@v1 24 | with: 25 | profile: ${{ env.TOOLCHAIN_PROFILE }} 26 | toolchain: ${{ env.RUST_TOOLCHAIN }} 27 | override: true 28 | 29 | - uses: Swatinem/rust-cache@v1 30 | 31 | - name: Run cargo check 32 | uses: actions-rs/cargo@v1 33 | with: 34 | command: check 35 | 36 | rustfmt: 37 | name: Check Style 38 | runs-on: ubuntu-latest 39 | permissions: 40 | contents: read 41 | steps: 42 | - name: Checkout the code 43 | uses: actions/checkout@v4 44 | - uses: actions-rs/toolchain@v1 45 | with: 46 | profile: ${{ env.TOOLCHAIN_PROFILE }} 47 | toolchain: ${{ env.RUST_TOOLCHAIN }} 48 | override: true 49 | components: rustfmt 50 | - name: Run cargo fmt 51 | uses: actions-rs/cargo@v1 52 | with: 53 | command: fmt 54 | args: --all -- --check 55 | 56 | clippy: 57 | name: Clippy 58 | runs-on: ubuntu-latest 59 | steps: 60 | - name: Checkout sources 61 | uses: actions/checkout@v2 62 | with: 63 | submodules: true 64 | 65 | - name: Install stable toolchain 66 | uses: actions-rs/toolchain@v1 67 | with: 68 | profile: ${{ env.TOOLCHAIN_PROFILE }} 69 | toolchain: ${{ env.RUST_TOOLCHAIN }} 70 | override: true 71 | components: rustfmt, clippy 72 | 73 | - uses: Swatinem/rust-cache@v1 74 | 75 | - name: Run cargo clippy 76 | uses: actions-rs/cargo@v1 77 | with: 78 | command: clippy 79 | args: --all-features -- -D warnings -W clippy::pedantic -W clippy::nursery -W rust-2018-idioms 80 | 81 | test: 82 | name: Test Suite 83 | strategy: 84 | matrix: 85 | os: [ubuntu-latest, macos-latest, windows-latest] 86 | rust: [stable] 87 | runs-on: ${{ matrix.os }} 88 | steps: 89 | - name: Checkout sources 90 | uses: actions/checkout@v2 91 | 92 | - name: Install stable toolchain 93 | uses: actions-rs/toolchain@v1 94 | with: 95 | profile: ${{ env.TOOLCHAIN_PROFILE }} 96 | toolchain: ${{ matrix.rust }} 97 | override: true 98 | 99 | - uses: Swatinem/rust-cache@v1 100 | 101 | - name: Run cargo test 102 | uses: actions-rs/cargo@v1 103 | with: 104 | command: test -------------------------------------------------------------------------------- /keyscope/src/bin/cli/out.rs: -------------------------------------------------------------------------------- 1 | //! A module for exporting content 2 | //! 3 | //! This module provides functionality to export content to different formats 4 | //! and destinations. 5 | use console::style; 6 | use keyscope::providers::Provider; 7 | use serde::{Deserialize, Serialize}; 8 | use serde_variant::to_variant_name; 9 | use service_policy_kit::data::Param; 10 | use std::fmt::Write; 11 | 12 | #[derive(clap::ValueEnum, Debug, Clone, Deserialize, Serialize)] 13 | pub enum Reporter { 14 | /// Export to the console STDOUT. 15 | #[serde(rename = "console")] 16 | Stdout, 17 | /// Json format. 18 | #[serde(rename = "json")] 19 | Json, 20 | /// Junit format. 21 | #[serde(rename = "junit")] 22 | Junit, 23 | /// disable check results. 24 | #[serde(rename = "quiet")] 25 | Quiet, 26 | } 27 | 28 | impl std::fmt::Display for Reporter { 29 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 30 | to_variant_name(self).expect("only enum supported").fmt(f) 31 | } 32 | } 33 | 34 | pub const fn provider_not_found() -> &'static str { 35 | "params not found `keyscope providers` to see all available providers" 36 | } 37 | 38 | pub fn requirements_results(provider: &Provider, params: &[Param]) -> String { 39 | let params_str: String = params 40 | .iter() 41 | .map(|p| { 42 | format!( 43 | " - param: {}\n desc: {}\n optional: {}", 44 | p.name, p.desc, p.optional 45 | ) 46 | }) 47 | .collect::>() 48 | .join("\n"); 49 | 50 | format!( 51 | "provider {} requires:\n{params_str}\n\nTo use from the CLI, run:\n keyscope validate {} \ 52 | -p PARAM1 -p PARAM2 ...", 53 | provider.name(), 54 | provider.name() 55 | ) 56 | } 57 | 58 | pub fn supported_providers(providers: &[Provider]) -> String { 59 | let mut result = String::new(); 60 | 61 | let mut providers = providers.iter().collect::>(); 62 | providers.sort_by(|a, b| a.name().cmp(b.name())); 63 | 64 | for provider in &providers { 65 | if let Some(validation) = provider.config().validation.as_ref() { 66 | let _ = write!( 67 | result, 68 | "{}\nkeyscope validate {} -p {}\n\n", 69 | style(validation.request.get_id()).magenta(), 70 | style(provider.name()).yellow(), 71 | style( 72 | validation 73 | .request 74 | .params 75 | .as_ref() 76 | .map(|p| p 77 | .iter() 78 | .map(|param| style(param.name.clone()).blue().to_string()) 79 | .collect::>() 80 | .join(" -p ")) 81 | .unwrap_or_default() 82 | ) 83 | .blue() 84 | ); 85 | } 86 | } 87 | let _ = write!( 88 | result, 89 | "Total {} providers available.", 90 | providers 91 | .iter() 92 | .filter(|provider| provider.config().validation.is_some()) 93 | .count(), 94 | ); 95 | result 96 | } 97 | -------------------------------------------------------------------------------- /keyscope/src/bin/cli/cmd.rs: -------------------------------------------------------------------------------- 1 | use std::path::PathBuf; 2 | 3 | use clap::{ArgAction, Parser, Subcommand}; 4 | use keyscope::config::{Config, Definitions}; 5 | use service_policy_kit::runner::RunOptions; 6 | 7 | use super::{exit::CmdResult, out}; 8 | 9 | #[derive(Parser)] 10 | #[command(author, version, about, long_about = None)] 11 | #[command(propagate_version = true)] 12 | pub struct Cli { 13 | #[command(subcommand)] 14 | pub command: Commands, 15 | 16 | /// Don't show the banner 17 | #[arg(global = true, short, long, action = ArgAction::SetFalse)] 18 | pub no_banner: bool, 19 | 20 | /// Log level 21 | #[arg(global = true, short, long, action = ArgAction::SetTrue)] 22 | pub verbose: bool, 23 | 24 | /// Path to configuration file 25 | #[arg(global = true, short, long)] 26 | pub config: Option, 27 | } 28 | 29 | #[derive(Subcommand)] 30 | pub enum Commands { 31 | /// Validate keys 32 | Validate { 33 | /// Specify the provider to validate for 34 | #[arg(index = 1)] 35 | provider: String, 36 | 37 | /// Dry run with examples given in `EXAMPLE_KEY` 38 | #[arg(short, long, action = ArgAction::SetTrue)] 39 | dry_run: bool, 40 | 41 | /// Reporter to use 42 | #[arg(short, long, value_enum, default_value = "stdout")] 43 | reporter: out::Reporter, 44 | 45 | /// Flip the meaning of success 46 | #[arg(short, long, action = ArgAction::SetTrue)] 47 | flip: bool, 48 | 49 | /// List of parameters 50 | #[arg(short, long)] 51 | params: Vec, 52 | }, 53 | /// Show provider requirements (params) 54 | Requirements { 55 | /// Specify the provider to validate for 56 | #[arg(index = 1)] 57 | provider: String, 58 | }, 59 | /// Show provider list 60 | Providers {}, 61 | } 62 | 63 | #[allow(clippy::unused_async)] 64 | // TODO:: Remove anyhow 65 | pub fn run(args: Cli) -> anyhow::Result { 66 | let config: Config = match args.config { 67 | Some(config_file) => { 68 | let def: Definitions = serde_yaml::from_reader(std::fs::File::open(config_file)?)?; 69 | def.into() 70 | } 71 | None => Config::default(), 72 | }; 73 | 74 | match args.command { 75 | Commands::Validate { 76 | provider, 77 | dry_run, 78 | reporter, 79 | flip, 80 | params, 81 | } => { 82 | // check if provider exists 83 | let provider = match config.get_providers(&provider) { 84 | Ok(p) => p, 85 | Err(err) => { 86 | tracing::debug!(provider = provider, error = ?err, "provider not exists"); 87 | return Ok(CmdResult::error_with_message(out::provider_not_found())); 88 | } 89 | }; 90 | 91 | let opts: RunOptions = RunOptions::build( 92 | if dry_run { 93 | Some("example".to_string()) 94 | } else { 95 | None 96 | }, 97 | flip, 98 | match reporter { 99 | out::Reporter::Quiet => None, 100 | _ => Some(reporter.to_string()), 101 | }, 102 | args.verbose, 103 | ); 104 | 105 | let res = provider.key_validate_with_opts(¶ms, &opts)?; 106 | 107 | if res.ok { 108 | Ok(CmdResult::ok()) 109 | } else { 110 | Ok(CmdResult::error()) 111 | } 112 | } 113 | Commands::Requirements { provider } => { 114 | let provider = match config.get_providers(&provider) { 115 | Ok(p) => p, 116 | Err(err) => { 117 | tracing::debug!(provider = provider, error = ?err, "provider not exists"); 118 | return Ok(CmdResult::error_with_message(out::provider_not_found())); 119 | } 120 | }; 121 | let Some(params) = provider.get_validation_request_params()? else { 122 | return Ok(CmdResult::error_with_message("params not found")); 123 | }; 124 | 125 | Ok(CmdResult::ok_with_message(&out::requirements_results( 126 | provider, params, 127 | ))) 128 | } 129 | Commands::Providers {} => Ok(CmdResult::ok_with_message(&out::supported_providers( 130 | &config.providers, 131 | ))), 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /keyscope/tests/cmd/providers.trycmd: -------------------------------------------------------------------------------- 1 | ```console 2 | $ keyscope providers --help 3 | Show provider list 4 | 5 | Usage: keyscope[EXE] providers [OPTIONS] 6 | 7 | Options: 8 | -n, --no-banner Don't show the banner 9 | -v, --verbose Log level 10 | -c, --config Path to configuration file 11 | -h, --help Print help 12 | -V, --version Print version 13 | 14 | ``` 15 | 16 | ```console 17 | $ keyscope providers --no-banner 18 | algolia:validation 19 | keyscope validate algolia -p algolia_1 -p algolia_2 -p algolia_3 20 | 21 | artifactory:validation 22 | keyscope validate artifactory -p artifactory_1 -p artifactory_2 23 | 24 | artifactory-access-token:validation 25 | keyscope validate artifactory-access-token -p artifactory-access-token_1 -p artifactory-access-token_2 26 | 27 | asana:validation 28 | keyscope validate asana -p asana_1 29 | 30 | aws:validation 31 | keyscope validate aws -p aws_1 -p aws_2 -p aws_3 32 | 33 | bingmaps:validation 34 | keyscope validate bingmaps -p bingmaps_1 35 | 36 | bitly:validation 37 | keyscope validate bitly -p bitly_1 38 | 39 | branch.io:validation 40 | keyscope validate branchio -p branchio_1 -p branchio_2 41 | 42 | browserstack:validation 43 | keyscope validate browserstack -p browserstack_1 -p browserstack_2 44 | 45 | buildkite:validation 46 | keyscope validate buildkite -p buildkite_1 47 | 48 | buttercms:validation 49 | keyscope validate buttercms -p buttercms_1 50 | 51 | calendly:validation 52 | keyscope validate calendly -p calendly_1 53 | 54 | circleci:validation 55 | keyscope validate circleci -p circleci_1 56 | 57 | covalent:validation 58 | keyscope validate covalenthq -p covalenthq_1 59 | 60 | datadog:validation 61 | keyscope validate datadog -p datadog_1 62 | 63 | dropbox:validation 64 | keyscope validate dropbox -p dropbox_1 65 | 66 | elastic-apm-secret:validation 67 | keyscope validate elastic-apm-secret -p elastic-apm-secret_1 -p elastic-apm-secret_2 68 | 69 | facebook:validation 70 | keyscope validate facebook-access-token -p facebook-access-token_1 71 | 72 | firebase:validation 73 | keyscope validate firebase -p firebase_1 -p firebase_2 74 | 75 | gcp-api-key:validation 76 | keyscope validate gcp-api-key -p gcp-api-key_1 77 | 78 | github:validation 79 | keyscope validate github -p github_1 80 | 81 | github-ent:validation 82 | keyscope validate github-ent -p github-ent_1 -p github-ent_2 83 | 84 | gitlab:validation 85 | keyscope validate gitlab -p gitlab_1 86 | 87 | heroku:validation 88 | keyscope validate heroku -p heroku_1 89 | 90 | hubspot:validation 91 | keyscope validate hubspot -p hubspot_1 92 | 93 | ibm-cloudant:validation 94 | keyscope validate ibm-cloudant -p ibm-cloudant_1 -p ibm-cloudant_2 -p ibm-cloudant_3 95 | 96 | ibm-cos:validation 97 | keyscope validate ibm-cos -p ibm-cos_1 -p ibm-cos_2 98 | 99 | ibm-iam:validation 100 | keyscope validate ibm-iam -p ibm-iam_1 101 | 102 | infura:validation 103 | keyscope validate infura -p infura_1 104 | 105 | ipstack:validation 106 | keyscope validate ipstack -p ipstack_1 107 | 108 | jumpcloud:validation 109 | keyscope validate jumpcloud -p jumpcloud_1 110 | 111 | localytics:validation 112 | keyscope validate localytics -p localytics_1 -p localytics_2 113 | 114 | lokalise:validation 115 | keyscope validate lokalise -p lokalise_1 116 | 117 | mailchimp:validation 118 | keyscope validate mailchimp -p mailchimp_1 -p mailchimp_2 119 | 120 | mailgun:validation 121 | keyscope validate mailgun -p mailgun_1 122 | 123 | okta:validation 124 | keyscope validate okta -p okta_1 -p okta_2 125 | 126 | openai-api-key:validation 127 | keyscope validate openai-api-key -p openai-api-key_1 128 | 129 | opsgenie:validation 130 | keyscope validate opsgenie -p opsgenie_1 131 | 132 | pagerduty:validation 133 | keyscope validate pagerduty -p pagerduty_1 134 | 135 | pendo:validation 136 | keyscope validate pendo -p pendo_1 137 | 138 | salesforce:validation 139 | keyscope validate salesforce -p salesforce_1 -p salesforce_2 140 | 141 | saucelabs-eu:validation 142 | keyscope validate saucelabs-eu -p saucelabs-eu_1 -p saucelabs-eu_2 143 | 144 | saucelabs-us:validation 145 | keyscope validate saucelabs-us -p saucelabs-us_1 -p saucelabs-us_2 146 | 147 | sendgrid:validation 148 | keyscope validate sendgrid -p sendgrid_1 149 | 150 | shodan:validation 151 | keyscope validate shodan -p shodan_1 152 | 153 | slack:validation 154 | keyscope validate slack -p slack_1 155 | 156 | slack-app-key:validation 157 | keyscope validate slack-app-key -p slack-app-key_1 158 | 159 | slack-webook:validation 160 | keyscope validate slack-webhook -p slack-webhook_1 161 | 162 | snyk:validation 163 | keyscope validate snyk -p snyk_1 164 | 165 | softlayer:validation 166 | keyscope validate softlayer -p softlayer_1 -p softlayer_2 167 | 168 | square:validation 169 | keyscope validate square -p square_1 170 | 171 | stripe:validation 172 | keyscope validate stripe -p stripe_1 173 | 174 | telegram-bot:validation 175 | keyscope validate telegram-bot -p telegram-bot_1 176 | 177 | tester:validation 178 | keyscope validate tester -p tester_1 -p tester_2 179 | 180 | travisci:validation 181 | keyscope validate travisci -p travisci_1 -p travisci_2 182 | 183 | twilio:validation 184 | keyscope validate twilio -p twilio_1 -p twilio_2 185 | 186 | twitter:validation 187 | keyscope validate twitter -p twitter_1 188 | 189 | wakatime:validation 190 | keyscope validate wakatime -p wakatime_1 191 | 192 | zendesk:validation 193 | keyscope validate zendesk -p zendesk_1 -p zendesk_2 194 | 195 | Total 59 providers available. 196 | 197 | ``` 198 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | on: 3 | # schedule: 4 | # - cron: '0 0 * * *' # midnight UTC 5 | 6 | push: 7 | tags: 8 | - 'v[0-9]+.[0-9]+.[0-9]+' 9 | ## - release 10 | 11 | # 1. set up: 12 | # secrets.COMMITTER_TOKEN - for pushing update to brew tap 13 | # first placeholder formula in brew tap - for updating 14 | 15 | # 2. fill these in and you're done. 16 | env: 17 | BIN_NAME: keyscope 18 | PROJECT_NAME: keyscope 19 | REPO_NAME: spectralops/keyscope 20 | 21 | jobs: 22 | dist: 23 | name: Dist 24 | runs-on: ${{ matrix.os }} 25 | strategy: 26 | fail-fast: false # don't fail other jobs if one fails 27 | matrix: 28 | build: [x86_64-linux, x86_64-macos, aarch64-macos, x86_64-windows] #, x86_64-win-gnu, win32-msvc aarch64-linux, 29 | include: 30 | - build: x86_64-linux 31 | os: ubuntu-20.04 32 | rust: stable 33 | target: x86_64-unknown-linux-gnu 34 | cross: false 35 | 36 | # - build: aarch64-linux # this fails on openssl 37 | # os: ubuntu-20.04 38 | # rust: stable 39 | # target: aarch64-unknown-linux-gnu 40 | # cross: true 41 | 42 | - build: x86_64-macos 43 | os: macos-latest 44 | rust: stable 45 | target: x86_64-apple-darwin 46 | cross: false 47 | - build: x86_64-windows 48 | os: windows-2019 49 | rust: stable 50 | target: x86_64-pc-windows-msvc 51 | cross: false 52 | - build: aarch64-macos 53 | os: macos-latest 54 | rust: stable 55 | target: aarch64-apple-darwin 56 | # - build: aarch64-macos 57 | # os: macos-latest 58 | # rust: stable 59 | # target: aarch64-apple-darwin 60 | # - build: x86_64-win-gnu 61 | # os: windows-2019 62 | # rust: stable-x86_64-gnu 63 | # target: x86_64-pc-windows-gnu 64 | # - build: win32-msvc 65 | # os: windows-2019 66 | # rust: stable 67 | # target: i686-pc-windows-msvc 68 | 69 | steps: 70 | - name: Checkout sources 71 | uses: actions/checkout@v2 72 | with: 73 | submodules: true 74 | 75 | - name: Install ${{ matrix.rust }} toolchain 76 | uses: actions-rs/toolchain@v1 77 | with: 78 | profile: minimal 79 | toolchain: ${{ matrix.rust }} 80 | target: ${{ matrix.target }} 81 | override: true 82 | 83 | - name: Install OpenSSL 84 | if: matrix.build == 'aarch64-linux' 85 | run: sudo apt-get install libssl-dev pkg-config 86 | 87 | - name: Run cargo test 88 | if: matrix.build != 'aarch64-macos' 89 | uses: actions-rs/cargo@v1 90 | with: 91 | use-cross: ${{ matrix.cross }} 92 | command: test 93 | args: --release --locked --target ${{ matrix.target }} 94 | 95 | - name: Build release binary 96 | uses: actions-rs/cargo@v1 97 | with: 98 | use-cross: ${{ matrix.cross }} 99 | command: build 100 | args: --release --locked --target ${{ matrix.target }} 101 | 102 | - name: Strip release binary (linux and macos) 103 | if: matrix.build == 'x86_64-linux' || matrix.build == 'x86_64-macos' 104 | run: strip "target/${{ matrix.target }}/release/$BIN_NAME" 105 | 106 | - name: Strip release binary (arm) 107 | if: matrix.build == 'aarch64-linux' 108 | run: | 109 | docker run --rm -v \ 110 | "$PWD/target:/target:Z" \ 111 | rustembedded/cross:${{ matrix.target }} \ 112 | aarch64-linux-gnu-strip \ 113 | /target/${{ matrix.target }}/release/$BIN_NAME 114 | 115 | - name: Build archive 116 | shell: bash 117 | run: | 118 | mkdir dist 119 | if [ "${{ matrix.os }}" = "windows-2019" ]; then 120 | cp "target/${{ matrix.target }}/release/$BIN_NAME.exe" "dist/" 121 | else 122 | cp "target/${{ matrix.target }}/release/$BIN_NAME" "dist/" 123 | fi 124 | 125 | - uses: actions/upload-artifact@v2.2.4 126 | with: 127 | name: bins-${{ matrix.build }} 128 | path: dist 129 | 130 | publish: 131 | name: Publish 132 | needs: [dist] 133 | runs-on: ubuntu-latest 134 | steps: 135 | - name: Checkout sources 136 | uses: actions/checkout@v2 137 | with: 138 | submodules: false 139 | 140 | - uses: actions/download-artifact@v2 141 | # with: 142 | # path: dist 143 | # - run: ls -al ./dist 144 | - run: ls -al bins-* 145 | 146 | - name: Calculate tag name 147 | run: | 148 | name=dev 149 | if [[ $GITHUB_REF == refs/tags/v* ]]; then 150 | name=${GITHUB_REF:10} 151 | fi 152 | echo ::set-output name=val::$name 153 | echo TAG=$name >> $GITHUB_ENV 154 | id: tagname 155 | 156 | - name: Build archive 157 | shell: bash 158 | run: | 159 | set -ex 160 | 161 | rm -rf tmp 162 | mkdir tmp 163 | mkdir dist 164 | 165 | for dir in bins-* ; do 166 | platform=${dir#"bins-"} 167 | if [[ $platform =~ "windows" ]]; then 168 | exe=".exe" 169 | fi 170 | pkgname=$PROJECT_NAME-$platform 171 | mkdir tmp/$pkgname 172 | # cp LICENSE README.md tmp/$pkgname 173 | mv bins-$platform/$BIN_NAME$exe tmp/$pkgname 174 | chmod +x tmp/$pkgname/$BIN_NAME$exe 175 | 176 | if [ "$exe" = "" ]; then 177 | tar cJf dist/$pkgname.tar.xz -C tmp $pkgname 178 | else 179 | (cd tmp && 7z a -r ../dist/$pkgname.zip $pkgname) 180 | fi 181 | done 182 | 183 | - name: Upload binaries to release 184 | uses: svenstaro/upload-release-action@v2 185 | with: 186 | repo_token: ${{ secrets.GITHUB_TOKEN }} 187 | file: dist/* 188 | file_glob: true 189 | tag: ${{ steps.tagname.outputs.val }} 190 | overwrite: true 191 | 192 | -------------------------------------------------------------------------------- /keyscope/src/providers.rs: -------------------------------------------------------------------------------- 1 | use serde_derive::{Deserialize, Serialize}; 2 | use service_policy_kit::data::{Context, Interaction, Param}; 3 | use service_policy_kit::runner::{RunOptions, RunnerReport, SequenceRunner}; 4 | use std::sync::LazyLock; 5 | 6 | use crate::{config::DEFAULT_CONFIG, Error, Result}; 7 | 8 | pub trait ProviderTrait: Sync { 9 | fn name(&self) -> &str; 10 | fn config(&self) -> &ActionMapping; 11 | } 12 | 13 | #[derive(Debug, Clone, Serialize, Deserialize)] 14 | pub struct Provider { 15 | name: String, 16 | config: ActionMapping, 17 | } 18 | 19 | impl Provider { 20 | /// Create new provider 21 | #[must_use] 22 | pub const fn new(name: String, config: ActionMapping) -> Self { 23 | Self { name, config } 24 | } 25 | 26 | /// Get provider name 27 | #[must_use] 28 | #[allow(clippy::missing_const_for_fn)] 29 | pub fn name(&self) -> &str { 30 | &self.name 31 | } 32 | 33 | /// Get provider configuration 34 | #[must_use] 35 | pub const fn config(&self) -> &ActionMapping { 36 | &self.config 37 | } 38 | 39 | /// Get parameters fields from request configuration 40 | /// 41 | /// # Errors 42 | pub fn get_validation_request_params(&self) -> Result>> { 43 | Ok(self 44 | .config 45 | .validation 46 | .as_ref() 47 | .ok_or(Error::ValidationNotSupported)? 48 | .request 49 | .params 50 | .as_ref()) 51 | } 52 | 53 | /// Validate context parameters fields to the providers 54 | /// 55 | /// # Errors 56 | /// Return an [`Error`] when validation field is None or the parameters is invalid 57 | pub fn is_valid_params_for_key_validate(&self, context: &Context) -> Result<()> { 58 | self.config 59 | .validation 60 | .as_ref() 61 | .ok_or(Error::ValidationNotSupported)? 62 | .ensure_requirements(context) 63 | .or(Err(Error::KeyValidationParamsAreNotValid)) 64 | } 65 | 66 | /// ... 67 | /// 68 | /// # Errors 69 | /// 70 | /// Return an [`Error`] with the validation process 71 | pub fn key_validate(&self, params: &[T]) -> Result 72 | where 73 | T: AsRef, 74 | { 75 | let opts = RunOptions::build(None, false, None, false); 76 | self.key_validate_with_opts(params, &opts) 77 | } 78 | 79 | /// ... 80 | /// 81 | /// # Errors 82 | /// 83 | /// Return an [`Error`] with the validation process 84 | pub fn key_validate_with_opts(&self, params: &[T], opts: &RunOptions) -> Result 85 | where 86 | T: AsRef, 87 | { 88 | if params.is_empty() { 89 | return Err(Error::EmptyArguments); 90 | } 91 | 92 | let interaction = self 93 | .config 94 | .validation 95 | .as_ref() 96 | .ok_or(Error::ValidationNotSupported)?; 97 | 98 | let mut context = Context::new(); 99 | 100 | params 101 | .iter() 102 | .enumerate() 103 | .map(|(i, value)| { 104 | ( 105 | format!("{}_{}", self.name(), i + 1), 106 | value.as_ref().to_string(), 107 | ) 108 | }) 109 | .for_each(|(k, v)| { 110 | context.vars_bag.insert(k, v); 111 | }); 112 | 113 | self.is_valid_params_for_key_validate(&context)?; 114 | 115 | Ok(SequenceRunner::from_opts(opts).run(&mut context, &vec![interaction.clone()])) 116 | } 117 | } 118 | 119 | macro_rules! define_provider_type { 120 | ($(($struct_name:ident, $key:expr)),*) => { 121 | $( 122 | pub static $struct_name: LazyLock = LazyLock::new(|| { 123 | Provider::new($key.to_string(), DEFAULT_CONFIG.providers.get($key).unwrap().clone()) 124 | }); 125 | )* 126 | 127 | #[must_use] pub fn all_providers_ref() -> Vec<&'static Provider> { 128 | vec![$(&$struct_name),*] 129 | } 130 | 131 | #[must_use] pub fn all_providers() -> Vec { 132 | vec![$($struct_name.clone()),*] 133 | } 134 | }; 135 | } 136 | 137 | /// Get provider by name 138 | /// 139 | /// # Errors 140 | /// 141 | /// Return [`Error`] if provider not exists 142 | pub fn get(name: &str) -> Result { 143 | all_providers() 144 | .iter() 145 | .find(|p| p.name() == name) 146 | .ok_or(Error::ProviderNotExists) 147 | .cloned() 148 | } 149 | 150 | define_provider_type!( 151 | (TESTER, "tester"), 152 | (INFURA, "infura"), 153 | (COVALENTHQ, "covalenthq"), 154 | (ASANA, "asana"), 155 | (BITLY, "bitly"), 156 | (IPSTACK, "ipstack"), 157 | (LOCALYTICS, "localytics"), 158 | (ALGOLIA, "algolia"), 159 | (BRANCHIO, "branchio"), 160 | (BROWSERSTACK, "browserstack"), 161 | (BUILDKITE, "buildkite"), 162 | (DATADOG, "datadog"), 163 | (GITHUB, "github"), 164 | (GITHUB_ENT, "github-ent"), 165 | (DROPBOX, "dropbox"), 166 | (GITLAB, "gitlab"), 167 | (HEROKU, "heroku"), 168 | (MAILCHIMP, "mailchimp"), 169 | (MAILGUN, "mailgun"), 170 | (PAGERDUTY, "pagerduty"), 171 | (CIRCLECI, "circleci"), 172 | (FACEBOOK_ACCESS_TOKEN, "facebook-access-token"), 173 | (SALESFORCE, "salesforce"), 174 | (JUMPCLOUD, "jumpcloud"), 175 | (SAUCELABS_US, "saucelabs-us"), 176 | (SAUCELABS_EU, "saucelabs-eu"), 177 | (SENDGRID, "sendgrid"), 178 | (SLACK, "slack"), 179 | (SLACK_WEBHOOK, "slack-webhook"), 180 | (SLACK_APP_KEY, "slack-app-key"), 181 | (STRIPE, "stripe"), 182 | (TRAVISCI, "travisci"), 183 | (TWILIO, "twilio"), 184 | (TWITTER, "twitter"), 185 | (ZENDESK, "zendesk"), 186 | (FIREBASE, "firebase"), 187 | (AWS, "aws"), 188 | (ELASTIC_APM_SECRET, "elastic-apm-secret"), 189 | (ARTIFACTORY, "artifactory"), 190 | (IBM_COS, "ibm-cos"), 191 | (IBM_IAM, "ibm-iam"), 192 | (IBM_CLOUDANT, "ibm-cloudant"), 193 | (SOFTLAYER, "softlayer"), 194 | (SQUARE, "square"), 195 | (TELEGRAM_BOT, "telegram-bot"), 196 | (BINGMAPS, "bingmaps"), 197 | (BUTTERCMS, "buttercms"), 198 | (WAKATIME, "wakatime"), 199 | (CALENDLY, "calendly"), 200 | (SHODAN, "shodan"), 201 | (OPSGENIE, "opsgenie"), 202 | (PENDO, "pendo"), 203 | (HUBSPOT, "hubspot"), 204 | (LOKALISE, "lokalise"), 205 | (SNYK, "snyk"), 206 | (OPENAPI_AI_KEY, "openai-api-key"), 207 | (OKTA, "okta"), 208 | (ARTIFACTORY_ACCESS_TOKEN, "artifactory-access-token"), 209 | (GCP_API_KEY, "gcp-api-key") 210 | ); 211 | 212 | #[derive(Debug, Clone, Serialize, Deserialize)] 213 | pub struct ActionMapping { 214 | pub validation: Option, 215 | } 216 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2021- Dotan Nahum 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 |
3 |
4 |
5 | 6 |
7 |
8 |

9 |

10 | :white_check_mark: Automate your key and secret validation workflows 11 |
12 | :cowboy_hat_face: Over 30 different providers 13 |
14 | :robot: Export to JSON, audit via CSV 15 |
16 |


17 |

18 | 19 |

20 | 21 |

22 | 23 | # :key: Keyscope 24 | 25 | Keyscope is a key and secret workflow (validation, invalidation, etc.) tool built in Rust, powered by [`service_policy_kit`](https://github.com/spectralops/service-policy-kit). 26 | 27 | Current workflows supported: 28 | 29 | - Validation 30 | 31 | # 🦀 Why Rust? 32 | 33 | - With Rust, _"If it compiles, it works."_ and also, it compiles to many platforms. 34 | - Rust is _fast_, has no _VM_, or unnecessary cruft (typically 5-8mb binaries with LOTS of code and libraries). 35 | - Multi purpose, safe, and generalistic - makes for healthy and expressive [mission critical code](https://www.youtube.com/watch?v=ylOpCXI2EMM). Adding code or abstraction doesn't increase bloat, doesn't hurt performance, doesn't increase chance for bugs in a radical way (less edge cases). 36 | - Amazing package manager: `Cargo`. Productive installing and running of tasks and examples. 37 | - Rust is getting headlines in the security community as the go-to language for security tools. Equally interesting is offensive security + Rust [here](https://github.com/trickster0/OffensiveRust) and [here](https://github.com/skerkour/black-hat-rust). 38 | 39 | # :rocket: Quick Start 40 | 41 | Grab a release from [releases](https://github.com/spectralops/keyscope/releases), or install via Homebrew: 42 | 43 | ``` 44 | brew tap spectralops/tap && brew install keyscope 45 | ``` 46 | 47 | ## Using keyscope 48 | 49 | You can try out validating a key for a provider, say, Github (assuming the key is in the `GITHUB_TOKEN` environment variable): 50 | 51 | ``` 52 | $ keyscope validate github $GITHUB_TOKEN 53 | ``` 54 | 55 | You can see which other providers are supported by running: 56 | 57 | ``` 58 | $ keyscope validate --list 59 | 60 | . 61 | : 62 | . 63 | 64 | twilio:validation 65 | keyscope validate twilio -p twilio_1 -p twilio_2 66 | 67 | twitter:validation 68 | keyscope validate twitter -p twitter_1 69 | 70 | zendesk:validation 71 | keyscope validate zendesk -p zendesk_1 -p zendesk_2 72 | 73 | Total 44 providers available. 74 | $ 75 | ``` 76 | 77 | And what parameters are required for a certain provider by running (say, `stripe`): 78 | 79 | ``` 80 | $ keyscope requirements stripe 81 | 82 | provider stripe requires: 83 | - param: p1 84 | desc: stripe key 85 | $ 86 | ``` 87 | 88 | Finally the general structure of the `validate` command is: 89 | 90 | ``` 91 | $ keyscope validate PROVIDER -p PARAM1 -p PARAM2 .. -p PARAM_N 92 | ``` 93 | 94 | # :white_check_mark: Validation: key should be active 95 | 96 | You can validate a specific provider like so: 97 | 98 | ``` 99 | $ keyscope validate twilio -p $TWILIO_KEY 100 | ``` 101 | 102 | With the general pattern of: 103 | 104 | ``` 105 | $ keyscope validate PROVIDER -p PARAM1 -p PARAM2 ... 106 | ``` 107 | 108 | The number of keys/params would change based on authentication type: 109 | 110 | - `Bearer` - usually just a single key (token) 111 | - `Basic Auth` - usually 2 keys: user, password 112 | - `OAuth` - usually 2 keys: client_id, client_secret 113 | - And others. 114 | 115 | Each provider in Keyscope will tell you what it requires using `requirements`: 116 | 117 | ``` 118 | $ keyscope requirements twilio 119 | ``` 120 | 121 | You'll get a report: 122 | 123 | ``` 124 | $ keyscope --verbose validate stripe -p $STRIPE_KEY 125 | 126 | ✔ stripe:validation: ok 766ms 127 | 128 | Ran 1 interactions with 1 checks in 766ms 129 | 130 | Success: 1 131 | Failure: 0 132 | Error: 0 133 | Skipped: 0 134 | ``` 135 | 136 | And an executable exit code that reflects success/failure. 137 | 138 | You can use the `--verbose` flag to see API responses: 139 | 140 | ``` 141 | $ keyscope --verbose validate stripe -p $STRIPE_KEY 142 | 143 | ✗ stripe:validation: failed 413ms 144 | status_code: 200 != 401 Unauthorized 145 | 146 | Ran 1 interactions with 1 checks in 413ms 147 | 148 | Success: 0 149 | Failure: 1 150 | Error: 0 151 | Skipped: 0 152 | ``` 153 | 154 | In this case the exit code is `1` (failure). 155 | 156 | # :x: Validation: key should be inactive 157 | 158 | When you are validating keys that are supposed to be inactive, you can use the `flip` flag. In this mode, a failed API access is a good thing, and the exit code will reflect that. 159 | 160 | ``` 161 | $ keyscope --flip validate stripe -p $STRIPE_KEY 162 | 163 | ✔ stripe:validation: ok 766ms 164 | 165 | Ran 1 interactions with 1 checks in 766ms 166 | ``` 167 | 168 | In this case, the key is active - _which is bad for us_. Using `--flip`, the exit code will be `1` (failure). 169 | 170 | # :runner: Setting up a validation job 171 | 172 | ## Audit active keys 173 | 174 | You can set up a CI job (or other form of scheduled job you like) to perform an audit, by reading all parameters from a dedicated CSV file like so: 175 | 176 | ``` 177 | $ keyscope validate --csv-in report.csv 178 | ``` 179 | 180 | The format of the CSV that you need to prepare should include a header line and look like this: 181 | 182 | ``` 183 | provider,key1,key2,key3 184 | twilio,tw-key1,,, 185 | ``` 186 | 187 | You can specify as many key columns as you like, as long as you provide an _empty_ value for providers which don't have that many keys, and all rows contain the same amount of cells. 188 | 189 | ## Audit inactive keys 190 | 191 | If you have a dump of keys from your vault that are stale have expiry and should have been rotated, you want to test that they are all stale: 192 | 193 | ``` 194 | $ keyscope --flip validate --csv-in my-key-audit.csv 195 | ``` 196 | 197 | # :link: Supported providers 198 | 199 | We're always adding [new providers](src/defs.yaml), keep a link to this list or watch this repo to get updated. 200 | 201 | We use our [`service_policy_kit`](https://github.com/spectralops/service-policy-kit) library to specify interactions with services and their policies, if you find a service [not in this list](src/defs.yaml) feel free to open an issue or contribute back. 202 | 203 | 204 | 205 | 210 | 215 | 220 | 221 | 222 | 229 | 234 | 239 | 244 | 245 | 246 | 253 | 258 | 263 | 268 | 269 | 270 | 277 | 282 | 287 | 292 | 293 | 294 | 301 | 306 | 311 | 316 | 317 | 318 | 325 | 330 | 335 | 340 | 341 | 342 | 349 | 354 | 359 | 364 | 365 | 366 | 373 | 378 | 383 | 388 | 389 | 390 | 397 | 402 | 407 | 412 | 413 | 414 | 421 | 426 | 431 | 436 | 437 | 438 | 445 | 450 | 455 | 460 | 461 | 462 | 469 | 474 | 479 | 484 | 485 | 486 | 493 | 498 | 503 | 508 | 509 | 510 | 517 | 522 | 527 | 532 | 533 | 534 | 541 | 546 | 551 | 556 | 557 | 558 | 565 | 570 | 575 | 580 | 581 | 582 | 589 | 594 | 599 | 604 | 605 | 606 | 613 | 618 | 623 | 628 | 629 | 630 | 637 | 642 | 647 | 652 | 653 | 654 | 661 | 666 | 671 | 676 | 677 | 678 | 685 | 690 | 695 | 700 | 701 | 702 | 709 | 714 | 719 | 724 | 725 | 726 | 733 | 738 | 743 | 748 | 749 | 750 | 757 | 762 | 767 | 772 | 773 | 774 | 781 | 786 | 791 | 796 | 797 | 798 | 805 | 810 | 815 | 820 | 821 | 822 | 829 | 834 | 839 | 844 | 845 | 846 | 853 | 858 | 863 | 868 | 869 | 870 | 877 | 882 | 887 | 892 | 893 | 894 | 901 | 906 | 911 | 916 | 917 | 918 | 925 | 930 | 935 | 940 | 941 | 942 | 949 | 954 | 959 | 964 | 965 | 966 | 973 | 978 | 983 | 988 | 989 | 990 | 997 | 1002 | 1007 | 1012 | 1013 | 1014 | 1021 | 1026 | 1031 | 1036 | 1037 | 1038 | 1045 | 1050 | 1055 | 1060 | 1061 | 1062 | 1069 | 1074 | 1079 | 1084 | 1085 | 1086 | 1093 | 1098 | 1103 | 1108 | 1109 | 1110 | 1117 | 1122 | 1127 | 1132 | 1133 | 1134 | 1141 | 1146 | 1151 | 1156 | 1157 | 1158 | 1165 | 1170 | 1175 | 1180 | 1181 | 1182 | 1189 | 1194 | 1199 | 1204 | 1205 | 1206 | 1213 | 1218 | 1223 | 1228 | 1229 | 1230 | 1237 | 1242 | 1247 | 1252 | 1253 | 1254 | 1261 | 1266 | 1271 | 1276 | 1277 | 1278 | 1285 | 1290 | 1295 | 1300 | 1301 | 1302 | 1309 | 1314 | 1319 | 1324 | 1325 | 1326 | 1333 | 1338 | 1343 | 1348 | 1349 | 1350 | 1357 | 1362 | 1367 | 1372 | 1373 | 1374 | 1381 | 1386 | 1391 | 1396 | 1397 | 1398 | 1405 | 1410 | 1415 | 1420 | 1421 | 1422 | 1429 | 1434 | 1439 | 1444 | 1445 | 1446 | 1453 | 1458 | 1463 | 1468 | 1469 | 1470 | 1477 |
206 | 207 | **tester**
Tester: valid key 208 | 209 |
211 | 212 | validation 213 | 214 | 216 | 217 | `tester_1` - hookbin ID (https://hookb.in)
`tester_2` - fake key to put as a query param 218 | 219 |
223 | 224 | ``` 225 | keyscope validate tester -p TESTER_1 -p TESTER_2 226 | ``` 227 | 228 |
230 | 231 | **infura**
infura API key 232 | 233 |
235 | 236 | validation 237 | 238 | 240 | 241 | `infura_1` - infura API key 242 | 243 |
247 | 248 | ``` 249 | keyscope validate infura -p INFURA_1 250 | ``` 251 | 252 |
254 | 255 | **covalenthq**
Covalent: valid key 256 | 257 |
259 | 260 | validation 261 | 262 | 264 | 265 | `covalenthq_1` - covalent token 266 | 267 |
271 | 272 | ``` 273 | keyscope validate covalenthq -p COVALENTHQ_1 274 | ``` 275 | 276 |
278 | 279 | **asana**
Asana: valid token 280 | 281 |
283 | 284 | validation 285 | 286 | 288 | 289 | `asana_1` - asana token 290 | 291 |
295 | 296 | ``` 297 | keyscope validate asana -p ASANA_1 298 | ``` 299 | 300 |
302 | 303 | **bitly**
Bit.ly: valid access token 304 | 305 |
307 | 308 | validation 309 | 310 | 312 | 313 | `bitly_1` - bit.ly token 314 | 315 |
319 | 320 | ``` 321 | keyscope validate bitly -p BITLY_1 322 | ``` 323 | 324 |
326 | 327 | **ipstack**
ipstack access key 328 | 329 |
331 | 332 | validation 333 | 334 | 336 | 337 | `ipstack_1` - ipstack access key 338 | 339 |
343 | 344 | ``` 345 | keyscope validate ipstack -p IPSTACK_1 346 | ``` 347 | 348 |
350 | 351 | **localytics**
Localytics: valid API credentials 352 | 353 |
355 | 356 | validation 357 | 358 | 360 | 361 | `localytics_1` - localytics user
`localytics_2` - localytics key 362 | 363 |
367 | 368 | ``` 369 | keyscope validate localytics -p LOCALYTICS_1 -p LOCALYTICS_2 370 | ``` 371 | 372 |
374 | 375 | **algolia**
Algolia: valid API credentials 376 | 377 |
379 | 380 | validation 381 | 382 | 384 | 385 | `algolia_1` - algolia application ID
`algolia_2` - algolia index
`algolia_3` - algolia API key 386 | 387 |
391 | 392 | ``` 393 | keyscope validate algolia -p ALGOLIA_1 -p ALGOLIA_2 -p ALGOLIA_3 394 | ``` 395 | 396 |
398 | 399 | **branchio**
branch.io: valid API credentials 400 | 401 |
403 | 404 | validation 405 | 406 | 408 | 409 | `branchio_1` - branch.io key
`branchio_2` - branch.io secret 410 | 411 |
415 | 416 | ``` 417 | keyscope validate branchio -p BRANCHIO_1 -p BRANCHIO_2 418 | ``` 419 | 420 |
422 | 423 | **browserstack**
browserstack: valid API credentials 424 | 425 |
427 | 428 | validation 429 | 430 | 432 | 433 | `browserstack_1` - browserstack key
`browserstack_2` - browserstack secret 434 | 435 |
439 | 440 | ``` 441 | keyscope validate browserstack -p BROWSERSTACK_1 -p BROWSERSTACK_2 442 | ``` 443 | 444 |
446 | 447 | **buildkite**
Buildkite: valid token 448 | 449 |
451 | 452 | validation 453 | 454 | 456 | 457 | `buildkite_1` - buildkite token 458 | 459 |
463 | 464 | ``` 465 | keyscope validate buildkite -p BUILDKITE_1 466 | ``` 467 | 468 |
470 | 471 | **datadog**
datadog: valid API credentials 472 | 473 |
475 | 476 | validation 477 | 478 | 480 | 481 | `datadog_1` - datadog API key 482 | 483 |
487 | 488 | ``` 489 | keyscope validate datadog -p DATADOG_1 490 | ``` 491 | 492 |
494 | 495 | **github**
github: valid API credentials 496 | 497 |
499 | 500 | validation 501 | 502 | 504 | 505 | `github_1` - github token 506 | 507 |
511 | 512 | ``` 513 | keyscope validate github -p GITHUB_1 514 | ``` 515 | 516 |
518 | 519 | **github-ent**
Github Enterprise: valid API token 520 | 521 |
523 | 524 | validation 525 | 526 | 528 | 529 | `github-ent_1` - github enterprise instance (without http)
`github-ent_2` - github token 530 | 531 |
535 | 536 | ``` 537 | keyscope validate github-ent -p GITHUB-ENT_1 -p GITHUB-ENT_2 538 | ``` 539 | 540 |
542 | 543 | **dropbox**
dropbox: valid API credentials 544 | 545 |
547 | 548 | validation 549 | 550 | 552 | 553 | `dropbox_1` - dropbox token 554 | 555 |
559 | 560 | ``` 561 | keyscope validate dropbox -p DROPBOX_1 562 | ``` 563 | 564 |
566 | 567 | **gitlab**
gitlab: valid API credentials 568 | 569 |
571 | 572 | validation 573 | 574 | 576 | 577 | `gitlab_1` - gitlab token 578 | 579 |
583 | 584 | ``` 585 | keyscope validate gitlab -p GITLAB_1 586 | ``` 587 | 588 |
590 | 591 | **heroku**
heroku: valid API credentials 592 | 593 |
595 | 596 | validation 597 | 598 | 600 | 601 | `heroku_1` - heroku token 602 | 603 |
607 | 608 | ``` 609 | keyscope validate heroku -p HEROKU_1 610 | ``` 611 | 612 |
614 | 615 | **mailchimp**
mailchimp: valid API credentials 616 | 617 |
619 | 620 | validation 621 | 622 | 624 | 625 | `mailchimp_1` - mailchimp datacenter ID
`mailchimp_2` - mailchimp key 626 | 627 |
631 | 632 | ``` 633 | keyscope validate mailchimp -p MAILCHIMP_1 -p MAILCHIMP_2 634 | ``` 635 | 636 |
638 | 639 | **mailgun**
mailgun: valid API credentials 640 | 641 |
643 | 644 | validation 645 | 646 | 648 | 649 | `mailgun_1` - mailgun key 650 | 651 |
655 | 656 | ``` 657 | keyscope validate mailgun -p MAILGUN_1 658 | ``` 659 | 660 |
662 | 663 | **pagerduty**
pagerduty: valid API credentials 664 | 665 |
667 | 668 | validation 669 | 670 | 672 | 673 | `pagerduty_1` - pagerduty token 674 | 675 |
679 | 680 | ``` 681 | keyscope validate pagerduty -p PAGERDUTY_1 682 | ``` 683 | 684 |
686 | 687 | **circleci**
circleci: valid API credentials 688 | 689 |
691 | 692 | validation 693 | 694 | 696 | 697 | `circleci_1` - circleci key 698 | 699 |
703 | 704 | ``` 705 | keyscope validate circleci -p CIRCLECI_1 706 | ``` 707 | 708 |
710 | 711 | **facebook-access-token**
facebook: valid API token 712 | 713 |
715 | 716 | validation 717 | 718 | 720 | 721 | `facebook-access-token_1` - facebook token 722 | 723 |
727 | 728 | ``` 729 | keyscope validate facebook-access-token -p FACEBOOK-ACCESS-TOKEN_1 730 | ``` 731 | 732 |
734 | 735 | **salesforce**
salesforce: valid API credentials 736 | 737 |
739 | 740 | validation 741 | 742 | 744 | 745 | `salesforce_1` - salesforce instance name
`salesforce_2` - salesforce token 746 | 747 |
751 | 752 | ``` 753 | keyscope validate salesforce -p SALESFORCE_1 -p SALESFORCE_2 754 | ``` 755 | 756 |
758 | 759 | **jumpcloud**
jumpcloud: valid API credentials 760 | 761 |
763 | 764 | validation 765 | 766 | 768 | 769 | `jumpcloud_1` - jumpcloud key 770 | 771 |
775 | 776 | ``` 777 | keyscope validate jumpcloud -p JUMPCLOUD_1 778 | ``` 779 | 780 |
782 | 783 | **saucelabs-us**
saucelabs-us: valid API credentials 784 | 785 |
787 | 788 | validation 789 | 790 | 792 | 793 | `saucelabs-us_1` - saucelabs user
`saucelabs-us_2` - saucelabs key 794 | 795 |
799 | 800 | ``` 801 | keyscope validate saucelabs-us -p SAUCELABS-US_1 -p SAUCELABS-US_2 802 | ``` 803 | 804 |
806 | 807 | **saucelabs-eu**
saucelabs-eu: valid API credentials 808 | 809 |
811 | 812 | validation 813 | 814 | 816 | 817 | `saucelabs-eu_1` - saucelabs user
`saucelabs-eu_2` - saucelabs key 818 | 819 |
823 | 824 | ``` 825 | keyscope validate saucelabs-eu -p SAUCELABS-EU_1 -p SAUCELABS-EU_2 826 | ``` 827 | 828 |
830 | 831 | **sendgrid**
sendgrid: valid API credentials 832 | 833 |
835 | 836 | validation 837 | 838 | 840 | 841 | `sendgrid_1` - sendgrid key 842 | 843 |
847 | 848 | ``` 849 | keyscope validate sendgrid -p SENDGRID_1 850 | ``` 851 | 852 |
854 | 855 | **slack**
slack: valid API credentials 856 | 857 |
859 | 860 | validation 861 | 862 | 864 | 865 | `slack_1` - slack key 866 | 867 |
871 | 872 | ``` 873 | keyscope validate slack -p SLACK_1 874 | ``` 875 | 876 |
878 | 879 | **slack-webhook**
slack-webook: valid API credentials 880 | 881 |
883 | 884 | validation 885 | 886 | 888 | 889 | `slack-webhook_1` - slack webhook 890 | 891 |
895 | 896 | ``` 897 | keyscope validate slack-webhook -p SLACK-WEBHOOK_1 898 | ``` 899 | 900 |
902 | 903 | **stripe**
stripe: valid API credentials 904 | 905 |
907 | 908 | validation 909 | 910 | 912 | 913 | `stripe_1` - stripe key 914 | 915 |
919 | 920 | ``` 921 | keyscope validate stripe -p STRIPE_1 922 | ``` 923 | 924 |
926 | 927 | **travisci**
travisci: valid API credentials 928 | 929 |
931 | 932 | validation 933 | 934 | 936 | 937 | `travisci_1` - travisci domain, choose 'org' or 'com'
`travisci_2` - travisci key 938 | 939 |
943 | 944 | ``` 945 | keyscope validate travisci -p TRAVISCI_1 -p TRAVISCI_2 946 | ``` 947 | 948 |
950 | 951 | **twilio**
twilio: valid API credentials 952 | 953 |
955 | 956 | validation 957 | 958 | 960 | 961 | `twilio_1` - twilio account sid
`twilio_2` - twilio token 962 | 963 |
967 | 968 | ``` 969 | keyscope validate twilio -p TWILIO_1 -p TWILIO_2 970 | ``` 971 | 972 |
974 | 975 | **twitter**
twitter: valid API credentials 976 | 977 |
979 | 980 | validation 981 | 982 | 984 | 985 | `twitter_1` - twitter API token 986 | 987 |
991 | 992 | ``` 993 | keyscope validate twitter -p TWITTER_1 994 | ``` 995 | 996 |
998 | 999 | **zendesk**
zendesk: valid API credentials 1000 | 1001 |
1003 | 1004 | validation 1005 | 1006 | 1008 | 1009 | `zendesk_1` - zendesk domain
`zendesk_2` - zendesk key 1010 | 1011 |
1015 | 1016 | ``` 1017 | keyscope validate zendesk -p ZENDESK_1 -p ZENDESK_2 1018 | ``` 1019 | 1020 |
1022 | 1023 | **firebase**
firebase: valid API credentials 1024 | 1025 |
1027 | 1028 | validation 1029 | 1030 | 1032 | 1033 | `firebase_1` - firebase API key
`firebase_2` - firebase ID token 1034 | 1035 |
1039 | 1040 | ``` 1041 | keyscope validate firebase -p FIREBASE_1 -p FIREBASE_2 1042 | ``` 1043 | 1044 |
1046 | 1047 | **aws**
aws: valid API credentials 1048 | 1049 |
1051 | 1052 | validation 1053 | 1054 | 1056 | 1057 | `aws_1` - AWS ID
`aws_2` - AWS secret 1058 | 1059 |
1063 | 1064 | ``` 1065 | keyscope validate aws -p AWS_1 -p AWS_2 1066 | ``` 1067 | 1068 |
1070 | 1071 | **elastic-apm-secret**
Elastic APM: secret key validation 1072 | 1073 |
1075 | 1076 | validation 1077 | 1078 | 1080 | 1081 | `elastic-apm-secret_1` - Elastic APM host address and port, including 'http/s' part
`elastic-apm-secret_2` - Elastic APM secret 1082 | 1083 |
1087 | 1088 | ``` 1089 | keyscope validate elastic-apm-secret -p ELASTIC-APM-SECRET_1 -p ELASTIC-APM-SECRET_2 1090 | ``` 1091 | 1092 |
1094 | 1095 | **artifactory**
Artifactory: token validation 1096 | 1097 |
1099 | 1100 | validation 1101 | 1102 | 1104 | 1105 | `artifactory_1` - Artifactory host (including http(s) part)
`artifactory_2` - Artifactory token 1106 | 1107 |
1111 | 1112 | ``` 1113 | keyscope validate artifactory -p ARTIFACTORY_1 -p ARTIFACTORY_2 1114 | ``` 1115 | 1116 |
1118 | 1119 | **ibm-cos**
IBM: cloud object storage key validation (HMAC) 1120 | 1121 |
1123 | 1124 | validation 1125 | 1126 | 1128 | 1129 | `ibm-cos_1` - IBM HMAC ID
`ibm-cos_2` - IBM HMAC secret 1130 | 1131 |
1135 | 1136 | ``` 1137 | keyscope validate ibm-cos -p IBM-COS_1 -p IBM-COS_2 1138 | ``` 1139 | 1140 |
1142 | 1143 | **ibm-iam**
IBM: cloud key validation (IAM) 1144 | 1145 |
1147 | 1148 | validation 1149 | 1150 | 1152 | 1153 | `ibm-iam_1` - IBM cloud key 1154 | 1155 |
1159 | 1160 | ``` 1161 | keyscope validate ibm-iam -p IBM-IAM_1 1162 | ``` 1163 | 1164 |
1166 | 1167 | **ibm-cloudant**
IBM: cloudant key validation (legacy) 1168 | 1169 |
1171 | 1172 | validation 1173 | 1174 | 1176 | 1177 | `ibm-cloudant_1` - IBM cloudant hostname
`ibm-cloudant_2` - IBM cloudant user
`ibm-cloudant_3` - IBM cloudant key 1178 | 1179 |
1183 | 1184 | ``` 1185 | keyscope validate ibm-cloudant -p IBM-CLOUDANT_1 -p IBM-CLOUDANT_2 -p IBM-CLOUDANT_3 1186 | ``` 1187 | 1188 |
1190 | 1191 | **softlayer**
Softlayer: validate credentials 1192 | 1193 |
1195 | 1196 | validation 1197 | 1198 | 1200 | 1201 | `softlayer_1` - Softlayer hostname
`softlayer_2` - Softlayer token 1202 | 1203 |
1207 | 1208 | ``` 1209 | keyscope validate softlayer -p SOFTLAYER_1 -p SOFTLAYER_2 1210 | ``` 1211 | 1212 |
1214 | 1215 | **square**
Square: valid token 1216 | 1217 |
1219 | 1220 | validation 1221 | 1222 | 1224 | 1225 | `square_1` - Square token 1226 | 1227 |
1231 | 1232 | ``` 1233 | keyscope validate square -p SQUARE_1 1234 | ``` 1235 | 1236 |
1238 | 1239 | **telegram-bot**
telegram-bot: valid bot token 1240 | 1241 |
1243 | 1244 | validation 1245 | 1246 | 1248 | 1249 | `telegram-bot_1` - bot key 1250 | 1251 |
1255 | 1256 | ``` 1257 | keyscope validate telegram-bot -p TELEGRAM-BOT_1 1258 | ``` 1259 | 1260 |
1262 | 1263 | **bingmaps**
Bing Maps API: valid access token 1264 | 1265 |
1267 | 1268 | validation 1269 | 1270 | 1272 | 1273 | `bingmaps_1` - Bing Maps token 1274 | 1275 |
1279 | 1280 | ``` 1281 | keyscope validate bingmaps -p BINGMAPS_1 1282 | ``` 1283 | 1284 |
1286 | 1287 | **buttercms**
ButterCMS: valid bot token 1288 | 1289 |
1291 | 1292 | validation 1293 | 1294 | 1296 | 1297 | `buttercms_1` - ButterCMS API key 1298 | 1299 |
1303 | 1304 | ``` 1305 | keyscope validate buttercms -p BUTTERCMS_1 1306 | ``` 1307 | 1308 |
1310 | 1311 | **wakatime**
wakatime: valid api token 1312 | 1313 |
1315 | 1316 | validation 1317 | 1318 | 1320 | 1321 | `wakatime_1` - WakeTime API key 1322 | 1323 |
1327 | 1328 | ``` 1329 | keyscope validate wakatime -p WAKATIME_1 1330 | ``` 1331 | 1332 |
1334 | 1335 | **calendly**
calendly: valid API credentials 1336 | 1337 |
1339 | 1340 | validation 1341 | 1342 | 1344 | 1345 | `calendly_1` - calendly API key 1346 | 1347 |
1351 | 1352 | ``` 1353 | keyscope validate calendly -p CALENDLY_1 1354 | ``` 1355 | 1356 |
1358 | 1359 | **shodan**
shodan: valid api token 1360 | 1361 |
1363 | 1364 | validation 1365 | 1366 | 1368 | 1369 | `shodan_1` - Shodan API key 1370 | 1371 |
1375 | 1376 | ``` 1377 | keyscope validate shodan -p SHODAN_1 1378 | ``` 1379 | 1380 |
1382 | 1383 | **opsgenie**
opsgenie: valid api token 1384 | 1385 |
1387 | 1388 | validation 1389 | 1390 | 1392 | 1393 | `opsgenie_1` - opsgenie API key 1394 | 1395 |
1399 | 1400 | ``` 1401 | keyscope validate opsgenie -p OPSGENIE_1 1402 | ``` 1403 | 1404 |
1406 | 1407 | **pendo**
pendo: valid api token 1408 | 1409 |
1411 | 1412 | validation 1413 | 1414 | 1416 | 1417 | `pendo_1` - pendo API key 1418 | 1419 |
1423 | 1424 | ``` 1425 | keyscope validate pendo -p PENDO_1 1426 | ``` 1427 | 1428 |
1430 | 1431 | **hubspot**
hubspot: valid api token 1432 | 1433 |
1435 | 1436 | validation 1437 | 1438 | 1440 | 1441 | `hubspot_1` - hubspot API key 1442 | 1443 |
1447 | 1448 | ``` 1449 | keyscope validate hubspot -p HUBSPOT_1 1450 | ``` 1451 | 1452 |
1454 | 1455 | **lokalise**
lokalise: valid api token 1456 | 1457 |
1459 | 1460 | validation 1461 | 1462 | 1464 | 1465 | `lokalise_1` - lokalise token 1466 | 1467 |
1471 | 1472 | ``` 1473 | keyscope validate lokalise -p LOKALISE_1 1474 | ``` 1475 | 1476 |
1478 | 1479 | 1480 | # :cake: Adding your own providers 1481 | 1482 | You can specify a custom definitions file (here [is an example](custom-defs.example.yaml)): 1483 | 1484 | ``` 1485 | $ keyscope -f your-definitions.yaml validate --list 1486 | ``` 1487 | 1488 | Which is suitable for adding your own internal services, key issuing policies, and infrastructure. 1489 | 1490 | You can also use custom definitions to test out new providers that you'd like to contribute back to keyscope :smile: 1491 | 1492 | ## Basics of a definition 1493 | 1494 | All definitions represent an interaction. A request being made, and a policy that's being checked against it. 1495 | 1496 | ```yaml 1497 | providers: 1498 | hookbin: 1499 | validation: 1500 | # 1501 | # the request part 1502 | # 1503 | request: 1504 | params: 1505 | - name: hookbin_1 1506 | desc: hookbin ID (https://hookb.in) 1507 | - name: hookbin_2 1508 | desc: fake key to put as a query param 1509 | id: "postbin:validation" 1510 | desc: "Postbin: valid key" 1511 | # variable interpolation is good for all fields 1512 | uri: "https://hookb.in/{{hookbin_1}}?q={{hookbin_2}}" 1513 | method: post 1514 | # you can also use headers, body, form, basic_auth and more (see defs.yaml) 1515 | 1516 | # 1517 | # the policy part: all values are actually regular expressions and are matched against service response 1518 | # 1519 | response: 1520 | status_code: "200" 1521 | body: ok 1522 | ``` 1523 | 1524 | When in doubt, you can check keyscope's own [defs.yaml](src/defs.yaml) for real examples of how to use this infrastructure. 1525 | 1526 | ## Tutorial: adding Dropbox 1527 | 1528 | To validate if a dropbox API key works, we first need to learn about the canonical way to authenticate against that API. 1529 | 1530 | First stop, API docs: 1531 | 1532 | - Dropbox has an [API Explorer](https://dropbox.github.io/dropbox-api-v2-explorer) which is super useful 1533 | 1534 | Next stop, we want to find an API call that is a representative for: 1535 | 1536 | - Has to be authenticated 1537 | - Has to indicate that when accessed successfully with our candidate key, the key has some authoritative value. Which means, that if exposed, contains significant risk. 1538 | 1539 | For this example, getting our current account sounds like something that only when we identify who we are - we're able to do. 1540 | 1541 | We'll select [get_current_account](https://www.dropbox.com/developers/documentation/http/documentation#users-get_current_account). 1542 | 1543 | Let's start forming our interaction. First the needed skeleton: containing the name of the provider (`dropbox`), its ID and description below, as well as parameters required and their name and description: 1544 | 1545 | ```yaml 1546 | dropbox: 1547 | validation: 1548 | request: 1549 | id: "dropbox:validation" 1550 | desc: "dropbox: valid API credentials" 1551 | params: 1552 | - name: dropbox_1 1553 | desc: dropbox token 1554 | ``` 1555 | 1556 | We keep the name of the parameter with a special convention that helps when feeding keyscope automatically: 1557 | 1558 | ``` 1559 | PROVIDER_N 1560 | Where 'N' starts in 1 e.g.: 1561 | dropbox_1 1562 | dropbox_2 1563 | aws_1 1564 | ... 1565 | ``` 1566 | 1567 | Then, details about actually making an HTTP call, as required by Dropbox (Bearer token authentication). 1568 | 1569 | ```yaml 1570 | uri: https://api.dropboxapi.com/2/users/get_current_account 1571 | method: post 1572 | headers: 1573 | Authorization: 1574 | - Bearer {{dropbox_1}} 1575 | ``` 1576 | 1577 | Note that per standard, all HTTP header fields are actually _arrays_. It's OK to always make an array of size _one_ if you only have one value (most common case). 1578 | 1579 | We also see _variable interpolation_ here. Where `{{dropbox_1}}` will get replaced by keyscope in time before making the actual call. 1580 | 1581 | Finally, we want to make sure we answer the question: 1582 | 1583 | - What does it mean to have a successful call? 1584 | 1585 | In our case, the Dropbox API call returns `HTTP OK` on success, which means a `200` status code. 1586 | 1587 | And the final, complete result is this: 1588 | 1589 | ```yaml 1590 | dropbox: 1591 | validation: 1592 | request: 1593 | id: "dropbox:validation" 1594 | desc: "dropbox: valid API credentials" 1595 | params: 1596 | - name: dropbox_1 1597 | desc: dropbox token 1598 | uri: https://api.dropboxapi.com/2/users/get_current_account 1599 | method: post 1600 | headers: 1601 | Authorization: 1602 | - Bearer {{dropbox_1}} 1603 | response: 1604 | status_code: "200" 1605 | ``` 1606 | 1607 | Meanwhile, you can drop this provider in your own `providers.yaml` file and run keyscope: 1608 | 1609 | ``` 1610 | $ keyscope -f providers.yaml validate dropbox -p MY_KEY 1611 | ``` 1612 | 1613 | Now you can keep this in your private `providers.yaml` file or contribute it back to keyscope if you think other people might enjoy using it - we're happy to accept pull requests. 1614 | 1615 | # Thanks 1616 | 1617 | To all [Contributors](https://github.com/spectralops/keyscope/graphs/contributors) - you make this happen, thanks! 1618 | 1619 | # Copyright 1620 | 1621 | Copyright (c) 2021 [@jondot](http://twitter.com/jondot). See [LICENSE](LICENSE.txt) for further details. 1622 | -------------------------------------------------------------------------------- /keyscope/src/config.yaml: -------------------------------------------------------------------------------- 1 | providers: 2 | tester: 3 | validation: 4 | request: 5 | params: 6 | - name: tester_1 7 | desc: hookbin ID (https://hookb.in) 8 | - name: tester_2 9 | desc: fake key to put as a query param 10 | id: "tester:validation" 11 | desc: "Tester: valid key" 12 | uri: "https://hookb.in/{{tester_1}}?q={{tester_1}}" 13 | method: post 14 | response: 15 | status_code: "200" 16 | invalid: 17 | status_code: "5\\d\\d" 18 | examples: 19 | ok: 20 | status_code: "201" 21 | body: hello 22 | err: 23 | status_code: "500" 24 | 25 | infura: 26 | validation: 27 | request: 28 | id: "infura:validation" 29 | desc: "infura API key" 30 | params: 31 | - name: infura_1 32 | desc: infura API key 33 | uri: https://mainnet.infura.io/v3/{{infura_1}} 34 | body: '{"jsonrpc": "2.0", "id": 1, "method": "eth_blockNumber", "params": []}' 35 | method: post 36 | response: 37 | body: "^((?!invalid project id).)*$" 38 | invalid: 39 | status_code: "5\\d\\d" 40 | 41 | covalenthq: 42 | validation: 43 | request: 44 | id: "covalent:validation" 45 | desc: "Covalent: valid key" 46 | params: 47 | - name: covalenthq_1 48 | desc: covalent token 49 | uri: https://api.covalenthq.com/v1/chains/?key={{covalenthq_1}} 50 | response: 51 | status_code: "200" 52 | invalid: 53 | status_code: "5\\d\\d" 54 | 55 | asana: 56 | validation: 57 | request: 58 | id: "asana:validation" 59 | desc: "Asana: valid token" 60 | params: 61 | - name: asana_1 62 | desc: asana token 63 | uri: https://app.asana.com/api/1.0/users/me 64 | headers: 65 | Authorization: 66 | - "Bearer {{asana_1}}" 67 | response: 68 | status_code: "200" 69 | invalid: 70 | status_code: "5\\d\\d" 71 | 72 | bitly: 73 | validation: 74 | request: 75 | id: "bitly:validation" 76 | desc: "Bit.ly: valid access token" 77 | params: 78 | - name: bitly_1 79 | desc: bit.ly token 80 | uri: https://api-ssl.bitly.com/v3/shorten?access_token={{bitly_1}}&longUrl=https://www.google.com 81 | response: 82 | body: "status_code\":200" 83 | invalid: 84 | status_code: "5\\d\\d" 85 | 86 | ipstack: 87 | validation: 88 | request: 89 | id: "ipstack:validation" 90 | desc: "ipstack access key" 91 | params: 92 | - name: ipstack_1 93 | desc: ipstack access key 94 | uri: http://api.ipstack.com/134.201.250.155?access_key={{ipstack_1}} 95 | method: get 96 | response: 97 | body: "^((?!invalid_access_key).)*$" 98 | invalid: 99 | status_code: "5\\d\\d" 100 | 101 | localytics: 102 | validation: 103 | request: 104 | id: "localytics:validation" 105 | desc: "Localytics: valid API credentials" 106 | params: 107 | - name: localytics_1 108 | desc: localytics user 109 | - name: localytics_2 110 | desc: localytics key 111 | uri: https://api.localytics.com/v1/apps/ 112 | method: get 113 | basic_auth: 114 | user: "{{localytics_1}}" 115 | password: "{{localytics_2}}" 116 | headers: 117 | Accept: 118 | - application/vnd.localytics.v1+hal+json 119 | response: 120 | status_code: "200" 121 | invalid: 122 | status_code: "5\\d\\d" 123 | 124 | algolia: 125 | validation: 126 | request: 127 | id: "algolia:validation" 128 | desc: "Algolia: valid API credentials" 129 | params: 130 | - name: algolia_1 131 | desc: algolia application ID 132 | - name: algolia_2 133 | desc: algolia index 134 | - name: algolia_3 135 | desc: algolia API key 136 | uri: https://{{algolia_1}}-dsn.algolia.net/1/indexes/{{algolia_2}}/settings 137 | method: get 138 | headers: 139 | X-Algolia-Application-Id: 140 | - "{{algolia_1}}" 141 | X-Algolia-API-Key: 142 | - "{{algolia_3}}" 143 | response: 144 | status_code: "200" 145 | invalid: 146 | status_code: "5\\d\\d" 147 | 148 | branchio: 149 | validation: 150 | request: 151 | id: "branch.io:validation" 152 | desc: "branch.io: valid API credentials" 153 | params: 154 | - name: branchio_1 155 | desc: branch.io key 156 | - name: branchio_2 157 | desc: branch.io secret 158 | uri: https://api2.branch.io/v1/app/{{branchio_1}}?branch_secret={{branchio_2}} 159 | method: get 160 | response: 161 | status_code: "200" 162 | invalid: 163 | status_code: "5\\d\\d" 164 | 165 | browserstack: 166 | validation: 167 | request: 168 | id: "browserstack:validation" 169 | desc: "browserstack: valid API credentials" 170 | params: 171 | - name: browserstack_1 172 | desc: browserstack key 173 | - name: browserstack_2 174 | desc: browserstack secret 175 | uri: https://api.browserstack.com/automate/plan.json 176 | method: get 177 | basic_auth: 178 | user: "{{browserstack_1}}" 179 | password: "{{browserstack_2}}" 180 | response: 181 | status_code: "200" 182 | invalid: 183 | status_code: "5\\d\\d" 184 | 185 | buildkite: 186 | validation: 187 | request: 188 | id: "buildkite:validation" 189 | desc: "Buildkite: valid token" 190 | params: 191 | - name: buildkite_1 192 | desc: buildkite token 193 | uri: https://api.buildkite.com/v2/user 194 | headers: 195 | Authorization: 196 | - "Bearer {{buildkite_1}}" 197 | response: 198 | status_code: "200" 199 | invalid: 200 | status_code: "5\\d\\d" 201 | 202 | datadog: 203 | validation: 204 | request: 205 | id: "datadog:validation" 206 | desc: "datadog: valid API credentials" 207 | params: 208 | - name: datadog_1 209 | desc: datadog API key 210 | uri: https://api.datadoghq.com/api/v1/validate 211 | method: get 212 | headers: 213 | DD-API-KEY: 214 | - "{{datadog_1}}" 215 | response: 216 | status_code: "200" 217 | invalid: 218 | status_code: "5\\d\\d" 219 | 220 | github: 221 | validation: 222 | request: 223 | id: "github:validation" 224 | desc: "github: valid API credentials" 225 | params: 226 | - name: github_1 227 | desc: github token 228 | uri: https://api.github.com/user 229 | method: get 230 | headers: 231 | Authorization: 232 | - token {{github_1}} 233 | response: 234 | status_code: "200" 235 | invalid: 236 | status_code: "5\\d\\d" 237 | 238 | github-ent: 239 | validation: 240 | request: 241 | id: "github-ent:validation" 242 | desc: "Github Enterprise: valid API token" 243 | params: 244 | - name: github-ent_1 245 | desc: github enterprise instance (without http) 246 | - name: github-ent_2 247 | desc: github token 248 | uri: https://{{github-ent_1}}/api/v3 249 | method: get 250 | headers: 251 | Authorization: 252 | - token {{github-ent_2}} 253 | response: 254 | status_code: "200" 255 | invalid: 256 | status_code: "5\\d\\d" 257 | 258 | dropbox: 259 | validation: 260 | request: 261 | id: "dropbox:validation" 262 | desc: "dropbox: valid API credentials" 263 | params: 264 | - name: dropbox_1 265 | desc: dropbox token 266 | uri: https://api.dropboxapi.com/2/users/get_current_account 267 | method: post 268 | headers: 269 | Authorization: 270 | - Bearer {{dropbox_1}} 271 | response: 272 | status_code: "200" 273 | invalid: 274 | status_code: "5\\d\\d" 275 | 276 | gitlab: 277 | validation: 278 | request: 279 | id: "gitlab:validation" 280 | desc: "gitlab: valid API credentials" 281 | params: 282 | - name: gitlab_1 283 | desc: gitlab token 284 | uri: https://gitlab.com/api/v4/user 285 | method: get 286 | headers: 287 | Authorization: 288 | - Bearer {{gitlab_1}} 289 | response: 290 | status_code: "200" 291 | invalid: 292 | status_code: "5\\d\\d" 293 | 294 | 295 | heroku: 296 | validation: 297 | request: 298 | id: "heroku:validation" 299 | desc: "heroku: valid API credentials" 300 | params: 301 | - name: heroku_1 302 | desc: heroku token 303 | uri: https://api.heroku.com/account 304 | method: get 305 | headers: 306 | Accept: 307 | - "application/vnd.heroku+json; version=3" 308 | Authorization: 309 | - Bearer {{heroku_1}} 310 | response: 311 | status_code: "200" 312 | invalid: 313 | status_code: "5\\d\\d" 314 | 315 | mailchimp: 316 | validation: 317 | request: 318 | id: "mailchimp:validation" 319 | desc: "mailchimp: valid API credentials" 320 | params: 321 | - name: mailchimp_1 322 | desc: mailchimp datacenter ID 323 | - name: mailchimp_2 324 | desc: mailchimp key 325 | uri: https://{{mailchimp_1}}.api.mailchimp.com/3.0/lists 326 | method: get 327 | basic_auth: 328 | user: any 329 | password: "{{mailchimp_2}}" 330 | response: 331 | status_code: "200" 332 | invalid: 333 | status_code: "5\\d\\d" 334 | 335 | mailgun: 336 | validation: 337 | request: 338 | id: "mailgun:validation" 339 | desc: "mailgun: valid API credentials" 340 | params: 341 | - name: mailgun_1 342 | desc: mailgun key 343 | uri: https://api.mailgun.net/v3/domains 344 | method: get 345 | basic_auth: 346 | user: api 347 | password: "{{mailgun_1}}" 348 | response: 349 | status_code: "200" 350 | invalid: 351 | status_code: "5\\d\\d" 352 | 353 | 354 | pagerduty: 355 | validation: 356 | request: 357 | id: "pagerduty:validation" 358 | desc: "pagerduty: valid API credentials" 359 | params: 360 | - name: pagerduty_1 361 | desc: pagerduty token 362 | uri: https://api.pagerduty.com/schedules 363 | method: get 364 | headers: 365 | Accept: 366 | - "application/vnd.pagerduty+json;version=2" 367 | Authorization: 368 | - Token token={{pagerduty_1}} 369 | response: 370 | status_code: "200" 371 | invalid: 372 | status_code: "5\\d\\d" 373 | 374 | 375 | circleci: 376 | validation: 377 | request: 378 | id: "circleci:validation" 379 | desc: "circleci: valid API credentials" 380 | params: 381 | - name: circleci_1 382 | desc: circleci key 383 | uri: https://circleci.com/api/v2/me 384 | method: get 385 | headers: 386 | Circle-Token: 387 | - "{{circleci_1}}" 388 | response: 389 | status_code: "200" 390 | invalid: 391 | status_code: "5\\d\\d" 392 | 393 | facebook-access-token: 394 | validation: 395 | request: 396 | id: "facebook:validation" 397 | desc: "facebook: valid API token" 398 | params: 399 | - name: facebook-access-token_1 400 | desc: facebook token 401 | uri: https://developers.facebook.com/tools/debug/accesstoken/?version=v3.2&access_token={{facebook-access-token_1}} 402 | method: get 403 | response: 404 | status_code: "200" 405 | invalid: 406 | status_code: "5\\d\\d" 407 | 408 | salesforce: 409 | validation: 410 | request: 411 | id: "salesforce:validation" 412 | desc: "salesforce: valid API credentials" 413 | params: 414 | - name: salesforce_1 415 | desc: salesforce instance name 416 | - name: salesforce_2 417 | desc: salesforce token 418 | uri: https://{{salesforce_1}}.salesforce.com/services/data/v20.0/ 419 | method: get 420 | headers: 421 | Authorization: 422 | - Bearer {{salesforce_2}} 423 | response: 424 | status_code: "200" 425 | invalid: 426 | status_code: "5\\d\\d" 427 | 428 | jumpcloud: 429 | validation: 430 | request: 431 | id: "jumpcloud:validation" 432 | desc: "jumpcloud: valid API credentials" 433 | params: 434 | - name: jumpcloud_1 435 | desc: jumpcloud key 436 | uri: https://console.jumpcloud.com/api/v2/systemgroups 437 | method: get 438 | headers: 439 | x-api-key: 440 | - "{{jumpcloud_1}}" 441 | response: 442 | status_code: "200" 443 | invalid: 444 | status_code: "5\\d\\d" 445 | 446 | 447 | saucelabs-us: 448 | validation: 449 | request: 450 | id: "saucelabs-us:validation" 451 | desc: "saucelabs-us: valid API credentials" 452 | params: 453 | - name: saucelabs-us_1 454 | desc: saucelabs user 455 | - name: saucelabs-us_2 456 | desc: saucelabs key 457 | uri: https://api.us-west-1.saucelabs.com/team-management/v1/teams 458 | method: get 459 | basic_auth: 460 | user: "{{saucelabs-us_1}}" 461 | password: "{{saucelabs-us_2}}" 462 | response: 463 | status_code: "200" 464 | invalid: 465 | status_code: "5\\d\\d" 466 | 467 | saucelabs-eu: 468 | validation: 469 | request: 470 | id: "saucelabs-eu:validation" 471 | desc: "saucelabs-eu: valid API credentials" 472 | params: 473 | - name: saucelabs-eu_1 474 | desc: saucelabs user 475 | - name: saucelabs-eu_2 476 | desc: saucelabs key 477 | uri: https://api.eu-central-1.saucelabs.com/team-management/v1/teams 478 | method: get 479 | basic_auth: 480 | user: "{{saucelabs-eu_1}}" 481 | password: "{{saucelabs-eu_2}}" 482 | response: 483 | status_code: "200" 484 | invalid: 485 | status_code: "5\\d\\d" 486 | 487 | 488 | sendgrid: 489 | validation: 490 | request: 491 | id: "sendgrid:validation" 492 | desc: "sendgrid: valid API credentials" 493 | params: 494 | - name: sendgrid_1 495 | desc: sendgrid key 496 | uri: https://api.sendgrid.com/v3/scopes 497 | method: get 498 | headers: 499 | Content-Type: 500 | - application/json 501 | Authorization: 502 | - Bearer {{sendgrid_1}} 503 | response: 504 | status_code: "200" 505 | invalid: 506 | status_code: "5\\d\\d" 507 | 508 | slack: 509 | validation: 510 | request: 511 | id: "slack:validation" 512 | desc: "slack: valid API credentials" 513 | params: 514 | - name: slack_1 515 | desc: slack key 516 | uri: https://slack.com/api/auth.test 517 | method: post 518 | headers: 519 | Authorization: 520 | - Bearer {{slack_1}} 521 | response: 522 | # negative lookahead as a negated match 523 | body: "^((?!invalid_auth).)*$" 524 | invalid: 525 | status_code: "5\\d\\d" 526 | 527 | slack-webhook: 528 | validation: 529 | request: 530 | id: "slack-webook:validation" 531 | desc: "slack-webook: valid API credentials" 532 | params: 533 | - name: slack-webhook_1 534 | desc: slack webhook 535 | uri: "{{slack-webhook_1}}" 536 | method: post 537 | headers: 538 | Content-Type: 539 | - application/json 540 | body: "{\"text\": \"\"}" 541 | response: 542 | body: (missing_text_or_fallback_or_attachments|no_text) 543 | invalid: 544 | status_code: "5\\d\\d" 545 | 546 | slack-app-key: 547 | validation: 548 | request: 549 | id: "slack-app-key:validation" 550 | desc: "slack-app-key: valid App key credentials" 551 | params: 552 | - name: slack-app-key_1 553 | desc: slack app key 554 | uri: "https://slack.com/api/apps.connections.open" 555 | method: post 556 | headers: 557 | Content-Type: 558 | - application/json 559 | Authorization: 560 | - "Bearer {{slack-app-key_1}}" 561 | response: 562 | status_code: "200" 563 | body: "\"ok\":\\s*true" 564 | invalid: 565 | status_code: "200" 566 | body: "\"ok\":\\s*false" 567 | 568 | 569 | stripe: 570 | validation: 571 | request: 572 | id: "stripe:validation" 573 | desc: "stripe: valid API credentials" 574 | params: 575 | - name: stripe_1 576 | desc: stripe key 577 | uri: https://api.stripe.com/v1/charges 578 | method: get 579 | basic_auth: 580 | user: "{{stripe_1}}" 581 | response: 582 | status_code: "200" 583 | invalid: 584 | status_code: "5\\d\\d" 585 | 586 | travisci: 587 | validation: 588 | request: 589 | id: "travisci:validation" 590 | desc: "travisci: valid API credentials" 591 | params: 592 | - name: travisci_1 593 | desc: travisci domain, choose 'org' or 'com' 594 | - name: travisci_2 595 | desc: travisci key 596 | uri: https://api.travis-ci.{{travisci_1}}/user 597 | method: get 598 | headers: 599 | Travis-API-Version: 600 | - "3" 601 | Authorization: 602 | - token {{travisci_2}} 603 | response: 604 | status_code: "200" 605 | invalid: 606 | status_code: "5\\d\\d" 607 | 608 | twilio: 609 | validation: 610 | request: 611 | id: "twilio:validation" 612 | desc: "twilio: valid API credentials" 613 | params: 614 | - name: twilio_1 615 | desc: twilio account sid 616 | - name: twilio_2 617 | desc: twilio token 618 | uri: https://api.twilio.com/2010-04-01/Accounts 619 | method: get 620 | basic_auth: 621 | user: "{{twilio_1}}" 622 | password: "{{twilio_2}}" 623 | response: 624 | status_code: "200" 625 | invalid: 626 | status_code: "5\\d\\d" 627 | 628 | twitter: 629 | validation: 630 | request: 631 | id: "twitter:validation" 632 | desc: "twitter: valid API credentials" 633 | params: 634 | - name: twitter_1 635 | desc: twitter API token 636 | uri: https://api.twitter.com/1.1/account_activity/all/subscriptions/count.json 637 | method: get 638 | headers: 639 | Authorization: 640 | - Bearer {{twitter_1}} 641 | response: 642 | status_code: "200" 643 | invalid: 644 | status_code: "5\\d\\d" 645 | 646 | zendesk: 647 | validation: 648 | request: 649 | id: "zendesk:validation" 650 | desc: "zendesk: valid API credentials" 651 | params: 652 | - name: zendesk_1 653 | desc: zendesk domain 654 | - name: zendesk_2 655 | desc: zendesk key 656 | uri: https://{{zendesk_1}}.zendesk.com/api/v2/tickets.json 657 | method: get 658 | headers: 659 | Authorization: 660 | - Bearer {{zendesk_2}} 661 | response: 662 | status_code: "200" 663 | invalid: 664 | status_code: "5\\d\\d" 665 | 666 | firebase: 667 | validation: 668 | request: 669 | id: "firebase:validation" 670 | desc: "firebase: valid API credentials" 671 | params: 672 | - name: firebase_1 673 | desc: firebase API key 674 | - name: firebase_2 675 | desc: firebase ID token 676 | uri: https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key={{firebase_1}} 677 | method: post 678 | headers: 679 | Content-Type: 680 | - application/json 681 | body: "{\"idToken\": \"{{firebase_2}}\"}" 682 | response: 683 | status_code: "200" 684 | invalid: 685 | status_code: "5\\d\\d" 686 | 687 | aws: 688 | validation: 689 | request: 690 | id: "aws:validation" 691 | desc: "aws: valid API credentials" 692 | params: 693 | - name: aws_1 694 | desc: AWS ID 695 | - name: aws_2 696 | desc: AWS secret 697 | - name: aws_3 698 | desc: AWS token 699 | optional: true 700 | uri: https://sts.amazonaws.com 701 | method: post 702 | aws_auth: 703 | key: "{{aws_1}}" 704 | secret: "{{aws_2}}" 705 | token: "{{aws_3}}" 706 | service: "sts" 707 | headers: 708 | content-type: 709 | - application/x-www-form-urlencoded 710 | body: "Action=GetCallerIdentity&Version=2011-06-15" 711 | response: 712 | status_code: "200" 713 | invalid: 714 | status_code: "5\\d\\d" 715 | 716 | elastic-apm-secret: 717 | validation: 718 | request: 719 | id: "elastic-apm-secret:validation" 720 | desc: "Elastic APM: secret key validation" 721 | params: 722 | - name: elastic-apm-secret_1 723 | desc: Elastic APM host address and port, including 'http/s' part 724 | - name: elastic-apm-secret_2 725 | desc: Elastic APM secret 726 | uri: "{{elastic-apm-secret_1}}/config/v1/agents?service.name=test" 727 | headers: 728 | Authorization: 729 | - "Bearer {{elastic-apm-secret_2}}" 730 | response: 731 | status_code: "200" 732 | invalid: 733 | status_code: "5\\d\\d" 734 | 735 | artifactory: 736 | validation: 737 | request: 738 | id: "artifactory:validation" 739 | desc: "Artifactory: token validation" 740 | params: 741 | - name: artifactory_1 742 | desc: Artifactory host (including http(s) part) 743 | - name: artifactory_2 744 | desc: Artifactory token 745 | uri: "{{artifactory_1}}/api/system/ping" 746 | headers: 747 | X-JFrog-Art-API: 748 | - "{{artifactory_2}}" 749 | response: 750 | status_code: "200" 751 | invalid: 752 | status_code: "5\\d\\d" 753 | 754 | ibm-cos: 755 | validation: 756 | request: 757 | id: "ibm-cos:validation" 758 | desc: "IBM: cloud object storage key validation (HMAC)" 759 | params: 760 | - name: ibm-cos_1 761 | desc: IBM HMAC ID 762 | - name: ibm-cos_2 763 | desc: IBM HMAC secret 764 | uri: https://s3.us.cloud-object-storage.appdomain.cloud 765 | method: get 766 | aws_auth: 767 | key: "{{ibm-cos_1}}" 768 | secret: "{{ibm-cos_2}}" 769 | service: "s3" 770 | region: us-standard 771 | endpoint: s3.us.cloud-object-storage.appdomain.cloud 772 | headers: 773 | host: 774 | - s3.us.cloud-object-storage.appdomain.cloud 775 | response: 776 | status_code: "200" 777 | invalid: 778 | status_code: "5\\d\\d" 779 | 780 | 781 | ibm-iam: 782 | validation: 783 | request: 784 | id: "ibm-iam:validation" 785 | desc: "IBM: cloud key validation (IAM)" 786 | params: 787 | - name: ibm-iam_1 788 | desc: IBM cloud key 789 | uri: https://iam.cloud.ibm.com/identity/introspect 790 | method: post 791 | form: 792 | apikey: "{{ibm-iam_1}}" 793 | response: 794 | status_code: "200" 795 | body: "\"active\":\\s*true" 796 | invalid: 797 | status_code: "5\\d\\d" 798 | 799 | ibm-cloudant: 800 | validation: 801 | request: 802 | id: "ibm-cloudant:validation" 803 | desc: "IBM: cloudant key validation (legacy)" 804 | params: 805 | - name: ibm-cloudant_1 806 | desc: IBM cloudant hostname 807 | - name: ibm-cloudant_2 808 | desc: IBM cloudant user 809 | - name: ibm-cloudant_3 810 | desc: IBM cloudant key 811 | uri: https://{{ibm-cloudant_1}}.cloudantnosqldb.appdomain.cloud 812 | method: get 813 | basic_auth: 814 | user: "{{ibm-cloudant_2}}" 815 | password: "{{ibm-cloudant_3}}" 816 | response: 817 | status_code: "200" 818 | invalid: 819 | status_code: "5\\d\\d" 820 | 821 | softlayer: 822 | validation: 823 | request: 824 | id: "softlayer:validation" 825 | desc: "Softlayer: validate credentials" 826 | params: 827 | - name: softlayer_1 828 | desc: Softlayer hostname 829 | - name: softlayer_2 830 | desc: Softlayer token 831 | uri: https://api.softlayer.com/rest/v3/SoftLayer_Account.json 832 | method: get 833 | basic_auth: 834 | user: "{{softlayer_1}}" 835 | password: "{{softlayer_2}}" 836 | headers: 837 | Content-Type: 838 | - application/json 839 | response: 840 | status_code: "200" 841 | invalid: 842 | status_code: "5\\d\\d" 843 | 844 | square: 845 | validation: 846 | request: 847 | id: "square:validation" 848 | desc: "Square: valid token" 849 | params: 850 | - name: square_1 851 | desc: Square token 852 | uri: https://connect.squareup.com/v2/customers 853 | headers: 854 | Authorization: 855 | - "Bearer {{square_1}}" 856 | response: 857 | status_code: "200" 858 | invalid: 859 | status_code: "5\\d\\d" 860 | 861 | telegram-bot: 862 | validation: 863 | request: 864 | id: "telegram-bot:validation" 865 | desc: "telegram-bot: valid bot token" 866 | params: 867 | - name: telegram-bot_1 868 | desc: bot key 869 | uri: https://api.telegram.org/bot{{telegram-bot_1}}/getMe 870 | method: get 871 | response: 872 | status_code: "200" 873 | invalid: 874 | status_code: "5\\d\\d" 875 | 876 | bingmaps: 877 | validation: 878 | request: 879 | id: "bingmaps:validation" 880 | desc: "Bing Maps API: valid access token" 881 | params: 882 | - name: bingmaps_1 883 | desc: Bing Maps token 884 | uri: https://dev.virtualearth.net/REST/v1/Locations?CountryRegion=US&adminDistrict=WA&locality=Somewhere&postalCode=98001&addressLine=100%20Main%20St.&key={{bingmaps_1}} 885 | response: 886 | body: "ValidCredentials" 887 | invalid: 888 | status_code: "4\\d\\d" 889 | 890 | buttercms: 891 | validation: 892 | request: 893 | id: "buttercms:validation" 894 | desc: "ButterCMS: valid bot token" 895 | params: 896 | - name: buttercms_1 897 | desc: ButterCMS API key 898 | uri: https://api.buttercms.com/v2/posts/?auth_token={{buttercms_1}} 899 | method: get 900 | response: 901 | status_code: "200" 902 | invalid: 903 | status_code: "4\\d\\d" 904 | 905 | wakatime: 906 | validation: 907 | request: 908 | id: "wakatime:validation" 909 | desc: "wakatime: valid api token" 910 | params: 911 | - name: wakatime_1 912 | desc: WakeTime API key 913 | uri: https://wakatime.com/api/v1/users/current/projects/?api_key={{wakatime_1}} 914 | method: get 915 | response: 916 | status_code: "200" 917 | invalid: 918 | status_code: "4\\d\\d" 919 | 920 | calendly: 921 | validation: 922 | request: 923 | id: "calendly:validation" 924 | desc: "calendly: valid API credentials" 925 | params: 926 | - name: calendly_1 927 | desc: calendly API key 928 | uri: https://calendly.com/api/v1/users/me 929 | method: get 930 | headers: 931 | X-TOKEN: 932 | - "{{calendly_1}}" 933 | response: 934 | status_code: "200" 935 | invalid: 936 | status_code: "4\\d\\d" 937 | 938 | shodan: 939 | validation: 940 | request: 941 | id: "shodan:validation" 942 | desc: "shodan: valid api token" 943 | params: 944 | - name: shodan_1 945 | desc: Shodan API key 946 | uri: https://api.shodan.io/shodan/host/8.8.8.8?key={{shodan_1}} 947 | method: get 948 | response: 949 | status_code: "200" 950 | invalid: 951 | status_code: "4\\d\\d" 952 | 953 | opsgenie: 954 | validation: 955 | request: 956 | id: "opsgenie:validation" 957 | desc: "opsgenie: valid api token" 958 | params: 959 | - name: opsgenie_1 960 | desc: opsgenie API key 961 | uri: https://api.opsgenie.com/v2/alerts 962 | method: get 963 | headers: 964 | Authorization: 965 | - "GenieKey {{opsgenie_1}}" 966 | response: 967 | status_code: "200" 968 | invalid: 969 | status_code: "4\\d\\d" 970 | 971 | pendo: 972 | validation: 973 | request: 974 | id: "pendo:validation" 975 | desc: "pendo: valid api token" 976 | params: 977 | - name: pendo_1 978 | desc: pendo API key 979 | uri: https://app.pendo.io/api/v1/feature 980 | method: get 981 | headers: 982 | Content-Type: 983 | - application/json 984 | x-pendo-integration-key: 985 | - "{{pendo_1}}" 986 | response: 987 | status_code: "200" 988 | invalid: 989 | status_code: "4\\d\\d" 990 | 991 | hubspot: 992 | validation: 993 | request: 994 | id: "hubspot:validation" 995 | desc: "hubspot: valid api token" 996 | params: 997 | - name: hubspot_1 998 | desc: hubspot API key 999 | uri: https://api.hubapi.com/owners/v2/owners?hapikey={{hubspot_1}} 1000 | method: get 1001 | response: 1002 | status_code: "200" 1003 | invalid: 1004 | status_code: "4\\d\\d" 1005 | 1006 | lokalise: 1007 | validation: 1008 | request: 1009 | id: "lokalise:validation" 1010 | desc: "lokalise: valid api token" 1011 | params: 1012 | - name: lokalise_1 1013 | desc: lokalise token 1014 | uri: https://api.lokalise.com/api2/projects 1015 | method: get 1016 | headers: 1017 | Content-Type: 1018 | - application/json 1019 | X-Api-Token: 1020 | - "{{lokalise_1}}" 1021 | response: 1022 | status_code: "200" 1023 | invalid: 1024 | status_code: "4\\d\\d" 1025 | 1026 | snyk: 1027 | validation: 1028 | request: 1029 | id: "snyk:validation" 1030 | desc: "snyk: Key" 1031 | params: 1032 | - name: snyk_1 1033 | desc: snyk token 1034 | uri: https://api.snyk.io/v1/user/me 1035 | method: get 1036 | headers: 1037 | Authorization: 1038 | - "token {{snyk_1}}" 1039 | response: 1040 | status_code: "200" 1041 | invalid: 1042 | status_code: "4\\d\\d" 1043 | 1044 | openai-api-key: 1045 | validation: 1046 | request: 1047 | id: "openai-api-key:validation" 1048 | desc: "openai-api-key: Key" 1049 | params: 1050 | - name: openai-api-key_1 1051 | desc: openai-api-key api key 1052 | uri: https://api.openai.com/v1/models 1053 | method: get 1054 | headers: 1055 | Authorization: 1056 | - "Bearer {{openai-api-key_1}}" 1057 | response: 1058 | status_code: "200" 1059 | invalid: 1060 | status_code: "4\\d\\d" 1061 | 1062 | okta: 1063 | validation: 1064 | request: 1065 | id: "okta:validation" 1066 | desc: "okta: valid API token" 1067 | params: 1068 | - name: okta_1 1069 | desc: okta domain (without https://) 1070 | - name: okta_2 1071 | desc: okta API token 1072 | uri: https://{{okta_1}}/api/v1/users/me 1073 | method: get 1074 | headers: 1075 | Accept: 1076 | - "application/json" 1077 | Content-Type: 1078 | - application/json 1079 | Authorization: 1080 | - "SSWS {{okta_2}}" 1081 | response: 1082 | status_code: "200" 1083 | invalid: 1084 | status_code: "4\\d\\d" 1085 | 1086 | artifactory-access-token: 1087 | validation: 1088 | request: 1089 | id: "artifactory-access-token:validation" 1090 | desc: "artifactory-access-token: valid access token" 1091 | params: 1092 | - name: artifactory-access-token_1 1093 | desc: artifactory host 1094 | - name: artifactory-access-token_2 1095 | desc: artifactory access token (JWT) 1096 | uri: "{{artifactory-access-token_1}}/artifactory/api/system/ping" 1097 | method: get 1098 | headers: 1099 | Authorization: 1100 | - "Bearer {{artifactory-access-token_2}}" 1101 | response: 1102 | status_code: "200" 1103 | invalid: 1104 | status_code: "4\\d\\d" 1105 | 1106 | gcp-api-key: 1107 | validation: 1108 | request: 1109 | id: "gcp-api-key:validation" 1110 | desc: "Google Cloud Platform: valid API key" 1111 | params: 1112 | - name: gcp-api-key_1 1113 | desc: GCP API key 1114 | uri: https://www.googleapis.com/discovery/v1/apis?key={{gcp-api-key_1}} 1115 | method: get 1116 | response: 1117 | status_code: "200" 1118 | invalid: 1119 | status_code: "4\\d\\d" 1120 | 1121 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.21.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "android-tzdata" 31 | version = "0.1.1" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 34 | 35 | [[package]] 36 | name = "android_system_properties" 37 | version = "0.1.5" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 40 | dependencies = [ 41 | "libc", 42 | ] 43 | 44 | [[package]] 45 | name = "anstream" 46 | version = "0.6.14" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" 49 | dependencies = [ 50 | "anstyle", 51 | "anstyle-parse", 52 | "anstyle-query", 53 | "anstyle-wincon", 54 | "colorchoice", 55 | "is_terminal_polyfill", 56 | "utf8parse", 57 | ] 58 | 59 | [[package]] 60 | name = "anstyle" 61 | version = "1.0.7" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" 64 | 65 | [[package]] 66 | name = "anstyle-parse" 67 | version = "0.2.4" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" 70 | dependencies = [ 71 | "utf8parse", 72 | ] 73 | 74 | [[package]] 75 | name = "anstyle-query" 76 | version = "1.0.3" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" 79 | dependencies = [ 80 | "windows-sys 0.52.0", 81 | ] 82 | 83 | [[package]] 84 | name = "anstyle-wincon" 85 | version = "3.0.3" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" 88 | dependencies = [ 89 | "anstyle", 90 | "windows-sys 0.52.0", 91 | ] 92 | 93 | [[package]] 94 | name = "anyhow" 95 | version = "1.0.82" 96 | source = "registry+https://github.com/rust-lang/crates.io-index" 97 | checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" 98 | 99 | [[package]] 100 | name = "arrayvec" 101 | version = "0.5.2" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 104 | 105 | [[package]] 106 | name = "async-trait" 107 | version = "0.1.80" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" 110 | dependencies = [ 111 | "proc-macro2", 112 | "quote", 113 | "syn 2.0.60", 114 | ] 115 | 116 | [[package]] 117 | name = "autocfg" 118 | version = "1.3.0" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 121 | 122 | [[package]] 123 | name = "backtrace" 124 | version = "0.3.71" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" 127 | dependencies = [ 128 | "addr2line", 129 | "cc", 130 | "cfg-if", 131 | "libc", 132 | "miniz_oxide", 133 | "object", 134 | "rustc-demangle", 135 | ] 136 | 137 | [[package]] 138 | name = "base64" 139 | version = "0.10.1" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" 142 | dependencies = [ 143 | "byteorder", 144 | ] 145 | 146 | [[package]] 147 | name = "base64" 148 | version = "0.13.1" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" 151 | 152 | [[package]] 153 | name = "base64" 154 | version = "0.22.1" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 157 | 158 | [[package]] 159 | name = "bit-set" 160 | version = "0.5.3" 161 | source = "registry+https://github.com/rust-lang/crates.io-index" 162 | checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" 163 | dependencies = [ 164 | "bit-vec", 165 | ] 166 | 167 | [[package]] 168 | name = "bit-vec" 169 | version = "0.6.3" 170 | source = "registry+https://github.com/rust-lang/crates.io-index" 171 | checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" 172 | 173 | [[package]] 174 | name = "bitflags" 175 | version = "1.3.2" 176 | source = "registry+https://github.com/rust-lang/crates.io-index" 177 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 178 | 179 | [[package]] 180 | name = "bitflags" 181 | version = "2.5.0" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" 184 | 185 | [[package]] 186 | name = "block-buffer" 187 | version = "0.9.0" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 190 | dependencies = [ 191 | "generic-array", 192 | ] 193 | 194 | [[package]] 195 | name = "bumpalo" 196 | version = "3.16.0" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 199 | 200 | [[package]] 201 | name = "byteorder" 202 | version = "1.5.0" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 205 | 206 | [[package]] 207 | name = "bytes" 208 | version = "1.6.0" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" 211 | 212 | [[package]] 213 | name = "cc" 214 | version = "1.0.96" 215 | source = "registry+https://github.com/rust-lang/crates.io-index" 216 | checksum = "065a29261d53ba54260972629f9ca6bffa69bac13cd1fed61420f7fa68b9f8bd" 217 | 218 | [[package]] 219 | name = "cfg-if" 220 | version = "1.0.0" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 223 | 224 | [[package]] 225 | name = "chrono" 226 | version = "0.4.38" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" 229 | dependencies = [ 230 | "android-tzdata", 231 | "iana-time-zone", 232 | "js-sys", 233 | "num-traits", 234 | "serde", 235 | "wasm-bindgen", 236 | "windows-targets 0.52.5", 237 | ] 238 | 239 | [[package]] 240 | name = "clap" 241 | version = "4.5.4" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" 244 | dependencies = [ 245 | "clap_builder", 246 | "clap_derive", 247 | ] 248 | 249 | [[package]] 250 | name = "clap_builder" 251 | version = "4.5.2" 252 | source = "registry+https://github.com/rust-lang/crates.io-index" 253 | checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" 254 | dependencies = [ 255 | "anstream", 256 | "anstyle", 257 | "clap_lex", 258 | "strsim", 259 | ] 260 | 261 | [[package]] 262 | name = "clap_derive" 263 | version = "4.5.4" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" 266 | dependencies = [ 267 | "heck", 268 | "proc-macro2", 269 | "quote", 270 | "syn 2.0.60", 271 | ] 272 | 273 | [[package]] 274 | name = "clap_lex" 275 | version = "0.7.0" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" 278 | 279 | [[package]] 280 | name = "colorchoice" 281 | version = "1.0.1" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" 284 | 285 | [[package]] 286 | name = "console" 287 | version = "0.14.1" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "3993e6445baa160675931ec041a5e03ca84b9c6e32a056150d3aa2bdda0a1f45" 290 | dependencies = [ 291 | "encode_unicode", 292 | "lazy_static", 293 | "libc", 294 | "regex", 295 | "terminal_size", 296 | "unicode-width", 297 | "winapi", 298 | ] 299 | 300 | [[package]] 301 | name = "console" 302 | version = "0.15.8" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" 305 | dependencies = [ 306 | "encode_unicode", 307 | "lazy_static", 308 | "libc", 309 | "unicode-width", 310 | "windows-sys 0.52.0", 311 | ] 312 | 313 | [[package]] 314 | name = "content_inspector" 315 | version = "0.2.4" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38" 318 | dependencies = [ 319 | "memchr", 320 | ] 321 | 322 | [[package]] 323 | name = "core-foundation" 324 | version = "0.9.4" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 327 | dependencies = [ 328 | "core-foundation-sys", 329 | "libc", 330 | ] 331 | 332 | [[package]] 333 | name = "core-foundation-sys" 334 | version = "0.8.6" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 337 | 338 | [[package]] 339 | name = "cpufeatures" 340 | version = "0.2.12" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 343 | dependencies = [ 344 | "libc", 345 | ] 346 | 347 | [[package]] 348 | name = "crc32fast" 349 | version = "1.4.0" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" 352 | dependencies = [ 353 | "cfg-if", 354 | ] 355 | 356 | [[package]] 357 | name = "crossbeam-deque" 358 | version = "0.8.5" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" 361 | dependencies = [ 362 | "crossbeam-epoch", 363 | "crossbeam-utils", 364 | ] 365 | 366 | [[package]] 367 | name = "crossbeam-epoch" 368 | version = "0.9.18" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 371 | dependencies = [ 372 | "crossbeam-utils", 373 | ] 374 | 375 | [[package]] 376 | name = "crossbeam-utils" 377 | version = "0.8.19" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" 380 | 381 | [[package]] 382 | name = "crypto-mac" 383 | version = "0.11.1" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" 386 | dependencies = [ 387 | "generic-array", 388 | "subtle", 389 | ] 390 | 391 | [[package]] 392 | name = "der-parser" 393 | version = "1.1.1" 394 | source = "registry+https://github.com/rust-lang/crates.io-index" 395 | checksum = "8c61ce7e682729d218090106bf253384df68a2047122ed461ae79ec65d6b4985" 396 | dependencies = [ 397 | "nom", 398 | "num-bigint", 399 | "rusticata-macros", 400 | ] 401 | 402 | [[package]] 403 | name = "derive-getters" 404 | version = "0.2.1" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "0122f262bf9c9a367829da84f808d9fb128c10ef283bbe7b0922a77cf07b2747" 407 | dependencies = [ 408 | "proc-macro2", 409 | "quote", 410 | "syn 1.0.109", 411 | ] 412 | 413 | [[package]] 414 | name = "difference" 415 | version = "2.0.0" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" 418 | 419 | [[package]] 420 | name = "digest" 421 | version = "0.9.0" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 424 | dependencies = [ 425 | "generic-array", 426 | ] 427 | 428 | [[package]] 429 | name = "dirs-next" 430 | version = "2.0.0" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" 433 | dependencies = [ 434 | "cfg-if", 435 | "dirs-sys-next", 436 | ] 437 | 438 | [[package]] 439 | name = "dirs-sys-next" 440 | version = "0.1.2" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" 443 | dependencies = [ 444 | "libc", 445 | "redox_users", 446 | "winapi", 447 | ] 448 | 449 | [[package]] 450 | name = "dtoa" 451 | version = "0.4.8" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" 454 | 455 | [[package]] 456 | name = "dunce" 457 | version = "1.0.4" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" 460 | 461 | [[package]] 462 | name = "either" 463 | version = "1.11.0" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" 466 | 467 | [[package]] 468 | name = "encode_unicode" 469 | version = "0.3.6" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" 472 | 473 | [[package]] 474 | name = "encoding_rs" 475 | version = "0.8.34" 476 | source = "registry+https://github.com/rust-lang/crates.io-index" 477 | checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" 478 | dependencies = [ 479 | "cfg-if", 480 | ] 481 | 482 | [[package]] 483 | name = "equivalent" 484 | version = "1.0.1" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 487 | 488 | [[package]] 489 | name = "errno" 490 | version = "0.3.8" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" 493 | dependencies = [ 494 | "libc", 495 | "windows-sys 0.52.0", 496 | ] 497 | 498 | [[package]] 499 | name = "error-chain" 500 | version = "0.10.0" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "d9435d864e017c3c6afeac1654189b06cdb491cf2ff73dbf0d73b0f292f42ff8" 503 | dependencies = [ 504 | "backtrace", 505 | ] 506 | 507 | [[package]] 508 | name = "fancy-regex" 509 | version = "0.13.0" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" 512 | dependencies = [ 513 | "bit-set", 514 | "regex-automata 0.4.6", 515 | "regex-syntax 0.8.3", 516 | ] 517 | 518 | [[package]] 519 | name = "fastrand" 520 | version = "2.1.0" 521 | source = "registry+https://github.com/rust-lang/crates.io-index" 522 | checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" 523 | 524 | [[package]] 525 | name = "filetime" 526 | version = "0.2.23" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" 529 | dependencies = [ 530 | "cfg-if", 531 | "libc", 532 | "redox_syscall", 533 | "windows-sys 0.52.0", 534 | ] 535 | 536 | [[package]] 537 | name = "fnv" 538 | version = "1.0.7" 539 | source = "registry+https://github.com/rust-lang/crates.io-index" 540 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 541 | 542 | [[package]] 543 | name = "foreign-types" 544 | version = "0.3.2" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 547 | dependencies = [ 548 | "foreign-types-shared", 549 | ] 550 | 551 | [[package]] 552 | name = "foreign-types-shared" 553 | version = "0.1.1" 554 | source = "registry+https://github.com/rust-lang/crates.io-index" 555 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 556 | 557 | [[package]] 558 | name = "form_urlencoded" 559 | version = "1.2.1" 560 | source = "registry+https://github.com/rust-lang/crates.io-index" 561 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 562 | dependencies = [ 563 | "percent-encoding", 564 | ] 565 | 566 | [[package]] 567 | name = "futures" 568 | version = "0.3.30" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" 571 | dependencies = [ 572 | "futures-channel", 573 | "futures-core", 574 | "futures-executor", 575 | "futures-io", 576 | "futures-sink", 577 | "futures-task", 578 | "futures-util", 579 | ] 580 | 581 | [[package]] 582 | name = "futures-channel" 583 | version = "0.3.30" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 586 | dependencies = [ 587 | "futures-core", 588 | "futures-sink", 589 | ] 590 | 591 | [[package]] 592 | name = "futures-core" 593 | version = "0.3.30" 594 | source = "registry+https://github.com/rust-lang/crates.io-index" 595 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 596 | 597 | [[package]] 598 | name = "futures-executor" 599 | version = "0.3.30" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" 602 | dependencies = [ 603 | "futures-core", 604 | "futures-task", 605 | "futures-util", 606 | ] 607 | 608 | [[package]] 609 | name = "futures-io" 610 | version = "0.3.30" 611 | source = "registry+https://github.com/rust-lang/crates.io-index" 612 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 613 | 614 | [[package]] 615 | name = "futures-macro" 616 | version = "0.3.30" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" 619 | dependencies = [ 620 | "proc-macro2", 621 | "quote", 622 | "syn 2.0.60", 623 | ] 624 | 625 | [[package]] 626 | name = "futures-sink" 627 | version = "0.3.30" 628 | source = "registry+https://github.com/rust-lang/crates.io-index" 629 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 630 | 631 | [[package]] 632 | name = "futures-task" 633 | version = "0.3.30" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 636 | 637 | [[package]] 638 | name = "futures-util" 639 | version = "0.3.30" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 642 | dependencies = [ 643 | "futures-channel", 644 | "futures-core", 645 | "futures-io", 646 | "futures-macro", 647 | "futures-sink", 648 | "futures-task", 649 | "memchr", 650 | "pin-project-lite", 651 | "pin-utils", 652 | "slab", 653 | ] 654 | 655 | [[package]] 656 | name = "generic-array" 657 | version = "0.14.7" 658 | source = "registry+https://github.com/rust-lang/crates.io-index" 659 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 660 | dependencies = [ 661 | "typenum", 662 | "version_check 0.9.4", 663 | ] 664 | 665 | [[package]] 666 | name = "getrandom" 667 | version = "0.2.15" 668 | source = "registry+https://github.com/rust-lang/crates.io-index" 669 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 670 | dependencies = [ 671 | "cfg-if", 672 | "libc", 673 | "wasi 0.11.0+wasi-snapshot-preview1", 674 | ] 675 | 676 | [[package]] 677 | name = "gimli" 678 | version = "0.28.1" 679 | source = "registry+https://github.com/rust-lang/crates.io-index" 680 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 681 | 682 | [[package]] 683 | name = "glob" 684 | version = "0.3.1" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" 687 | 688 | [[package]] 689 | name = "h2" 690 | version = "0.3.26" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 693 | dependencies = [ 694 | "bytes", 695 | "fnv", 696 | "futures-core", 697 | "futures-sink", 698 | "futures-util", 699 | "http 0.2.12", 700 | "indexmap", 701 | "slab", 702 | "tokio", 703 | "tokio-util", 704 | "tracing", 705 | ] 706 | 707 | [[package]] 708 | name = "h2" 709 | version = "0.4.4" 710 | source = "registry+https://github.com/rust-lang/crates.io-index" 711 | checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" 712 | dependencies = [ 713 | "bytes", 714 | "fnv", 715 | "futures-core", 716 | "futures-sink", 717 | "futures-util", 718 | "http 1.1.0", 719 | "indexmap", 720 | "slab", 721 | "tokio", 722 | "tokio-util", 723 | "tracing", 724 | ] 725 | 726 | [[package]] 727 | name = "hashbrown" 728 | version = "0.14.5" 729 | source = "registry+https://github.com/rust-lang/crates.io-index" 730 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 731 | 732 | [[package]] 733 | name = "heck" 734 | version = "0.5.0" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 737 | 738 | [[package]] 739 | name = "hermit-abi" 740 | version = "0.3.9" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 743 | 744 | [[package]] 745 | name = "hex" 746 | version = "0.4.3" 747 | source = "registry+https://github.com/rust-lang/crates.io-index" 748 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 749 | 750 | [[package]] 751 | name = "histogram" 752 | version = "0.6.9" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" 755 | 756 | [[package]] 757 | name = "hmac" 758 | version = "0.11.0" 759 | source = "registry+https://github.com/rust-lang/crates.io-index" 760 | checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" 761 | dependencies = [ 762 | "crypto-mac", 763 | "digest", 764 | ] 765 | 766 | [[package]] 767 | name = "http" 768 | version = "0.2.12" 769 | source = "registry+https://github.com/rust-lang/crates.io-index" 770 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 771 | dependencies = [ 772 | "bytes", 773 | "fnv", 774 | "itoa", 775 | ] 776 | 777 | [[package]] 778 | name = "http" 779 | version = "1.1.0" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 782 | dependencies = [ 783 | "bytes", 784 | "fnv", 785 | "itoa", 786 | ] 787 | 788 | [[package]] 789 | name = "http-body" 790 | version = "0.4.6" 791 | source = "registry+https://github.com/rust-lang/crates.io-index" 792 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 793 | dependencies = [ 794 | "bytes", 795 | "http 0.2.12", 796 | "pin-project-lite", 797 | ] 798 | 799 | [[package]] 800 | name = "http-body" 801 | version = "1.0.0" 802 | source = "registry+https://github.com/rust-lang/crates.io-index" 803 | checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" 804 | dependencies = [ 805 | "bytes", 806 | "http 1.1.0", 807 | ] 808 | 809 | [[package]] 810 | name = "http-body-util" 811 | version = "0.1.1" 812 | source = "registry+https://github.com/rust-lang/crates.io-index" 813 | checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" 814 | dependencies = [ 815 | "bytes", 816 | "futures-core", 817 | "http 1.1.0", 818 | "http-body 1.0.0", 819 | "pin-project-lite", 820 | ] 821 | 822 | [[package]] 823 | name = "httparse" 824 | version = "1.8.0" 825 | source = "registry+https://github.com/rust-lang/crates.io-index" 826 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 827 | 828 | [[package]] 829 | name = "httpdate" 830 | version = "1.0.3" 831 | source = "registry+https://github.com/rust-lang/crates.io-index" 832 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 833 | 834 | [[package]] 835 | name = "humantime" 836 | version = "2.1.0" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 839 | 840 | [[package]] 841 | name = "humantime-serde" 842 | version = "1.1.1" 843 | source = "registry+https://github.com/rust-lang/crates.io-index" 844 | checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" 845 | dependencies = [ 846 | "humantime", 847 | "serde", 848 | ] 849 | 850 | [[package]] 851 | name = "hyper" 852 | version = "0.14.28" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" 855 | dependencies = [ 856 | "bytes", 857 | "futures-channel", 858 | "futures-core", 859 | "futures-util", 860 | "h2 0.3.26", 861 | "http 0.2.12", 862 | "http-body 0.4.6", 863 | "httparse", 864 | "httpdate", 865 | "itoa", 866 | "pin-project-lite", 867 | "socket2", 868 | "tokio", 869 | "tower-service", 870 | "tracing", 871 | "want", 872 | ] 873 | 874 | [[package]] 875 | name = "hyper" 876 | version = "1.3.1" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" 879 | dependencies = [ 880 | "bytes", 881 | "futures-channel", 882 | "futures-util", 883 | "h2 0.4.4", 884 | "http 1.1.0", 885 | "http-body 1.0.0", 886 | "httparse", 887 | "itoa", 888 | "pin-project-lite", 889 | "smallvec", 890 | "tokio", 891 | "want", 892 | ] 893 | 894 | [[package]] 895 | name = "hyper-tls" 896 | version = "0.5.0" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 899 | dependencies = [ 900 | "bytes", 901 | "hyper 0.14.28", 902 | "native-tls", 903 | "tokio", 904 | "tokio-native-tls", 905 | ] 906 | 907 | [[package]] 908 | name = "hyper-tls" 909 | version = "0.6.0" 910 | source = "registry+https://github.com/rust-lang/crates.io-index" 911 | checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 912 | dependencies = [ 913 | "bytes", 914 | "http-body-util", 915 | "hyper 1.3.1", 916 | "hyper-util", 917 | "native-tls", 918 | "tokio", 919 | "tokio-native-tls", 920 | "tower-service", 921 | ] 922 | 923 | [[package]] 924 | name = "hyper-util" 925 | version = "0.1.3" 926 | source = "registry+https://github.com/rust-lang/crates.io-index" 927 | checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" 928 | dependencies = [ 929 | "bytes", 930 | "futures-channel", 931 | "futures-util", 932 | "http 1.1.0", 933 | "http-body 1.0.0", 934 | "hyper 1.3.1", 935 | "pin-project-lite", 936 | "socket2", 937 | "tokio", 938 | "tower", 939 | "tower-service", 940 | "tracing", 941 | ] 942 | 943 | [[package]] 944 | name = "iana-time-zone" 945 | version = "0.1.60" 946 | source = "registry+https://github.com/rust-lang/crates.io-index" 947 | checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" 948 | dependencies = [ 949 | "android_system_properties", 950 | "core-foundation-sys", 951 | "iana-time-zone-haiku", 952 | "js-sys", 953 | "wasm-bindgen", 954 | "windows-core", 955 | ] 956 | 957 | [[package]] 958 | name = "iana-time-zone-haiku" 959 | version = "0.1.2" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 962 | dependencies = [ 963 | "cc", 964 | ] 965 | 966 | [[package]] 967 | name = "idna" 968 | version = "0.5.0" 969 | source = "registry+https://github.com/rust-lang/crates.io-index" 970 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 971 | dependencies = [ 972 | "unicode-bidi", 973 | "unicode-normalization", 974 | ] 975 | 976 | [[package]] 977 | name = "indexmap" 978 | version = "2.2.6" 979 | source = "registry+https://github.com/rust-lang/crates.io-index" 980 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 981 | dependencies = [ 982 | "equivalent", 983 | "hashbrown", 984 | ] 985 | 986 | [[package]] 987 | name = "ipnet" 988 | version = "2.9.0" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" 991 | 992 | [[package]] 993 | name = "is_terminal_polyfill" 994 | version = "1.70.0" 995 | source = "registry+https://github.com/rust-lang/crates.io-index" 996 | checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" 997 | 998 | [[package]] 999 | name = "itoa" 1000 | version = "1.0.11" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 1003 | 1004 | [[package]] 1005 | name = "js-sys" 1006 | version = "0.3.69" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 1009 | dependencies = [ 1010 | "wasm-bindgen", 1011 | ] 1012 | 1013 | [[package]] 1014 | name = "junit-report" 1015 | version = "0.6.0" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "4bc92bb61f860b8a88189e67820acdb13fd00149dac50fa365b232d27de34a18" 1018 | dependencies = [ 1019 | "chrono", 1020 | "derive-getters", 1021 | "strip-ansi-escapes", 1022 | "thiserror", 1023 | "xml-rs", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "keyscope" 1028 | version = "1.4.2" 1029 | dependencies = [ 1030 | "anyhow", 1031 | "clap", 1032 | "console 0.15.8", 1033 | "serde", 1034 | "serde_derive", 1035 | "serde_variant", 1036 | "serde_yaml 0.9.34+deprecated", 1037 | "service_policy_kit", 1038 | "thiserror", 1039 | "tracing", 1040 | "tracing-subscriber", 1041 | "trycmd", 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "lazy_static" 1046 | version = "1.4.0" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1049 | 1050 | [[package]] 1051 | name = "libc" 1052 | version = "0.2.154" 1053 | source = "registry+https://github.com/rust-lang/crates.io-index" 1054 | checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" 1055 | 1056 | [[package]] 1057 | name = "libredox" 1058 | version = "0.1.3" 1059 | source = "registry+https://github.com/rust-lang/crates.io-index" 1060 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 1061 | dependencies = [ 1062 | "bitflags 2.5.0", 1063 | "libc", 1064 | ] 1065 | 1066 | [[package]] 1067 | name = "linked-hash-map" 1068 | version = "0.5.6" 1069 | source = "registry+https://github.com/rust-lang/crates.io-index" 1070 | checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" 1071 | 1072 | [[package]] 1073 | name = "linux-raw-sys" 1074 | version = "0.4.13" 1075 | source = "registry+https://github.com/rust-lang/crates.io-index" 1076 | checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" 1077 | 1078 | [[package]] 1079 | name = "log" 1080 | version = "0.4.21" 1081 | source = "registry+https://github.com/rust-lang/crates.io-index" 1082 | checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 1083 | 1084 | [[package]] 1085 | name = "maplit" 1086 | version = "1.0.2" 1087 | source = "registry+https://github.com/rust-lang/crates.io-index" 1088 | checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" 1089 | 1090 | [[package]] 1091 | name = "matchers" 1092 | version = "0.1.0" 1093 | source = "registry+https://github.com/rust-lang/crates.io-index" 1094 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1095 | dependencies = [ 1096 | "regex-automata 0.1.10", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "md-5" 1101 | version = "0.9.1" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15" 1104 | dependencies = [ 1105 | "block-buffer", 1106 | "digest", 1107 | "opaque-debug", 1108 | ] 1109 | 1110 | [[package]] 1111 | name = "memchr" 1112 | version = "2.7.2" 1113 | source = "registry+https://github.com/rust-lang/crates.io-index" 1114 | checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" 1115 | 1116 | [[package]] 1117 | name = "mime" 1118 | version = "0.3.17" 1119 | source = "registry+https://github.com/rust-lang/crates.io-index" 1120 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1121 | 1122 | [[package]] 1123 | name = "miniz_oxide" 1124 | version = "0.7.2" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" 1127 | dependencies = [ 1128 | "adler", 1129 | ] 1130 | 1131 | [[package]] 1132 | name = "mio" 1133 | version = "0.8.11" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 1136 | dependencies = [ 1137 | "libc", 1138 | "wasi 0.11.0+wasi-snapshot-preview1", 1139 | "windows-sys 0.48.0", 1140 | ] 1141 | 1142 | [[package]] 1143 | name = "native-tls" 1144 | version = "0.2.11" 1145 | source = "registry+https://github.com/rust-lang/crates.io-index" 1146 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 1147 | dependencies = [ 1148 | "lazy_static", 1149 | "libc", 1150 | "log", 1151 | "openssl", 1152 | "openssl-probe", 1153 | "openssl-sys", 1154 | "schannel", 1155 | "security-framework", 1156 | "security-framework-sys", 1157 | "tempfile", 1158 | ] 1159 | 1160 | [[package]] 1161 | name = "nom" 1162 | version = "4.2.3" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" 1165 | dependencies = [ 1166 | "memchr", 1167 | "version_check 0.1.5", 1168 | ] 1169 | 1170 | [[package]] 1171 | name = "normalize-line-endings" 1172 | version = "0.3.0" 1173 | source = "registry+https://github.com/rust-lang/crates.io-index" 1174 | checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" 1175 | 1176 | [[package]] 1177 | name = "nu-ansi-term" 1178 | version = "0.46.0" 1179 | source = "registry+https://github.com/rust-lang/crates.io-index" 1180 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1181 | dependencies = [ 1182 | "overload", 1183 | "winapi", 1184 | ] 1185 | 1186 | [[package]] 1187 | name = "num-bigint" 1188 | version = "0.2.6" 1189 | source = "registry+https://github.com/rust-lang/crates.io-index" 1190 | checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" 1191 | dependencies = [ 1192 | "autocfg", 1193 | "num-integer", 1194 | "num-traits", 1195 | ] 1196 | 1197 | [[package]] 1198 | name = "num-integer" 1199 | version = "0.1.46" 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" 1201 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1202 | dependencies = [ 1203 | "num-traits", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "num-traits" 1208 | version = "0.2.19" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1211 | dependencies = [ 1212 | "autocfg", 1213 | ] 1214 | 1215 | [[package]] 1216 | name = "num_cpus" 1217 | version = "1.16.0" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 1220 | dependencies = [ 1221 | "hermit-abi", 1222 | "libc", 1223 | ] 1224 | 1225 | [[package]] 1226 | name = "object" 1227 | version = "0.32.2" 1228 | source = "registry+https://github.com/rust-lang/crates.io-index" 1229 | checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 1230 | dependencies = [ 1231 | "memchr", 1232 | ] 1233 | 1234 | [[package]] 1235 | name = "once_cell" 1236 | version = "1.19.0" 1237 | source = "registry+https://github.com/rust-lang/crates.io-index" 1238 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1239 | 1240 | [[package]] 1241 | name = "opaque-debug" 1242 | version = "0.3.1" 1243 | source = "registry+https://github.com/rust-lang/crates.io-index" 1244 | checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" 1245 | 1246 | [[package]] 1247 | name = "openapi" 1248 | version = "0.1.5" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | checksum = "739caefcf8a5f4638175df8971aba0be5f4651b58d4a217c36f5dd665f83ea00" 1251 | dependencies = [ 1252 | "error-chain", 1253 | "serde", 1254 | "serde_derive", 1255 | "serde_json", 1256 | "serde_yaml 0.7.5", 1257 | ] 1258 | 1259 | [[package]] 1260 | name = "openssl" 1261 | version = "0.10.64" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" 1264 | dependencies = [ 1265 | "bitflags 2.5.0", 1266 | "cfg-if", 1267 | "foreign-types", 1268 | "libc", 1269 | "once_cell", 1270 | "openssl-macros", 1271 | "openssl-sys", 1272 | ] 1273 | 1274 | [[package]] 1275 | name = "openssl-macros" 1276 | version = "0.1.1" 1277 | source = "registry+https://github.com/rust-lang/crates.io-index" 1278 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1279 | dependencies = [ 1280 | "proc-macro2", 1281 | "quote", 1282 | "syn 2.0.60", 1283 | ] 1284 | 1285 | [[package]] 1286 | name = "openssl-probe" 1287 | version = "0.1.5" 1288 | source = "registry+https://github.com/rust-lang/crates.io-index" 1289 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1290 | 1291 | [[package]] 1292 | name = "openssl-sys" 1293 | version = "0.9.102" 1294 | source = "registry+https://github.com/rust-lang/crates.io-index" 1295 | checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" 1296 | dependencies = [ 1297 | "cc", 1298 | "libc", 1299 | "pkg-config", 1300 | "vcpkg", 1301 | ] 1302 | 1303 | [[package]] 1304 | name = "os_pipe" 1305 | version = "1.1.5" 1306 | source = "registry+https://github.com/rust-lang/crates.io-index" 1307 | checksum = "57119c3b893986491ec9aa85056780d3a0f3cf4da7cc09dd3650dbd6c6738fb9" 1308 | dependencies = [ 1309 | "libc", 1310 | "windows-sys 0.52.0", 1311 | ] 1312 | 1313 | [[package]] 1314 | name = "overload" 1315 | version = "0.1.1" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1318 | 1319 | [[package]] 1320 | name = "percent-encoding" 1321 | version = "2.3.1" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1324 | 1325 | [[package]] 1326 | name = "pin-project" 1327 | version = "1.1.5" 1328 | source = "registry+https://github.com/rust-lang/crates.io-index" 1329 | checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" 1330 | dependencies = [ 1331 | "pin-project-internal", 1332 | ] 1333 | 1334 | [[package]] 1335 | name = "pin-project-internal" 1336 | version = "1.1.5" 1337 | source = "registry+https://github.com/rust-lang/crates.io-index" 1338 | checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" 1339 | dependencies = [ 1340 | "proc-macro2", 1341 | "quote", 1342 | "syn 2.0.60", 1343 | ] 1344 | 1345 | [[package]] 1346 | name = "pin-project-lite" 1347 | version = "0.2.14" 1348 | source = "registry+https://github.com/rust-lang/crates.io-index" 1349 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 1350 | 1351 | [[package]] 1352 | name = "pin-utils" 1353 | version = "0.1.0" 1354 | source = "registry+https://github.com/rust-lang/crates.io-index" 1355 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1356 | 1357 | [[package]] 1358 | name = "pkg-config" 1359 | version = "0.3.30" 1360 | source = "registry+https://github.com/rust-lang/crates.io-index" 1361 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" 1362 | 1363 | [[package]] 1364 | name = "proc-macro2" 1365 | version = "1.0.81" 1366 | source = "registry+https://github.com/rust-lang/crates.io-index" 1367 | checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" 1368 | dependencies = [ 1369 | "unicode-ident", 1370 | ] 1371 | 1372 | [[package]] 1373 | name = "quote" 1374 | version = "1.0.36" 1375 | source = "registry+https://github.com/rust-lang/crates.io-index" 1376 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 1377 | dependencies = [ 1378 | "proc-macro2", 1379 | ] 1380 | 1381 | [[package]] 1382 | name = "rayon" 1383 | version = "1.10.0" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 1386 | dependencies = [ 1387 | "either", 1388 | "rayon-core", 1389 | ] 1390 | 1391 | [[package]] 1392 | name = "rayon-core" 1393 | version = "1.12.1" 1394 | source = "registry+https://github.com/rust-lang/crates.io-index" 1395 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 1396 | dependencies = [ 1397 | "crossbeam-deque", 1398 | "crossbeam-utils", 1399 | ] 1400 | 1401 | [[package]] 1402 | name = "redox_syscall" 1403 | version = "0.4.1" 1404 | source = "registry+https://github.com/rust-lang/crates.io-index" 1405 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 1406 | dependencies = [ 1407 | "bitflags 1.3.2", 1408 | ] 1409 | 1410 | [[package]] 1411 | name = "redox_users" 1412 | version = "0.4.5" 1413 | source = "registry+https://github.com/rust-lang/crates.io-index" 1414 | checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" 1415 | dependencies = [ 1416 | "getrandom", 1417 | "libredox", 1418 | "thiserror", 1419 | ] 1420 | 1421 | [[package]] 1422 | name = "regex" 1423 | version = "1.10.4" 1424 | source = "registry+https://github.com/rust-lang/crates.io-index" 1425 | checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" 1426 | dependencies = [ 1427 | "aho-corasick", 1428 | "memchr", 1429 | "regex-automata 0.4.6", 1430 | "regex-syntax 0.8.3", 1431 | ] 1432 | 1433 | [[package]] 1434 | name = "regex-automata" 1435 | version = "0.1.10" 1436 | source = "registry+https://github.com/rust-lang/crates.io-index" 1437 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1438 | dependencies = [ 1439 | "regex-syntax 0.6.29", 1440 | ] 1441 | 1442 | [[package]] 1443 | name = "regex-automata" 1444 | version = "0.4.6" 1445 | source = "registry+https://github.com/rust-lang/crates.io-index" 1446 | checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" 1447 | dependencies = [ 1448 | "aho-corasick", 1449 | "memchr", 1450 | "regex-syntax 0.8.3", 1451 | ] 1452 | 1453 | [[package]] 1454 | name = "regex-syntax" 1455 | version = "0.6.29" 1456 | source = "registry+https://github.com/rust-lang/crates.io-index" 1457 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 1458 | 1459 | [[package]] 1460 | name = "regex-syntax" 1461 | version = "0.8.3" 1462 | source = "registry+https://github.com/rust-lang/crates.io-index" 1463 | checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" 1464 | 1465 | [[package]] 1466 | name = "reqwest" 1467 | version = "0.12.4" 1468 | source = "registry+https://github.com/rust-lang/crates.io-index" 1469 | checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" 1470 | dependencies = [ 1471 | "base64 0.22.1", 1472 | "bytes", 1473 | "encoding_rs", 1474 | "futures-channel", 1475 | "futures-core", 1476 | "futures-util", 1477 | "h2 0.4.4", 1478 | "http 1.1.0", 1479 | "http-body 1.0.0", 1480 | "http-body-util", 1481 | "hyper 1.3.1", 1482 | "hyper-tls 0.6.0", 1483 | "hyper-util", 1484 | "ipnet", 1485 | "js-sys", 1486 | "log", 1487 | "mime", 1488 | "native-tls", 1489 | "once_cell", 1490 | "percent-encoding", 1491 | "pin-project-lite", 1492 | "rustls-pemfile", 1493 | "serde", 1494 | "serde_json", 1495 | "serde_urlencoded", 1496 | "sync_wrapper", 1497 | "system-configuration", 1498 | "tokio", 1499 | "tokio-native-tls", 1500 | "tower-service", 1501 | "url", 1502 | "wasm-bindgen", 1503 | "wasm-bindgen-futures", 1504 | "web-sys", 1505 | "winreg", 1506 | ] 1507 | 1508 | [[package]] 1509 | name = "rusoto_core" 1510 | version = "0.48.0" 1511 | source = "registry+https://github.com/rust-lang/crates.io-index" 1512 | checksum = "1db30db44ea73551326269adcf7a2169428a054f14faf9e1768f2163494f2fa2" 1513 | dependencies = [ 1514 | "async-trait", 1515 | "base64 0.13.1", 1516 | "bytes", 1517 | "crc32fast", 1518 | "futures", 1519 | "http 0.2.12", 1520 | "hyper 0.14.28", 1521 | "hyper-tls 0.5.0", 1522 | "lazy_static", 1523 | "log", 1524 | "rusoto_credential", 1525 | "rusoto_signature", 1526 | "rustc_version", 1527 | "serde", 1528 | "serde_json", 1529 | "tokio", 1530 | "xml-rs", 1531 | ] 1532 | 1533 | [[package]] 1534 | name = "rusoto_credential" 1535 | version = "0.48.0" 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" 1537 | checksum = "ee0a6c13db5aad6047b6a44ef023dbbc21a056b6dab5be3b79ce4283d5c02d05" 1538 | dependencies = [ 1539 | "async-trait", 1540 | "chrono", 1541 | "dirs-next", 1542 | "futures", 1543 | "hyper 0.14.28", 1544 | "serde", 1545 | "serde_json", 1546 | "shlex", 1547 | "tokio", 1548 | "zeroize", 1549 | ] 1550 | 1551 | [[package]] 1552 | name = "rusoto_signature" 1553 | version = "0.48.0" 1554 | source = "registry+https://github.com/rust-lang/crates.io-index" 1555 | checksum = "a5ae95491c8b4847931e291b151127eccd6ff8ca13f33603eb3d0035ecb05272" 1556 | dependencies = [ 1557 | "base64 0.13.1", 1558 | "bytes", 1559 | "chrono", 1560 | "digest", 1561 | "futures", 1562 | "hex", 1563 | "hmac", 1564 | "http 0.2.12", 1565 | "hyper 0.14.28", 1566 | "log", 1567 | "md-5", 1568 | "percent-encoding", 1569 | "pin-project-lite", 1570 | "rusoto_credential", 1571 | "rustc_version", 1572 | "serde", 1573 | "sha2", 1574 | "tokio", 1575 | ] 1576 | 1577 | [[package]] 1578 | name = "rustc-demangle" 1579 | version = "0.1.23" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 1582 | 1583 | [[package]] 1584 | name = "rustc_version" 1585 | version = "0.4.0" 1586 | source = "registry+https://github.com/rust-lang/crates.io-index" 1587 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 1588 | dependencies = [ 1589 | "semver", 1590 | ] 1591 | 1592 | [[package]] 1593 | name = "rusticata-macros" 1594 | version = "1.1.0" 1595 | source = "registry+https://github.com/rust-lang/crates.io-index" 1596 | checksum = "fe8c976e50876cb3423699b190e799ff4c8a1a4f47dc33f4036dd056c077b7bb" 1597 | dependencies = [ 1598 | "nom", 1599 | ] 1600 | 1601 | [[package]] 1602 | name = "rustix" 1603 | version = "0.38.34" 1604 | source = "registry+https://github.com/rust-lang/crates.io-index" 1605 | checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" 1606 | dependencies = [ 1607 | "bitflags 2.5.0", 1608 | "errno", 1609 | "libc", 1610 | "linux-raw-sys", 1611 | "windows-sys 0.52.0", 1612 | ] 1613 | 1614 | [[package]] 1615 | name = "rustls-pemfile" 1616 | version = "2.1.2" 1617 | source = "registry+https://github.com/rust-lang/crates.io-index" 1618 | checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" 1619 | dependencies = [ 1620 | "base64 0.22.1", 1621 | "rustls-pki-types", 1622 | ] 1623 | 1624 | [[package]] 1625 | name = "rustls-pki-types" 1626 | version = "1.7.0" 1627 | source = "registry+https://github.com/rust-lang/crates.io-index" 1628 | checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" 1629 | 1630 | [[package]] 1631 | name = "ryu" 1632 | version = "1.0.17" 1633 | source = "registry+https://github.com/rust-lang/crates.io-index" 1634 | checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" 1635 | 1636 | [[package]] 1637 | name = "same-file" 1638 | version = "1.0.6" 1639 | source = "registry+https://github.com/rust-lang/crates.io-index" 1640 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1641 | dependencies = [ 1642 | "winapi-util", 1643 | ] 1644 | 1645 | [[package]] 1646 | name = "schannel" 1647 | version = "0.1.23" 1648 | source = "registry+https://github.com/rust-lang/crates.io-index" 1649 | checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" 1650 | dependencies = [ 1651 | "windows-sys 0.52.0", 1652 | ] 1653 | 1654 | [[package]] 1655 | name = "security-framework" 1656 | version = "2.10.0" 1657 | source = "registry+https://github.com/rust-lang/crates.io-index" 1658 | checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" 1659 | dependencies = [ 1660 | "bitflags 1.3.2", 1661 | "core-foundation", 1662 | "core-foundation-sys", 1663 | "libc", 1664 | "security-framework-sys", 1665 | ] 1666 | 1667 | [[package]] 1668 | name = "security-framework-sys" 1669 | version = "2.10.0" 1670 | source = "registry+https://github.com/rust-lang/crates.io-index" 1671 | checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" 1672 | dependencies = [ 1673 | "core-foundation-sys", 1674 | "libc", 1675 | ] 1676 | 1677 | [[package]] 1678 | name = "semver" 1679 | version = "1.0.23" 1680 | source = "registry+https://github.com/rust-lang/crates.io-index" 1681 | checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" 1682 | 1683 | [[package]] 1684 | name = "serde" 1685 | version = "1.0.200" 1686 | source = "registry+https://github.com/rust-lang/crates.io-index" 1687 | checksum = "ddc6f9cc94d67c0e21aaf7eda3a010fd3af78ebf6e096aa6e2e13c79749cce4f" 1688 | dependencies = [ 1689 | "serde_derive", 1690 | ] 1691 | 1692 | [[package]] 1693 | name = "serde_derive" 1694 | version = "1.0.200" 1695 | source = "registry+https://github.com/rust-lang/crates.io-index" 1696 | checksum = "856f046b9400cee3c8c94ed572ecdb752444c24528c035cd35882aad6f492bcb" 1697 | dependencies = [ 1698 | "proc-macro2", 1699 | "quote", 1700 | "syn 2.0.60", 1701 | ] 1702 | 1703 | [[package]] 1704 | name = "serde_json" 1705 | version = "1.0.116" 1706 | source = "registry+https://github.com/rust-lang/crates.io-index" 1707 | checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" 1708 | dependencies = [ 1709 | "itoa", 1710 | "ryu", 1711 | "serde", 1712 | ] 1713 | 1714 | [[package]] 1715 | name = "serde_spanned" 1716 | version = "0.6.5" 1717 | source = "registry+https://github.com/rust-lang/crates.io-index" 1718 | checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" 1719 | dependencies = [ 1720 | "serde", 1721 | ] 1722 | 1723 | [[package]] 1724 | name = "serde_urlencoded" 1725 | version = "0.7.1" 1726 | source = "registry+https://github.com/rust-lang/crates.io-index" 1727 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1728 | dependencies = [ 1729 | "form_urlencoded", 1730 | "itoa", 1731 | "ryu", 1732 | "serde", 1733 | ] 1734 | 1735 | [[package]] 1736 | name = "serde_variant" 1737 | version = "0.1.3" 1738 | source = "registry+https://github.com/rust-lang/crates.io-index" 1739 | checksum = "0a0068df419f9d9b6488fdded3f1c818522cdea328e02ce9d9f147380265a432" 1740 | dependencies = [ 1741 | "serde", 1742 | ] 1743 | 1744 | [[package]] 1745 | name = "serde_yaml" 1746 | version = "0.7.5" 1747 | source = "registry+https://github.com/rust-lang/crates.io-index" 1748 | checksum = "ef8099d3df28273c99a1728190c7a9f19d444c941044f64adf986bee7ec53051" 1749 | dependencies = [ 1750 | "dtoa", 1751 | "linked-hash-map", 1752 | "serde", 1753 | "yaml-rust", 1754 | ] 1755 | 1756 | [[package]] 1757 | name = "serde_yaml" 1758 | version = "0.9.34+deprecated" 1759 | source = "registry+https://github.com/rust-lang/crates.io-index" 1760 | checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" 1761 | dependencies = [ 1762 | "indexmap", 1763 | "itoa", 1764 | "ryu", 1765 | "serde", 1766 | "unsafe-libyaml", 1767 | ] 1768 | 1769 | [[package]] 1770 | name = "service_policy_kit" 1771 | version = "0.7.1" 1772 | source = "registry+https://github.com/rust-lang/crates.io-index" 1773 | checksum = "b6f7bd9733d153f25c41f695098cb51aa2a2717f824d72c8586477011acd6f04" 1774 | dependencies = [ 1775 | "anyhow", 1776 | "chrono", 1777 | "console 0.14.1", 1778 | "difference", 1779 | "fancy-regex", 1780 | "histogram", 1781 | "junit-report", 1782 | "log", 1783 | "maplit", 1784 | "native-tls", 1785 | "openapi", 1786 | "reqwest", 1787 | "rusoto_core", 1788 | "serde", 1789 | "serde_derive", 1790 | "serde_json", 1791 | "serde_yaml 0.9.34+deprecated", 1792 | "subprocess", 1793 | "x509-parser", 1794 | ] 1795 | 1796 | [[package]] 1797 | name = "sha2" 1798 | version = "0.9.9" 1799 | source = "registry+https://github.com/rust-lang/crates.io-index" 1800 | checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" 1801 | dependencies = [ 1802 | "block-buffer", 1803 | "cfg-if", 1804 | "cpufeatures", 1805 | "digest", 1806 | "opaque-debug", 1807 | ] 1808 | 1809 | [[package]] 1810 | name = "sharded-slab" 1811 | version = "0.1.7" 1812 | source = "registry+https://github.com/rust-lang/crates.io-index" 1813 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1814 | dependencies = [ 1815 | "lazy_static", 1816 | ] 1817 | 1818 | [[package]] 1819 | name = "shlex" 1820 | version = "1.3.0" 1821 | source = "registry+https://github.com/rust-lang/crates.io-index" 1822 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1823 | 1824 | [[package]] 1825 | name = "signal-hook-registry" 1826 | version = "1.4.2" 1827 | source = "registry+https://github.com/rust-lang/crates.io-index" 1828 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 1829 | dependencies = [ 1830 | "libc", 1831 | ] 1832 | 1833 | [[package]] 1834 | name = "similar" 1835 | version = "2.5.0" 1836 | source = "registry+https://github.com/rust-lang/crates.io-index" 1837 | checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640" 1838 | 1839 | [[package]] 1840 | name = "slab" 1841 | version = "0.4.9" 1842 | source = "registry+https://github.com/rust-lang/crates.io-index" 1843 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1844 | dependencies = [ 1845 | "autocfg", 1846 | ] 1847 | 1848 | [[package]] 1849 | name = "smallvec" 1850 | version = "1.13.2" 1851 | source = "registry+https://github.com/rust-lang/crates.io-index" 1852 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1853 | 1854 | [[package]] 1855 | name = "snapbox" 1856 | version = "0.5.9" 1857 | source = "registry+https://github.com/rust-lang/crates.io-index" 1858 | checksum = "8ac441e1ecf678f68423d47f376d53fabce1afba92c8f68e31508eb27df8562a" 1859 | dependencies = [ 1860 | "anstream", 1861 | "anstyle", 1862 | "content_inspector", 1863 | "dunce", 1864 | "filetime", 1865 | "libc", 1866 | "normalize-line-endings", 1867 | "os_pipe", 1868 | "similar", 1869 | "snapbox-macros", 1870 | "tempfile", 1871 | "wait-timeout", 1872 | "walkdir", 1873 | "windows-sys 0.52.0", 1874 | ] 1875 | 1876 | [[package]] 1877 | name = "snapbox-macros" 1878 | version = "0.3.8" 1879 | source = "registry+https://github.com/rust-lang/crates.io-index" 1880 | checksum = "e1c4b838b05d15ab22754068cb73500b2f3b07bf09d310e15b27f88160f1de40" 1881 | dependencies = [ 1882 | "anstream", 1883 | ] 1884 | 1885 | [[package]] 1886 | name = "socket2" 1887 | version = "0.5.7" 1888 | source = "registry+https://github.com/rust-lang/crates.io-index" 1889 | checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" 1890 | dependencies = [ 1891 | "libc", 1892 | "windows-sys 0.52.0", 1893 | ] 1894 | 1895 | [[package]] 1896 | name = "strip-ansi-escapes" 1897 | version = "0.1.1" 1898 | source = "registry+https://github.com/rust-lang/crates.io-index" 1899 | checksum = "011cbb39cf7c1f62871aea3cc46e5817b0937b49e9447370c93cacbe93a766d8" 1900 | dependencies = [ 1901 | "vte", 1902 | ] 1903 | 1904 | [[package]] 1905 | name = "strsim" 1906 | version = "0.11.1" 1907 | source = "registry+https://github.com/rust-lang/crates.io-index" 1908 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1909 | 1910 | [[package]] 1911 | name = "subprocess" 1912 | version = "0.2.9" 1913 | source = "registry+https://github.com/rust-lang/crates.io-index" 1914 | checksum = "0c2e86926081dda636c546d8c5e641661049d7562a68f5488be4a1f7f66f6086" 1915 | dependencies = [ 1916 | "libc", 1917 | "winapi", 1918 | ] 1919 | 1920 | [[package]] 1921 | name = "subtle" 1922 | version = "2.4.1" 1923 | source = "registry+https://github.com/rust-lang/crates.io-index" 1924 | checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" 1925 | 1926 | [[package]] 1927 | name = "syn" 1928 | version = "1.0.109" 1929 | source = "registry+https://github.com/rust-lang/crates.io-index" 1930 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1931 | dependencies = [ 1932 | "proc-macro2", 1933 | "quote", 1934 | "unicode-ident", 1935 | ] 1936 | 1937 | [[package]] 1938 | name = "syn" 1939 | version = "2.0.60" 1940 | source = "registry+https://github.com/rust-lang/crates.io-index" 1941 | checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" 1942 | dependencies = [ 1943 | "proc-macro2", 1944 | "quote", 1945 | "unicode-ident", 1946 | ] 1947 | 1948 | [[package]] 1949 | name = "sync_wrapper" 1950 | version = "0.1.2" 1951 | source = "registry+https://github.com/rust-lang/crates.io-index" 1952 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 1953 | 1954 | [[package]] 1955 | name = "system-configuration" 1956 | version = "0.5.1" 1957 | source = "registry+https://github.com/rust-lang/crates.io-index" 1958 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" 1959 | dependencies = [ 1960 | "bitflags 1.3.2", 1961 | "core-foundation", 1962 | "system-configuration-sys", 1963 | ] 1964 | 1965 | [[package]] 1966 | name = "system-configuration-sys" 1967 | version = "0.5.0" 1968 | source = "registry+https://github.com/rust-lang/crates.io-index" 1969 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" 1970 | dependencies = [ 1971 | "core-foundation-sys", 1972 | "libc", 1973 | ] 1974 | 1975 | [[package]] 1976 | name = "tempfile" 1977 | version = "3.10.1" 1978 | source = "registry+https://github.com/rust-lang/crates.io-index" 1979 | checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" 1980 | dependencies = [ 1981 | "cfg-if", 1982 | "fastrand", 1983 | "rustix", 1984 | "windows-sys 0.52.0", 1985 | ] 1986 | 1987 | [[package]] 1988 | name = "terminal_size" 1989 | version = "0.1.17" 1990 | source = "registry+https://github.com/rust-lang/crates.io-index" 1991 | checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" 1992 | dependencies = [ 1993 | "libc", 1994 | "winapi", 1995 | ] 1996 | 1997 | [[package]] 1998 | name = "thiserror" 1999 | version = "1.0.59" 2000 | source = "registry+https://github.com/rust-lang/crates.io-index" 2001 | checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" 2002 | dependencies = [ 2003 | "thiserror-impl", 2004 | ] 2005 | 2006 | [[package]] 2007 | name = "thiserror-impl" 2008 | version = "1.0.59" 2009 | source = "registry+https://github.com/rust-lang/crates.io-index" 2010 | checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" 2011 | dependencies = [ 2012 | "proc-macro2", 2013 | "quote", 2014 | "syn 2.0.60", 2015 | ] 2016 | 2017 | [[package]] 2018 | name = "thread_local" 2019 | version = "1.1.8" 2020 | source = "registry+https://github.com/rust-lang/crates.io-index" 2021 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 2022 | dependencies = [ 2023 | "cfg-if", 2024 | "once_cell", 2025 | ] 2026 | 2027 | [[package]] 2028 | name = "time" 2029 | version = "0.1.45" 2030 | source = "registry+https://github.com/rust-lang/crates.io-index" 2031 | checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" 2032 | dependencies = [ 2033 | "libc", 2034 | "wasi 0.10.0+wasi-snapshot-preview1", 2035 | "winapi", 2036 | ] 2037 | 2038 | [[package]] 2039 | name = "tinyvec" 2040 | version = "1.6.0" 2041 | source = "registry+https://github.com/rust-lang/crates.io-index" 2042 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2043 | dependencies = [ 2044 | "tinyvec_macros", 2045 | ] 2046 | 2047 | [[package]] 2048 | name = "tinyvec_macros" 2049 | version = "0.1.1" 2050 | source = "registry+https://github.com/rust-lang/crates.io-index" 2051 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2052 | 2053 | [[package]] 2054 | name = "tokio" 2055 | version = "1.37.0" 2056 | source = "registry+https://github.com/rust-lang/crates.io-index" 2057 | checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" 2058 | dependencies = [ 2059 | "backtrace", 2060 | "bytes", 2061 | "libc", 2062 | "mio", 2063 | "num_cpus", 2064 | "pin-project-lite", 2065 | "signal-hook-registry", 2066 | "socket2", 2067 | "tokio-macros", 2068 | "windows-sys 0.48.0", 2069 | ] 2070 | 2071 | [[package]] 2072 | name = "tokio-macros" 2073 | version = "2.2.0" 2074 | source = "registry+https://github.com/rust-lang/crates.io-index" 2075 | checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 2076 | dependencies = [ 2077 | "proc-macro2", 2078 | "quote", 2079 | "syn 2.0.60", 2080 | ] 2081 | 2082 | [[package]] 2083 | name = "tokio-native-tls" 2084 | version = "0.3.1" 2085 | source = "registry+https://github.com/rust-lang/crates.io-index" 2086 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 2087 | dependencies = [ 2088 | "native-tls", 2089 | "tokio", 2090 | ] 2091 | 2092 | [[package]] 2093 | name = "tokio-util" 2094 | version = "0.7.11" 2095 | source = "registry+https://github.com/rust-lang/crates.io-index" 2096 | checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" 2097 | dependencies = [ 2098 | "bytes", 2099 | "futures-core", 2100 | "futures-sink", 2101 | "pin-project-lite", 2102 | "tokio", 2103 | ] 2104 | 2105 | [[package]] 2106 | name = "toml_datetime" 2107 | version = "0.6.5" 2108 | source = "registry+https://github.com/rust-lang/crates.io-index" 2109 | checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" 2110 | dependencies = [ 2111 | "serde", 2112 | ] 2113 | 2114 | [[package]] 2115 | name = "toml_edit" 2116 | version = "0.22.12" 2117 | source = "registry+https://github.com/rust-lang/crates.io-index" 2118 | checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" 2119 | dependencies = [ 2120 | "indexmap", 2121 | "serde", 2122 | "serde_spanned", 2123 | "toml_datetime", 2124 | "winnow", 2125 | ] 2126 | 2127 | [[package]] 2128 | name = "tower" 2129 | version = "0.4.13" 2130 | source = "registry+https://github.com/rust-lang/crates.io-index" 2131 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 2132 | dependencies = [ 2133 | "futures-core", 2134 | "futures-util", 2135 | "pin-project", 2136 | "pin-project-lite", 2137 | "tokio", 2138 | "tower-layer", 2139 | "tower-service", 2140 | "tracing", 2141 | ] 2142 | 2143 | [[package]] 2144 | name = "tower-layer" 2145 | version = "0.3.2" 2146 | source = "registry+https://github.com/rust-lang/crates.io-index" 2147 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 2148 | 2149 | [[package]] 2150 | name = "tower-service" 2151 | version = "0.3.2" 2152 | source = "registry+https://github.com/rust-lang/crates.io-index" 2153 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2154 | 2155 | [[package]] 2156 | name = "tracing" 2157 | version = "0.1.40" 2158 | source = "registry+https://github.com/rust-lang/crates.io-index" 2159 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 2160 | dependencies = [ 2161 | "log", 2162 | "pin-project-lite", 2163 | "tracing-attributes", 2164 | "tracing-core", 2165 | ] 2166 | 2167 | [[package]] 2168 | name = "tracing-attributes" 2169 | version = "0.1.27" 2170 | source = "registry+https://github.com/rust-lang/crates.io-index" 2171 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 2172 | dependencies = [ 2173 | "proc-macro2", 2174 | "quote", 2175 | "syn 2.0.60", 2176 | ] 2177 | 2178 | [[package]] 2179 | name = "tracing-core" 2180 | version = "0.1.32" 2181 | source = "registry+https://github.com/rust-lang/crates.io-index" 2182 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 2183 | dependencies = [ 2184 | "once_cell", 2185 | "valuable", 2186 | ] 2187 | 2188 | [[package]] 2189 | name = "tracing-log" 2190 | version = "0.2.0" 2191 | source = "registry+https://github.com/rust-lang/crates.io-index" 2192 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 2193 | dependencies = [ 2194 | "log", 2195 | "once_cell", 2196 | "tracing-core", 2197 | ] 2198 | 2199 | [[package]] 2200 | name = "tracing-subscriber" 2201 | version = "0.3.18" 2202 | source = "registry+https://github.com/rust-lang/crates.io-index" 2203 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 2204 | dependencies = [ 2205 | "matchers", 2206 | "nu-ansi-term", 2207 | "once_cell", 2208 | "regex", 2209 | "sharded-slab", 2210 | "smallvec", 2211 | "thread_local", 2212 | "tracing", 2213 | "tracing-core", 2214 | "tracing-log", 2215 | ] 2216 | 2217 | [[package]] 2218 | name = "try-lock" 2219 | version = "0.2.5" 2220 | source = "registry+https://github.com/rust-lang/crates.io-index" 2221 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2222 | 2223 | [[package]] 2224 | name = "trycmd" 2225 | version = "0.15.1" 2226 | source = "registry+https://github.com/rust-lang/crates.io-index" 2227 | checksum = "d14c6930faf7c6c4942ce17daa6f38d659d2ebf2b579a56b6926707038eb37b0" 2228 | dependencies = [ 2229 | "glob", 2230 | "humantime", 2231 | "humantime-serde", 2232 | "rayon", 2233 | "serde", 2234 | "shlex", 2235 | "snapbox", 2236 | "toml_edit", 2237 | ] 2238 | 2239 | [[package]] 2240 | name = "typenum" 2241 | version = "1.17.0" 2242 | source = "registry+https://github.com/rust-lang/crates.io-index" 2243 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2244 | 2245 | [[package]] 2246 | name = "unicode-bidi" 2247 | version = "0.3.15" 2248 | source = "registry+https://github.com/rust-lang/crates.io-index" 2249 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 2250 | 2251 | [[package]] 2252 | name = "unicode-ident" 2253 | version = "1.0.12" 2254 | source = "registry+https://github.com/rust-lang/crates.io-index" 2255 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 2256 | 2257 | [[package]] 2258 | name = "unicode-normalization" 2259 | version = "0.1.23" 2260 | source = "registry+https://github.com/rust-lang/crates.io-index" 2261 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 2262 | dependencies = [ 2263 | "tinyvec", 2264 | ] 2265 | 2266 | [[package]] 2267 | name = "unicode-width" 2268 | version = "0.1.12" 2269 | source = "registry+https://github.com/rust-lang/crates.io-index" 2270 | checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" 2271 | 2272 | [[package]] 2273 | name = "unsafe-libyaml" 2274 | version = "0.2.11" 2275 | source = "registry+https://github.com/rust-lang/crates.io-index" 2276 | checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" 2277 | 2278 | [[package]] 2279 | name = "url" 2280 | version = "2.5.0" 2281 | source = "registry+https://github.com/rust-lang/crates.io-index" 2282 | checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 2283 | dependencies = [ 2284 | "form_urlencoded", 2285 | "idna", 2286 | "percent-encoding", 2287 | ] 2288 | 2289 | [[package]] 2290 | name = "utf8parse" 2291 | version = "0.2.1" 2292 | source = "registry+https://github.com/rust-lang/crates.io-index" 2293 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 2294 | 2295 | [[package]] 2296 | name = "valuable" 2297 | version = "0.1.0" 2298 | source = "registry+https://github.com/rust-lang/crates.io-index" 2299 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 2300 | 2301 | [[package]] 2302 | name = "vcpkg" 2303 | version = "0.2.15" 2304 | source = "registry+https://github.com/rust-lang/crates.io-index" 2305 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2306 | 2307 | [[package]] 2308 | name = "version_check" 2309 | version = "0.1.5" 2310 | source = "registry+https://github.com/rust-lang/crates.io-index" 2311 | checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" 2312 | 2313 | [[package]] 2314 | name = "version_check" 2315 | version = "0.9.4" 2316 | source = "registry+https://github.com/rust-lang/crates.io-index" 2317 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2318 | 2319 | [[package]] 2320 | name = "vte" 2321 | version = "0.10.1" 2322 | source = "registry+https://github.com/rust-lang/crates.io-index" 2323 | checksum = "6cbce692ab4ca2f1f3047fcf732430249c0e971bfdd2b234cf2c47ad93af5983" 2324 | dependencies = [ 2325 | "arrayvec", 2326 | "utf8parse", 2327 | "vte_generate_state_changes", 2328 | ] 2329 | 2330 | [[package]] 2331 | name = "vte_generate_state_changes" 2332 | version = "0.1.1" 2333 | source = "registry+https://github.com/rust-lang/crates.io-index" 2334 | checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff" 2335 | dependencies = [ 2336 | "proc-macro2", 2337 | "quote", 2338 | ] 2339 | 2340 | [[package]] 2341 | name = "wait-timeout" 2342 | version = "0.2.0" 2343 | source = "registry+https://github.com/rust-lang/crates.io-index" 2344 | checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" 2345 | dependencies = [ 2346 | "libc", 2347 | ] 2348 | 2349 | [[package]] 2350 | name = "walkdir" 2351 | version = "2.5.0" 2352 | source = "registry+https://github.com/rust-lang/crates.io-index" 2353 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 2354 | dependencies = [ 2355 | "same-file", 2356 | "winapi-util", 2357 | ] 2358 | 2359 | [[package]] 2360 | name = "want" 2361 | version = "0.3.1" 2362 | source = "registry+https://github.com/rust-lang/crates.io-index" 2363 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2364 | dependencies = [ 2365 | "try-lock", 2366 | ] 2367 | 2368 | [[package]] 2369 | name = "wasi" 2370 | version = "0.10.0+wasi-snapshot-preview1" 2371 | source = "registry+https://github.com/rust-lang/crates.io-index" 2372 | checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" 2373 | 2374 | [[package]] 2375 | name = "wasi" 2376 | version = "0.11.0+wasi-snapshot-preview1" 2377 | source = "registry+https://github.com/rust-lang/crates.io-index" 2378 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2379 | 2380 | [[package]] 2381 | name = "wasm-bindgen" 2382 | version = "0.2.92" 2383 | source = "registry+https://github.com/rust-lang/crates.io-index" 2384 | checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 2385 | dependencies = [ 2386 | "cfg-if", 2387 | "wasm-bindgen-macro", 2388 | ] 2389 | 2390 | [[package]] 2391 | name = "wasm-bindgen-backend" 2392 | version = "0.2.92" 2393 | source = "registry+https://github.com/rust-lang/crates.io-index" 2394 | checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 2395 | dependencies = [ 2396 | "bumpalo", 2397 | "log", 2398 | "once_cell", 2399 | "proc-macro2", 2400 | "quote", 2401 | "syn 2.0.60", 2402 | "wasm-bindgen-shared", 2403 | ] 2404 | 2405 | [[package]] 2406 | name = "wasm-bindgen-futures" 2407 | version = "0.4.42" 2408 | source = "registry+https://github.com/rust-lang/crates.io-index" 2409 | checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" 2410 | dependencies = [ 2411 | "cfg-if", 2412 | "js-sys", 2413 | "wasm-bindgen", 2414 | "web-sys", 2415 | ] 2416 | 2417 | [[package]] 2418 | name = "wasm-bindgen-macro" 2419 | version = "0.2.92" 2420 | source = "registry+https://github.com/rust-lang/crates.io-index" 2421 | checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 2422 | dependencies = [ 2423 | "quote", 2424 | "wasm-bindgen-macro-support", 2425 | ] 2426 | 2427 | [[package]] 2428 | name = "wasm-bindgen-macro-support" 2429 | version = "0.2.92" 2430 | source = "registry+https://github.com/rust-lang/crates.io-index" 2431 | checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 2432 | dependencies = [ 2433 | "proc-macro2", 2434 | "quote", 2435 | "syn 2.0.60", 2436 | "wasm-bindgen-backend", 2437 | "wasm-bindgen-shared", 2438 | ] 2439 | 2440 | [[package]] 2441 | name = "wasm-bindgen-shared" 2442 | version = "0.2.92" 2443 | source = "registry+https://github.com/rust-lang/crates.io-index" 2444 | checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 2445 | 2446 | [[package]] 2447 | name = "web-sys" 2448 | version = "0.3.69" 2449 | source = "registry+https://github.com/rust-lang/crates.io-index" 2450 | checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" 2451 | dependencies = [ 2452 | "js-sys", 2453 | "wasm-bindgen", 2454 | ] 2455 | 2456 | [[package]] 2457 | name = "winapi" 2458 | version = "0.3.9" 2459 | source = "registry+https://github.com/rust-lang/crates.io-index" 2460 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2461 | dependencies = [ 2462 | "winapi-i686-pc-windows-gnu", 2463 | "winapi-x86_64-pc-windows-gnu", 2464 | ] 2465 | 2466 | [[package]] 2467 | name = "winapi-i686-pc-windows-gnu" 2468 | version = "0.4.0" 2469 | source = "registry+https://github.com/rust-lang/crates.io-index" 2470 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2471 | 2472 | [[package]] 2473 | name = "winapi-util" 2474 | version = "0.1.8" 2475 | source = "registry+https://github.com/rust-lang/crates.io-index" 2476 | checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" 2477 | dependencies = [ 2478 | "windows-sys 0.52.0", 2479 | ] 2480 | 2481 | [[package]] 2482 | name = "winapi-x86_64-pc-windows-gnu" 2483 | version = "0.4.0" 2484 | source = "registry+https://github.com/rust-lang/crates.io-index" 2485 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2486 | 2487 | [[package]] 2488 | name = "windows-core" 2489 | version = "0.52.0" 2490 | source = "registry+https://github.com/rust-lang/crates.io-index" 2491 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2492 | dependencies = [ 2493 | "windows-targets 0.52.5", 2494 | ] 2495 | 2496 | [[package]] 2497 | name = "windows-sys" 2498 | version = "0.48.0" 2499 | source = "registry+https://github.com/rust-lang/crates.io-index" 2500 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2501 | dependencies = [ 2502 | "windows-targets 0.48.5", 2503 | ] 2504 | 2505 | [[package]] 2506 | name = "windows-sys" 2507 | version = "0.52.0" 2508 | source = "registry+https://github.com/rust-lang/crates.io-index" 2509 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2510 | dependencies = [ 2511 | "windows-targets 0.52.5", 2512 | ] 2513 | 2514 | [[package]] 2515 | name = "windows-targets" 2516 | version = "0.48.5" 2517 | source = "registry+https://github.com/rust-lang/crates.io-index" 2518 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2519 | dependencies = [ 2520 | "windows_aarch64_gnullvm 0.48.5", 2521 | "windows_aarch64_msvc 0.48.5", 2522 | "windows_i686_gnu 0.48.5", 2523 | "windows_i686_msvc 0.48.5", 2524 | "windows_x86_64_gnu 0.48.5", 2525 | "windows_x86_64_gnullvm 0.48.5", 2526 | "windows_x86_64_msvc 0.48.5", 2527 | ] 2528 | 2529 | [[package]] 2530 | name = "windows-targets" 2531 | version = "0.52.5" 2532 | source = "registry+https://github.com/rust-lang/crates.io-index" 2533 | checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" 2534 | dependencies = [ 2535 | "windows_aarch64_gnullvm 0.52.5", 2536 | "windows_aarch64_msvc 0.52.5", 2537 | "windows_i686_gnu 0.52.5", 2538 | "windows_i686_gnullvm", 2539 | "windows_i686_msvc 0.52.5", 2540 | "windows_x86_64_gnu 0.52.5", 2541 | "windows_x86_64_gnullvm 0.52.5", 2542 | "windows_x86_64_msvc 0.52.5", 2543 | ] 2544 | 2545 | [[package]] 2546 | name = "windows_aarch64_gnullvm" 2547 | version = "0.48.5" 2548 | source = "registry+https://github.com/rust-lang/crates.io-index" 2549 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2550 | 2551 | [[package]] 2552 | name = "windows_aarch64_gnullvm" 2553 | version = "0.52.5" 2554 | source = "registry+https://github.com/rust-lang/crates.io-index" 2555 | checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" 2556 | 2557 | [[package]] 2558 | name = "windows_aarch64_msvc" 2559 | version = "0.48.5" 2560 | source = "registry+https://github.com/rust-lang/crates.io-index" 2561 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2562 | 2563 | [[package]] 2564 | name = "windows_aarch64_msvc" 2565 | version = "0.52.5" 2566 | source = "registry+https://github.com/rust-lang/crates.io-index" 2567 | checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" 2568 | 2569 | [[package]] 2570 | name = "windows_i686_gnu" 2571 | version = "0.48.5" 2572 | source = "registry+https://github.com/rust-lang/crates.io-index" 2573 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2574 | 2575 | [[package]] 2576 | name = "windows_i686_gnu" 2577 | version = "0.52.5" 2578 | source = "registry+https://github.com/rust-lang/crates.io-index" 2579 | checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" 2580 | 2581 | [[package]] 2582 | name = "windows_i686_gnullvm" 2583 | version = "0.52.5" 2584 | source = "registry+https://github.com/rust-lang/crates.io-index" 2585 | checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" 2586 | 2587 | [[package]] 2588 | name = "windows_i686_msvc" 2589 | version = "0.48.5" 2590 | source = "registry+https://github.com/rust-lang/crates.io-index" 2591 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2592 | 2593 | [[package]] 2594 | name = "windows_i686_msvc" 2595 | version = "0.52.5" 2596 | source = "registry+https://github.com/rust-lang/crates.io-index" 2597 | checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" 2598 | 2599 | [[package]] 2600 | name = "windows_x86_64_gnu" 2601 | version = "0.48.5" 2602 | source = "registry+https://github.com/rust-lang/crates.io-index" 2603 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2604 | 2605 | [[package]] 2606 | name = "windows_x86_64_gnu" 2607 | version = "0.52.5" 2608 | source = "registry+https://github.com/rust-lang/crates.io-index" 2609 | checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" 2610 | 2611 | [[package]] 2612 | name = "windows_x86_64_gnullvm" 2613 | version = "0.48.5" 2614 | source = "registry+https://github.com/rust-lang/crates.io-index" 2615 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2616 | 2617 | [[package]] 2618 | name = "windows_x86_64_gnullvm" 2619 | version = "0.52.5" 2620 | source = "registry+https://github.com/rust-lang/crates.io-index" 2621 | checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" 2622 | 2623 | [[package]] 2624 | name = "windows_x86_64_msvc" 2625 | version = "0.48.5" 2626 | source = "registry+https://github.com/rust-lang/crates.io-index" 2627 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2628 | 2629 | [[package]] 2630 | name = "windows_x86_64_msvc" 2631 | version = "0.52.5" 2632 | source = "registry+https://github.com/rust-lang/crates.io-index" 2633 | checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" 2634 | 2635 | [[package]] 2636 | name = "winnow" 2637 | version = "0.6.8" 2638 | source = "registry+https://github.com/rust-lang/crates.io-index" 2639 | checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d" 2640 | dependencies = [ 2641 | "memchr", 2642 | ] 2643 | 2644 | [[package]] 2645 | name = "winreg" 2646 | version = "0.52.0" 2647 | source = "registry+https://github.com/rust-lang/crates.io-index" 2648 | checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" 2649 | dependencies = [ 2650 | "cfg-if", 2651 | "windows-sys 0.48.0", 2652 | ] 2653 | 2654 | [[package]] 2655 | name = "x509-parser" 2656 | version = "0.4.3" 2657 | source = "registry+https://github.com/rust-lang/crates.io-index" 2658 | checksum = "0d567e225454110502c91d95cbc6d65828d4ab60d813a23b4a03ebb799a85c45" 2659 | dependencies = [ 2660 | "base64 0.10.1", 2661 | "der-parser", 2662 | "nom", 2663 | "num-bigint", 2664 | "rusticata-macros", 2665 | "time", 2666 | ] 2667 | 2668 | [[package]] 2669 | name = "xml-rs" 2670 | version = "0.8.20" 2671 | source = "registry+https://github.com/rust-lang/crates.io-index" 2672 | checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" 2673 | 2674 | [[package]] 2675 | name = "yaml-rust" 2676 | version = "0.4.5" 2677 | source = "registry+https://github.com/rust-lang/crates.io-index" 2678 | checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" 2679 | dependencies = [ 2680 | "linked-hash-map", 2681 | ] 2682 | 2683 | [[package]] 2684 | name = "zeroize" 2685 | version = "1.7.0" 2686 | source = "registry+https://github.com/rust-lang/crates.io-index" 2687 | checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" 2688 | --------------------------------------------------------------------------------