@@ -7,6 +7,7 @@ use shared::bee_msg::node::*;
77use shared:: types:: { MGMTD_ID , MGMTD_UID , NodeId , TargetId } ;
88use std:: net:: SocketAddr ;
99use std:: sync:: Arc ;
10+ use tonic:: IntoRequest ;
1011
1112impl HandleWithResponse for GetNodes {
1213 type Response = GetNodesResp ;
@@ -195,10 +196,45 @@ async fn update_node(msg: RegisterNode, ctx: &Context) -> Result<NodeId> {
195196 }
196197 }
197198
199+ let new_alias_or_reg_token = String :: from_utf8 ( msg. node_alias ) ?;
200+
198201 let ( node, is_new) = if let Some ( node) = node {
199202 // Existing node, update data
200203 db:: node:: update ( tx, node. uid , msg. port , machine_uuid) ?;
201204
205+ // If the updated node is a meta node, check if its corresponding target has a
206+ // registration token
207+ if msg. node_type == NodeType :: Meta {
208+ let stored_reg_token: Option < String > = tx. query_row (
209+ sql ! ( "SELECT reg_token FROM meta_targets WHERE node_id = ?1" ) ,
210+ [ node. num_id ( ) ] ,
211+ |row| row. get ( 0 ) ,
212+ ) ?;
213+
214+ if let Some ( ref t) = stored_reg_token
215+ && t != & new_alias_or_reg_token
216+ {
217+ bail ! (
218+ "Registration token sent by meta node {node} ({}) \
219+ does not match stored token ({})",
220+ new_alias_or_reg_token,
221+ t
222+ ) ;
223+ } else if stored_reg_token. is_none ( ) {
224+ tx. execute (
225+ sql ! (
226+ "UPDATE targets SET reg_token = ?1
227+ WHERE node_id = ?2 AND node_type = ?3"
228+ ) ,
229+ rusqlite:: params![
230+ new_alias_or_reg_token,
231+ node. num_id( ) ,
232+ NodeType :: Meta . sql_variant( )
233+ ] ,
234+ ) ?;
235+ }
236+ }
237+
202238 ( node, false )
203239 } else {
204240 // New node, do additional checks and insert data
@@ -216,9 +252,7 @@ async fn update_node(msg: RegisterNode, ctx: &Context) -> Result<NodeId> {
216252 // updated to no longer start with a number, thus it is unlikely this
217253 // would happen unless BeeGFS 8 was mounted by a BeeGFS 7 client.
218254
219- let new_alias = String :: from_utf8 ( msg. node_alias )
220- . ok ( )
221- . and_then ( |s| Alias :: try_from ( s) . ok ( ) ) ;
255+ let new_alias = Alias :: try_from ( new_alias_or_reg_token. clone ( ) ) . ok ( ) ;
222256
223257 if new_alias. is_none ( ) {
224258 log:: warn!(
@@ -246,7 +280,7 @@ client version < 8.0)"
246280 ) ;
247281 } ;
248282
249- db:: target:: insert_meta ( tx, target_id) ?;
283+ db:: target:: insert_meta ( tx, target_id, Some ( & new_alias_or_reg_token ) ) ?;
250284 }
251285
252286 ( node, true )
0 commit comments