Skip to content

Commit f0a1d1a

Browse files
committed
Serialize ExchangeCredentials and store as a single entry in keychain
1 parent 9fce45f commit f0a1d1a

1 file changed

Lines changed: 43 additions & 59 deletions

File tree

src/db.rs

Lines changed: 43 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -720,26 +720,19 @@ impl Db {
720720
exchange_account: &str,
721721
exchange_credentials: ExchangeCredentials,
722722
) -> DbResult<()> {
723-
for entry in [
724-
("api_key", exchange_credentials.api_key),
725-
("secret", exchange_credentials.secret),
726-
("subaccount", exchange_credentials.subaccount.unwrap_or_default()),
727-
] {
728-
let user = format!("{exchange_account}_{}", entry.0);
729-
let keyring_entry = match keyring::Entry::new(&exchange.to_string(), &user) {
730-
Ok(entry) => entry,
731-
Err(e) => {
732-
return Err(DbError::KeyringFailed(format!(
733-
"Failed to create keyring entry {user}: {e}"
734-
)))
735-
}
736-
};
737-
if let Err(e) = keyring_entry.set_secret(entry.1.as_bytes()) {
723+
let ec = serde_json::to_string(&exchange_credentials).unwrap();
724+
// user can't be an empty string
725+
let user = format!("{}_{exchange_account}", exchange.to_string());
726+
let keyring_entry = match keyring::Entry::new(&exchange.to_string(), &user) {
727+
Ok(entry) => entry,
728+
Err(e) => {
738729
return Err(DbError::KeyringFailed(format!(
739-
"Failed to set {}: {e}",
740-
entry.0
741-
)));
730+
"Failed to create keyring entry: {e}"
731+
)))
742732
}
733+
};
734+
if let Err(e) = keyring_entry.set_secret(ec.as_bytes()) {
735+
return Err(DbError::KeyringFailed(format!("Failed to set: {e}")));
743736
}
744737
self.add_exchange(exchange)
745738
}
@@ -749,57 +742,48 @@ impl Db {
749742
exchange: Exchange,
750743
exchange_account: &str,
751744
) -> Option<ExchangeCredentials> {
752-
let mut values = vec![];
753-
for entry in ["api_key", "secret", "subaccount"] {
754-
let user = format!("{exchange_account}_{entry}");
755-
let keyring_entry = match keyring::Entry::new(&exchange.to_string(), &user) {
756-
Ok(entry) => entry,
757-
Err(e) => {
758-
eprintln!("Failed to create keyring entry {user}: {e}");
759-
return None;
760-
}
761-
};
762-
let value = match keyring_entry.get_secret() {
763-
Ok(secret) => String::from_utf8(secret).unwrap(),
764-
Err(e) => {
765-
eprintln!("Failed to get the {entry}: {e}");
766-
return None;
767-
}
768-
};
769-
values.push(value);
770-
}
771-
let subaccount = if values[2] != "" {
772-
Some(values[2].clone())
773-
} else {
774-
None
745+
let user = format!("{}_{exchange_account}", exchange.to_string());
746+
let keyring_entry = match keyring::Entry::new(&exchange.to_string(), &user) {
747+
Ok(entry) => entry,
748+
Err(e) => {
749+
eprintln!("Failed to create keyring entry: {e}");
750+
return None;
751+
}
775752
};
776-
Some(ExchangeCredentials {
777-
api_key: values[0].clone(),
778-
secret: values[1].clone(),
779-
subaccount,
780-
})
753+
let value = match keyring_entry.get_secret() {
754+
Ok(secret) => String::from_utf8(secret).unwrap(),
755+
Err(e) => {
756+
eprintln!("Failed to get the secret: {e}");
757+
return None;
758+
}
759+
};
760+
match serde_json::from_str(&value) {
761+
Ok(v) => Some(v),
762+
Err(e) => {
763+
eprintln!("Failed to deserialize credentials: {e}");
764+
None
765+
},
766+
}
781767
}
782768

783769
pub fn clear_exchange_credentials(
784770
&mut self,
785771
exchange: Exchange,
786772
exchange_account: &str,
787773
) -> DbResult<()> {
788-
for entry in ["api_key", "secret", "subaccount"] {
789-
let user = format!("{exchange_account}_{entry}");
790-
let keyring_entry = match keyring::Entry::new(&exchange.to_string(), &user) {
791-
Ok(entry) => entry,
792-
Err(e) => {
793-
return Err(DbError::KeyringFailed(format!(
794-
"Failed to create keyring entry {user}: {e}"
795-
)))
796-
}
797-
};
798-
if let Err(e) = keyring_entry.delete_credential() {
774+
let user = format!("{}_{exchange_account}", exchange.to_string());
775+
let keyring_entry = match keyring::Entry::new(&exchange.to_string(), &user) {
776+
Ok(entry) => entry,
777+
Err(e) => {
799778
return Err(DbError::KeyringFailed(format!(
800-
"Failed to delete {entry}: {e}"
801-
)));
779+
"Failed to create keyring entry: {e}"
780+
)))
802781
}
782+
};
783+
if let Err(e) = keyring_entry.delete_credential() {
784+
return Err(DbError::KeyringFailed(format!(
785+
"Failed to delete credential: {e}"
786+
)));
803787
}
804788
self.remove_exchange(exchange)
805789
}

0 commit comments

Comments
 (0)