diff --git a/CHANGELOG.md b/CHANGELOG.md index a7bf028b..31654052 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 0.17.0 (2022-XX-XX) - Add ability to connect to PostgreSQL over TLS/SSL [#745](https://github.com/juanfont/headscale/pull/745) +- Fix CLI registration of expired machines [#754](https://github.com/juanfont/headscale/pull/754) ## 0.16.3 (2022-08-17) diff --git a/machine.go b/machine.go index 960683eb..4399029c 100644 --- a/machine.go +++ b/machine.go @@ -26,6 +26,7 @@ const ( ) ErrCouldNotConvertMachineInterface = Error("failed to convert machine interface") ErrHostnameTooLong = Error("Hostname too long") + ErrDifferentRegisteredNamespace = Error("machine was previously registered with a different namespace") MachineGivenNameHashLength = 8 MachineGivenNameTrimSize = 2 ) @@ -805,6 +806,11 @@ func (h *Headscale) RegisterMachineFromAuthCallback( ) } + // Registration of expired machine with different namespace + if registrationMachine.ID != 0 && registrationMachine.NamespaceID != namespace.ID { + return nil, ErrDifferentRegisteredNamespace + } + registrationMachine.NamespaceID = namespace.ID registrationMachine.RegisterMethod = registrationMethod @@ -812,6 +818,10 @@ func (h *Headscale) RegisterMachineFromAuthCallback( registrationMachine, ) + if err == nil { + h.registrationCache.Delete(nodeKeyStr) + } + return machine, err } else { return nil, ErrCouldNotConvertMachineInterface diff --git a/protocol_common.go b/protocol_common.go index 3cce7602..154c14c9 100644 --- a/protocol_common.go +++ b/protocol_common.go @@ -238,6 +238,13 @@ func (h *Headscale) handleRegisterCommon( // The machine has expired h.handleMachineExpiredCommon(writer, req, registerRequest, *machine, machineKey) + machine.Expiry = &time.Time{} + h.registrationCache.Set( + NodePublicKeyStripPrefix(registerRequest.NodeKey), + *machine, + registerCacheExpiration, + ) + return } }