mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	Fixed errors in files according to golangci-lint rules
This commit is contained in:
		
							parent
							
								
									d3661204e7
								
							
						
					
					
						commit
						898150b368
					
				
							
								
								
									
										2
									
								
								.github/workflows/test-integration.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/test-integration.yaml
									
									
									
									
										vendored
									
									
								
							| @ -19,12 +19,12 @@ jobs: | |||||||
|           - TestACLNamedHostsCanReach |           - TestACLNamedHostsCanReach | ||||||
|           - TestACLDevice1CanAccessDevice2 |           - TestACLDevice1CanAccessDevice2 | ||||||
|           - TestPolicyUpdateWhileRunningWithCLIInDatabase |           - TestPolicyUpdateWhileRunningWithCLIInDatabase | ||||||
|  |           - TestAuthNodeApproval | ||||||
|           - TestOIDCAuthenticationPingAll |           - TestOIDCAuthenticationPingAll | ||||||
|           - TestOIDCExpireNodesBasedOnTokenExpiry |           - TestOIDCExpireNodesBasedOnTokenExpiry | ||||||
|           - TestOIDC024UserCreation |           - TestOIDC024UserCreation | ||||||
|           - TestAuthWebFlowAuthenticationPingAll |           - TestAuthWebFlowAuthenticationPingAll | ||||||
|           - TestAuthWebFlowLogoutAndRelogin |           - TestAuthWebFlowLogoutAndRelogin | ||||||
|           - TestAuthNodeApproval |  | ||||||
|           - TestUserCommand |           - TestUserCommand | ||||||
|           - TestPreAuthKeyCommand |           - TestPreAuthKeyCommand | ||||||
|           - TestPreAuthKeyCommandWithoutExpiry |           - TestPreAuthKeyCommandWithoutExpiry | ||||||
|  | |||||||
| @ -51,7 +51,7 @@ func init() { | |||||||
| 	approveNodeCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)") | 	approveNodeCmd.Flags().Uint64P("identifier", "i", 0, "Node identifier (ID)") | ||||||
| 	err = approveNodeCmd.MarkFlagRequired("identifier") | 	err = approveNodeCmd.MarkFlagRequired("identifier") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Fatalf(err.Error()) | 		log.Fatalf("%v", err) | ||||||
| 	} | 	} | ||||||
| 	nodeCmd.AddCommand(approveNodeCmd) | 	nodeCmd.AddCommand(approveNodeCmd) | ||||||
| 
 | 
 | ||||||
| @ -226,6 +226,7 @@ var approveNodeCmd = &cobra.Command{ | |||||||
| 				fmt.Sprintf("Error converting ID to integer: %s", err), | 				fmt.Sprintf("Error converting ID to integer: %s", err), | ||||||
| 				output, | 				output, | ||||||
| 			) | 			) | ||||||
|  | 
 | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 		ctx, client, conn, cancel := newHeadscaleCLIWithConfig() | 		ctx, client, conn, cancel := newHeadscaleCLIWithConfig() | ||||||
| @ -244,6 +245,7 @@ var approveNodeCmd = &cobra.Command{ | |||||||
| 				), | 				), | ||||||
| 				output, | 				output, | ||||||
| 			) | 			) | ||||||
|  | 
 | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 		SuccessOutput(response.GetNode(), "Node approved", output) | 		SuccessOutput(response.GetNode(), "Node approved", output) | ||||||
|  | |||||||
| @ -313,7 +313,7 @@ func (h *Headscale) handleAuthKey( | |||||||
| 			node.AuthKeyID = ptr.To(pak.ID) | 			node.AuthKeyID = ptr.To(pak.ID) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if node.Approved == false { | 		if !node.Approved { | ||||||
| 			node.Approved = nodeApproved | 			node.Approved = nodeApproved | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -29,7 +29,10 @@ func init() { | |||||||
| 	schema.RegisterSerializer("text", TextSerialiser{}) | 	schema.RegisterSerializer("text", TextSerialiser{}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var errDatabaseNotSupported = errors.New("database type not supported") | var ( | ||||||
|  | 	errDatabaseNotSupported           = errors.New("database type not supported") | ||||||
|  | 	errNoNodeApprovedColumnInDatabase = errors.New("no node approved column in database") | ||||||
|  | ) | ||||||
| 
 | 
 | ||||||
| // KV is a key-value store in a psql table. For future use...
 | // KV is a key-value store in a psql table. For future use...
 | ||||||
| // TODO(kradalby): Is this used for anything?
 | // TODO(kradalby): Is this used for anything?
 | ||||||
| @ -525,26 +528,26 @@ func NewHeadscaleDatabase( | |||||||
| 			}, | 			}, | ||||||
| 			{ | 			{ | ||||||
| 				ID: "202410071005", | 				ID: "202410071005", | ||||||
| 				Migrate: func(tx *gorm.DB) error { | 				Migrate: func(db *gorm.DB) error { | ||||||
| 					err = tx.AutoMigrate(&types.PreAuthKey{}) | 					err = db.AutoMigrate(&types.PreAuthKey{}) | ||||||
| 					if err != nil { | 					if err != nil { | ||||||
| 						return err | 						return err | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 					err = tx.AutoMigrate(&types.Node{}) | 					err = db.AutoMigrate(&types.Node{}) | ||||||
| 					if err != nil { | 					if err != nil { | ||||||
| 						return err | 						return err | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 					if tx.Migrator().HasColumn(&types.Node{}, "approved") { | 					if db.Migrator().HasColumn(&types.Node{}, "approved") { | ||||||
| 						nodes := types.Nodes{} | 						nodes := types.Nodes{} | ||||||
| 						if err := tx.Find(&nodes).Error; err != nil { | 						if err := db.Find(&nodes).Error; err != nil { | ||||||
| 							log.Error().Err(err).Msg("Error accessing db") | 							log.Error().Err(err).Msg("Error accessing db") | ||||||
| 						} | 						} | ||||||
| 
 | 
 | ||||||
| 						for item, node := range nodes { | 						for item, node := range nodes { | ||||||
| 							if node.IsApproved() == false { | 							if !node.IsApproved() { | ||||||
| 								err = tx.Model(nodes[item]).Updates(types.Node{ | 								err = db.Model(nodes[item]).Updates(types.Node{ | ||||||
| 									Approved: true, | 									Approved: true, | ||||||
| 								}).Error | 								}).Error | ||||||
| 								if err != nil { | 								if err != nil { | ||||||
| @ -561,7 +564,7 @@ func NewHeadscaleDatabase( | |||||||
| 						return nil | 						return nil | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 					return fmt.Errorf("no node approved column in DB") | 					return errNoNodeApprovedColumnInDatabase | ||||||
| 				}, | 				}, | ||||||
| 				Rollback: func(db *gorm.DB) error { return nil }, | 				Rollback: func(db *gorm.DB) error { return nil }, | ||||||
| 			}, | 			}, | ||||||
|  | |||||||
| @ -265,17 +265,17 @@ func isTailscaleReservedIP(ip netip.Addr) bool { | |||||||
| // it will be added.
 | // it will be added.
 | ||||||
| // If a prefix type has been removed (IPv4 or IPv6), it
 | // If a prefix type has been removed (IPv4 or IPv6), it
 | ||||||
| // will remove the IPs in that family from the node.
 | // will remove the IPs in that family from the node.
 | ||||||
| func (hsdb *HSDatabase) BackfillNodeIPs(i *IPAllocator) ([]string, error) { | func (hsdb *HSDatabase) BackfillNodeIPs(ip *IPAllocator) ([]string, error) { | ||||||
| 	var err error | 	var err error | ||||||
| 	var ret []string | 	var ret []string | ||||||
| 	err = hsdb.Write(func(tx *gorm.DB) error { | 	err = hsdb.Write(func(db *gorm.DB) error { | ||||||
| 		if i == nil { | 		if ip == nil { | ||||||
| 			return errors.New("backfilling IPs: ip allocator was nil") | 			return errors.New("backfilling IPs: ip allocator was nil") | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		log.Trace().Msgf("starting to backfill IPs") | 		log.Trace().Msgf("starting to backfill IPs") | ||||||
| 
 | 
 | ||||||
| 		nodes, err := ListNodes(tx) | 		nodes, err := ListNodes(db) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return fmt.Errorf("listing nodes to backfill IPs: %w", err) | 			return fmt.Errorf("listing nodes to backfill IPs: %w", err) | ||||||
| 		} | 		} | ||||||
| @ -285,8 +285,8 @@ func (hsdb *HSDatabase) BackfillNodeIPs(i *IPAllocator) ([]string, error) { | |||||||
| 
 | 
 | ||||||
| 			changed := false | 			changed := false | ||||||
| 			// IPv4 prefix is set, but node ip is missing, alloc
 | 			// IPv4 prefix is set, but node ip is missing, alloc
 | ||||||
| 			if i.prefix4 != nil && node.IPv4 == nil { | 			if ip.prefix4 != nil && node.IPv4 == nil { | ||||||
| 				ret4, err := i.nextLocked(i.prev4, i.prefix4) | 				ret4, err := ip.nextLocked(ip.prev4, ip.prefix4) | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					return fmt.Errorf("failed to allocate ipv4 for node(%d): %w", node.ID, err) | 					return fmt.Errorf("failed to allocate ipv4 for node(%d): %w", node.ID, err) | ||||||
| 				} | 				} | ||||||
| @ -297,8 +297,8 @@ func (hsdb *HSDatabase) BackfillNodeIPs(i *IPAllocator) ([]string, error) { | |||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			// IPv6 prefix is set, but node ip is missing, alloc
 | 			// IPv6 prefix is set, but node ip is missing, alloc
 | ||||||
| 			if i.prefix6 != nil && node.IPv6 == nil { | 			if ip.prefix6 != nil && node.IPv6 == nil { | ||||||
| 				ret6, err := i.nextLocked(i.prev6, i.prefix6) | 				ret6, err := ip.nextLocked(ip.prev6, ip.prefix6) | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					return fmt.Errorf("failed to allocate ipv6 for node(%d): %w", node.ID, err) | 					return fmt.Errorf("failed to allocate ipv6 for node(%d): %w", node.ID, err) | ||||||
| 				} | 				} | ||||||
| @ -309,21 +309,21 @@ func (hsdb *HSDatabase) BackfillNodeIPs(i *IPAllocator) ([]string, error) { | |||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			// IPv4 prefix is not set, but node has IP, remove
 | 			// IPv4 prefix is not set, but node has IP, remove
 | ||||||
| 			if i.prefix4 == nil && node.IPv4 != nil { | 			if ip.prefix4 == nil && node.IPv4 != nil { | ||||||
| 				ret = append(ret, fmt.Sprintf("removing IPv4 %q from Node(%d) %q", node.IPv4.String(), node.ID, node.Hostname)) | 				ret = append(ret, fmt.Sprintf("removing IPv4 %q from Node(%d) %q", node.IPv4.String(), node.ID, node.Hostname)) | ||||||
| 				node.IPv4 = nil | 				node.IPv4 = nil | ||||||
| 				changed = true | 				changed = true | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			// IPv6 prefix is not set, but node has IP, remove
 | 			// IPv6 prefix is not set, but node has IP, remove
 | ||||||
| 			if i.prefix6 == nil && node.IPv6 != nil { | 			if ip.prefix6 == nil && node.IPv6 != nil { | ||||||
| 				ret = append(ret, fmt.Sprintf("removing IPv6 %q from Node(%d) %q", node.IPv6.String(), node.ID, node.Hostname)) | 				ret = append(ret, fmt.Sprintf("removing IPv6 %q from Node(%d) %q", node.IPv6.String(), node.ID, node.Hostname)) | ||||||
| 				node.IPv6 = nil | 				node.IPv6 = nil | ||||||
| 				changed = true | 				changed = true | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if changed { | 			if changed { | ||||||
| 				err := tx.Save(node).Error | 				err := db.Save(node).Error | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					return fmt.Errorf("saving node(%d) after adding IPs: %w", node.ID, err) | 					return fmt.Errorf("saving node(%d) after adding IPs: %w", node.ID, err) | ||||||
| 				} | 				} | ||||||
|  | |||||||
| @ -268,7 +268,7 @@ func (hsdb *HSDatabase) NodeSetApprove(nodeID types.NodeID, approved bool) error | |||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NodeSetApprove takes a Node struct and a set approval option
 | // NodeSetApprove takes a Node struct and a set approval option.
 | ||||||
| func NodeSetApprove(tx *gorm.DB, | func NodeSetApprove(tx *gorm.DB, | ||||||
| 	nodeID types.NodeID, approved bool, | 	nodeID types.NodeID, approved bool, | ||||||
| ) error { | ) error { | ||||||
| @ -371,7 +371,7 @@ func (hsdb *HSDatabase) RegisterNodeFromAuthCallback( | |||||||
| 			node.User = *user | 			node.User = *user | ||||||
| 			node.RegisterMethod = registrationMethod | 			node.RegisterMethod = registrationMethod | ||||||
| 
 | 
 | ||||||
| 			if node.IsApproved() == false && manualApprovedNode == false { | 			if !node.IsApproved() && manualApprovedNode == false { | ||||||
| 				node.Approved = true | 				node.Approved = true | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -203,7 +203,7 @@ func (s *Suite) TestListPeersWithoutNonAuthorized(c *check.C) { | |||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		node := types.Node{ | 		node := types.Node{ | ||||||
| 			ID:             types.NodeID(index), | 			ID:             types.NodeID(int64(index)), | ||||||
| 			MachineKey:     machineKey.Public(), | 			MachineKey:     machineKey.Public(), | ||||||
| 			NodeKey:        nodeKey.Public(), | 			NodeKey:        nodeKey.Public(), | ||||||
| 			Hostname:       "testnode" + strconv.Itoa(index), | 			Hostname:       "testnode" + strconv.Itoa(index), | ||||||
|  | |||||||
| @ -15,6 +15,11 @@ const ( | |||||||
| 	DatabaseSqlite       = "sqlite3" | 	DatabaseSqlite       = "sqlite3" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | const ( | ||||||
|  | 	SchemaHttp  = "http" | ||||||
|  | 	SchemaHttps = "https" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| var ErrCannotParsePrefix = errors.New("cannot parse prefix") | var ErrCannotParsePrefix = errors.New("cannot parse prefix") | ||||||
| 
 | 
 | ||||||
| type StateUpdateType int | type StateUpdateType int | ||||||
|  | |||||||
| @ -117,7 +117,7 @@ func (node Node) IsExpired() bool { | |||||||
| 
 | 
 | ||||||
| // IsApproved returns whether the node is approved.
 | // IsApproved returns whether the node is approved.
 | ||||||
| func (node Node) IsApproved() bool { | func (node Node) IsApproved() bool { | ||||||
| 	return node.Approved == true | 	return node.Approved | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // IsEphemeral returns if the node is registered as an Ephemeral node.
 | // IsEphemeral returns if the node is registered as an Ephemeral node.
 | ||||||
|  | |||||||
| @ -4,7 +4,8 @@ import ( | |||||||
| 	"context" | 	"context" | ||||||
| 	"crypto/tls" | 	"crypto/tls" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	v1 "github.com/juanfont/headscale/gen/go/headscale/v1" | 	"github.com/juanfont/headscale/gen/go/headscale/v1" | ||||||
|  | 	"github.com/juanfont/headscale/hscontrol/types" | ||||||
| 	"github.com/juanfont/headscale/integration/hsic" | 	"github.com/juanfont/headscale/integration/hsic" | ||||||
| 	"github.com/samber/lo" | 	"github.com/samber/lo" | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| @ -56,7 +57,7 @@ func TestAuthNodeApproval(t *testing.T) { | |||||||
| 		status, err := client.Status() | 		status, err := client.Status() | ||||||
| 		assertNoErr(t, err) | 		assertNoErr(t, err) | ||||||
| 		assert.Equal(t, "NeedsMachineAuth", status.BackendState) | 		assert.Equal(t, "NeedsMachineAuth", status.BackendState) | ||||||
| 		assert.Len(t, status.Peers(), 0) | 		assert.Empty(t, status.Peers()) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	headscale, err := scenario.Headscale() | 	headscale, err := scenario.Headscale() | ||||||
| @ -74,11 +75,11 @@ func TestAuthNodeApproval(t *testing.T) { | |||||||
| 		}, | 		}, | ||||||
| 		&allNodes, | 		&allNodes, | ||||||
| 	) | 	) | ||||||
| 	assert.Nil(t, err) | 	assert.NoError(t, err) | ||||||
| 
 | 
 | ||||||
| 	for _, node := range allNodes { | 	for _, node := range allNodes { | ||||||
| 		_, err = headscale.Execute([]string{ | 		_, err = headscale.Execute([]string{ | ||||||
| 			"headscale", "nodes", "approve", "--identifier", fmt.Sprintf("%d", node.Id), | 			"headscale", "nodes", "approve", "--identifier", fmt.Sprintf("%d", node.GetId()), | ||||||
| 		}) | 		}) | ||||||
| 		assertNoErr(t, err) | 		assertNoErr(t, err) | ||||||
| 	} | 	} | ||||||
| @ -113,7 +114,7 @@ func TestAuthNodeApproval(t *testing.T) { | |||||||
| 	err = scenario.WaitForTailscaleSync() | 	err = scenario.WaitForTailscaleSync() | ||||||
| 	assertNoErrSync(t, err) | 	assertNoErrSync(t, err) | ||||||
| 
 | 
 | ||||||
| 	//assertClientsState(t, allClients)
 | 	// assertClientsState(t, allClients)
 | ||||||
| 
 | 
 | ||||||
| 	allAddrs := lo.Map(allIps, func(x netip.Addr, index int) string { | 	allAddrs := lo.Map(allIps, func(x netip.Addr, index int) string { | ||||||
| 		return x.String() | 		return x.String() | ||||||
| @ -236,11 +237,11 @@ func (s *AuthApprovalScenario) runHeadscaleRegister(userStr string, loginURL *ur | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	log.Printf("loginURL: %s", loginURL) | 	log.Printf("loginURL: %s", loginURL) | ||||||
| 	loginURL.Host = fmt.Sprintf("%s:8080", headscale.GetIP()) | 	loginURL.Host = fmt.Sprintf("%s:%d", headscale.GetIP(), 8080) | ||||||
| 	loginURL.Scheme = "http" | 	loginURL.Scheme = types.SchemaHttp | ||||||
| 
 | 
 | ||||||
| 	if len(headscale.GetCert()) > 0 { | 	if len(headscale.GetCert()) > 0 { | ||||||
| 		loginURL.Scheme = "https" | 		loginURL.Scheme = types.SchemaHttps | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	insecureTransport := &http.Transport{ | 	insecureTransport := &http.Transport{ | ||||||
|  | |||||||
| @ -259,7 +259,7 @@ func WithTuning(batchTimeout time.Duration, mapSessionChanSize int) Option { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // WithManualApproveNewNode allows devices to access the network only after manual approval
 | // WithManualApproveNewNode allows devices to access the network only after manual approval.
 | ||||||
| func WithManualApproveNewNode() Option { | func WithManualApproveNewNode() Option { | ||||||
| 	return func(hsic *HeadscaleInContainer) { | 	return func(hsic *HeadscaleInContainer) { | ||||||
| 		hsic.env["HEADSCALE_NODE_MANAGEMENT_MANUAL_APPROVE_NEW_NODE"] = "true" | 		hsic.env["HEADSCALE_NODE_MANAGEMENT_MANUAL_APPROVE_NEW_NODE"] = "true" | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user