mirror of
https://github.com/coder/coder.git
synced 2025-07-03 16:13:58 +00:00
fix: properly convert max port share level for oss (#13261)
This commit is contained in:
@ -8,18 +8,23 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type PortSharer interface {
|
type PortSharer interface {
|
||||||
AuthorizedPortSharingLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error
|
AuthorizedLevel(template database.Template, level codersdk.WorkspaceAgentPortShareLevel) error
|
||||||
ValidateTemplateMaxPortSharingLevel(level codersdk.WorkspaceAgentPortShareLevel) error
|
ValidateTemplateMaxLevel(level codersdk.WorkspaceAgentPortShareLevel) error
|
||||||
|
ConvertMaxLevel(level database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel
|
||||||
}
|
}
|
||||||
|
|
||||||
type AGPLPortSharer struct{}
|
type AGPLPortSharer struct{}
|
||||||
|
|
||||||
func (AGPLPortSharer) AuthorizedPortSharingLevel(_ database.Template, _ codersdk.WorkspaceAgentPortShareLevel) error {
|
func (AGPLPortSharer) AuthorizedLevel(_ database.Template, _ codersdk.WorkspaceAgentPortShareLevel) error {
|
||||||
return nil
|
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.")
|
return xerrors.New("Restricting port sharing level is an enterprise feature that is not enabled.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (AGPLPortSharer) ConvertMaxLevel(_ database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel {
|
||||||
|
return codersdk.WorkspaceAgentPortShareLevelPublic
|
||||||
|
}
|
||||||
|
|
||||||
var DefaultPortSharer PortSharer = AGPLPortSharer{}
|
var DefaultPortSharer PortSharer = AGPLPortSharer{}
|
||||||
|
@ -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."})
|
validErrs = append(validErrs, codersdk.ValidationError{Field: "time_til_dormant_autodelete_ms", Detail: "Value must be at least one minute."})
|
||||||
}
|
}
|
||||||
maxPortShareLevel := template.MaxPortSharingLevel
|
maxPortShareLevel := template.MaxPortSharingLevel
|
||||||
if req.MaxPortShareLevel != nil && *req.MaxPortShareLevel != codersdk.WorkspaceAgentPortShareLevel(maxPortShareLevel) {
|
if req.MaxPortShareLevel != nil && *req.MaxPortShareLevel != portSharer.ConvertMaxLevel(template.MaxPortSharingLevel) {
|
||||||
err := portSharer.ValidateTemplateMaxPortSharingLevel(*req.MaxPortShareLevel)
|
err := portSharer.ValidateTemplateMaxLevel(*req.MaxPortShareLevel)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
validErrs = append(validErrs, codersdk.ValidationError{Field: "max_port_sharing_level", Detail: err.Error()})
|
validErrs = append(validErrs, codersdk.ValidationError{Field: "max_port_sharing_level", Detail: err.Error()})
|
||||||
} else {
|
} else {
|
||||||
@ -857,6 +857,9 @@ func (api *API) convertTemplate(
|
|||||||
autostopRequirementWeeks = 1
|
autostopRequirementWeeks = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
portSharer := *(api.PortSharer.Load())
|
||||||
|
maxPortShareLevel := portSharer.ConvertMaxLevel(template.MaxPortSharingLevel)
|
||||||
|
|
||||||
return codersdk.Template{
|
return codersdk.Template{
|
||||||
ID: template.ID,
|
ID: template.ID,
|
||||||
CreatedAt: template.CreatedAt,
|
CreatedAt: template.CreatedAt,
|
||||||
@ -891,6 +894,6 @@ func (api *API) convertTemplate(
|
|||||||
RequireActiveVersion: templateAccessControl.RequireActiveVersion,
|
RequireActiveVersion: templateAccessControl.RequireActiveVersion,
|
||||||
Deprecated: templateAccessControl.IsDeprecated(),
|
Deprecated: templateAccessControl.IsDeprecated(),
|
||||||
DeprecationMessage: templateAccessControl.Deprecated,
|
DeprecationMessage: templateAccessControl.Deprecated,
|
||||||
MaxPortShareLevel: codersdk.WorkspaceAgentPortShareLevel(template.MaxPortSharingLevel),
|
MaxPortShareLevel: maxPortShareLevel,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -600,9 +600,9 @@ func TestPatchTemplateMeta(t *testing.T) {
|
|||||||
user := coderdtest.CreateFirstUser(t, client)
|
user := coderdtest.CreateFirstUser(t, client)
|
||||||
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
|
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
|
||||||
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
|
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{
|
req := codersdk.UpdateTemplateMeta{
|
||||||
MaxPortShareLevel: &level,
|
MaxPortShareLevel: &level,
|
||||||
}
|
}
|
||||||
@ -615,7 +615,7 @@ func TestPatchTemplateMeta(t *testing.T) {
|
|||||||
require.ErrorContains(t, err, "port sharing level is an enterprise feature")
|
require.ErrorContains(t, err, "port sharing level is an enterprise feature")
|
||||||
|
|
||||||
// Ensure the same value port share level is a no-op
|
// 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{
|
_, err = client.UpdateTemplateMeta(ctx, template.ID, codersdk.UpdateTemplateMeta{
|
||||||
Name: coderdtest.RandomUsername(t),
|
Name: coderdtest.RandomUsername(t),
|
||||||
MaxPortShareLevel: &level,
|
MaxPortShareLevel: &level,
|
||||||
|
@ -69,7 +69,7 @@ func (api *API) postWorkspaceAgentPortShare(rw http.ResponseWriter, r *http.Requ
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = portSharer.AuthorizedPortSharingLevel(template, req.ShareLevel)
|
err = portSharer.AuthorizedLevel(template, req.ShareLevel)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
|
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
|
||||||
Message: err.Error(),
|
Message: err.Error(),
|
||||||
|
@ -13,7 +13,7 @@ func NewEnterprisePortSharer() *EnterprisePortSharer {
|
|||||||
return &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)
|
max := codersdk.WorkspaceAgentPortShareLevel(template.MaxPortSharingLevel)
|
||||||
switch level {
|
switch level {
|
||||||
case codersdk.WorkspaceAgentPortShareLevelPublic:
|
case codersdk.WorkspaceAgentPortShareLevelPublic:
|
||||||
@ -31,10 +31,14 @@ func (EnterprisePortSharer) AuthorizedPortSharingLevel(template database.Templat
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (EnterprisePortSharer) ValidateTemplateMaxPortSharingLevel(level codersdk.WorkspaceAgentPortShareLevel) error {
|
func (EnterprisePortSharer) ValidateTemplateMaxLevel(level codersdk.WorkspaceAgentPortShareLevel) error {
|
||||||
if !level.ValidMaxLevel() {
|
if !level.ValidMaxLevel() {
|
||||||
return xerrors.New("invalid max port sharing level, value must be 'authenticated' or 'public'.")
|
return xerrors.New("invalid max port sharing level, value must be 'authenticated' or 'public'.")
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (EnterprisePortSharer) ConvertMaxLevel(level database.AppSharingLevel) codersdk.WorkspaceAgentPortShareLevel {
|
||||||
|
return codersdk.WorkspaceAgentPortShareLevel(level)
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user