difftreelog
refactor merge well-known endpoints into a single crate
in: trunk
36 files changed
Cargo.lockdiffbeforeafterboth352 packageslockfile v4
Might be heavy and slow!
adler2
2.0.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefaused byaead
0.6.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumef60ac202874e574ce7a7158cc8bca7313dd344322482e4fadee288bf4a306b8depends onaes
0.9.1crates.io↘ 4↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf1fc76eaeac4c9164506c466d4ffdd8ec9d0c5bf57ee97177c4d8eceb3a0e138aes-gcm
0.11.0-rc.4crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumda8c919c118108f144adecad74b425b804ad075580d605d9b33c2d6d1c62a2f8used byaho-corasick
1.1.4crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301depends onandroid_system_properties
0.1.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311depends onused byanstream
1.0.0crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28ddepends onused byanstyle
1.0.14crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000anstyle-parse
1.0.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130edepends onused byanstyle-query
1.1.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadcdepends onused byanstyle-wincon
3.0.11crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747dused byanyhow
1.0.102crates.io↘ 0↖ 12sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842cargon2
0.6.0-rc.8crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7af50940b73bf4e16c15c448a2b121c63f2d68e3e54b6a8731673cb4aa0cdff5used byasync_fn_traits
0.1.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbc58d489c5f2d2c5be31b9004cec7af25a70d23df4d8111715eee736234cf217depends onused byasync-broadcast
0.7.2crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532used byasync-channel
2.5.0crates.io↘ 4↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2async-executor
1.14.0crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812adepends onused byasync-io
2.6.0crates.io↘ 10↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fcdepends onasync-lock
3.4.2crates.io↘ 3↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311async-process
2.5.0crates.io↘ 10↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75depends onused byasync-recursion
1.1.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11depends onused byasync-signal
0.2.14crates.io↘ 10↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485depends onused byasync-task
4.7.1crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3deasync-trait
0.1.89crates.io↘ 3↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbbdepends onatomic-waker
1.1.2crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0used byautocfg
1.5.1crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53base16ct
1.0.0crates.io↘ 0↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6base64ct
1.8.3crates.io↘ 0↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06bcrypt-pbkdf
0.11.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum144e573728da132683b9488acd528274c790e07fc06ff81ee29f9d8f8b1041e0depends onused bybifrostlink
0.2.1crates.io↘ 11↖ 11sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum543bfa2ef5c739ddddbf60eaec3ab25c68d3cfa032ad58b66f948c5bc85a66e0depends onbifrostlink-macros
0.2.1crates.io↘ 3↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum68003ae545f31341d52409a6ac8ffdac6f41cf6c46d52be32ebe164b1693af03depends onbifrostlink-ports
0.2.1crates.io↘ 4↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumeaf71f5292660b64d4d30f0f43d186b15c3648acceb4b4b5fcf5880554df503ebindgen
0.69.5crates.io↘ 12↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088depends onused bybitflags
1.3.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718aused bybitflags
2.13.0crates.io↘ 0↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8blake2
0.11.0-rc.6crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum061f1a09225e328e1ffbb378d2d49923c0ca5fee19fb5ac1cc9c1e9d52b93690depends onused byblock-buffer
0.12.1crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aadepends onused byblock-padding
0.4.2crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum710f1dd022ef4e93f8a438b4ba958de7f64308434fa6a87104481645cc30068bdepends onused byblocking
1.6.2crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21used byblowfish
0.10.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum62ce3946557b35e71d1bbe07ec385073ce9eda05043f95de134eb578fcf1a298depends onused bybstr
1.12.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cabdepends onused bybumpalo
3.20.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649byteorder
1.5.0crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64bbytes
1.11.1crates.io↘ 0↖ 11sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33camino
1.2.2crates.io↘ 1↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48depends oncbc
0.2.1crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumce2dc9ee5f88d11e0beb842c88b33c8a5cf0d1329c4b19494af42b07dbfe8896depends oncc
1.2.64crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501fdepends oncexpr
0.6.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766depends onused bycfg_aliases
0.2.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724used bycfg-if
1.0.4crates.io↘ 0↖ 20sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801used bychacha20
0.10.0crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601chrono
0.4.45crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327used bycipher
0.5.2crates.io↘ 4↖ 10sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6cclang-sys
1.8.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4depends onused byclap
4.6.1crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51depends onclap_builder
4.6.0crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069fused byclap_derive
4.6.1crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9used byclap_lex
1.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9used bycmov
0.5.4crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027aused bycolorchoice
1.0.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570used byconcurrent-queue
2.5.0crates.io↘ 1↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973depends onconst-oid
0.10.2crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55ccore-foundation-sys
0.8.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888bused bycpubits
0.1.1crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06aecpufeatures
0.3.0crates.io↘ 1↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201depends oncrc32fast
1.5.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511depends onused bycrossbeam-utils
0.8.21crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28used bycrypto-bigint
0.7.3crates.io↘ 9↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum42a0d26b245348befa0c121944541476763dcc46ede886c88f9d12e1697d27c3depends oncrypto-common
0.2.2crates.io↘ 3↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453crypto-primes
0.7.2crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3633a51a39c69ebbaa4feaa694bd83d241e4093901c84a0963b19d9bb3f0cf8fdepends onused byctr
0.10.1crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbaaca1c4b237092596f64d571e9db6ce4109c4ef9742e27590f1709594461f21depends onctutils
0.4.2crates.io↘ 2↖ 10sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29edepends oncurve25519-dalek
5.0.0-rc.0crates.io↘ 8↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4f359e08ca85e7bd759e1fd933ff2bccd81864c60a8fba0e259c7f822b0924bfdepends oncurve25519-dalek-derive
0.1.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3depends onused bydata-encoding
2.11.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8used bydelegate
0.13.5crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum780eb241654bf097afb00fc5f054a09b687dad862e485fdcf8399bb056565370depends onused byder
0.8.0crates.io↘ 3↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411bderivative
2.2.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770bdepends onused bydes
0.9.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum916a94e407b54f9034d71dd748234cd1e516ced6284009906ae246f177eafe5adepends onused bydigest
0.11.3crates.io↘ 4↖ 13sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2ecdsa
0.17.0-rc.18crates.io↘ 7↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum54fb064faabbee66e1fc8e5c5a9458d4269dc2d8b638fe86a425adb2510d1a96depends oned25519
3.0.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum29fcf32e6c73d1079f83ab4d782de2d81620346a5f38c6237a86a22f8368980adepends onused byed25519-dalek
3.0.0-rc.0crates.io↘ 8↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb011170fe4f04665565b4110afef66774fe9ffff278f3eb5b81cc73d26e27d60depends oneither
1.16.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679eused byelliptic-curve
0.14.0-rc.33crates.io↘ 15↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum102d3643d30dd8b559613c5cced68317199597fffb278cdc88daa2ef7fafc935depends onendi
1.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099used byenum_dispatch
0.3.13crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumaa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecdused byenum-repr
0.2.6crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbad30c9c0fa1aaf1ae5010dab11f1117b15d35faf62cda4bbbc53b9987950f18depends onused byenumflags2
0.7.12crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecefdepends onenumflags2_derive
0.7.12crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827depends onused byequivalent
1.0.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0fused byerrno
0.3.14crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efebdepends onevent-listener
5.4.1crates.io↘ 3↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856abevent-listener-strategy
0.5.4crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93fastrand
2.4.1crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6ff
0.14.0crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma1f686ab92a9fb0eaf188f6c6c87b89490baa6fdb0db4544ba4dc47f7942489fdepends onfiat-crypto
0.3.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24find-msvc-tools
0.1.9crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582used byflate2
1.1.9crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573cdepends onused byfoldhash
0.1.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2used byfuchsia-cprng
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3baused byfutures
0.3.32crates.io↘ 7↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382ddepends onfutures-channel
0.3.32crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1ddepends onfutures-core
0.3.32crates.io↘ 0↖ 12sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1dfutures-executor
0.3.32crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbaf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579dused byfutures-io
0.3.32crates.io↘ 0↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718futures-lite
2.6.1crates.io↘ 5↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44adfutures-macro
0.3.32crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447bdepends onused byfutures-sink
0.3.32crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893futures-task
0.3.32crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393futures-util
0.3.32crates.io↘ 9↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6depends ongeneric-array
0.14.9crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2depends onused bygeneric-array
1.4.3crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc2e55f16dcf0e9c00efbe2e655ffe45fc98e7066b52bc92f8a79e64060a79351used bygetrandom
0.2.17crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0used bygetrandom
0.4.2crates.io↘ 8↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555depends onghash
0.6.0crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2eecf2d5dc9b66b732b97707a0210906b1d30523eb773193ab777c0c84b3e8d5depends onglob
0.3.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280used byglobset
0.4.18crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3used bygroup
0.14.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7fd1a1c7a5206c5b7a3f5a0d7ccd3ff85d0c8f5133d62a02680255b0004af5f4depends onused byhashbrown
0.15.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1depends onused byhashbrown
0.17.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84aused byheck
0.5.0crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55eahermit-abi
0.5.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849cused byhex
0.4.3crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70used byhex-literal
1.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume712f64ec3850b98572bffac52e2c6f282b29fe6c5fa6d42334b30be438d95c1used byhkdf
0.13.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4aaa26c720c68b866f2c96ef5c1264b3e6f473fe5d4ce61cd44bbe913e553018depends onused byhmac
0.13.0crates.io↘ 1↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863fdepends onhybrid-array
0.4.12crates.io↘ 4↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857daiana-time-zone
0.1.65crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470depends onused byiana-time-zone-haiku
0.1.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269fdepends onused byid-arena
2.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954used byindexmap
2.14.0crates.io↘ 4↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9inout
0.2.2crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4250ce6452e92010fdf7268ccc5d14faa80bb12fc741938534c58f16804e03c7depends oninternal-russh-num-bigint
0.5.0crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumae8e22120c32fb4d19ec55fba35015f57095cd95a2e3b732e44457f5915b2ee8used byis_terminal_polyfill
1.70.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695used byitertools
0.12.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569depends onused byitoa
1.0.18crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682used byjs-sys
0.3.102crates.io↘ 3↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31keccak
0.2.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aadepends onused bykem
0.3.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum01737161ba802849cfd486b5bd209d38ba4943494c249a8126005170c7621edddepends onused bylazy_static
1.5.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66felazycell
1.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55used byleb128fmt
0.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2used bylibc
0.2.186crates.io↘ 0↖ 21sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66libredox
0.1.17crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3used bylinux-raw-sys
0.12.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53used bylog
0.4.32crates.io↘ 0↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3amd5
0.8.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0used bymemchr
2.8.2crates.io↘ 0↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4memoffset
0.9.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218adepends onused byminimal-lexical
0.2.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79aused byminiz_oxide
0.8.9crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316depends onused bymio
1.2.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fdaused byml-kem
0.3.2crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5e15f3e5b957493873e396a66914e83e616b6afe335cdef7efe5c6e1216aba66used bymodule-lattice
0.2.3crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0c61b87c9683ab7cb1c6871d261ad5479b6b10ceb52c4352aaca3b5d35a8febeused bynix
0.31.3crates.io↘ 4↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3dnom
7.1.3crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4adepends onused bynon-zero-byte-slice
0.1.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum89daa1daa11c9df05d1181bcd0936d8066f8543144d77b09808eb78d65e38024depends onused bynu-ansi-term
0.50.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5depends onused bynum-bigint
0.4.6crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9depends onused bynum-integer
0.1.46crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858fdepends onnum-traits
0.2.19crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841depends ononce_cell
1.21.4crates.io↘ 0↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50once_cell_polyfill
1.70.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4feused byopenssh
0.11.6crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd534c4bfecb0ed71dea4db444a5922a294d15cf40e700548f27295e1feb0ef18depends onused byopenssh-mux-client
0.17.9crates.io↘ 10↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdf21c25c5f6a6c11cf6c54723c7b1389bfb4b5b0c17b097da274cade81d4815edepends onused byopenssh-mux-client-error
0.1.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9879168afb48a235200e30d93df320b7191568cda8621df02f145c1c0f1af95adepends onused byordered-stream
0.2.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50depends onused byp256
0.14.0-rc.10crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum41adc63effe99d48837a8cc0e6d7a77e32ae6a07f6000df466178dbc2193093edepends onp384
0.14.0-rc.10crates.io↘ 6↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9bd5333afa5ae0347f39e6a0f2c9c155da431583fd71fe5555bd0521b4ccaf02depends onp521
0.14.0-rc.10crates.io↘ 6↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma3a5297f53dc16d35909060ba3032cff7867e8809f01e273ff325579d5f0ceaedepends onpageant
0.2.1crates.io↘ 12↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4f3a5ae18f65a85c67a77d18d42d3606c07948e3c17c1e5f74852b26589e88a5depends onused bypam-client
0.5.0crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum51bd776116a7ada5ebbe31f54cdc5b1030ed7265686cf7c8a21c057a2f8dab9aused bypam-sys
1.0.0-alpha5crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumce9484729b3e52c0bacdc5191cb6a6a5f31ef4c09c5e4ab1209d3340ad9e997bdepends onused byparking
2.2.1crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dcebapassword-hash
0.6.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumaab41826031698d6ffcd9cff78ef56ef998e39dc7e5067cdfebe373842d4723bdepends onused bypaste
1.0.15crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0aused bypbkdf2
0.13.0crates.io↘ 2↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum112d82ceb8c5bf524d9af484d4e4970c9fd5a0cc15ba14ad93dccd28873b0629depends onpem-rfc7468
1.0.0crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9depends onphc
0.6.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum44dc769b75f93afdddd8c7fa12d685292ddeff1e66f7f0f3a234cf1818afe892depends onused bypin-project-lite
0.2.17crates.io↘ 0↖ 14sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cdpiper
0.2.5crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1used bypkcs1
0.8.0-rc.4crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum986d2e952779af96ea048f160fd9194e1751b4faea78bcf3ceb456efe008088eused bypkcs5
0.8.0crates.io↘ 8↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum279a91971a1d8eb1260a30938eae3be9cb67b472dffecb222fbbbe2fd2dc1453used bypkcs8
0.11.0crates.io↘ 4↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7plain
0.2.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6used bypolkit-backend
0.1.1workspace↘ 11↖ 0polling
3.11.0crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218depends onused bypoly1305
0.9.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma00baa632505d05512f48a963e16051c54fda9a95cc9acea1a4e3c90991c4a2eused bypolyval
0.7.1crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7dfc63250416fea14f5749b90725916a6c903f599d51cb635aa7a52bfd03eedeused byprettyplease
0.2.37crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62bdepends onprimefield
0.14.0-rc.11crates.io↘ 6↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb1d7e42f46a29abc16fb621a3466ee453358ebaae48a9e515f287e0af052ed8fprimeorder
0.14.0-rc.10crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7d2793f22b9b6fd11ef3ac1d59bf003c2573593e4968702341605c2748fd90bfdepends onproc-macro-crate
3.5.0crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614fdepends onproc-macro2
1.0.106crates.io↘ 1↖ 29sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934depends onused by- async-recursion
1.1.1 - async-trait
0.1.89 - bifrostlink-macros
0.2.1 - bindgen
0.69.5 - clap_derive
4.6.1 - curve25519-dalek-derive
0.1.1 - delegate
0.13.5 - derivative
2.2.0 - enum-repr
0.2.6 - enum_dispatch
0.3.13 - enumflags2_derive
0.7.12 - futures-macro
0.3.32 - prettyplease
0.2.37 - quote
1.0.45 - serde_derive
1.0.228 - serde_repr
0.1.20 - syn
1.0.109 - syn
2.0.117 - thiserror-impl
2.0.18 - tokio-macros
2.7.0 - tracing-attributes
0.1.31 - typed-builder-macro
0.23.2 - wasm-bindgen-macro-support
0.2.125 - windows-implement
0.60.2 - windows-interface
0.59.3 - wit-bindgen-rust-macro
0.51.0 - zbus_macros
5.16.0 - zvariant_derive
5.12.0 - zvariant_utils
3.4.0
- async-recursion
quote
1.0.45crates.io↘ 1↖ 28sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924depends onused by- async-recursion
1.1.1 - async-trait
0.1.89 - bifrostlink-macros
0.2.1 - bindgen
0.69.5 - clap_derive
4.6.1 - curve25519-dalek-derive
0.1.1 - delegate
0.13.5 - derivative
2.2.0 - enum-repr
0.2.6 - enum_dispatch
0.3.13 - enumflags2_derive
0.7.12 - futures-macro
0.3.32 - serde_derive
1.0.228 - serde_repr
0.1.20 - syn
1.0.109 - syn
2.0.117 - thiserror-impl
2.0.18 - tokio-macros
2.7.0 - tracing-attributes
0.1.31 - typed-builder-macro
0.23.2 - wasm-bindgen-macro
0.2.125 - wasm-bindgen-macro-support
0.2.125 - windows-implement
0.60.2 - windows-interface
0.59.3 - wit-bindgen-rust-macro
0.51.0 - zbus_macros
5.16.0 - zvariant_derive
5.12.0 - zvariant_utils
3.4.0
- async-recursion
r-efi
6.0.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bfused byrand
0.4.6crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293used byrand
0.10.1crates.io↘ 3↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207rand_core
0.3.1crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4bdepends onused byrand_core
0.4.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dcused byrand_core
0.10.1crates.io↘ 0↖ 20sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69used by- chacha20
0.10.0 - crypto-bigint
0.7.3 - crypto-common
0.2.2 - crypto-primes
0.7.2 - ed25519-dalek
3.0.0-rc.0 - elliptic-curve
0.14.0-rc.33 - ff
0.14.0 - getrandom
0.4.2 - group
0.14.0 - internal-russh-num-bigint
0.5.0 - kem
0.3.0 - ml-kem
0.3.2 - pkcs5
0.8.0 - pkcs8
0.11.0 - primefield
0.14.0-rc.11 - rand
0.10.1 - rsa
0.10.0-rc.18 - russh
0.61.2 - signature
3.0.0 - ssh-key
0.7.0-rc.10
- chacha20
rdrand
0.4.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2depends onused byredox_syscall
0.8.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5b44b894f2a6e36457d665d1e08c3866add6ed5e70050c1b4ba8a8ddedb02ce7depends onused byregex
1.12.4crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6baused byregex-automata
0.4.14crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8fused byregex-syntax
0.8.11crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4remove_dir_all
0.5.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7depends onused byremowt-agent
0.1.1workspace↘ 22↖ 0depends on- anyhow
1.0.102 - bifrostlink
0.2.1 - bifrostlink-ports
0.2.1 - clap
4.6.1 - futures
0.3.32 - futures-util
0.3.32 - nix
0.31.3 - rand
0.10.1 - remowt-link-shared
0.1.1 - remowt-plugin
0.1.1 - remowt-polkit-shared
0.1.1 - remowt-pty
0.1.1 - remowt-ui-prompt
0.1.1 - serde
1.0.228 - tempfile
3.27.0 - tokio
1.52.3 - tokio-util
0.7.18 - tracing
0.1.44 - tracing-subscriber
0.3.23 - uuid
1.23.3 - zbus
5.16.0 - zbus_polkit
5.0.0
- anyhow
remowt-fs
0.1.1workspace↘ 7↖ 1remowt-nix-daemon
0.1.1workspace↘ 10↖ 0remowt-plugin
0.1.1workspace↘ 9↖ 1remowt-pty
0.1.1workspace↘ 8↖ 2remowt-ssh
0.1.1workspace↘ 22↖ 0depends on- anyhow
1.0.102 - async-trait
0.1.89 - bifrostlink
0.2.1 - bifrostlink-ports
0.2.1 - bytes
1.11.1 - clap
4.6.1 - nix
0.31.3 - openssh
0.11.6 - remowt-client
0.1.1 - remowt-link-shared
0.1.1 - remowt-ui-prompt
0.1.1 - russh
0.61.2 - russh-config
0.58.0 - serde
1.0.228 - serde_json
1.0.150 - tempdir
0.3.7 - thiserror
2.0.18 - tokio
1.52.3 - tokio-stream
0.1.18 - tracing
0.1.44 - tracing-subscriber
0.3.23 - uuid
1.23.3
- anyhow
remowt-systemd
0.1.1workspace↘ 5↖ 1remowt-ui-prompt
0.1.1workspace↘ 8↖ 4rfc6979
0.5.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5236ce872cac07e0fb3969b0cbf468c7d2f37d432f1b627dcb7b8d34563fb0c3depends onused byring
0.17.14crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7used byrpassword
6.0.1crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2bf099a1888612545b683d2661a1940089f6c2e5a8e38979b2159da876bfd956used byrsa
0.10.0-rc.18crates.io↘ 11↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum30b2aa4ba0d89f73d1e332df05be0eeab8840351c36ca5654341dfdb57bb3cafdepends onrussh
0.61.2crates.io↘ 64↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbbf893f64684e58da8a68d56a5e84d1cf0440226274c515770fe267707a7d0b0depends on- aes
0.9.1 - bitflags
2.13.0 - block-padding
0.4.2 - byteorder
1.5.0 - bytes
1.11.1 - cbc
0.2.1 - cipher
0.5.2 - crypto-bigint
0.7.3 - ctr
0.10.1 - curve25519-dalek
5.0.0-rc.0 - data-encoding
2.11.0 - delegate
0.13.5 - der
0.8.0 - digest
0.11.3 - ecdsa
0.17.0-rc.18 - ed25519-dalek
3.0.0-rc.0 - elliptic-curve
0.14.0-rc.33 - enum_dispatch
0.3.13 - flate2
1.1.9 - futures
0.3.32 - generic-array
1.4.3 - getrandom
0.4.2 - ghash
0.6.0 - hex-literal
1.1.0 - hmac
0.13.0 - inout
0.2.2 - internal-russh-num-bigint
0.5.0 - keccak
0.2.0 - log
0.4.32 - md5
0.8.0 - ml-kem
0.3.2 - module-lattice
0.2.3 - num-bigint
0.4.6 - p256
0.14.0-rc.10 - p384
0.14.0-rc.10 - p521
0.14.0-rc.10 - pageant
0.2.1 - pbkdf2
0.13.0 - pkcs1
0.8.0-rc.4 - pkcs5
0.8.0 - pkcs8
0.11.0 - polyval
0.7.1 - rand
0.10.1 - rand_core
0.10.1 - ring
0.17.14 - rsa
0.10.0-rc.18 - russh-cryptovec
0.61.0 - russh-util
0.52.0 - salsa20
0.11.0 - scrypt
0.12.0 - sec1
0.8.1 - sha1
0.11.0 - sha2
0.11.0 - sha3
0.11.0 - signature
3.0.0 - spki
0.8.0 - ssh-encoding
0.3.0-rc.9 - ssh-key
0.7.0-rc.10 - subtle
2.6.1 - thiserror
2.0.18 - tokio
1.52.3 - typenum
1.20.1 - universal-hash
0.6.1 - zeroize
1.9.0
- aes
russh-config
0.58.0crates.io↘ 6↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum993346101d4741a59c82bafc6b645c52ce3e7b0820f13e4b5d48cdb591e3d955russh-cryptovec
0.61.0crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum443f6bbcfacb34a1aab2b12b99bf08e0c63abdc5a0db261901365df9d57fff51used byrussh-util
0.52.0crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum668424a5dde0bcb45b55ba7de8476b93831b4aa2fa6947e145f3b053e22c60b6used byrustc_version
0.4.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92depends onused byrustc-hash
1.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2used byrustix
1.1.4crates.io↘ 5↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190rustversion
1.0.22crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46dsalsa20
0.11.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2f874456e72520ff1375a06c588eaf074b0f01f9e9e1aada45bd9b7954a6e42cdepends onused byscrypt
0.12.0crates.io↘ 4↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd87af57419b594aa23fa95f09f0e06d80d84ba01c26148c43844cad6ff4485f0used bysec1
0.8.1crates.io↘ 6↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd56d437c2f19203ce5f7122e507831de96f3d2d4d3be5af44a0b0a09d8a80e4dsemver
1.0.28crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cdsendfd
0.4.4crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb183bfd5b1bc64ab0c1ef3ee06b008a9ef1b68a7d3a99ba566fbfe7a7c6d745bdepends onused byserde
1.0.228crates.io↘ 2↖ 29sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9edepends onused by- bifrostlink
0.2.1 - bstr
1.12.1 - ed25519-dalek
3.0.0-rc.0 - enumflags2
0.7.12 - indexmap
2.14.0 - non-zero-byte-slice
0.1.0 - openssh-mux-client
0.17.9 - remowt-agent
0.1.1 - remowt-client
0.1.1 - remowt-fs
0.1.1 - remowt-link-shared
0.1.1 - remowt-nix-daemon
0.1.1 - remowt-polkit-shared
0.1.1 - remowt-pty
0.1.1 - remowt-ssh
0.1.1 - remowt-systemd
0.1.1 - remowt-ui-prompt
0.1.1 - rpassword
6.0.1 - serde_json
1.0.150 - serdect
0.4.3 - ssh_format
0.14.1 - ssh_format_error
0.1.0 - wit-component
0.244.0 - wit-parser
0.244.0 - zbus
5.16.0 - zbus_names
4.3.2 - zbus_polkit
5.0.0 - zvariant
5.12.0 - zvariant_utils
3.4.0
- bifrostlink
serde_core
1.0.228crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67addepends onserde_derive
1.0.228crates.io↘ 3↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79depends onserde_json
1.0.150crates.io↘ 5↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9serde_repr
0.1.20crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59cdepends onused byserdect
0.4.3crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3edepends onused bysha1
0.11.0crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumaacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214depends onsha2
0.11.0crates.io↘ 3↖ 11sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4depends onsha3
0.11.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbe176f1a57ce4e3d31c1a166222d9768de5954f811601fb7ca06fc8203905ce1depends onused bysharded-slab
0.1.7crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6depends onused byshell-escape
0.1.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184fused byshlex
1.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64used bysignal-hook-registry
1.4.8crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1bdepends onsignature
3.0.0crates.io↘ 2↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5depends onsimd-adler32
0.3.9crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214used byslab
0.4.12crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5smallvec
1.15.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90used bysocket2
0.6.4crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51depends onused byspki
0.8.0crates.io↘ 2↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1d9efca8738c78ee9484207732f728b1ef517bbb1833d6fc0879ca898a522f6fdepends onssh_format
0.14.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum24ab31081d1c9097c327ec23550858cb5ffb4af6b866c1ef4d728455f01f3304depends onused byssh_format_error
0.1.0crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbe3c6519de7ca611f71ef7e8a56eb57aa1c818fecb5242d0a0f39c83776c210cdepends onssh-cipher
0.3.0-rc.9crates.io↘ 12↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum10db6f219196a8528f9ec904d9d45cdad692d65b0e57e72be4dedd1c5fddce36depends onused byssh-encoding
0.3.0-rc.9crates.io↘ 7↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7abf34aa716da5d5b4c496936d042ea282ab392092cd68a72ef6a8863ff8c96adepends onssh-key
0.7.0-rc.10crates.io↘ 18↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum45735ce3dea95690e4a9e414c4cfde7f79835063c3dcd35881df85a84118e74bdepends onused bystatic_assertions
1.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543fused bystrsim
0.11.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4fused bysubtle
2.6.1crates.io↘ 0↖ 13sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292syn
1.0.109crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237syn
2.0.117crates.io↘ 3↖ 25sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99used by- async-recursion
1.1.1 - async-trait
0.1.89 - bifrostlink-macros
0.2.1 - bindgen
0.69.5 - clap_derive
4.6.1 - curve25519-dalek-derive
0.1.1 - delegate
0.13.5 - enum_dispatch
0.3.13 - enumflags2_derive
0.7.12 - futures-macro
0.3.32 - prettyplease
0.2.37 - serde_derive
1.0.228 - serde_repr
0.1.20 - thiserror-impl
2.0.18 - tokio-macros
2.7.0 - tracing-attributes
0.1.31 - typed-builder-macro
0.23.2 - wasm-bindgen-macro-support
0.2.125 - windows-implement
0.60.2 - windows-interface
0.59.3 - wit-bindgen-rust
0.51.0 - wit-bindgen-rust-macro
0.51.0 - zbus_macros
5.16.0 - zvariant_derive
5.12.0 - zvariant_utils
3.4.0
- async-recursion
tempdir
0.3.7crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8depends onused bytempfile
3.27.0crates.io↘ 5↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bdthiserror
2.0.18crates.io↘ 1↖ 12sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4depends onthiserror-impl
2.0.18crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5depends onused bythread_local
1.1.9crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185depends onused bytokio
1.52.3crates.io↘ 9↖ 23sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffedepends onused by- bifrostlink
0.2.1 - bifrostlink-ports
0.2.1 - openssh
0.11.6 - openssh-mux-client
0.17.9 - pageant
0.2.1 - polkit-backend
0.1.1 - remowt-agent
0.1.1 - remowt-client
0.1.1 - remowt-fs
0.1.1 - remowt-link-shared
0.1.1 - remowt-nix-daemon
0.1.1 - remowt-plugin
0.1.1 - remowt-pty
0.1.1 - remowt-ssh
0.1.1 - remowt-ui-prompt
0.1.1 - russh
0.61.2 - russh-config
0.58.0 - russh-util
0.52.0 - sendfd
0.4.4 - tokio-io-utility
0.7.6 - tokio-stream
0.1.18 - tokio-util
0.7.18 - zbus
5.16.0
- bifrostlink
tokio-io-utility
0.7.6crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8d672654d175710e52c7c41f6aec77c62b3c0954e2a7ebce9049d1e94ed7c263depends onused bytokio-macros
2.7.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496depends onused bytokio-stream
0.1.18crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70used bytokio-util
0.7.18crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098used bytoml_datetime
1.1.1+spec-1.1.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7depends onused bytoml_edit
0.25.12+spec-1.1.0crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7used bytoml_parser
1.1.2+spec-1.1.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526depends onused bytracing
0.1.44crates.io↘ 3↖ 12sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100tracing-attributes
0.1.31crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8dadepends onused bytracing-core
0.1.36crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdb97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79adepends ontracing-log
0.2.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3used bytracing-subscriber
0.3.23crates.io↘ 6↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319depends ontyped-builder
0.23.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum31aa81521b70f94402501d848ccc0ecaa8f93c8eb6999eb9747e72287757ffdadepends onused bytyped-builder-macro
0.23.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum076a02dc54dd46795c2e9c8282ed40bcfb1e22747e955de9389a1de28190fb26depends onused bytypenum
1.20.1crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20uds_windows
1.2.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6eused byunicode-ident
1.0.24crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75unicode-xid
0.2.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853used byuniversal-hash
0.6.1crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf4987bdc12753382e0bec4a65c50738ffaabc998b9cdd1f952fb5f39b0048a96depends onuntrusted
0.9.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1used byutf8parse
0.2.2crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821uuid
1.23.3crates.io↘ 4↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7valuable
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65used byversion_check
0.9.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105aused bywasi
0.11.1+wasi-snapshot-preview1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44bused bywasip2
1.0.4+wasi-0.2.12crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487depends onused bywasip3
0.4.0+wasi-0.3.0-rc-2026-01-06crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5depends onused bywasite
0.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855bused bywasm-bindgen
0.2.125crates.io↘ 5↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1adepends onwasm-bindgen-futures
0.4.75crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280depends onused bywasm-bindgen-macro
0.2.125crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3dused bywasm-bindgen-macro-support
0.2.125crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebdused bywasm-encoder
0.244.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319depends onwasm-metadata
0.244.0crates.io↘ 4↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909wasmparser
0.244.0crates.io↘ 4↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028feweb-sys
0.3.102crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061ddepends onused bywhoami
1.6.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97ddepends onused bywinapi
0.3.9crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419winapi-i686-pc-windows-gnu
0.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6used bywinapi-x86_64-pc-windows-gnu
0.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183fused bywindows
0.62.2crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580used bywindows_aarch64_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3used bywindows_aarch64_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469used bywindows_i686_gnu
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0bused bywindows_i686_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66used bywindows_i686_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66used bywindows_x86_64_gnu
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78used bywindows_x86_64_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0dused bywindows_x86_64_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ecused bywindows-collections
0.3.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610depends onused bywindows-core
0.62.2crates.io↘ 5↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9debdepends onwindows-future
0.3.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cbused bywindows-implement
0.60.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddfdepends onused bywindows-interface
0.59.3crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358depends onused bywindows-link
0.2.1crates.io↘ 0↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5windows-numerics
0.3.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26depends onused bywindows-result
0.4.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5depends onused bywindows-strings
0.5.1crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091depends onwindows-sys
0.52.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33ddepends onused bywindows-sys
0.61.2crates.io↘ 1↖ 15sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fcdepends onwindows-targets
0.52.6crates.io↘ 8↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973depends onused bywindows-threading
0.2.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37depends onused bywinnow
1.0.3crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1depends onwit-bindgen
0.51.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5depends onwit-bindgen
0.57.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536eused bywit-bindgen-core
0.51.0crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dcdepends onwit-bindgen-rust
0.51.0crates.io↘ 8↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21depends onused bywit-bindgen-rust-macro
0.51.0crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17adepends onused bywit-component
0.244.0crates.io↘ 11↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2depends onused bywit-parser
0.244.0crates.io↘ 10↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736depends onzbus
5.16.0crates.io↘ 28↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumeee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285depends on- async-broadcast
0.7.2 - async-executor
1.14.0 - async-io
2.6.0 - async-lock
3.4.2 - async-process
2.5.0 - async-recursion
1.1.1 - async-task
4.7.1 - async-trait
0.1.89 - blocking
1.6.2 - enumflags2
0.7.12 - event-listener
5.4.1 - futures-core
0.3.32 - futures-lite
2.6.1 - hex
0.4.3 - libc
0.2.186 - ordered-stream
0.2.0 - rustix
1.1.4 - serde
1.0.228 - serde_repr
0.1.20 - tokio
1.52.3 - tracing
0.1.44 - uds_windows
1.2.1 - uuid
1.23.3 - windows-sys
0.61.2 - winnow
1.0.3 - zbus_macros
5.16.0 - zbus_names
4.3.2 - zvariant
5.12.0
- async-broadcast
zbus_macros
5.16.0crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumadf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6depends onused byzbus_names
4.3.2crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52ddepends onused byzbus_polkit
5.0.0crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumad23d5c4d198c7e2641b33e6e0d1f866f117408ba66fe80bbe52e289eeb77c52zeroize
1.9.0crates.io↘ 0↖ 20sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64eused by- aes
0.9.1 - aes-gcm
0.11.0-rc.4 - block-buffer
0.12.1 - chacha20
0.10.0 - cipher
0.5.2 - crypto-bigint
0.7.3 - curve25519-dalek
5.0.0-rc.0 - der
0.8.0 - ecdsa
0.17.0-rc.18 - ed25519-dalek
3.0.0-rc.0 - elliptic-curve
0.14.0-rc.33 - hybrid-array
0.4.12 - poly1305
0.9.0 - primefield
0.14.0-rc.11 - rsa
0.10.0-rc.18 - russh
0.61.2 - sec1
0.8.1 - ssh-cipher
0.3.0-rc.9 - ssh-encoding
0.3.0-rc.9 - ssh-key
0.7.0-rc.10
- aes
zmij
1.0.21crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaaused byzvariant
5.12.0crates.io↘ 6↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0zvariant_derive
5.12.0crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737used byzvariant_utils
3.4.0crates.io↘ 5↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6
349 packageslockfile v4
Might be heavy and slow!
adler2
2.0.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefaused byaead
0.6.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumef60ac202874e574ce7a7158cc8bca7313dd344322482e4fadee288bf4a306b8depends onaes
0.9.1crates.io↘ 4↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf1fc76eaeac4c9164506c466d4ffdd8ec9d0c5bf57ee97177c4d8eceb3a0e138aes-gcm
0.11.0-rc.4crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumda8c919c118108f144adecad74b425b804ad075580d605d9b33c2d6d1c62a2f8used byaho-corasick
1.1.4crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301depends onandroid_system_properties
0.1.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311depends onused byanstream
1.0.0crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28ddepends onused byanstyle
1.0.14crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000anstyle-parse
1.0.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130edepends onused byanstyle-query
1.1.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadcdepends onused byanstyle-wincon
3.0.11crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747dused byanyhow
1.0.102crates.io↘ 0↖ 12sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842cargon2
0.6.0-rc.8crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7af50940b73bf4e16c15c448a2b121c63f2d68e3e54b6a8731673cb4aa0cdff5used byasync_fn_traits
0.1.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbc58d489c5f2d2c5be31b9004cec7af25a70d23df4d8111715eee736234cf217depends onused byasync-broadcast
0.7.2crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532used byasync-channel
2.5.0crates.io↘ 4↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2async-executor
1.14.0crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812adepends onused byasync-io
2.6.0crates.io↘ 10↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fcdepends onasync-lock
3.4.2crates.io↘ 3↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311async-process
2.5.0crates.io↘ 10↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75depends onused byasync-recursion
1.1.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11depends onused byasync-signal
0.2.14crates.io↘ 10↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485depends onused byasync-task
4.7.1crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3deasync-trait
0.1.89crates.io↘ 3↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbbdepends onatomic-waker
1.1.2crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0used byautocfg
1.5.1crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53base16ct
1.0.0crates.io↘ 0↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6base64ct
1.8.3crates.io↘ 0↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06bcrypt-pbkdf
0.11.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum144e573728da132683b9488acd528274c790e07fc06ff81ee29f9d8f8b1041e0depends onused bybifrostlink
0.2.1crates.io↘ 11↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum543bfa2ef5c739ddddbf60eaec3ab25c68d3cfa032ad58b66f948c5bc85a66e0depends onbifrostlink-macros
0.2.1crates.io↘ 3↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum68003ae545f31341d52409a6ac8ffdac6f41cf6c46d52be32ebe164b1693af03depends onbifrostlink-ports
0.2.1crates.io↘ 4↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumeaf71f5292660b64d4d30f0f43d186b15c3648acceb4b4b5fcf5880554df503ebindgen
0.69.5crates.io↘ 12↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088depends onused bybitflags
1.3.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718aused bybitflags
2.13.0crates.io↘ 0↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8blake2
0.11.0-rc.6crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum061f1a09225e328e1ffbb378d2d49923c0ca5fee19fb5ac1cc9c1e9d52b93690depends onused byblock-buffer
0.12.1crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aadepends onused byblock-padding
0.4.2crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum710f1dd022ef4e93f8a438b4ba958de7f64308434fa6a87104481645cc30068bdepends onused byblocking
1.6.2crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21used byblowfish
0.10.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum62ce3946557b35e71d1bbe07ec385073ce9eda05043f95de134eb578fcf1a298depends onused bybstr
1.12.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cabdepends onused bybumpalo
3.20.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649byteorder
1.5.0crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64bbytes
1.11.1crates.io↘ 0↖ 11sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33camino
1.2.2crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48depends oncbc
0.2.1crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumce2dc9ee5f88d11e0beb842c88b33c8a5cf0d1329c4b19494af42b07dbfe8896depends oncc
1.2.64crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501fdepends oncexpr
0.6.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766depends onused bycfg_aliases
0.2.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724used bycfg-if
1.0.4crates.io↘ 0↖ 20sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801used bychacha20
0.10.0crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601chrono
0.4.45crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327used bycipher
0.5.2crates.io↘ 4↖ 10sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume8cf2a2c93cd704877c0858356ed03480ff301ee950b43f1cbe4573b088bfa6cclang-sys
1.8.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4depends onused byclap
4.6.1crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51depends onclap_builder
4.6.0crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069fused byclap_derive
4.6.1crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9used byclap_lex
1.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9used bycmov
0.5.4crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027aused bycolorchoice
1.0.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570used byconcurrent-queue
2.5.0crates.io↘ 1↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973depends onconst-oid
0.10.2crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55ccore-foundation-sys
0.8.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888bused bycpubits
0.1.1crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06aecpufeatures
0.3.0crates.io↘ 1↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201depends oncrc32fast
1.5.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511depends onused bycrossbeam-utils
0.8.21crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28used bycrypto-bigint
0.7.3crates.io↘ 9↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum42a0d26b245348befa0c121944541476763dcc46ede886c88f9d12e1697d27c3depends oncrypto-common
0.2.2crates.io↘ 3↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453crypto-primes
0.7.2crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3633a51a39c69ebbaa4feaa694bd83d241e4093901c84a0963b19d9bb3f0cf8fdepends onused byctr
0.10.1crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbaaca1c4b237092596f64d571e9db6ce4109c4ef9742e27590f1709594461f21depends onctutils
0.4.2crates.io↘ 2↖ 10sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29edepends oncurve25519-dalek
5.0.0-rc.0crates.io↘ 8↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4f359e08ca85e7bd759e1fd933ff2bccd81864c60a8fba0e259c7f822b0924bfdepends oncurve25519-dalek-derive
0.1.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3depends onused bydata-encoding
2.11.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8used bydelegate
0.13.5crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum780eb241654bf097afb00fc5f054a09b687dad862e485fdcf8399bb056565370depends onused byder
0.8.0crates.io↘ 3↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411bderivative
2.2.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770bdepends onused bydes
0.9.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum916a94e407b54f9034d71dd748234cd1e516ced6284009906ae246f177eafe5adepends onused bydigest
0.11.3crates.io↘ 4↖ 13sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2ecdsa
0.17.0-rc.18crates.io↘ 7↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum54fb064faabbee66e1fc8e5c5a9458d4269dc2d8b638fe86a425adb2510d1a96depends oned25519
3.0.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum29fcf32e6c73d1079f83ab4d782de2d81620346a5f38c6237a86a22f8368980adepends onused byed25519-dalek
3.0.0-rc.0crates.io↘ 8↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb011170fe4f04665565b4110afef66774fe9ffff278f3eb5b81cc73d26e27d60depends oneither
1.16.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679eused byelliptic-curve
0.14.0-rc.33crates.io↘ 15↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum102d3643d30dd8b559613c5cced68317199597fffb278cdc88daa2ef7fafc935depends onendi
1.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099used byenum_dispatch
0.3.13crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumaa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecdused byenum-repr
0.2.6crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbad30c9c0fa1aaf1ae5010dab11f1117b15d35faf62cda4bbbc53b9987950f18depends onused byenumflags2
0.7.12crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecefdepends onenumflags2_derive
0.7.12crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827depends onused byequivalent
1.0.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0fused byerrno
0.3.14crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efebdepends onevent-listener
5.4.1crates.io↘ 3↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856abevent-listener-strategy
0.5.4crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93fastrand
2.4.1crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6ff
0.14.0crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma1f686ab92a9fb0eaf188f6c6c87b89490baa6fdb0db4544ba4dc47f7942489fdepends onfiat-crypto
0.3.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24find-msvc-tools
0.1.9crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582used byflate2
1.1.9crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573cdepends onused byfoldhash
0.1.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2used byfuchsia-cprng
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3baused byfutures
0.3.32crates.io↘ 7↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382ddepends onfutures-channel
0.3.32crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1ddepends onfutures-core
0.3.32crates.io↘ 0↖ 12sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1dfutures-executor
0.3.32crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbaf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579dused byfutures-io
0.3.32crates.io↘ 0↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718futures-lite
2.6.1crates.io↘ 5↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44adfutures-macro
0.3.32crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447bdepends onused byfutures-sink
0.3.32crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893futures-task
0.3.32crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393futures-util
0.3.32crates.io↘ 9↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6depends ongeneric-array
0.14.9crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2depends onused bygeneric-array
1.4.3crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc2e55f16dcf0e9c00efbe2e655ffe45fc98e7066b52bc92f8a79e64060a79351used bygetrandom
0.2.17crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0used bygetrandom
0.4.2crates.io↘ 8↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555depends onghash
0.6.0crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2eecf2d5dc9b66b732b97707a0210906b1d30523eb773193ab777c0c84b3e8d5depends onglob
0.3.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280used byglobset
0.4.18crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3used bygroup
0.14.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7fd1a1c7a5206c5b7a3f5a0d7ccd3ff85d0c8f5133d62a02680255b0004af5f4depends onused byhashbrown
0.15.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1depends onused byhashbrown
0.17.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84aused byheck
0.5.0crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55eahermit-abi
0.5.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849cused byhex
0.4.3crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70used byhex-literal
1.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume712f64ec3850b98572bffac52e2c6f282b29fe6c5fa6d42334b30be438d95c1used byhkdf
0.13.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4aaa26c720c68b866f2c96ef5c1264b3e6f473fe5d4ce61cd44bbe913e553018depends onused byhmac
0.13.0crates.io↘ 1↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863fdepends onhybrid-array
0.4.12crates.io↘ 4↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857daiana-time-zone
0.1.65crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470depends onused byiana-time-zone-haiku
0.1.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269fdepends onused byid-arena
2.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954used byindexmap
2.14.0crates.io↘ 4↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9inout
0.2.2crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4250ce6452e92010fdf7268ccc5d14faa80bb12fc741938534c58f16804e03c7depends oninternal-russh-num-bigint
0.5.0crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumae8e22120c32fb4d19ec55fba35015f57095cd95a2e3b732e44457f5915b2ee8used byis_terminal_polyfill
1.70.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695used byitertools
0.12.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569depends onused byitoa
1.0.18crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682used byjs-sys
0.3.102crates.io↘ 3↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31keccak
0.2.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aadepends onused bykem
0.3.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum01737161ba802849cfd486b5bd209d38ba4943494c249a8126005170c7621edddepends onused bylazy_static
1.5.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66felazycell
1.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55used byleb128fmt
0.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2used bylibc
0.2.186crates.io↘ 0↖ 21sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66libredox
0.1.17crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3used bylinux-raw-sys
0.12.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53used bylog
0.4.32crates.io↘ 0↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3amd5
0.8.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0used bymemchr
2.8.2crates.io↘ 0↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4memoffset
0.9.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218adepends onused byminimal-lexical
0.2.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79aused byminiz_oxide
0.8.9crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316depends onused bymio
1.2.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fdaused byml-kem
0.3.2crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5e15f3e5b957493873e396a66914e83e616b6afe335cdef7efe5c6e1216aba66used bymodule-lattice
0.2.3crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0c61b87c9683ab7cb1c6871d261ad5479b6b10ceb52c4352aaca3b5d35a8febeused bynix
0.31.3crates.io↘ 4↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3dnom
7.1.3crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4adepends onused bynon-zero-byte-slice
0.1.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum89daa1daa11c9df05d1181bcd0936d8066f8543144d77b09808eb78d65e38024depends onused bynu-ansi-term
0.50.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5depends onused bynum-bigint
0.4.6crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9depends onused bynum-integer
0.1.46crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858fdepends onnum-traits
0.2.19crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841depends ononce_cell
1.21.4crates.io↘ 0↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50once_cell_polyfill
1.70.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4feused byopenssh
0.11.6crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd534c4bfecb0ed71dea4db444a5922a294d15cf40e700548f27295e1feb0ef18depends onused byopenssh-mux-client
0.17.9crates.io↘ 10↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdf21c25c5f6a6c11cf6c54723c7b1389bfb4b5b0c17b097da274cade81d4815edepends onused byopenssh-mux-client-error
0.1.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9879168afb48a235200e30d93df320b7191568cda8621df02f145c1c0f1af95adepends onused byordered-stream
0.2.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50depends onused byp256
0.14.0-rc.10crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum41adc63effe99d48837a8cc0e6d7a77e32ae6a07f6000df466178dbc2193093edepends onp384
0.14.0-rc.10crates.io↘ 6↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9bd5333afa5ae0347f39e6a0f2c9c155da431583fd71fe5555bd0521b4ccaf02depends onp521
0.14.0-rc.10crates.io↘ 6↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma3a5297f53dc16d35909060ba3032cff7867e8809f01e273ff325579d5f0ceaedepends onpageant
0.2.1crates.io↘ 12↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4f3a5ae18f65a85c67a77d18d42d3606c07948e3c17c1e5f74852b26589e88a5depends onused bypam-client
0.5.0crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum51bd776116a7ada5ebbe31f54cdc5b1030ed7265686cf7c8a21c057a2f8dab9aused bypam-sys
1.0.0-alpha5crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumce9484729b3e52c0bacdc5191cb6a6a5f31ef4c09c5e4ab1209d3340ad9e997bdepends onused byparking
2.2.1crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dcebapassword-hash
0.6.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumaab41826031698d6ffcd9cff78ef56ef998e39dc7e5067cdfebe373842d4723bdepends onused bypaste
1.0.15crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0aused bypbkdf2
0.13.0crates.io↘ 2↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum112d82ceb8c5bf524d9af484d4e4970c9fd5a0cc15ba14ad93dccd28873b0629depends onpem-rfc7468
1.0.0crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9depends onphc
0.6.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum44dc769b75f93afdddd8c7fa12d685292ddeff1e66f7f0f3a234cf1818afe892depends onused bypin-project-lite
0.2.17crates.io↘ 0↖ 14sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cdpiper
0.2.5crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1used bypkcs1
0.8.0-rc.4crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum986d2e952779af96ea048f160fd9194e1751b4faea78bcf3ceb456efe008088eused bypkcs5
0.8.0crates.io↘ 8↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum279a91971a1d8eb1260a30938eae3be9cb67b472dffecb222fbbbe2fd2dc1453used bypkcs8
0.11.0crates.io↘ 4↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7plain
0.2.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6used bypolkit-backend
0.1.1workspace↘ 11↖ 0polling
3.11.0crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218depends onused bypoly1305
0.9.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma00baa632505d05512f48a963e16051c54fda9a95cc9acea1a4e3c90991c4a2eused bypolyval
0.7.1crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7dfc63250416fea14f5749b90725916a6c903f599d51cb635aa7a52bfd03eedeused byprettyplease
0.2.37crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62bdepends onprimefield
0.14.0-rc.11crates.io↘ 6↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb1d7e42f46a29abc16fb621a3466ee453358ebaae48a9e515f287e0af052ed8fprimeorder
0.14.0-rc.10crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7d2793f22b9b6fd11ef3ac1d59bf003c2573593e4968702341605c2748fd90bfdepends onproc-macro-crate
3.5.0crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614fdepends onproc-macro2
1.0.106crates.io↘ 1↖ 29sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934depends onused by- async-recursion
1.1.1 - async-trait
0.1.89 - bifrostlink-macros
0.2.1 - bindgen
0.69.5 - clap_derive
4.6.1 - curve25519-dalek-derive
0.1.1 - delegate
0.13.5 - derivative
2.2.0 - enum-repr
0.2.6 - enum_dispatch
0.3.13 - enumflags2_derive
0.7.12 - futures-macro
0.3.32 - prettyplease
0.2.37 - quote
1.0.45 - serde_derive
1.0.228 - serde_repr
0.1.20 - syn
1.0.109 - syn
2.0.117 - thiserror-impl
2.0.18 - tokio-macros
2.7.0 - tracing-attributes
0.1.31 - typed-builder-macro
0.23.2 - wasm-bindgen-macro-support
0.2.125 - windows-implement
0.60.2 - windows-interface
0.59.3 - wit-bindgen-rust-macro
0.51.0 - zbus_macros
5.16.0 - zvariant_derive
5.12.0 - zvariant_utils
3.4.0
- async-recursion
quote
1.0.45crates.io↘ 1↖ 28sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924depends onused by- async-recursion
1.1.1 - async-trait
0.1.89 - bifrostlink-macros
0.2.1 - bindgen
0.69.5 - clap_derive
4.6.1 - curve25519-dalek-derive
0.1.1 - delegate
0.13.5 - derivative
2.2.0 - enum-repr
0.2.6 - enum_dispatch
0.3.13 - enumflags2_derive
0.7.12 - futures-macro
0.3.32 - serde_derive
1.0.228 - serde_repr
0.1.20 - syn
1.0.109 - syn
2.0.117 - thiserror-impl
2.0.18 - tokio-macros
2.7.0 - tracing-attributes
0.1.31 - typed-builder-macro
0.23.2 - wasm-bindgen-macro
0.2.125 - wasm-bindgen-macro-support
0.2.125 - windows-implement
0.60.2 - windows-interface
0.59.3 - wit-bindgen-rust-macro
0.51.0 - zbus_macros
5.16.0 - zvariant_derive
5.12.0 - zvariant_utils
3.4.0
- async-recursion
r-efi
6.0.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bfused byrand
0.4.6crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293used byrand
0.10.1crates.io↘ 3↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207rand_core
0.3.1crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4bdepends onused byrand_core
0.4.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dcused byrand_core
0.10.1crates.io↘ 0↖ 20sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69used by- chacha20
0.10.0 - crypto-bigint
0.7.3 - crypto-common
0.2.2 - crypto-primes
0.7.2 - ed25519-dalek
3.0.0-rc.0 - elliptic-curve
0.14.0-rc.33 - ff
0.14.0 - getrandom
0.4.2 - group
0.14.0 - internal-russh-num-bigint
0.5.0 - kem
0.3.0 - ml-kem
0.3.2 - pkcs5
0.8.0 - pkcs8
0.11.0 - primefield
0.14.0-rc.11 - rand
0.10.1 - rsa
0.10.0-rc.18 - russh
0.61.2 - signature
3.0.0 - ssh-key
0.7.0-rc.10
- chacha20
rdrand
0.4.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2depends onused byredox_syscall
0.8.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5b44b894f2a6e36457d665d1e08c3866add6ed5e70050c1b4ba8a8ddedb02ce7depends onused byregex
1.12.4crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6baused byregex-automata
0.4.14crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8fused byregex-syntax
0.8.11crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4remove_dir_all
0.5.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7depends onused byremowt-agent
0.1.1workspace↘ 22↖ 0depends on- anyhow
1.0.102 - bifrostlink
0.2.1 - bifrostlink-ports
0.2.1 - clap
4.6.1 - futures
0.3.32 - futures-util
0.3.32 - nix
0.31.3 - rand
0.10.1 - remowt-endpoints
0.1.1 - remowt-link-shared
0.1.1 - remowt-plugin
0.1.1 - remowt-polkit-shared
0.1.1 - remowt-ui-prompt
0.1.1 - serde
1.0.228 - tempfile
3.27.0 - tokio
1.52.3 - tokio-util
0.7.18 - tracing
0.1.44 - tracing-subscriber
0.3.23 - uuid
1.23.3 - zbus
5.16.0 - zbus_polkit
5.0.0
- anyhow
remowt-endpoints
0.1.1workspace↘ 12↖ 2remowt-plugin
0.1.1workspace↘ 9↖ 1remowt-ssh
0.1.1workspace↘ 22↖ 0depends on- anyhow
1.0.102 - async-trait
0.1.89 - bifrostlink
0.2.1 - bifrostlink-ports
0.2.1 - bytes
1.11.1 - clap
4.6.1 - nix
0.31.3 - openssh
0.11.6 - remowt-client
0.1.1 - remowt-link-shared
0.1.1 - remowt-ui-prompt
0.1.1 - russh
0.61.2 - russh-config
0.58.0 - serde
1.0.228 - serde_json
1.0.150 - tempdir
0.3.7 - thiserror
2.0.18 - tokio
1.52.3 - tokio-stream
0.1.18 - tracing
0.1.44 - tracing-subscriber
0.3.23 - uuid
1.23.3
- anyhow
remowt-ui-prompt
0.1.1workspace↘ 8↖ 4rfc6979
0.5.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5236ce872cac07e0fb3969b0cbf468c7d2f37d432f1b627dcb7b8d34563fb0c3depends onused byring
0.17.14crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7used byrpassword
6.0.1crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2bf099a1888612545b683d2661a1940089f6c2e5a8e38979b2159da876bfd956used byrsa
0.10.0-rc.18crates.io↘ 11↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum30b2aa4ba0d89f73d1e332df05be0eeab8840351c36ca5654341dfdb57bb3cafdepends onrussh
0.61.2crates.io↘ 64↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbbf893f64684e58da8a68d56a5e84d1cf0440226274c515770fe267707a7d0b0depends on- aes
0.9.1 - bitflags
2.13.0 - block-padding
0.4.2 - byteorder
1.5.0 - bytes
1.11.1 - cbc
0.2.1 - cipher
0.5.2 - crypto-bigint
0.7.3 - ctr
0.10.1 - curve25519-dalek
5.0.0-rc.0 - data-encoding
2.11.0 - delegate
0.13.5 - der
0.8.0 - digest
0.11.3 - ecdsa
0.17.0-rc.18 - ed25519-dalek
3.0.0-rc.0 - elliptic-curve
0.14.0-rc.33 - enum_dispatch
0.3.13 - flate2
1.1.9 - futures
0.3.32 - generic-array
1.4.3 - getrandom
0.4.2 - ghash
0.6.0 - hex-literal
1.1.0 - hmac
0.13.0 - inout
0.2.2 - internal-russh-num-bigint
0.5.0 - keccak
0.2.0 - log
0.4.32 - md5
0.8.0 - ml-kem
0.3.2 - module-lattice
0.2.3 - num-bigint
0.4.6 - p256
0.14.0-rc.10 - p384
0.14.0-rc.10 - p521
0.14.0-rc.10 - pageant
0.2.1 - pbkdf2
0.13.0 - pkcs1
0.8.0-rc.4 - pkcs5
0.8.0 - pkcs8
0.11.0 - polyval
0.7.1 - rand
0.10.1 - rand_core
0.10.1 - ring
0.17.14 - rsa
0.10.0-rc.18 - russh-cryptovec
0.61.0 - russh-util
0.52.0 - salsa20
0.11.0 - scrypt
0.12.0 - sec1
0.8.1 - sha1
0.11.0 - sha2
0.11.0 - sha3
0.11.0 - signature
3.0.0 - spki
0.8.0 - ssh-encoding
0.3.0-rc.9 - ssh-key
0.7.0-rc.10 - subtle
2.6.1 - thiserror
2.0.18 - tokio
1.52.3 - typenum
1.20.1 - universal-hash
0.6.1 - zeroize
1.9.0
- aes
russh-config
0.58.0crates.io↘ 6↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum993346101d4741a59c82bafc6b645c52ce3e7b0820f13e4b5d48cdb591e3d955russh-cryptovec
0.61.0crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum443f6bbcfacb34a1aab2b12b99bf08e0c63abdc5a0db261901365df9d57fff51used byrussh-util
0.52.0crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum668424a5dde0bcb45b55ba7de8476b93831b4aa2fa6947e145f3b053e22c60b6used byrustc_version
0.4.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92depends onused byrustc-hash
1.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2used byrustix
1.1.4crates.io↘ 5↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190rustversion
1.0.22crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46dsalsa20
0.11.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2f874456e72520ff1375a06c588eaf074b0f01f9e9e1aada45bd9b7954a6e42cdepends onused byscrypt
0.12.0crates.io↘ 4↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd87af57419b594aa23fa95f09f0e06d80d84ba01c26148c43844cad6ff4485f0used bysec1
0.8.1crates.io↘ 6↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd56d437c2f19203ce5f7122e507831de96f3d2d4d3be5af44a0b0a09d8a80e4dsemver
1.0.28crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cdsendfd
0.4.4crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb183bfd5b1bc64ab0c1ef3ee06b008a9ef1b68a7d3a99ba566fbfe7a7c6d745bdepends onused byserde
1.0.228crates.io↘ 2↖ 26sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9edepends onused by- bifrostlink
0.2.1 - bstr
1.12.1 - ed25519-dalek
3.0.0-rc.0 - enumflags2
0.7.12 - indexmap
2.14.0 - non-zero-byte-slice
0.1.0 - openssh-mux-client
0.17.9 - remowt-agent
0.1.1 - remowt-client
0.1.1 - remowt-endpoints
0.1.1 - remowt-link-shared
0.1.1 - remowt-polkit-shared
0.1.1 - remowt-ssh
0.1.1 - remowt-ui-prompt
0.1.1 - rpassword
6.0.1 - serde_json
1.0.150 - serdect
0.4.3 - ssh_format
0.14.1 - ssh_format_error
0.1.0 - wit-component
0.244.0 - wit-parser
0.244.0 - zbus
5.16.0 - zbus_names
4.3.2 - zbus_polkit
5.0.0 - zvariant
5.12.0 - zvariant_utils
3.4.0
- bifrostlink
serde_core
1.0.228crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67addepends onserde_derive
1.0.228crates.io↘ 3↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79depends onserde_json
1.0.150crates.io↘ 5↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9serde_repr
0.1.20crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59cdepends onused byserdect
0.4.3crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3edepends onused bysha1
0.11.0crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumaacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214depends onsha2
0.11.0crates.io↘ 3↖ 11sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4depends onsha3
0.11.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbe176f1a57ce4e3d31c1a166222d9768de5954f811601fb7ca06fc8203905ce1depends onused bysharded-slab
0.1.7crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6depends onused byshell-escape
0.1.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184fused byshlex
1.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64used bysignal-hook-registry
1.4.8crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1bdepends onsignature
3.0.0crates.io↘ 2↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5depends onsimd-adler32
0.3.9crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214used byslab
0.4.12crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5smallvec
1.15.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90used bysocket2
0.6.4crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51depends onused byspki
0.8.0crates.io↘ 2↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1d9efca8738c78ee9484207732f728b1ef517bbb1833d6fc0879ca898a522f6fdepends onssh_format
0.14.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum24ab31081d1c9097c327ec23550858cb5ffb4af6b866c1ef4d728455f01f3304depends onused byssh_format_error
0.1.0crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbe3c6519de7ca611f71ef7e8a56eb57aa1c818fecb5242d0a0f39c83776c210cdepends onssh-cipher
0.3.0-rc.9crates.io↘ 12↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum10db6f219196a8528f9ec904d9d45cdad692d65b0e57e72be4dedd1c5fddce36depends onused byssh-encoding
0.3.0-rc.9crates.io↘ 7↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7abf34aa716da5d5b4c496936d042ea282ab392092cd68a72ef6a8863ff8c96adepends onssh-key
0.7.0-rc.10crates.io↘ 18↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum45735ce3dea95690e4a9e414c4cfde7f79835063c3dcd35881df85a84118e74bdepends onused bystatic_assertions
1.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543fused bystrsim
0.11.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4fused bysubtle
2.6.1crates.io↘ 0↖ 13sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292syn
1.0.109crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237syn
2.0.117crates.io↘ 3↖ 25sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99used by- async-recursion
1.1.1 - async-trait
0.1.89 - bifrostlink-macros
0.2.1 - bindgen
0.69.5 - clap_derive
4.6.1 - curve25519-dalek-derive
0.1.1 - delegate
0.13.5 - enum_dispatch
0.3.13 - enumflags2_derive
0.7.12 - futures-macro
0.3.32 - prettyplease
0.2.37 - serde_derive
1.0.228 - serde_repr
0.1.20 - thiserror-impl
2.0.18 - tokio-macros
2.7.0 - tracing-attributes
0.1.31 - typed-builder-macro
0.23.2 - wasm-bindgen-macro-support
0.2.125 - windows-implement
0.60.2 - windows-interface
0.59.3 - wit-bindgen-rust
0.51.0 - wit-bindgen-rust-macro
0.51.0 - zbus_macros
5.16.0 - zvariant_derive
5.12.0 - zvariant_utils
3.4.0
- async-recursion
tempdir
0.3.7crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8depends onused bytempfile
3.27.0crates.io↘ 5↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bdthiserror
2.0.18crates.io↘ 1↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4depends onthiserror-impl
2.0.18crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5depends onused bythread_local
1.1.9crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185depends onused bytokio
1.52.3crates.io↘ 9↖ 21sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffedepends onused by- bifrostlink
0.2.1 - bifrostlink-ports
0.2.1 - openssh
0.11.6 - openssh-mux-client
0.17.9 - pageant
0.2.1 - polkit-backend
0.1.1 - remowt-agent
0.1.1 - remowt-client
0.1.1 - remowt-endpoints
0.1.1 - remowt-link-shared
0.1.1 - remowt-plugin
0.1.1 - remowt-ssh
0.1.1 - remowt-ui-prompt
0.1.1 - russh
0.61.2 - russh-config
0.58.0 - russh-util
0.52.0 - sendfd
0.4.4 - tokio-io-utility
0.7.6 - tokio-stream
0.1.18 - tokio-util
0.7.18 - zbus
5.16.0
- bifrostlink
tokio-io-utility
0.7.6crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8d672654d175710e52c7c41f6aec77c62b3c0954e2a7ebce9049d1e94ed7c263depends onused bytokio-macros
2.7.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496depends onused bytokio-stream
0.1.18crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70used bytokio-util
0.7.18crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098used bytoml_datetime
1.1.1+spec-1.1.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7depends onused bytoml_edit
0.25.12+spec-1.1.0crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7used bytoml_parser
1.1.2+spec-1.1.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526depends onused bytracing
0.1.44crates.io↘ 3↖ 11sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100tracing-attributes
0.1.31crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8dadepends onused bytracing-core
0.1.36crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdb97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79adepends ontracing-log
0.2.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3used bytracing-subscriber
0.3.23crates.io↘ 6↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319depends ontyped-builder
0.23.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum31aa81521b70f94402501d848ccc0ecaa8f93c8eb6999eb9747e72287757ffdadepends onused bytyped-builder-macro
0.23.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum076a02dc54dd46795c2e9c8282ed40bcfb1e22747e955de9389a1de28190fb26depends onused bytypenum
1.20.1crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20uds_windows
1.2.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6eused byunicode-ident
1.0.24crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75unicode-xid
0.2.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853used byuniversal-hash
0.6.1crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf4987bdc12753382e0bec4a65c50738ffaabc998b9cdd1f952fb5f39b0048a96depends onuntrusted
0.9.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1used byutf8parse
0.2.2crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821uuid
1.23.3crates.io↘ 4↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7valuable
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65used byversion_check
0.9.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105aused bywasi
0.11.1+wasi-snapshot-preview1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44bused bywasip2
1.0.4+wasi-0.2.12crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487depends onused bywasip3
0.4.0+wasi-0.3.0-rc-2026-01-06crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5depends onused bywasite
0.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855bused bywasm-bindgen
0.2.125crates.io↘ 5↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1adepends onwasm-bindgen-futures
0.4.75crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280depends onused bywasm-bindgen-macro
0.2.125crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3dused bywasm-bindgen-macro-support
0.2.125crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebdused bywasm-encoder
0.244.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319depends onwasm-metadata
0.244.0crates.io↘ 4↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909wasmparser
0.244.0crates.io↘ 4↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028feweb-sys
0.3.102crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061ddepends onused bywhoami
1.6.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97ddepends onused bywinapi
0.3.9crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419winapi-i686-pc-windows-gnu
0.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6used bywinapi-x86_64-pc-windows-gnu
0.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183fused bywindows
0.62.2crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580used bywindows_aarch64_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3used bywindows_aarch64_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469used bywindows_i686_gnu
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0bused bywindows_i686_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66used bywindows_i686_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66used bywindows_x86_64_gnu
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78used bywindows_x86_64_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0dused bywindows_x86_64_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ecused bywindows-collections
0.3.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610depends onused bywindows-core
0.62.2crates.io↘ 5↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9debdepends onwindows-future
0.3.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cbused bywindows-implement
0.60.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddfdepends onused bywindows-interface
0.59.3crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358depends onused bywindows-link
0.2.1crates.io↘ 0↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5windows-numerics
0.3.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26depends onused bywindows-result
0.4.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5depends onused bywindows-strings
0.5.1crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091depends onwindows-sys
0.52.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33ddepends onused bywindows-sys
0.61.2crates.io↘ 1↖ 15sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fcdepends onwindows-targets
0.52.6crates.io↘ 8↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973depends onused bywindows-threading
0.2.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37depends onused bywinnow
1.0.3crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1depends onwit-bindgen
0.51.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5depends onwit-bindgen
0.57.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536eused bywit-bindgen-core
0.51.0crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dcdepends onwit-bindgen-rust
0.51.0crates.io↘ 8↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21depends onused bywit-bindgen-rust-macro
0.51.0crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17adepends onused bywit-component
0.244.0crates.io↘ 11↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2depends onused bywit-parser
0.244.0crates.io↘ 10↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736depends onzbus
5.16.0crates.io↘ 28↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumeee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285depends on- async-broadcast
0.7.2 - async-executor
1.14.0 - async-io
2.6.0 - async-lock
3.4.2 - async-process
2.5.0 - async-recursion
1.1.1 - async-task
4.7.1 - async-trait
0.1.89 - blocking
1.6.2 - enumflags2
0.7.12 - event-listener
5.4.1 - futures-core
0.3.32 - futures-lite
2.6.1 - hex
0.4.3 - libc
0.2.186 - ordered-stream
0.2.0 - rustix
1.1.4 - serde
1.0.228 - serde_repr
0.1.20 - tokio
1.52.3 - tracing
0.1.44 - uds_windows
1.2.1 - uuid
1.23.3 - windows-sys
0.61.2 - winnow
1.0.3 - zbus_macros
5.16.0 - zbus_names
4.3.2 - zvariant
5.12.0
- async-broadcast
zbus_macros
5.16.0crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumadf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6depends onused byzbus_names
4.3.2crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52ddepends onused byzbus_polkit
5.0.0crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumad23d5c4d198c7e2641b33e6e0d1f866f117408ba66fe80bbe52e289eeb77c52zeroize
1.9.0crates.io↘ 0↖ 20sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64eused by- aes
0.9.1 - aes-gcm
0.11.0-rc.4 - block-buffer
0.12.1 - chacha20
0.10.0 - cipher
0.5.2 - crypto-bigint
0.7.3 - curve25519-dalek
5.0.0-rc.0 - der
0.8.0 - ecdsa
0.17.0-rc.18 - ed25519-dalek
3.0.0-rc.0 - elliptic-curve
0.14.0-rc.33 - hybrid-array
0.4.12 - poly1305
0.9.0 - primefield
0.14.0-rc.11 - rsa
0.10.0-rc.18 - russh
0.61.2 - sec1
0.8.1 - ssh-cipher
0.3.0-rc.9 - ssh-encoding
0.3.0-rc.9 - ssh-key
0.7.0-rc.10
- aes
zmij
1.0.21crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaaused byzvariant
5.12.0crates.io↘ 6↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0zvariant_derive
5.12.0crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737used byzvariant_utils
3.4.0crates.io↘ 5↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6
Cargo.tomldiffbeforeafterboth--- a/Cargo.toml
+++ b/Cargo.toml
@@ -9,14 +9,12 @@
repository = "https://gitlab.delta.directory/iam/remowt"
[workspace.dependencies]
-remowt-fs = { version = "0.1.1", path = "crates/remowt-fs" }
-remowt-pty = { version = "0.1.1", path = "crates/remowt-pty" }
-remowt-systemd = { version = "0.1.1", path = "crates/remowt-systemd" }
remowt-client = { version = "0.1.1", path = "crates/remowt-client" }
remowt-polkit-shared = { version = "0.1.1", path = "crates/polkit-shared" }
remowt-link-shared = { version = "0.1.1", path = "crates/remowt-link-shared" }
remowt-plugin = { version = "0.1.1", path = "crates/remowt-plugin" }
-remowt-ui-prompt = { version = "0.1.1", path = "crates/ui-prompt" }
+remowt-ui-prompt = { version = "0.1.1", path = "crates/remowt-ui-prompt" }
+remowt-endpoints = { version = "0.1.1", path = "crates/remowt-endpoints" }
bifrostlink = "0.2.0"
bifrostlink-macros = "0.2.0"
cmds/polkit-dbus-helper/src/main.rsdiffbeforeafterboth--- a/cmds/polkit-dbus-helper/src/main.rs
+++ b/cmds/polkit-dbus-helper/src/main.rs
@@ -8,10 +8,10 @@
use nix::unistd::{setuid, Uid, User};
use pam_client::{Context, ConversationHandler, ErrorCode, Flag};
use remowt_polkit_shared::BackendRequest;
+use remowt_ui_prompt::dbus::DbusPrompterProxyBlocking;
+use remowt_ui_prompt::BlockingPrompter;
use tokio::task::{block_in_place, spawn_blocking};
use tracing::trace;
-use remowt_ui_prompt::dbus::DbusPrompterProxyBlocking;
-use remowt_ui_prompt::BlockingPrompter;
use zbus::fdo;
use zbus::message::Header;
use zbus::zvariant::OwnedValue;
cmds/remowt-agent/Cargo.tomldiffbeforeafterboth--- a/cmds/remowt-agent/Cargo.toml
+++ b/cmds/remowt-agent/Cargo.toml
@@ -17,7 +17,6 @@
rand.workspace = true
remowt-link-shared.workspace = true
remowt-plugin.workspace = true
-remowt-pty.workspace = true
serde = { workspace = true, features = ["derive"] }
tempfile.workspace = true
tokio = { workspace = true, features = [
@@ -36,3 +35,4 @@
uuid = { workspace = true, features = ["v4"] }
zbus = { workspace = true, features = ["tokio"] }
zbus_polkit = { workspace = true, features = ["tokio"] }
+remowt-endpoints.workspace = true
cmds/remowt-agent/src/helper/protocol.rsdiffbeforeafterboth--- a/cmds/remowt-agent/src/helper/protocol.rs
+++ b/cmds/remowt-agent/src/helper/protocol.rs
@@ -3,10 +3,10 @@
use anyhow::bail;
use futures::stream::Peekable;
use futures::StreamExt as _;
+use remowt_ui_prompt::Prompter;
use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt as _};
use tokio::select;
use tokio_util::codec::{FramedRead, LinesCodec};
-use remowt_ui_prompt::Prompter;
pub async fn run_conversation<R, W, P>(reader: R, mut writer: W, prompt: P) -> anyhow::Result<()>
where
cmds/remowt-agent/src/main.rsdiffbeforeafterboth--- a/cmds/remowt-agent/src/main.rs
+++ b/cmds/remowt-agent/src/main.rs
@@ -11,8 +11,8 @@
use bifrostlink_ports::stdio::from_stdio;
use bifrostlink_ports::unix_socket::from_socket;
use clap::Parser;
-use remowt_link_shared::editor::EditorEndpointsClient;
-use remowt_link_shared::{Address, BifConfig, Fs, Pty, Systemd};
+use remowt_endpoints::{fs::Fs, pty::Pty, systemd::Systemd};
+use remowt_link_shared::{editor::EditorEndpointsClient, Address, BifConfig};
use remowt_polkit_shared::{emphasize, BackendRequest, Identity, PidDisplay};
use remowt_ui_prompt::bifrost::PromptEndpointsClient;
use remowt_ui_prompt::rofi::RofiPrompter;
cmds/remowt-ssh/src/main.rsdiffbeforeafterboth--- a/cmds/remowt-ssh/src/main.rs
+++ b/cmds/remowt-ssh/src/main.rs
@@ -13,13 +13,13 @@
use remowt_client::editor::SshEditor;
use remowt_client::{AgentBundle, Remowt};
use remowt_link_shared::editor::serve_editor;
+use remowt_ui_prompt::bifrost::serve_prompts;
+use remowt_ui_prompt::rofi::RofiPrompter;
+use remowt_ui_prompt::{PrependSourcePrompter, Source};
use tokio::io::unix::AsyncFd;
use tokio::io::{AsyncRead, ReadBuf};
use tokio::signal::unix::{signal, SignalKind};
use tracing::info;
-use remowt_ui_prompt::bifrost::serve_prompts;
-use remowt_ui_prompt::rofi::RofiPrompter;
-use remowt_ui_prompt::{PrependSourcePrompter, Source};
#[derive(Parser)]
struct Opts {
crates/remowt-client/Cargo.tomldiffbeforeafterboth--- a/crates/remowt-client/Cargo.toml
+++ b/crates/remowt-client/Cargo.toml
@@ -19,3 +19,4 @@
tokio = { workspace = true, features = ["net", "io-util", "rt", "sync", "macros", "process"] }
tracing.workspace = true
uuid = { workspace = true, features = ["v4"] }
+remowt-endpoints.workspace = true
crates/remowt-client/src/lib.rsdiffbeforeafterboth--- a/crates/remowt-client/src/lib.rs
+++ b/crates/remowt-client/src/lib.rs
@@ -1,7 +1,7 @@
use std::collections::HashMap;
-use std::io;
use std::path::PathBuf;
use std::sync::{Arc, Mutex};
+use std::{env, io};
use anyhow::{anyhow, bail, ensure, Context as _, Result};
use bifrostlink::declarative::RemoteEndpoints;
@@ -9,11 +9,13 @@
use bifrostlink_ports::unix_socket::from_socket;
use bytes::{Bytes, BytesMut};
use camino::{Utf8Path, Utf8PathBuf};
+use remowt_endpoints::{
+ fs::Fs,
+ pty::{Pty, PtyClient, ShellId},
+ systemd::Systemd,
+};
use remowt_link_shared::plugin::PluginEndpointsClient;
-use remowt_link_shared::{
- Address, BifConfig, ElevateEndpoints, ElevateError, Elevator, Fs, Pty, PtyClient, ShellId,
- Systemd,
-};
+use remowt_link_shared::{Address, BifConfig, ElevateEndpoints, ElevateError, Elevator};
use russh::client::{connect, Config, Handle, Handler, Msg, Session};
use russh::keys::agent::client::AgentClient;
use russh::keys::agent::AgentIdentity;
@@ -220,8 +222,8 @@
}
fn find_in_path(name: &str) -> Option<std::path::PathBuf> {
- let path = std::env::var_os("PATH")?;
- std::env::split_paths(&path)
+ let path = env::var_os("PATH")?;
+ env::split_paths(&path)
.map(|dir| dir.join(name))
.find(|p| p.is_file())
}
@@ -383,7 +385,7 @@
impl Remowt {
pub async fn connect(host: &str, bundle: &AgentBundle) -> Result<Self> {
let conf = russh_config::parse_home(host)?;
- let port = conf.host_config.port.unwrap_or(22);
+ let port = conf.host_config.port.or(conf.port).unwrap_or(22);
let hostname = conf
.host_config
.hostname
@@ -392,7 +394,7 @@
let user = conf
.user
.clone()
- .unwrap_or_else(|| std::env::var("USER").unwrap_or_else(|_| "root".to_owned()));
+ .unwrap_or_else(|| env::var("USER").unwrap_or_else(|_| "root".to_owned()));
let subs: Subs = Arc::new(Mutex::new(HashMap::new()));
let mut sess = connect(
@@ -548,7 +550,7 @@
port_from_channel(ch)
}
Transport::Local { agent_path, .. } => {
- let sock = std::env::temp_dir()
+ let sock = env::temp_dir()
.join(format!("remowt-priv-{}.sock", uuid::Uuid::new_v4()));
let _ = std::fs::remove_file(&sock);
let listener = UnixListener::bind(&sock)?;
crates/remowt-endpoints/Cargo.tomldiffbeforeafterboth--- /dev/null
+++ b/crates/remowt-endpoints/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+name = "remowt-endpoints"
+description = "Nix daemon proxy"
+version.workspace = true
+edition = "2021"
+license.workspace = true
+
+[dependencies]
+anyhow.workspace = true
+bifrostlink.workspace = true
+bifrostlink-macros.workspace = true
+camino.workspace = true
+serde = { workspace = true }
+tempfile.workspace = true
+thiserror.workspace = true
+tokio = { workspace = true, features = ["net", "io-util", "rt", "process"] }
+tracing.workspace = true
+uuid.workspace = true
+nix = { workspace = true, features = ["process", "term"] }
+zbus.workspace = true
crates/remowt-endpoints/src/fs.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/remowt-endpoints/src/fs.rs
@@ -0,0 +1,105 @@
+use std::io::ErrorKind;
+use std::str::FromStr;
+use std::sync::Mutex;
+
+use bifrostlink::declarative::endpoints;
+use bifrostlink::Config;
+use camino::Utf8PathBuf;
+use serde::{Deserialize, Serialize};
+use tempfile::TempDir;
+
+#[derive(Default)]
+pub struct Fs {
+ tempdirs: Mutex<Vec<TempDir>>,
+}
+
+impl Fs {
+ pub fn new() -> Self {
+ Self::default()
+ }
+}
+
+#[derive(Serialize, Deserialize, Debug, thiserror::Error)]
+pub enum Error {
+ #[error("file not found")]
+ NotFound,
+ #[error("file name/contents is not utf8")]
+ InvalidUtf8,
+ #[error("unknown fs error")]
+ Unknown,
+}
+
+#[endpoints(ns = 1)]
+impl Fs {
+ #[endpoints(id = 1)]
+ async fn read_file_tiny(&self, path: Utf8PathBuf) -> Result<Vec<u8>, Error> {
+ match tokio::fs::read(path).await {
+ Ok(v) => Ok(v),
+ Err(e) if e.kind() == ErrorKind::NotFound => Err(Error::NotFound),
+ _ => Err(Error::Unknown),
+ }
+ }
+ #[endpoints(id = 2)]
+ async fn file_exists(&self, path: Utf8PathBuf) -> bool {
+ tokio::fs::try_exists(path).await.unwrap_or(false)
+ }
+ #[endpoints(id = 3)]
+ async fn read_dir_raw(&self, path: Utf8PathBuf) -> Result<Vec<Utf8PathBuf>, Error> {
+ let mut dir = match tokio::fs::read_dir(path).await {
+ Ok(dir) => dir,
+ Err(e) if e.kind() == ErrorKind::NotFound => return Err(Error::NotFound),
+ Err(_) => return Err(Error::Unknown),
+ };
+ let mut out = Vec::new();
+ while let Ok(Some(entry)) = dir.next_entry().await {
+ let name = Utf8PathBuf::try_from(entry.file_name()).map_err(|_| Error::InvalidUtf8)?;
+ out.push(name);
+ }
+ Ok(out)
+ }
+ #[endpoints(id = 4)]
+ async fn mktemp_dir_raw(&self) -> Result<Utf8PathBuf, Error> {
+ let dir = tempfile::Builder::new()
+ .prefix("remowt.")
+ .tempdir()
+ .map_err(|_| Error::Unknown)?;
+ let mut tempdirs = self.tempdirs.lock().expect("not poisoned");
+ let path = Utf8PathBuf::try_from(dir.path().to_owned()).map_err(|_| Error::InvalidUtf8);
+ tempdirs.push(dir);
+ path
+ }
+ #[endpoints(id = 5)]
+ async fn rm_file(&self, path: Utf8PathBuf) -> Result<(), Error> {
+ match tokio::fs::remove_file(path).await {
+ Ok(()) => Ok(()),
+ Err(e) if e.kind() == ErrorKind::NotFound => Ok(()),
+ Err(_) => Err(Error::Unknown),
+ }
+ }
+}
+
+impl<C: Config> FsClient<C> {
+ pub async fn read_file_text(&self, path: impl Into<Utf8PathBuf>) -> Result<String, Error> {
+ let v = self
+ .read_file_tiny(path.into())
+ .await
+ .map_err(|_| Error::Unknown)?;
+ let v = v?;
+ String::from_utf8(v).map_err(|_| Error::InvalidUtf8)
+ }
+ pub async fn read_file_value<T: FromStr>(
+ &self,
+ path: impl Into<Utf8PathBuf>,
+ ) -> Result<Result<T, T::Err>, Error> {
+ let text = self.read_file_text(path).await?;
+ Ok(T::from_str(&text))
+ }
+ pub async fn mktemp_dir(&self) -> Result<Utf8PathBuf, Error> {
+ self.mktemp_dir_raw().await.map_err(|_| Error::Unknown)?
+ }
+ pub async fn read_dir(&self, path: impl Into<Utf8PathBuf>) -> Result<Vec<Utf8PathBuf>, Error> {
+ self.read_dir_raw(path.into())
+ .await
+ .map_err(|_| Error::Unknown)?
+ }
+}
crates/remowt-endpoints/src/lib.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/remowt-endpoints/src/lib.rs
@@ -0,0 +1,4 @@
+pub mod fs;
+pub mod nix_daemon;
+pub mod pty;
+pub mod systemd;
crates/remowt-endpoints/src/nix_daemon.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/remowt-endpoints/src/nix_daemon.rs
@@ -0,0 +1,65 @@
+use std::process::Stdio;
+
+use bifrostlink::declarative::endpoints;
+use bifrostlink::Config;
+use serde::{Deserialize, Serialize};
+use std::result::Result;
+use tokio::process::Command;
+
+pub const NIX_DAEMON_SOCKET: &str = "/nix/var/nix/daemon-socket/socket";
+
+pub struct NixDaemon;
+
+#[derive(Serialize, Deserialize, Debug, thiserror::Error)]
+pub enum Error {
+ #[error("nix daemon unavailable: {0}")]
+ DaemonUnavailable(String),
+ #[error("tunnel socket unavailable: {0}")]
+ Tunnel(String),
+}
+
+#[endpoints(ns = 4)]
+impl NixDaemon {
+ #[endpoints(id = 1)]
+ async fn connect_daemon(&self, socket: String) -> Result<(), Error> {
+ let mut daemon = tokio::net::UnixStream::connect(NIX_DAEMON_SOCKET)
+ .await
+ .map_err(|e| Error::DaemonUnavailable(e.to_string()))?;
+ let mut tunnel = tokio::net::UnixStream::connect(&socket)
+ .await
+ .map_err(|e| Error::Tunnel(e.to_string()))?;
+ tokio::spawn(async move {
+ if let Err(e) = tokio::io::copy_bidirectional(&mut daemon, &mut tunnel).await {
+ tracing::debug!("nix daemon tunnel ended: {e}");
+ }
+ });
+ Ok(())
+ }
+
+ #[endpoints(id = 2)]
+ async fn serve_store(&self, store: String, socket: String) -> Result<(), Error> {
+ let mut child = Command::new("nix-daemon")
+ .arg("--stdio")
+ .arg("--store")
+ .arg(&store)
+ .stdin(Stdio::piped())
+ .stdout(Stdio::piped())
+ .spawn()
+ .map_err(|e| Error::DaemonUnavailable(e.to_string()))?;
+ let tunnel = tokio::net::UnixStream::connect(&socket)
+ .await
+ .map_err(|e| Error::Tunnel(e.to_string()))?;
+ let mut stdin = child.stdin.take().expect("piped");
+ let mut stdout = child.stdout.take().expect("piped");
+ tokio::spawn(async move {
+ let mut tunnel = tunnel;
+ let (mut tr, mut tw) = tunnel.split();
+ let _ = tokio::join!(
+ tokio::io::copy(&mut tr, &mut stdin),
+ tokio::io::copy(&mut stdout, &mut tw),
+ );
+ let _ = child.wait().await;
+ });
+ Ok(())
+ }
+}
crates/remowt-endpoints/src/pty.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/remowt-endpoints/src/pty.rs
@@ -0,0 +1,256 @@
+use std::collections::HashMap;
+use std::io;
+use std::os::fd::{AsRawFd, OwnedFd};
+use std::pin::Pin;
+use std::process::Stdio;
+use std::sync::atomic::{AtomicU64, Ordering};
+use std::sync::{Arc, Mutex};
+use std::task::{Context, Poll};
+
+use bifrostlink::declarative::endpoints;
+use bifrostlink::Config;
+use camino::Utf8PathBuf;
+use nix::libc;
+use nix::pty::{openpty, OpenptyResult, Winsize};
+use serde::{Deserialize, Serialize};
+use tokio::io::unix::AsyncFd;
+use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
+use tokio::net::UnixStream;
+use tracing::{info, warn};
+
+pub type ShellId = u64;
+
+#[derive(Serialize, Deserialize, Debug, thiserror::Error)]
+pub enum Error {
+ #[error("openpty failed: {0}")]
+ Open(String),
+ #[error("failed to spawn shell: {0}")]
+ Spawn(String),
+ #[error("failed to connect to forwarded socket: {0}")]
+ Connect(String),
+ #[error("no shell with that id")]
+ NoSuchShell,
+ #[error("resize failed: {0}")]
+ Resize(String),
+ #[error("io error: {0}")]
+ Io(String),
+}
+
+impl From<io::Error> for Error {
+ fn from(e: io::Error) -> Self {
+ Error::Io(e.to_string())
+ }
+}
+
+#[derive(Clone, Default)]
+pub struct Pty {
+ shells: Arc<Mutex<HashMap<ShellId, OwnedFd>>>,
+ next_id: Arc<AtomicU64>,
+}
+
+impl Pty {
+ pub fn new() -> Self {
+ Self::default()
+ }
+}
+
+#[endpoints(ns = 7)]
+impl Pty {
+ #[endpoints(id = 1)]
+ async fn open_shell(
+ &self,
+ socket_path: Utf8PathBuf,
+ term: String,
+ cols: u16,
+ rows: u16,
+ ) -> Result<ShellId, Error> {
+ let ws = Winsize {
+ ws_row: rows,
+ ws_col: cols,
+ ws_xpixel: 0,
+ ws_ypixel: 0,
+ };
+ let OpenptyResult { master, slave } =
+ openpty(Some(&ws), None).map_err(|e| Error::Open(e.to_string()))?;
+
+ let shell = std::env::var("SHELL").unwrap_or_else(|_| "/bin/sh".to_owned());
+
+ let slave_in = slave.try_clone()?;
+ let slave_out = slave.try_clone()?;
+ let slave_err = slave;
+
+ let mut cmd = tokio::process::Command::new(&shell);
+ cmd.env("TERM", &term);
+ if let Ok(home) = std::env::var("HOME") {
+ cmd.current_dir(home);
+ }
+ cmd.stdin(Stdio::from(slave_in));
+ cmd.stdout(Stdio::from(slave_out));
+ cmd.stderr(Stdio::from(slave_err));
+ // SAFETY: only async-signal-safe calls (setsid, ioctl) before exec.
+ unsafe {
+ cmd.pre_exec(|| {
+ nix::unistd::setsid().map_err(|e| io::Error::from_raw_os_error(e as i32))?;
+ if libc::ioctl(0, libc::TIOCSCTTY as _, 0) < 0 {
+ return Err(io::Error::last_os_error());
+ }
+ Ok(())
+ });
+ }
+
+ let mut child = cmd.spawn().map_err(|e| Error::Spawn(e.to_string()))?;
+
+ let resize_fd = master.try_clone()?;
+ let id = self.next_id.fetch_add(1, Ordering::Relaxed);
+ self.shells
+ .lock()
+ .expect("not poisoned")
+ .insert(id, resize_fd);
+
+ let sock = match UnixStream::connect(&socket_path).await {
+ Ok(s) => s,
+ Err(e) => {
+ self.shells.lock().expect("not poisoned").remove(&id);
+ let _ = child.kill().await;
+ return Err(Error::Connect(e.to_string()));
+ }
+ };
+ let pty = AsyncPty::new(master)?;
+
+ info!(id, shell, "shell opened");
+ let shells = self.shells.clone();
+ tokio::spawn(async move {
+ let mut pty = pty;
+ let mut sock = sock;
+ if let Err(e) = tokio::io::copy_bidirectional(&mut pty, &mut sock).await {
+ warn!(id, "shell pump ended: {e}");
+ }
+ let _ = child.kill().await;
+ shells.lock().expect("not poisoned").remove(&id);
+ info!(id, "shell closed");
+ });
+
+ Ok(id)
+ }
+
+ #[endpoints(id = 2)]
+ async fn resize(&self, id: ShellId, cols: u16, rows: u16) -> Result<(), Error> {
+ let ws = libc::winsize {
+ ws_row: rows,
+ ws_col: cols,
+ ws_xpixel: 0,
+ ws_ypixel: 0,
+ };
+ let shells = self.shells.lock().expect("not poisoned");
+ let fd = shells.get(&id).ok_or(Error::NoSuchShell)?;
+ // SAFETY: `fd` is a live PTY master
+ let rc = unsafe { libc::ioctl(fd.as_raw_fd(), libc::TIOCSWINSZ as _, &ws) };
+ if rc < 0 {
+ return Err(Error::Resize(io::Error::last_os_error().to_string()));
+ }
+ Ok(())
+ }
+}
+
+struct AsyncPty {
+ fd: AsyncFd<OwnedFd>,
+}
+
+impl AsyncPty {
+ fn new(fd: OwnedFd) -> io::Result<Self> {
+ let raw = fd.as_raw_fd();
+ // SAFETY: standard F_GETFL/F_SETFL round-trip on a valid fd.
+ unsafe {
+ let flags = libc::fcntl(raw, libc::F_GETFL);
+ if flags < 0 {
+ return Err(io::Error::last_os_error());
+ }
+ if libc::fcntl(raw, libc::F_SETFL, flags | libc::O_NONBLOCK) < 0 {
+ return Err(io::Error::last_os_error());
+ }
+ }
+ Ok(Self {
+ fd: AsyncFd::new(fd)?,
+ })
+ }
+}
+
+impl AsyncRead for AsyncPty {
+ fn poll_read(
+ self: Pin<&mut Self>,
+ cx: &mut Context<'_>,
+ buf: &mut ReadBuf<'_>,
+ ) -> Poll<io::Result<()>> {
+ let this = self.get_mut();
+ loop {
+ let mut guard = match this.fd.poll_read_ready(cx) {
+ Poll::Ready(Ok(g)) => g,
+ Poll::Ready(Err(e)) => return Poll::Ready(Err(e)),
+ Poll::Pending => return Poll::Pending,
+ };
+ let unfilled = buf.initialize_unfilled();
+ let res = guard.try_io(|inner| {
+ let fd = inner.get_ref().as_raw_fd();
+ // SAFETY: writing into `unfilled`'s own backing storage.
+ let n = unsafe { libc::read(fd, unfilled.as_mut_ptr().cast(), unfilled.len()) };
+ if n < 0 {
+ let err = io::Error::last_os_error();
+ if err.raw_os_error() == Some(libc::EIO) {
+ Ok(0)
+ } else {
+ Err(err)
+ }
+ } else {
+ Ok(n as usize)
+ }
+ });
+ match res {
+ Ok(Ok(n)) => {
+ buf.advance(n);
+ return Poll::Ready(Ok(()));
+ }
+ Ok(Err(e)) => return Poll::Ready(Err(e)),
+ Err(_would_block) => continue,
+ }
+ }
+ }
+}
+
+impl AsyncWrite for AsyncPty {
+ fn poll_write(
+ self: Pin<&mut Self>,
+ cx: &mut Context<'_>,
+ buf: &[u8],
+ ) -> Poll<io::Result<usize>> {
+ let this = self.get_mut();
+ loop {
+ let mut guard = match this.fd.poll_write_ready(cx) {
+ Poll::Ready(Ok(g)) => g,
+ Poll::Ready(Err(e)) => return Poll::Ready(Err(e)),
+ Poll::Pending => return Poll::Pending,
+ };
+ let res = guard.try_io(|inner| {
+ let fd = inner.get_ref().as_raw_fd();
+ // SAFETY: reading from `buf` for `buf.len()` bytes.
+ let n = unsafe { libc::write(fd, buf.as_ptr().cast(), buf.len()) };
+ if n < 0 {
+ Err(io::Error::last_os_error())
+ } else {
+ Ok(n as usize)
+ }
+ });
+ match res {
+ Ok(r) => return Poll::Ready(r),
+ Err(_would_block) => continue,
+ }
+ }
+ }
+
+ fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<io::Result<()>> {
+ Poll::Ready(Ok(()))
+ }
+
+ fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<io::Result<()>> {
+ Poll::Ready(Ok(()))
+ }
+}
crates/remowt-endpoints/src/systemd.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/remowt-endpoints/src/systemd.rs
@@ -0,0 +1,54 @@
+use bifrostlink::declarative::endpoints;
+use bifrostlink::Config;
+use serde::{Deserialize, Serialize};
+use zbus::proxy;
+use zbus::zvariant::OwnedObjectPath;
+
+pub struct Systemd;
+
+#[derive(Serialize, Deserialize, Debug, thiserror::Error)]
+pub enum Error {
+ #[error("systemd request failed: {0}")]
+ Failed(String),
+}
+
+#[proxy(
+ interface = "org.freedesktop.systemd1.Manager",
+ default_service = "org.freedesktop.systemd1",
+ default_path = "/org/freedesktop/systemd1"
+)]
+trait Manager {
+ fn start_unit(&self, name: &str, mode: &str) -> zbus::Result<OwnedObjectPath>;
+ fn stop_unit(&self, name: &str, mode: &str) -> zbus::Result<OwnedObjectPath>;
+}
+
+async fn manager() -> Result<ManagerProxy<'static>, Error> {
+ let conn = zbus::Connection::system()
+ .await
+ .map_err(|e| Error::Failed(e.to_string()))?;
+ ManagerProxy::new(&conn)
+ .await
+ .map_err(|e| Error::Failed(e.to_string()))
+}
+
+#[endpoints(ns = 5)]
+impl Systemd {
+ #[endpoints(id = 1)]
+ async fn start(&self, unit: String) -> Result<(), Error> {
+ manager()
+ .await?
+ .start_unit(&unit, "replace")
+ .await
+ .map_err(|e| Error::Failed(e.to_string()))?;
+ Ok(())
+ }
+ #[endpoints(id = 2)]
+ async fn stop(&self, unit: String) -> Result<(), Error> {
+ manager()
+ .await?
+ .stop_unit(&unit, "replace")
+ .await
+ .map_err(|e| Error::Failed(e.to_string()))?;
+ Ok(())
+ }
+}
crates/remowt-fs/Cargo.tomldiffbeforeafterboth--- a/crates/remowt-fs/Cargo.toml
+++ /dev/null
@@ -1,15 +0,0 @@
-[package]
-name = "remowt-fs"
-description = "Filesystem endpoint for remowt/bifrostlink"
-version.workspace = true
-edition = "2021"
-license.workspace = true
-
-[dependencies]
-bifrostlink.workspace = true
-bifrostlink-macros.workspace = true
-camino = { workspace = true, features = ["serde1"] }
-serde = { workspace = true, features = ["derive"] }
-tempfile.workspace = true
-thiserror.workspace = true
-tokio = { workspace = true, features = ["fs"] }
crates/remowt-fs/src/lib.rsdiffbeforeafterboth--- a/crates/remowt-fs/src/lib.rs
+++ /dev/null
@@ -1,105 +0,0 @@
-use std::io::ErrorKind;
-use std::str::FromStr;
-use std::sync::Mutex;
-
-use bifrostlink::declarative::endpoints;
-use bifrostlink::Config;
-use camino::Utf8PathBuf;
-use serde::{Deserialize, Serialize};
-use tempfile::TempDir;
-
-#[derive(Default)]
-pub struct Fs {
- tempdirs: Mutex<Vec<TempDir>>,
-}
-
-impl Fs {
- pub fn new() -> Self {
- Self::default()
- }
-}
-
-#[derive(Serialize, Deserialize, Debug, thiserror::Error)]
-pub enum Error {
- #[error("file not found")]
- NotFound,
- #[error("file name/contents is not utf8")]
- InvalidUtf8,
- #[error("unknown fs error")]
- Unknown,
-}
-
-#[endpoints(ns = 1)]
-impl Fs {
- #[endpoints(id = 1)]
- async fn read_file_tiny(&self, path: Utf8PathBuf) -> Result<Vec<u8>, Error> {
- match tokio::fs::read(path).await {
- Ok(v) => Ok(v),
- Err(e) if e.kind() == ErrorKind::NotFound => Err(Error::NotFound),
- _ => Err(Error::Unknown),
- }
- }
- #[endpoints(id = 2)]
- async fn file_exists(&self, path: Utf8PathBuf) -> bool {
- tokio::fs::try_exists(path).await.unwrap_or(false)
- }
- #[endpoints(id = 3)]
- async fn read_dir_raw(&self, path: Utf8PathBuf) -> Result<Vec<Utf8PathBuf>, Error> {
- let mut dir = match tokio::fs::read_dir(path).await {
- Ok(dir) => dir,
- Err(e) if e.kind() == ErrorKind::NotFound => return Err(Error::NotFound),
- Err(_) => return Err(Error::Unknown),
- };
- let mut out = Vec::new();
- while let Ok(Some(entry)) = dir.next_entry().await {
- let name = Utf8PathBuf::try_from(entry.file_name()).map_err(|_| Error::InvalidUtf8)?;
- out.push(name);
- }
- Ok(out)
- }
- #[endpoints(id = 4)]
- async fn mktemp_dir_raw(&self) -> Result<Utf8PathBuf, Error> {
- let dir = tempfile::Builder::new()
- .prefix("remowt.")
- .tempdir()
- .map_err(|_| Error::Unknown)?;
- let mut tempdirs = self.tempdirs.lock().expect("not poisoned");
- let path = Utf8PathBuf::try_from(dir.path().to_owned()).map_err(|_| Error::InvalidUtf8);
- tempdirs.push(dir);
- path
- }
- #[endpoints(id = 5)]
- async fn rm_file(&self, path: Utf8PathBuf) -> Result<(), Error> {
- match tokio::fs::remove_file(path).await {
- Ok(()) => Ok(()),
- Err(e) if e.kind() == ErrorKind::NotFound => Ok(()),
- Err(_) => Err(Error::Unknown),
- }
- }
-}
-
-impl<C: Config> FsClient<C> {
- pub async fn read_file_text(&self, path: impl Into<Utf8PathBuf>) -> Result<String, Error> {
- let v = self
- .read_file_tiny(path.into())
- .await
- .map_err(|_| Error::Unknown)?;
- let v = v?;
- String::from_utf8(v).map_err(|_| Error::InvalidUtf8)
- }
- pub async fn read_file_value<T: FromStr>(
- &self,
- path: impl Into<Utf8PathBuf>,
- ) -> Result<Result<T, T::Err>, Error> {
- let text = self.read_file_text(path).await?;
- Ok(T::from_str(&text))
- }
- pub async fn mktemp_dir(&self) -> Result<Utf8PathBuf, Error> {
- self.mktemp_dir_raw().await.map_err(|_| Error::Unknown)?
- }
- pub async fn read_dir(&self, path: impl Into<Utf8PathBuf>) -> Result<Vec<Utf8PathBuf>, Error> {
- self.read_dir_raw(path.into())
- .await
- .map_err(|_| Error::Unknown)?
- }
-}
crates/remowt-link-shared/Cargo.tomldiffbeforeafterboth--- a/crates/remowt-link-shared/Cargo.toml
+++ b/crates/remowt-link-shared/Cargo.toml
@@ -12,8 +12,5 @@
serde_json.workspace = true
thiserror.workspace = true
tokio = { workspace = true, features = ["fs"] }
-remowt-fs.workspace = true
-remowt-systemd.workspace = true
remowt-ui-prompt.workspace = true
camino = { workspace = true, features = ["serde1"] }
-remowt-pty.workspace = true
crates/remowt-link-shared/src/lib.rsdiffbeforeafterboth--- a/crates/remowt-link-shared/src/lib.rs
+++ b/crates/remowt-link-shared/src/lib.rs
@@ -21,10 +21,6 @@
pub mod plugin;
-pub use remowt_fs::{Error as FsError, Fs, FsClient};
-pub use remowt_pty::{Error as PtyError, Pty, PtyClient, ShellId};
-pub use remowt_systemd::{Error as SystemdError, Systemd, SystemdClient};
-
#[derive(Serialize, Deserialize, Debug, thiserror::Error)]
pub enum ElevateError {
#[error("elevation failed: {0}")]
crates/remowt-nix-daemon/Cargo.tomldiffbeforeafterboth--- a/crates/remowt-nix-daemon/Cargo.toml
+++ /dev/null
@@ -1,18 +0,0 @@
-[package]
-name = "remowt-nix-daemon"
-description = "Nix daemon proxy"
-version.workspace = true
-edition = "2021"
-license.workspace = true
-
-[dependencies]
-anyhow.workspace = true
-bifrostlink.workspace = true
-bifrostlink-macros.workspace = true
-camino.workspace = true
-remowt-client.workspace = true
-serde = { workspace = true }
-thiserror.workspace = true
-tokio = { workspace = true, features = ["net", "io-util", "rt", "process"] }
-tracing.workspace = true
-uuid.workspace = true
crates/remowt-nix-daemon/src/lib.rsdiffbeforeafterboth--- a/crates/remowt-nix-daemon/src/lib.rs
+++ /dev/null
@@ -1,65 +0,0 @@
-use std::process::Stdio;
-
-use bifrostlink::declarative::endpoints;
-use bifrostlink::Config;
-use serde::{Deserialize, Serialize};
-use std::result::Result;
-use tokio::process::Command;
-
-pub const NIX_DAEMON_SOCKET: &str = "/nix/var/nix/daemon-socket/socket";
-
-pub struct NixDaemon;
-
-#[derive(Serialize, Deserialize, Debug, thiserror::Error)]
-pub enum Error {
- #[error("nix daemon unavailable: {0}")]
- DaemonUnavailable(String),
- #[error("tunnel socket unavailable: {0}")]
- Tunnel(String),
-}
-
-#[endpoints(ns = 4)]
-impl NixDaemon {
- #[endpoints(id = 1)]
- async fn connect_daemon(&self, socket: String) -> Result<(), Error> {
- let mut daemon = tokio::net::UnixStream::connect(NIX_DAEMON_SOCKET)
- .await
- .map_err(|e| Error::DaemonUnavailable(e.to_string()))?;
- let mut tunnel = tokio::net::UnixStream::connect(&socket)
- .await
- .map_err(|e| Error::Tunnel(e.to_string()))?;
- tokio::spawn(async move {
- if let Err(e) = tokio::io::copy_bidirectional(&mut daemon, &mut tunnel).await {
- tracing::debug!("nix daemon tunnel ended: {e}");
- }
- });
- Ok(())
- }
-
- #[endpoints(id = 2)]
- async fn serve_store(&self, store: String, socket: String) -> Result<(), Error> {
- let mut child = Command::new("nix-daemon")
- .arg("--stdio")
- .arg("--store")
- .arg(&store)
- .stdin(Stdio::piped())
- .stdout(Stdio::piped())
- .spawn()
- .map_err(|e| Error::DaemonUnavailable(e.to_string()))?;
- let tunnel = tokio::net::UnixStream::connect(&socket)
- .await
- .map_err(|e| Error::Tunnel(e.to_string()))?;
- let mut stdin = child.stdin.take().expect("piped");
- let mut stdout = child.stdout.take().expect("piped");
- tokio::spawn(async move {
- let mut tunnel = tunnel;
- let (mut tr, mut tw) = tunnel.split();
- let _ = tokio::join!(
- tokio::io::copy(&mut tr, &mut stdin),
- tokio::io::copy(&mut stdout, &mut tw),
- );
- let _ = child.wait().await;
- });
- Ok(())
- }
-}
crates/remowt-plugin/src/lib.rsdiffbeforeafterboth--- a/crates/remowt-plugin/src/lib.rs
+++ b/crates/remowt-plugin/src/lib.rs
@@ -8,7 +8,7 @@
pub mod host;
pub use bifrostlink;
-pub use remowt_link_shared::{self, Address, BifConfig, Fs, Pty, Systemd};
+pub use remowt_link_shared::{self, Address, BifConfig};
pub fn plugin_index() -> Result<u16> {
let arg = std::env::args()
crates/remowt-pty/Cargo.tomldiffbeforeafterboth--- a/crates/remowt-pty/Cargo.toml
+++ /dev/null
@@ -1,23 +0,0 @@
-[package]
-name = "remowt-pty"
-description = "PTY/shell endpoint for remowt"
-version.workspace = true
-edition = "2021"
-license.workspace = true
-
-[dependencies]
-bifrostlink.workspace = true
-bifrostlink-macros.workspace = true
-camino = { workspace = true, features = ["serde1"] }
-nix = { workspace = true, features = ["process", "term"] }
-serde = { workspace = true, features = ["derive"] }
-thiserror.workspace = true
-tokio = { workspace = true, features = [
- "net",
- "io-util",
- "rt",
- "macros",
- "process",
- "sync",
-] }
-tracing.workspace = true
crates/remowt-pty/src/lib.rsdiffbeforeafterboth--- a/crates/remowt-pty/src/lib.rs
+++ /dev/null
@@ -1,256 +0,0 @@
-use std::collections::HashMap;
-use std::io;
-use std::os::fd::{AsRawFd, OwnedFd};
-use std::pin::Pin;
-use std::process::Stdio;
-use std::sync::atomic::{AtomicU64, Ordering};
-use std::sync::{Arc, Mutex};
-use std::task::{Context, Poll};
-
-use bifrostlink::declarative::endpoints;
-use bifrostlink::Config;
-use camino::Utf8PathBuf;
-use nix::libc;
-use nix::pty::{openpty, OpenptyResult, Winsize};
-use serde::{Deserialize, Serialize};
-use tokio::io::unix::AsyncFd;
-use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
-use tokio::net::UnixStream;
-use tracing::{info, warn};
-
-pub type ShellId = u64;
-
-#[derive(Serialize, Deserialize, Debug, thiserror::Error)]
-pub enum Error {
- #[error("openpty failed: {0}")]
- Open(String),
- #[error("failed to spawn shell: {0}")]
- Spawn(String),
- #[error("failed to connect to forwarded socket: {0}")]
- Connect(String),
- #[error("no shell with that id")]
- NoSuchShell,
- #[error("resize failed: {0}")]
- Resize(String),
- #[error("io error: {0}")]
- Io(String),
-}
-
-impl From<io::Error> for Error {
- fn from(e: io::Error) -> Self {
- Error::Io(e.to_string())
- }
-}
-
-#[derive(Clone, Default)]
-pub struct Pty {
- shells: Arc<Mutex<HashMap<ShellId, OwnedFd>>>,
- next_id: Arc<AtomicU64>,
-}
-
-impl Pty {
- pub fn new() -> Self {
- Self::default()
- }
-}
-
-#[endpoints(ns = 7)]
-impl Pty {
- #[endpoints(id = 1)]
- async fn open_shell(
- &self,
- socket_path: Utf8PathBuf,
- term: String,
- cols: u16,
- rows: u16,
- ) -> Result<ShellId, Error> {
- let ws = Winsize {
- ws_row: rows,
- ws_col: cols,
- ws_xpixel: 0,
- ws_ypixel: 0,
- };
- let OpenptyResult { master, slave } =
- openpty(Some(&ws), None).map_err(|e| Error::Open(e.to_string()))?;
-
- let shell = std::env::var("SHELL").unwrap_or_else(|_| "/bin/sh".to_owned());
-
- let slave_in = slave.try_clone()?;
- let slave_out = slave.try_clone()?;
- let slave_err = slave;
-
- let mut cmd = tokio::process::Command::new(&shell);
- cmd.env("TERM", &term);
- if let Ok(home) = std::env::var("HOME") {
- cmd.current_dir(home);
- }
- cmd.stdin(Stdio::from(slave_in));
- cmd.stdout(Stdio::from(slave_out));
- cmd.stderr(Stdio::from(slave_err));
- // SAFETY: only async-signal-safe calls (setsid, ioctl) before exec.
- unsafe {
- cmd.pre_exec(|| {
- nix::unistd::setsid().map_err(|e| io::Error::from_raw_os_error(e as i32))?;
- if libc::ioctl(0, libc::TIOCSCTTY as _, 0) < 0 {
- return Err(io::Error::last_os_error());
- }
- Ok(())
- });
- }
-
- let mut child = cmd.spawn().map_err(|e| Error::Spawn(e.to_string()))?;
-
- let resize_fd = master.try_clone()?;
- let id = self.next_id.fetch_add(1, Ordering::Relaxed);
- self.shells
- .lock()
- .expect("not poisoned")
- .insert(id, resize_fd);
-
- let sock = match UnixStream::connect(&socket_path).await {
- Ok(s) => s,
- Err(e) => {
- self.shells.lock().expect("not poisoned").remove(&id);
- let _ = child.kill().await;
- return Err(Error::Connect(e.to_string()));
- }
- };
- let pty = AsyncPty::new(master)?;
-
- info!(id, shell, "shell opened");
- let shells = self.shells.clone();
- tokio::spawn(async move {
- let mut pty = pty;
- let mut sock = sock;
- if let Err(e) = tokio::io::copy_bidirectional(&mut pty, &mut sock).await {
- warn!(id, "shell pump ended: {e}");
- }
- let _ = child.kill().await;
- shells.lock().expect("not poisoned").remove(&id);
- info!(id, "shell closed");
- });
-
- Ok(id)
- }
-
- #[endpoints(id = 2)]
- async fn resize(&self, id: ShellId, cols: u16, rows: u16) -> Result<(), Error> {
- let ws = libc::winsize {
- ws_row: rows,
- ws_col: cols,
- ws_xpixel: 0,
- ws_ypixel: 0,
- };
- let shells = self.shells.lock().expect("not poisoned");
- let fd = shells.get(&id).ok_or(Error::NoSuchShell)?;
- // SAFETY: `fd` is a live PTY master
- let rc = unsafe { libc::ioctl(fd.as_raw_fd(), libc::TIOCSWINSZ as _, &ws) };
- if rc < 0 {
- return Err(Error::Resize(io::Error::last_os_error().to_string()));
- }
- Ok(())
- }
-}
-
-struct AsyncPty {
- fd: AsyncFd<OwnedFd>,
-}
-
-impl AsyncPty {
- fn new(fd: OwnedFd) -> io::Result<Self> {
- let raw = fd.as_raw_fd();
- // SAFETY: standard F_GETFL/F_SETFL round-trip on a valid fd.
- unsafe {
- let flags = libc::fcntl(raw, libc::F_GETFL);
- if flags < 0 {
- return Err(io::Error::last_os_error());
- }
- if libc::fcntl(raw, libc::F_SETFL, flags | libc::O_NONBLOCK) < 0 {
- return Err(io::Error::last_os_error());
- }
- }
- Ok(Self {
- fd: AsyncFd::new(fd)?,
- })
- }
-}
-
-impl AsyncRead for AsyncPty {
- fn poll_read(
- self: Pin<&mut Self>,
- cx: &mut Context<'_>,
- buf: &mut ReadBuf<'_>,
- ) -> Poll<io::Result<()>> {
- let this = self.get_mut();
- loop {
- let mut guard = match this.fd.poll_read_ready(cx) {
- Poll::Ready(Ok(g)) => g,
- Poll::Ready(Err(e)) => return Poll::Ready(Err(e)),
- Poll::Pending => return Poll::Pending,
- };
- let unfilled = buf.initialize_unfilled();
- let res = guard.try_io(|inner| {
- let fd = inner.get_ref().as_raw_fd();
- // SAFETY: writing into `unfilled`'s own backing storage.
- let n = unsafe { libc::read(fd, unfilled.as_mut_ptr().cast(), unfilled.len()) };
- if n < 0 {
- let err = io::Error::last_os_error();
- if err.raw_os_error() == Some(libc::EIO) {
- Ok(0)
- } else {
- Err(err)
- }
- } else {
- Ok(n as usize)
- }
- });
- match res {
- Ok(Ok(n)) => {
- buf.advance(n);
- return Poll::Ready(Ok(()));
- }
- Ok(Err(e)) => return Poll::Ready(Err(e)),
- Err(_would_block) => continue,
- }
- }
- }
-}
-
-impl AsyncWrite for AsyncPty {
- fn poll_write(
- self: Pin<&mut Self>,
- cx: &mut Context<'_>,
- buf: &[u8],
- ) -> Poll<io::Result<usize>> {
- let this = self.get_mut();
- loop {
- let mut guard = match this.fd.poll_write_ready(cx) {
- Poll::Ready(Ok(g)) => g,
- Poll::Ready(Err(e)) => return Poll::Ready(Err(e)),
- Poll::Pending => return Poll::Pending,
- };
- let res = guard.try_io(|inner| {
- let fd = inner.get_ref().as_raw_fd();
- // SAFETY: reading from `buf` for `buf.len()` bytes.
- let n = unsafe { libc::write(fd, buf.as_ptr().cast(), buf.len()) };
- if n < 0 {
- Err(io::Error::last_os_error())
- } else {
- Ok(n as usize)
- }
- });
- match res {
- Ok(r) => return Poll::Ready(r),
- Err(_would_block) => continue,
- }
- }
- }
-
- fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<io::Result<()>> {
- Poll::Ready(Ok(()))
- }
-
- fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<io::Result<()>> {
- Poll::Ready(Ok(()))
- }
-}
crates/remowt-systemd/Cargo.tomldiffbeforeafterboth--- a/crates/remowt-systemd/Cargo.toml
+++ /dev/null
@@ -1,13 +0,0 @@
-[package]
-name = "remowt-systemd"
-description = "systemd control endpoint for remowt/bifrostlink (over D-Bus)"
-version.workspace = true
-edition = "2021"
-license.workspace = true
-
-[dependencies]
-bifrostlink.workspace = true
-bifrostlink-macros.workspace = true
-serde = { workspace = true, features = ["derive"] }
-thiserror.workspace = true
-zbus = { workspace = true, features = ["tokio"] }
crates/remowt-systemd/src/lib.rsdiffbeforeafterboth--- a/crates/remowt-systemd/src/lib.rs
+++ /dev/null
@@ -1,54 +0,0 @@
-use bifrostlink::declarative::endpoints;
-use bifrostlink::Config;
-use serde::{Deserialize, Serialize};
-use zbus::proxy;
-use zbus::zvariant::OwnedObjectPath;
-
-pub struct Systemd;
-
-#[derive(Serialize, Deserialize, Debug, thiserror::Error)]
-pub enum Error {
- #[error("systemd request failed: {0}")]
- Failed(String),
-}
-
-#[proxy(
- interface = "org.freedesktop.systemd1.Manager",
- default_service = "org.freedesktop.systemd1",
- default_path = "/org/freedesktop/systemd1"
-)]
-trait Manager {
- fn start_unit(&self, name: &str, mode: &str) -> zbus::Result<OwnedObjectPath>;
- fn stop_unit(&self, name: &str, mode: &str) -> zbus::Result<OwnedObjectPath>;
-}
-
-async fn manager() -> Result<ManagerProxy<'static>, Error> {
- let conn = zbus::Connection::system()
- .await
- .map_err(|e| Error::Failed(e.to_string()))?;
- ManagerProxy::new(&conn)
- .await
- .map_err(|e| Error::Failed(e.to_string()))
-}
-
-#[endpoints(ns = 5)]
-impl Systemd {
- #[endpoints(id = 1)]
- async fn start(&self, unit: String) -> Result<(), Error> {
- manager()
- .await?
- .start_unit(&unit, "replace")
- .await
- .map_err(|e| Error::Failed(e.to_string()))?;
- Ok(())
- }
- #[endpoints(id = 2)]
- async fn stop(&self, unit: String) -> Result<(), Error> {
- manager()
- .await?
- .stop_unit(&unit, "replace")
- .await
- .map_err(|e| Error::Failed(e.to_string()))?;
- Ok(())
- }
-}
crates/remowt-ui-prompt/Cargo.tomldiffbeforeafterboth--- /dev/null
+++ b/crates/remowt-ui-prompt/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+name = "remowt-ui-prompt"
+description = "Interactive UI prompt endpoint for remowt (D-Bus)"
+version.workspace = true
+edition = "2021"
+license.workspace = true
+
+[dependencies]
+bifrostlink.workspace = true
+bifrostlink-macros.workspace = true
+serde.workspace = true
+serde_json.workspace = true
+thiserror.workspace = true
+tokio = { workspace = true, features = ["io-util", "macros", "process", "rt"] }
+tracing.workspace = true
+zbus = { workspace = true, optional = true }
+
+[features]
+default = ["dbus"]
+dbus = ["dep:zbus"]
crates/remowt-ui-prompt/src/bifrost.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/remowt-ui-prompt/src/bifrost.rs
@@ -0,0 +1,109 @@
+use bifrostlink::{Config, Rpc};
+use bifrostlink_macros::endpoints;
+use serde::{Deserialize, Serialize};
+
+use crate::{Error, Prompter, Source};
+
+pub struct PromptEndpoints<P>(pub P);
+
+#[endpoints(ns = 2)]
+impl<P> PromptEndpoints<P>
+where
+ P: Prompter + Send + Sync + 'static,
+{
+ #[endpoints(id = 1, cancel)]
+ async fn prompt_enum(
+ &self,
+ prompt: String,
+ description: String,
+ variants: Vec<String>,
+ source: Vec<Source>,
+ ) -> Result<u32, Error> {
+ let variants: Vec<&str> = variants.iter().map(|v| v.as_str()).collect();
+ self.0
+ .prompt_enum(&prompt, &description, &variants, &source)
+ .await
+ }
+
+ #[endpoints(id = 2, cancel)]
+ async fn prompt_text(
+ &self,
+ echo: bool,
+ prompt: String,
+ description: String,
+ source: Vec<Source>,
+ ) -> Result<String, Error> {
+ self.0
+ .prompt_text(echo, &prompt, &description, &source)
+ .await
+ }
+
+ #[endpoints(id = 3, cancel)]
+ async fn display_text(
+ &self,
+ error: bool,
+ description: String,
+ source: Vec<Source>,
+ ) -> Result<(), Error> {
+ self.0.display_text(error, &description, &source).await
+ }
+}
+
+impl<C: Config> Prompter for PromptEndpointsClient<C>
+where
+ Error: ToString,
+{
+ async fn prompt_enum(
+ &self,
+ prompt: &str,
+ description: &str,
+ variants: &[&str],
+ source: &[Source],
+ ) -> crate::Result<u32> {
+ self.prompt_enum(
+ prompt.to_owned(),
+ description.to_owned(),
+ variants.iter().map(|v| (*v).to_owned()).collect(),
+ source.to_vec(),
+ )
+ .await
+ .map_err(|e| Error::Remote(e.to_string()))?
+ }
+
+ async fn prompt_text(
+ &self,
+ echo: bool,
+ prompt: &str,
+ description: &str,
+ source: &[Source],
+ ) -> crate::Result<String> {
+ self.prompt_text(
+ echo,
+ prompt.to_owned(),
+ description.to_owned(),
+ source.to_vec(),
+ )
+ .await
+ .map_err(|e| Error::Remote(e.to_string()))?
+ }
+
+ async fn display_text(
+ &self,
+ error: bool,
+ description: &str,
+ source: &[Source],
+ ) -> crate::Result<()> {
+ self.display_text(error, description.to_owned(), source.to_vec())
+ .await
+ .map_err(|e| Error::Remote(e.to_string()))?
+ }
+}
+
+pub fn serve_prompts<P, C>(rpc: &mut Rpc<C>, prompt: P)
+where
+ P: Prompter + Send + Sync + 'static,
+ C: Config,
+ C::Error: From<Error>,
+{
+ PromptEndpoints(prompt).register_endpoints(rpc);
+}
crates/remowt-ui-prompt/src/dbus.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/remowt-ui-prompt/src/dbus.rs
@@ -0,0 +1,135 @@
+use zbus::interface;
+use zbus::{fdo, proxy};
+
+use crate::Source;
+use crate::{BlockingPrompter, Result};
+use crate::{Error, Prompter};
+
+pub struct DbusPrompterInterface<P>(pub P);
+
+#[interface(name = "lach.PolkitInputHandler")]
+impl<P: Prompter + Send + Sync + 'static> DbusPrompterInterface<P> {
+ async fn prompt_radio(
+ &self,
+ prompt: &str,
+ description: &str,
+ source: Vec<Source>,
+ ) -> fdo::Result<bool> {
+ Ok(self.0.prompt_radio(prompt, description, &source).await?)
+ }
+ async fn prompt_text(
+ &self,
+ echo: bool,
+ prompt: &str,
+ description: &str,
+ source: Vec<Source>,
+ ) -> fdo::Result<String> {
+ Ok(self
+ .0
+ .prompt_text(echo, prompt, description, &source)
+ .await?)
+ }
+ async fn display_text(
+ &self,
+ error: bool,
+ description: &str,
+ source: Vec<Source>,
+ ) -> fdo::Result<()> {
+ Ok(self.0.display_text(error, description, &source).await?)
+ }
+}
+
+#[proxy(interface = "lach.PolkitInputHandler")]
+pub trait DbusPrompter {
+ async fn prompt_enum(
+ &self,
+ prompt: &str,
+ description: &str,
+ variants: &[&str],
+ source: &[Source],
+ ) -> fdo::Result<u32>;
+ async fn prompt_text(
+ &self,
+ echo: bool,
+ prompt: &str,
+ description: &str,
+ source: &[Source],
+ ) -> fdo::Result<String>;
+ async fn display_text(
+ &self,
+ error: bool,
+ description: &str,
+ source: &[Source],
+ ) -> fdo::Result<()>;
+}
+
+impl Prompter for DbusPrompterProxy<'_> {
+ async fn prompt_enum(
+ &self,
+ prompt: &str,
+ description: &str,
+ variants: &[&str],
+ source: &[Source],
+ ) -> Result<u32> {
+ Ok(self
+ .prompt_enum(prompt, description, variants, source)
+ .await?)
+ }
+
+ async fn prompt_text(
+ &self,
+ echo: bool,
+ prompt: &str,
+ description: &str,
+ source: &[Source],
+ ) -> Result<String> {
+ Ok(self.prompt_text(echo, prompt, description, source).await?)
+ }
+
+ async fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()> {
+ Ok(self.display_text(error, description, source).await?)
+ }
+}
+impl BlockingPrompter for DbusPrompterProxyBlocking<'_> {
+ fn prompt_enum(
+ &self,
+ prompt: &str,
+ description: &str,
+ variants: &[&str],
+ source: &[Source],
+ ) -> Result<u32> {
+ Ok(self.prompt_enum(prompt, description, variants, source)?)
+ }
+
+ fn prompt_text(
+ &self,
+ echo: bool,
+ prompt: &str,
+ description: &str,
+ source: &[Source],
+ ) -> Result<String> {
+ Ok(self.prompt_text(echo, prompt, description, source)?)
+ }
+
+ fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()> {
+ Ok(self.display_text(error, description, source)?)
+ }
+}
+
+impl From<fdo::Error> for Error {
+ fn from(value: fdo::Error) -> Self {
+ if matches!(value, fdo::Error::NoReply(_)) {
+ return Self::Cancel;
+ }
+ Self::InputError(format!("{value}"))
+ }
+}
+impl From<Error> for fdo::Error {
+ fn from(value: Error) -> Self {
+ match value {
+ Error::Cancel => fdo::Error::NoReply("input was cancelled".to_owned()),
+ Error::Remote(e) => fdo::Error::NoReply(format!("remote error occured: {e}")),
+ Error::InputError(e) => fdo::Error::Failed(e),
+ }
+ }
+}
crates/remowt-ui-prompt/src/lib.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/remowt-ui-prompt/src/lib.rs
@@ -0,0 +1,201 @@
+use core::fmt;
+use std::borrow::Cow;
+use std::future::Future;
+use std::result;
+
+pub mod bifrost;
+pub mod dbus;
+pub mod rofi;
+
+#[derive(thiserror::Error, Debug, serde::Serialize, serde::Deserialize)]
+pub enum Error {
+ #[error("user has cancelled input")]
+ Cancel,
+ #[error("input error: {0}")]
+ InputError(String),
+ #[error("unknown remote error: {0}")]
+ Remote(String),
+}
+
+pub type Result<T, E = Error> = result::Result<T, E>;
+
+#[cfg_attr(feature = "dbus", derive(zbus::zvariant::Type))]
+#[derive(serde::Serialize, serde::Deserialize, Clone)]
+pub struct Source(pub Cow<'static, str>);
+impl fmt::Display for Source {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "<u>{}</u>", self.0)
+ }
+}
+
+pub trait Prompter: Send + Sync {
+ fn prompt_radio(
+ &self,
+ prompt: &str,
+ description: &str,
+ source: &[Source],
+ ) -> impl Future<Output = Result<bool>> + Send {
+ let fut = self.prompt_enum(prompt, description, &["No", "Yes"], source);
+ async { fut.await.map(|v| v == 1) }
+ }
+ fn prompt_enum(
+ &self,
+ prompt: &str,
+ description: &str,
+ variants: &[&str],
+ source: &[Source],
+ ) -> impl Future<Output = Result<u32>> + Send;
+ fn prompt_text(
+ &self,
+ echo: bool,
+ prompt: &str,
+ description: &str,
+ source: &[Source],
+ ) -> impl Future<Output = Result<String>> + Send;
+ fn display_text(
+ &self,
+ error: bool,
+ description: &str,
+ source: &[Source],
+ ) -> impl Future<Output = Result<()>> + Send;
+}
+pub trait BlockingPrompter {
+ fn prompt_radio(&self, prompt: &str, description: &str, source: &[Source]) -> Result<bool> {
+ self.prompt_enum(prompt, description, &["No", "Yes"], source)
+ .map(|v| v == 1)
+ }
+ fn prompt_enum(
+ &self,
+ prompt: &str,
+ description: &str,
+ variants: &[&str],
+ source: &[Source],
+ ) -> Result<u32>;
+ fn prompt_text(
+ &self,
+ echo: bool,
+ prompt: &str,
+ description: &str,
+ source: &[Source],
+ ) -> Result<String>;
+ fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()>;
+}
+impl<P> Prompter for &P
+where
+ P: Prompter,
+{
+ fn prompt_radio(
+ &self,
+ prompt: &str,
+ description: &str,
+ source: &[Source],
+ ) -> impl Future<Output = Result<bool>> + Send {
+ (*self).prompt_radio(prompt, description, source)
+ }
+
+ fn prompt_enum(
+ &self,
+ prompt: &str,
+ description: &str,
+ variants: &[&str],
+ source: &[Source],
+ ) -> impl Future<Output = Result<u32>> + Send {
+ (*self).prompt_enum(prompt, description, variants, source)
+ }
+
+ fn prompt_text(
+ &self,
+ echo: bool,
+ prompt: &str,
+ description: &str,
+ source: &[Source],
+ ) -> impl Future<Output = Result<String>> + Send {
+ (*self).prompt_text(echo, prompt, description, source)
+ }
+
+ fn display_text(
+ &self,
+ error: bool,
+ description: &str,
+ source: &[Source],
+ ) -> impl Future<Output = Result<()>> + Send {
+ (*self).display_text(error, description, source)
+ }
+}
+
+pub struct PrependSourcePrompter<P> {
+ pub prompter: P,
+ pub source: Vec<Source>,
+ pub description: String,
+}
+impl<P> PrependSourcePrompter<P> {
+ fn source(&self, input: &[Source]) -> Vec<Source> {
+ let mut out = self.source.clone();
+ out.extend(input.iter().cloned());
+ out
+ }
+ fn description(&self, input: &str) -> String {
+ if self.description.is_empty() {
+ input.to_owned()
+ } else if input.is_empty() {
+ self.description.to_owned()
+ } else {
+ format!("{input}\n\n{}", self.description)
+ }
+ }
+}
+impl<P> Prompter for PrependSourcePrompter<P>
+where
+ P: Prompter + Sync,
+{
+ async fn prompt_radio(
+ &self,
+ prompt: &str,
+ description: &str,
+ source: &[Source],
+ ) -> Result<bool> {
+ self.prompter
+ .prompt_radio(prompt, &self.description(description), &self.source(source))
+ .await
+ }
+
+ async fn prompt_enum(
+ &self,
+ prompt: &str,
+ description: &str,
+ variants: &[&str],
+ source: &[Source],
+ ) -> Result<u32> {
+ self.prompter
+ .prompt_enum(
+ prompt,
+ &self.description(description),
+ variants,
+ &self.source(source),
+ )
+ .await
+ }
+
+ async fn prompt_text(
+ &self,
+ echo: bool,
+ prompt: &str,
+ description: &str,
+ source: &[Source],
+ ) -> Result<String> {
+ self.prompter
+ .prompt_text(
+ echo,
+ prompt,
+ &self.description(description),
+ &self.source(source),
+ )
+ .await
+ }
+
+ async fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()> {
+ self.prompter
+ .display_text(error, &self.description(description), &self.source(source))
+ .await
+ }
+}
crates/remowt-ui-prompt/src/rofi.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/remowt-ui-prompt/src/rofi.rs
@@ -0,0 +1,208 @@
+use std::process::Stdio;
+
+use tokio::io::AsyncWriteExt;
+use tokio::process::Command;
+use tracing::trace;
+
+use crate::{Error, Prompter, Result, Source};
+
+#[derive(Clone)]
+pub struct RofiPrompter;
+
+fn fixup_prompt(prompt: &str) -> &str {
+ // Rofi always appends such suffix
+ prompt.strip_suffix(": ").unwrap_or(prompt)
+}
+
+fn rofi_command() -> Command {
+ Command::new(option_env!("ROFI").unwrap_or("rofi"))
+}
+
+impl Prompter for RofiPrompter {
+ async fn prompt_enum(
+ &self,
+ prompt: &str,
+ description: &str,
+ variants: &[&str],
+ source: &[Source],
+ ) -> Result<u32> {
+ trace!("rofi radio");
+ let mut cmd = rofi_command();
+ let mesg = if source.is_empty() {
+ description.to_owned()
+ } else {
+ let mut out = format!("{description}\n\n<b>Requested on ",);
+ for (i, s) in source.iter().enumerate() {
+ if i != 0 {
+ out.push_str(" -> ");
+ }
+ out.push_str(&s.to_string());
+ }
+ out.push_str("</b>");
+ out
+ };
+ cmd.args([
+ "-dmenu",
+ "-mesg",
+ &mesg,
+ "-sync",
+ "-only-match",
+ "-p",
+ fixup_prompt(prompt),
+ "-format",
+ "i",
+ "-markup-rows",
+ ]);
+ cmd.stdin(Stdio::piped());
+ cmd.stdout(Stdio::piped());
+ cmd.kill_on_drop(true);
+ let mut child = cmd
+ .spawn()
+ .map_err(|e| Error::InputError(format!("failed to spawn rofi: {e}")))?;
+
+ let mut stdin = child.stdin.take().expect("stdin is piped");
+ for var in variants {
+ stdin
+ .write_all(var.replace('\n', " ").as_bytes())
+ .await
+ .map_err(|e| Error::InputError(format!("failed to write rofi variants: {e}")))?;
+ stdin
+ .write_all(b"\n")
+ .await
+ .map_err(|e| Error::InputError(format!("failed to write rofi variants: {e}")))?;
+ }
+ // write_all already flushes, just to be sure.
+ let _ = stdin.flush().await;
+ drop(stdin);
+
+ let out = child
+ .wait_with_output()
+ .await
+ .map_err(|e| Error::InputError(format!("failed to wait for rofi: {e}")))?;
+ let stdout = out
+ .stdout
+ .strip_suffix(b"\n")
+ .unwrap_or(&out.stdout)
+ .to_owned();
+
+ let id: u32 = String::from_utf8(stdout)
+ .map_err(|e| Error::InputError(format!("rofi produced invalid output: {e}")))?
+ .parse()
+ .map_err(|e| Error::InputError(format!("rofi produced invalid output: {e}")))?;
+ if id as usize >= variants.len() {
+ return Err(Error::InputError("invalid rofi response".to_owned()));
+ }
+
+ Ok(id)
+ }
+
+ async fn prompt_text(
+ &self,
+ echo: bool,
+ prompt: &str,
+ description: &str,
+ source: &[Source],
+ ) -> Result<String> {
+ trace!("rofi text");
+ let mut cmd = rofi_command();
+ let mesg = if source.is_empty() {
+ description.to_owned()
+ } else {
+ let mut out = format!("{description}\n\n<b>Requested on ",);
+ for (i, s) in source.iter().enumerate() {
+ if i != 0 {
+ out.push_str(" -> ");
+ }
+ out.push_str(&s.to_string());
+ }
+ out.push_str("</b>");
+ out
+ };
+ cmd.args(["-dmenu", "-mesg", &mesg, "-p", fixup_prompt(prompt)]);
+ if !echo {
+ cmd.arg("-password");
+ }
+ cmd.stdin(Stdio::null());
+ cmd.stdout(Stdio::piped());
+ cmd.kill_on_drop(true);
+ let child = cmd
+ .spawn()
+ .map_err(|e| Error::InputError(format!("failed to spawn rofi: {e}")))?;
+
+ let out = child
+ .wait_with_output()
+ .await
+ .map_err(|e| Error::InputError(format!("failed to wait for rofi: {e}")))?;
+ let stdout = out
+ .stdout
+ .strip_suffix(b"\n")
+ .unwrap_or(&out.stdout)
+ .to_owned();
+
+ Ok(String::from_utf8_lossy(&stdout).to_string())
+ }
+
+ async fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()> {
+ trace!("rofi display");
+ let mut cmd = rofi_command();
+ let mut mesg = if source.is_empty() {
+ description.to_owned()
+ } else {
+ let mut out = format!("{description}\n\n<b>Coming from ",);
+ for s in source.iter() {
+ out.push_str(&s.to_string());
+ }
+ out.push_str("</b>");
+ out
+ };
+ if error {
+ mesg.insert_str(0, "<span color=\"red\">");
+ mesg.push_str("</span>");
+ }
+ cmd.args(["-e", &mesg, "-markup"]);
+ cmd.stdin(Stdio::null());
+ cmd.stdout(Stdio::null());
+ cmd.kill_on_drop(true);
+ let mut child = cmd
+ .spawn()
+ .map_err(|e| Error::InputError(format!("failed to spawn rofi: {e}")))?;
+
+ child
+ .wait()
+ .await
+ .map_err(|e| Error::InputError(format!("failed to wait for rofi: {e}")))?;
+
+ Ok(())
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use std::borrow::Cow;
+
+ use crate::rofi::RofiPrompter;
+ use crate::{PrependSourcePrompter, Prompter as _, Source};
+
+ // #[tokio::test]
+ #[tokio::test]
+ #[ignore = "interactive"]
+ async fn test() {
+ let prompter = PrependSourcePrompter {
+ prompter: RofiPrompter,
+ description: "test".to_owned(),
+ source: vec![Source(Cow::Borrowed("ssh"))],
+ };
+ prompter
+ .prompt_radio("Enable", "Polkit needs access", &[])
+ .await
+ .expect("rofi");
+ prompter
+ .prompt_text(false, "Password", "Polkit needs access", &[])
+ .await
+ .expect("rofi");
+ prompter
+ .display_text(true, "Polkit needs access", &[])
+ .await
+ .expect("rofi");
+ }
+}
crates/ui-prompt/Cargo.tomldiffbeforeafterboth--- a/crates/ui-prompt/Cargo.toml
+++ /dev/null
@@ -1,20 +0,0 @@
-[package]
-name = "remowt-ui-prompt"
-description = "Interactive UI prompt endpoint for remowt (D-Bus)"
-version.workspace = true
-edition = "2021"
-license.workspace = true
-
-[dependencies]
-bifrostlink.workspace = true
-bifrostlink-macros.workspace = true
-serde.workspace = true
-serde_json.workspace = true
-thiserror.workspace = true
-tokio = { workspace = true, features = ["io-util", "macros", "process", "rt"] }
-tracing.workspace = true
-zbus = { workspace = true, optional = true }
-
-[features]
-default = ["dbus"]
-dbus = ["dep:zbus"]
crates/ui-prompt/src/bifrost.rsdiffbeforeafterboth--- a/crates/ui-prompt/src/bifrost.rs
+++ /dev/null
@@ -1,109 +0,0 @@
-use bifrostlink::{Config, Rpc};
-use bifrostlink_macros::endpoints;
-use serde::{Deserialize, Serialize};
-
-use crate::{Error, Prompter, Source};
-
-pub struct PromptEndpoints<P>(pub P);
-
-#[endpoints(ns = 2)]
-impl<P> PromptEndpoints<P>
-where
- P: Prompter + Send + Sync + 'static,
-{
- #[endpoints(id = 1, cancel)]
- async fn prompt_enum(
- &self,
- prompt: String,
- description: String,
- variants: Vec<String>,
- source: Vec<Source>,
- ) -> Result<u32, Error> {
- let variants: Vec<&str> = variants.iter().map(|v| v.as_str()).collect();
- self.0
- .prompt_enum(&prompt, &description, &variants, &source)
- .await
- }
-
- #[endpoints(id = 2, cancel)]
- async fn prompt_text(
- &self,
- echo: bool,
- prompt: String,
- description: String,
- source: Vec<Source>,
- ) -> Result<String, Error> {
- self.0
- .prompt_text(echo, &prompt, &description, &source)
- .await
- }
-
- #[endpoints(id = 3, cancel)]
- async fn display_text(
- &self,
- error: bool,
- description: String,
- source: Vec<Source>,
- ) -> Result<(), Error> {
- self.0.display_text(error, &description, &source).await
- }
-}
-
-impl<C: Config> Prompter for PromptEndpointsClient<C>
-where
- Error: ToString,
-{
- async fn prompt_enum(
- &self,
- prompt: &str,
- description: &str,
- variants: &[&str],
- source: &[Source],
- ) -> crate::Result<u32> {
- self.prompt_enum(
- prompt.to_owned(),
- description.to_owned(),
- variants.iter().map(|v| (*v).to_owned()).collect(),
- source.to_vec(),
- )
- .await
- .map_err(|e| Error::Remote(e.to_string()))?
- }
-
- async fn prompt_text(
- &self,
- echo: bool,
- prompt: &str,
- description: &str,
- source: &[Source],
- ) -> crate::Result<String> {
- self.prompt_text(
- echo,
- prompt.to_owned(),
- description.to_owned(),
- source.to_vec(),
- )
- .await
- .map_err(|e| Error::Remote(e.to_string()))?
- }
-
- async fn display_text(
- &self,
- error: bool,
- description: &str,
- source: &[Source],
- ) -> crate::Result<()> {
- self.display_text(error, description.to_owned(), source.to_vec())
- .await
- .map_err(|e| Error::Remote(e.to_string()))?
- }
-}
-
-pub fn serve_prompts<P, C>(rpc: &mut Rpc<C>, prompt: P)
-where
- P: Prompter + Send + Sync + 'static,
- C: Config,
- C::Error: From<Error>,
-{
- PromptEndpoints(prompt).register_endpoints(rpc);
-}
crates/ui-prompt/src/dbus.rsdiffbeforeafterboth--- a/crates/ui-prompt/src/dbus.rs
+++ /dev/null
@@ -1,135 +0,0 @@
-use zbus::interface;
-use zbus::{fdo, proxy};
-
-use crate::Source;
-use crate::{BlockingPrompter, Result};
-use crate::{Error, Prompter};
-
-pub struct DbusPrompterInterface<P>(pub P);
-
-#[interface(name = "lach.PolkitInputHandler")]
-impl<P: Prompter + Send + Sync + 'static> DbusPrompterInterface<P> {
- async fn prompt_radio(
- &self,
- prompt: &str,
- description: &str,
- source: Vec<Source>,
- ) -> fdo::Result<bool> {
- Ok(self.0.prompt_radio(prompt, description, &source).await?)
- }
- async fn prompt_text(
- &self,
- echo: bool,
- prompt: &str,
- description: &str,
- source: Vec<Source>,
- ) -> fdo::Result<String> {
- Ok(self
- .0
- .prompt_text(echo, prompt, description, &source)
- .await?)
- }
- async fn display_text(
- &self,
- error: bool,
- description: &str,
- source: Vec<Source>,
- ) -> fdo::Result<()> {
- Ok(self.0.display_text(error, description, &source).await?)
- }
-}
-
-#[proxy(interface = "lach.PolkitInputHandler")]
-pub trait DbusPrompter {
- async fn prompt_enum(
- &self,
- prompt: &str,
- description: &str,
- variants: &[&str],
- source: &[Source],
- ) -> fdo::Result<u32>;
- async fn prompt_text(
- &self,
- echo: bool,
- prompt: &str,
- description: &str,
- source: &[Source],
- ) -> fdo::Result<String>;
- async fn display_text(
- &self,
- error: bool,
- description: &str,
- source: &[Source],
- ) -> fdo::Result<()>;
-}
-
-impl Prompter for DbusPrompterProxy<'_> {
- async fn prompt_enum(
- &self,
- prompt: &str,
- description: &str,
- variants: &[&str],
- source: &[Source],
- ) -> Result<u32> {
- Ok(self
- .prompt_enum(prompt, description, variants, source)
- .await?)
- }
-
- async fn prompt_text(
- &self,
- echo: bool,
- prompt: &str,
- description: &str,
- source: &[Source],
- ) -> Result<String> {
- Ok(self.prompt_text(echo, prompt, description, source).await?)
- }
-
- async fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()> {
- Ok(self.display_text(error, description, source).await?)
- }
-}
-impl BlockingPrompter for DbusPrompterProxyBlocking<'_> {
- fn prompt_enum(
- &self,
- prompt: &str,
- description: &str,
- variants: &[&str],
- source: &[Source],
- ) -> Result<u32> {
- Ok(self.prompt_enum(prompt, description, variants, source)?)
- }
-
- fn prompt_text(
- &self,
- echo: bool,
- prompt: &str,
- description: &str,
- source: &[Source],
- ) -> Result<String> {
- Ok(self.prompt_text(echo, prompt, description, source)?)
- }
-
- fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()> {
- Ok(self.display_text(error, description, source)?)
- }
-}
-
-impl From<fdo::Error> for Error {
- fn from(value: fdo::Error) -> Self {
- if matches!(value, fdo::Error::NoReply(_)) {
- return Self::Cancel;
- }
- Self::InputError(format!("{value}"))
- }
-}
-impl From<Error> for fdo::Error {
- fn from(value: Error) -> Self {
- match value {
- Error::Cancel => fdo::Error::NoReply("input was cancelled".to_owned()),
- Error::Remote(e) => fdo::Error::NoReply(format!("remote error occured: {e}")),
- Error::InputError(e) => fdo::Error::Failed(e),
- }
- }
-}
crates/ui-prompt/src/lib.rsdiffbeforeafterboth--- a/crates/ui-prompt/src/lib.rs
+++ /dev/null
@@ -1,201 +0,0 @@
-use core::fmt;
-use std::borrow::Cow;
-use std::future::Future;
-use std::result;
-
-pub mod bifrost;
-pub mod dbus;
-pub mod rofi;
-
-#[derive(thiserror::Error, Debug, serde::Serialize, serde::Deserialize)]
-pub enum Error {
- #[error("user has cancelled input")]
- Cancel,
- #[error("input error: {0}")]
- InputError(String),
- #[error("unknown remote error: {0}")]
- Remote(String),
-}
-
-pub type Result<T, E = Error> = result::Result<T, E>;
-
-#[cfg_attr(feature = "dbus", derive(zbus::zvariant::Type))]
-#[derive(serde::Serialize, serde::Deserialize, Clone)]
-pub struct Source(pub Cow<'static, str>);
-impl fmt::Display for Source {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(f, "<u>{}</u>", self.0)
- }
-}
-
-pub trait Prompter: Send + Sync {
- fn prompt_radio(
- &self,
- prompt: &str,
- description: &str,
- source: &[Source],
- ) -> impl Future<Output = Result<bool>> + Send {
- let fut = self.prompt_enum(prompt, description, &["No", "Yes"], source);
- async { fut.await.map(|v| v == 1) }
- }
- fn prompt_enum(
- &self,
- prompt: &str,
- description: &str,
- variants: &[&str],
- source: &[Source],
- ) -> impl Future<Output = Result<u32>> + Send;
- fn prompt_text(
- &self,
- echo: bool,
- prompt: &str,
- description: &str,
- source: &[Source],
- ) -> impl Future<Output = Result<String>> + Send;
- fn display_text(
- &self,
- error: bool,
- description: &str,
- source: &[Source],
- ) -> impl Future<Output = Result<()>> + Send;
-}
-pub trait BlockingPrompter {
- fn prompt_radio(&self, prompt: &str, description: &str, source: &[Source]) -> Result<bool> {
- self.prompt_enum(prompt, description, &["No", "Yes"], source)
- .map(|v| v == 1)
- }
- fn prompt_enum(
- &self,
- prompt: &str,
- description: &str,
- variants: &[&str],
- source: &[Source],
- ) -> Result<u32>;
- fn prompt_text(
- &self,
- echo: bool,
- prompt: &str,
- description: &str,
- source: &[Source],
- ) -> Result<String>;
- fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()>;
-}
-impl<P> Prompter for &P
-where
- P: Prompter,
-{
- fn prompt_radio(
- &self,
- prompt: &str,
- description: &str,
- source: &[Source],
- ) -> impl Future<Output = Result<bool>> + Send {
- (*self).prompt_radio(prompt, description, source)
- }
-
- fn prompt_enum(
- &self,
- prompt: &str,
- description: &str,
- variants: &[&str],
- source: &[Source],
- ) -> impl Future<Output = Result<u32>> + Send {
- (*self).prompt_enum(prompt, description, variants, source)
- }
-
- fn prompt_text(
- &self,
- echo: bool,
- prompt: &str,
- description: &str,
- source: &[Source],
- ) -> impl Future<Output = Result<String>> + Send {
- (*self).prompt_text(echo, prompt, description, source)
- }
-
- fn display_text(
- &self,
- error: bool,
- description: &str,
- source: &[Source],
- ) -> impl Future<Output = Result<()>> + Send {
- (*self).display_text(error, description, source)
- }
-}
-
-pub struct PrependSourcePrompter<P> {
- pub prompter: P,
- pub source: Vec<Source>,
- pub description: String,
-}
-impl<P> PrependSourcePrompter<P> {
- fn source(&self, input: &[Source]) -> Vec<Source> {
- let mut out = self.source.clone();
- out.extend(input.iter().cloned());
- out
- }
- fn description(&self, input: &str) -> String {
- if self.description.is_empty() {
- input.to_owned()
- } else if input.is_empty() {
- self.description.to_owned()
- } else {
- format!("{input}\n\n{}", self.description)
- }
- }
-}
-impl<P> Prompter for PrependSourcePrompter<P>
-where
- P: Prompter + Sync,
-{
- async fn prompt_radio(
- &self,
- prompt: &str,
- description: &str,
- source: &[Source],
- ) -> Result<bool> {
- self.prompter
- .prompt_radio(prompt, &self.description(description), &self.source(source))
- .await
- }
-
- async fn prompt_enum(
- &self,
- prompt: &str,
- description: &str,
- variants: &[&str],
- source: &[Source],
- ) -> Result<u32> {
- self.prompter
- .prompt_enum(
- prompt,
- &self.description(description),
- variants,
- &self.source(source),
- )
- .await
- }
-
- async fn prompt_text(
- &self,
- echo: bool,
- prompt: &str,
- description: &str,
- source: &[Source],
- ) -> Result<String> {
- self.prompter
- .prompt_text(
- echo,
- prompt,
- &self.description(description),
- &self.source(source),
- )
- .await
- }
-
- async fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()> {
- self.prompter
- .display_text(error, &self.description(description), &self.source(source))
- .await
- }
-}
crates/ui-prompt/src/rofi.rsdiffbeforeafterboth--- a/crates/ui-prompt/src/rofi.rs
+++ /dev/null
@@ -1,208 +0,0 @@
-use std::process::Stdio;
-
-use tokio::io::AsyncWriteExt;
-use tokio::process::Command;
-use tracing::trace;
-
-use crate::{Error, Prompter, Result, Source};
-
-#[derive(Clone)]
-pub struct RofiPrompter;
-
-fn fixup_prompt(prompt: &str) -> &str {
- // Rofi always appends such suffix
- prompt.strip_suffix(": ").unwrap_or(prompt)
-}
-
-fn rofi_command() -> Command {
- Command::new(option_env!("ROFI").unwrap_or("rofi"))
-}
-
-impl Prompter for RofiPrompter {
- async fn prompt_enum(
- &self,
- prompt: &str,
- description: &str,
- variants: &[&str],
- source: &[Source],
- ) -> Result<u32> {
- trace!("rofi radio");
- let mut cmd = rofi_command();
- let mesg = if source.is_empty() {
- description.to_owned()
- } else {
- let mut out = format!("{description}\n\n<b>Requested on ",);
- for (i, s) in source.iter().enumerate() {
- if i != 0 {
- out.push_str(" -> ");
- }
- out.push_str(&s.to_string());
- }
- out.push_str("</b>");
- out
- };
- cmd.args([
- "-dmenu",
- "-mesg",
- &mesg,
- "-sync",
- "-only-match",
- "-p",
- fixup_prompt(prompt),
- "-format",
- "i",
- "-markup-rows",
- ]);
- cmd.stdin(Stdio::piped());
- cmd.stdout(Stdio::piped());
- cmd.kill_on_drop(true);
- let mut child = cmd
- .spawn()
- .map_err(|e| Error::InputError(format!("failed to spawn rofi: {e}")))?;
-
- let mut stdin = child.stdin.take().expect("stdin is piped");
- for var in variants {
- stdin
- .write_all(var.replace('\n', " ").as_bytes())
- .await
- .map_err(|e| Error::InputError(format!("failed to write rofi variants: {e}")))?;
- stdin
- .write_all(b"\n")
- .await
- .map_err(|e| Error::InputError(format!("failed to write rofi variants: {e}")))?;
- }
- // write_all already flushes, just to be sure.
- let _ = stdin.flush().await;
- drop(stdin);
-
- let out = child
- .wait_with_output()
- .await
- .map_err(|e| Error::InputError(format!("failed to wait for rofi: {e}")))?;
- let stdout = out
- .stdout
- .strip_suffix(b"\n")
- .unwrap_or(&out.stdout)
- .to_owned();
-
- let id: u32 = String::from_utf8(stdout)
- .map_err(|e| Error::InputError(format!("rofi produced invalid output: {e}")))?
- .parse()
- .map_err(|e| Error::InputError(format!("rofi produced invalid output: {e}")))?;
- if id as usize >= variants.len() {
- return Err(Error::InputError("invalid rofi response".to_owned()));
- }
-
- Ok(id)
- }
-
- async fn prompt_text(
- &self,
- echo: bool,
- prompt: &str,
- description: &str,
- source: &[Source],
- ) -> Result<String> {
- trace!("rofi text");
- let mut cmd = rofi_command();
- let mesg = if source.is_empty() {
- description.to_owned()
- } else {
- let mut out = format!("{description}\n\n<b>Requested on ",);
- for (i, s) in source.iter().enumerate() {
- if i != 0 {
- out.push_str(" -> ");
- }
- out.push_str(&s.to_string());
- }
- out.push_str("</b>");
- out
- };
- cmd.args(["-dmenu", "-mesg", &mesg, "-p", fixup_prompt(prompt)]);
- if !echo {
- cmd.arg("-password");
- }
- cmd.stdin(Stdio::null());
- cmd.stdout(Stdio::piped());
- cmd.kill_on_drop(true);
- let child = cmd
- .spawn()
- .map_err(|e| Error::InputError(format!("failed to spawn rofi: {e}")))?;
-
- let out = child
- .wait_with_output()
- .await
- .map_err(|e| Error::InputError(format!("failed to wait for rofi: {e}")))?;
- let stdout = out
- .stdout
- .strip_suffix(b"\n")
- .unwrap_or(&out.stdout)
- .to_owned();
-
- Ok(String::from_utf8_lossy(&stdout).to_string())
- }
-
- async fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()> {
- trace!("rofi display");
- let mut cmd = rofi_command();
- let mut mesg = if source.is_empty() {
- description.to_owned()
- } else {
- let mut out = format!("{description}\n\n<b>Coming from ",);
- for s in source.iter() {
- out.push_str(&s.to_string());
- }
- out.push_str("</b>");
- out
- };
- if error {
- mesg.insert_str(0, "<span color=\"red\">");
- mesg.push_str("</span>");
- }
- cmd.args(["-e", &mesg, "-markup"]);
- cmd.stdin(Stdio::null());
- cmd.stdout(Stdio::null());
- cmd.kill_on_drop(true);
- let mut child = cmd
- .spawn()
- .map_err(|e| Error::InputError(format!("failed to spawn rofi: {e}")))?;
-
- child
- .wait()
- .await
- .map_err(|e| Error::InputError(format!("failed to wait for rofi: {e}")))?;
-
- Ok(())
- }
-}
-
-#[cfg(test)]
-mod tests {
- use std::borrow::Cow;
-
- use crate::rofi::RofiPrompter;
- use crate::{PrependSourcePrompter, Prompter as _, Source};
-
- // #[tokio::test]
- #[tokio::test]
- #[ignore = "interactive"]
- async fn test() {
- let prompter = PrependSourcePrompter {
- prompter: RofiPrompter,
- description: "test".to_owned(),
- source: vec![Source(Cow::Borrowed("ssh"))],
- };
- prompter
- .prompt_radio("Enable", "Polkit needs access", &[])
- .await
- .expect("rofi");
- prompter
- .prompt_text(false, "Password", "Polkit needs access", &[])
- .await
- .expect("rofi");
- prompter
- .display_text(true, "Polkit needs access", &[])
- .await
- .expect("rofi");
- }
-}