mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	Simplify control flow in RegistrationHandler
This commits tries to dismantle the complicated "if and or" in the RegistrationHandler by factoring out the "is Registrated" into a root if. This, together with some new comments, should hopefully make it a bit easier to follow what is happening in all the different cases that needs to be handled when a Node contacts the registration endpoint.
This commit is contained in:
		
							parent
							
								
									8ccc51ae57
								
							
						
					
					
						commit
						c4ecc4db91
					
				
							
								
								
									
										73
									
								
								api.go
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								api.go
									
									
									
									
									
								
							@ -116,41 +116,51 @@ func (h *Headscale) RegistrationHandler(ctx *gin.Context) {
 | 
				
			|||||||
		machine = &newMachine
 | 
							machine = &newMachine
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if !machine.Registered && req.Auth.AuthKey != "" {
 | 
						if machine.Registered {
 | 
				
			||||||
 | 
							// If the NodeKey stored in headscale is the same as the key presented in a registration
 | 
				
			||||||
 | 
							// request, then we have a node that is either:
 | 
				
			||||||
 | 
							// - Trying to log out (sending a expiry in the past)
 | 
				
			||||||
 | 
							// - A valid, registered machine, looking for the node map
 | 
				
			||||||
 | 
							// - Expired machine wanting to reauthenticate
 | 
				
			||||||
 | 
							if machine.NodeKey == wgkey.Key(req.NodeKey).HexString() {
 | 
				
			||||||
 | 
								// The client sends an Expiry in the past if the client is requesting to expire the key (aka logout)
 | 
				
			||||||
 | 
								//   https://github.com/tailscale/tailscale/blob/main/tailcfg/tailcfg.go#L648
 | 
				
			||||||
 | 
								if !req.Expiry.IsZero() && req.Expiry.UTC().Before(now) {
 | 
				
			||||||
 | 
									h.handleMachineLogOut(ctx, machineKey, req, *machine)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// If machine is not expired, and is register, we have a already accepted this machine,
 | 
				
			||||||
 | 
								// let it proceed with a valid registration
 | 
				
			||||||
 | 
								if !machine.isExpired() {
 | 
				
			||||||
 | 
									h.handleMachineValidRegistration(ctx, machineKey, *machine)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// The machine has expired
 | 
				
			||||||
 | 
								h.handleMachineExpired(ctx, machineKey, req, *machine)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// The NodeKey we have matches OldNodeKey, which means this is a refresh after a key expiration
 | 
				
			||||||
 | 
							if machine.NodeKey == wgkey.Key(req.OldNodeKey).HexString() &&
 | 
				
			||||||
 | 
								!machine.isExpired() {
 | 
				
			||||||
 | 
								h.handleMachineRefreshKey(ctx, machineKey, req, *machine)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// If the machine has AuthKey set, handle registration via PreAuthKeys
 | 
				
			||||||
 | 
						if req.Auth.AuthKey != "" {
 | 
				
			||||||
		h.handleAuthKey(ctx, machineKey, req, *machine)
 | 
							h.handleAuthKey(ctx, machineKey, req, *machine)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// We have the updated key!
 | 
					 | 
				
			||||||
	if machine.NodeKey == wgkey.Key(req.NodeKey).HexString() {
 | 
					 | 
				
			||||||
		// The client sends an Expiry in the past if the client is requesting to expire the key (aka logout)
 | 
					 | 
				
			||||||
		//   https://github.com/tailscale/tailscale/blob/main/tailcfg/tailcfg.go#L648
 | 
					 | 
				
			||||||
		if !req.Expiry.IsZero() && req.Expiry.UTC().Before(now) {
 | 
					 | 
				
			||||||
			h.handleMachineLogOut(ctx, machineKey, req, *machine)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if machine.Registered && !machine.isExpired() {
 | 
					 | 
				
			||||||
			h.handleMachineValidRegistration(ctx, machineKey, *machine)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		h.handleMachineExpired(ctx, machineKey, req, *machine)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// The NodeKey we have matches OldNodeKey, which means this is a refresh after a key expiration
 | 
					 | 
				
			||||||
	if machine.NodeKey == wgkey.Key(req.OldNodeKey).HexString() &&
 | 
					 | 
				
			||||||
		!machine.isExpired() {
 | 
					 | 
				
			||||||
		h.handleMachineRefreshKey(ctx, machineKey, req, *machine)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	h.handleMachineRegistrationNew(ctx, machineKey, req, *machine)
 | 
						h.handleMachineRegistrationNew(ctx, machineKey, req, *machine)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -286,8 +296,7 @@ func (h *Headscale) handleMachineLogOut(
 | 
				
			|||||||
		Str("machine", machine.Name).
 | 
							Str("machine", machine.Name).
 | 
				
			||||||
		Msg("Client requested logout")
 | 
							Msg("Client requested logout")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	machine.Expiry = &reqisterRequest.Expiry // save the expiry so that the machine is marked as expired
 | 
						h.ExpireMachine(&machine)
 | 
				
			||||||
	h.db.Save(&machine)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resp.AuthURL = ""
 | 
						resp.AuthURL = ""
 | 
				
			||||||
	resp.MachineAuthorized = false
 | 
						resp.MachineAuthorized = false
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user