From 5f6db106ca8eaf0e797df27ee00a07b17ef2f8b4 Mon Sep 17 00:00:00 2001 From: mrjvs Date: Fri, 31 Jul 2026 21:51:08 +0200 Subject: [PATCH 1/5] Add GRPC server to SMM --- README.md | 2 ++ globals/globals.go | 2 ++ grpc/api_key_interceptor.go | 26 ++++++++++++++++++++++++++ grpc/grpc_server.go | 34 ++++++++++++++++++++++++++++++++++ init.go | 17 +++++++++++++++++ main.go | 3 ++- 6 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 grpc/api_key_interceptor.go create mode 100644 grpc/grpc_server.go diff --git a/README.md b/README.md index 2627b6b..656bb57 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,8 @@ All configuration options are handled via environment variables | `PN_SMM_CONFIG_S3_ACCESS_SECRET` | S3 secret | Yes | | `PN_SMM_CONFIG_S3_BUCKET` | S3 bucket | Yes | | `PN_SMM_CONFIG_S3_KEY_BASE` | S3 Key prefix | Yes | +| `PN_SMM_GRPC_SERVER_PORT` | Port for the GRPC server | Yes | +| `PN_SMM_GRPC_API_KEY` | API key for your GRPC server | No (Assumed to be an open gRPC API) | | `PN_SMM_ACCOUNT_GRPC_HOST` | Host name for your account server gRPC service | Yes | | `PN_SMM_ACCOUNT_GRPC_PORT` | Port for your account server gRPC service | Yes | | `PN_SMM_ACCOUNT_GRPC_API_KEY` | API key for your account server gRPC service | No (Assumed to be an open gRPC API) | diff --git a/globals/globals.go b/globals/globals.go index 82152f0..ca30856 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -22,3 +22,5 @@ var GRPCAccountClient pb.AccountClient var GRPCAccountCommonMetadata metadata.MD var MinIOClient *minio.Client var Presigner *S3Presigner +var GRPCAPIKey string +var GRPCServerPort int diff --git a/grpc/api_key_interceptor.go b/grpc/api_key_interceptor.go new file mode 100644 index 0000000..961a95a --- /dev/null +++ b/grpc/api_key_interceptor.go @@ -0,0 +1,26 @@ +package grpc + +import ( + "context" + "errors" + + "github.com/PretendoNetwork/super-mario-maker/globals" + "google.golang.org/grpc" + "google.golang.org/grpc/metadata" +) + +func apiKeyInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + md, ok := metadata.FromIncomingContext(ctx) + + if ok { + apiKeyHeader := md.Get("X-API-Key") + + if len(apiKeyHeader) == 0 || apiKeyHeader[0] != globals.GRPCAPIKey { + return nil, errors.New("Missing or invalid API key") + } + } + + h, err := handler(ctx, req) + + return h, err +} diff --git a/grpc/grpc_server.go b/grpc/grpc_server.go new file mode 100644 index 0000000..c4a8ec4 --- /dev/null +++ b/grpc/grpc_server.go @@ -0,0 +1,34 @@ +package grpc + +import ( + "fmt" + "log" + "net" + + pb "github.com/PretendoNetwork/grpc/go/smm" + "github.com/PretendoNetwork/super-mario-maker/globals" + "google.golang.org/grpc" +) + +type gRPCSMMServer struct { + pb.UnimplementedSMMServer +} + +func StartGRPCServer() { + listener, err := net.Listen("tcp", fmt.Sprintf(":%d", globals.GRPCServerPort)) + if err != nil { + log.Fatalf("failed to listen: %v", err) + } + + server := grpc.NewServer( + grpc.UnaryInterceptor(apiKeyInterceptor), + ) + + pb.RegisterSMMServer(server, &gRPCSMMServer{}) + + log.Printf("server listening at %v", listener.Addr()) + + if err := server.Serve(listener); err != nil { + log.Fatalf("failed to serve: %v", err) + } +} diff --git a/init.go b/init.go index ec2cad6..6fa1484 100644 --- a/init.go +++ b/init.go @@ -41,6 +41,8 @@ func init() { authenticationServerPort := os.Getenv("PN_SMM_AUTHENTICATION_SERVER_PORT") secureServerHost := os.Getenv("PN_SMM_SECURE_SERVER_HOST") secureServerPort := os.Getenv("PN_SMM_SECURE_SERVER_PORT") + gRPCServerPort := os.Getenv("PN_SMM_GRPC_SERVER_PORT") + gRPCAPIKey := os.Getenv("PN_SMM_GRPC_API_KEY") accountGRPCHost := os.Getenv("PN_SMM_ACCOUNT_GRPC_HOST") accountGRPCPort := os.Getenv("PN_SMM_ACCOUNT_GRPC_PORT") accountGRPCAPIKey := os.Getenv("PN_SMM_ACCOUNT_GRPC_API_KEY") @@ -93,6 +95,21 @@ func init() { os.Exit(0) } + gRPCPort, err := strconv.Atoi(gRPCServerPort) + if err != nil { + globals.Logger.Errorf("PN_SMM_GRPC_SERVER_PORT is not a valid port. Expected 0-65535, got %s", gRPCServerPort) + os.Exit(0) + } else if gRPCPort < 0 || gRPCPort > 65535 { + globals.Logger.Errorf("PN_SMM_GRPC_SERVER_PORT is not a valid port. Expected 0-65535, got %s", gRPCServerPort) + os.Exit(0) + } + globals.GRPCServerPort = gRPCPort; + + if strings.TrimSpace(gRPCAPIKey) == "" { + globals.Logger.Warning("Insecure gRPC server detected. PN_SMM_GRPC_API_KEY environment variable not set") + } + globals.GRPCAPIKey = gRPCAPIKey; + if strings.TrimSpace(accountGRPCHost) == "" { globals.Logger.Error("PN_SMM_ACCOUNT_GRPC_HOST environment variable not set") os.Exit(0) diff --git a/main.go b/main.go index 65258a4..edfa006 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "sync" + "github.com/PretendoNetwork/super-mario-maker/grpc" "github.com/PretendoNetwork/super-mario-maker/nex" ) @@ -11,7 +12,7 @@ var wg sync.WaitGroup func main() { wg.Add(2) - // TODO - Add gRPC server + go grpc.StartGRPCServer() go nex.StartAuthenticationServer() go nex.StartSecureServer() From a0d765c87e7aa6a9c8c9e88ad2f18edc50d91f21 Mon Sep 17 00:00:00 2001 From: mrjvs Date: Fri, 31 Jul 2026 21:51:25 +0200 Subject: [PATCH 2/5] feat: implement DeleteCourse into GRPC server --- grpc/delete_course.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 grpc/delete_course.go diff --git a/grpc/delete_course.go b/grpc/delete_course.go new file mode 100644 index 0000000..556a303 --- /dev/null +++ b/grpc/delete_course.go @@ -0,0 +1,42 @@ +package grpc + +import ( + "context" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + pb "github.com/PretendoNetwork/grpc/go/smm" + datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore" + "github.com/PretendoNetwork/super-mario-maker/globals" +) + +func (s *gRPCSMMServer) DeleteCourse(ctx context.Context, in *pb.DeleteCourseRequest) (*pb.DeleteCourseResponse, error) { + err := datastore_db.IsObjectAvailable(in.DataID) + if err != nil { + return &pb.DeleteCourseResponse{ + Success: false, + }, status.Errorf(codes.NotFound, "Course not found") + } + + metaInfo, err := datastore_db.GetObjectInfoByDataID(in.DataID) + if err != nil { + globals.Logger.Critical(err.Error()) + return &pb.DeleteCourseResponse{ + Success: false, + }, status.Errorf(codes.Internal, "internal server error") + } + + err = datastore_db.DeleteObjectByDataID(in.DataID) + if err != nil { + globals.Logger.Critical(err.Error()) + return &pb.DeleteCourseResponse{ + Success: false, + }, status.Errorf(codes.Internal, "internal server error") + } + + return &pb.SendUserFriendRequestResponse{ + CourseName: metaInfo.Name, + Success: true, + }, nil +} From d0b3cbdeda0b0e9dfbfb4f33cfea62c4a0a4f6d6 Mon Sep 17 00:00:00 2001 From: mrjvs Date: Sat, 1 Aug 2026 15:23:50 +0200 Subject: [PATCH 3/5] feat: Update GRPC package --- go.mod | 2 +- go.sum | 2 ++ grpc/delete_course.go | 14 ++++++++------ grpc/grpc_server.go | 6 +++--- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 51a7e74..cff55df 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.0 toolchain go1.23.5 require ( - github.com/PretendoNetwork/grpc/go v0.0.0-20250123103241-5fb484bf544d + github.com/PretendoNetwork/grpc/go v0.0.0-20260801122926-a632ab44588d github.com/PretendoNetwork/nex-go/v2 v2.1.2 github.com/PretendoNetwork/nex-protocols-common-go/v2 v2.2.2 github.com/PretendoNetwork/nex-protocols-go/v2 v2.2.1 diff --git a/go.sum b/go.sum index dde920c..01eb7ae 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/PretendoNetwork/grpc/go v0.0.0-20250123103241-5fb484bf544d h1:i/XyhbTm/j8UfCSnA0Cwrvc0mWOPIftOVrfSYqbh8Xo= github.com/PretendoNetwork/grpc/go v0.0.0-20250123103241-5fb484bf544d/go.mod h1:L6We4KkcQeiQVPrF7iu8Zax0B1Bm0v4nssR1JOAiRFQ= +github.com/PretendoNetwork/grpc/go v0.0.0-20260801122926-a632ab44588d h1:9tMOif1DXaDNZ3auC+DkTd8+PpX7j3xvH1w2jzdR7w0= +github.com/PretendoNetwork/grpc/go v0.0.0-20260801122926-a632ab44588d/go.mod h1:L6We4KkcQeiQVPrF7iu8Zax0B1Bm0v4nssR1JOAiRFQ= github.com/PretendoNetwork/nex-go/v2 v2.1.2 h1:OJFAS6U6VNzZ4YzteKqUEZ5aJMwWIHODeRrLwNbN7nw= github.com/PretendoNetwork/nex-go/v2 v2.1.2/go.mod h1:3LyJzsv3AataJW8D0binp15Q8ZH22MWTYly1VNtXi64= github.com/PretendoNetwork/nex-protocols-common-go/v2 v2.2.2 h1:rBJNZDJ92pa9fU3Og0sanyizJTWnELPoGR0Tjz8zlws= diff --git a/grpc/delete_course.go b/grpc/delete_course.go index 556a303..86d051a 100644 --- a/grpc/delete_course.go +++ b/grpc/delete_course.go @@ -6,20 +6,22 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - pb "github.com/PretendoNetwork/grpc/go/smm" + pb "github.com/PretendoNetwork/grpc/go/smm/v1" + "github.com/PretendoNetwork/nex-go/v2/types" datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore" "github.com/PretendoNetwork/super-mario-maker/globals" ) func (s *gRPCSMMServer) DeleteCourse(ctx context.Context, in *pb.DeleteCourseRequest) (*pb.DeleteCourseResponse, error) { - err := datastore_db.IsObjectAvailable(in.DataID) + dataID := types.NewUInt64(in.DataId) + err := datastore_db.IsObjectAvailable(dataID) if err != nil { return &pb.DeleteCourseResponse{ Success: false, }, status.Errorf(codes.NotFound, "Course not found") } - metaInfo, err := datastore_db.GetObjectInfoByDataID(in.DataID) + metaInfo, err := datastore_db.GetObjectInfoByDataID(dataID) if err != nil { globals.Logger.Critical(err.Error()) return &pb.DeleteCourseResponse{ @@ -27,7 +29,7 @@ func (s *gRPCSMMServer) DeleteCourse(ctx context.Context, in *pb.DeleteCourseReq }, status.Errorf(codes.Internal, "internal server error") } - err = datastore_db.DeleteObjectByDataID(in.DataID) + err = datastore_db.DeleteObjectByDataID(dataID) if err != nil { globals.Logger.Critical(err.Error()) return &pb.DeleteCourseResponse{ @@ -35,8 +37,8 @@ func (s *gRPCSMMServer) DeleteCourse(ctx context.Context, in *pb.DeleteCourseReq }, status.Errorf(codes.Internal, "internal server error") } - return &pb.SendUserFriendRequestResponse{ - CourseName: metaInfo.Name, + return &pb.DeleteCourseResponse{ + CourseName: string(metaInfo.Name), Success: true, }, nil } diff --git a/grpc/grpc_server.go b/grpc/grpc_server.go index c4a8ec4..3ff55a7 100644 --- a/grpc/grpc_server.go +++ b/grpc/grpc_server.go @@ -5,13 +5,13 @@ import ( "log" "net" - pb "github.com/PretendoNetwork/grpc/go/smm" + pb "github.com/PretendoNetwork/grpc/go/smm/v1" "github.com/PretendoNetwork/super-mario-maker/globals" "google.golang.org/grpc" ) type gRPCSMMServer struct { - pb.UnimplementedSMMServer + pb.UnimplementedSMMServiceServer } func StartGRPCServer() { @@ -24,7 +24,7 @@ func StartGRPCServer() { grpc.UnaryInterceptor(apiKeyInterceptor), ) - pb.RegisterSMMServer(server, &gRPCSMMServer{}) + pb.RegisterSMMServiceServer(server, &gRPCSMMServer{}) log.Printf("server listening at %v", listener.Addr()) From d009ef06a5dbc1ff5521a7d8cfab403dab28dec0 Mon Sep 17 00:00:00 2001 From: mrjvs Date: Sun, 2 Aug 2026 16:00:02 +0200 Subject: [PATCH 4/5] fix: run go fmt --- grpc/delete_course.go | 2 +- init.go | 334 +++++++++++++++++++++--------------------- 2 files changed, 168 insertions(+), 168 deletions(-) diff --git a/grpc/delete_course.go b/grpc/delete_course.go index 86d051a..7cfb74a 100644 --- a/grpc/delete_course.go +++ b/grpc/delete_course.go @@ -39,6 +39,6 @@ func (s *gRPCSMMServer) DeleteCourse(ctx context.Context, in *pb.DeleteCourseReq return &pb.DeleteCourseResponse{ CourseName: string(metaInfo.Name), - Success: true, + Success: true, }, nil } diff --git a/init.go b/init.go index 6fa1484..86bb443 100644 --- a/init.go +++ b/init.go @@ -1,167 +1,167 @@ -package main - -import ( - "crypto/rand" - "fmt" - "os" - "strconv" - "strings" - - pb "github.com/PretendoNetwork/grpc/go/account" - "github.com/PretendoNetwork/plogger-go" - "github.com/PretendoNetwork/super-mario-maker/database" - "github.com/PretendoNetwork/super-mario-maker/globals" - "github.com/joho/godotenv" - - "github.com/PretendoNetwork/nex-go/v2" - - "github.com/minio/minio-go/v7" - "github.com/minio/minio-go/v7/pkg/credentials" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - "google.golang.org/grpc/metadata" -) - -func init() { - globals.Logger = plogger.NewLogger() - - var err error - - err = godotenv.Load() - if err != nil { - globals.Logger.Warning("Error loading .env file") - } - - s3Endpoint := os.Getenv("PN_SMM_CONFIG_S3_ENDPOINT") - s3AccessKey := os.Getenv("PN_SMM_CONFIG_S3_ACCESS_KEY") - s3AccessSecret := os.Getenv("PN_SMM_CONFIG_S3_ACCESS_SECRET") - s3SecureEnv := os.Getenv("PN_SMM_CONFIG_S3_SECURE") - - postgresURI := os.Getenv("PN_SMM_POSTGRES_URI") - authenticationServerPort := os.Getenv("PN_SMM_AUTHENTICATION_SERVER_PORT") - secureServerHost := os.Getenv("PN_SMM_SECURE_SERVER_HOST") - secureServerPort := os.Getenv("PN_SMM_SECURE_SERVER_PORT") - gRPCServerPort := os.Getenv("PN_SMM_GRPC_SERVER_PORT") - gRPCAPIKey := os.Getenv("PN_SMM_GRPC_API_KEY") - accountGRPCHost := os.Getenv("PN_SMM_ACCOUNT_GRPC_HOST") - accountGRPCPort := os.Getenv("PN_SMM_ACCOUNT_GRPC_PORT") - accountGRPCAPIKey := os.Getenv("PN_SMM_ACCOUNT_GRPC_API_KEY") - - if strings.TrimSpace(postgresURI) == "" { - globals.Logger.Error("PN_SMM_POSTGRES_URI environment variable not set") - os.Exit(0) - } - - kerberosPassword := make([]byte, 0x10) - _, err = rand.Read(kerberosPassword) - if err != nil { - globals.Logger.Error("Error generating Kerberos password") - os.Exit(0) - } - - globals.KerberosPassword = string(kerberosPassword) - - globals.AuthenticationServerAccount = nex.NewAccount(1, "Quazal Authentication", globals.KerberosPassword) - globals.SecureServerAccount = nex.NewAccount(2, "Quazal Rendez-Vous", globals.KerberosPassword) - - if strings.TrimSpace(authenticationServerPort) == "" { - globals.Logger.Error("PN_SMM_AUTHENTICATION_SERVER_PORT environment variable not set") - os.Exit(0) - } - - if port, err := strconv.Atoi(authenticationServerPort); err != nil { - globals.Logger.Errorf("PN_SMM_AUTHENTICATION_SERVER_PORT is not a valid port. Expected 0-65535, got %s", authenticationServerPort) - os.Exit(0) - } else if port < 0 || port > 65535 { - globals.Logger.Errorf("PN_SMM_AUTHENTICATION_SERVER_PORT is not a valid port. Expected 0-65535, got %s", authenticationServerPort) - os.Exit(0) - } - - if strings.TrimSpace(secureServerHost) == "" { - globals.Logger.Error("PN_SMM_SECURE_SERVER_HOST environment variable not set") - os.Exit(0) - } - - if strings.TrimSpace(secureServerPort) == "" { - globals.Logger.Error("PN_SMM_SECURE_SERVER_PORT environment variable not set") - os.Exit(0) - } - - if port, err := strconv.Atoi(secureServerPort); err != nil { - globals.Logger.Errorf("PN_SMM_SECURE_SERVER_PORT is not a valid port. Expected 0-65535, got %s", secureServerPort) - os.Exit(0) - } else if port < 0 || port > 65535 { - globals.Logger.Errorf("PN_SMM_SECURE_SERVER_PORT is not a valid port. Expected 0-65535, got %s", secureServerPort) - os.Exit(0) - } - - gRPCPort, err := strconv.Atoi(gRPCServerPort) - if err != nil { - globals.Logger.Errorf("PN_SMM_GRPC_SERVER_PORT is not a valid port. Expected 0-65535, got %s", gRPCServerPort) - os.Exit(0) - } else if gRPCPort < 0 || gRPCPort > 65535 { - globals.Logger.Errorf("PN_SMM_GRPC_SERVER_PORT is not a valid port. Expected 0-65535, got %s", gRPCServerPort) - os.Exit(0) - } - globals.GRPCServerPort = gRPCPort; - - if strings.TrimSpace(gRPCAPIKey) == "" { - globals.Logger.Warning("Insecure gRPC server detected. PN_SMM_GRPC_API_KEY environment variable not set") - } - globals.GRPCAPIKey = gRPCAPIKey; - - if strings.TrimSpace(accountGRPCHost) == "" { - globals.Logger.Error("PN_SMM_ACCOUNT_GRPC_HOST environment variable not set") - os.Exit(0) - } - - if strings.TrimSpace(accountGRPCPort) == "" { - globals.Logger.Error("PN_SMM_ACCOUNT_GRPC_PORT environment variable not set") - os.Exit(0) - } - - if port, err := strconv.Atoi(accountGRPCPort); err != nil { - globals.Logger.Errorf("PN_SMM_ACCOUNT_GRPC_PORT is not a valid port. Expected 0-65535, got %s", accountGRPCPort) - os.Exit(0) - } else if port < 0 || port > 65535 { - globals.Logger.Errorf("PN_SMM_ACCOUNT_GRPC_PORT is not a valid port. Expected 0-65535, got %s", accountGRPCPort) - os.Exit(0) - } - - if strings.TrimSpace(accountGRPCAPIKey) == "" { - globals.Logger.Warning("Insecure gRPC server detected. PN_SMM_ACCOUNT_GRPC_API_KEY environment variable not set") - } - - globals.GRPCAccountClientConnection, err = grpc.NewClient(fmt.Sprintf("%s:%s", accountGRPCHost, accountGRPCPort), grpc.WithTransportCredentials(insecure.NewCredentials())) - if err != nil { - globals.Logger.Criticalf("Failed to connect to account gRPC server: %v", err) - os.Exit(0) - } - - globals.GRPCAccountClient = pb.NewAccountClient(globals.GRPCAccountClientConnection) - globals.GRPCAccountCommonMetadata = metadata.Pairs( - "X-API-Key", accountGRPCAPIKey, - ) - - staticCredentials := credentials.NewStaticV4(s3AccessKey, s3AccessSecret, "") - - s3Secure, err := strconv.ParseBool(s3SecureEnv) - if err != nil { - globals.Logger.Warningf("PN_SMM_CONFIG_S3_SECURE environment variable not set. Using default value: %t", true) - s3Secure = true - } - - minIOClient, err := minio.New(s3Endpoint, &minio.Options{ - Creds: staticCredentials, - Secure: s3Secure, - }) - if err != nil { - panic(err) - } - - globals.MinIOClient = minIOClient - globals.Presigner = globals.NewS3Presigner(globals.MinIOClient) - - // * Connect to and setup databases - database.ConnectPostgres() -} +package main + +import ( + "crypto/rand" + "fmt" + "os" + "strconv" + "strings" + + pb "github.com/PretendoNetwork/grpc/go/account" + "github.com/PretendoNetwork/plogger-go" + "github.com/PretendoNetwork/super-mario-maker/database" + "github.com/PretendoNetwork/super-mario-maker/globals" + "github.com/joho/godotenv" + + "github.com/PretendoNetwork/nex-go/v2" + + "github.com/minio/minio-go/v7" + "github.com/minio/minio-go/v7/pkg/credentials" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/metadata" +) + +func init() { + globals.Logger = plogger.NewLogger() + + var err error + + err = godotenv.Load() + if err != nil { + globals.Logger.Warning("Error loading .env file") + } + + s3Endpoint := os.Getenv("PN_SMM_CONFIG_S3_ENDPOINT") + s3AccessKey := os.Getenv("PN_SMM_CONFIG_S3_ACCESS_KEY") + s3AccessSecret := os.Getenv("PN_SMM_CONFIG_S3_ACCESS_SECRET") + s3SecureEnv := os.Getenv("PN_SMM_CONFIG_S3_SECURE") + + postgresURI := os.Getenv("PN_SMM_POSTGRES_URI") + authenticationServerPort := os.Getenv("PN_SMM_AUTHENTICATION_SERVER_PORT") + secureServerHost := os.Getenv("PN_SMM_SECURE_SERVER_HOST") + secureServerPort := os.Getenv("PN_SMM_SECURE_SERVER_PORT") + gRPCServerPort := os.Getenv("PN_SMM_GRPC_SERVER_PORT") + gRPCAPIKey := os.Getenv("PN_SMM_GRPC_API_KEY") + accountGRPCHost := os.Getenv("PN_SMM_ACCOUNT_GRPC_HOST") + accountGRPCPort := os.Getenv("PN_SMM_ACCOUNT_GRPC_PORT") + accountGRPCAPIKey := os.Getenv("PN_SMM_ACCOUNT_GRPC_API_KEY") + + if strings.TrimSpace(postgresURI) == "" { + globals.Logger.Error("PN_SMM_POSTGRES_URI environment variable not set") + os.Exit(0) + } + + kerberosPassword := make([]byte, 0x10) + _, err = rand.Read(kerberosPassword) + if err != nil { + globals.Logger.Error("Error generating Kerberos password") + os.Exit(0) + } + + globals.KerberosPassword = string(kerberosPassword) + + globals.AuthenticationServerAccount = nex.NewAccount(1, "Quazal Authentication", globals.KerberosPassword) + globals.SecureServerAccount = nex.NewAccount(2, "Quazal Rendez-Vous", globals.KerberosPassword) + + if strings.TrimSpace(authenticationServerPort) == "" { + globals.Logger.Error("PN_SMM_AUTHENTICATION_SERVER_PORT environment variable not set") + os.Exit(0) + } + + if port, err := strconv.Atoi(authenticationServerPort); err != nil { + globals.Logger.Errorf("PN_SMM_AUTHENTICATION_SERVER_PORT is not a valid port. Expected 0-65535, got %s", authenticationServerPort) + os.Exit(0) + } else if port < 0 || port > 65535 { + globals.Logger.Errorf("PN_SMM_AUTHENTICATION_SERVER_PORT is not a valid port. Expected 0-65535, got %s", authenticationServerPort) + os.Exit(0) + } + + if strings.TrimSpace(secureServerHost) == "" { + globals.Logger.Error("PN_SMM_SECURE_SERVER_HOST environment variable not set") + os.Exit(0) + } + + if strings.TrimSpace(secureServerPort) == "" { + globals.Logger.Error("PN_SMM_SECURE_SERVER_PORT environment variable not set") + os.Exit(0) + } + + if port, err := strconv.Atoi(secureServerPort); err != nil { + globals.Logger.Errorf("PN_SMM_SECURE_SERVER_PORT is not a valid port. Expected 0-65535, got %s", secureServerPort) + os.Exit(0) + } else if port < 0 || port > 65535 { + globals.Logger.Errorf("PN_SMM_SECURE_SERVER_PORT is not a valid port. Expected 0-65535, got %s", secureServerPort) + os.Exit(0) + } + + gRPCPort, err := strconv.Atoi(gRPCServerPort) + if err != nil { + globals.Logger.Errorf("PN_SMM_GRPC_SERVER_PORT is not a valid port. Expected 0-65535, got %s", gRPCServerPort) + os.Exit(0) + } else if gRPCPort < 0 || gRPCPort > 65535 { + globals.Logger.Errorf("PN_SMM_GRPC_SERVER_PORT is not a valid port. Expected 0-65535, got %s", gRPCServerPort) + os.Exit(0) + } + globals.GRPCServerPort = gRPCPort + + if strings.TrimSpace(gRPCAPIKey) == "" { + globals.Logger.Warning("Insecure gRPC server detected. PN_SMM_GRPC_API_KEY environment variable not set") + } + globals.GRPCAPIKey = gRPCAPIKey + + if strings.TrimSpace(accountGRPCHost) == "" { + globals.Logger.Error("PN_SMM_ACCOUNT_GRPC_HOST environment variable not set") + os.Exit(0) + } + + if strings.TrimSpace(accountGRPCPort) == "" { + globals.Logger.Error("PN_SMM_ACCOUNT_GRPC_PORT environment variable not set") + os.Exit(0) + } + + if port, err := strconv.Atoi(accountGRPCPort); err != nil { + globals.Logger.Errorf("PN_SMM_ACCOUNT_GRPC_PORT is not a valid port. Expected 0-65535, got %s", accountGRPCPort) + os.Exit(0) + } else if port < 0 || port > 65535 { + globals.Logger.Errorf("PN_SMM_ACCOUNT_GRPC_PORT is not a valid port. Expected 0-65535, got %s", accountGRPCPort) + os.Exit(0) + } + + if strings.TrimSpace(accountGRPCAPIKey) == "" { + globals.Logger.Warning("Insecure gRPC server detected. PN_SMM_ACCOUNT_GRPC_API_KEY environment variable not set") + } + + globals.GRPCAccountClientConnection, err = grpc.NewClient(fmt.Sprintf("%s:%s", accountGRPCHost, accountGRPCPort), grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + globals.Logger.Criticalf("Failed to connect to account gRPC server: %v", err) + os.Exit(0) + } + + globals.GRPCAccountClient = pb.NewAccountClient(globals.GRPCAccountClientConnection) + globals.GRPCAccountCommonMetadata = metadata.Pairs( + "X-API-Key", accountGRPCAPIKey, + ) + + staticCredentials := credentials.NewStaticV4(s3AccessKey, s3AccessSecret, "") + + s3Secure, err := strconv.ParseBool(s3SecureEnv) + if err != nil { + globals.Logger.Warningf("PN_SMM_CONFIG_S3_SECURE environment variable not set. Using default value: %t", true) + s3Secure = true + } + + minIOClient, err := minio.New(s3Endpoint, &minio.Options{ + Creds: staticCredentials, + Secure: s3Secure, + }) + if err != nil { + panic(err) + } + + globals.MinIOClient = minIOClient + globals.Presigner = globals.NewS3Presigner(globals.MinIOClient) + + // * Connect to and setup databases + database.ConnectPostgres() +} From 91364538c006783890925c9c2fb82f8b271c5b6f Mon Sep 17 00:00:00 2001 From: mrjvs Date: Sun, 2 Aug 2026 16:00:30 +0200 Subject: [PATCH 5/5] chore: run `go mod tidy` --- go.sum | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.sum b/go.sum index 01eb7ae..ece7e94 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -github.com/PretendoNetwork/grpc/go v0.0.0-20250123103241-5fb484bf544d h1:i/XyhbTm/j8UfCSnA0Cwrvc0mWOPIftOVrfSYqbh8Xo= -github.com/PretendoNetwork/grpc/go v0.0.0-20250123103241-5fb484bf544d/go.mod h1:L6We4KkcQeiQVPrF7iu8Zax0B1Bm0v4nssR1JOAiRFQ= github.com/PretendoNetwork/grpc/go v0.0.0-20260801122926-a632ab44588d h1:9tMOif1DXaDNZ3auC+DkTd8+PpX7j3xvH1w2jzdR7w0= github.com/PretendoNetwork/grpc/go v0.0.0-20260801122926-a632ab44588d/go.mod h1:L6We4KkcQeiQVPrF7iu8Zax0B1Bm0v4nssR1JOAiRFQ= github.com/PretendoNetwork/nex-go/v2 v2.1.2 h1:OJFAS6U6VNzZ4YzteKqUEZ5aJMwWIHODeRrLwNbN7nw=