@@ -16,6 +16,7 @@ use crate::message::Message;
16
16
use crate :: mimeparser:: SystemMessage ;
17
17
use crate :: sql:: Sql ;
18
18
use crate :: stock_str;
19
+ use crate :: tools;
19
20
20
21
/// Type of the public key stored inside the peerstate.
21
22
#[ derive( Debug ) ]
@@ -165,6 +166,9 @@ impl Peerstate {
165
166
166
167
/// Loads peerstate corresponding to the given address from the database.
167
168
pub async fn from_addr ( context : & Context , addr : & str ) -> Result < Option < Peerstate > > {
169
+ if context. is_self_addr ( addr) . await ? {
170
+ return Ok ( Some ( Peerstate :: get_self_stub ( addr) ) ) ;
171
+ }
168
172
let query = "SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, \
169
173
gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, \
170
174
verified_key, verified_key_fingerprint, \
@@ -182,6 +186,7 @@ impl Peerstate {
182
186
context : & Context ,
183
187
fingerprint : & Fingerprint ,
184
188
) -> Result < Option < Peerstate > > {
189
+ // NOTE: If it's our key fingerprint, this returns None currently.
185
190
let query = "SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, \
186
191
gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, \
187
192
verified_key, verified_key_fingerprint, \
@@ -206,6 +211,9 @@ impl Peerstate {
206
211
fingerprint : & Fingerprint ,
207
212
addr : & str ,
208
213
) -> Result < Option < Peerstate > > {
214
+ if context. is_self_addr ( addr) . await ? {
215
+ return Ok ( Some ( Peerstate :: get_self_stub ( addr) ) ) ;
216
+ }
209
217
let query = "SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, \
210
218
gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, \
211
219
verified_key, verified_key_fingerprint, \
@@ -221,6 +229,34 @@ impl Peerstate {
221
229
Self :: from_stmt ( context, query, ( & fp, & addr, & fp) ) . await
222
230
}
223
231
232
+ /// Returns peerstate stub for self `addr`.
233
+ ///
234
+ /// Needed for [`crate::decrypt::keyring_from_peerstate()`] which returns a keyring of all our
235
+ /// pubkeys for such a stub so that we can check if a message is signed by us.
236
+ fn get_self_stub ( addr : & str ) -> Self {
237
+ let now = tools:: time ( ) ;
238
+ // We can have multiple pubkeys, just make the corresponding fields None.
239
+ Self {
240
+ addr : addr. to_string ( ) ,
241
+ last_seen : now,
242
+ last_seen_autocrypt : now,
243
+ prefer_encrypt : EncryptPreference :: Mutual ,
244
+ public_key : None ,
245
+ public_key_fingerprint : None ,
246
+ gossip_key : None ,
247
+ gossip_key_fingerprint : None ,
248
+ gossip_timestamp : 0 ,
249
+ verified_key : None ,
250
+ verified_key_fingerprint : None ,
251
+ verifier : None ,
252
+ secondary_verified_key : None ,
253
+ secondary_verified_key_fingerprint : None ,
254
+ secondary_verifier : None ,
255
+ backward_verified_key_id : None ,
256
+ fingerprint_changed : false ,
257
+ }
258
+ }
259
+
224
260
async fn from_stmt (
225
261
context : & Context ,
226
262
query : & str ,
0 commit comments