From 051201d6193566300665dbc6d92c1061b90893b4 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Mon, 13 May 2024 16:51:08 +0000 Subject: [PATCH 1/2] fix: properly convert max port share level for oss --- coderd/portsharing/portsharing.go | 5 +++++ coderd/templates.go | 7 +++++-- coderd/templates_test.go | 6 +++--- enterprise/coderd/portsharing/portsharing.go | 4 ++++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/coderd/portsharing/portsharing.go b/coderd/portsharing/portsharing.go index 9c05539b5a400..b6aeb4dd127a4 100644 --- a/coderd/portsharing/portsharing.go +++ b/coderd/portsharing/portsharing.go @@ -10,6 +10,7 @@ import ( type PortSharer interface { AuthorizedPortSharingLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error ValidateTemplateMaxPortSharingLevel(level codersdk.WorkspaceAgentPortShareLevel) error + ConvertMaxPortSharingLevel(level database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel } type AGPLPortSharer struct{} @@ -22,4 +23,8 @@ func (AGPLPortSharer) ValidateTemplateMaxPortSharingLevel(_ codersdk.WorkspaceAg return xerrors.New("Restricting port sharing level is an enterprise feature that is not enabled.") } +func (AGPLPortSharer) ConvertMaxPortSharingLevel(_ database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel { + return codersdk.WorkspaceAgentPortShareLevelPublic +} + var DefaultPortSharer PortSharer = AGPLPortSharer{} diff --git a/coderd/templates.go b/coderd/templates.go index 7dc4c2050b189..fb3e8066cd257 100644 --- a/coderd/templates.go +++ b/coderd/templates.go @@ -623,7 +623,7 @@ func (api *API) patchTemplateMeta(rw http.ResponseWriter, r *http.Request) { validErrs = append(validErrs, codersdk.ValidationError{Field: "time_til_dormant_autodelete_ms", Detail: "Value must be at least one minute."}) } maxPortShareLevel := template.MaxPortSharingLevel - if req.MaxPortShareLevel != nil && *req.MaxPortShareLevel != codersdk.WorkspaceAgentPortShareLevel(maxPortShareLevel) { + if req.MaxPortShareLevel != nil && *req.MaxPortShareLevel != portSharer.ConvertMaxPortSharingLevel(template.MaxPortSharingLevel) { err := portSharer.ValidateTemplateMaxPortSharingLevel(*req.MaxPortShareLevel) if err != nil { validErrs = append(validErrs, codersdk.ValidationError{Field: "max_port_sharing_level", Detail: err.Error()}) @@ -857,6 +857,9 @@ func (api *API) convertTemplate( autostopRequirementWeeks = 1 } + portSharer := *(api.PortSharer.Load()) + maxPortShareLevel := portSharer.ConvertMaxPortSharingLevel(template.MaxPortSharingLevel) + return codersdk.Template{ ID: template.ID, CreatedAt: template.CreatedAt, @@ -891,6 +894,6 @@ func (api *API) convertTemplate( RequireActiveVersion: templateAccessControl.RequireActiveVersion, Deprecated: templateAccessControl.IsDeprecated(), DeprecationMessage: templateAccessControl.Deprecated, - MaxPortShareLevel: codersdk.WorkspaceAgentPortShareLevel(template.MaxPortSharingLevel), + MaxPortShareLevel: maxPortShareLevel, } } diff --git a/coderd/templates_test.go b/coderd/templates_test.go index 485b39a31de38..01b3462f603c3 100644 --- a/coderd/templates_test.go +++ b/coderd/templates_test.go @@ -600,9 +600,9 @@ func TestPatchTemplateMeta(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - require.Equal(t, codersdk.WorkspaceAgentPortShareLevelOwner, template.MaxPortShareLevel) + require.Equal(t, codersdk.WorkspaceAgentPortShareLevelPublic, template.MaxPortShareLevel) - var level codersdk.WorkspaceAgentPortShareLevel = codersdk.WorkspaceAgentPortShareLevelPublic + var level codersdk.WorkspaceAgentPortShareLevel = codersdk.WorkspaceAgentPortShareLevelAuthenticated req := codersdk.UpdateTemplateMeta{ MaxPortShareLevel: &level, } @@ -615,7 +615,7 @@ func TestPatchTemplateMeta(t *testing.T) { require.ErrorContains(t, err, "port sharing level is an enterprise feature") // Ensure the same value port share level is a no-op - level = codersdk.WorkspaceAgentPortShareLevelOwner + level = codersdk.WorkspaceAgentPortShareLevelPublic _, err = client.UpdateTemplateMeta(ctx, template.ID, codersdk.UpdateTemplateMeta{ Name: coderdtest.RandomUsername(t), MaxPortShareLevel: &level, diff --git a/enterprise/coderd/portsharing/portsharing.go b/enterprise/coderd/portsharing/portsharing.go index 94ff232927d56..f79ec687baf06 100644 --- a/enterprise/coderd/portsharing/portsharing.go +++ b/enterprise/coderd/portsharing/portsharing.go @@ -38,3 +38,7 @@ func (EnterprisePortSharer) ValidateTemplateMaxPortSharingLevel(level codersdk.W return nil } + +func (EnterprisePortSharer) ConvertMaxPortSharingLevel(level database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel { + return codersdk.WorkspaceAgentPortShareLevel(level) +} From 2f11606752f88028d1558489cb878501dad74950 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Mon, 13 May 2024 17:35:18 +0000 Subject: [PATCH 2/2] rename --- coderd/portsharing/portsharing.go | 12 ++++++------ coderd/templates.go | 6 +++--- coderd/workspaceagentportshare.go | 2 +- enterprise/coderd/portsharing/portsharing.go | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/coderd/portsharing/portsharing.go b/coderd/portsharing/portsharing.go index b6aeb4dd127a4..4696ae63c8b10 100644 --- a/coderd/portsharing/portsharing.go +++ b/coderd/portsharing/portsharing.go @@ -8,22 +8,22 @@ import ( ) type PortSharer interface { - AuthorizedPortSharingLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error - ValidateTemplateMaxPortSharingLevel(level codersdk.WorkspaceAgentPortShareLevel) error - ConvertMaxPortSharingLevel(level database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel + AuthorizedLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error + ValidateTemplateMaxLevel(level codersdk.WorkspaceAgentPortShareLevel) error + ConvertMaxLevel(level database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel } type AGPLPortSharer struct{} -func (AGPLPortSharer) AuthorizedPortSharingLevel(_ database.Template, _ codersdk.WorkspaceAgentPortShareLevel) error { +func (AGPLPortSharer) AuthorizedLevel(_ database.Template, _ codersdk.WorkspaceAgentPortShareLevel) error { return nil } -func (AGPLPortSharer) ValidateTemplateMaxPortSharingLevel(_ codersdk.WorkspaceAgentPortShareLevel) error { +func (AGPLPortSharer) ValidateTemplateMaxLevel(_ codersdk.WorkspaceAgentPortShareLevel) error { return xerrors.New("Restricting port sharing level is an enterprise feature that is not enabled.") } -func (AGPLPortSharer) ConvertMaxPortSharingLevel(_ database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel { +func (AGPLPortSharer) ConvertMaxLevel(_ database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel { return codersdk.WorkspaceAgentPortShareLevelPublic } diff --git a/coderd/templates.go b/coderd/templates.go index fb3e8066cd257..59537b962c21e 100644 --- a/coderd/templates.go +++ b/coderd/templates.go @@ -623,8 +623,8 @@ func (api *API) patchTemplateMeta(rw http.ResponseWriter, r *http.Request) { validErrs = append(validErrs, codersdk.ValidationError{Field: "time_til_dormant_autodelete_ms", Detail: "Value must be at least one minute."}) } maxPortShareLevel := template.MaxPortSharingLevel - if req.MaxPortShareLevel != nil && *req.MaxPortShareLevel != portSharer.ConvertMaxPortSharingLevel(template.MaxPortSharingLevel) { - err := portSharer.ValidateTemplateMaxPortSharingLevel(*req.MaxPortShareLevel) + if req.MaxPortShareLevel != nil && *req.MaxPortShareLevel != portSharer.ConvertMaxLevel(template.MaxPortSharingLevel) { + err := portSharer.ValidateTemplateMaxLevel(*req.MaxPortShareLevel) if err != nil { validErrs = append(validErrs, codersdk.ValidationError{Field: "max_port_sharing_level", Detail: err.Error()}) } else { @@ -858,7 +858,7 @@ func (api *API) convertTemplate( } portSharer := *(api.PortSharer.Load()) - maxPortShareLevel := portSharer.ConvertMaxPortSharingLevel(template.MaxPortSharingLevel) + maxPortShareLevel := portSharer.ConvertMaxLevel(template.MaxPortSharingLevel) return codersdk.Template{ ID: template.ID, diff --git a/coderd/workspaceagentportshare.go b/coderd/workspaceagentportshare.go index 12520548045f1..b29f6baa2737c 100644 --- a/coderd/workspaceagentportshare.go +++ b/coderd/workspaceagentportshare.go @@ -69,7 +69,7 @@ func (api *API) postWorkspaceAgentPortShare(rw http.ResponseWriter, r *http.Requ return } - err = portSharer.AuthorizedPortSharingLevel(template, req.ShareLevel) + err = portSharer.AuthorizedLevel(template, req.ShareLevel) if err != nil { httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ Message: err.Error(), diff --git a/enterprise/coderd/portsharing/portsharing.go b/enterprise/coderd/portsharing/portsharing.go index f79ec687baf06..6d7c138726e11 100644 --- a/enterprise/coderd/portsharing/portsharing.go +++ b/enterprise/coderd/portsharing/portsharing.go @@ -13,7 +13,7 @@ func NewEnterprisePortSharer() *EnterprisePortSharer { return &EnterprisePortSharer{} } -func (EnterprisePortSharer) AuthorizedPortSharingLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error { +func (EnterprisePortSharer) AuthorizedLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error { max := codersdk.WorkspaceAgentPortShareLevel(template.MaxPortSharingLevel) switch level { case codersdk.WorkspaceAgentPortShareLevelPublic: @@ -31,7 +31,7 @@ func (EnterprisePortSharer) AuthorizedPortSharingLevel(template database.Templat return nil } -func (EnterprisePortSharer) ValidateTemplateMaxPortSharingLevel(level codersdk.WorkspaceAgentPortShareLevel) error { +func (EnterprisePortSharer) ValidateTemplateMaxLevel(level codersdk.WorkspaceAgentPortShareLevel) error { if !level.ValidMaxLevel() { return xerrors.New("invalid max port sharing level, value must be 'authenticated' or 'public'.") } @@ -39,6 +39,6 @@ func (EnterprisePortSharer) ValidateTemplateMaxPortSharingLevel(level codersdk.W return nil } -func (EnterprisePortSharer) ConvertMaxPortSharingLevel(level database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel { +func (EnterprisePortSharer) ConvertMaxLevel(level database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel { return codersdk.WorkspaceAgentPortShareLevel(level) }