fix(grpc): add more checks for tag validation

This commit is contained in:
Adrien Raffin-Caboisse 2022-07-25 11:25:20 +02:00
parent c46a34e6b8
commit c90e862460
No known key found for this signature in database
GPG key ID: 7FB60532DEBEAD6A
3 changed files with 60 additions and 6 deletions

View file

@ -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
View 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)
}
})
}
}

View file

@ -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(