Skip to content

Commit 762d70b

Browse files
committed
More tidy up
1 parent a9efa0e commit 762d70b

File tree

13 files changed

+329
-48
lines changed

13 files changed

+329
-48
lines changed

.env.example

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ MCP_REGISTRY_GITHUB_CLIENT_ID=
2020
MCP_REGISTRY_GITHUB_CLIENT_SECRET=
2121

2222
# JWT configuration
23-
# Generate a new one with `openssl genpkey -algorithm ed25519 -outform DER | base64`
24-
MCP_REGISTRY_JWT_PRIVATE_KEY=MC4CAQAwBQYDK2VwBCIEIB1zHHzAdAYVRALr7+h51TSc4TbUKUbLlQimx7/DAXwC
23+
# This should be a 32-byte Ed25519 seed (not the full private key). Generate a new seed with: `openssl rand -hex 32`
24+
MCP_REGISTRY_JWT_PRIVATE_KEY=bb2c6b424005acd5df47a9e2c87f446def86dd740c888ea3efb825b23f7ef47c
2525

2626
# Anonymous authentication (for development/testing only)
2727
# When enabled, allows anyone to get tokens for publishing to io.modelcontextprotocol.anonymous/* namespace

deploy/Pulumi.gcpProd.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ config:
88
gcp:credentials:
99
secure: v1:hyZWlpeMTFDnMcz2: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
1010
mcp-registry:jwtPrivateKey:
11-
secure: v1:8ZgQPYz2hzF5PZTa:KoC0B8j8zOM6gZt8aMN2ejZi+Ps97OIWYLBCWj/xsc0lK+/F2vXqAtW8W5QMPeeF/jJFYlqqcqIhrmGGqYPDsjgxC0g6UcKlgwv+FDJWLKI=
11+
secure: v1:0QwJl5e504ECQfjb:j8b4v1KxxqS8g9E8JTL0Wq5EEDbk/xPUglyg4/hyuL8go+pH2EE6skjf+7D5aAsld1SDRGlhXQBOZIVnjLBffsVN7cBhVlKy2qwTCC6QH5Q=
1212
encryptionsalt: v1:0funtAX4m9k=:v1:yMCnBXyBO+q4+/yy:AqWJTzwwIWXmUK0JGCzqbeg0RUr8Jw==

deploy/Pulumi.gcpStaging.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ config:
88
gcp:credentials:
99
secure: v1:RaHpGsBp37XO/EhJ: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
1010
mcp-registry:jwtPrivateKey:
11-
secure: v1:pmZEcK2SDj9VqTu5:3dWC6hv5hBjsxwlLG8b4PX1s8VGjyPOPQLsloi5EE2xcnk5V8LG5XdP7go6qz4kI2ZTHzdZbiZ2MsLpE736iLL/Yfx5+pftXnsCMmwwWMzw=
11+
secure: v1:0NSeI0qWrdcHeVfh:P56IEP/700/e839TSbF7Ns2j2orZnD5cRNXohjxCPOKyIDYn+0bmiTuk8pyFnFk8WibS/w7M2FFgv3/BL0Djo0XMVe9tq+7HjLN4tPEJnCU=
1212
encryptionsalt: v1:EKBwmTmss1c=:v1:JLd4a7cM0X8Jroh+:z9/q6RSCEFTDzMV6X6h5Tpbw0tnpkA==

deploy/pkg/k8s/registry.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515
func DeployMCPRegistry(ctx *pulumi.Context, cluster *providers.ProviderInfo, environment string) (*corev1.Service, error) {
1616
conf := config.New(ctx, "mcp-registry")
1717
githubClientId := conf.Require("githubClientId")
18-
githubClientSecret := conf.RequireSecret("githubClientSecret")
1918

2019
// Create Secret with sensitive configuration
2120
secret, err := corev1.NewSecret(ctx, "mcp-registry-secrets", &corev1.SecretArgs{
@@ -28,7 +27,8 @@ func DeployMCPRegistry(ctx *pulumi.Context, cluster *providers.ProviderInfo, env
2827
},
2928
},
3029
StringData: pulumi.StringMap{
31-
"GITHUB_CLIENT_SECRET": githubClientSecret,
30+
"GITHUB_CLIENT_SECRET": conf.RequireSecret("githubClientSecret"),
31+
"JWT_PRIVATE_KEY": conf.RequireSecret("jwtPrivateKey"),
3232
},
3333
Type: pulumi.String("Opaque"),
3434
}, pulumi.Provider(cluster.Provider))

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ services:
1111
- MCP_REGISTRY_ENVIRONMENT=${MCP_REGISTRY_ENVIRONMENT:-test}
1212
- MCP_REGISTRY_GITHUB_CLIENT_ID=${MCP_REGISTRY_GITHUB_CLIENT_ID}
1313
- MCP_REGISTRY_GITHUB_CLIENT_SECRET=${MCP_REGISTRY_GITHUB_CLIENT_SECRET}
14-
- MCP_REGISTRY_JWT_PRIVATE_KEY=${MCP_REGISTRY_JWT_PRIVATE_KEY:-MC4CAQAwBQYDK2VwBCIEIGJLIdRcjWPXYB7lOkKGaDAi/XhHiXSni/bjJoQB7X8V}
14+
- MCP_REGISTRY_JWT_PRIVATE_KEY=${MCP_REGISTRY_JWT_PRIVATE_KEY:-8103179d8ef955f6d3de6d6217224a909ec4060529dfeb1d4ca5a994537658cd}
1515
- MCP_REGISTRY_ENABLE_ANONYMOUS_AUTH=${MCP_REGISTRY_ENABLE_ANONYMOUS_AUTH:-true}
1616
ports:
1717
- 8080:8080

internal/api/handlers/v0/auth/github_test.go

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package auth_test
33
import (
44
"context"
55
"crypto/ed25519"
6+
"crypto/rand"
7+
"encoding/hex"
68
"encoding/json"
79
"fmt"
810
"net/http"
@@ -26,11 +28,12 @@ const (
2628

2729
func TestGitHubHandler_ExchangeToken(t *testing.T) {
2830
// Create test handler with mock config
29-
_, testPrivateKey, err := ed25519.GenerateKey(nil)
31+
testSeed := make([]byte, ed25519.SeedSize)
32+
_, err := rand.Read(testSeed)
3033
require.NoError(t, err)
3134

3235
cfg := &config.Config{
33-
JWTPrivateKey: string(testPrivateKey),
36+
JWTPrivateKey: hex.EncodeToString(testSeed),
3437
}
3538

3639
t.Run("successful token exchange with user only", func(t *testing.T) {
@@ -316,11 +319,12 @@ func TestGitHubHandler_ExchangeToken(t *testing.T) {
316319
}
317320

318321
func TestJWTTokenValidation(t *testing.T) {
319-
_, testPrivateKey, err := ed25519.GenerateKey(nil)
322+
testSeed := make([]byte, ed25519.SeedSize)
323+
_, err := rand.Read(testSeed)
320324
require.NoError(t, err)
321325

322326
cfg := &config.Config{
323-
JWTPrivateKey: string(testPrivateKey),
327+
JWTPrivateKey: hex.EncodeToString(testSeed),
324328
}
325329

326330
jwtManager := auth.NewJWTManager(cfg)
@@ -395,11 +399,12 @@ func TestJWTTokenValidation(t *testing.T) {
395399
}
396400

397401
func TestPermissionResourceMatching(t *testing.T) {
398-
_, testPrivateKey, err := ed25519.GenerateKey(nil)
402+
testSeed := make([]byte, ed25519.SeedSize)
403+
_, err := rand.Read(testSeed)
399404
require.NoError(t, err)
400405

401406
cfg := &config.Config{
402-
JWTPrivateKey: string(testPrivateKey),
407+
JWTPrivateKey: hex.EncodeToString(testSeed),
403408
}
404409

405410
jwtManager := auth.NewJWTManager(cfg)
@@ -465,11 +470,12 @@ func TestPermissionResourceMatching(t *testing.T) {
465470

466471
func TestValidGitHubNames(t *testing.T) {
467472
// Create a minimal handler to test name validation
468-
_, testPrivateKey, err := ed25519.GenerateKey(nil)
473+
testSeed := make([]byte, ed25519.SeedSize)
474+
_, err := rand.Read(testSeed)
469475
require.NoError(t, err)
470476

471477
cfg := &config.Config{
472-
JWTPrivateKey: string(testPrivateKey),
478+
JWTPrivateKey: hex.EncodeToString(testSeed),
473479
}
474480

475481
validNameTests := []struct {
@@ -558,11 +564,12 @@ func TestValidGitHubNames(t *testing.T) {
558564
}
559565

560566
func TestGitHubHandler_Creation(t *testing.T) {
561-
_, testPrivateKey, err := ed25519.GenerateKey(nil)
567+
testSeed := make([]byte, ed25519.SeedSize)
568+
_, err := rand.Read(testSeed)
562569
require.NoError(t, err)
563570

564571
cfg := &config.Config{
565-
JWTPrivateKey: string(testPrivateKey),
572+
JWTPrivateKey: hex.EncodeToString(testSeed),
566573
}
567574

568575
handler := v0auth.NewGitHubHandler(cfg)
@@ -571,11 +578,12 @@ func TestGitHubHandler_Creation(t *testing.T) {
571578

572579
func TestConcurrentTokenExchange(t *testing.T) {
573580
// Test that the handler is thread-safe
574-
_, testPrivateKey, err := ed25519.GenerateKey(nil)
581+
testSeed := make([]byte, ed25519.SeedSize)
582+
_, err := rand.Read(testSeed)
575583
require.NoError(t, err)
576584

577585
cfg := &config.Config{
578-
JWTPrivateKey: string(testPrivateKey),
586+
JWTPrivateKey: hex.EncodeToString(testSeed),
579587
}
580588

581589
// Create mock GitHub API server

internal/api/handlers/v0/auth/none_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package auth_test
33
import (
44
"context"
55
"crypto/ed25519"
6+
"crypto/rand"
7+
"encoding/hex"
68
"testing"
79

810
v0auth "github.com/modelcontextprotocol/registry/internal/api/handlers/v0/auth"
@@ -14,12 +16,13 @@ import (
1416
)
1517

1618
func TestNoneHandler_GetAnonymousToken(t *testing.T) {
17-
// Generate a proper Ed25519 key pair for testing
18-
_, testPrivateKey, err := ed25519.GenerateKey(nil)
19+
// Generate a proper Ed25519 seed for testing
20+
testSeed := make([]byte, ed25519.SeedSize)
21+
_, err := rand.Read(testSeed)
1922
require.NoError(t, err)
2023

2124
cfg := &config.Config{
22-
JWTPrivateKey: string(testPrivateKey),
25+
JWTPrivateKey: hex.EncodeToString(testSeed),
2326
EnableAnonymousAuth: true,
2427
}
2528

internal/api/handlers/v0/publish_integration_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"bytes"
55
"context"
66
"crypto/ed25519"
7+
"crypto/rand"
8+
"encoding/hex"
79
"encoding/json"
810
"net/http"
911
"net/http/httptest"
@@ -35,10 +37,11 @@ func TestPublishIntegration(t *testing.T) {
3537
// Setup fake service
3638
registryService := service.NewFakeRegistryService()
3739

38-
// Create test config with a valid Ed25519 private key
39-
_, testPrivateKey, _ := ed25519.GenerateKey(nil)
40+
// Create test config with a valid Ed25519 seed
41+
testSeed := make([]byte, ed25519.SeedSize)
42+
rand.Read(testSeed)
4043
testConfig := &config.Config{
41-
JWTPrivateKey: string(testPrivateKey),
44+
JWTPrivateKey: hex.EncodeToString(testSeed),
4245
}
4346

4447
// Create a new ServeMux and Huma API

internal/api/handlers/v0/publish_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"bytes"
55
"context"
66
"crypto/ed25519"
7+
"crypto/rand"
8+
"encoding/hex"
79
"encoding/json"
810
"errors"
911
"net/http"
@@ -55,9 +57,10 @@ func generateTestJWTToken(cfg *config.Config, claims auth.JWTClaims) (string, er
5557
}
5658

5759
func TestPublishEndpoint(t *testing.T) {
58-
_, testPrivateKey, _ := ed25519.GenerateKey(nil)
60+
testSeed := make([]byte, ed25519.SeedSize)
61+
rand.Read(testSeed)
5962
testConfig := &config.Config{
60-
JWTPrivateKey: string(testPrivateKey),
63+
JWTPrivateKey: hex.EncodeToString(testSeed),
6164
}
6265

6366
testCases := []struct {

internal/auth/jwt.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package auth
33
import (
44
"context"
55
"crypto/ed25519"
6+
"encoding/hex"
67
"fmt"
78
"strings"
89
"time"
@@ -48,13 +49,18 @@ type JWTManager struct {
4849
}
4950

5051
func NewJWTManager(cfg *config.Config) *JWTManager {
51-
// Require a valid Ed25519 private key (64 bytes)
52-
if len(cfg.JWTPrivateKey) != ed25519.PrivateKeySize {
53-
panic(fmt.Sprintf("JWTPrivateKey must be exactly %d bytes for Ed25519, got %d bytes", ed25519.PrivateKeySize, len(cfg.JWTPrivateKey)))
52+
seed, err := hex.DecodeString(cfg.JWTPrivateKey)
53+
if err != nil {
54+
panic(fmt.Sprintf("JWTPrivateKey must be a valid hex-encoded string: %v", err))
55+
}
56+
57+
// Require a valid Ed25519 seed (32 bytes)
58+
if len(seed) != ed25519.SeedSize {
59+
panic(fmt.Sprintf("JWTPrivateKey seed must be exactly %d bytes for Ed25519, got %d bytes", ed25519.SeedSize, len(seed)))
5460
}
5561

56-
// Use the raw bytes directly as the Ed25519 private key
57-
privateKey := ed25519.PrivateKey([]byte(cfg.JWTPrivateKey))
62+
// Generate the full Ed25519 key pair from the seed
63+
privateKey := ed25519.NewKeyFromSeed(seed)
5864
publicKey := privateKey.Public().(ed25519.PublicKey)
5965

6066
return &JWTManager{

0 commit comments

Comments
 (0)