Add verifier information (#3839)

* add verifier information

* cleanup

Co-authored-by: bjoern <r10s@b44t.com>

* finish name change

* simple improvements & new ffi

* fixs

Co-authored-by: bjoern <r10s@b44t.com>
Co-authored-by: septias <xxsebastian.kleahnxx@gmail.com>
This commit is contained in:
Sebastian Klähn
2022-12-27 11:41:15 +01:00
committed by GitHub
parent cf1d6919bf
commit c562d17925
19 changed files with 194 additions and 32 deletions

View File

@@ -48,6 +48,8 @@ pub struct Peerstate {
pub verified_key: Option<SignedPublicKey>,
pub verified_key_fingerprint: Option<Fingerprint>,
pub fingerprint_changed: bool,
/// The address that verified this contact
pub verifier: Option<String>,
}
impl PartialEq for Peerstate {
@@ -103,9 +105,11 @@ impl Peerstate {
verified_key: None,
verified_key_fingerprint: None,
fingerprint_changed: false,
verifier: None,
}
}
/// Create peerstate from gossip
pub fn from_gossip(gossip_header: &Aheader, message_time: i64) -> Self {
Peerstate {
addr: gossip_header.addr.clone(),
@@ -119,7 +123,6 @@ impl Peerstate {
// learn encryption preferences of other members immediately and don't send unencrypted
// messages to a group where everyone prefers encryption.
prefer_encrypt: gossip_header.prefer_encrypt,
public_key: None,
public_key_fingerprint: None,
gossip_key: Some(gossip_header.public_key.clone()),
@@ -128,13 +131,14 @@ impl Peerstate {
verified_key: None,
verified_key_fingerprint: None,
fingerprint_changed: false,
verifier: None,
}
}
pub async fn from_addr(context: &Context, addr: &str) -> Result<Option<Peerstate>> {
let query = "SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, \
gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, \
verified_key, verified_key_fingerprint \
verified_key, verified_key_fingerprint, verifier \
FROM acpeerstates \
WHERE addr=? COLLATE NOCASE LIMIT 1;";
Self::from_stmt(context, query, paramsv![addr]).await
@@ -146,7 +150,7 @@ impl Peerstate {
) -> Result<Option<Peerstate>> {
let query = "SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, \
gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, \
verified_key, verified_key_fingerprint \
verified_key, verified_key_fingerprint, verifier \
FROM acpeerstates \
WHERE public_key_fingerprint=? \
OR gossip_key_fingerprint=? \
@@ -162,7 +166,7 @@ impl Peerstate {
) -> Result<Option<Peerstate>> {
let query = "SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, \
gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, \
verified_key, verified_key_fingerprint \
verified_key, verified_key_fingerprint, verifier \
FROM acpeerstates \
WHERE verified_key_fingerprint=? \
OR addr=? COLLATE NOCASE \
@@ -219,6 +223,7 @@ impl Peerstate {
.transpose()
.unwrap_or_default(),
fingerprint_changed: false,
verifier: row.get("verifier")?,
};
Ok(res)
@@ -358,11 +363,19 @@ impl Peerstate {
}
}
/// Set this peerstate to verified
/// Make sure to call `self.save_to_db` to save these changes
/// Params:
/// verifier:
/// The address which verifies the given contact
/// If we are verifying the contact, use that contacts address
/// Returns whether the value of the key has changed
pub fn set_verified(
&mut self,
which_key: PeerstateKeyType,
fingerprint: &Fingerprint,
verified: PeerstateVerifiedStatus,
verifier: String,
) -> bool {
if verified == PeerstateVerifiedStatus::BidirectVerified {
match which_key {
@@ -372,6 +385,7 @@ impl Peerstate {
{
self.verified_key = self.public_key.clone();
self.verified_key_fingerprint = self.public_key_fingerprint.clone();
self.verifier = Some(verifier);
true
} else {
false
@@ -383,6 +397,7 @@ impl Peerstate {
{
self.verified_key = self.gossip_key.clone();
self.verified_key_fingerprint = self.gossip_key_fingerprint.clone();
self.verifier = Some(verifier);
true
} else {
false
@@ -407,8 +422,9 @@ impl Peerstate {
gossip_key_fingerprint,
verified_key,
verified_key_fingerprint,
addr)
VALUES (?,?,?,?,?,?,?,?,?,?,?)
addr,
verifier)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?)
ON CONFLICT (addr)
DO UPDATE SET
last_seen = excluded.last_seen,
@@ -420,7 +436,8 @@ impl Peerstate {
public_key_fingerprint = excluded.public_key_fingerprint,
gossip_key_fingerprint = excluded.gossip_key_fingerprint,
verified_key = excluded.verified_key,
verified_key_fingerprint = excluded.verified_key_fingerprint",
verified_key_fingerprint = excluded.verified_key_fingerprint,
verifier = excluded.verifier",
paramsv![
self.last_seen,
self.last_seen_autocrypt,
@@ -433,6 +450,7 @@ impl Peerstate {
self.verified_key.as_ref().map(|k| k.to_bytes()),
self.verified_key_fingerprint.as_ref().map(|fp| fp.hex()),
self.addr,
self.verifier,
],
)
.await?;
@@ -447,6 +465,11 @@ impl Peerstate {
}
}
/// Returns the address that verified the contact
pub fn get_verifier(&self) -> Option<&str> {
self.verifier.as_deref()
}
/// Add an info message to all the chats with this contact, informing about
/// a [`PeerstateChange`].
///
@@ -672,6 +695,7 @@ mod tests {
verified_key: Some(pub_key.clone()),
verified_key_fingerprint: Some(pub_key.fingerprint()),
fingerprint_changed: false,
verifier: None,
};
assert!(
@@ -711,6 +735,7 @@ mod tests {
verified_key: None,
verified_key_fingerprint: None,
fingerprint_changed: false,
verifier: None,
};
assert!(
@@ -743,6 +768,7 @@ mod tests {
verified_key: None,
verified_key_fingerprint: None,
fingerprint_changed: false,
verifier: None,
};
assert!(
@@ -805,6 +831,7 @@ mod tests {
verified_key: None,
verified_key_fingerprint: None,
fingerprint_changed: false,
verifier: None,
};
peerstate.apply_header(&header, 100);