mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	Unmarshal keys in the non-deprecated way
This commit is contained in:
		
							parent
							
								
									0012c76170
								
							
						
					
					
						commit
						c38f00fab8
					
				
							
								
								
									
										5
									
								
								api.go
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								api.go
									
									
									
									
									
								
							| @ -13,7 +13,6 @@ import ( | ||||
| 	"github.com/gin-gonic/gin" | ||||
| 	"github.com/klauspost/compress/zstd" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"go4.org/mem" | ||||
| 	"gorm.io/gorm" | ||||
| 	"tailscale.com/tailcfg" | ||||
| 	"tailscale.com/types/key" | ||||
| @ -74,7 +73,9 @@ func (h *Headscale) RegisterWebAPI(ctx *gin.Context) { | ||||
| func (h *Headscale) RegistrationHandler(ctx *gin.Context) { | ||||
| 	body, _ := io.ReadAll(ctx.Request.Body) | ||||
| 	machineKeyStr := ctx.Param("id") | ||||
| 	machineKey, err := key.ParseMachinePublicUntyped(mem.S(machineKeyStr)) | ||||
| 
 | ||||
| 	var machineKey key.MachinePublic | ||||
| 	err := machineKey.UnmarshalText([]byte(machineKeyStr)) | ||||
| 	if err != nil { | ||||
| 		log.Error(). | ||||
| 			Caller(). | ||||
|  | ||||
| @ -11,7 +11,6 @@ import ( | ||||
| 	v1 "github.com/juanfont/headscale/gen/go/headscale/v1" | ||||
| 	"github.com/pterm/pterm" | ||||
| 	"github.com/spf13/cobra" | ||||
| 	"go4.org/mem" | ||||
| 	"google.golang.org/grpc/status" | ||||
| 	"tailscale.com/types/key" | ||||
| ) | ||||
| @ -486,7 +485,8 @@ func nodesToPtables( | ||||
| 			expiry = machine.Expiry.AsTime() | ||||
| 		} | ||||
| 
 | ||||
| 		nodeKey, err := key.ParseNodePublicUntyped(mem.S(machine.NodeKey)) | ||||
| 		var nodeKey key.NodePublic | ||||
| 		err := nodeKey.UnmarshalText([]byte(machine.NodeKey)) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  | ||||
| @ -720,6 +720,7 @@ func (s *IntegrationCLITestSuite) TestNodeCommand() { | ||||
| 		[]string{}, | ||||
| 	) | ||||
| 	assert.Nil(s.T(), err) | ||||
| 	fmt.Println("Error: ", err) | ||||
| 
 | ||||
| 	var listOnlySharedMachineNamespace []v1.Machine | ||||
| 	err = json.Unmarshal( | ||||
| @ -728,6 +729,8 @@ func (s *IntegrationCLITestSuite) TestNodeCommand() { | ||||
| 	) | ||||
| 	assert.Nil(s.T(), err) | ||||
| 
 | ||||
| 	fmt.Println("List: ", listOnlySharedMachineNamespaceResult) | ||||
| 	fmt.Println("List2: ", listOnlySharedMachineNamespace) | ||||
| 	assert.Len(s.T(), listOnlySharedMachineNamespace, 2) | ||||
| 
 | ||||
| 	assert.Equal(s.T(), uint64(6), listOnlySharedMachineNamespace[0].Id) | ||||
|  | ||||
							
								
								
									
										14
									
								
								machine.go
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								machine.go
									
									
									
									
									
								
							| @ -12,7 +12,6 @@ import ( | ||||
| 	"github.com/fatih/set" | ||||
| 	v1 "github.com/juanfont/headscale/gen/go/headscale/v1" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"go4.org/mem" | ||||
| 	"google.golang.org/protobuf/types/known/timestamppb" | ||||
| 	"gorm.io/datatypes" | ||||
| 	"inet.af/netaddr" | ||||
| @ -439,7 +438,8 @@ func (machine Machine) toNode( | ||||
| 	dnsConfig *tailcfg.DNSConfig, | ||||
| 	includeRoutes bool, | ||||
| ) (*tailcfg.Node, error) { | ||||
| 	nodeKey, err := key.ParseNodePublicUntyped(mem.S(machine.NodeKey)) | ||||
| 	var nodeKey key.NodePublic | ||||
| 	err := nodeKey.UnmarshalText([]byte(machine.NodeKey)) | ||||
| 	if err != nil { | ||||
| 		log.Trace(). | ||||
| 			Caller(). | ||||
| @ -449,19 +449,18 @@ func (machine Machine) toNode( | ||||
| 		return nil, fmt.Errorf("failed to parse node public key: %w", err) | ||||
| 	} | ||||
| 
 | ||||
| 	machineKey, err := key.ParseMachinePublicUntyped(mem.S(machine.MachineKey)) | ||||
| 	var machineKey key.MachinePublic | ||||
| 	err = machineKey.UnmarshalText([]byte(machine.MachineKey)) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("failed to parse machine public key: %w", err) | ||||
| 	} | ||||
| 
 | ||||
| 	var discoKey key.DiscoPublic | ||||
| 	if machine.DiscoKey != "" { | ||||
| 		dKey := key.DiscoPublic{} | ||||
| 		err := dKey.UnmarshalText([]byte(discoPublicHexPrefix + machine.DiscoKey)) | ||||
| 		err := discoKey.UnmarshalText([]byte(discoPublicHexPrefix + machine.DiscoKey)) | ||||
| 		if err != nil { | ||||
| 			return nil, fmt.Errorf("failed to parse disco public key: %w", err) | ||||
| 		} | ||||
| 		discoKey = key.DiscoPublic(dKey) | ||||
| 	} else { | ||||
| 		discoKey = key.DiscoPublic{} | ||||
| 	} | ||||
| @ -634,7 +633,8 @@ func (h *Headscale) RegisterMachine( | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	machineKey, err := key.ParseMachinePublicUntyped(mem.S(machineKeyStr)) | ||||
| 	var machineKey key.MachinePublic | ||||
| 	err = machineKey.UnmarshalText([]byte(machineKeyStr)) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										4
									
								
								oidc.go
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								oidc.go
									
									
									
									
									
								
							| @ -15,7 +15,6 @@ import ( | ||||
| 	"github.com/gin-gonic/gin" | ||||
| 	"github.com/patrickmn/go-cache" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"go4.org/mem" | ||||
| 	"golang.org/x/oauth2" | ||||
| 	"gorm.io/gorm" | ||||
| 	"tailscale.com/types/key" | ||||
| @ -192,7 +191,8 @@ func (h *Headscale) OIDCCallback(ctx *gin.Context) { | ||||
| 
 | ||||
| 	machineKeyStr, machineKeyOK := machineKeyIf.(string) | ||||
| 
 | ||||
| 	machineKey, err := key.ParseMachinePublicUntyped(mem.S(machineKeyStr)) | ||||
| 	var machineKey key.MachinePublic | ||||
| 	err = machineKey.UnmarshalText([]byte(machineKeyStr)) | ||||
| 	if err != nil { | ||||
| 		log.Error(). | ||||
| 			Msg("could not parse machine public key") | ||||
|  | ||||
							
								
								
									
										19
									
								
								poll.go
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								poll.go
									
									
									
									
									
								
							| @ -9,7 +9,6 @@ import ( | ||||
| 
 | ||||
| 	"github.com/gin-gonic/gin" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"go4.org/mem" | ||||
| 	"gorm.io/datatypes" | ||||
| 	"gorm.io/gorm" | ||||
| 	"tailscale.com/tailcfg" | ||||
| @ -36,8 +35,10 @@ func (h *Headscale) PollNetMapHandler(ctx *gin.Context) { | ||||
| 		Str("id", ctx.Param("id")). | ||||
| 		Msg("PollNetMapHandler called") | ||||
| 	body, _ := io.ReadAll(ctx.Request.Body) | ||||
| 	mKeyStr := ctx.Param("id") | ||||
| 	mKey, err := key.ParseMachinePublicUntyped(mem.S(mKeyStr)) | ||||
| 	machineKeyStr := ctx.Param("id") | ||||
| 
 | ||||
| 	var machineKey key.MachinePublic | ||||
| 	err := machineKey.UnmarshalText([]byte(machineKeyStr)) | ||||
| 	if err != nil { | ||||
| 		log.Error(). | ||||
| 			Str("handler", "PollNetMap"). | ||||
| @ -48,7 +49,7 @@ func (h *Headscale) PollNetMapHandler(ctx *gin.Context) { | ||||
| 		return | ||||
| 	} | ||||
| 	req := tailcfg.MapRequest{} | ||||
| 	err = decode(body, &req, &mKey, h.privateKey) | ||||
| 	err = decode(body, &req, &machineKey, h.privateKey) | ||||
| 	if err != nil { | ||||
| 		log.Error(). | ||||
| 			Str("handler", "PollNetMap"). | ||||
| @ -59,19 +60,19 @@ func (h *Headscale) PollNetMapHandler(ctx *gin.Context) { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	machine, err := h.GetMachineByMachineKey(mKey) | ||||
| 	machine, err := h.GetMachineByMachineKey(machineKey) | ||||
| 	if err != nil { | ||||
| 		if errors.Is(err, gorm.ErrRecordNotFound) { | ||||
| 			log.Warn(). | ||||
| 				Str("handler", "PollNetMap"). | ||||
| 				Msgf("Ignoring request, cannot find machine with key %s", mKey.String()) | ||||
| 				Msgf("Ignoring request, cannot find machine with key %s", machineKey.String()) | ||||
| 			ctx.String(http.StatusUnauthorized, "") | ||||
| 
 | ||||
| 			return | ||||
| 		} | ||||
| 		log.Error(). | ||||
| 			Str("handler", "PollNetMap"). | ||||
| 			Msgf("Failed to fetch machine from the database with Machine key: %s", mKey.String()) | ||||
| 			Msgf("Failed to fetch machine from the database with Machine key: %s", machineKey.String()) | ||||
| 		ctx.String(http.StatusInternalServerError, "") | ||||
| 	} | ||||
| 	log.Trace(). | ||||
| @ -101,7 +102,7 @@ func (h *Headscale) PollNetMapHandler(ctx *gin.Context) { | ||||
| 	} | ||||
| 	h.db.Save(&machine) | ||||
| 
 | ||||
| 	data, err := h.getMapResponse(mKey, req, machine) | ||||
| 	data, err := h.getMapResponse(machineKey, req, machine) | ||||
| 	if err != nil { | ||||
| 		log.Error(). | ||||
| 			Str("handler", "PollNetMap"). | ||||
| @ -206,7 +207,7 @@ func (h *Headscale) PollNetMapHandler(ctx *gin.Context) { | ||||
| 		ctx, | ||||
| 		machine, | ||||
| 		req, | ||||
| 		mKey, | ||||
| 		machineKey, | ||||
| 		pollDataChan, | ||||
| 		keepAliveChan, | ||||
| 		updateChan, | ||||
|  | ||||
							
								
								
									
										18
									
								
								utils.go
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								utils.go
									
									
									
									
									
								
							| @ -20,22 +20,12 @@ import ( | ||||
| 
 | ||||
| const ( | ||||
| 	errCannotDecryptReponse = Error("cannot decrypt response") | ||||
| 	errResponseMissingNonce = Error("response missing nonce") | ||||
| 	errCouldNotAllocateIP   = Error("could not find any suitable IP") | ||||
| 
 | ||||
| 	// These constants are copied from the upstream tailscale.com/types/key
 | ||||
| 	// library, because they are not exported.
 | ||||
| 	// https://github.com/tailscale/tailscale/tree/main/types/key
 | ||||
| 
 | ||||
| 	// nodePrivateHexPrefix is the prefix used to identify a
 | ||||
| 	// hex-encoded node private key.
 | ||||
| 	//
 | ||||
| 	// This prefix name is a little unfortunate, in that it comes from
 | ||||
| 	// WireGuard's own key types, and we've used it for both key types
 | ||||
| 	// we persist to disk (machine and node keys). But we're stuck
 | ||||
| 	// with it for now, barring another round of tricky migration.
 | ||||
| 	nodePrivateHexPrefix = "privkey:" | ||||
| 
 | ||||
| 	// nodePublicHexPrefix is the prefix used to identify a
 | ||||
| 	// hex-encoded node public key.
 | ||||
| 	//
 | ||||
| @ -43,14 +33,6 @@ const ( | ||||
| 	// changed.
 | ||||
| 	nodePublicHexPrefix = "nodekey:" | ||||
| 
 | ||||
| 	// machinePrivateHexPrefix is the prefix used to identify a
 | ||||
| 	// hex-encoded machine private key.
 | ||||
| 	//
 | ||||
| 	// This prefix name is a little unfortunate, in that it comes from
 | ||||
| 	// WireGuard's own key types. Unfortunately we're stuck with it for
 | ||||
| 	// machine keys, because we serialize them to disk with this prefix.
 | ||||
| 	machinePrivateHexPrefix = "privkey:" | ||||
| 
 | ||||
| 	// machinePublicHexPrefix is the prefix used to identify a
 | ||||
| 	// hex-encoded machine public key.
 | ||||
| 	//
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user