@@ -1466,19 +1466,16 @@ fn migrate_pgp_contacts(
14661466 ) ;
14671467 Ok ( id)
14681468 } ;
1469- let mut original_contact_id_from_addr = |addr : & str | -> Result < u32 > {
1470- if addr_cmp ( addr, & self_addr) || addr . is_empty ( ) {
1471- // TODO not sure what to do when addr is empty,
1472- // i.e. the contact was verified before we recorded who introduced whom.
1473- // Right now, we put ContactId::SELF, i.e. mark it as directly verified by us.
1474- // An alternative would be putting `new_id` here,
1475- // in order to record that it's unclear who verified.
1476-
1477- return Ok ( 1 ) ; // ContactId::SELF
1469+ let mut original_contact_id_from_addr = |addr : & str , default : u32 | -> Result < u32 > {
1470+ if addr_cmp ( addr, & self_addr) {
1471+ Ok ( 1 ) // ContactId::SELF
1472+ } else if addr . is_empty ( ) {
1473+ Ok ( default )
1474+ } else {
1475+ original_contact_id_from_addr_stmt
1476+ . query_row ( ( addr , ) , |row| row . get ( 0 ) )
1477+ . with_context ( || format ! ( "Original contact '{addr}' not found" ) )
14781478 }
1479- original_contact_id_from_addr_stmt
1480- . query_row ( ( addr, ) , |row| row. get ( 0 ) )
1481- . with_context ( || format ! ( "Verifier '{addr}' not found in original contacts" ) )
14821479 } ;
14831480
14841481 let Some ( autocrypt_key) = autocrypt_key else {
@@ -1500,15 +1497,19 @@ fn migrate_pgp_contacts(
15001497 } ;
15011498 let new_id = insert_contact ( verified_key) . context ( "Step 13" ) ?;
15021499 verified_pgp_contacts. insert ( original_id. try_into ( ) . context ( "Step 14" ) ?, new_id) ;
1503- let verifier_id = original_contact_id_from_addr ( & verifier) . context ( "Step 15" ) ?;
1500+ // If the original verifier is unknown, we represent this in the database
1501+ // by putting `new_id` into the place of the verifier,
1502+ // i.e. we say that this contact verified itself.
1503+ let verifier_id =
1504+ original_contact_id_from_addr ( & verifier, new_id) . context ( "Step 15" ) ?;
15041505 verifications. insert ( new_id, verifier_id) ;
15051506
15061507 let Some ( secondary_verified_key) = secondary_verified_key else {
15071508 continue ;
15081509 } ;
15091510 let new_id = insert_contact ( secondary_verified_key) . context ( "Step 16" ) ?;
15101511 let verifier_id: u32 =
1511- original_contact_id_from_addr ( & secondary_verifier) . context ( "Step 17" ) ?;
1512+ original_contact_id_from_addr ( & secondary_verifier, new_id ) . context ( "Step 17" ) ?;
15121513 // Only use secondary verification if there is no primary verification:
15131514 verifications. entry ( new_id) . or_insert ( verifier_id) ;
15141515 }
@@ -1524,20 +1525,26 @@ fn migrate_pgp_contacts(
15241525
15251526 for ( & new_contact, & verifier_original_contact) in & verifications {
15261527 let verifier = if verifier_original_contact == 1 {
1527- Some ( & 1 ) // Verified by ContactId::SELF
1528+ 1 // Verified by ContactId::SELF
1529+ } else if verifier_original_contact == new_contact {
1530+ new_contact // unkwnown verifier
15281531 } else {
15291532 // `verifications` contains the original contact id.
15301533 // We need to get the new, verified-pgp-identified contact id.
1531- verified_pgp_contacts. get ( & verifier_original_contact)
1534+ match verified_pgp_contacts. get ( & verifier_original_contact) {
1535+ Some ( v) => * v,
1536+ None => {
1537+ warn ! ( context, "Couldn't find PGP-contact for {verifier_original_contact} who verified {new_contact}" ) ;
1538+ continue ;
1539+ }
1540+ }
15321541 } ;
1533- if let Some ( & verifier) = verifier {
1534- transaction
1535- . execute (
1536- "UPDATE contacts SET verifier=? WHERE id=?" ,
1537- ( verifier, new_contact) ,
1538- )
1539- . context ( "Step 18" ) ?;
1540- }
1542+ transaction
1543+ . execute (
1544+ "UPDATE contacts SET verifier=? WHERE id=?" ,
1545+ ( verifier, new_contact) ,
1546+ )
1547+ . context ( "Step 18" ) ?;
15411548 }
15421549 info ! ( context, "Migrated verifications: {verifications:?}" ) ;
15431550 }
0 commit comments