mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-31 21:17:43 +09:00 
			
		
		
		
	fix(grpc): add more checks for tag validation
This commit is contained in:
		
							
								
								
									
										22
									
								
								grpcv1.go
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								grpcv1.go
									
									
									
									
									
								
							| @@ -3,6 +3,7 @@ package headscale | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"fmt" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| @@ -195,13 +196,11 @@ func (api headscaleV1APIServer) SetTags( | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for _, tag := range request.GetTags() { | 	for _, tag := range request.GetTags() { | ||||||
| 		if strings.Index(tag, "tag:") != 0 { | 		err := validateTag(tag) | ||||||
|  | 		if err != nil { | ||||||
| 			return &v1.SetTagsResponse{ | 			return &v1.SetTagsResponse{ | ||||||
| 					Machine: nil, | 					Machine: nil, | ||||||
| 				}, status.Error( | 			}, status.Error(codes.InvalidArgument, err.Error()) | ||||||
| 					codes.InvalidArgument, |  | ||||||
| 					"Invalid tag detected. Each tag must start with the string 'tag:'", |  | ||||||
| 				) |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -220,6 +219,19 @@ func (api headscaleV1APIServer) SetTags( | |||||||
| 	return &v1.SetTagsResponse{Machine: machine.toProto()}, nil | 	return &v1.SetTagsResponse{Machine: machine.toProto()}, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func validateTag(tag string) error { | ||||||
|  | 	if strings.Index(tag, "tag:") != 0 { | ||||||
|  | 		return fmt.Errorf("tag must start with the string 'tag:'") | ||||||
|  | 	} | ||||||
|  | 	if strings.ToLower(tag) != tag { | ||||||
|  | 		return fmt.Errorf("tag should be lowercase") | ||||||
|  | 	} | ||||||
|  | 	if len(strings.Fields(tag)) > 1 { | ||||||
|  | 		return fmt.Errorf("tag should not contains space") | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
| func (api headscaleV1APIServer) DeleteMachine( | func (api headscaleV1APIServer) DeleteMachine( | ||||||
| 	ctx context.Context, | 	ctx context.Context, | ||||||
| 	request *v1.DeleteMachineRequest, | 	request *v1.DeleteMachineRequest, | ||||||
|   | |||||||
							
								
								
									
										42
									
								
								grpcv1_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								grpcv1_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  | package headscale | ||||||
|  |  | ||||||
|  | import "testing" | ||||||
|  |  | ||||||
|  | func Test_validateTag(t *testing.T) { | ||||||
|  | 	type args struct { | ||||||
|  | 		tag string | ||||||
|  | 	} | ||||||
|  | 	tests := []struct { | ||||||
|  | 		name    string | ||||||
|  | 		args    args | ||||||
|  | 		wantErr bool | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			name:    "valid tag", | ||||||
|  | 			args:    args{tag: "tag:test"}, | ||||||
|  | 			wantErr: false, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:    "tag without tag prefix", | ||||||
|  | 			args:    args{tag: "test"}, | ||||||
|  | 			wantErr: true, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:    "uppercase tag", | ||||||
|  | 			args:    args{tag: "tag:tEST"}, | ||||||
|  | 			wantErr: true, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			name:    "tag that contains space", | ||||||
|  | 			args:    args{tag: "tag:this is a spaced tag"}, | ||||||
|  | 			wantErr: true, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, tt := range tests { | ||||||
|  | 		t.Run(tt.name, func(t *testing.T) { | ||||||
|  | 			if err := validateTag(tt.args.tag); (err != nil) != tt.wantErr { | ||||||
|  | 				t.Errorf("validateTag() error = %v, wantErr %v", err, tt.wantErr) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -625,7 +625,7 @@ func (s *IntegrationCLITestSuite) TestNodeTagCommand() { | |||||||
| 	var errorOutput errOutput | 	var errorOutput errOutput | ||||||
| 	err = json.Unmarshal([]byte(wrongTagResult), &errorOutput) | 	err = json.Unmarshal([]byte(wrongTagResult), &errorOutput) | ||||||
| 	assert.Nil(s.T(), err) | 	assert.Nil(s.T(), err) | ||||||
| 	assert.Contains(s.T(), errorOutput.Error, "Invalid tag detected") | 	assert.Contains(s.T(), errorOutput.Error, "tag must start with the string 'tag:'") | ||||||
|  |  | ||||||
| 	// Test list all nodes after added seconds | 	// Test list all nodes after added seconds | ||||||
| 	listAllResult, err := ExecuteCommand( | 	listAllResult, err := ExecuteCommand( | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user