mirror of
https://github.com/astral-sh/uv.git
synced 2025-09-01 08:17:24 +00:00

This PR is a first step toward support for storing credentials in the system keyring. The `keyring-rs` crate is the best option for system keyring integration, but the latest version (v4) requires either that Linux users have `libdbus` installed or that it is built with `libdbus` vendored in. This is because v4 depends on [dbus-secret-service](https://github.com/open-source-cooperative/dbus-secret-service), which was created as an alternative to [secret-service](https://github.com/open-source-cooperative/secret-service-rs) so that users are not required to use an async runtime. Since uv does use an async runtime, this is not a good tradeoff for uv. This PR: * Vendors `keyring-rs` crate into a new `uv-keyring` workspace crate * Moves to the async `secret-service` crate that does not require clients on Linux to have `libdbus` on their machines. This includes updating `CredentialsAPI` trait (and implementations) to use async methods. * Adds `uv-keyring` tests to `cargo test` jobs. For `cargo test | ubuntu`, this meant setting up secret service and priming gnome-keyring as an earlier step. * Removes iOS code paths * Patches in @oconnor663 's changes from his [`keyring-rs` PR](https://github.com/open-source-cooperative/keyring-rs/pull/261) * Applies many clippy-driven updates
33 lines
1.3 KiB
Rust
33 lines
1.3 KiB
Rust
#![allow(dead_code)] // not all of these utilities are used by all tests
|
|
|
|
/// When tests fail, they leave keys behind, and those keys
|
|
/// have to be cleaned up before the tests can be run again
|
|
/// in order to avoid bad results. So it's a lot easier just
|
|
/// to have tests use a random string for key names to avoid
|
|
/// the conflicts, and then do any needed cleanup once everything
|
|
/// is working correctly. So tests make keys with these functions.
|
|
/// When tests fail, they leave keys behind, and those keys
|
|
/// have to be cleaned up before the tests can be run again
|
|
/// in order to avoid bad results. So it's a lot easier just
|
|
/// to have tests use a random string for key names to avoid
|
|
/// the conflicts, and then do any needed cleanup once everything
|
|
/// is working correctly. So we export this function for tests to use.
|
|
pub(crate) fn generate_random_string_of_len(len: usize) -> String {
|
|
use fastrand;
|
|
use std::iter::repeat_with;
|
|
repeat_with(fastrand::alphanumeric).take(len).collect()
|
|
}
|
|
|
|
pub(crate) fn generate_random_string() -> String {
|
|
generate_random_string_of_len(30)
|
|
}
|
|
|
|
pub(crate) fn generate_random_bytes_of_len(len: usize) -> Vec<u8> {
|
|
use fastrand;
|
|
use std::iter::repeat_with;
|
|
repeat_with(|| fastrand::u8(..)).take(len).collect()
|
|
}
|
|
|
|
pub(crate) fn init_logger() {
|
|
let _ = env_logger::builder().is_test(true).try_init();
|
|
}
|