-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathstorage.rs
95 lines (75 loc) · 2.77 KB
/
storage.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
use crate::{Credential, CredentialRequest};
use std::{error::Error};
use keyring::Keyring;
fn fetch_keychain_credential(request: &CredentialRequest) -> Option<Credential> {
let client_id = request.client_id();
let keyring = Keyring::new(&request.host, &client_id);
let data = keyring.get_password();
match data {
Ok(d) => {
match serde_json::from_str(d.as_str()) {
Ok(stored) => Some(stored),
_ => None
}
},
_ => None
}
}
fn fetch_file_credential(request: &CredentialRequest) -> Option<Credential> {
let client_id = request.client_id();
request.config.credential_for(client_id)
}
pub fn fetch_credential(request: &CredentialRequest) -> Option<Credential> {
let keychain_result = fetch_keychain_credential(&request);
if keychain_result.is_some() {
return keychain_result
}
fetch_file_credential(&request)
}
fn store_keychain_credential(credential: &mut Credential, request: &CredentialRequest) -> Result<(), Box<dyn Error>> {
let client_id = request.client_id();
credential.client_id = client_id.clone();
let credentials_json = serde_json::to_string(&credential)?;
let keyring = Keyring::new(&request.host, &client_id);
match keyring.set_password(&credentials_json) {
Ok(_) => Ok(()),
Err(e) => Err(Box::new(e)),
}
}
fn store_file_credential(credential: &mut Credential, request: &mut CredentialRequest) -> Result<(), Box<dyn Error>> {
let client_id = request.client_id();
credential.client_id = client_id;
match request.config.store_credential(credential) {
Ok(_) => Ok(()),
Err(e) => Err(Box::new(e))
}
}
pub fn store_credential(credential: &mut Credential, request: &mut CredentialRequest) -> Result<(), Box<dyn Error>> {
let keychain_result = store_keychain_credential(credential, request);
if keychain_result.is_ok() {
return keychain_result
}
store_file_credential(credential, request)
}
fn delete_keychain_credential(request: &CredentialRequest) -> Result<(), Box<dyn Error>> {
let client_id = request.client_id();
let host = request.host.clone();
let keyring = keyring::Keyring::new(&host, &client_id);
match keyring.delete_password() {
Ok(_) => Ok(()),
Err(e) => Err(Box::new(e)),
}
}
fn delete_file_credential(request: &mut CredentialRequest) -> Result<(), Box<dyn Error>> {
match request.delete_credential() {
Ok(_) => Ok(()),
Err(e) => Err(Box::new(e))
}
}
pub fn delete_credential(request: &mut CredentialRequest) -> Result<(), Box<dyn Error>> {
let keychain_result = delete_keychain_credential(request);
if keychain_result.is_ok() {
return keychain_result
}
delete_file_credential(request)
}