Only re-write identity data when changed

finchie
Nov 26, 2022, 8:35 AM
DOEG3V7UAVYBKLIPHSNWWONYDORKNJEZL2LD4EWGGUDB2SK6BOFQC

Dependencies

  • [2] 4OJWMSOW Fully replace crate::Identity
  • [3] A3RM526Y Integrating identity malleability
  • [4] 4KJ45IJL Implement new identity management
  • [5] DWSAYGVE Update codebase to use new identity management
  • [6] YJXRCXOS Disallow overwriting existing identities via `pijul id edit`
  • [7] CB7UPUQF Customizable ignore_kinds (and a fix of .write())
  • [8] 6FRPUHWK Fix identity tests
  • [9] EEBKW7VT Keys and identities
  • [10] 5BB266P6 Optional colours in the global config file
  • [11] FVQYZQFL Create dialoguer themes based on global config
  • [12] TFPETWTV Add config options for patch message templates
  • [*] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).

Change contents

  • replacement in pijul/src/identity/mod.rs at line 60
    [3.17300][2.2142:2190]()
    #[derive(Clone, Debug, Serialize, Deserialize)]
    [3.17300]
    [2.2190]
    #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
  • edit in pijul/src/identity/create.rs at line 7
    [3.28348][2.8675:8688]()
    use std::fs;
  • edit in pijul/src/identity/create.rs at line 8
    [3.28368]
    [3.28401]
    use std::{fs, path::PathBuf};
  • replacement in pijul/src/identity/create.rs at line 261
    [3.35721][3.35721:35937]()
    /// Write an identity to disk.
    ///
    /// # Arguments
    /// * `replace_current` - If the new identity will replace an existing one
    fn write(&self, replace_current: bool) -> Result<(), anyhow::Error> {
    [3.35721]
    [3.35937]
    fn write_config(&self, identity_dir: &PathBuf) -> Result<(), anyhow::Error> {
    let config_data = toml::to_string_pretty(&self)?;
    let mut config_file = std::fs::File::create(identity_dir.join("identity.toml"))?;
    config_file.write_all(config_data.as_bytes())?;
    Ok(())
    }
    fn write_secret_key(&self, identity_dir: &PathBuf) -> Result<(), anyhow::Error> {
    let key_data = serde_json::to_string_pretty(&self.secret_key())?;
    let mut key_file = super::load::open_secret_file(&identity_dir.join("secret_key.json"))?;
    key_file.write_all(key_data.as_bytes())?;
    Ok(())
    }
    /// Write a complete identity to disk.
    fn write(&self) -> Result<(), anyhow::Error> {
  • replacement in pijul/src/identity/create.rs at line 280
    [3.36001][3.36001:36138]()
    if !replace_current {
    bail!("An identity with that name already exists: {existing_identity}");
    }
    [3.36001]
    [3.36138]
    bail!("An identity with that name already exists: {existing_identity}");
  • edit in pijul/src/identity/create.rs at line 287
    [3.36297]
    [3.36297]
    self.write_config(&identity_dir)?;
    self.write_secret_key(&identity_dir)?;
  • edit in pijul/src/identity/create.rs at line 290
    [3.36298][2.13610:13668](),[2.13668][3.36365:36512](),[3.36365][3.36365:36512](),[3.36512][2.13669:13743](),[2.13743][3.36584:36733](),[3.36584][3.36584:36733]()
    let config_data = toml::to_string_pretty(&self)?;
    let mut config_file = std::fs::File::create(identity_dir.join("identity.toml"))?;
    config_file.write_all(config_data.as_bytes())?;
    let key_data = serde_json::to_string_pretty(&self.secret_key())?;
    let mut key_file = super::load::open_secret_file(&identity_dir.join("secret_key.json"))?;
    key_file.write_all(key_data.as_bytes())?;
  • replacement in pijul/src/identity/create.rs at line 354
    [3.38799][3.38799:38841]()
    confirmed_identity.write(false)?;
    [3.38799]
    [3.38841]
    confirmed_identity.write()?;
  • replacement in pijul/src/identity/create.rs at line 364
    [3.39846][3.39846:40089]()
    // Remove the old data
    let old_identity_path = path(&self.name, true)?;
    debug!("Removing old directory: {old_identity_path:?}");
    fs::remove_dir_all(old_identity_path).context("Could not remove old identity.")?;
    [3.39846]
    [3.40089]
    let changed_names = self.name != new_identity.name;
    // If changing the identity name, remove old directory
    if changed_names {
    let old_identity_path = path(&self.name, true)?;
    debug!("Removing old directory: {old_identity_path:?}");
    fs::remove_dir_all(old_identity_path).context("Could not remove old identity.")?;
    let new_identity_path = path(&new_identity.name, false)?;
    debug!("Creating new directory: {new_identity_path:?}");
    fs::create_dir_all(new_identity_path).context("Could not create new identity.")?;
  • replacement in pijul/src/identity/create.rs at line 376
    [3.40090][3.40090:40155]()
    // Write the new data
    new_identity.write(true)?;
    [3.40090]
    [3.40155]
    new_identity.write()?;
  • replacement in pijul/src/identity/create.rs at line 378
    [3.40156][3.40156:40261]()
    // Remove the old keychain entry if name has changed
    if self.name != new_identity.name {
    [3.40156]
    [3.40261]
    // Delete the existing password
  • edit in pijul/src/identity/create.rs at line 382
    [3.40414]
    [3.40414]
    } else {
    // Write only the new data
    let identity_dir = path(&new_identity.name, false)?;
    if self.config != new_identity.config {
    new_identity.write_config(&identity_dir)?;
    }
    if self.secret_key() != new_identity.secret_key() {
    new_identity.write_secret_key(&identity_dir)?;
    }
  • replacement in pijul/src/config.rs at line 20
    [3.66][3.114:162]()
    #[derive(Debug, Clone, Serialize, Deserialize)]
    [3.66]
    [3.162]
    #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
  • replacement in pijul/src/commands/identity.rs at line 217
    [3.47850][3.47850:47910]()
    let secret_key = libpijul::key::SKey::generate(expiry);
    [3.47850]
    [3.47910]
    let credentials = if let Some(mut key) = default.secret_key() {
    key.expires = expiry;
    Some(identity::Credentials::new(key, pw))
    } else {
    None
    };
  • replacement in pijul/src/commands/identity.rs at line 236
    [3.48446][2.17441:17587]()
    secret_key.public_key(),
    Some(identity::Credentials::new(
    secret_key.save(pw.as_deref()),
    pw,
    )),
    [3.48446]
    [2.17587]
    default.public_key,
    credentials,
  • replacement in libpijul/src/key.rs at line 19
    [3.5695][3.3877:3925]()
    #[derive(Clone, Debug, Serialize, Deserialize)]
    [3.5695]
    [3.5729]
    #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
  • replacement in libpijul/src/key.rs at line 319
    [3.40384][3.3926:3974]()
    #[derive(Clone, Debug, Serialize, Deserialize)]
    [3.40384]
    [3.14868]
    #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
  • replacement in libpijul/src/key.rs at line 324
    [3.14910][3.3975:4023]()
    #[derive(Clone, Debug, Serialize, Deserialize)]
    [3.14910]
    [3.14944]
    #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]