@@ -106,27 +106,30 @@ def chat_register(self, message, pow_obj, base_identity, addr, *,
106106 return spk_err
107107
108108 now = time .time ()
109+ now_int = int (now )
109110 pid = secrets .token_hex (16 )
110111 with self .chat_lock :
111112 self .chat_spend_pub [addr_s ] = spend_pk
112113 self .chat_presence_pub [addr_s ] = chat_pub
114+ if hasattr (self , "chat_presence_ts" ):
115+ self .chat_presence_ts [addr_s ] = now_int
113116 if hasattr (self , "record_presence_seen" ):
114117 self .record_presence_seen (pid )
115118 else :
116119 self .chat_presence_seen .add (pid )
117- b = self .chat_prekeys . get (addr_s ) or {}
120+ b = self .get_prekey_bundle (addr_s )
118121 if "ik" not in b :
119122 b ["ik" ] = chat_pub
120- b ["ts" ] = int ( now )
121- b ["ts" ] = int ( now )
123+ b ["ts" ] = now_int
124+ b ["ts" ] = now_int
122125 if spk_valid :
123126 b ["spk" ] = spk_reg
124127 b ["sig" ] = sig_reg
125128 if opk_reg and len (opk_reg ) == 64 :
126129 b .setdefault ("opk_list" , []).append (opk_reg )
127- self .chat_prekeys [ addr_s ] = b
130+ self .put_prekey_bundle ( addr_s , b )
128131
129- pres = {"pid" : pid , "address" : addr_s , "pubkey" : chat_pub , "spend_pub" : spend_pk , "presence_sig" : presence_sig , "ts" : int ( now ) , "hops" : 0 }
132+ pres = {"pid" : pid , "address" : addr_s , "pubkey" : chat_pub , "spend_pub" : spend_pk , "presence_sig" : presence_sig , "ts" : now_int , "hops" : 0 }
130133 self .relay_presence_async (pres , exclude = addr )
131134 return {"type" : "CHAT_REGISTERED" , "address" : addr_s , "pubkey" : chat_pub }
132135 except Exception as exc :
@@ -175,10 +178,15 @@ def chat_lookup_pub(self, message, pow_obj, base_identity, *,
175178 return pow_resp
176179 pubhex = self .chat_presence_pub .get (addr_s )
177180 last_seen = None
178- b = self .chat_prekeys .get (addr_s ) or {}
179- ts_field = b .get ("ts" )
180- if isinstance (ts_field , (int , float )):
181- last_seen = int (ts_field )
181+ if hasattr (self , "chat_presence_ts" ):
182+ last_seen = self .chat_presence_ts .get (addr_s )
183+ if last_seen is None :
184+ b = self .get_prekey_bundle (addr_s )
185+ ts_field = b .get ("ts" )
186+ if isinstance (ts_field , (int , float )):
187+ last_seen = int (ts_field )
188+ if hasattr (self , "chat_presence_ts" ):
189+ self .chat_presence_ts [addr_s ] = last_seen
182190
183191 return {"type" : "CHAT_PUBKEY" , "address" : addr_s , "pubkey" : pubhex , "found" : bool (pubhex ), "last_seen" : last_seen }
184192
@@ -237,18 +245,21 @@ def chat_presence(self, message, pow_obj, base_identity, addr, *,
237245 return pow_resp
238246
239247 pid = message .get ("pid" ) or secrets .token_hex (16 )
248+ now_int = int (time .time ())
240249 with self .chat_lock :
241250 self .chat_presence_pub [addr_s ] = pubhex
242251 self .chat_spend_pub [addr_s ] = spend_pk
252+ if hasattr (self , "chat_presence_ts" ):
253+ self .chat_presence_ts [addr_s ] = now_int
243254 if hasattr (self , "record_presence_seen" ):
244255 self .record_presence_seen (pid )
245256 else :
246257 self .chat_presence_seen .add (pid )
247- b = self .chat_prekeys . get (addr_s ) or {}
258+ b = self .get_prekey_bundle (addr_s )
248259 if "ik" not in b :
249260 b ["ik" ] = pubhex
250- b ["ts" ] = int ( time . time ())
251- self .chat_prekeys [ addr_s ] = b
261+ b ["ts" ] = now_int
262+ self .put_prekey_bundle ( addr_s , b )
252263
253264 message ["hops" ] = hops + 1
254265 self .relay_presence_async (message , exclude = addr )
@@ -294,16 +305,15 @@ def chat_publish_prekeys(self, message, pow_obj, base_identity, *,
294305 if not sig_ok .get ("spk" ):
295306 log .warning ("[chat_publish_prekeys] Bad SPK signature for %s" , addr_s )
296307 return {"error" :"bad_spk_sig" }
308+ now_int = int (time .time ())
297309 with self .chat_lock :
298- rec = self .chat_prekeys .get (addr_s ) or {}
299- rec .update ({"ik" : ik , "spk" : spk , "sig" : sig , "ts" : int (time .time ())})
300- if isinstance (opk , str ) and len (opk )== 64 :
301- lst = rec .setdefault ("opk_list" , [])
302- lst .append (opk )
303- if len (lst ) > CFG .CHAT_OPK_MAX_STORED :
304- # keep it from getting bloated, only keep the latest OPK
305- rec ["opk_list" ] = lst [- CFG .CHAT_OPK_MAX_STORED :]
306- self .chat_prekeys [addr_s ] = rec
310+ if hasattr (self , "chat_presence_ts" ):
311+ self .chat_presence_ts [addr_s ] = now_int
312+ rec = self .get_prekey_bundle (addr_s )
313+ rec .update ({"ik" : ik , "spk" : spk , "sig" : sig , "ts" : now_int })
314+ if isinstance (opk , str ) and len (opk ) == 64 :
315+ rec .setdefault ("opk_list" , []).append (opk )
316+ self .put_prekey_bundle (addr_s , rec )
307317
308318 return {"type" :"CHAT_PUBLISH_PREKEYS" }
309319
@@ -313,12 +323,16 @@ def chat_get_prekey(self, message, *,
313323 client_ip , is_miner_sender , ** kwargs ):
314324 addr_s = (message .get ("address" ) or "" ).strip ().lower ()
315325 with self .chat_lock :
316- b = self .chat_prekeys . get (addr_s ) or {}
326+ b = self .get_prekey_bundle (addr_s )
317327 if not b or ("ik" not in b or "spk" not in b or "sig" not in b ):
318328 return {"error" :"no_bundle" }
319329 lst = b .get ("opk_list" ) or []
320330 opk = lst .pop (0 ) if lst else None
321- self .chat_prekeys [addr_s ] = b
331+ if lst :
332+ b ["opk_list" ] = lst
333+ else :
334+ b .pop ("opk_list" , None )
335+ self .put_prekey_bundle (addr_s , b )
322336 sp = self .chat_spend_pub .get (addr_s )
323337
324338 return {"type" :"CHAT_PREKEY_BUNDLE" ,"bundle" :{"ik" : b ["ik" ], "spk" : b ["spk" ], "sig" : b ["sig" ], "opk" : opk , "spend_pub" : sp }}
0 commit comments