diff --git a/database/wiiu/get_user_friend_pids.go b/database/wiiu/get_user_friend_pids.go new file mode 100644 index 0000000..fec8176 --- /dev/null +++ b/database/wiiu/get_user_friend_pids.go @@ -0,0 +1,27 @@ +package database_wiiu + +import ( + "github.com/PretendoNetwork/friends-secure/database" + "github.com/PretendoNetwork/friends-secure/globals" +) + +// Get a users friend PIDs list +func GetUserFriendPIDs(pid uint32) []uint32 { + pids := make([]uint32, 0) + + rows, err := database.Postgres.Query(`SELECT user2_pid FROM wiiu.friendships WHERE user1_pid=$1 AND active=true LIMIT 100`, pid) + if err != nil { + globals.Logger.Critical(err.Error()) + return pids + } + defer rows.Close() + + for rows.Next() { + var pid uint32 + rows.Scan(&pid) + + pids = append(pids, pid) + } + + return pids +} diff --git a/go.mod b/go.mod index 3378f92..7cc4c3a 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,9 @@ module github.com/PretendoNetwork/friends-secure go 1.18 require ( - github.com/PretendoNetwork/grpc-go v0.0.0-20220820112405-4798a22a13f3 + github.com/PretendoNetwork/grpc-go v0.0.0-20230411011443-bb1bba45a95b github.com/PretendoNetwork/nex-go v1.0.16 - github.com/PretendoNetwork/nex-protocols-go v1.0.20 + github.com/PretendoNetwork/nex-protocols-go v1.0.24 github.com/PretendoNetwork/plogger-go v1.0.2 github.com/gocql/gocql v1.3.2 github.com/golang/protobuf v1.5.3 @@ -38,7 +38,7 @@ require ( golang.org/x/sys v0.7.0 // indirect golang.org/x/term v0.7.0 // indirect golang.org/x/text v0.9.0 // indirect - google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd // indirect + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect ) diff --git a/go.sum b/go.sum index 3b30238..40ecf59 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,9 @@ -github.com/PretendoNetwork/grpc-go v0.0.0-20220820112405-4798a22a13f3 h1:rXQLOWgjXYrmdBCMiZzoSWoe4VPxPCYbveyf0pCagKU= -github.com/PretendoNetwork/grpc-go v0.0.0-20220820112405-4798a22a13f3/go.mod h1:iONEVRP4H4OEkfzSWfAWf0Fvh9upLBv21bq2R2iy8Jk= +github.com/PretendoNetwork/grpc-go v0.0.0-20230411011443-bb1bba45a95b h1:fYZKfX6sQlJRw87EIPBc5jtRmMP0y24AwAg3DfPUIDM= +github.com/PretendoNetwork/grpc-go v0.0.0-20230411011443-bb1bba45a95b/go.mod h1:XZjEsij9lL7HJBNkH6JPbBIkUSq/1rjflvjGdv+DAj0= github.com/PretendoNetwork/nex-go v1.0.16 h1:g2lJW8G+WOS6/8qsgQ0+jLlzemjJ60tQtLqloLTjElo= github.com/PretendoNetwork/nex-go v1.0.16/go.mod h1:Bx2ONeSefnbJyE0IDIwGopxrjRrnszOV/uQv74Cx+m0= -github.com/PretendoNetwork/nex-protocols-go v1.0.20 h1:vUoYHFvVWWx9Bm9/2JiN1siW03tFxtD4NY9w/WfC878= -github.com/PretendoNetwork/nex-protocols-go v1.0.20/go.mod h1:Bt7hI7hJ+8r6UU5LSs+3xx4xzsvMVeEUkAW8Cg3lGjQ= +github.com/PretendoNetwork/nex-protocols-go v1.0.24 h1:2EKtlIozrIbhosob6lj3aFNet8JAxZT3CoWc8o4D06Y= +github.com/PretendoNetwork/nex-protocols-go v1.0.24/go.mod h1:Bt7hI7hJ+8r6UU5LSs+3xx4xzsvMVeEUkAW8Cg3lGjQ= github.com/PretendoNetwork/plogger-go v1.0.2 h1:vWKEnEmJJzYwqLxLyiSsAvCrZV6qnnu/a0GQOjIfzY0= github.com/PretendoNetwork/plogger-go v1.0.2/go.mod h1:7kD6M4vPq1JL4LTuPg6kuB1OvUBOwQOtAvTaUwMbwvU= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= @@ -128,8 +128,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd h1:sLpv7bNL1AsX3fdnWh9WVh7ejIzXdOc1RRHGeAmeStU= -google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= diff --git a/grpc/api_key_interceptor.go b/grpc/api_key_interceptor.go new file mode 100644 index 0000000..16d2052 --- /dev/null +++ b/grpc/api_key_interceptor.go @@ -0,0 +1,26 @@ +package grpc + +import ( + "context" + "errors" + "os" + + "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] != os.Getenv("PN_ACT_CONFIG_GRPC_API_KEY") { + return nil, errors.New("Missing or invalid API key") + } + } + + h, err := handler(ctx, req) + + return h, err +} diff --git a/grpc/get_user_friend_pids.go b/grpc/get_user_friend_pids.go new file mode 100644 index 0000000..53feb7c --- /dev/null +++ b/grpc/get_user_friend_pids.go @@ -0,0 +1,17 @@ +package grpc + +import ( + "context" + + database_wiiu "github.com/PretendoNetwork/friends-secure/database/wiiu" + pb "github.com/PretendoNetwork/grpc-go/friends" +) + +func (s *gRPCFriendsServer) GetUserFriendPIDs(ctx context.Context, in *pb.GetUserFriendPIDsRequest) (*pb.GetUserFriendPIDsResponse, error) { + + pids := database_wiiu.GetUserFriendPIDs(in.GetPid()) + + return &pb.GetUserFriendPIDsResponse{ + Pids: pids, + }, nil +} diff --git a/grpc/grpc_server.go b/grpc/grpc_server.go index 4ea9121..a6dc2c5 100644 --- a/grpc/grpc_server.go +++ b/grpc/grpc_server.go @@ -1,15 +1,10 @@ package grpc import ( - "context" "log" "net" - "github.com/PretendoNetwork/friends-secure/globals" pb "github.com/PretendoNetwork/grpc-go/friends" - nex "github.com/PretendoNetwork/nex-go" - nintendo_notifications "github.com/PretendoNetwork/nex-protocols-go/nintendo-notifications" - empty "github.com/golang/protobuf/ptypes/empty" "google.golang.org/grpc" ) @@ -17,47 +12,21 @@ type gRPCFriendsServer struct { pb.UnimplementedFriendsServer } -// SendUserNotificationWiiU implements helloworld.SendUserNotificationWiiU -func (s *gRPCFriendsServer) SendUserNotificationWiiU(ctx context.Context, in *pb.SendUserNotificationWiiURequest) (*empty.Empty, error) { - connectedUser := globals.ConnectedUsers[in.GetPid()] - - if connectedUser != nil { - rmcRequest := nex.NewRMCRequest() - rmcRequest.SetProtocolID(nintendo_notifications.ProtocolID) - rmcRequest.SetCallID(3810693103) - rmcRequest.SetMethodID(nintendo_notifications.MethodProcessNintendoNotificationEvent2) - rmcRequest.SetParameters(in.GetNotificationData()) - - rmcRequestBytes := rmcRequest.Bytes() - - requestPacket, _ := nex.NewPacketV0(connectedUser.Client, nil) - - requestPacket.SetVersion(0) - requestPacket.SetSource(0xA1) - requestPacket.SetDestination(0xAF) - requestPacket.SetType(nex.DataPacket) - requestPacket.SetPayload(rmcRequestBytes) - - requestPacket.AddFlag(nex.FlagNeedsAck) - requestPacket.AddFlag(nex.FlagReliable) - - globals.NEXServer.Send(requestPacket) - } - - return &empty.Empty{}, nil -} - func StartGRPCServer() { listener, err := net.Listen("tcp", ":50051") if err != nil { log.Fatalf("failed to listen: %v", err) } - server := grpc.NewServer() + server := grpc.NewServer( + grpc.UnaryInterceptor(apiKeyInterceptor), + ) pb.RegisterFriendsServer(server, &gRPCFriendsServer{}) log.Printf("server listening at %v", listener.Addr()) - server.Serve(listener) + if err := server.Serve(listener); err != nil { + log.Fatalf("failed to serve: %v", err) + } } diff --git a/grpc/send_user_notification_wiiu.go b/grpc/send_user_notification_wiiu.go new file mode 100644 index 0000000..2fe6c08 --- /dev/null +++ b/grpc/send_user_notification_wiiu.go @@ -0,0 +1,41 @@ +package grpc + +import ( + "context" + + "github.com/PretendoNetwork/friends-secure/globals" + pb "github.com/PretendoNetwork/grpc-go/friends" + nex "github.com/PretendoNetwork/nex-go" + nintendo_notifications "github.com/PretendoNetwork/nex-protocols-go/nintendo-notifications" + empty "github.com/golang/protobuf/ptypes/empty" +) + +// SendUserNotificationWiiU implements helloworld.SendUserNotificationWiiU +func (s *gRPCFriendsServer) SendUserNotificationWiiU(ctx context.Context, in *pb.SendUserNotificationWiiURequest) (*empty.Empty, error) { + connectedUser := globals.ConnectedUsers[in.GetPid()] + + if connectedUser != nil { + rmcRequest := nex.NewRMCRequest() + rmcRequest.SetProtocolID(nintendo_notifications.ProtocolID) + rmcRequest.SetCallID(3810693103) + rmcRequest.SetMethodID(nintendo_notifications.MethodProcessNintendoNotificationEvent2) + rmcRequest.SetParameters(in.GetNotificationData()) + + rmcRequestBytes := rmcRequest.Bytes() + + requestPacket, _ := nex.NewPacketV0(connectedUser.Client, nil) + + requestPacket.SetVersion(0) + requestPacket.SetSource(0xA1) + requestPacket.SetDestination(0xAF) + requestPacket.SetType(nex.DataPacket) + requestPacket.SetPayload(rmcRequestBytes) + + requestPacket.AddFlag(nex.FlagNeedsAck) + requestPacket.AddFlag(nex.FlagReliable) + + globals.NEXServer.Send(requestPacket) + } + + return &empty.Empty{}, nil +}