Skip to content

Commit ca21f3c

Browse files
enabled pedantic clippy lints
1 parent 55cd03f commit ca21f3c

15 files changed

Lines changed: 369 additions & 257 deletions

File tree

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ flate2 = "1"
3636
tar = "0.4"
3737
criterion = "0.8"
3838

39+
[lints.clippy]
40+
pedantic = "warn"
41+
3942
[workspace]
4043

4144
members = [

cursive/src/main.rs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ use crate::helpers::{
5555
use lazy_static::lazy_static;
5656
use ripasso::crypto::Fingerprint;
5757
use zeroize::Zeroize;
58+
use ripasso::password_generator::PasswordGenerationCategory;
5859

5960
/// The 'pointer' to the current PasswordStore is of this convoluted type.
6061
type PasswordStoreType = Arc<Mutex<Arc<Mutex<PasswordStore>>>>;
@@ -444,7 +445,7 @@ fn open(ui: &mut Cursive, store: PasswordStoreType) -> Result<()> {
444445

445446
})
446447
.button(CATALOG.gettext("Generate Password"), move |s| {
447-
let mut new_password = password_generator(20, 0);
448+
let mut new_password = password_generator(20, PasswordGenerationCategory::AsciiOnly);
448449
s.call_on_name("editbox", |e: &mut TextArea| {
449450
e.set_content(&new_password);
450451
});
@@ -456,7 +457,7 @@ fn open(ui: &mut Cursive, store: PasswordStoreType) -> Result<()> {
456457
let mut new_password = match passphrase_generator(6) {
457458
Ok(words) => words.join(" "),
458459
Err(err) => {
459-
helpers::errorbox(s, &ripasso::pass::Error::from(err));
460+
helpers::errorbox(s, &err);
460461
return;
461462
}
462463
};
@@ -791,8 +792,13 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) {
791792
move |s| {
792793
let category = *category_value.lock().unwrap();
793794
let length = *password_length.lock().unwrap();
795+
let category = if category == 0 {
796+
PasswordGenerationCategory::AsciiOnly
797+
} else {
798+
PasswordGenerationCategory::AsciiExtended
799+
};
794800
let new_password =
795-
ripasso::password_generator::password_generator(length, category);
801+
password_generator(length, category);
796802

797803
s.call_on_name("new_password_input", |e: &mut EditView| {
798804
e.set_content(new_password);
@@ -803,7 +809,7 @@ fn create(ui: &mut Cursive, store: PasswordStoreType) {
803809
let new_password = match ripasso::passphrase_generator::passphrase_generator(6) {
804810
Ok(words) => words.join(" "),
805811
Err(err) => {
806-
helpers::errorbox(s, &ripasso::pass::Error::from(err));
812+
helpers::errorbox(s, &err);
807813
return;
808814
}
809815
};
@@ -1592,7 +1598,7 @@ fn save_edit_config(
15921598

15931599
let e_k = if e_k_bool {
15941600
let mut recipients: Vec<Recipient> = vec![];
1595-
for (i, r) in all_recipients_from_stores(stores.clone())?
1601+
for (i, r) in all_recipients_from_stores(&stores)?
15961602
.iter()
15971603
.enumerate()
15981604
{
@@ -1648,7 +1654,7 @@ fn save_edit_config(
16481654
}
16491655
}
16501656

1651-
let save_res = pass::save_config(stores, config_file_location);
1657+
let save_res = pass::save_config(&stores, config_file_location);
16521658
if let Err(err) = save_res {
16531659
helpers::errorbox(ui, &err);
16541660
}
@@ -1692,7 +1698,7 @@ fn save_new_config(
16921698
stores_borrowed.push(Arc::new(Mutex::new(new_store)));
16931699
}
16941700

1695-
pass::save_config(stores, config_file_location)?;
1701+
pass::save_config(&stores, config_file_location)?;
16961702

16971703
let mut l = ui.find_name::<SelectView<String>>("stores").unwrap();
16981704

@@ -1711,7 +1717,7 @@ fn edit_store_in_config(
17111717
config_file_location: &Path,
17121718
home: &Option<PathBuf>,
17131719
) -> Result<()> {
1714-
let all_recipients = all_recipients_from_stores(stores.clone())?;
1720+
let all_recipients = all_recipients_from_stores(&stores)?;
17151721

17161722
let l = ui.find_name::<SelectView<String>>("stores").unwrap();
17171723

@@ -1881,7 +1887,7 @@ fn delete_store_from_config(
18811887
stores_borrowed.retain(|store| store.lock().unwrap().get_name() != name);
18821888
}
18831889

1884-
let save_res = pass::save_config(stores, config_file_location);
1890+
let save_res = pass::save_config(&stores, config_file_location);
18851891
if let Err(err) = save_res {
18861892
helpers::errorbox(ui, &err);
18871893
return Ok(());
@@ -1903,7 +1909,7 @@ fn add_store_to_config(
19031909
config_file_location: &Path,
19041910
home: &Option<PathBuf>,
19051911
) -> Result<()> {
1906-
let all_recipients = all_recipients_from_stores(stores.clone())?;
1912+
let all_recipients = all_recipients_from_stores(&stores)?;
19071913

19081914
let mut fields = LinearLayout::vertical();
19091915
let mut name_fields = LinearLayout::horizontal();
@@ -2153,10 +2159,10 @@ fn main() -> Result<()> {
21532159
};
21542160

21552161
pass::read_config(
2156-
&password_store_dir,
2157-
&password_store_signing_key,
2158-
&home,
2159-
&xdg_config_home,
2162+
password_store_dir.as_deref(),
2163+
password_store_signing_key.as_deref(),
2164+
home.as_ref(),
2165+
xdg_config_home.as_ref(),
21602166
)
21612167
};
21622168
if let Err(err) = config_res {
@@ -2189,7 +2195,7 @@ fn main() -> Result<()> {
21892195
eprintln!("Error {err}");
21902196
process::exit(1);
21912197
}
2192-
if let Err(err) = pass::save_config(stores.clone(), &config_file_location) {
2198+
if let Err(err) = pass::save_config(&stores, &config_file_location) {
21932199
eprintln!("Error {err}");
21942200
process::exit(1);
21952201
}

gtk/src/window/imp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ impl ObjectImpl for Window {
7676
// Setup
7777
let obj = self.obj();
7878
obj.setup_collections();
79-
obj.restore_data(home_dir, user_config_dir);
79+
obj.restore_data(home_dir.as_ref(), user_config_dir.as_ref());
8080
obj.setup_callbacks();
8181
obj.setup_actions();
8282
}

gtk/src/window/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,15 +101,15 @@ impl Window {
101101
)
102102
}
103103

104-
fn restore_data(&self, home_dir: Option<PathBuf>, user_config_dir: Option<PathBuf>) {
105-
let (config, home) = ripasso::pass::read_config(&None, &None, &home_dir, &user_config_dir)
104+
fn restore_data(&self, home_dir: Option<&PathBuf>, user_config_dir: Option<&PathBuf>) {
105+
let (config, home) = ripasso::pass::read_config(None, None, home_dir, user_config_dir)
106106
.expect("No config file present");
107107

108108
let stores = get_stores(&config, &Some(home)).expect("Problem constructing stores");
109109
// Convert `Vec<CollectionData>` to `Vec<CollectionObject>`
110110
let collections: Vec<CollectionObject> = stores
111111
.into_iter()
112-
.map(|s| CollectionObject::from_store_data(s, &user_config_dir.clone().unwrap()))
112+
.map(|s| CollectionObject::from_store_data(s, user_config_dir.unwrap()))
113113
.collect();
114114

115115
// Insert restored objects into model

src/crypto.rs

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,16 @@ impl AsRef<[u8]> for Fingerprint {
182182

183183
/// Models the interactions that can be done on a pgp key
184184
pub trait Key {
185-
/// returns a list of names associated with the key
185+
/// Returns a list of names associated with the key.
186186
fn user_id_names(&self) -> Vec<String>;
187187

188-
/// returns the keys fingerprint
188+
/// Returns the keys fingerprint.
189+
///
190+
/// # Errors
191+
/// If a gpg context can't be created, and the gpg backend is chosen.
189192
fn fingerprint(&self) -> Result<Fingerprint>;
190193

191-
/// returns if the key isn't usable
194+
/// Returns if the key isn't usable.
192195
fn is_not_usable(&self) -> bool;
193196
}
194197

@@ -228,6 +231,7 @@ pub trait Crypto {
228231
/// Will return `Err` if decryption fails, for example if the current user isn't the
229232
/// recipient of the message.
230233
fn decrypt_string(&self, ciphertext: &[u8]) -> Result<String>;
234+
231235
/// Encrypts a string
232236
/// # Errors
233237
/// Will return `Err` if encryption fails, for example if the current users key
@@ -256,6 +260,9 @@ pub trait Crypto {
256260
) -> std::result::Result<SignatureStatus, VerificationError>;
257261

258262
/// Returns true if a recipient is in the user's keyring.
263+
///
264+
/// # Errors
265+
/// If a gpg context can't be created, and the gpg backend is chosen.
259266
fn is_key_in_keyring(&self, recipient: &Recipient) -> Result<bool>;
260267

261268
/// Pull keys from the keyserver for those recipients.
@@ -273,7 +280,7 @@ pub trait Crypto {
273280
/// Will return `Err` if `key_id` didn't correspond to a key.
274281
fn get_key(&self, key_id: &str) -> Result<Box<dyn Key>>;
275282

276-
/// Returns a map from key fingerprints to OwnerTrustLevel's
283+
/// Returns a map from key fingerprints to `OwnerTrustLevel`'s
277284
/// # Errors
278285
/// Will return `Err` on failure to obtain trust levels.
279286
fn get_all_trust_items(&self) -> Result<HashMap<Fingerprint, OwnerTrustLevel>>;
@@ -294,7 +301,7 @@ impl Crypto for GpgMe {
294301
let mut ctx = gpgme::Context::from_protocol(gpgme::Protocol::OpenPgp)?;
295302
let mut output = Vec::new();
296303
ctx.decrypt(ciphertext, &mut output)?;
297-
let result = String::from_utf8(output.to_vec())?;
304+
let result = String::from_utf8(output.clone())?;
298305
output.zeroize();
299306
Ok(result)
300307
}
@@ -514,7 +521,7 @@ struct Helper<'a> {
514521
key_ring: &'a HashMap<Fingerprint, Arc<Cert>>,
515522
/// This is all the certificates that are allowed to sign something
516523
public_keys: Vec<Arc<Cert>>,
517-
/// context if talking to gpg_agent for example
524+
/// context if talking to `gpg_agent` for example
518525
ctx: Option<sequoia_gpg_agent::gnupg::Context>,
519526
/// to do verification or not
520527
do_signature_verification: bool,
@@ -555,7 +562,7 @@ impl VerificationHelper for Helper<'_> {
555562

556563
fn find(
557564
key_ring: &HashMap<Fingerprint, Arc<Cert>>,
558-
recipient: &Option<KeyHandle>,
565+
recipient: Option<&KeyHandle>,
559566
) -> Result<Arc<Cert>> {
560567
let recipient = recipient.as_ref().ok_or(Error::Generic("No recipient"))?;
561568

@@ -576,7 +583,7 @@ fn find(
576583
return Err(Error::Generic("unknown fingerprint version"));
577584
}
578585
_ => {}
579-
};
586+
}
580587
}
581588
KeyHandle::KeyID(key_id) => match key_id {
582589
KeyID::Long(bytes) => {
@@ -608,7 +615,7 @@ impl DecryptionHelper for Helper<'_> {
608615
// we don't know which key is the users own key, so lets try them all
609616
let mut selected_fingerprint: Option<Arc<Cert>> = None;
610617
for pkesk in pkesks {
611-
if let Ok(cert) = find(self.key_ring, &pkesk.recipient()) {
618+
if let Ok(cert) = find(self.key_ring, pkesk.recipient().as_ref()) {
612619
let key = cert.primary_key().key();
613620
let mut pair = sequoia_gpg_agent::KeyPair::new_for_gnupg_context(
614621
self.ctx
@@ -648,8 +655,7 @@ impl DecryptionHelper for Helper<'_> {
648655
for pkesk in pkesks {
649656
if pkesk
650657
.decrypt(&mut pair, sym_algo)
651-
.map(|(algo, sk)| decrypt(algo, &sk))
652-
.unwrap_or(false)
658+
.is_some_and(|(algo, sk)| decrypt(algo, &sk))
653659
{
654660
return Ok(Some(
655661
(*self
@@ -688,10 +694,7 @@ impl Key for SequoiaKey {
688694
fn is_not_usable(&self) -> bool {
689695
let p = sequoia_openpgp::policy::StandardPolicy::new();
690696

691-
let policy = match self.cert.with_policy(&p, None) {
692-
Err(_) => return true,
693-
Ok(p) => p,
694-
};
697+
let Ok(policy) = self.cert.with_policy(&p, None) else { return true };
695698

696699
self.cert.revocation_status(&p, None) != RevocationStatus::NotAsFarAsWeKnow
697700
|| policy.alive().is_err()
@@ -737,6 +740,7 @@ impl Sequoia {
737740
})
738741
}
739742

743+
#[must_use]
740744
pub fn from_values(
741745
user_key_id: Fingerprint,
742746
key_ring: HashMap<Fingerprint, Arc<Cert>>,
@@ -756,26 +760,25 @@ impl Sequoia {
756760
let mut result = vec![];
757761

758762
for recipient in input {
759-
match &recipient.fingerprint {
760-
Some(fp) => match self.key_ring.get(fp) {
763+
if let Some(fp) = &recipient.fingerprint {
764+
match self.key_ring.get(fp) {
761765
Some(cert) => result.push(cert.clone()),
762766
None => {
763767
return Err(Error::GenericDyn(format!(
764768
"Recipient with key id {} not found",
765769
recipient.key_id
766770
)));
767771
}
768-
},
769-
None => {
770-
let kh: KeyHandle = recipient.key_id.parse()?;
771-
772-
for cert in self.key_ring.values() {
773-
if cert.key_handle().aliases(&kh) {
774-
result.push(cert.clone());
775-
}
772+
}
773+
} else {
774+
let kh: KeyHandle = recipient.key_id.parse()?;
775+
776+
for cert in self.key_ring.values() {
777+
if cert.key_handle().aliases(&kh) {
778+
result.push(cert.clone());
776779
}
777780
}
778-
};
781+
}
779782
}
780783

781784
Ok(result)

src/error.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,28 +190,31 @@ impl std::fmt::Display for Error {
190190
Self::Gpg(err) => write!(f, "{err}"),
191191
Self::Utf8(err) => write!(f, "{err}"),
192192
Self::Generic(err) => write!(f, "{err}"),
193-
Self::GenericDyn(err) => write!(f, "{err}"),
193+
Self::GenericDyn(err) | Self::RecipientNotInKeyRing(err) => write!(f, "{err}"),
194194
Self::PathError(err) => write!(f, "{err}"),
195195
Self::PatternError(err) => write!(f, "{err}"),
196196
Self::GlobError(err) => write!(f, "{err}"),
197197
Self::Utf8Error(err) => write!(f, "{err}"),
198-
Self::RecipientNotInKeyRing(err) => write!(f, "{err}"),
199198
Self::ConfigError(err) => write!(f, "{err}"),
200199
Self::SerError(err) => write!(f, "{err}"),
201200
Self::ReqwestError(err) => write!(f, "{err}"),
202201
Self::AnyhowError(err) => write!(f, "{err}"),
203-
Self::NoneError => write!(f, "NoneError"),
204202
Self::HexError(err) => write!(f, "{err}"),
205203
Self::FmtError(err) => write!(f, "{err}"),
206-
Self::TotpUrlError(_err) => write!(f, "TOTP url error"),
207204
Self::SystemTimeError(err) => write!(f, "{err}"),
205+
Self::NoneError => write!(f, "NoneError"),
206+
Self::TotpUrlError(_err) => write!(f, "TOTP url error"),
208207
}
209208
}
210209
}
211210

212211
/// Convenience type for Results
213212
pub type Result<T> = std::result::Result<T, Error>;
214213

214+
/// Converts a `LocalResult` to a normal `Result`.
215+
///
216+
/// # Errors
217+
/// If the supplied `LocalResult` have no timezone or more than one timezone.
215218
pub fn to_result<T: chrono::TimeZone>(
216219
res: chrono::LocalResult<chrono::DateTime<T>>,
217220
) -> Result<chrono::DateTime<T>> {

0 commit comments

Comments
 (0)