diff --git a/src-tauri/src/credentials/aws.rs b/src-tauri/src/credentials/aws.rs index f937b4c..e6e7523 100644 --- a/src-tauri/src/credentials/aws.rs +++ b/src-tauri/src/credentials/aws.rs @@ -76,7 +76,7 @@ impl PersistentCredential for AwsBaseCredential { access_key_id, secret_key_enc, nonce - ) + ) VALUES (?, ?, ?, ?);", id, self.access_key_id, ciphertext, nonce_bytes, ).execute(&mut **txn).await?; @@ -203,19 +203,6 @@ mod tests { ) } - fn test_uuid() -> Uuid { - Uuid::try_parse("00000000-0000-0000-0000-000000000000").unwrap() - } - - fn test_uuid_2() -> Uuid { - Uuid::try_parse("ffffffff-ffff-ffff-ffff-ffffffffffff").unwrap() - } - - fn test_uuid_random() -> Uuid { - let bytes = Crypto::salt(); - Uuid::from_slice(&bytes[..16]).unwrap() - } - #[sqlx::test(fixtures("aws_credentials"))] async fn test_load(pool: SqlitePool) { @@ -254,5 +241,5 @@ mod tests { assert_eq!(&creds().into_credential(), &list[0]); assert_eq!(&creds_2().into_credential(), &list[1]); - } + } } diff --git a/src-tauri/src/credentials/record.rs b/src-tauri/src/credentials/record.rs index 7a2a1d0..206888d 100644 --- a/src-tauri/src/credentials/record.rs +++ b/src-tauri/src/credentials/record.rs @@ -112,15 +112,16 @@ impl CredentialRecord { Ok(Self::from_parts(row, credential)) } - // pub async fn load(id: &Uuid, crypto: &Crypto, pool: &SqlitePool) -> Result { - // let row: CredentialRow = sqlx::query_as("SELECT * FROM credentials WHERE id = ?") - // .bind(id) - // .fetch_optional(pool) - // .await? - // .ok_or(LoadCredentialsError::NoCredentials)?; + #[cfg(test)] + pub async fn load(id: &Uuid, crypto: &Crypto, pool: &SqlitePool) -> Result { + let row: CredentialRow = sqlx::query_as("SELECT * FROM credentials WHERE id = ?") + .bind(id) + .fetch_optional(pool) + .await? + .ok_or(LoadCredentialsError::NoCredentials)?; - // Self::load_credential(row, crypto, pool).await - // } + Self::load_credential(row, crypto, pool).await + } pub async fn load_by_name(name: &str, crypto: &Crypto, pool: &SqlitePool) -> Result { let row: CredentialRow = sqlx::query_as("SELECT * FROM credentials WHERE name = ?") @@ -134,7 +135,7 @@ impl CredentialRecord { pub async fn load_default(credential_type: &str, crypto: &Crypto, pool: &SqlitePool) -> Result { let row: CredentialRow = sqlx::query_as( - "SELECT * FROM credentials + "SELECT * FROM credentials WHERE credential_type = ? AND is_default = 1" ).bind(credential_type) .fetch_optional(pool) @@ -419,7 +420,7 @@ mod uuid_tests { #[test] fn test_serialize_deserialize_uuid() { let buf = Crypto::salt(); - let expected = UuidWrapper{ + let expected = UuidWrapper{ id: Uuid::from_slice(&buf[..16]).unwrap() }; let serialized = serde_json::to_string(&expected).unwrap(); diff --git a/src-tauri/src/credentials/ssh.rs b/src-tauri/src/credentials/ssh.rs index 46781cb..02738f6 100644 --- a/src-tauri/src/credentials/ssh.rs +++ b/src-tauri/src/credentials/ssh.rs @@ -99,7 +99,7 @@ impl SshKey { let row = sqlx::query!( "SELECT c.name FROM credentials c - JOIN ssh_credentials s + JOIN ssh_credentials s ON s.id = c.id WHERE s.public_key = ?", pubkey @@ -168,7 +168,7 @@ impl PersistentCredential for SshKey { let nonce = XNonce::clone_from_slice(&row.nonce); let privkey_bytes = crypto.decrypt(&nonce, &row.private_key_enc)?; - + let algorithm = Algorithm::new(&row.algorithm) .map_err(|_| LoadCredentialsError::InvalidData)?; let public_key = PublicKey::from_bytes(&row.public_key) @@ -298,7 +298,6 @@ fn deserialize_algorithm<'de, D>(deserializer: D) -> Result #[cfg(test)] mod tests { use std::fs::{self, File}; - use ssh_key::Fingerprint; use sqlx::types::uuid::uuid; use super::*; @@ -341,7 +340,7 @@ mod tests { let k = rsa_plain(); assert_eq!(k.algorithm.as_str(), "ssh-rsa"); assert_eq!(&k.comment, "hello world"); - + assert_eq!( k.public_key.fingerprint(Default::default()), k.private_key.fingerprint(Default::default()), @@ -359,7 +358,7 @@ mod tests { let k = rsa_enc(); assert_eq!(k.algorithm.as_str(), "ssh-rsa"); assert_eq!(&k.comment, "hello world"); - + assert_eq!( k.public_key.fingerprint(Default::default()), k.private_key.fingerprint(Default::default()), @@ -377,7 +376,7 @@ mod tests { let k = ed25519_plain(); assert_eq!(k.algorithm.as_str(),"ssh-ed25519"); assert_eq!(&k.comment, "hello world"); - + assert_eq!( k.public_key.fingerprint(Default::default()), k.private_key.fingerprint(Default::default()), @@ -395,7 +394,7 @@ mod tests { let k = ed25519_enc(); assert_eq!(k.algorithm.as_str(), "ssh-ed25519"); assert_eq!(&k.comment, "hello world"); - + assert_eq!( k.public_key.fingerprint(Default::default()), k.private_key.fingerprint(Default::default()), @@ -447,7 +446,7 @@ mod tests { async fn test_load_db(pool: SqlitePool) { let crypto = Crypto::fixed(); let id = uuid!("11111111-1111-1111-1111-111111111111"); - let k = SshKey::load(&id, &crypto, &pool).await + SshKey::load(&id, &crypto, &pool).await .expect("Failed to load SSH key from database"); } diff --git a/src-tauri/src/kv.rs b/src-tauri/src/kv.rs index 3b9eba8..9eb55c7 100644 --- a/src-tauri/src/kv.rs +++ b/src-tauri/src/kv.rs @@ -44,21 +44,23 @@ pub async fn load_bytes(pool: &SqlitePool, name: &str) -> Result> } -// pub async fn delete(pool: &SqlitePool, name: &str) -> Result<(), sqlx::Error> { -// sqlx::query!("DELETE FROM kv WHERE name = ?", name) -// .execute(pool) -// .await?; -// Ok(()) -// } +// we don't have a need for this right now, but we will some day +#[cfg(test)] +pub async fn delete(pool: &SqlitePool, name: &str) -> Result<(), sqlx::Error> { + sqlx::query!("DELETE FROM kv WHERE name = ?", name) + .execute(pool) + .await?; + Ok(()) +} -pub async fn delete_multi(pool: &SqlitePool, names: &[&str]) -> Result<(), sqlx::Error> { +pub async fn delete_multi(pool: &SqlitePool, names: &[&str]) -> Result<(), sqlx::Error> { let placeholder = names.iter() .map(|_| "?") .collect::>() .join(","); let query = format!("DELETE FROM kv WHERE name IN ({})", placeholder); - + let mut q = sqlx::query(&query); for name in names { q = q.bind(name); @@ -83,7 +85,7 @@ macro_rules! load_bytes_multi { ( // ...with one item for each repetition of $name $( - // load_bytes returns Result>, the Result is handled by + // load_bytes returns Result>, the Result is handled by // the ? and we match on the Option match crate::kv::load_bytes($pool, $name).await? { Some(v) => v, @@ -187,7 +189,7 @@ mod tests { async fn test_delete(pool: SqlitePool) { delete(&pool, "test_bytes").await .expect("Failed to delete data"); - + let loaded = load_bytes(&pool, "test_bytes").await .expect("Failed to load data"); assert_eq!(loaded, None);