diff options
Diffstat (limited to 'store/src/backend.rs')
-rw-r--r-- | store/src/backend.rs | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/store/src/backend.rs b/store/src/backend.rs index 94553fc5..91cbc79f 100644 --- a/store/src/backend.rs +++ b/store/src/backend.rs @@ -276,39 +276,48 @@ impl node::binding::Server for BindingServer { bind_results!(results); let force = pry!(params.get()).get_force(); + // This is the key to import. let mut new = sry!(TPK::from_bytes(&pry!(pry!(params.get()).get_key()))); + // Check in the database for the current key. let key_id = sry!(self.key_id()); let (fingerprint, key): (String, Option<Vec<u8>>) = sry!(self.c.borrow().query_row( "SELECT fingerprint, key FROM keys WHERE id = ?1", &[&key_id], |row| (row.get(0), row.get_checked(1).ok()))); - if let Some(current) = key { - let current = sry!(TPK::from_bytes(¤t)); + // If we found one, convert it to TPK. + let current = if let Some(current) = key { + let current = sry!(TPK::from_bytes(¤t)); if current.fingerprint().to_hex() != fingerprint { // Inconsistent database. fail!(node::Error::SystemError); } - - if current.fingerprint() != new.fingerprint() { - if force || new.is_signed_by(¤t) { - // Update binding, and retry. - let key_id = - sry!(get_key_id(&self.c.borrow(), new.fingerprint().to_hex().as_ref())); - sry!(self.c.borrow() - .execute("UPDATE bindings SET key = ?1 WHERE id = ?2", - &[&key_id, &self.id])); - return self.import(params, results); - } else { - fail!(node::Error::Conflict); - } + Some(current) + } else { + None + }; + + // Check for conflicts. + if new.fingerprint().to_hex() != fingerprint { + if force || (current.is_some() && new.is_signed_by(¤t.unwrap())) { + // Update binding, and retry. + let key_id = + sry!(get_key_id(&self.c.borrow(), new.fingerprint().to_hex().as_ref())); + sry!(self.c.borrow() + .execute("UPDATE bindings SET key = ?1 WHERE id = ?2", + &[&key_id, &self.id])); + return self.import(params, results); } else { - new = sry!(current.merge(new)); + fail!(node::Error::Conflict); } } + if current.is_some() { + new = sry!(current.unwrap().merge(new)); + } + // Write key back to the database. let mut blob = vec![]; sry!(new.serialize(&mut blob)); |