Skip to content

Commit fcf9ea7

Browse files
authored
fix: escape params in the url (#100)
1 parent 0cb98e1 commit fcf9ea7

File tree

5 files changed

+33
-9
lines changed

5 files changed

+33
-9
lines changed

client/auth.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
// Login will login the user and get the response.
1515
func (c *client) login(request *v1pb.LoginRequest) (*v1pb.LoginResponse, error) {
1616
if request.Email == "" || request.Password == "" {
17-
return nil, errors.Errorf("define username and password")
17+
return nil, errors.Errorf("undefined login service account or key")
1818
}
1919
rb, err := protojson.Marshal(request)
2020
if err != nil {
@@ -28,7 +28,7 @@ func (c *client) login(request *v1pb.LoginRequest) (*v1pb.LoginResponse, error)
2828

2929
body, err := c.doRequest(req)
3030
if err != nil {
31-
return nil, err
31+
return nil, errors.Wrapf(err, "failed to login")
3232
}
3333

3434
ar := v1pb.LoginResponse{}

client/common.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"net/http"
7+
"net/url"
78
"strings"
89

910
"google.golang.org/protobuf/encoding/protojson"
@@ -15,7 +16,7 @@ var ProtojsonUnmarshaler = protojson.UnmarshalOptions{DiscardUnknown: true}
1516

1617
// deleteResource deletes the resource by name.
1718
func (c *client) deleteResource(ctx context.Context, name string) error {
18-
req, err := http.NewRequestWithContext(ctx, "DELETE", fmt.Sprintf("%s/%s/%s", c.url, c.version, name), nil)
19+
req, err := http.NewRequestWithContext(ctx, "DELETE", fmt.Sprintf("%s/%s/%s", c.url, c.version, url.QueryEscape(name)), nil)
1920
if err != nil {
2021
return err
2122
}
@@ -28,7 +29,7 @@ func (c *client) deleteResource(ctx context.Context, name string) error {
2829

2930
// undeleteResource undeletes the resource by name.
3031
func (c *client) undeleteResource(ctx context.Context, name string) ([]byte, error) {
31-
req, err := http.NewRequestWithContext(ctx, "POST", fmt.Sprintf("%s/%s/%s:undelete", c.url, c.version, name), nil)
32+
req, err := http.NewRequestWithContext(ctx, "POST", fmt.Sprintf("%s/%s/%s:undelete", c.url, c.version, url.QueryEscape(name)), nil)
3233
if err != nil {
3334
return nil, err
3435
}
@@ -48,7 +49,7 @@ func (c *client) updateResource(ctx context.Context, name string, patch protoref
4849
return nil, err
4950
}
5051

51-
req, err := http.NewRequestWithContext(ctx, "PATCH", fmt.Sprintf("%s/%s/%s?update_mask=%s&allow_missing=%v", c.url, c.version, name, strings.Join(updateMasks, ","), allowMissing), strings.NewReader(string(payload)))
52+
req, err := http.NewRequestWithContext(ctx, "PATCH", fmt.Sprintf("%s/%s/%s?update_mask=%s&allow_missing=%v", c.url, c.version, url.QueryEscape(name), strings.Join(updateMasks, ","), allowMissing), strings.NewReader(string(payload)))
5253
if err != nil {
5354
return nil, err
5455
}
@@ -63,7 +64,7 @@ func (c *client) updateResource(ctx context.Context, name string, patch protoref
6364

6465
// getResource gets the resource by name.
6566
func (c *client) getResource(ctx context.Context, name string) ([]byte, error) {
66-
req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/%s/%s", c.url, c.version, name), nil)
67+
req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/%s/%s", c.url, c.version, url.QueryEscape(name)), nil)
6768
if err != nil {
6869
return nil, err
6970
}

client/group.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"net/http"
7+
"net/url"
78
"strings"
89

910
v1pb "github.com/bytebase/bytebase/proto/generated-go/v1"
@@ -37,7 +38,7 @@ func (c *client) CreateGroup(ctx context.Context, email string, group *v1pb.Grou
3738
return nil, err
3839
}
3940

40-
req, err := http.NewRequestWithContext(ctx, "POST", fmt.Sprintf("%s/%s/groups?groupEmail=%s", c.url, c.version, email), strings.NewReader(string(payload)))
41+
req, err := http.NewRequestWithContext(ctx, "POST", fmt.Sprintf("%s/%s/groups?groupEmail=%s", c.url, c.version, url.QueryEscape(email)), strings.NewReader(string(payload)))
4142

4243
if err != nil {
4344
return nil, err

provider/data_source_user.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ func setUser(ctx context.Context, client api.Client, d *schema.ResourceData, use
131131
if err := d.Set("type", user.UserType.String()); err != nil {
132132
return diag.Errorf("cannot set type for user: %s", err.Error())
133133
}
134+
if user.ServiceKey != "" {
135+
if err := d.Set("service_key", user.ServiceKey); err != nil {
136+
return diag.Errorf("cannot set the service_key: %s", err.Error())
137+
}
138+
}
134139
if err := d.Set("mfa_enabled", user.MfaEnabled); err != nil {
135140
return diag.Errorf("cannot set mfa_enabled for user: %s", err.Error())
136141
}

provider/resource_user.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"slices"
7+
"strings"
78

89
v1pb "github.com/bytebase/bytebase/proto/generated-go/v1"
910
"github.com/hashicorp/terraform-plugin-log/tflog"
@@ -51,6 +52,11 @@ func resourceUser() *schema.Resource {
5152
Optional: true,
5253
Description: "The user login password.",
5354
},
55+
"service_key": {
56+
Type: schema.TypeString,
57+
Computed: true,
58+
Description: "The service key for service account.",
59+
},
5460
"roles": {
5561
Type: schema.TypeSet,
5662
Optional: true,
@@ -61,8 +67,13 @@ func resourceUser() *schema.Resource {
6167
},
6268
"type": {
6369
Type: schema.TypeString,
64-
Computed: true,
70+
Optional: true,
6571
Description: "The user type.",
72+
Default: v1pb.UserType_USER.String(),
73+
ValidateFunc: validation.StringInSlice([]string{
74+
v1pb.UserType_SERVICE_ACCOUNT.String(),
75+
v1pb.UserType_USER.String(),
76+
}, false),
6677
},
6778
"name": {
6879
Type: schema.TypeString,
@@ -198,13 +209,19 @@ func resourceUserCreate(ctx context.Context, d *schema.ResourceData, m interface
198209
}
199210
d.SetId(existedUser.Name)
200211
} else {
212+
userType := v1pb.UserType(v1pb.UserType_value[d.Get("type").(string)])
213+
if userType == v1pb.UserType_SERVICE_ACCOUNT {
214+
if !strings.HasSuffix(email, "@service.bytebase.com") {
215+
return diag.Errorf(`service account email must ends with "@service.bytebase.com"`)
216+
}
217+
}
201218
user, err := c.CreateUser(ctx, &v1pb.User{
202219
Name: userName,
203220
Title: title,
204221
Password: password,
205222
Phone: phone,
206223
Email: email,
207-
UserType: v1pb.UserType_USER,
224+
UserType: userType,
208225
State: v1pb.State_ACTIVE,
209226
})
210227
if err != nil {

0 commit comments

Comments
 (0)