difftreelog
feat move secret generation helpers to core
in: trunk
13 files changed
Cargo.lockdiffbeforeafterboth383839[[package]]39[[package]]40name = "aes"40name = "aes"41version = "0.8.3"41version = "0.8.4"42source = "registry+https://github.com/rust-lang/crates.io-index"42source = "registry+https://github.com/rust-lang/crates.io-index"43checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2"43checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0"44dependencies = [44dependencies = [45 "cfg-if",45 "cfg-if",46 "cipher",46 "cipher",636364[[package]]64[[package]]65name = "age"65name = "age"66version = "0.9.2"66version = "0.10.0"67source = "registry+https://github.com/rust-lang/crates.io-index"67source = "registry+https://github.com/rust-lang/crates.io-index"68checksum = "6d55a4d912c80a92762ffd1c884065f3f9646467d22c95390e824a0ff7def472"68checksum = "edeef7d7b199195a2d7d7a8155d2d04aee736e60c5c7bdd7097d115369a8817d"69dependencies = [69dependencies = [70 "aes",70 "aes",71 "aes-gcm",71 "aes-gcm",72 "age-core",72 "age-core",73 "base64 0.13.1",73 "base64",74 "bcrypt-pbkdf",74 "bcrypt-pbkdf",75 "bech32",75 "bech32",76 "cbc",76 "cbc",79 "cookie-factory",79 "cookie-factory",80 "ctr",80 "ctr",81 "curve25519-dalek",81 "curve25519-dalek",82 "hkdf",83 "hmac",82 "hmac",84 "i18n-embed",83 "i18n-embed",85 "i18n-embed-fl",84 "i18n-embed-fl",86 "lazy_static",85 "lazy_static",87 "nom",86 "nom",88 "num-traits",87 "num-traits",89 "pin-project",88 "pin-project",90 "rand 0.7.3",89 "rand",91 "rand 0.8.5",92 "rsa",90 "rsa",93 "rust-embed",91 "rust-embed",94 "scrypt",92 "scrypt",10098101[[package]]99[[package]]102name = "age-core"100name = "age-core"103version = "0.9.0"101version = "0.10.0"104source = "registry+https://github.com/rust-lang/crates.io-index"102source = "registry+https://github.com/rust-lang/crates.io-index"105checksum = "e3d2e815ac879dc23c1139e720d21c6cd4d1276345c772587285d965a69b8f32"103checksum = "a5f11899bc2bbddd135edbc30c36b1924fa59d0746bb45beb5933fafe3fe509b"106dependencies = [104dependencies = [107 "base64 0.13.1",105 "base64",108 "chacha20poly1305",106 "chacha20poly1305",109 "cookie-factory",107 "cookie-factory",110 "hkdf",108 "hkdf",111 "io_tee",109 "io_tee",112 "nom",110 "nom",113 "rand 0.8.5",111 "rand",114 "secrecy",112 "secrecy",115 "sha2",113 "sha2",116]114]149 "libc",147 "libc",150]148]151152[[package]]153name = "ansi-str"154version = "0.8.0"155source = "registry+https://github.com/rust-lang/crates.io-index"156checksum = "1cf4578926a981ab0ca955dc023541d19de37112bc24c1a197bd806d3d86ad1d"157dependencies = [158 "ansitok",159]160161[[package]]162name = "ansitok"163version = "0.2.0"164source = "registry+https://github.com/rust-lang/crates.io-index"165checksum = "220044e6a1bb31ddee4e3db724d29767f352de47445a6cd75e1a173142136c83"166dependencies = [167 "nom",168 "vte 0.10.1",169]170149171[[package]]150[[package]]172name = "anstream"151name = "anstream"173version = "0.6.5"152version = "0.6.11"174source = "registry+https://github.com/rust-lang/crates.io-index"153source = "registry+https://github.com/rust-lang/crates.io-index"175checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6"154checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5"176dependencies = [155dependencies = [177 "anstyle",156 "anstyle",178 "anstyle-parse",157 "anstyle-parse",184163185[[package]]164[[package]]186name = "anstyle"165name = "anstyle"187version = "1.0.4"166version = "1.0.6"188source = "registry+https://github.com/rust-lang/crates.io-index"167source = "registry+https://github.com/rust-lang/crates.io-index"189checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"168checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc"190169191[[package]]170[[package]]192name = "anstyle-parse"171name = "anstyle-parse"218197219[[package]]198[[package]]220name = "anyhow"199name = "anyhow"221version = "1.0.77"200version = "1.0.79"222source = "registry+https://github.com/rust-lang/crates.io-index"201source = "registry+https://github.com/rust-lang/crates.io-index"223checksum = "c9d19de80eff169429ac1e9f48fffb163916b448a44e8e046186232046d9e1f9"202checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"224203225[[package]]204[[package]]226name = "arc-swap"205name = "arc-swap"227version = "1.6.0"206version = "1.6.0"228source = "registry+https://github.com/rust-lang/crates.io-index"207source = "registry+https://github.com/rust-lang/crates.io-index"229checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6"208checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6"230231[[package]]232name = "arrayvec"233version = "0.5.2"234source = "registry+https://github.com/rust-lang/crates.io-index"235checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"236209237[[package]]210[[package]]238name = "arrayvec"211name = "arrayvec"248dependencies = [221dependencies = [249 "proc-macro2",222 "proc-macro2",250 "quote",223 "quote",251 "syn 2.0.48",224 "syn 2.0.49",252]225]253254[[package]]255name = "atty"256version = "0.2.14"257source = "registry+https://github.com/rust-lang/crates.io-index"258checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"259dependencies = [260 "hermit-abi 0.1.19",261 "libc",262 "winapi",263]264226265[[package]]227[[package]]266name = "autocfg"228name = "autocfg"283 "rustc-demangle",245 "rustc-demangle",284]246]285286[[package]]287name = "base64"288version = "0.13.1"289source = "registry+https://github.com/rust-lang/crates.io-index"290checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"291247292[[package]]248[[package]]293name = "base64"249name = "base64"294version = "0.21.5"250version = "0.21.7"295source = "registry+https://github.com/rust-lang/crates.io-index"251source = "registry+https://github.com/rust-lang/crates.io-index"296checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9"252checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"297253298[[package]]254[[package]]299name = "base64ct"255name = "base64ct"303259304[[package]]260[[package]]305name = "bcrypt-pbkdf"261name = "bcrypt-pbkdf"306version = "0.9.0"262version = "0.10.0"307source = "registry+https://github.com/rust-lang/crates.io-index"263source = "registry+https://github.com/rust-lang/crates.io-index"308checksum = "3806a8db60cf56efee531616a34a6aaa9a114d6da2add861b0fa4a188881b2c7"264checksum = "6aeac2e1fe888769f34f05ac343bbef98b14d1ffb292ab69d4608b3abc86f2a2"309dependencies = [265dependencies = [310 "blowfish",266 "blowfish",311 "pbkdf2",267 "pbkdf2",338294339[[package]]295[[package]]340name = "bitflags"296name = "bitflags"341version = "2.4.1"297version = "2.4.2"342source = "registry+https://github.com/rust-lang/crates.io-index"298source = "registry+https://github.com/rust-lang/crates.io-index"343checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"299checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"344dependencies = [300dependencies = [345 "serde",301 "serde",346]302]375331376[[package]]332[[package]]377name = "bumpalo"333name = "bumpalo"378version = "3.14.0"334version = "3.15.0"379source = "registry+https://github.com/rust-lang/crates.io-index"335source = "registry+https://github.com/rust-lang/crates.io-index"380checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"336checksum = "d32a994c2b3ca201d9b263612a374263f05e7adde37c4707f693dcd375076d1f"381337382[[package]]338[[package]]383name = "bytecount"339name = "bytecount"456412457[[package]]413[[package]]458name = "chrono"414name = "chrono"459version = "0.4.31"415version = "0.4.34"460source = "registry+https://github.com/rust-lang/crates.io-index"416source = "registry+https://github.com/rust-lang/crates.io-index"461checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38"417checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b"462dependencies = [418dependencies = [463 "android-tzdata",419 "android-tzdata",464 "iana-time-zone",420 "iana-time-zone",465 "js-sys",421 "js-sys",466 "num-traits",422 "num-traits",467 "serde",423 "serde",468 "wasm-bindgen",424 "wasm-bindgen",469 "windows-targets 0.48.5",425 "windows-targets 0.52.0",470]426]471427472[[package]]428[[package]]482438483[[package]]439[[package]]484name = "clap"440name = "clap"485version = "4.4.12"441version = "4.5.1"486source = "registry+https://github.com/rust-lang/crates.io-index"442source = "registry+https://github.com/rust-lang/crates.io-index"487checksum = "dcfab8ba68f3668e89f6ff60f5b205cea56aa7b769451a59f34b8682f51c056d"443checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da"488dependencies = [444dependencies = [489 "clap_builder",445 "clap_builder",490 "clap_derive",446 "clap_derive",491]447]492448493[[package]]449[[package]]494name = "clap_builder"450name = "clap_builder"495version = "4.4.12"451version = "4.5.1"496source = "registry+https://github.com/rust-lang/crates.io-index"452source = "registry+https://github.com/rust-lang/crates.io-index"497checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9"453checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb"498dependencies = [454dependencies = [499 "anstream",455 "anstream",500 "anstyle",456 "anstyle",501 "clap_lex",457 "clap_lex",502 "strsim",458 "strsim 0.11.0",503 "terminal_size",459 "terminal_size",504 "unicase",460 "unicase",505 "unicode-width",461 "unicode-width",506]462]507463508[[package]]464[[package]]509name = "clap_derive"465name = "clap_derive"510version = "4.4.7"466version = "4.5.0"511source = "registry+https://github.com/rust-lang/crates.io-index"467source = "registry+https://github.com/rust-lang/crates.io-index"512checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"468checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47"513dependencies = [469dependencies = [514 "heck",470 "heck",515 "proc-macro2",471 "proc-macro2",516 "quote",472 "quote",517 "syn 2.0.48",473 "syn 2.0.49",518]474]519475520[[package]]476[[package]]521name = "clap_lex"477name = "clap_lex"522version = "0.6.0"478version = "0.7.0"523source = "registry+https://github.com/rust-lang/crates.io-index"479source = "registry+https://github.com/rust-lang/crates.io-index"524checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"480checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"525481526[[package]]482[[package]]527name = "colorchoice"483name = "colorchoice"531487532[[package]]488[[package]]533name = "console"489name = "console"534version = "0.15.7"490version = "0.15.8"535source = "registry+https://github.com/rust-lang/crates.io-index"491source = "registry+https://github.com/rust-lang/crates.io-index"536checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8"492checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb"537dependencies = [493dependencies = [538 "encode_unicode",494 "encode_unicode",539 "lazy_static",495 "lazy_static",540 "libc",496 "libc",541 "unicode-width",497 "unicode-width",542 "windows-sys 0.45.0",498 "windows-sys 0.52.0",543]499]544500545[[package]]501[[package]]568524569[[package]]525[[package]]570name = "cpufeatures"526name = "cpufeatures"571version = "0.2.11"527version = "0.2.12"572source = "registry+https://github.com/rust-lang/crates.io-index"528source = "registry+https://github.com/rust-lang/crates.io-index"573checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0"529checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"574dependencies = [530dependencies = [575 "libc",531 "libc",576]532]582checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"538checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"583dependencies = [539dependencies = [584 "generic-array",540 "generic-array",585 "rand_core 0.6.4",541 "rand_core",586 "typenum",542 "typenum",587]543]588544597553598[[package]]554[[package]]599name = "curve25519-dalek"555name = "curve25519-dalek"600version = "3.2.0"556version = "4.1.2"601source = "registry+https://github.com/rust-lang/crates.io-index"557source = "registry+https://github.com/rust-lang/crates.io-index"602checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61"558checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348"603dependencies = [559dependencies = [560 "cfg-if",604 "byteorder",561 "cpufeatures",562 "curve25519-dalek-derive",605 "digest 0.9.0",563 "fiat-crypto",564 "platforms",606 "rand_core 0.5.1",565 "rustc_version",607 "subtle",566 "subtle",608 "zeroize",567 "zeroize",609]568]569570[[package]]571name = "curve25519-dalek-derive"572version = "0.1.1"573source = "registry+https://github.com/rust-lang/crates.io-index"574checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"575dependencies = [576 "proc-macro2",577 "quote",578 "syn 2.0.49",579]610580611[[package]]581[[package]]612name = "dashmap"582name = "dashmap"623593624[[package]]594[[package]]625name = "der"595name = "der"626version = "0.6.1"596version = "0.7.8"627source = "registry+https://github.com/rust-lang/crates.io-index"597source = "registry+https://github.com/rust-lang/crates.io-index"628checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de"598checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c"629dependencies = [599dependencies = [630 "const-oid",600 "const-oid",631 "zeroize",601 "zeroize",641 "serde",611 "serde",642]612]643644[[package]]645name = "digest"646version = "0.9.0"647source = "registry+https://github.com/rust-lang/crates.io-index"648checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"649dependencies = [650 "generic-array",651]652613653[[package]]614[[package]]654name = "digest"615name = "digest"662 "subtle",623 "subtle",663]624]664665[[package]]666name = "dirs"667version = "5.0.1"668source = "registry+https://github.com/rust-lang/crates.io-index"669checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"670dependencies = [671 "dirs-sys",672]673674[[package]]675name = "dirs-sys"676version = "0.4.1"677source = "registry+https://github.com/rust-lang/crates.io-index"678checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"679dependencies = [680 "libc",681 "option-ext",682 "redox_users",683 "windows-sys 0.48.0",684]685625686[[package]]626[[package]]687name = "displaydoc"627name = "displaydoc"691dependencies = [631dependencies = [692 "proc-macro2",632 "proc-macro2",693 "quote",633 "quote",694 "syn 2.0.48",634 "syn 2.0.49",695]635]696636697[[package]]637[[package]]698name = "either"638name = "either"699version = "1.9.0"639version = "1.10.0"700source = "registry+https://github.com/rust-lang/crates.io-index"640source = "registry+https://github.com/rust-lang/crates.io-index"701checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"641checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a"702642703[[package]]643[[package]]704name = "encode_unicode"644name = "encode_unicode"705version = "0.3.6"645version = "0.3.6"706source = "registry+https://github.com/rust-lang/crates.io-index"646source = "registry+https://github.com/rust-lang/crates.io-index"707checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"647checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"708709[[package]]710name = "env_logger"711version = "0.10.1"712source = "registry+https://github.com/rust-lang/crates.io-index"713checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece"714dependencies = [715 "humantime",716 "is-terminal",717 "log",718 "regex",719 "termcolor",720]721648722[[package]]649[[package]]723name = "equivalent"650name = "equivalent"741source = "registry+https://github.com/rust-lang/crates.io-index"668source = "registry+https://github.com/rust-lang/crates.io-index"742checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"669checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"670671[[package]]672name = "fiat-crypto"673version = "0.2.6"674source = "registry+https://github.com/rust-lang/crates.io-index"675checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382"743676744[[package]]677[[package]]745name = "find-crate"678name = "find-crate"759 "age-core",692 "age-core",760 "anyhow",693 "anyhow",761 "async-trait",694 "async-trait",762 "base64 0.21.5",695 "base64",763 "better-command",696 "better-command",764 "chrono",697 "chrono",765 "clap",698 "clap",797 "age",730 "age",798 "anyhow",731 "anyhow",799 "clap",732 "clap",800 "env_logger",801 "log",802 "nix",733 "nix",803 "serde",734 "serde",804 "serde_json",735 "serde_json",805 "tempfile",736 "tempfile",737 "tracing",738 "tracing-subscriber",806 "z85",739 "z85",807]740]808741912dependencies = [845dependencies = [913 "proc-macro2",846 "proc-macro2",914 "quote",847 "quote",915 "syn 2.0.48",848 "syn 2.0.49",916]849]917850918[[package]]851[[package]]955 "version_check",888 "version_check",956]889]957958[[package]]959name = "getrandom"960version = "0.1.16"961source = "registry+https://github.com/rust-lang/crates.io-index"962checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"963dependencies = [964 "cfg-if",965 "libc",966 "wasi 0.9.0+wasi-snapshot-preview1",967]968890969[[package]]891[[package]]970name = "getrandom"892name = "getrandom"971version = "0.2.11"893version = "0.2.12"972source = "registry+https://github.com/rust-lang/crates.io-index"894source = "registry+https://github.com/rust-lang/crates.io-index"973checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f"895checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"974dependencies = [896dependencies = [975 "cfg-if",897 "cfg-if",976 "libc",898 "libc",977 "wasi 0.11.0+wasi-snapshot-preview1",899 "wasi",978]900]979901980[[package]]902[[package]]1011source = "registry+https://github.com/rust-lang/crates.io-index"933source = "registry+https://github.com/rust-lang/crates.io-index"1012checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"934checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"10131014[[package]]1015name = "hermit-abi"1016version = "0.1.19"1017source = "registry+https://github.com/rust-lang/crates.io-index"1018checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"1019dependencies = [1020 "libc",1021]10229351023[[package]]936[[package]]1024name = "hermit-abi"937name = "hermit-abi"1025version = "0.3.3"938version = "0.3.6"1026source = "registry+https://github.com/rust-lang/crates.io-index"939source = "registry+https://github.com/rust-lang/crates.io-index"1027checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"940checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd"10289411029[[package]]942[[package]]1030name = "hkdf"943name = "hkdf"1041source = "registry+https://github.com/rust-lang/crates.io-index"954source = "registry+https://github.com/rust-lang/crates.io-index"1042checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"955checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"1043dependencies = [956dependencies = [1044 "digest 0.10.7",957 "digest",1045]958]10469591047[[package]]960[[package]]1061source = "registry+https://github.com/rust-lang/crates.io-index"974source = "registry+https://github.com/rust-lang/crates.io-index"1062checksum = "f58b778a5761513caf593693f8951c97a5b610841e754788400f32102eefdff1"975checksum = "f58b778a5761513caf593693f8951c97a5b610841e754788400f32102eefdff1"10631064[[package]]1065name = "humantime"1066version = "2.1.0"1067source = "registry+https://github.com/rust-lang/crates.io-index"1068checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"10699761070[[package]]977[[package]]1071name = "i18n-config"978name = "i18n-config"1077 "serde",984 "serde",1078 "serde_derive",985 "serde_derive",1079 "thiserror",986 "thiserror",1080 "toml 0.8.8",987 "toml 0.8.10",1081 "unic-langid",988 "unic-langid",1082]989]10839901084[[package]]991[[package]]1085name = "i18n-embed"992name = "i18n-embed"1086version = "0.13.9"993version = "0.14.1"1087source = "registry+https://github.com/rust-lang/crates.io-index"994source = "registry+https://github.com/rust-lang/crates.io-index"1088checksum = "92a86226a7a16632de6723449ee5fe70bac5af718bc642ee9ca2f0f6e14fa1fa"995checksum = "94205d95764f5bb9db9ea98fa77f89653365ca748e27161f5bbea2ffd50e459c"1089dependencies = [996dependencies = [1090 "arc-swap",997 "arc-swap",1091 "fluent",998 "fluent",110410111105[[package]]1012[[package]]1106name = "i18n-embed-fl"1013name = "i18n-embed-fl"1107version = "0.6.7"1014version = "0.7.0"1108source = "registry+https://github.com/rust-lang/crates.io-index"1015source = "registry+https://github.com/rust-lang/crates.io-index"1109checksum = "d26a3d3569737dfaac7fc1c4078e6af07471c3060b8e570bcd83cdd5f4685395"1016checksum = "9fc1f8715195dffc4caddcf1cf3128da15fe5d8a137606ea8856c9300047d5a2"1110dependencies = [1017dependencies = [1111 "dashmap",1018 "dashmap",1112 "find-crate",1019 "find-crate",1118 "proc-macro-error",1025 "proc-macro-error",1119 "proc-macro2",1026 "proc-macro2",1120 "quote",1027 "quote",1121 "strsim",1028 "strsim 0.10.0",1122 "syn 2.0.48",1029 "syn 2.0.49",1123 "unic-langid",1030 "unic-langid",1124]1031]112510321133 "i18n-config",1040 "i18n-config",1134 "proc-macro2",1041 "proc-macro2",1135 "quote",1042 "quote",1136 "syn 2.0.48",1043 "syn 2.0.49",1137]1044]113810451139[[package]]1046[[package]]1140name = "iana-time-zone"1047name = "iana-time-zone"1141version = "0.1.59"1048version = "0.1.60"1142source = "registry+https://github.com/rust-lang/crates.io-index"1049source = "registry+https://github.com/rust-lang/crates.io-index"1143checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539"1050checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"1144dependencies = [1051dependencies = [1145 "android_system_properties",1052 "android_system_properties",1146 "core-foundation-sys",1053 "core-foundation-sys",116110681162[[package]]1069[[package]]1163name = "indexmap"1070name = "indexmap"1164version = "2.1.0"1071version = "2.2.3"1165source = "registry+https://github.com/rust-lang/crates.io-index"1072source = "registry+https://github.com/rust-lang/crates.io-index"1166checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"1073checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177"1167dependencies = [1074dependencies = [1168 "equivalent",1075 "equivalent",1169 "hashbrown 0.14.3",1076 "hashbrown 0.14.3",1170]1077]117110781172[[package]]1079[[package]]1173name = "indicatif"1080name = "indicatif"1174version = "0.17.7"1081version = "0.17.8"1175source = "registry+https://github.com/rust-lang/crates.io-index"1082source = "registry+https://github.com/rust-lang/crates.io-index"1176checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25"1083checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3"1177dependencies = [1084dependencies = [1178 "console",1085 "console",1179 "instant",1086 "instant",122911361230[[package]]1137[[package]]1231name = "is-terminal"1138name = "is-terminal"1232version = "0.4.10"1139version = "0.4.12"1233source = "registry+https://github.com/rust-lang/crates.io-index"1140source = "registry+https://github.com/rust-lang/crates.io-index"1234checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455"1141checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b"1235dependencies = [1142dependencies = [1236 "hermit-abi 0.3.3",1143 "hermit-abi",1237 "rustix",1144 "libc",1238 "windows-sys 0.52.0",1145 "windows-sys 0.52.0",1239]1146]124011471241[[package]]1148[[package]]1242name = "is_ci"1149name = "is_ci"1243version = "1.1.1"1150version = "1.2.0"1244source = "registry+https://github.com/rust-lang/crates.io-index"1151source = "registry+https://github.com/rust-lang/crates.io-index"1245checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb"1152checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45"124611531247[[package]]1154[[package]]1248name = "itertools"1155name = "itertools"1249version = "0.11.0"1156version = "0.12.1"1250source = "registry+https://github.com/rust-lang/crates.io-index"1157source = "registry+https://github.com/rust-lang/crates.io-index"1251checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"1158checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"1252dependencies = [1159dependencies = [1253 "either",1160 "either",1254]1161]126111681262[[package]]1169[[package]]1263name = "js-sys"1170name = "js-sys"1264version = "0.3.66"1171version = "0.3.68"1265source = "registry+https://github.com/rust-lang/crates.io-index"1172source = "registry+https://github.com/rust-lang/crates.io-index"1266checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca"1173checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee"1267dependencies = [1174dependencies = [1268 "wasm-bindgen",1175 "wasm-bindgen",1269]1176]127911861280[[package]]1187[[package]]1281name = "libc"1188name = "libc"1282version = "0.2.151"1189version = "0.2.153"1283source = "registry+https://github.com/rust-lang/crates.io-index"1190source = "registry+https://github.com/rust-lang/crates.io-index"1284checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"1191checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"128511921286[[package]]1193[[package]]1287name = "libm"1194name = "libm"1299 "libc",1206 "libc",1300]1207]13011302[[package]]1303name = "libredox"1304version = "0.0.1"1305source = "registry+https://github.com/rust-lang/crates.io-index"1306checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8"1307dependencies = [1308 "bitflags 2.4.1",1309 "libc",1310 "redox_syscall",1311]131212081313[[package]]1209[[package]]1314name = "linked-hash-map"1210name = "linked-hash-map"131812141319[[package]]1215[[package]]1320name = "linux-raw-sys"1216name = "linux-raw-sys"1321version = "0.4.12"1217version = "0.4.13"1322source = "registry+https://github.com/rust-lang/crates.io-index"1218source = "registry+https://github.com/rust-lang/crates.io-index"1323checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"1219checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"132412201325[[package]]1221[[package]]1326name = "lock_api"1222name = "lock_api"138512811386[[package]]1282[[package]]1387name = "miniz_oxide"1283name = "miniz_oxide"1388version = "0.7.1"1284version = "0.7.2"1389source = "registry+https://github.com/rust-lang/crates.io-index"1285source = "registry+https://github.com/rust-lang/crates.io-index"1390checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"1286checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"1391dependencies = [1287dependencies = [1392 "adler",1288 "adler",1393]1289]1399checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"1295checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"1400dependencies = [1296dependencies = [1401 "libc",1297 "libc",1402 "wasi 0.11.0+wasi-snapshot-preview1",1298 "wasi",1403 "windows-sys 0.48.0",1299 "windows-sys 0.48.0",1404]1300]140513011409source = "registry+https://github.com/rust-lang/crates.io-index"1305source = "registry+https://github.com/rust-lang/crates.io-index"1410checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"1306checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"1411dependencies = [1307dependencies = [1412 "bitflags 2.4.1",1308 "bitflags 2.4.2",1413 "cfg-if",1309 "cfg-if",1414 "libc",1310 "libc",1415]1311]1460 "num-integer",1356 "num-integer",1461 "num-iter",1357 "num-iter",1462 "num-traits",1358 "num-traits",1463 "rand 0.8.5",1359 "rand",1464 "smallvec",1360 "smallvec",1465 "zeroize",1361 "zeroize",1466]1362]13631364[[package]]1365name = "num-conv"1366version = "0.1.0"1367source = "registry+https://github.com/rust-lang/crates.io-index"1368checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"146713691468[[package]]1370[[package]]1469name = "num-integer"1371name = "num-integer"1470version = "0.1.45"1372version = "0.1.46"1471source = "registry+https://github.com/rust-lang/crates.io-index"1373source = "registry+https://github.com/rust-lang/crates.io-index"1472checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"1374checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"1473dependencies = [1375dependencies = [1474 "autocfg",1475 "num-traits",1376 "num-traits",1476]1377]147713781478[[package]]1379[[package]]1479name = "num-iter"1380name = "num-iter"1480version = "0.1.43"1381version = "0.1.44"1481source = "registry+https://github.com/rust-lang/crates.io-index"1382source = "registry+https://github.com/rust-lang/crates.io-index"1482checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"1383checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9"1483dependencies = [1384dependencies = [1484 "autocfg",1385 "autocfg",1485 "num-integer",1386 "num-integer",148813891489[[package]]1390[[package]]1490name = "num-traits"1391name = "num-traits"1491version = "0.2.17"1392version = "0.2.18"1492source = "registry+https://github.com/rust-lang/crates.io-index"1393source = "registry+https://github.com/rust-lang/crates.io-index"1493checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"1394checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a"1494dependencies = [1395dependencies = [1495 "autocfg",1396 "autocfg",1496 "libm",1397 "libm",1502source = "registry+https://github.com/rust-lang/crates.io-index"1403source = "registry+https://github.com/rust-lang/crates.io-index"1503checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"1404checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"1504dependencies = [1405dependencies = [1505 "hermit-abi 0.3.3",1406 "hermit-abi",1506 "libc",1407 "libc",1507]1408]15081409153514361536[[package]]1437[[package]]1537name = "openssh"1438name = "openssh"1538version = "0.10.2"1439version = "0.10.3"1539source = "registry+https://github.com/rust-lang/crates.io-index"1440source = "registry+https://github.com/rust-lang/crates.io-index"1540checksum = "8274f2bf1fc3785406a3ff07c92c15590c00e84efb883da77b671562ca9a6115"1441checksum = "cab71dc3fc68747816c7eecdffcede064d6bac9621fd658bf1ab5414e91558a3"1541dependencies = [1442dependencies = [1542 "dirs",1543 "libc",1443 "libc",1544 "once_cell",1444 "once_cell",1545 "shell-escape",1445 "shell-escape",1549 "tokio-pipe",1449 "tokio-pipe",1550]1450]15511552[[package]]1553name = "option-ext"1554version = "0.2.0"1555source = "registry+https://github.com/rust-lang/crates.io-index"1556checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"155714511558[[package]]1452[[package]]1559name = "overload"1453name = "overload"156314571564[[package]]1458[[package]]1565name = "owo-colors"1459name = "owo-colors"1566version = "3.5.0"1460version = "4.0.0"1567source = "registry+https://github.com/rust-lang/crates.io-index"1461source = "registry+https://github.com/rust-lang/crates.io-index"1568checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"1462checksum = "caff54706df99d2a78a5a4e3455ff45448d81ef1bb63c22cd14052ca0e993a3f"1569dependencies = [1463dependencies = [1570 "supports-color",1464 "supports-color",1571]1465]157214661573[[package]]1467[[package]]1574name = "papergrid"1468name = "papergrid"1575version = "0.10.0"1469version = "0.11.0"1576source = "registry+https://github.com/rust-lang/crates.io-index"1470source = "registry+https://github.com/rust-lang/crates.io-index"1577checksum = "a2ccbe15f2b6db62f9a9871642746427e297b0ceb85f9a7f1ee5ff47d184d0c8"1471checksum = "9ad43c07024ef767f9160710b3a6773976194758c7919b17e63b863db0bdf7fb"1578dependencies = [1472dependencies = [1579 "ansi-str",1580 "ansitok",1581 "bytecount",1473 "bytecount",1582 "fnv",1474 "fnv",1583 "unicode-width",1475 "unicode-width",160815001609[[package]]1501[[package]]1610name = "pbkdf2"1502name = "pbkdf2"1611version = "0.11.0"1503version = "0.12.2"1612source = "registry+https://github.com/rust-lang/crates.io-index"1504source = "registry+https://github.com/rust-lang/crates.io-index"1613checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917"1505checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2"1614dependencies = [1506dependencies = [1615 "digest 0.10.7",1507 "digest",1508 "hmac",1616]1509]161715101618[[package]]1511[[package]]164415371645[[package]]1538[[package]]1646name = "pin-project"1539name = "pin-project"1647version = "1.1.3"1540version = "1.1.4"1648source = "registry+https://github.com/rust-lang/crates.io-index"1541source = "registry+https://github.com/rust-lang/crates.io-index"1649checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422"1542checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0"1650dependencies = [1543dependencies = [1651 "pin-project-internal",1544 "pin-project-internal",1652]1545]165315461654[[package]]1547[[package]]1655name = "pin-project-internal"1548name = "pin-project-internal"1656version = "1.1.3"1549version = "1.1.4"1657source = "registry+https://github.com/rust-lang/crates.io-index"1550source = "registry+https://github.com/rust-lang/crates.io-index"1658checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"1551checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690"1659dependencies = [1552dependencies = [1660 "proc-macro2",1553 "proc-macro2",1661 "quote",1554 "quote",1662 "syn 2.0.48",1555 "syn 2.0.49",1663]1556]166415571665[[package]]1558[[package]]167615691677[[package]]1570[[package]]1678name = "pkcs1"1571name = "pkcs1"1679version = "0.4.1"1572version = "0.7.5"1680source = "registry+https://github.com/rust-lang/crates.io-index"1573source = "registry+https://github.com/rust-lang/crates.io-index"1681checksum = "eff33bdbdfc54cc98a2eca766ebdec3e1b8fb7387523d5c9c9a2891da856f719"1574checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"1682dependencies = [1575dependencies = [1683 "der",1576 "der",1684 "pkcs8",1577 "pkcs8",1685 "spki",1578 "spki",1686 "zeroize",1687]1579]168815801689[[package]]1581[[package]]1690name = "pkcs8"1582name = "pkcs8"1691version = "0.9.0"1583version = "0.10.2"1692source = "registry+https://github.com/rust-lang/crates.io-index"1584source = "registry+https://github.com/rust-lang/crates.io-index"1693checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba"1585checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7"1694dependencies = [1586dependencies = [1695 "der",1587 "der",1696 "spki",1588 "spki",1697]1589]15901591[[package]]1592name = "platforms"1593version = "3.3.0"1594source = "registry+https://github.com/rust-lang/crates.io-index"1595checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c"169815961699[[package]]1597[[package]]1700name = "poly1305"1598name = "poly1305"176316611764[[package]]1662[[package]]1765name = "proc-macro2"1663name = "proc-macro2"1766version = "1.0.75"1664version = "1.0.78"1767source = "registry+https://github.com/rust-lang/crates.io-index"1665source = "registry+https://github.com/rust-lang/crates.io-index"1768checksum = "907a61bd0f64c2f29cd1cf1dc34d05176426a3f504a78010f08416ddb7b13708"1666checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"1769dependencies = [1667dependencies = [1770 "unicode-ident",1668 "unicode-ident",1771]1669]1790 "scheduled-thread-pool",1688 "scheduled-thread-pool",1791]1689]17921793[[package]]1794name = "rand"1795version = "0.7.3"1796source = "registry+https://github.com/rust-lang/crates.io-index"1797checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"1798dependencies = [1799 "getrandom 0.1.16",1800 "libc",1801 "rand_chacha 0.2.2",1802 "rand_core 0.5.1",1803 "rand_hc",1804]180516901806[[package]]1691[[package]]1807name = "rand"1692name = "rand"1810checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"1695checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"1811dependencies = [1696dependencies = [1812 "libc",1697 "libc",1813 "rand_chacha 0.3.1",1698 "rand_chacha",1814 "rand_core 0.6.4",1699 "rand_core",1815]1700]18161817[[package]]1818name = "rand_chacha"1819version = "0.2.2"1820source = "registry+https://github.com/rust-lang/crates.io-index"1821checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"1822dependencies = [1823 "ppv-lite86",1824 "rand_core 0.5.1",1825]182617011827[[package]]1702[[package]]1828name = "rand_chacha"1703name = "rand_chacha"1831checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"1706checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"1832dependencies = [1707dependencies = [1833 "ppv-lite86",1708 "ppv-lite86",1834 "rand_core 0.6.4",1709 "rand_core",1835]1710]18361837[[package]]1838name = "rand_core"1839version = "0.5.1"1840source = "registry+https://github.com/rust-lang/crates.io-index"1841checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"1842dependencies = [1843 "getrandom 0.1.16",1844]184517111846[[package]]1712[[package]]1847name = "rand_core"1713name = "rand_core"1848version = "0.6.4"1714version = "0.6.4"1849source = "registry+https://github.com/rust-lang/crates.io-index"1715source = "registry+https://github.com/rust-lang/crates.io-index"1850checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"1716checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"1851dependencies = [1717dependencies = [1852 "getrandom 0.2.11",1718 "getrandom",1853]1719]18541855[[package]]1856name = "rand_hc"1857version = "0.2.0"1858source = "registry+https://github.com/rust-lang/crates.io-index"1859checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"1860dependencies = [1861 "rand_core 0.5.1",1862]186317201864[[package]]1721[[package]]1865name = "redox_syscall"1722name = "redox_syscall"1870 "bitflags 1.3.2",1727 "bitflags 1.3.2",1871]1728]18721873[[package]]1874name = "redox_users"1875version = "0.4.4"1876source = "registry+https://github.com/rust-lang/crates.io-index"1877checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4"1878dependencies = [1879 "getrandom 0.2.11",1880 "libredox",1881 "thiserror",1882]188317291884[[package]]1730[[package]]1885name = "regex"1731name = "regex"1886version = "1.10.2"1732version = "1.10.3"1887source = "registry+https://github.com/rust-lang/crates.io-index"1733source = "registry+https://github.com/rust-lang/crates.io-index"1888checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"1734checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"1889dependencies = [1735dependencies = [1890 "aho-corasick",1736 "aho-corasick",1891 "memchr",1737 "memchr",1892 "regex-automata 0.4.3",1738 "regex-automata 0.4.5",1893 "regex-syntax 0.8.2",1739 "regex-syntax 0.8.2",1894]1740]18951741190417501905[[package]]1751[[package]]1906name = "regex-automata"1752name = "regex-automata"1907version = "0.4.3"1753version = "0.4.5"1908source = "registry+https://github.com/rust-lang/crates.io-index"1754source = "registry+https://github.com/rust-lang/crates.io-index"1909checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"1755checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd"1910dependencies = [1756dependencies = [1911 "aho-corasick",1757 "aho-corasick",1912 "memchr",1758 "memchr",1950source = "registry+https://github.com/rust-lang/crates.io-index"1796source = "registry+https://github.com/rust-lang/crates.io-index"1951checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"1797checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"1952dependencies = [1798dependencies = [1953 "base64 0.21.5",1799 "base64",1954 "bitflags 2.4.1",1800 "bitflags 2.4.2",1955 "serde",1801 "serde",1956 "serde_derive",1802 "serde_derive",1957]1803]197118171972[[package]]1818[[package]]1973name = "rsa"1819name = "rsa"1974version = "0.7.2"1820version = "0.9.6"1975source = "registry+https://github.com/rust-lang/crates.io-index"1821source = "registry+https://github.com/rust-lang/crates.io-index"1976checksum = "094052d5470cbcef561cb848a7209968c9f12dfa6d668f4bca048ac5de51099c"1822checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc"1977dependencies = [1823dependencies = [1978 "byteorder",1824 "const-oid",1979 "digest 0.10.7",1825 "digest",1980 "num-bigint-dig",1826 "num-bigint-dig",1981 "num-integer",1827 "num-integer",1982 "num-iter",1983 "num-traits",1828 "num-traits",1984 "pkcs1",1829 "pkcs1",1985 "pkcs8",1830 "pkcs8",1986 "rand_core 0.6.4",1831 "rand_core",1987 "signature",1832 "signature",1988 "smallvec",1833 "spki",1989 "subtle",1834 "subtle",1990 "zeroize",1835 "zeroize",1991]1836]199218371993[[package]]1838[[package]]1994name = "rust-embed"1839name = "rust-embed"1995version = "6.8.1"1840version = "8.2.0"1996source = "registry+https://github.com/rust-lang/crates.io-index"1841source = "registry+https://github.com/rust-lang/crates.io-index"1997checksum = "a36224c3276f8c4ebc8c20f158eca7ca4359c8db89991c4925132aaaf6702661"1842checksum = "a82c0bbc10308ed323529fd3c1dce8badda635aa319a5ff0e6466f33b8101e3f"1998dependencies = [1843dependencies = [1999 "rust-embed-impl",1844 "rust-embed-impl",2000 "rust-embed-utils",1845 "rust-embed-utils",200318482004[[package]]1849[[package]]2005name = "rust-embed-impl"1850name = "rust-embed-impl"2006version = "6.8.1"1851version = "8.2.0"2007source = "registry+https://github.com/rust-lang/crates.io-index"1852source = "registry+https://github.com/rust-lang/crates.io-index"2008checksum = "49b94b81e5b2c284684141a2fb9e2a31be90638caf040bf9afbc5a0416afe1ac"1853checksum = "6227c01b1783cdfee1bcf844eb44594cd16ec71c35305bf1c9fb5aade2735e16"2009dependencies = [1854dependencies = [2010 "proc-macro2",1855 "proc-macro2",2011 "quote",1856 "quote",2012 "rust-embed-utils",1857 "rust-embed-utils",2013 "syn 2.0.48",1858 "syn 2.0.49",2014 "walkdir",1859 "walkdir",2015]1860]201618612017[[package]]1862[[package]]2018name = "rust-embed-utils"1863name = "rust-embed-utils"2019version = "7.8.1"1864version = "8.2.0"2020source = "registry+https://github.com/rust-lang/crates.io-index"1865source = "registry+https://github.com/rust-lang/crates.io-index"2021checksum = "9d38ff6bf570dc3bb7100fce9f7b60c33fa71d80e88da3f2580df4ff2bdded74"1866checksum = "8cb0a25bfbb2d4b4402179c2cf030387d9990857ce08a32592c6238db9fa8665"2022dependencies = [1867dependencies = [2023 "sha2",1868 "sha2",2024 "walkdir",1869 "walkdir",2036source = "registry+https://github.com/rust-lang/crates.io-index"1881source = "registry+https://github.com/rust-lang/crates.io-index"2037checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"1882checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"18831884[[package]]1885name = "rustc_version"1886version = "0.4.0"1887source = "registry+https://github.com/rust-lang/crates.io-index"1888checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"1889dependencies = [1890 "semver",1891]203818922039[[package]]1893[[package]]2040name = "rustix"1894name = "rustix"2041version = "0.38.28"1895version = "0.38.31"2042source = "registry+https://github.com/rust-lang/crates.io-index"1896source = "registry+https://github.com/rust-lang/crates.io-index"2043checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316"1897checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949"2044dependencies = [1898dependencies = [2045 "bitflags 2.4.1",1899 "bitflags 2.4.2",2046 "errno",1900 "errno",2047 "libc",1901 "libc",2048 "linux-raw-sys",1902 "linux-raw-sys",209019442091[[package]]1945[[package]]2092name = "scrypt"1946name = "scrypt"2093version = "0.10.0"1947version = "0.11.0"2094source = "registry+https://github.com/rust-lang/crates.io-index"1948source = "registry+https://github.com/rust-lang/crates.io-index"2095checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d"1949checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f"2096dependencies = [1950dependencies = [2097 "hmac",2098 "pbkdf2",1951 "pbkdf2",2099 "salsa20",1952 "salsa20",2100 "sha2",1953 "sha2",2124source = "registry+https://github.com/rust-lang/crates.io-index"1977source = "registry+https://github.com/rust-lang/crates.io-index"2125checksum = "58bf37232d3bb9a2c4e641ca2a11d83b5062066f88df7fed36c28772046d65ba"1978checksum = "58bf37232d3bb9a2c4e641ca2a11d83b5062066f88df7fed36c28772046d65ba"19791980[[package]]1981name = "semver"1982version = "1.0.21"1983source = "registry+https://github.com/rust-lang/crates.io-index"1984checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0"212619852127[[package]]1986[[package]]2128name = "serde"1987name = "serde"2129version = "1.0.193"1988version = "1.0.196"2130source = "registry+https://github.com/rust-lang/crates.io-index"1989source = "registry+https://github.com/rust-lang/crates.io-index"2131checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"1990checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"2132dependencies = [1991dependencies = [2133 "serde_derive",1992 "serde_derive",2134]1993]214420032145[[package]]2004[[package]]2146name = "serde_derive"2005name = "serde_derive"2147version = "1.0.193"2006version = "1.0.196"2148source = "registry+https://github.com/rust-lang/crates.io-index"2007source = "registry+https://github.com/rust-lang/crates.io-index"2149checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"2008checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"2150dependencies = [2009dependencies = [2151 "proc-macro2",2010 "proc-macro2",2152 "quote",2011 "quote",2153 "syn 2.0.48",2012 "syn 2.0.49",2154]2013]215520142156[[package]]2015[[package]]2157name = "serde_json"2016name = "serde_json"2158version = "1.0.108"2017version = "1.0.113"2159source = "registry+https://github.com/rust-lang/crates.io-index"2018source = "registry+https://github.com/rust-lang/crates.io-index"2160checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b"2019checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79"2161dependencies = [2020dependencies = [2162 "itoa",2021 "itoa",2163 "ryu",2022 "ryu",2181dependencies = [2040dependencies = [2182 "cfg-if",2041 "cfg-if",2183 "cpufeatures",2042 "cpufeatures",2184 "digest 0.10.7",2043 "digest",2185]2044]218620452187[[package]]2046[[package]]220120602202[[package]]2061[[package]]2203name = "shlex"2062name = "shlex"2204version = "1.2.0"2063version = "1.3.0"2205source = "registry+https://github.com/rust-lang/crates.io-index"2064source = "registry+https://github.com/rust-lang/crates.io-index"2206checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380"2065checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"220720662208[[package]]2067[[package]]2209name = "signal-hook-registry"2068name = "signal-hook-registry"221620752217[[package]]2076[[package]]2218name = "signature"2077name = "signature"2219version = "1.6.4"2078version = "2.2.0"2220source = "registry+https://github.com/rust-lang/crates.io-index"2079source = "registry+https://github.com/rust-lang/crates.io-index"2221checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c"2080checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"2222dependencies = [2081dependencies = [2223 "digest 0.10.7",2082 "digest",2224 "rand_core 0.6.4",2083 "rand_core",2225]2084]222620852227[[package]]2086[[package]]223520942236[[package]]2095[[package]]2237name = "smallvec"2096name = "smallvec"2238version = "1.11.2"2097version = "1.13.1"2239source = "registry+https://github.com/rust-lang/crates.io-index"2098source = "registry+https://github.com/rust-lang/crates.io-index"2240checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"2099checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"224121002242[[package]]2101[[package]]2243name = "smol_str"2102name = "smol_str"226621252267[[package]]2126[[package]]2268name = "spki"2127name = "spki"2269version = "0.6.0"2128version = "0.7.3"2270source = "registry+https://github.com/rust-lang/crates.io-index"2129source = "registry+https://github.com/rust-lang/crates.io-index"2271checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b"2130checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"2272dependencies = [2131dependencies = [2273 "base64ct",2132 "base64ct",2274 "der",2133 "der",2280source = "registry+https://github.com/rust-lang/crates.io-index"2139source = "registry+https://github.com/rust-lang/crates.io-index"2281checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"2140checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"21412142[[package]]2143name = "strsim"2144version = "0.11.0"2145source = "registry+https://github.com/rust-lang/crates.io-index"2146checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01"228221472283[[package]]2148[[package]]2284name = "subtle"2149name = "subtle"228821532289[[package]]2154[[package]]2290name = "supports-color"2155name = "supports-color"2291version = "1.3.1"2156version = "2.1.0"2292source = "registry+https://github.com/rust-lang/crates.io-index"2157source = "registry+https://github.com/rust-lang/crates.io-index"2293checksum = "8ba6faf2ca7ee42fdd458f4347ae0a9bd6bcc445ad7cb57ad82b383f18870d6f"2158checksum = "d6398cde53adc3c4557306a96ce67b302968513830a77a95b2b17305d9719a89"2294dependencies = [2159dependencies = [2295 "atty",2160 "is-terminal",2296 "is_ci",2161 "is_ci",2297]2162]22982163230921742310[[package]]2175[[package]]2311name = "syn"2176name = "syn"2312version = "2.0.48"2177version = "2.0.49"2313source = "registry+https://github.com/rust-lang/crates.io-index"2178source = "registry+https://github.com/rust-lang/crates.io-index"2314checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"2179checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496"2315dependencies = [2180dependencies = [2316 "proc-macro2",2181 "proc-macro2",2317 "quote",2182 "quote",232021852321[[package]]2186[[package]]2322name = "tabled"2187name = "tabled"2323version = "0.14.0"2188version = "0.15.0"2324source = "registry+https://github.com/rust-lang/crates.io-index"2189source = "registry+https://github.com/rust-lang/crates.io-index"2325checksum = "dfe9c3632da101aba5131ed63f9eed38665f8b3c68703a6bb18124835c1a5d22"2190checksum = "4c998b0c8b921495196a48aabaf1901ff28be0760136e31604f7967b0792050e"2326dependencies = [2191dependencies = [2327 "ansi-str",2328 "ansitok",2329 "papergrid",2192 "papergrid",2330 "tabled_derive",2193 "tabled_derive",2331 "unicode-width",2194 "unicode-width",2332]2195]233321962334[[package]]2197[[package]]2335name = "tabled_derive"2198name = "tabled_derive"2336version = "0.6.0"2199version = "0.7.0"2337source = "registry+https://github.com/rust-lang/crates.io-index"2200source = "registry+https://github.com/rust-lang/crates.io-index"2338checksum = "99f688a08b54f4f02f0a3c382aefdb7884d3d69609f785bd253dc033243e3fe4"2201checksum = "4c138f99377e5d653a371cdad263615634cfc8467685dfe8e73e2b8e98f44b17"2339dependencies = [2202dependencies = [2340 "heck",2203 "heck",2341 "proc-macro-error",2204 "proc-macro-error",234622092347[[package]]2210[[package]]2348name = "tempfile"2211name = "tempfile"2349version = "3.9.0"2212version = "3.10.0"2350source = "registry+https://github.com/rust-lang/crates.io-index"2213source = "registry+https://github.com/rust-lang/crates.io-index"2351checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa"2214checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67"2352dependencies = [2215dependencies = [2353 "cfg-if",2216 "cfg-if",2354 "fastrand",2217 "fastrand",2355 "redox_syscall",2356 "rustix",2218 "rustix",2357 "windows-sys 0.52.0",2219 "windows-sys 0.52.0",2358]2220]23592360[[package]]2361name = "termcolor"2362version = "1.4.0"2363source = "registry+https://github.com/rust-lang/crates.io-index"2364checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449"2365dependencies = [2366 "winapi-util",2367]236822212369[[package]]2222[[package]]2370name = "terminal_size"2223name = "terminal_size"238422372385[[package]]2238[[package]]2386name = "thiserror"2239name = "thiserror"2387version = "1.0.53"2240version = "1.0.57"2388source = "registry+https://github.com/rust-lang/crates.io-index"2241source = "registry+https://github.com/rust-lang/crates.io-index"2389checksum = "b2cd5904763bad08ad5513ddbb12cf2ae273ca53fa9f68e843e236ec6dfccc09"2242checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b"2390dependencies = [2243dependencies = [2391 "thiserror-impl",2244 "thiserror-impl",2392]2245]239322462394[[package]]2247[[package]]2395name = "thiserror-impl"2248name = "thiserror-impl"2396version = "1.0.53"2249version = "1.0.57"2397source = "registry+https://github.com/rust-lang/crates.io-index"2250source = "registry+https://github.com/rust-lang/crates.io-index"2398checksum = "3dcf4a824cce0aeacd6f38ae6f24234c8e80d68632338ebaa1443b5df9e29e19"2251checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"2399dependencies = [2252dependencies = [2400 "proc-macro2",2253 "proc-macro2",2401 "quote",2254 "quote",2402 "syn 2.0.48",2255 "syn 2.0.49",2403]2256]240422572405[[package]]2258[[package]]241422672415[[package]]2268[[package]]2416name = "time"2269name = "time"2417version = "0.3.31"2270version = "0.3.34"2418source = "registry+https://github.com/rust-lang/crates.io-index"2271source = "registry+https://github.com/rust-lang/crates.io-index"2419checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e"2272checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749"2420dependencies = [2273dependencies = [2421 "deranged",2274 "deranged",2275 "num-conv",2422 "powerfmt",2276 "powerfmt",2423 "serde",2277 "serde",2424 "time-core",2278 "time-core",243322872434[[package]]2288[[package]]2435name = "time-macros"2289name = "time-macros"2436version = "0.2.16"2290version = "0.2.17"2437source = "registry+https://github.com/rust-lang/crates.io-index"2291source = "registry+https://github.com/rust-lang/crates.io-index"2438checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f"2292checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774"2439dependencies = [2293dependencies = [2294 "num-conv",2440 "time-core",2295 "time-core",2441]2296]24422297245123062452[[package]]2307[[package]]2453name = "tokio"2308name = "tokio"2454version = "1.35.1"2309version = "1.36.0"2455source = "registry+https://github.com/rust-lang/crates.io-index"2310source = "registry+https://github.com/rust-lang/crates.io-index"2456checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"2311checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931"2457dependencies = [2312dependencies = [2458 "backtrace",2313 "backtrace",2459 "bytes",2314 "bytes",2475dependencies = [2330dependencies = [2476 "proc-macro2",2331 "proc-macro2",2477 "quote",2332 "quote",2478 "syn 2.0.48",2333 "syn 2.0.49",2479]2334]248023352481[[package]]2336[[package]]251323682514[[package]]2369[[package]]2515name = "toml"2370name = "toml"2516version = "0.8.8"2371version = "0.8.10"2517source = "registry+https://github.com/rust-lang/crates.io-index"2372source = "registry+https://github.com/rust-lang/crates.io-index"2518checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35"2373checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290"2519dependencies = [2374dependencies = [2520 "serde",2375 "serde",2521 "serde_spanned",2376 "serde_spanned",253423892535[[package]]2390[[package]]2536name = "toml_edit"2391name = "toml_edit"2537version = "0.21.0"2392version = "0.22.6"2538source = "registry+https://github.com/rust-lang/crates.io-index"2393source = "registry+https://github.com/rust-lang/crates.io-index"2539checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03"2394checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6"2540dependencies = [2395dependencies = [2541 "indexmap",2396 "indexmap",2542 "serde",2397 "serde",2564dependencies = [2419dependencies = [2565 "proc-macro2",2420 "proc-macro2",2566 "quote",2421 "quote",2567 "syn 2.0.48",2422 "syn 2.0.49",2568]2423]256924242570[[package]]2425[[package]]2716 "itoa",2571 "itoa",2717 "log",2572 "log",2718 "unicode-width",2573 "unicode-width",2719 "vte 0.11.1",2574 "vte",2720]2575]27212722[[package]]2723name = "vte"2724version = "0.10.1"2725source = "registry+https://github.com/rust-lang/crates.io-index"2726checksum = "6cbce692ab4ca2f1f3047fcf732430249c0e971bfdd2b234cf2c47ad93af5983"2727dependencies = [2728 "arrayvec 0.5.2",2729 "utf8parse",2730 "vte_generate_state_changes",2731]273225762733[[package]]2577[[package]]2734name = "vte"2578name = "vte"2735version = "0.11.1"2579version = "0.11.1"2736source = "registry+https://github.com/rust-lang/crates.io-index"2580source = "registry+https://github.com/rust-lang/crates.io-index"2737checksum = "f5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197"2581checksum = "f5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197"2738dependencies = [2582dependencies = [2739 "arrayvec 0.7.4",2583 "arrayvec",2740 "utf8parse",2584 "utf8parse",2741 "vte_generate_state_changes",2585 "vte_generate_state_changes",2742]2586]2761 "winapi-util",2605 "winapi-util",2762]2606]27632764[[package]]2765name = "wasi"2766version = "0.9.0+wasi-snapshot-preview1"2767source = "registry+https://github.com/rust-lang/crates.io-index"2768checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"276926072770[[package]]2608[[package]]2771name = "wasi"2609name = "wasi"277526132776[[package]]2614[[package]]2777name = "wasm-bindgen"2615name = "wasm-bindgen"2778version = "0.2.89"2616version = "0.2.91"2779source = "registry+https://github.com/rust-lang/crates.io-index"2617source = "registry+https://github.com/rust-lang/crates.io-index"2780checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e"2618checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f"2781dependencies = [2619dependencies = [2782 "cfg-if",2620 "cfg-if",2783 "wasm-bindgen-macro",2621 "wasm-bindgen-macro",2784]2622]278526232786[[package]]2624[[package]]2787name = "wasm-bindgen-backend"2625name = "wasm-bindgen-backend"2788version = "0.2.89"2626version = "0.2.91"2789source = "registry+https://github.com/rust-lang/crates.io-index"2627source = "registry+https://github.com/rust-lang/crates.io-index"2790checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826"2628checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b"2791dependencies = [2629dependencies = [2792 "bumpalo",2630 "bumpalo",2793 "log",2631 "log",2794 "once_cell",2632 "once_cell",2795 "proc-macro2",2633 "proc-macro2",2796 "quote",2634 "quote",2797 "syn 2.0.48",2635 "syn 2.0.49",2798 "wasm-bindgen-shared",2636 "wasm-bindgen-shared",2799]2637]280026382801[[package]]2639[[package]]2802name = "wasm-bindgen-macro"2640name = "wasm-bindgen-macro"2803version = "0.2.89"2641version = "0.2.91"2804source = "registry+https://github.com/rust-lang/crates.io-index"2642source = "registry+https://github.com/rust-lang/crates.io-index"2805checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2"2643checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed"2806dependencies = [2644dependencies = [2807 "quote",2645 "quote",2808 "wasm-bindgen-macro-support",2646 "wasm-bindgen-macro-support",2809]2647]281026482811[[package]]2649[[package]]2812name = "wasm-bindgen-macro-support"2650name = "wasm-bindgen-macro-support"2813version = "0.2.89"2651version = "0.2.91"2814source = "registry+https://github.com/rust-lang/crates.io-index"2652source = "registry+https://github.com/rust-lang/crates.io-index"2815checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"2653checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66"2816dependencies = [2654dependencies = [2817 "proc-macro2",2655 "proc-macro2",2818 "quote",2656 "quote",2819 "syn 2.0.48",2657 "syn 2.0.49",2820 "wasm-bindgen-backend",2658 "wasm-bindgen-backend",2821 "wasm-bindgen-shared",2659 "wasm-bindgen-shared",2822]2660]282326612824[[package]]2662[[package]]2825name = "wasm-bindgen-shared"2663name = "wasm-bindgen-shared"2826version = "0.2.89"2664version = "0.2.91"2827source = "registry+https://github.com/rust-lang/crates.io-index"2665source = "registry+https://github.com/rust-lang/crates.io-index"2828checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f"2666checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838"282926672830[[package]]2668[[package]]2831name = "winapi"2669name = "winapi"2867 "windows-targets 0.52.0",2705 "windows-targets 0.52.0",2868]2706]28692870[[package]]2871name = "windows-sys"2872version = "0.45.0"2873source = "registry+https://github.com/rust-lang/crates.io-index"2874checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"2875dependencies = [2876 "windows-targets 0.42.2",2877]287827072879[[package]]2708[[package]]2880name = "windows-sys"2709name = "windows-sys"2894 "windows-targets 0.52.0",2723 "windows-targets 0.52.0",2895]2724]28962897[[package]]2898name = "windows-targets"2899version = "0.42.2"2900source = "registry+https://github.com/rust-lang/crates.io-index"2901checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"2902dependencies = [2903 "windows_aarch64_gnullvm 0.42.2",2904 "windows_aarch64_msvc 0.42.2",2905 "windows_i686_gnu 0.42.2",2906 "windows_i686_msvc 0.42.2",2907 "windows_x86_64_gnu 0.42.2",2908 "windows_x86_64_gnullvm 0.42.2",2909 "windows_x86_64_msvc 0.42.2",2910]291127252912[[package]]2726[[package]]2913name = "windows-targets"2727name = "windows-targets"2939 "windows_x86_64_msvc 0.52.0",2753 "windows_x86_64_msvc 0.52.0",2940]2754]29412942[[package]]2943name = "windows_aarch64_gnullvm"2944version = "0.42.2"2945source = "registry+https://github.com/rust-lang/crates.io-index"2946checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"294727552948[[package]]2756[[package]]2949name = "windows_aarch64_gnullvm"2757name = "windows_aarch64_gnullvm"2957source = "registry+https://github.com/rust-lang/crates.io-index"2765source = "registry+https://github.com/rust-lang/crates.io-index"2958checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"2766checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"29592960[[package]]2961name = "windows_aarch64_msvc"2962version = "0.42.2"2963source = "registry+https://github.com/rust-lang/crates.io-index"2964checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"296527672966[[package]]2768[[package]]2967name = "windows_aarch64_msvc"2769name = "windows_aarch64_msvc"2975source = "registry+https://github.com/rust-lang/crates.io-index"2777source = "registry+https://github.com/rust-lang/crates.io-index"2976checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"2778checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"29772978[[package]]2979name = "windows_i686_gnu"2980version = "0.42.2"2981source = "registry+https://github.com/rust-lang/crates.io-index"2982checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"298327792984[[package]]2780[[package]]2985name = "windows_i686_gnu"2781name = "windows_i686_gnu"2993source = "registry+https://github.com/rust-lang/crates.io-index"2789source = "registry+https://github.com/rust-lang/crates.io-index"2994checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"2790checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"29952996[[package]]2997name = "windows_i686_msvc"2998version = "0.42.2"2999source = "registry+https://github.com/rust-lang/crates.io-index"3000checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"300127913002[[package]]2792[[package]]3003name = "windows_i686_msvc"2793name = "windows_i686_msvc"3011source = "registry+https://github.com/rust-lang/crates.io-index"2801source = "registry+https://github.com/rust-lang/crates.io-index"3012checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"2802checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"30133014[[package]]3015name = "windows_x86_64_gnu"3016version = "0.42.2"3017source = "registry+https://github.com/rust-lang/crates.io-index"3018checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"301928033020[[package]]2804[[package]]3021name = "windows_x86_64_gnu"2805name = "windows_x86_64_gnu"3029source = "registry+https://github.com/rust-lang/crates.io-index"2813source = "registry+https://github.com/rust-lang/crates.io-index"3030checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"2814checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"30313032[[package]]3033name = "windows_x86_64_gnullvm"3034version = "0.42.2"3035source = "registry+https://github.com/rust-lang/crates.io-index"3036checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"303728153038[[package]]2816[[package]]3039name = "windows_x86_64_gnullvm"2817name = "windows_x86_64_gnullvm"3047source = "registry+https://github.com/rust-lang/crates.io-index"2825source = "registry+https://github.com/rust-lang/crates.io-index"3048checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"2826checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"30493050[[package]]3051name = "windows_x86_64_msvc"3052version = "0.42.2"3053source = "registry+https://github.com/rust-lang/crates.io-index"3054checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"305528273056[[package]]2828[[package]]3057name = "windows_x86_64_msvc"2829name = "windows_x86_64_msvc"306728393068[[package]]2840[[package]]3069name = "winnow"2841name = "winnow"3070version = "0.5.31"2842version = "0.6.1"3071source = "registry+https://github.com/rust-lang/crates.io-index"2843source = "registry+https://github.com/rust-lang/crates.io-index"3072checksum = "97a4882e6b134d6c28953a387571f1acdd3496830d5e36c5e3a1075580ea641c"2844checksum = "d90f4e0f530c4c69f62b80d839e9ef3855edc9cba471a160c4d692deed62b401"3073dependencies = [2845dependencies = [3074 "memchr",2846 "memchr",3075]2847]307628483077[[package]]2849[[package]]3078name = "x25519-dalek"2850name = "x25519-dalek"3079version = "1.1.1"2851version = "2.0.1"3080source = "registry+https://github.com/rust-lang/crates.io-index"2852source = "registry+https://github.com/rust-lang/crates.io-index"3081checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f"2853checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277"3082dependencies = [2854dependencies = [3083 "curve25519-dalek",2855 "curve25519-dalek",3084 "rand_core 0.5.1",2856 "rand_core",2857 "serde",3085 "zeroize",2858 "zeroize",3086]2859]308728603108dependencies = [2881dependencies = [3109 "proc-macro2",2882 "proc-macro2",3110 "quote",2883 "quote",3111 "syn 2.0.48",2884 "syn 2.0.49",3112]2885]31132886Cargo.tomldiffbeforeafterboth6nixlike = { path = "./crates/nixlike" }6nixlike = { path = "./crates/nixlike" }7better-command = { path = "./crates/better-command" }7better-command = { path = "./crates/better-command" }8bifrostlink = "0.1.0"8bifrostlink = "0.1.0"9uuid = { version = "1.3.3", features = ["v4"] }9uuid = { version = "1.7.0", features = ["v4"] }10tokio = { version = "1.33.0", features = ["fs", "rt", "macros", "sync", "time", "rt-multi-thread"] }10tokio = { version = "1.36.0", features = ["fs", "rt", "macros", "sync", "time", "rt-multi-thread"] }1111README.adocdiffbeforeafterboth12- Secrets can be securely stored in Git (No one except target hosts can decrypt them), automatically regenerated, reencrypted, etc.12- Secrets can be securely stored in Git (No one except target hosts can decrypt them), automatically regenerated, reencrypted, etc.13- Automatic rollback on deployment failure, which will work, as long as system is passing initrd stage (So still be carefull with root filesystem mount)13- Automatic rollback on deployment failure, which will work, as long as system is passing initrd stage (So still be carefull with root filesystem mount)1415== Secret generator example1617TODO:: This section should into some kind of fleet documentation... But as there is none, it is just left here as-is.1819=== Quickly run securely setup gitlab2021[source,nix]22----23{config, ...}: {24 secrets = let ownership = { owner = "gitlab"; group = "gitlab"; }; in {25 gitlab-initial-root = {26 generator = {mkPassword}: mkPassword {};27 } // ownership;28 gitlab-secret = {29 generator = {mkPassword}: mkPassword {};30 } // ownership;31 gitlab-otp = {32 generator = {mkPassword}: mkPassword {};33 } // ownership;34 gitlab-db = {35 generator = {mkPassword}: mkPassword {};36 } // ownership;37 gitlab-jws = {38 generator = {mkRsa}: mkRsa {};39 } // ownership;40 };41 services.gitlab = let secrets = config.secrets; in {42 enable = true;43 initialRootPasswordFile = secrets.gitlab-initial-root.secretPath;44 secrets = {45 secretFile = secrets.gitlab-secret.secretPath;46 otpFile = secrets.gitlab-otp.secretPath;47 dbFile = secrets.gitlab-db.secretPath;48 jwsFile = secrets.gitlab-jws.secretPath;49 };50 };51}52----5354=== Securely initialize kubernetes secrets5556In my homelab and clusters, I almost always have some sort of HSM, and to issue new kubernetes certs I directly connect to it.57This setup should probably split into multiple steps, where I allow target machine to generate CSR, then copy it to the HSM machine, and then sign it there... But this is just the plan.58I want to build ansible-like script execution in fleet for this kind of tasks.5960[source,nix]61----62{...}: {63 # First I define required secret generators:64 nixpkgs.overlays = [65 (final: prev: let66 lib = final.lib;67 in {68 readKubernetesCa = {impureOn}:69 final.mkImpureSecretGenerator ''70 cd ~/ca7172 cert=kubernetes-intermediateCA.crt7374 expires_at=$(openssl x509 -in $cert -noout -enddate | cut -d= -f2 | xargs -I{} date -u -d {} +"%Y-%m-%dT%H:%M:%S.%NZ")75 echo -n $expires_at > $out/expires_at7677 cat $cert > $out/public78 ''79 impureOn;80 mkKubernetesCert = {81 subj,82 sans ? [],83 impureOn,84 }:85 final.mkImpureSecretGenerator ''86 cd ~/ca8788 params=$(sudo mktemp)89 csr=$(sudo mktemp)90 cert=$(sudo mktemp)91 sudo openssl ecparam -genkey -name secp384r1 -out $params92 sudo openssl req -new -key $params \93 -subj "${lib.strings.concatStringsSep "" (lib.attrsets.mapAttrsToList (k: v: "/${k}=${v}") subj)}" \94 ${lib.optionalString (sans != []) "-addext \"subjectAltName = ${lib.strings.concatStringsSep "," sans}\""} \95 -out $csr96 sudo hsms x509 -req -days 365 -in $csr -CA kubernetes-intermediateCA.crt -CAkey "pkcs11:object=[CENSORED] Kubernetes Intermediate CA;type=private" -CAcreateserial -copy_extensions copy -out $cert9798 expires_at=$(sudo openssl x509 -in $cert -noout -enddate | cut -d= -f2 | xargs -I{} date -u -d {} +"%Y-%m-%dT%H:%M:%S.%NZ")99 echo -n $expires_at > $out/expires_at100101 sudo cat $params | encrypt > $out/secret102 sudo cat $cert > $out/public103 ''104 impureOn;105 })106 ];107 # Those secret generators are impure, thus they are run in system environment.108 # Probably there needs to be a dedicated user for that kind of tasks, but this is my current setup, don't judge.109 # I write a couple of scripts for executing openssl with HSM.110 environment.systemPackages = [111 pkgs.openssl.bin112 (pkgs.writeShellApplication {113 name = "hsms";114 text = ''115 set -eu116 export OPENSSL_CONF=${openssl-conf}117 # Yay, using secrets to generate secrets!118 HSM_PIN=$(cat ${config.secrets.hsm-pin.secretPath})119 exec ${pkgs.openssl}/bin/openssl "$@" -keyform=engine -CAkeyform=engine -engine=pkcs11 -passin=pass:"$HSM_PIN"120 '';121 })122 (pkgs.writeShellApplication {123 name = "hsmt";124 text = ''125 set -eu126 HSM_PIN=$(cat ${config.secrets.hsm-pin.secretPath})127 exec ${pkgs.opensc}/bin/pkcs11-tool -l --pin="$HSM_PIN" "$@"128 '';129 })130 ];131 # And finally, I have secrets, which are shared between machines.132 # Note that this example is somewhat wrong, as this goes not into the machine configuration, but to fleet configuration.133 sharedSecrets = {134 "ca.pem" = {135 # This is just the public key, no need to regenerate it to change owner list136 regenerateOnOwnerAdded = false;137 # For secret regeneration/reencryption, we need to specify which machines SHOULD have it.138 expectedOwners = ["controlplane-1" "controlplane-2" "worker-1" "worker-2"];139 generator = {readKubernetesCa}:140 readKubernetesCa {141 impureOn = "[CENSORED]";142 };143 };144 "kube-admin.pem" = {145 regenerateOnOwnerAdded = false;146 expectedOwners = ["cluster-admin"];147 generator = {mkKubernetesCert}:148 mkKubernetesCert {149 subj = {150 CN = "admin";151 O = "system:masters";152 };153 impureOn = "[CENSORED]";154 };155 };156 "kube-apiserver.pem" = {157 # This secret depends on machine SANS, so if owner list has been changed, then we need to regenerate it.158 # However, SANS dependency is in fact handled by secret seed, and secret is regenerated if the seed is changed...159 #160 # In this case regeneration is added as a half-assed security measure, as if apiserver is removed, we don't161 # want for it to be able to pretend like it is a valid server.162 #163 # However, certificate revokation is complicated in my setup, and I can't show it here.164 regenerateOnOwnerAdded = true;165 expectedOwners = ["controlplane-1" "controlplane-2"];166 generator = {mkKubernetesCert}:167 mkKubernetesCert {168 inherit sans;169 subj.CN = "kubernetes";170 impureOn = "[CENSORED]";171 };172 };173}174----14175cmds/fleet/Cargo.tomldiffbeforeafterboth12anyhow = "1.0"12anyhow = "1.0"13serde = { version = "1.0", features = ["derive"] }13serde = { version = "1.0", features = ["derive"] }14serde_json = "1.0"14serde_json = "1.0"15time = { version = "0.3.30", features = ["serde"] }15time = { version = "0.3", features = ["serde"] }16tempfile = "3.8"16tempfile = "3.10"17once_cell = "1.18.0"17once_cell = "1.19"18hostname = "0.3.1"18hostname = "0.3"19age-core = "0.9.0"19age-core = "0.10"20peg = "0.8.2"20peg = "0.8"21age = { version = "0.9.2", features = ["ssh", "armor"] }21age = { version = "0.10", features = ["ssh", "armor"] }22base64 = "0.21.5"22base64 = "0.21"23chrono = { version = "0.4.31", features = ["serde"] }23chrono = { version = "0.4", features = ["serde"] }24z85 = "3.0.5"24z85 = "3.0"25clap = { version = "4.4.7", features = [25clap = { version = "4.5", features = [26 "derive",26 "derive",27 "env",27 "env",28 "wrap_help",28 "wrap_help",29 "unicode",29 "unicode",30] }30] }31tracing = "0.1"31tracing = "0.1"32tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] }32tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] }33tokio-util = { version = "0.7.10", features = ["codec"] }33tokio-util = { version = "0.7", features = ["codec"] }34async-trait = "0.1.74"34async-trait = "0.1"35futures = "0.3.29"35futures = "0.3"36tracing-indicatif = "0.3.5"36tracing-indicatif = "0.3"37indicatif = "0.17.7"37indicatif = "0.17"38itertools = "0.11.0"38itertools = "0.12"39shlex = "1.2.0"39shlex = "1.3"40tabled = { version = "0.14.0", features = ["color"] }40tabled = { version = "0.15" }41owo-colors = { version = "3.5.0", features = ["supports-color", "supports-colors"] }41owo-colors = { version = "4.0", features = ["supports-color", "supports-colors"] }42r2d2 = "0.8.10"42r2d2 = "0.8.10"43abort-on-drop = "0.2.2"43abort-on-drop = "0.2"44unindent = "0.2.3"44unindent = "0.2"45regex = "1.10.2"45regex = "1.10"46openssh = "0.10.1"46openssh = "0.10"47human-repr = "1.1.0"47human-repr = "1.1"4848cmds/fleet/src/cmds/secrets/mod.rsdiffbeforeafterboth1use crate::{1use crate::{2 better_nix_eval::Field,2 better_nix_eval::Field,3 command::MyCommand,3 fleetdata::{FleetSecret, FleetSharedSecret, SecretData},4 fleetdata::{FleetSecret, FleetSharedSecret, SecretData},4 host::Config,5 host::Config,5 nix_go, nix_go_json,6 nix_go, nix_go_json,8use chrono::{DateTime, Utc};9use chrono::{DateTime, Utc};9use clap::Parser;10use clap::Parser;10use owo_colors::OwoColorize;11use owo_colors::OwoColorize;11use serde::Deserialize;12use serde::{de::DeserializeOwned, Deserialize};12use std::{13use std::{13 collections::{BTreeSet, HashSet},14 collections::{BTreeSet, HashSet},14 io::{self, Cursor, Read},15 io::{self, Cursor, Read},15 path::PathBuf,16 path::{Path, PathBuf},17 str::FromStr,16};18};17use tabled::{Table, Tabled};19use tabled::{Table, Tabled};20use tempfile::tempdir;18use tokio::fs::read_to_string;21use tokio::fs::{self, read_to_string};19use tracing::{error, info, info_span, warn, Instrument};22use tracing::{error, info, info_span, warn, Instrument};202321#[derive(Parser)]24#[derive(Parser)]67 #[clap(long)]70 #[clap(long)]68 plaintext: bool,71 plaintext: bool,69 },72 },73 ReadPublic {74 name: String,75 machine: String,76 },70 UpdateShared {77 UpdateShared {71 name: String,78 name: String,7279151#[serde(rename_all = "camelCase")]158#[serde(rename_all = "camelCase")]152enum GeneratorKind {159enum GeneratorKind {153 Impure,160 Impure,161 Pure,154}162}155163164async fn generate_pure(165 config: &Config,166 _display_name: &str,167 secret: Field,168 default_generator: Field,169 owners: &[String],170) -> Result<FleetSecret> {171 // TODO: pure secrets are supposed to be generated by nix daemon itself,172 // inside of a sandbox... But we aren't here yet.173 let config_field = &config.config_unchecked_field;174 let generator = nix_go!(secret.generator);175 let default_pkgs = &config.default_pkgs;176177 let call_package = nix_go!(default_pkgs.callPackage);178179 let generator = nix_go!(call_package(generator)(Obj {}));180 let generator = generator.build().await?;181 let generator = generator182 .get("out")183 .ok_or_else(|| anyhow!("missing generate out"))?;184185 let mut recipients = String::new();186 for owner in owners {187 let key = config.key(owner).await?;188 recipients.push_str(&format!("-r \"{key}\" "));189 }190 recipients.push_str("-e");191192 let out = tempdir()?;193194 let mut gen = MyCommand::new(generator);195 gen.env("rageArgs", recipients);196 gen.env(197 "out",198 out.path().to_str().expect("sane tempdir should be utf-8"),199 );200 gen.run().await.context("impure generator")?;201202 {203 let mut marker_path = out.path().to_owned();204 marker_path.push("marker");205 let marker = fs::read_to_string(&marker_path).await?;206 ensure!(marker == "SUCCESS", "generation not succeeded");207 }208209 let mut public_path = out.path().to_owned();210 public_path.push("public");211 let mut secret_path = out.path().to_owned();212 secret_path.push("secret");213 let public = fs::read_to_string(&public_path).await.ok();214 let secret = fs::read(&secret_path).await.ok();215 if let Some(secret) = &secret {216 ensure!(217 age::Decryptor::new(Cursor::new(&secret)).is_ok(),218 "builder produced non-encrypted value as secret, this is highly insecure, and not allowed."219 );220 }221222 let mut created_at_path = out.path().to_owned();223 created_at_path.push("created_at");224 let mut expires_at_path = out.path().to_owned();225 expires_at_path.push("expires_at");226227 async fn read_value<T: FromStr>(path: &Path) -> Result<T> {228 dbg!(path);229 let raw = fs::read(path).await?;230 let raw = String::from_utf8(raw)?;231 raw.parse().map_err(|_| anyhow!("fromStr failed"))232 }233234 let created_at = read_value(&created_at_path).await?;235 let expires_at = read_value(&expires_at_path).await.ok();236237 Ok(FleetSecret {238 created_at,239 expires_at,240 public,241 secret: secret.map(SecretData),242 })243}156async fn generate_impure(244async fn generate_impure(157 config: &Config,245 config: &Config,158 _display_name: &str,246 _display_name: &str,254 GeneratorKind::Impure => {342 GeneratorKind::Impure => {255 generate_impure(config, display_name, secret, default_generator, owners).await343 generate_impure(config, display_name, secret, default_generator, owners).await256 }344 }345 GeneratorKind::Pure => {346 generate_pure(config, display_name, secret, default_generator, owners).await347 }257 }348 }258}349}259async fn generate_shared(350async fn generate_shared(357 expires_at,448 expires_at,358 re_add,449 re_add,359 } => {450 } => {451 // TODO: Forbid updating secrets with set expectedOwners (= not user-managed).452360 let exists = config.has_shared(&name);453 let exists = config.has_shared(&name);361 if exists && !force && !re_add {454 if exists && !force && !re_add {456 println!("{}", z85::encode(&data));549 println!("{}", z85::encode(&data));457 }550 }458 }551 }552 Secret::ReadPublic {553 name,554 machine,555 } => {556 let secret = config.host_secret(&machine, &name)?;557 let Some(public) = secret.public else {558 bail!("no secret {name}");559 };560 print!("{public}");561 }459 Secret::UpdateShared {562 Secret::UpdateShared {460 name,563 name,461 machines,564 machines,462 add_machines,565 add_machines,463 remove_machines,566 remove_machines,464 prefer_identities,567 prefer_identities,465 } => {568 } => {569 // TODO: Forbid updating secrets with set expectedOwners (= not user-managed).570466 let secret = config.shared_secret(&name)?;571 let secret = config.shared_secret(&name)?;467 if secret.secret.secret.is_none() {572 if secret.secret.secret.is_none() {cmds/fleet/src/main.rsdiffbeforeafterboth111112mod fleetdata;12mod fleetdata;131314use std::ffi::OsString;14use std::time::Duration;15use std::process::exit;15use std::{ffi::OsString, process::ExitCode};16use std::time::Duration;171618use anyhow::{bail, Result};17use anyhow::{bail, Result};19use clap::Parser;18use clap::Parser;62 path.push(entry.path());61 path.push(entry.path());636264 let mut status = MyCommand::new("nix");63 let mut status = MyCommand::new("nix");64 status.args(&config.nix_args);65 status.arg("store").arg("prefetch-file").arg(path);65 status.arg("store").arg("prefetch-file").arg(path);66 status.run_nix_string().instrument(span).await?;66 status.run_nix_string().instrument(span).await?;67 Ok(())67 Ok(())118 return;118 return;119 };119 };120 let pos = state.pos();120 let pos = state.pos();121 if pos > len {122 let _ = write!(writer, "{}", pos.human_count_bare());123 } else {121 let _ = write!(writer, "{} / {}", pos.human_count_bare(), len.human_count_bare());124 let _ = write!(writer, "{} / {}", pos.human_count_bare(), len.human_count_bare());125 }122 })126 })123 .with_key(127 .with_key(124 "color_start",128 "color_start",151 tracing_subscriber::fmt::layer()155 tracing_subscriber::fmt::layer()152 .without_time()156 .without_time()153 .with_target(true)157 .with_target(true)154 .with_writer(indicatif_layer.get_stderr_writer())158 .with_writer(indicatif_layer.get_stdout_writer())155 .with_filter(filter), // .withou,159 .with_filter(filter), // .withou,156 )160 )157 .with(indicatif_layer)161 .with(indicatif_layer)158 .init();162 .init();159}163}160164161#[tokio::main]165#[tokio::main]162async fn main() {166async fn main() -> ExitCode {163 setup_logging();167 setup_logging();164 if let Err(e) = main_real().await {168 if let Err(e) = main_real().await {169 // If I remove this line, the next error!() line gets eaten.170 info!("fixme: this line gets eaten by tracing-indicatif on levels info+");165 error!("{e:#}");171 error!("{e:#}");166 exit(1);172 return ExitCode::FAILURE;167 }173 }174 ExitCode::SUCCESS168}175}169176170async fn main_real() -> Result<()> {177async fn main_real() -> Result<()> {cmds/install-secrets/Cargo.tomldiffbeforeafterboth4edition = "2021"4edition = "2021"556[dependencies]6[dependencies]7age = { version = "0.9.2", features = ["ssh"] }7age = { version = "0.10.0", features = ["ssh"] }8anyhow = "1.0.75"8anyhow = "1.0.79"9env_logger = "0.10.0"9tracing-subscriber = "0.3"10log = "0.4.20"10tracing = "0.1"11nix = {version = "0.27.1", features = ["user", "fs"]}11nix = {version = "0.27.1", features = ["user", "fs"]}12serde = { version = "1.0.190", features = ["derive"] }12serde = { version = "1.0.196", features = ["derive"] }13serde_json = "1.0.107"13serde_json = "1.0.113"14clap = { version = "4.4.7", features = [14clap = { version = "4.5.1", features = [15 "derive",15 "derive",16 "env",16 "env",17 "wrap_help",17 "wrap_help",18 "unicode",18 "unicode",19] }19] }20tempfile = "3.8.1"20tempfile = "3.10.0"21z85 = "3.0.5"21z85 = "3.0.5"2222cmds/install-secrets/src/main.rsdiffbeforeafterboth2use age::{Encryptor, Identity, Recipient};2use age::{Encryptor, Identity, Recipient};3use anyhow::{anyhow, bail, Context, Result};3use anyhow::{anyhow, bail, Context, Result};4use clap::Parser;4use clap::Parser;5use log::{error, info, warn};6use nix::sys::stat::Mode;5use nix::sys::stat::Mode;7use nix::unistd::{User, Group, chown};6use nix::unistd::{chown, Group, User};8use serde::{Deserialize, Deserializer};7use serde::{Deserialize, Deserializer};9use std::fmt::{self, Display};8use std::fmt::{self, Display};10use std::fs::{self, File};9use std::fs::{self, File};14use std::path::Path;13use std::path::Path;15use std::str::{from_utf8, FromStr};14use std::str::{from_utf8, FromStr};16use std::{collections::HashMap, path::PathBuf};15use std::{collections::HashMap, path::PathBuf};16use tracing::{error, info, warn};17use tracing_subscriber::filter::LevelFilter;18use tracing_subscriber::EnvFilter;171918#[derive(Clone, Debug)]20#[derive(Clone, Debug)]19struct SecretWrapper(Vec<u8>);21struct SecretWrapper(Vec<u8>);228}230}229231230fn main() -> anyhow::Result<()> {232fn main() -> anyhow::Result<()> {233 tracing_subscriber::fmt()234 .with_env_filter(231 env_logger::Builder::new()235 EnvFilter::builder()236 .with_default_directive(LevelFilter::INFO.into())237 .from_env_lossy(),238 )232 .filter_level(log::LevelFilter::Info)239 .without_time()233 .init();240 .init();234241235 let opts = Opts::parse();242 let opts = Opts::parse();crates/better-command/Cargo.tomldiffbeforeafterboth3version = "0.1.0"3version = "0.1.0"4edition = "2021"4edition = "2021"56# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html758[dependencies]6[dependencies]9once_cell = "1.19.0"7once_cell = "1.19"10regex = "1.10.2"8regex = "1.10"11serde = { version = "1.0.193", features = ["derive"] }9serde = { version = "1.0", features = ["derive"] }12serde_json = "1.0.108"10serde_json = "1.0"13tracing = "0.1.40"11tracing = "0.1"14tracing-indicatif = "0.3.6"12tracing-indicatif = "0.3"1513crates/nixlike/Cargo.tomldiffbeforeafterboth7alejandra = {git = "https://github.com/kamadorueda/alejandra"}7alejandra = {git = "https://github.com/kamadorueda/alejandra"}8linked-hash-map = "0.5.6"8linked-hash-map = "0.5.6"9peg = "0.8.2"9peg = "0.8.2"10serde = "1.0.190"10serde = "1.0.196"11thiserror = "1.0.50"11thiserror = "1.0.57"12serde_json = "1.0.107"12serde_json = "1.0.113"13ron = "0.8.1"13ron = "0.8.1"14serde-transcode = "1.1.1"14serde-transcode = "1.1.1"1515flake.lockdiffbeforeafterboth5 "systems": "systems"5 "systems": "systems"6 },6 },7 "locked": {7 "locked": {8 "lastModified": 1701680307,8 "lastModified": 1705309234,9 "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",9 "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",10 "owner": "numtide",10 "owner": "numtide",11 "repo": "flake-utils",11 "repo": "flake-utils",12 "rev": "4022d587cbbfd70fe950c1e2083a02621806a725",12 "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",13 "type": "github"13 "type": "github"14 },14 },15 "original": {15 "original": {23 "systems": "systems_2"23 "systems": "systems_2"24 },24 },25 "locked": {25 "locked": {26 "lastModified": 1681202837,26 "lastModified": 1705309234,27 "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",27 "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",28 "owner": "numtide",28 "owner": "numtide",29 "repo": "flake-utils",29 "repo": "flake-utils",30 "rev": "cfacdce06f30d2b68473a46042957675eebb3401",30 "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",31 "type": "github"31 "type": "github"32 },32 },33 "original": {33 "original": {38 },38 },39 "nixpkgs": {39 "nixpkgs": {40 "locked": {40 "locked": {41 "lastModified": 1704409229,41 "lastModified": 1708177587,42 "narHash": "sha256-Vc41cRJ3trOnocovLe0zZE35pK5Lfuo/zHk0xx3CNDY=",42 "narHash": "sha256-Tj/YV9kdC+I7V/kjrq3Bdl8z2VIHT5hiAG74s52vLgw=",43 "owner": "nixos",43 "owner": "nixos",44 "repo": "nixpkgs",44 "repo": "nixpkgs",45 "rev": "786f788914f2a6e94cedf361541894e972b8fd23",45 "rev": "3c43b81701e73452df1c080b05770407da9e16d6",46 "type": "github"46 "type": "github"47 },47 },48 "original": {48 "original": {67 ]67 ]68 },68 },69 "locked": {69 "locked": {70 "lastModified": 1704075545,70 "lastModified": 1708135817,71 "narHash": "sha256-L3zgOuVKhPjKsVLc3yTm2YJ6+BATyZBury7wnhyc8QU=",71 "narHash": "sha256-EUMO/K3+Wgh0THOLoRXhxrh6G/pQ7BlJ8No+ciy1nKA=",72 "owner": "oxalica",72 "owner": "oxalica",73 "repo": "rust-overlay",73 "repo": "rust-overlay",74 "rev": "a0df72e106322b67e9c6e591fe870380bd0da0d5",74 "rev": "c77e68d33a84ce3f9e86905c0f2ef78d5defad28",75 "type": "github"75 "type": "github"76 },76 },77 "original": {77 "original": {flake.nixdiffbeforeafterboth29 llvmPkgs = pkgs.buildPackages.llvmPackages_11;29 llvmPkgs = pkgs.buildPackages.llvmPackages_11;30 rust =30 rust =31 (pkgs.rustChannelOf {31 (pkgs.rustChannelOf {32 date = "2024-01-01";32 date = "2024-02-10";33 channel = "nightly";33 channel = "nightly";34 })34 })35 .default35 .default38 packages = (import ./pkgs) pkgs pkgs;38 packages = (import ./pkgs) pkgs pkgs;39 devShell = (pkgs.mkShell.override {stdenv = llvmPkgs.stdenv;}) {39 devShell = (pkgs.mkShell.override {stdenv = llvmPkgs.stdenv;}) {40 nativeBuildInputs = with pkgs; [40 nativeBuildInputs = with pkgs; [41 alejandra41 rust42 rust42 lld43 lld43 cargo-edit44 cargo-edit44 cargo-udeps45 cargo-udeps45 cargo-fuzz46 cargo-fuzz46 cargo-watch47 cargo-watch48 cargo-outdated474948 pkg-config50 pkg-config49 openssl51 opensslmodules/fleet/secrets.nixdiffbeforeafterboth91510 Secrets would be decrypted and stored to /run/secrets/$\{name} on owners16 Secrets would be decrypted and stored to /run/secrets/$\{name} on owners11 '';17 '';18 default = null;12 };19 };13 # TODO: Aren't those options may be just desugared to data/expectedData?20 # TODO: Aren't those options may be just desugared to data/expectedData?14 regenerateOnOwnerAdded = mkOption {21 regenerateOnOwnerAdded = mkOption {15 type = bool;22 type = bool;16 description = ''23 description = ''17 Is this secret owner-dependent, and needs to be regenerated on ownership set change, or it may be just reencrypted.24 Is this secret owner-dependent, and needs to be regenerated on ownership set change, or it may be just reencrypted.18 2519 You want to have this option set to true, when this secret contains some reference to its owners, i.e x509 SANs.26 You want to have this option set to true, when this secret contains some reference to its owners, i.e x509 SANs.20 '';27 '';21 };28 };22 regenerateOnOwnerRemoved = mkOption {29 regenerateOnOwnerRemoved = mkOption {23 default = config.regenerateOnOwnerAdded;30 default = config.regenerateOnOwnerAdded;24 type = bool;31 type = bool;25 description = ''32 description = ''26 Should this secret be removed on owner removal, or it may be just reencrypted33 Should this secret be removed on owner removal, or it may be just reencrypted27 3428 Most probably its value should be equal to regenerateOnOwnerAdded, override only if you know what are you doing.35 Most probably its value should be equal to regenerateOnOwnerAdded, override only if you know what are you doing.29 Contrary to regenerateOnOwnerAdded, you may want to set this option to false, when host permissions are revoked36 Contrary to regenerateOnOwnerAdded, you may want to set this option to false, when host permissions are revoked30 in some other way than by this secret ownership, I.e by firewall/etc.37 in some other way than by this secret ownership, I.e by firewall/etc.31 '';38 '';32 };39 };33 generator = mkOption {40 generator = mkOption {34 type = nullOr unspecified;41 type = nullOr unspecified;121 hosts = hostsToAttrs (host: {128 hosts = hostsToAttrs (host: {122 modules =129 modules = let123 let124 cleanupSecret = (secretName: v: {130 cleanupSecret = secretName: v: {125 inherit (v) public secret;131 inherit (v) public secret;126 shared = true;132 shared = true;127 });133 };128 in134 in [129 [130 {135 {134 }142 }135 ];143 ];136 });144 });145 # TODO: Should this attribute be moved to `nixpkgs.overlays`?146 overlays = [147 (final: prev: let148 lib = final.lib;149 in {150 mkPassword = {size ? 32}:151 final.mkSecretGenerator ''152 ${final.coreutils}/bin/tr -dc 'A-Za-z0-9!?%=' < /dev/random \153 | ${final.coreutils}/bin/head -c ${toString size} \154 | encrypt > $out/secret155 '';156 mkRsa = {size ? 4096}:157 final.mkSecretGenerator ''158 ${final.openssl}/bin/openssl genrsa -out rsa_private.key ${toString size}159 ${final.openssl}/bin/openssl rsa -in rsa_private.key -pubout -out rsa_public.key160161 sudo cat rsa_private.key | encrypt > $out/secret162 sudo cat rsa_public.key > $out/public163 '';164 # TODO: Move to fleet165 # TODO: Merge both generators to one with consistent options syntax?166 # Impure generator is built on local machine, then built closure is copied to remote machine,167 # and then it is ran in inpure context, so that this generator may access HSMs and other things.168 mkImpureSecretGenerator = generatorText: machine:169 (prev.writeShellScript "impureGenerator.sh" ''170 #!/bin/sh171 set -eu172173 # TODO: Provide encryption function as script passed to `callPackage generator {encrypt = ...;}`174 function encrypt() {175 eval ${final.rage}/bin/rage $rageArgs176 }177178 created_at=$(date -u +"%Y-%m-%dT%H:%M:%S.%NZ")179 echo -n $created_at > $out/created_at180181 ${generatorText}182183 echo -n SUCCESS > $out/marker184 '')185 .overrideAttrs (old: {186 passthru = {187 generatorKind = "impure";188 impureOn = machine;189 };190 });191 # TODO: Implement consistent naming192 # Pure secret generator is supposed to be run entirely by nix, using `__impure` derivation type...193 # But for now, it is ran the same way as `impureSecretGenerator`, but on the local machine.194 mkSecretGenerator = generatorText:195 (prev.writeShellScript "generator.sh" ''196 #!/bin/sh197 set -eu198 # TODO: User should create output directory by themselves.199 cd $out200201 # TODO: Provide encryption function as script passed to `callPackage generator {encrypt = ...;}`202 function encrypt() {203 eval ${final.rage}/bin/rage $rageArgs204 }205206 created_at=$(date -u +"%Y-%m-%dT%H:%M:%S.%NZ")207 echo -n $created_at > $out/created_at208209 ${generatorText}210211 echo -n SUCCESS > $out/marker212 '')213 .overrideAttrs (old: {214 passthru = {215 generatorKind = "pure";216 };217 # TODO: make nix daemon build secret, not just the script.218 # __impure = true;219 });220 })221 ];137 };222 };138}223}139224