Skip to content

Commit ebee928

Browse files
authored
fix: properly convert max port share level for oss (coder#13261)
1 parent a5a6494 commit ebee928

File tree

5 files changed

+25
-13
lines changed

5 files changed

+25
-13
lines changed

coderd/portsharing/portsharing.go

+9-4
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,23 @@ import (
88
)
99

1010
type PortSharer interface {
11-
AuthorizedPortSharingLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error
12-
ValidateTemplateMaxPortSharingLevel(level codersdk.WorkspaceAgentPortShareLevel) error
11+
AuthorizedLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error
12+
ValidateTemplateMaxLevel(level codersdk.WorkspaceAgentPortShareLevel) error
13+
ConvertMaxLevel(level database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel
1314
}
1415

1516
type AGPLPortSharer struct{}
1617

17-
func (AGPLPortSharer) AuthorizedPortSharingLevel(_ database.Template, _ codersdk.WorkspaceAgentPortShareLevel) error {
18+
func (AGPLPortSharer) AuthorizedLevel(_ database.Template, _ codersdk.WorkspaceAgentPortShareLevel) error {
1819
return nil
1920
}
2021

21-
func (AGPLPortSharer) ValidateTemplateMaxPortSharingLevel(_ codersdk.WorkspaceAgentPortShareLevel) error {
22+
func (AGPLPortSharer) ValidateTemplateMaxLevel(_ codersdk.WorkspaceAgentPortShareLevel) error {
2223
return xerrors.New("Restricting port sharing level is an enterprise feature that is not enabled.")
2324
}
2425

26+
func (AGPLPortSharer) ConvertMaxLevel(_ database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel {
27+
return codersdk.WorkspaceAgentPortShareLevelPublic
28+
}
29+
2530
var DefaultPortSharer PortSharer = AGPLPortSharer{}

coderd/templates.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -623,8 +623,8 @@ func (api *API) patchTemplateMeta(rw http.ResponseWriter, r *http.Request) {
623623
validErrs = append(validErrs, codersdk.ValidationError{Field: "time_til_dormant_autodelete_ms", Detail: "Value must be at least one minute."})
624624
}
625625
maxPortShareLevel := template.MaxPortSharingLevel
626-
if req.MaxPortShareLevel != nil && *req.MaxPortShareLevel != codersdk.WorkspaceAgentPortShareLevel(maxPortShareLevel) {
627-
err := portSharer.ValidateTemplateMaxPortSharingLevel(*req.MaxPortShareLevel)
626+
if req.MaxPortShareLevel != nil && *req.MaxPortShareLevel != portSharer.ConvertMaxLevel(template.MaxPortSharingLevel) {
627+
err := portSharer.ValidateTemplateMaxLevel(*req.MaxPortShareLevel)
628628
if err != nil {
629629
validErrs = append(validErrs, codersdk.ValidationError{Field: "max_port_sharing_level", Detail: err.Error()})
630630
} else {
@@ -857,6 +857,9 @@ func (api *API) convertTemplate(
857857
autostopRequirementWeeks = 1
858858
}
859859

860+
portSharer := *(api.PortSharer.Load())
861+
maxPortShareLevel := portSharer.ConvertMaxLevel(template.MaxPortSharingLevel)
862+
860863
return codersdk.Template{
861864
ID: template.ID,
862865
CreatedAt: template.CreatedAt,
@@ -891,6 +894,6 @@ func (api *API) convertTemplate(
891894
RequireActiveVersion: templateAccessControl.RequireActiveVersion,
892895
Deprecated: templateAccessControl.IsDeprecated(),
893896
DeprecationMessage: templateAccessControl.Deprecated,
894-
MaxPortShareLevel: codersdk.WorkspaceAgentPortShareLevel(template.MaxPortSharingLevel),
897+
MaxPortShareLevel: maxPortShareLevel,
895898
}
896899
}

coderd/templates_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -600,9 +600,9 @@ func TestPatchTemplateMeta(t *testing.T) {
600600
user := coderdtest.CreateFirstUser(t, client)
601601
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
602602
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
603-
require.Equal(t, codersdk.WorkspaceAgentPortShareLevelOwner, template.MaxPortShareLevel)
603+
require.Equal(t, codersdk.WorkspaceAgentPortShareLevelPublic, template.MaxPortShareLevel)
604604

605-
var level codersdk.WorkspaceAgentPortShareLevel = codersdk.WorkspaceAgentPortShareLevelPublic
605+
var level codersdk.WorkspaceAgentPortShareLevel = codersdk.WorkspaceAgentPortShareLevelAuthenticated
606606
req := codersdk.UpdateTemplateMeta{
607607
MaxPortShareLevel: &level,
608608
}
@@ -615,7 +615,7 @@ func TestPatchTemplateMeta(t *testing.T) {
615615
require.ErrorContains(t, err, "port sharing level is an enterprise feature")
616616

617617
// Ensure the same value port share level is a no-op
618-
level = codersdk.WorkspaceAgentPortShareLevelOwner
618+
level = codersdk.WorkspaceAgentPortShareLevelPublic
619619
_, err = client.UpdateTemplateMeta(ctx, template.ID, codersdk.UpdateTemplateMeta{
620620
Name: coderdtest.RandomUsername(t),
621621
MaxPortShareLevel: &level,

coderd/workspaceagentportshare.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func (api *API) postWorkspaceAgentPortShare(rw http.ResponseWriter, r *http.Requ
6969
return
7070
}
7171

72-
err = portSharer.AuthorizedPortSharingLevel(template, req.ShareLevel)
72+
err = portSharer.AuthorizedLevel(template, req.ShareLevel)
7373
if err != nil {
7474
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
7575
Message: err.Error(),

enterprise/coderd/portsharing/portsharing.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ func NewEnterprisePortSharer() *EnterprisePortSharer {
1313
return &EnterprisePortSharer{}
1414
}
1515

16-
func (EnterprisePortSharer) AuthorizedPortSharingLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error {
16+
func (EnterprisePortSharer) AuthorizedLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error {
1717
max := codersdk.WorkspaceAgentPortShareLevel(template.MaxPortSharingLevel)
1818
switch level {
1919
case codersdk.WorkspaceAgentPortShareLevelPublic:
@@ -31,10 +31,14 @@ func (EnterprisePortSharer) AuthorizedPortSharingLevel(template database.Templat
3131
return nil
3232
}
3333

34-
func (EnterprisePortSharer) ValidateTemplateMaxPortSharingLevel(level codersdk.WorkspaceAgentPortShareLevel) error {
34+
func (EnterprisePortSharer) ValidateTemplateMaxLevel(level codersdk.WorkspaceAgentPortShareLevel) error {
3535
if !level.ValidMaxLevel() {
3636
return xerrors.New("invalid max port sharing level, value must be 'authenticated' or 'public'.")
3737
}
3838

3939
return nil
4040
}
41+
42+
func (EnterprisePortSharer) ConvertMaxLevel(level database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel {
43+
return codersdk.WorkspaceAgentPortShareLevel(level)
44+
}

0 commit comments

Comments
 (0)