Added gRPC method to query friend PIDs

This commit is contained in:
Jonathan Barrow 2023-04-10 22:00:48 -04:00
parent 2cce4a7af4
commit e14e5d4dc6
No known key found for this signature in database
GPG Key ID: E86E9FE9049C741F
7 changed files with 126 additions and 46 deletions

View File

@ -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
}

6
go.mod
View File

@ -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
)

12
go.sum
View File

@ -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=

View File

@ -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
}

View File

@ -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
}

View File

@ -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)
}
}

View File

@ -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
}