nex-go/test/secure.go
2025-01-09 23:21:11 +00:00

255 lines
9 KiB
Go

package main
import (
"fmt"
"net"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/constants"
"github.com/PretendoNetwork/nex-go/v2/types"
)
var secureServer *nex.PRUDPServer
var secureEndpoint *nex.PRUDPEndPoint
// * Took these structs out of the protocols lib for convenience
type principalPreference struct {
types.Structure
types.Data
ShowOnlinePresence types.Bool
ShowCurrentTitle types.Bool
BlockFriendRequests types.Bool
}
func (pp principalPreference) WriteTo(writable types.Writable) {
pp.ShowOnlinePresence.WriteTo(writable)
pp.ShowCurrentTitle.WriteTo(writable)
pp.BlockFriendRequests.WriteTo(writable)
}
type comment struct {
types.Structure
types.Data
Unknown types.UInt8
Contents types.String
LastChanged types.DateTime
}
func (c comment) WriteTo(writable types.Writable) {
c.Unknown.WriteTo(writable)
c.Contents.WriteTo(writable)
c.LastChanged.WriteTo(writable)
}
func startSecureServer() {
fmt.Println("Starting secure")
secureServer = nex.NewPRUDPServer()
secureEndpoint = nex.NewPRUDPEndPoint(1)
secureEndpoint.AccountDetailsByPID = accountDetailsByPID
secureEndpoint.AccountDetailsByUsername = accountDetailsByUsername
secureEndpoint.ServerAccount = secureServerAccount
secureEndpoint.IsSecureEndPoint = true
secureEndpoint.OnData(func(packet nex.PacketInterface) {
if packet, ok := packet.(nex.PRUDPPacketInterface); ok {
request := packet.RMCMessage()
fmt.Println("[SECR]", request.ProtocolID, request.MethodID)
if request.ProtocolID == 0xB { // * Secure Connection
if request.MethodID == 0x4 {
registerEx(packet)
}
}
if request.ProtocolID == 0x66 { // * Friends (WiiU)
if request.MethodID == 1 {
updateAndGetAllInformation(packet)
} else if request.MethodID == 19 {
checkSettingStatus(packet)
} else if request.MethodID == 13 {
updatePresence(packet)
} else {
panic(fmt.Sprintf("Unknown method %d", request.MethodID))
}
}
}
})
secureServer.SetFragmentSize(962)
secureServer.LibraryVersions.SetDefault(nex.NewLibraryVersion(1, 1, 0))
secureServer.SessionKeyLength = 16
secureServer.AccessKey = "ridfebb9"
secureServer.BindPRUDPEndPoint(secureEndpoint)
secureServer.Listen(60001)
}
func registerEx(packet nex.PRUDPPacketInterface) {
request := packet.RMCMessage()
response := nex.NewRMCMessage(secureEndpoint)
connection := packet.Sender().(*nex.PRUDPConnection)
parameters := request.Parameters
parametersStream := nex.NewByteStreamIn(parameters, secureEndpoint.LibraryVersions(), secureEndpoint.ByteStreamSettings())
vecMyURLs := types.NewList[types.StationURL]()
if err := vecMyURLs.ExtractFrom(parametersStream); err != nil {
panic(err)
}
hCustomData := types.NewDataHolder()
if err := hCustomData.ExtractFrom(parametersStream); err != nil {
fmt.Println(err)
}
localStation := vecMyURLs[0]
address := packet.Sender().Address().(*net.UDPAddr).IP.String()
localStation.SetAddress(address)
localStation.SetPortNumber(uint16(packet.Sender().Address().(*net.UDPAddr).Port))
retval := types.NewQResultSuccess(0x00010001)
localStationURL := types.NewString(localStation.URL())
responseStream := nex.NewByteStreamOut(secureEndpoint.LibraryVersions(), secureEndpoint.ByteStreamSettings())
retval.WriteTo(responseStream)
responseStream.WriteUInt32LE(connection.ID)
localStationURL.WriteTo(responseStream)
response.IsSuccess = true
response.IsRequest = false
response.ErrorCode = 0x00010001
response.ProtocolID = request.ProtocolID
response.CallID = request.CallID
response.MethodID = request.MethodID
response.Parameters = responseStream.Bytes()
responsePacket, _ := nex.NewPRUDPPacketV0(secureServer, connection, nil)
responsePacket.SetType(packet.Type())
responsePacket.AddFlag(constants.PacketFlagHasSize)
responsePacket.AddFlag(constants.PacketFlagReliable)
responsePacket.AddFlag(constants.PacketFlagNeedsAck)
responsePacket.SetSourceVirtualPortStreamType(packet.DestinationVirtualPortStreamType())
responsePacket.SetSourceVirtualPortStreamID(packet.DestinationVirtualPortStreamID())
responsePacket.SetDestinationVirtualPortStreamType(packet.SourceVirtualPortStreamType())
responsePacket.SetDestinationVirtualPortStreamID(packet.SourceVirtualPortStreamID())
responsePacket.SetSubstreamID(packet.SubstreamID())
responsePacket.SetPayload(response.Bytes())
secureServer.Send(responsePacket)
}
func updateAndGetAllInformation(packet nex.PRUDPPacketInterface) {
request := packet.RMCMessage()
response := nex.NewRMCMessage(secureEndpoint)
responseStream := nex.NewByteStreamOut(secureEndpoint.LibraryVersions(), secureEndpoint.ByteStreamSettings())
(principalPreference{
ShowOnlinePresence: types.NewBool(true),
ShowCurrentTitle: types.NewBool(true),
BlockFriendRequests: types.NewBool(false),
}).WriteTo(responseStream)
(comment{
Unknown: types.NewUInt8(0),
Contents: types.NewString("Rewrite Test"),
LastChanged: types.NewDateTime(0),
}).WriteTo(responseStream)
responseStream.WriteUInt32LE(0) // * Stubbed empty list. responseStream.WriteListStructure(friendList)
responseStream.WriteUInt32LE(0) // * Stubbed empty list. responseStream.WriteListStructure(friendRequestsOut)
responseStream.WriteUInt32LE(0) // * Stubbed empty list. responseStream.WriteListStructure(friendRequestsIn)
responseStream.WriteUInt32LE(0) // * Stubbed empty list. responseStream.WriteListStructure(blockList)
responseStream.WriteBool(false) // * Unknown
responseStream.WriteUInt32LE(0) // * Stubbed empty list. responseStream.WriteListStructure(notifications)
responseStream.WriteBool(false) // * Unknown
response.IsSuccess = true
response.IsRequest = false
response.ErrorCode = 0x00010001
response.ProtocolID = request.ProtocolID
response.CallID = request.CallID
response.MethodID = request.MethodID
response.Parameters = responseStream.Bytes()
responsePacket, _ := nex.NewPRUDPPacketV0(secureServer, packet.Sender().(*nex.PRUDPConnection), nil)
responsePacket.SetType(packet.Type())
responsePacket.AddFlag(constants.PacketFlagHasSize)
responsePacket.AddFlag(constants.PacketFlagReliable)
responsePacket.AddFlag(constants.PacketFlagNeedsAck)
responsePacket.SetSourceVirtualPortStreamType(packet.DestinationVirtualPortStreamType())
responsePacket.SetSourceVirtualPortStreamID(packet.DestinationVirtualPortStreamID())
responsePacket.SetDestinationVirtualPortStreamType(packet.SourceVirtualPortStreamType())
responsePacket.SetDestinationVirtualPortStreamID(packet.SourceVirtualPortStreamID())
responsePacket.SetSubstreamID(packet.SubstreamID())
responsePacket.SetPayload(response.Bytes())
secureServer.Send(responsePacket)
}
func checkSettingStatus(packet nex.PRUDPPacketInterface) {
request := packet.RMCMessage()
response := nex.NewRMCMessage(secureEndpoint)
responseStream := nex.NewByteStreamOut(secureEndpoint.LibraryVersions(), secureEndpoint.ByteStreamSettings())
responseStream.WriteUInt8(0) // * Unknown
response.IsSuccess = true
response.IsRequest = false
response.ErrorCode = 0x00010001
response.ProtocolID = request.ProtocolID
response.CallID = request.CallID
response.MethodID = request.MethodID
response.Parameters = responseStream.Bytes()
responsePacket, _ := nex.NewPRUDPPacketV0(secureServer, packet.Sender().(*nex.PRUDPConnection), nil)
responsePacket.SetType(packet.Type())
responsePacket.AddFlag(constants.PacketFlagHasSize)
responsePacket.AddFlag(constants.PacketFlagReliable)
responsePacket.AddFlag(constants.PacketFlagNeedsAck)
responsePacket.SetSourceVirtualPortStreamType(packet.DestinationVirtualPortStreamType())
responsePacket.SetSourceVirtualPortStreamID(packet.DestinationVirtualPortStreamID())
responsePacket.SetDestinationVirtualPortStreamType(packet.SourceVirtualPortStreamType())
responsePacket.SetDestinationVirtualPortStreamID(packet.SourceVirtualPortStreamID())
responsePacket.SetSubstreamID(packet.SubstreamID())
responsePacket.SetPayload(response.Bytes())
secureServer.Send(responsePacket)
}
func updatePresence(packet nex.PRUDPPacketInterface) {
request := packet.RMCMessage()
response := nex.NewRMCMessage(secureEndpoint)
response.IsSuccess = true
response.IsRequest = false
response.ErrorCode = 0x00010001
response.ProtocolID = request.ProtocolID
response.CallID = request.CallID
response.MethodID = request.MethodID
responsePacket, _ := nex.NewPRUDPPacketV0(secureServer, packet.Sender().(*nex.PRUDPConnection), nil)
responsePacket.SetType(packet.Type())
responsePacket.AddFlag(constants.PacketFlagHasSize)
responsePacket.AddFlag(constants.PacketFlagReliable)
responsePacket.AddFlag(constants.PacketFlagNeedsAck)
responsePacket.SetSourceVirtualPortStreamType(packet.DestinationVirtualPortStreamType())
responsePacket.SetSourceVirtualPortStreamID(packet.DestinationVirtualPortStreamID())
responsePacket.SetDestinationVirtualPortStreamType(packet.SourceVirtualPortStreamType())
responsePacket.SetDestinationVirtualPortStreamID(packet.SourceVirtualPortStreamID())
responsePacket.SetSubstreamID(packet.SubstreamID())
responsePacket.SetPayload(response.Bytes())
secureServer.Send(responsePacket)
}