Skip to content

Commit da8382d

Browse files
dmartinoldmjbrdimitrov
authored
Default anonymous authentication (#2914)
* add default anonymous auth Signed-off-by: Daniele Martinoli <[email protected]> * lint issues Signed-off-by: Daniele Martinoli <[email protected]> --------- Signed-off-by: Daniele Martinoli <[email protected]> Co-authored-by: Don Browne <[email protected]> Co-authored-by: Radoslav Dimitrov <[email protected]>
1 parent b15418b commit da8382d

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

cmd/thv-operator/pkg/registryapi/config/config.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ type Config struct {
104104
RegistryName string `yaml:"registryName,omitempty"`
105105
Registries []RegistryConfig `yaml:"registries"`
106106
Database *DatabaseConfig `yaml:"database,omitempty"`
107+
Auth *AuthConfig `yaml:"auth,omitempty"`
107108
}
108109

109110
// DatabaseConfig defines PostgreSQL database configuration
@@ -153,6 +154,22 @@ type RegistryConfig struct {
153154
Filter *FilterConfig `yaml:"filter,omitempty"`
154155
}
155156

157+
// AuthMode represents the authentication mode
158+
type AuthMode string
159+
160+
const (
161+
// AuthModeAnonymous allows unauthenticated access
162+
AuthModeAnonymous AuthMode = "anonymous"
163+
)
164+
165+
// AuthConfig defines authentication configuration for the registry server
166+
type AuthConfig struct {
167+
// Mode specifies the authentication mode (anonymous or oauth)
168+
// Defaults to "oauth" if not specified (security-by-default).
169+
// Use "anonymous" to explicitly disable authentication for development.
170+
Mode AuthMode `yaml:"mode,omitempty"`
171+
}
172+
156173
// KubernetesConfig defines a Kubernetes-based registry source where data is discovered
157174
// from MCPServer resources in the cluster. This is the default type for the built-in "default" registry.
158175
type KubernetesConfig struct {
@@ -244,7 +261,12 @@ func (c *Config) ToConfigMapWithContentChecksum(mcpRegistry *mcpv1alpha1.MCPRegi
244261
const DefaultRegistryName = "default"
245262

246263
func (cm *configManager) BuildConfig() (*Config, error) {
247-
config := Config{}
264+
config := Config{
265+
// default to anonymous authentication until we model it consistently in the MCPRegistry CRD
266+
Auth: &AuthConfig{
267+
Mode: AuthModeAnonymous,
268+
},
269+
}
248270

249271
mcpRegistry := cm.mcpRegistry
250272

cmd/thv-operator/pkg/registryapi/config/config_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ func TestBuildConfig_ConfigMapSource(t *testing.T) {
209209
assert.Equal(t, filepath.Join(RegistryJSONFilePath, "configmap-registry", RegistryJSONFileName), config.Registries[1].File.Path)
210210
require.NotNil(t, config.Registries[1].SyncPolicy)
211211
assert.Equal(t, "1h", config.Registries[1].SyncPolicy.Interval)
212+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
212213
})
213214

214215
}
@@ -370,6 +371,7 @@ func TestBuildConfig_GitSource(t *testing.T) {
370371
assert.Empty(t, config.Registries[1].Git.Commit)
371372
require.NotNil(t, config.Registries[1].SyncPolicy)
372373
assert.Equal(t, "1h", config.Registries[1].SyncPolicy.Interval)
374+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
373375
})
374376

375377
t.Run("valid git source with tag", func(t *testing.T) {
@@ -417,6 +419,7 @@ func TestBuildConfig_GitSource(t *testing.T) {
417419
assert.Empty(t, config.Registries[1].Git.Commit)
418420
require.NotNil(t, config.Registries[1].SyncPolicy)
419421
assert.Equal(t, "1h", config.Registries[1].SyncPolicy.Interval)
422+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
420423
})
421424

422425
t.Run("valid git source with commit", func(t *testing.T) {
@@ -464,6 +467,7 @@ func TestBuildConfig_GitSource(t *testing.T) {
464467
assert.Equal(t, "abc123def456", config.Registries[1].Git.Commit)
465468
require.NotNil(t, config.Registries[1].SyncPolicy)
466469
assert.Equal(t, "1h", config.Registries[1].SyncPolicy.Interval)
470+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
467471
})
468472
}
469473

@@ -566,6 +570,7 @@ func TestBuildConfig_APISource(t *testing.T) {
566570
assert.Nil(t, config.Registries[1].Git)
567571
require.NotNil(t, config.Registries[1].SyncPolicy)
568572
assert.Equal(t, "1h", config.Registries[1].SyncPolicy.Interval)
573+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
569574
})
570575
}
571576

@@ -610,6 +615,7 @@ func TestBuildConfig_SyncPolicy(t *testing.T) {
610615
require.NotNil(t, config.Registries[0].Kubernetes)
611616
// Second registry should be the user-specified one
612617
assert.Nil(t, config.Registries[1].SyncPolicy)
618+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
613619
})
614620

615621
t.Run("empty interval", func(t *testing.T) {
@@ -684,6 +690,7 @@ func TestBuildConfig_SyncPolicy(t *testing.T) {
684690
// Second registry should be the user-specified one
685691
require.NotNil(t, config.Registries[1].SyncPolicy)
686692
assert.Equal(t, "30m", config.Registries[1].SyncPolicy.Interval)
693+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
687694
})
688695
}
689696

@@ -731,6 +738,7 @@ func TestBuildConfig_Filter(t *testing.T) {
731738
require.NotNil(t, config.Registries[0].Kubernetes)
732739
// Filter should be nil when not provided for the user-specified registry
733740
assert.Nil(t, config.Registries[1].Filter)
741+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
734742
})
735743

736744
t.Run("filter with name filters", func(t *testing.T) {
@@ -781,6 +789,7 @@ func TestBuildConfig_Filter(t *testing.T) {
781789
assert.Equal(t, []string{"*-deprecated", "*-test"}, config.Registries[1].Filter.Names.Exclude)
782790
// Tags should be nil when not provided
783791
assert.Nil(t, config.Registries[1].Filter.Tags)
792+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
784793
})
785794

786795
t.Run("filter with tags", func(t *testing.T) {
@@ -830,6 +839,7 @@ func TestBuildConfig_Filter(t *testing.T) {
830839
assert.Equal(t, []string{"beta", "alpha", "experimental"}, config.Registries[1].Filter.Tags.Exclude)
831840
// Names should be nil when not provided
832841
assert.Nil(t, config.Registries[1].Filter.Names)
842+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
833843
})
834844

835845
t.Run("filter with both name filters and tags", func(t *testing.T) {
@@ -883,6 +893,7 @@ func TestBuildConfig_Filter(t *testing.T) {
883893
require.NotNil(t, config.Registries[1].Filter.Tags)
884894
assert.Equal(t, []string{"latest", "stable"}, config.Registries[1].Filter.Tags.Include)
885895
assert.Equal(t, []string{"dev", "test"}, config.Registries[1].Filter.Tags.Exclude)
896+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
886897
})
887898

888899
t.Run("filter with empty include and exclude lists", func(t *testing.T) {
@@ -939,6 +950,7 @@ func TestBuildConfig_Filter(t *testing.T) {
939950
require.NotNil(t, config.Registries[1].Filter.Tags)
940951
assert.Empty(t, config.Registries[1].Filter.Tags.Include)
941952
assert.Empty(t, config.Registries[1].Filter.Tags.Exclude)
953+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
942954
})
943955
}
944956

@@ -1097,6 +1109,7 @@ func TestBuildConfig_MultipleRegistries(t *testing.T) {
10971109
require.NotNil(t, config.Registries[2].Filter)
10981110
require.NotNil(t, config.Registries[2].Filter.Names)
10991111
assert.Equal(t, []string{"server-*"}, config.Registries[2].Filter.Names.Include)
1112+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
11001113
}
11011114

11021115
func TestBuildConfig_PVCSource(t *testing.T) {
@@ -1141,6 +1154,7 @@ func TestBuildConfig_PVCSource(t *testing.T) {
11411154
require.NotNil(t, config.Registries[1].File)
11421155
// Path: /config/registry/{registryName}/{pvcRef.path}
11431156
assert.Equal(t, filepath.Join(RegistryJSONFilePath, "pvc-registry", RegistryJSONFileName), config.Registries[1].File.Path)
1157+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
11441158
})
11451159

11461160
t.Run("valid pvc source with subdirectory path", func(t *testing.T) {
@@ -1181,6 +1195,7 @@ func TestBuildConfig_PVCSource(t *testing.T) {
11811195
require.NotNil(t, config.Registries[1].File)
11821196
// Path: /config/registry/{registryName}/{pvcRef.path}
11831197
assert.Equal(t, filepath.Join(RegistryJSONFilePath, "production-registry", "production/v1/servers.json"), config.Registries[1].File.Path)
1198+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
11841199
})
11851200

11861201
t.Run("valid pvc source with filter", func(t *testing.T) {
@@ -1233,6 +1248,7 @@ func TestBuildConfig_PVCSource(t *testing.T) {
12331248
assert.Equal(t, []string{"prod-*"}, config.Registries[1].Filter.Names.Include)
12341249
require.NotNil(t, config.Registries[1].Filter.Tags)
12351250
assert.Equal(t, []string{"production"}, config.Registries[1].Filter.Tags.Include)
1251+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
12361252
})
12371253
}
12381254
func TestBuildConfig_DatabaseConfig(t *testing.T) {
@@ -1278,6 +1294,7 @@ func TestBuildConfig_DatabaseConfig(t *testing.T) {
12781294
assert.Equal(t, 10, config.Database.MaxOpenConns)
12791295
assert.Equal(t, 2, config.Database.MaxIdleConns)
12801296
assert.Equal(t, "30m", config.Database.ConnMaxLifetime)
1297+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
12811298
})
12821299

12831300
t.Run("custom database config", func(t *testing.T) {
@@ -1330,6 +1347,7 @@ func TestBuildConfig_DatabaseConfig(t *testing.T) {
13301347
assert.Equal(t, 25, config.Database.MaxOpenConns)
13311348
assert.Equal(t, 5, config.Database.MaxIdleConns)
13321349
assert.Equal(t, "1h", config.Database.ConnMaxLifetime)
1350+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
13331351
})
13341352

13351353
t.Run("partial database config uses defaults for missing fields", func(t *testing.T) {
@@ -1378,5 +1396,6 @@ func TestBuildConfig_DatabaseConfig(t *testing.T) {
13781396
assert.Equal(t, 10, config.Database.MaxOpenConns)
13791397
assert.Equal(t, 2, config.Database.MaxIdleConns)
13801398
assert.Equal(t, "30m", config.Database.ConnMaxLifetime)
1399+
assert.Equal(t, AuthModeAnonymous, config.Auth.Mode)
13811400
})
13821401
}

0 commit comments

Comments
 (0)