├── 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 | / __/ /_/ (__ ) /__/ /_/ / /_/ / __/
13 | /_/|_|\___/\__, /____/\___/\____/ .___/\___/
14 | (____/ /_/";
15 |
16 | fn main() {
17 | let args = cli::Cli::parse();
18 |
19 | tracing(args.verbose);
20 |
21 | if args.no_banner {
22 | let v = format!(
23 | "{} ({})",
24 | env!("CARGO_PKG_VERSION"),
25 | option_env!("BUILD_SHA")
26 | .or(option_env!("GITHUB_SHA"))
27 | .unwrap_or("dev")
28 | );
29 | println!(
30 | "{}\n {}",
31 | style(BANNER).magenta(),
32 | style(v).dim()
33 | );
34 | }
35 |
36 | match cli::run(args) {
37 | Ok(cmd) => 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 |
206 |
207 | **tester** Tester: valid key
208 |
209 |
210 |
211 |
212 | validation
213 |
214 |
215 |
216 |
217 | `tester_1` - hookbin ID (https://hookb.in) `tester_2` - fake key to put as a query param
218 |
219 |
220 |
221 |
222 |
223 |
224 | ```
225 | keyscope validate tester -p TESTER_1 -p TESTER_2
226 | ```
227 |
228 |
229 |
230 |
231 | **infura** infura API key
232 |
233 |
234 |
235 |
236 | validation
237 |
238 |
239 |
240 |
241 | `infura_1` - infura API key
242 |
243 |
244 |
245 |
246 |
247 |
248 | ```
249 | keyscope validate infura -p INFURA_1
250 | ```
251 |
252 |
253 |
254 |
255 | **covalenthq** Covalent: valid key
256 |
257 |
258 |
259 |
260 | validation
261 |
262 |
263 |
264 |
265 | `covalenthq_1` - covalent token
266 |
267 |
268 |
269 |
270 |
271 |
272 | ```
273 | keyscope validate covalenthq -p COVALENTHQ_1
274 | ```
275 |
276 |
277 |
278 |
279 | **asana** Asana: valid token
280 |
281 |
282 |
283 |
284 | validation
285 |
286 |
287 |
288 |
289 | `asana_1` - asana token
290 |
291 |
292 |
293 |
294 |
295 |
296 | ```
297 | keyscope validate asana -p ASANA_1
298 | ```
299 |
300 |
301 |
302 |
303 | **bitly** Bit.ly: valid access token
304 |
305 |
306 |
307 |
308 | validation
309 |
310 |
311 |
312 |
313 | `bitly_1` - bit.ly token
314 |
315 |
316 |
317 |
318 |
319 |
320 | ```
321 | keyscope validate bitly -p BITLY_1
322 | ```
323 |
324 |
325 |
326 |
327 | **ipstack** ipstack access key
328 |
329 |
330 |
331 |
332 | validation
333 |
334 |
335 |
336 |
337 | `ipstack_1` - ipstack access key
338 |
339 |
340 |
341 |
342 |
343 |
344 | ```
345 | keyscope validate ipstack -p IPSTACK_1
346 | ```
347 |
348 |
349 |
350 |
351 | **localytics** Localytics: valid API credentials
352 |
353 |
354 |
355 |
356 | validation
357 |
358 |
359 |
360 |
361 | `localytics_1` - localytics user `localytics_2` - localytics key
362 |
363 |
364 |
365 |
366 |
367 |
368 | ```
369 | keyscope validate localytics -p LOCALYTICS_1 -p LOCALYTICS_2
370 | ```
371 |
372 |
373 |
374 |
375 | **algolia** Algolia: valid API credentials
376 |
377 |
378 |
379 |
380 | validation
381 |
382 |
383 |
384 |
385 | `algolia_1` - algolia application ID `algolia_2` - algolia index `algolia_3` - algolia API key
386 |
387 |
388 |
389 |
390 |
391 |
392 | ```
393 | keyscope validate algolia -p ALGOLIA_1 -p ALGOLIA_2 -p ALGOLIA_3
394 | ```
395 |
396 |
397 |
398 |
399 | **branchio** branch.io: valid API credentials
400 |
401 |
402 |
403 |
404 | validation
405 |
406 |
407 |
408 |
409 | `branchio_1` - branch.io key `branchio_2` - branch.io secret
410 |
411 |
412 |
413 |
414 |
415 |
416 | ```
417 | keyscope validate branchio -p BRANCHIO_1 -p BRANCHIO_2
418 | ```
419 |
420 |
421 |
422 |
423 | **browserstack** browserstack: valid API credentials
424 |
425 |
426 |
427 |
428 | validation
429 |
430 |
431 |
432 |
433 | `browserstack_1` - browserstack key `browserstack_2` - browserstack secret
434 |
435 |
436 |
437 |
438 |
439 |
440 | ```
441 | keyscope validate browserstack -p BROWSERSTACK_1 -p BROWSERSTACK_2
442 | ```
443 |
444 |
445 |
446 |
447 | **buildkite** Buildkite: valid token
448 |
449 |
450 |
451 |
452 | validation
453 |
454 |
455 |
456 |
457 | `buildkite_1` - buildkite token
458 |
459 |
460 |
461 |
462 |
463 |
464 | ```
465 | keyscope validate buildkite -p BUILDKITE_1
466 | ```
467 |
468 |
469 |
470 |
471 | **datadog** datadog: valid API credentials
472 |
473 |
474 |
475 |
476 | validation
477 |
478 |
479 |
480 |
481 | `datadog_1` - datadog API key
482 |
483 |
484 |
485 |
486 |
487 |
488 | ```
489 | keyscope validate datadog -p DATADOG_1
490 | ```
491 |
492 |
493 |
494 |
495 | **github** github: valid API credentials
496 |
497 |
498 |
499 |
500 | validation
501 |
502 |
503 |
504 |
505 | `github_1` - github token
506 |
507 |
508 |
509 |
510 |
511 |
512 | ```
513 | keyscope validate github -p GITHUB_1
514 | ```
515 |
516 |
517 |
518 |
519 | **github-ent** Github Enterprise: valid API token
520 |
521 |
522 |
523 |
524 | validation
525 |
526 |
527 |
528 |
529 | `github-ent_1` - github enterprise instance (without http) `github-ent_2` - github token
530 |
531 |
532 |
533 |
534 |
535 |
536 | ```
537 | keyscope validate github-ent -p GITHUB-ENT_1 -p GITHUB-ENT_2
538 | ```
539 |
540 |
541 |
542 |
543 | **dropbox** dropbox: valid API credentials
544 |
545 |
546 |
547 |
548 | validation
549 |
550 |
551 |
552 |
553 | `dropbox_1` - dropbox token
554 |
555 |
556 |
557 |
558 |
559 |
560 | ```
561 | keyscope validate dropbox -p DROPBOX_1
562 | ```
563 |
564 |
565 |
566 |
567 | **gitlab** gitlab: valid API credentials
568 |
569 |
570 |
571 |
572 | validation
573 |
574 |
575 |
576 |
577 | `gitlab_1` - gitlab token
578 |
579 |
580 |
581 |
582 |
583 |
584 | ```
585 | keyscope validate gitlab -p GITLAB_1
586 | ```
587 |
588 |
589 |
590 |
591 | **heroku** heroku: valid API credentials
592 |
593 |
594 |
595 |
596 | validation
597 |
598 |
599 |
600 |
601 | `heroku_1` - heroku token
602 |
603 |
604 |
605 |
606 |
607 |
608 | ```
609 | keyscope validate heroku -p HEROKU_1
610 | ```
611 |
612 |
613 |
614 |
615 | **mailchimp** mailchimp: valid API credentials
616 |
617 |
618 |
619 |
620 | validation
621 |
622 |
623 |
624 |
625 | `mailchimp_1` - mailchimp datacenter ID `mailchimp_2` - mailchimp key
626 |
627 |
628 |
629 |
630 |
631 |
632 | ```
633 | keyscope validate mailchimp -p MAILCHIMP_1 -p MAILCHIMP_2
634 | ```
635 |
636 |
637 |
638 |
639 | **mailgun** mailgun: valid API credentials
640 |
641 |
642 |
643 |
644 | validation
645 |
646 |
647 |
648 |
649 | `mailgun_1` - mailgun key
650 |
651 |
652 |
653 |
654 |
655 |
656 | ```
657 | keyscope validate mailgun -p MAILGUN_1
658 | ```
659 |
660 |
661 |
662 |
663 | **pagerduty** pagerduty: valid API credentials
664 |
665 |
666 |
667 |
668 | validation
669 |
670 |
671 |
672 |
673 | `pagerduty_1` - pagerduty token
674 |
675 |
676 |
677 |
678 |
679 |
680 | ```
681 | keyscope validate pagerduty -p PAGERDUTY_1
682 | ```
683 |
684 |
685 |
686 |
687 | **circleci** circleci: valid API credentials
688 |
689 |
690 |
691 |
692 | validation
693 |
694 |
695 |
696 |
697 | `circleci_1` - circleci key
698 |
699 |
700 |
701 |
702 |
703 |
704 | ```
705 | keyscope validate circleci -p CIRCLECI_1
706 | ```
707 |
708 |
709 |
710 |
711 | **facebook-access-token** facebook: valid API token
712 |
713 |
714 |
715 |
716 | validation
717 |
718 |
719 |
720 |
721 | `facebook-access-token_1` - facebook token
722 |
723 |
724 |
725 |
726 |
727 |
728 | ```
729 | keyscope validate facebook-access-token -p FACEBOOK-ACCESS-TOKEN_1
730 | ```
731 |
732 |
733 |
734 |
735 | **salesforce** salesforce: valid API credentials
736 |
737 |
738 |
739 |
740 | validation
741 |
742 |
743 |
744 |
745 | `salesforce_1` - salesforce instance name `salesforce_2` - salesforce token
746 |
747 |
748 |
749 |
750 |
751 |
752 | ```
753 | keyscope validate salesforce -p SALESFORCE_1 -p SALESFORCE_2
754 | ```
755 |
756 |
757 |
758 |
759 | **jumpcloud** jumpcloud: valid API credentials
760 |
761 |
762 |
763 |
764 | validation
765 |
766 |
767 |
768 |
769 | `jumpcloud_1` - jumpcloud key
770 |
771 |
772 |
773 |
774 |
775 |
776 | ```
777 | keyscope validate jumpcloud -p JUMPCLOUD_1
778 | ```
779 |
780 |
781 |
782 |
783 | **saucelabs-us** saucelabs-us: valid API credentials
784 |
785 |
786 |
787 |
788 | validation
789 |
790 |
791 |
792 |
793 | `saucelabs-us_1` - saucelabs user `saucelabs-us_2` - saucelabs key
794 |
795 |
796 |
797 |
798 |
799 |
800 | ```
801 | keyscope validate saucelabs-us -p SAUCELABS-US_1 -p SAUCELABS-US_2
802 | ```
803 |
804 |
805 |
806 |
807 | **saucelabs-eu** saucelabs-eu: valid API credentials
808 |
809 |
810 |
811 |
812 | validation
813 |
814 |
815 |
816 |
817 | `saucelabs-eu_1` - saucelabs user `saucelabs-eu_2` - saucelabs key
818 |
819 |
820 |
821 |
822 |
823 |
824 | ```
825 | keyscope validate saucelabs-eu -p SAUCELABS-EU_1 -p SAUCELABS-EU_2
826 | ```
827 |
828 |
829 |
830 |
831 | **sendgrid** sendgrid: valid API credentials
832 |
833 |
834 |
835 |
836 | validation
837 |
838 |
839 |
840 |
841 | `sendgrid_1` - sendgrid key
842 |
843 |
844 |
845 |
846 |
847 |
848 | ```
849 | keyscope validate sendgrid -p SENDGRID_1
850 | ```
851 |
852 |
853 |
854 |
855 | **slack** slack: valid API credentials
856 |
857 |
858 |
859 |
860 | validation
861 |
862 |
863 |
864 |
865 | `slack_1` - slack key
866 |
867 |
868 |
869 |
870 |
871 |
872 | ```
873 | keyscope validate slack -p SLACK_1
874 | ```
875 |
876 |
877 |
878 |
879 | **slack-webhook** slack-webook: valid API credentials
880 |
881 |
882 |
883 |
884 | validation
885 |
886 |
887 |
888 |
889 | `slack-webhook_1` - slack webhook
890 |
891 |
892 |
893 |
894 |
895 |
896 | ```
897 | keyscope validate slack-webhook -p SLACK-WEBHOOK_1
898 | ```
899 |
900 |
901 |
902 |
903 | **stripe** stripe: valid API credentials
904 |
905 |
906 |
907 |
908 | validation
909 |
910 |
911 |
912 |
913 | `stripe_1` - stripe key
914 |
915 |
916 |
917 |
918 |
919 |
920 | ```
921 | keyscope validate stripe -p STRIPE_1
922 | ```
923 |
924 |
925 |
926 |
927 | **travisci** travisci: valid API credentials
928 |
929 |
930 |
931 |
932 | validation
933 |
934 |
935 |
936 |
937 | `travisci_1` - travisci domain, choose 'org' or 'com' `travisci_2` - travisci key
938 |
939 |
940 |
941 |
942 |
943 |
944 | ```
945 | keyscope validate travisci -p TRAVISCI_1 -p TRAVISCI_2
946 | ```
947 |
948 |
949 |
950 |
951 | **twilio** twilio: valid API credentials
952 |
953 |
954 |
955 |
956 | validation
957 |
958 |
959 |
960 |
961 | `twilio_1` - twilio account sid `twilio_2` - twilio token
962 |
963 |
964 |
965 |
966 |
967 |
968 | ```
969 | keyscope validate twilio -p TWILIO_1 -p TWILIO_2
970 | ```
971 |
972 |
973 |
974 |
975 | **twitter** twitter: valid API credentials
976 |
977 |
978 |
979 |
980 | validation
981 |
982 |
983 |
984 |
985 | `twitter_1` - twitter API token
986 |
987 |
988 |
989 |
990 |
991 |
992 | ```
993 | keyscope validate twitter -p TWITTER_1
994 | ```
995 |
996 |
997 |
998 |
999 | **zendesk** zendesk: valid API credentials
1000 |
1001 |
1002 |
1003 |
1004 | validation
1005 |
1006 |
1007 |
1008 |
1009 | `zendesk_1` - zendesk domain `zendesk_2` - zendesk key
1010 |
1011 |
1012 |
1013 |
1014 |
1015 |
1016 | ```
1017 | keyscope validate zendesk -p ZENDESK_1 -p ZENDESK_2
1018 | ```
1019 |
1020 |
1021 |
1022 |
1023 | **firebase** firebase: valid API credentials
1024 |
1025 |
1026 |
1027 |
1028 | validation
1029 |
1030 |
1031 |
1032 |
1033 | `firebase_1` - firebase API key `firebase_2` - firebase ID token
1034 |
1035 |
1036 |
1037 |
1038 |
1039 |
1040 | ```
1041 | keyscope validate firebase -p FIREBASE_1 -p FIREBASE_2
1042 | ```
1043 |
1044 |
1045 |
1046 |
1047 | **aws** aws: valid API credentials
1048 |
1049 |
1050 |
1051 |
1052 | validation
1053 |
1054 |
1055 |
1056 |
1057 | `aws_1` - AWS ID `aws_2` - AWS secret
1058 |
1059 |
1060 |
1061 |
1062 |
1063 |
1064 | ```
1065 | keyscope validate aws -p AWS_1 -p AWS_2
1066 | ```
1067 |
1068 |
1069 |
1070 |
1071 | **elastic-apm-secret** Elastic APM: secret key validation
1072 |
1073 |
1074 |
1075 |
1076 | validation
1077 |
1078 |
1079 |
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 |
1084 |
1085 |
1086 |
1087 |
1088 | ```
1089 | keyscope validate elastic-apm-secret -p ELASTIC-APM-SECRET_1 -p ELASTIC-APM-SECRET_2
1090 | ```
1091 |
1092 |
1093 |
1094 |
1095 | **artifactory** Artifactory: token validation
1096 |
1097 |
1098 |
1099 |
1100 | validation
1101 |
1102 |
1103 |
1104 |
1105 | `artifactory_1` - Artifactory host (including http(s) part) `artifactory_2` - Artifactory token
1106 |
1107 |
1108 |
1109 |
1110 |
1111 |
1112 | ```
1113 | keyscope validate artifactory -p ARTIFACTORY_1 -p ARTIFACTORY_2
1114 | ```
1115 |
1116 |
1117 |
1118 |
1119 | **ibm-cos** IBM: cloud object storage key validation (HMAC)
1120 |
1121 |
1122 |
1123 |
1124 | validation
1125 |
1126 |
1127 |
1128 |
1129 | `ibm-cos_1` - IBM HMAC ID `ibm-cos_2` - IBM HMAC secret
1130 |
1131 |
1132 |
1133 |
1134 |
1135 |
1136 | ```
1137 | keyscope validate ibm-cos -p IBM-COS_1 -p IBM-COS_2
1138 | ```
1139 |
1140 |
1141 |
1142 |
1143 | **ibm-iam** IBM: cloud key validation (IAM)
1144 |
1145 |
1146 |
1147 |
1148 | validation
1149 |
1150 |
1151 |
1152 |
1153 | `ibm-iam_1` - IBM cloud key
1154 |
1155 |
1156 |
1157 |
1158 |
1159 |
1160 | ```
1161 | keyscope validate ibm-iam -p IBM-IAM_1
1162 | ```
1163 |
1164 |
1165 |
1166 |
1167 | **ibm-cloudant** IBM: cloudant key validation (legacy)
1168 |
1169 |
1170 |
1171 |
1172 | validation
1173 |
1174 |
1175 |
1176 |
1177 | `ibm-cloudant_1` - IBM cloudant hostname `ibm-cloudant_2` - IBM cloudant user `ibm-cloudant_3` - IBM cloudant key
1178 |
1179 |
1180 |
1181 |
1182 |
1183 |
1184 | ```
1185 | keyscope validate ibm-cloudant -p IBM-CLOUDANT_1 -p IBM-CLOUDANT_2 -p IBM-CLOUDANT_3
1186 | ```
1187 |
1188 |
1189 |
1190 |
1191 | **softlayer** Softlayer: validate credentials
1192 |
1193 |
1194 |
1195 |
1196 | validation
1197 |
1198 |
1199 |
1200 |
1201 | `softlayer_1` - Softlayer hostname `softlayer_2` - Softlayer token
1202 |
1203 |
1204 |
1205 |
1206 |
1207 |
1208 | ```
1209 | keyscope validate softlayer -p SOFTLAYER_1 -p SOFTLAYER_2
1210 | ```
1211 |
1212 |
1213 |
1214 |
1215 | **square** Square: valid token
1216 |
1217 |
1218 |
1219 |
1220 | validation
1221 |
1222 |
1223 |
1224 |
1225 | `square_1` - Square token
1226 |
1227 |
1228 |
1229 |
1230 |
1231 |
1232 | ```
1233 | keyscope validate square -p SQUARE_1
1234 | ```
1235 |
1236 |
1237 |
1238 |
1239 | **telegram-bot** telegram-bot: valid bot token
1240 |
1241 |
1242 |
1243 |
1244 | validation
1245 |
1246 |
1247 |
1248 |
1249 | `telegram-bot_1` - bot key
1250 |
1251 |
1252 |
1253 |
1254 |
1255 |
1256 | ```
1257 | keyscope validate telegram-bot -p TELEGRAM-BOT_1
1258 | ```
1259 |
1260 |
1261 |
1262 |
1263 | **bingmaps** Bing Maps API: valid access token
1264 |
1265 |
1266 |
1267 |
1268 | validation
1269 |
1270 |
1271 |
1272 |
1273 | `bingmaps_1` - Bing Maps token
1274 |
1275 |
1276 |
1277 |
1278 |
1279 |
1280 | ```
1281 | keyscope validate bingmaps -p BINGMAPS_1
1282 | ```
1283 |
1284 |
1285 |
1286 |
1287 | **buttercms** ButterCMS: valid bot token
1288 |
1289 |
1290 |
1291 |
1292 | validation
1293 |
1294 |
1295 |
1296 |
1297 | `buttercms_1` - ButterCMS API key
1298 |
1299 |
1300 |
1301 |
1302 |
1303 |
1304 | ```
1305 | keyscope validate buttercms -p BUTTERCMS_1
1306 | ```
1307 |
1308 |
1309 |
1310 |
1311 | **wakatime** wakatime: valid api token
1312 |
1313 |
1314 |
1315 |
1316 | validation
1317 |
1318 |
1319 |
1320 |
1321 | `wakatime_1` - WakeTime API key
1322 |
1323 |
1324 |
1325 |
1326 |
1327 |
1328 | ```
1329 | keyscope validate wakatime -p WAKATIME_1
1330 | ```
1331 |
1332 |
1333 |
1334 |
1335 | **calendly** calendly: valid API credentials
1336 |
1337 |
1338 |
1339 |
1340 | validation
1341 |
1342 |
1343 |
1344 |
1345 | `calendly_1` - calendly API key
1346 |
1347 |
1348 |
1349 |
1350 |
1351 |
1352 | ```
1353 | keyscope validate calendly -p CALENDLY_1
1354 | ```
1355 |
1356 |
1357 |
1358 |
1359 | **shodan** shodan: valid api token
1360 |
1361 |
1362 |
1363 |
1364 | validation
1365 |
1366 |
1367 |
1368 |
1369 | `shodan_1` - Shodan API key
1370 |
1371 |
1372 |
1373 |
1374 |
1375 |
1376 | ```
1377 | keyscope validate shodan -p SHODAN_1
1378 | ```
1379 |
1380 |
1381 |
1382 |
1383 | **opsgenie** opsgenie: valid api token
1384 |
1385 |
1386 |
1387 |
1388 | validation
1389 |
1390 |
1391 |
1392 |
1393 | `opsgenie_1` - opsgenie API key
1394 |
1395 |
1396 |
1397 |
1398 |
1399 |
1400 | ```
1401 | keyscope validate opsgenie -p OPSGENIE_1
1402 | ```
1403 |
1404 |
1405 |
1406 |
1407 | **pendo** pendo: valid api token
1408 |
1409 |
1410 |
1411 |
1412 | validation
1413 |
1414 |
1415 |
1416 |
1417 | `pendo_1` - pendo API key
1418 |
1419 |
1420 |
1421 |
1422 |
1423 |
1424 | ```
1425 | keyscope validate pendo -p PENDO_1
1426 | ```
1427 |
1428 |
1429 |
1430 |
1431 | **hubspot** hubspot: valid api token
1432 |
1433 |
1434 |
1435 |
1436 | validation
1437 |
1438 |
1439 |
1440 |
1441 | `hubspot_1` - hubspot API key
1442 |
1443 |
1444 |
1445 |
1446 |
1447 |
1448 | ```
1449 | keyscope validate hubspot -p HUBSPOT_1
1450 | ```
1451 |
1452 |
1453 |
1454 |
1455 | **lokalise** lokalise: valid api token
1456 |
1457 |
1458 |
1459 |
1460 | validation
1461 |
1462 |
1463 |
1464 |
1465 | `lokalise_1` - lokalise token
1466 |
1467 |
1468 |
1469 |
1470 |
1471 |
1472 | ```
1473 | keyscope validate lokalise -p LOKALISE_1
1474 | ```
1475 |
1476 |
1477 |
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 |
--------------------------------------------------------------------------------