mirror of
https://github.com/WiiLink24/wfc-server.git
synced 2026-03-21 17:44:58 -05:00
Add log verbosity option
This commit is contained in:
parent
4e14aa8a4c
commit
a50ffdd46c
|
|
@ -14,6 +14,7 @@ type Config struct {
|
|||
Port string `xml:"nasPort"`
|
||||
PortHTTPS string `xml:"nasPortHttps"`
|
||||
EnableHTTPS bool `xml:"enableHttps"`
|
||||
LogLevel int `xml:"logLevel"`
|
||||
}
|
||||
|
||||
func GetConfig() Config {
|
||||
|
|
|
|||
|
|
@ -12,4 +12,7 @@
|
|||
<!-- Database information-->
|
||||
<databaseAddress>127.0.0.1</databaseAddress>
|
||||
<databaseName>wwfc</databaseName>
|
||||
|
||||
<!-- Log verbosity -->
|
||||
<logLevel>4</logLevel>
|
||||
</Config>
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ func (g *GameSpySession) addFriend(command common.GameSpyCommand) {
|
|||
}
|
||||
|
||||
fc := common.CalcFriendCodeString(uint32(newProfileId), "RMCJ")
|
||||
logging.Notice(g.ModuleName, "Add friend:", aurora.Cyan(strNewProfileId), aurora.Cyan(fc))
|
||||
logging.Info(g.ModuleName, "Add friend:", aurora.Cyan(strNewProfileId), aurora.Cyan(fc))
|
||||
|
||||
if g.isFriendAuthorized(uint32(newProfileId)) {
|
||||
logging.Info(g.ModuleName, "Attempt to add a friend who is already authorized")
|
||||
|
|
@ -204,6 +204,7 @@ func (g *GameSpySession) authAddFriend(command common.GameSpyCommand) {
|
|||
|
||||
func (g *GameSpySession) setStatus(command common.GameSpyCommand) {
|
||||
status := command.CommandValue
|
||||
logging.Notice(g.ModuleName, "New status:", aurora.BrightMagenta(status))
|
||||
|
||||
qr2.ProcessGPStatusUpdate(g.User.ProfileId, g.QR2IP, status)
|
||||
|
||||
|
|
@ -220,16 +221,15 @@ func (g *GameSpySession) setStatus(command common.GameSpyCommand) {
|
|||
}
|
||||
|
||||
statusMsg := "|s|" + status + "|ss|" + statstring + "|ls|" + locstring + "|ip|0|p|0|qm|0"
|
||||
logging.Notice(g.ModuleName, "New status:", aurora.BrightMagenta(statusMsg))
|
||||
|
||||
mutex.Lock()
|
||||
defer mutex.Unlock()
|
||||
g.LocString = locstring
|
||||
g.Status = statusMsg
|
||||
|
||||
for _, storedPid := range g.FriendList {
|
||||
g.sendFriendStatus(storedPid)
|
||||
}
|
||||
mutex.Unlock()
|
||||
}
|
||||
|
||||
const (
|
||||
|
|
@ -245,7 +245,7 @@ const (
|
|||
func (g *GameSpySession) bestieMessage(command common.GameSpyCommand) {
|
||||
// TODO: There are other command values that mean the same thing
|
||||
if command.CommandValue != "1" {
|
||||
logging.Notice(g.ModuleName, "Received unknown bestie message type:", aurora.Cyan(command.CommandValue))
|
||||
logging.Error(g.ModuleName, "Received unknown bestie message type:", aurora.Cyan(command.CommandValue))
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ var msPublicKey = []byte{
|
|||
0xF9, 0x5B, 0x4D, 0x11, 0x04, 0x44, 0x64, 0x35, 0xC0, 0xED, 0xA4, 0x2F,
|
||||
}
|
||||
|
||||
func verifySignature(authToken string, signature string) uint32 {
|
||||
func verifySignature(moduleName string, authToken string, signature string) uint32 {
|
||||
sigBytes, err := common.Base64DwcEncoding.DecodeString(signature)
|
||||
if err != nil || len(sigBytes) != 0x144 {
|
||||
return 0
|
||||
|
|
@ -75,10 +75,10 @@ func verifySignature(authToken string, signature string) uint32 {
|
|||
ngCertBlobHash := sha1.Sum(ngCertBlob)
|
||||
|
||||
if !verifyECDSA(msPublicKey, msSignature, ngCertBlobHash[:]) {
|
||||
logging.Error("GPCM", "NG cert verify failed")
|
||||
logging.Error(moduleName, "NG cert verify failed")
|
||||
return 0
|
||||
}
|
||||
logging.Info("GPCM", "NG cert verified")
|
||||
logging.Info(moduleName, "NG cert verified")
|
||||
|
||||
apIssuer := ngIssuer + "-" + ngName
|
||||
apName := fmt.Sprintf("AP%02x%02x%02x%02x%02x%02x%02x%02x", apId[0], apId[1], apId[2], apId[3], apId[4], apId[5], apId[6], apId[7])
|
||||
|
|
@ -94,17 +94,17 @@ func verifySignature(authToken string, signature string) uint32 {
|
|||
apCertBlobHash := sha1.Sum(apCertBlob)
|
||||
|
||||
if !verifyECDSA(ngPublicKey, ngSignature, apCertBlobHash[:]) {
|
||||
logging.Error("GPCM", "AP cert verify failed")
|
||||
logging.Error(moduleName, "AP cert verify failed")
|
||||
return 0
|
||||
}
|
||||
logging.Info("GPCM", "AP cert verified")
|
||||
logging.Info(moduleName, "AP cert verified")
|
||||
|
||||
authTokenHash := sha1.Sum([]byte(authToken))
|
||||
if !verifyECDSA(apPublicKey, apSignature, authTokenHash[:]) {
|
||||
logging.Error("GPCM", "Auth token signature failed")
|
||||
logging.Error(moduleName, "Auth token signature failed")
|
||||
return 0
|
||||
}
|
||||
logging.Notice("GPCM", "Auth token signature verified; NG ID:", aurora.Cyan(fmt.Sprintf("%08x", ngId)))
|
||||
logging.Notice(moduleName, "Auth token signature verified; NG ID:", aurora.Cyan(fmt.Sprintf("%08x", ngId)))
|
||||
|
||||
return binary.BigEndian.Uint32(ngId)
|
||||
}
|
||||
|
|
@ -161,7 +161,7 @@ func (g *GameSpySession) login(command common.GameSpyCommand) {
|
|||
return
|
||||
}
|
||||
|
||||
if deviceId = verifySignature(authToken, signature); deviceId == 0 {
|
||||
if deviceId = verifySignature(g.ModuleName, authToken, signature); deviceId == 0 {
|
||||
g.replyError(GPError{
|
||||
ErrorCode: ErrLogin.ErrorCode,
|
||||
ErrorString: "The authentication signature is invalid.",
|
||||
|
|
@ -295,7 +295,7 @@ func (g *GameSpySession) exLogin(command common.GameSpyCommand) {
|
|||
return
|
||||
}
|
||||
|
||||
if deviceId = verifySignature(g.AuthToken, signature); deviceId == 0 {
|
||||
if deviceId = verifySignature(g.ModuleName, g.AuthToken, signature); deviceId == 0 {
|
||||
g.replyError(GPError{
|
||||
ErrorCode: ErrLogin.ErrorCode,
|
||||
ErrorString: "The authentication signature is invalid.",
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ func handleRequest(conn net.Conn) {
|
|||
session := &GameSpySession{
|
||||
Conn: conn,
|
||||
User: database.User{},
|
||||
ModuleName: "GPCM",
|
||||
ModuleName: "GPCM:" + conn.RemoteAddr().String(),
|
||||
LoggedIn: false,
|
||||
Challenge: "",
|
||||
Status: "",
|
||||
|
|
@ -130,7 +130,7 @@ func handleRequest(conn net.Conn) {
|
|||
|
||||
err := conn.(*net.TCPConn).SetKeepAlive(true)
|
||||
if err != nil {
|
||||
logging.Notice(session.ModuleName, "Unable to set keepalive:", err.Error())
|
||||
logging.Error(session.ModuleName, "Unable to set keepalive:", err.Error())
|
||||
}
|
||||
|
||||
payload := common.CreateGameSpyMessage(common.GameSpyCommand{
|
||||
|
|
@ -153,7 +153,7 @@ func handleRequest(conn net.Conn) {
|
|||
if err != nil {
|
||||
if errors.Is(err, io.EOF) {
|
||||
// Client closed connection, terminate.
|
||||
logging.Notice(session.ModuleName, "Client closed connection")
|
||||
logging.Info(session.ModuleName, "Client closed connection")
|
||||
return
|
||||
}
|
||||
|
||||
|
|
@ -207,7 +207,7 @@ func (g *GameSpySession) handleCommand(name string, commands []common.GameSpyCom
|
|||
continue
|
||||
}
|
||||
|
||||
logging.Notice(g.ModuleName, "Command:", aurora.Yellow(command.Command))
|
||||
logging.Info(g.ModuleName, "Command:", aurora.Yellow(command.Command))
|
||||
handler(command)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
package gpcm
|
||||
|
||||
import (
|
||||
"github.com/logrusorgru/aurora/v3"
|
||||
"strconv"
|
||||
"wwfc/common"
|
||||
"wwfc/database"
|
||||
"wwfc/logging"
|
||||
|
||||
"github.com/logrusorgru/aurora/v3"
|
||||
)
|
||||
|
||||
func (g *GameSpySession) getProfile(command common.GameSpyCommand) {
|
||||
|
|
@ -17,7 +18,7 @@ func (g *GameSpySession) getProfile(command common.GameSpyCommand) {
|
|||
return
|
||||
}
|
||||
|
||||
logging.Notice(g.ModuleName, "Looking up the profile of", aurora.Cyan(profileId).String())
|
||||
logging.Info(g.ModuleName, "Looking up the profile of", aurora.Cyan(profileId).String())
|
||||
|
||||
user := database.User{}
|
||||
locstring := ""
|
||||
|
|
|
|||
18
gpsp/main.go
18
gpsp/main.go
|
|
@ -5,8 +5,6 @@ import (
|
|||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/jackc/pgx/v4/pgxpool"
|
||||
"github.com/logrusorgru/aurora/v3"
|
||||
"io"
|
||||
"net"
|
||||
"strconv"
|
||||
|
|
@ -14,6 +12,9 @@ import (
|
|||
"wwfc/common"
|
||||
"wwfc/database"
|
||||
"wwfc/logging"
|
||||
|
||||
"github.com/jackc/pgx/v4/pgxpool"
|
||||
"github.com/logrusorgru/aurora/v3"
|
||||
)
|
||||
|
||||
var (
|
||||
|
|
@ -72,7 +73,7 @@ func handleRequest(conn net.Conn) {
|
|||
logging.Notice(moduleName, "Unable to set keepalive:", err.Error())
|
||||
}
|
||||
|
||||
logging.Notice(moduleName, "Connection established from", aurora.BrightCyan(conn.RemoteAddr()))
|
||||
logging.Info(moduleName, "Connection established from", aurora.BrightCyan(conn.RemoteAddr()))
|
||||
|
||||
// Here we go into the listening loop
|
||||
for {
|
||||
|
|
@ -81,11 +82,11 @@ func handleRequest(conn net.Conn) {
|
|||
if err != nil {
|
||||
if errors.Is(err, io.EOF) {
|
||||
// Client closed connection, terminate.
|
||||
logging.Notice(moduleName, "Client closed connection")
|
||||
logging.Info(moduleName, "Client closed connection")
|
||||
return
|
||||
}
|
||||
|
||||
logging.Notice(moduleName, "Connection lost")
|
||||
logging.Error(moduleName, "Connection error:", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
@ -96,7 +97,8 @@ func handleRequest(conn net.Conn) {
|
|||
}
|
||||
|
||||
for _, command := range commands {
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow(command.Command))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow(command.Command))
|
||||
|
||||
switch command.Command {
|
||||
case "ka":
|
||||
conn.Write([]byte(`\ka\\final\`))
|
||||
|
|
@ -123,7 +125,7 @@ func handleRequest(conn net.Conn) {
|
|||
logging.Warn(moduleName, "Mismatched profile ID in otherslist:", aurora.Cyan(strProfileId))
|
||||
}
|
||||
|
||||
logging.Notice(moduleName, "Lookup otherslist for", aurora.Cyan(profileId))
|
||||
logging.Info(moduleName, "Lookup otherslist for", aurora.Cyan(profileId))
|
||||
conn.Write([]byte(handleOthersList(moduleName, uint32(profileId), command)))
|
||||
break
|
||||
}
|
||||
|
|
@ -188,7 +190,7 @@ func handleOthersList(moduleName string, _ uint32, command common.GameSpyCommand
|
|||
// Also TODO: Check if the players are actually friends
|
||||
user, ok := database.GetProfile(pool, ctx, uint32(otherId))
|
||||
if !ok {
|
||||
logging.Error(moduleName, "Other ID doesn't exist:", aurora.Cyan(strOtherId))
|
||||
logging.Warn(moduleName, "Other ID doesn't exist:", aurora.Cyan(strOtherId))
|
||||
// If the profile doesn't exist then skip adding it
|
||||
continue
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,11 +2,22 @@ package logging
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/logrusorgru/aurora/v3"
|
||||
"log"
|
||||
|
||||
"github.com/logrusorgru/aurora/v3"
|
||||
)
|
||||
|
||||
var logLevel = 0
|
||||
|
||||
func SetLevel(level int) {
|
||||
logLevel = level
|
||||
}
|
||||
|
||||
func Notice(module string, arguments ...any) {
|
||||
if logLevel < 1 {
|
||||
return
|
||||
}
|
||||
|
||||
var finalStr string
|
||||
for _, argument := range arguments {
|
||||
finalStr += fmt.Sprint(argument)
|
||||
|
|
@ -17,6 +28,10 @@ func Notice(module string, arguments ...any) {
|
|||
}
|
||||
|
||||
func Error(module string, arguments ...any) {
|
||||
if logLevel < 2 {
|
||||
return
|
||||
}
|
||||
|
||||
var finalStr string
|
||||
for _, argument := range arguments {
|
||||
finalStr += fmt.Sprint(argument)
|
||||
|
|
@ -27,6 +42,10 @@ func Error(module string, arguments ...any) {
|
|||
}
|
||||
|
||||
func Warn(module string, arguments ...any) {
|
||||
if logLevel < 3 {
|
||||
return
|
||||
}
|
||||
|
||||
var finalStr string
|
||||
for _, argument := range arguments {
|
||||
finalStr += fmt.Sprint(argument)
|
||||
|
|
@ -37,6 +56,10 @@ func Warn(module string, arguments ...any) {
|
|||
}
|
||||
|
||||
func Info(module string, arguments ...any) {
|
||||
if logLevel < 4 {
|
||||
return
|
||||
}
|
||||
|
||||
var finalStr string
|
||||
for _, argument := range arguments {
|
||||
finalStr += fmt.Sprint(argument)
|
||||
|
|
|
|||
5
main.go
5
main.go
|
|
@ -2,8 +2,10 @@ package main
|
|||
|
||||
import (
|
||||
"sync"
|
||||
"wwfc/common"
|
||||
"wwfc/gpcm"
|
||||
"wwfc/gpsp"
|
||||
"wwfc/logging"
|
||||
"wwfc/nas"
|
||||
"wwfc/natneg"
|
||||
"wwfc/qr2"
|
||||
|
|
@ -12,6 +14,9 @@ import (
|
|||
)
|
||||
|
||||
func main() {
|
||||
config := common.GetConfig()
|
||||
logging.SetLevel(config.LogLevel)
|
||||
|
||||
wg := &sync.WaitGroup{}
|
||||
actions := []func(){nas.StartServer, gpcm.StartServer, qr2.StartServer, gpsp.StartServer, serverbrowser.StartServer, sake.StartServer, natneg.StartServer}
|
||||
wg.Add(5)
|
||||
|
|
|
|||
|
|
@ -240,6 +240,7 @@ func login(moduleName string, fields map[string]string, isLocalhost bool) map[st
|
|||
}
|
||||
|
||||
authToken, challenge := common.MarshalNASAuthToken(gamecd, userId, gsbrcd, cfcInt, regionByte[0], langByte[0], fields["ingamesn"], isLocalhost)
|
||||
logging.Notice(moduleName, "Login", aurora.Cyan(strconv.FormatUint(userId, 10)), aurora.Cyan(gsbrcd), "ingamesn:", aurora.Cyan(fields["ingamesn"]))
|
||||
|
||||
param["returncd"] = "001"
|
||||
param["challenge"] = challenge
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ func startHTTPSProxy(address string, nasAddr string) {
|
|||
panic(err)
|
||||
}
|
||||
|
||||
logging.Notice("NAS-TLS", "Receiving HTTPS request from", aurora.BrightCyan(conn.RemoteAddr()))
|
||||
logging.Info("NAS-TLS", "Receiving HTTPS request from", aurora.BrightCyan(conn.RemoteAddr()))
|
||||
moduleName := "NAS-TLS:" + conn.RemoteAddr().String()
|
||||
|
||||
go func() {
|
||||
|
|
@ -124,7 +124,7 @@ func startHTTPSProxy(address string, nasAddr string) {
|
|||
0x00, 0x35, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x09, 0x00,
|
||||
0x00, 0x05, 0x00, 0x00, 0x04,
|
||||
}, buf[:min(index, 0x1D)]) {
|
||||
logging.Error(moduleName, "Invalid client hello:", aurora.Cyan(fmt.Sprintf("% X ", buf[:min(index, 0x1D)])))
|
||||
logging.Info(moduleName, "Invalid client hello:", aurora.Cyan(fmt.Sprintf("% X ", buf[:min(index, 0x1D)])))
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
|||
31
nas/main.go
31
nas/main.go
|
|
@ -52,7 +52,6 @@ var regexSakeHost = regexp.MustCompile(`^([a-z\-]+\.)?sake\.gs\.`)
|
|||
var regexStage1URL = regexp.MustCompile(`^/w([0-9])$`)
|
||||
|
||||
func handleRequest(w http.ResponseWriter, r *http.Request) {
|
||||
// TODO: Move this to its own server
|
||||
// Check for *.sake.gs.* or sake.gs.*
|
||||
if regexSakeHost.MatchString(r.Host) {
|
||||
// Redirect to the sake server
|
||||
|
|
@ -60,18 +59,9 @@ func handleRequest(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
logging.Notice("NAS", aurora.Yellow(r.Method), aurora.Cyan(r.URL), "via", aurora.Cyan(r.Host), "from", aurora.BrightCyan(r.RemoteAddr))
|
||||
moduleName := "NAS:" + r.RemoteAddr
|
||||
|
||||
if r.URL.String() == "/ac" || r.URL.String() == "/pr" || r.URL.String() == "/download" {
|
||||
handleAuthRequest(moduleName, w, r)
|
||||
return
|
||||
}
|
||||
|
||||
// TODO: Move this to its own server
|
||||
// Check for /payload
|
||||
if strings.HasPrefix(r.URL.String(), "/payload?") {
|
||||
handlePayloadRequest(moduleName, w, r)
|
||||
// Handle conntest server
|
||||
if strings.HasPrefix(r.Host, "conntest.") {
|
||||
handleConnectionTest(w)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
@ -87,9 +77,18 @@ func handleRequest(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
// Handle conntest server
|
||||
if strings.HasPrefix(r.Host, "conntest.") {
|
||||
handleConnectionTest(w)
|
||||
logging.Info("NAS", aurora.Yellow(r.Method), aurora.Cyan(r.URL), "via", aurora.Cyan(r.Host), "from", aurora.BrightCyan(r.RemoteAddr))
|
||||
moduleName := "NAS:" + r.RemoteAddr
|
||||
|
||||
if r.URL.String() == "/ac" || r.URL.String() == "/pr" || r.URL.String() == "/download" {
|
||||
handleAuthRequest(moduleName, w, r)
|
||||
return
|
||||
}
|
||||
|
||||
// TODO: Move this to its own server
|
||||
// Check for /payload
|
||||
if strings.HasPrefix(r.URL.String(), "/payload?") {
|
||||
handlePayloadRequest(moduleName, w, r)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,12 +4,13 @@ import (
|
|||
"bytes"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"github.com/logrusorgru/aurora/v3"
|
||||
"net"
|
||||
"sync"
|
||||
"time"
|
||||
"wwfc/common"
|
||||
"wwfc/logging"
|
||||
|
||||
"github.com/logrusorgru/aurora/v3"
|
||||
)
|
||||
|
||||
const (
|
||||
|
|
@ -121,7 +122,7 @@ func handleConnection(conn net.PacketConn, addr net.Addr, buffer []byte) {
|
|||
mutex.Lock()
|
||||
session, exists := sessions[cookie]
|
||||
if !exists {
|
||||
logging.Notice(moduleName, "Creating session")
|
||||
logging.Info(moduleName, "Creating session")
|
||||
session = &NATNEGSession{
|
||||
Cookie: cookie,
|
||||
Mutex: sync.RWMutex{},
|
||||
|
|
@ -149,7 +150,7 @@ func handleConnection(conn net.PacketConn, addr net.Addr, buffer []byte) {
|
|||
break
|
||||
|
||||
case NNInitRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("NNInitRequest"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("NNInitRequest"))
|
||||
session.handleInit(conn, addr, buffer[12:], moduleName, version)
|
||||
break
|
||||
|
||||
|
|
@ -162,11 +163,11 @@ func handleConnection(conn net.PacketConn, addr net.Addr, buffer []byte) {
|
|||
break
|
||||
|
||||
case NNErtTestReply:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("NNErtReply"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("NNErtReply"))
|
||||
break
|
||||
|
||||
case NNStateUpdate:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("NNStateUpdate"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("NNStateUpdate"))
|
||||
break
|
||||
|
||||
case NNConnectRequest:
|
||||
|
|
@ -174,16 +175,16 @@ func handleConnection(conn net.PacketConn, addr net.Addr, buffer []byte) {
|
|||
break
|
||||
|
||||
case NNConnectReply:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("NNConnectReply"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("NNConnectReply"))
|
||||
// TODO: Set the client Connected value to true here
|
||||
break
|
||||
|
||||
case NNConnectPing:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("NNConnectPing"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("NNConnectPing"))
|
||||
break
|
||||
|
||||
case NNBackupTestRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("NNBackupTestRequest"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("NNBackupTestRequest"))
|
||||
break
|
||||
|
||||
case NNBackupTestReply:
|
||||
|
|
@ -191,7 +192,7 @@ func handleConnection(conn net.PacketConn, addr net.Addr, buffer []byte) {
|
|||
break
|
||||
|
||||
case NNAddressCheckRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("NNAddressCheckRequest"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("NNAddressCheckRequest"))
|
||||
break
|
||||
|
||||
case NNAddressCheckReply:
|
||||
|
|
@ -199,11 +200,11 @@ func handleConnection(conn net.PacketConn, addr net.Addr, buffer []byte) {
|
|||
break
|
||||
|
||||
case NNNatifyRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("NNNatifyRequest"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("NNNatifyRequest"))
|
||||
break
|
||||
|
||||
case NNReportRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("NNReportRequest"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("NNReportRequest"))
|
||||
session.handleReport(conn, addr, buffer[12:], moduleName, version)
|
||||
break
|
||||
|
||||
|
|
@ -212,7 +213,7 @@ func handleConnection(conn net.PacketConn, addr net.Addr, buffer []byte) {
|
|||
break
|
||||
|
||||
case NNPreInitRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("NNPreInitRequest"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("NNPreInitRequest"))
|
||||
break
|
||||
|
||||
case NNPreInitReply:
|
||||
|
|
@ -316,7 +317,7 @@ func (session *NATNEGSession) handleInit(conn net.PacketConn, addr net.Addr, buf
|
|||
if !sender.isMapped() {
|
||||
return
|
||||
}
|
||||
logging.Notice(moduleName, "Mapped", aurora.BrightCyan(sender.NegotiateIP), aurora.BrightCyan(sender.LocalIP), aurora.BrightCyan(sender.ServerIP))
|
||||
logging.Info(moduleName, "Mapped", aurora.BrightCyan(sender.NegotiateIP), aurora.BrightCyan(sender.LocalIP), aurora.BrightCyan(sender.ServerIP))
|
||||
|
||||
for id, destination := range session.Clients {
|
||||
if id == clientIndex || destination.Connected || !destination.isMapped() {
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ func processResvOK(moduleName string, matchVersion int, reservation common.Match
|
|||
return true
|
||||
}
|
||||
|
||||
logging.Info(moduleName, "New player", aurora.BrightCyan(destination.Data["dwc_pid"]), "in group", aurora.Cyan(group.GroupName))
|
||||
logging.Notice(moduleName, "New player", aurora.BrightCyan(destination.Data["dwc_pid"]), "in group", aurora.Cyan(group.GroupName))
|
||||
|
||||
group.LastJoinIndex++
|
||||
destination.Data["+joinindex"] = strconv.Itoa(group.LastJoinIndex)
|
||||
|
|
@ -142,7 +142,7 @@ func ProcessGPStatusUpdate(profileID uint32, senderIP uint64, status string) {
|
|||
|
||||
login, exists := logins[profileID]
|
||||
if !exists || login == nil {
|
||||
logging.Error(moduleName, "Received status update for non-existent profile ID", aurora.Cyan(profileID))
|
||||
logging.Info(moduleName, "Received status update for non-existent profile ID", aurora.Cyan(profileID))
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -50,22 +50,12 @@ func heartbeat(moduleName string, conn net.PacketConn, addr net.Addr, buffer []b
|
|||
lookupAddr := makeLookupAddr(addr.String())
|
||||
|
||||
statechanged, ok := payload["statechanged"]
|
||||
if ok {
|
||||
if statechanged == "1" {
|
||||
// TODO: This would be a good place to run the server->client message exploit
|
||||
// for DNS patcher games that require code patches. The status code should be
|
||||
// set to 5 at this point (if publicip is not 0), which is required.
|
||||
logging.Notice(moduleName, "Client session update")
|
||||
// Fall through
|
||||
}
|
||||
|
||||
if statechanged == "2" {
|
||||
logging.Notice(moduleName, "Client session shutdown")
|
||||
mutex.Lock()
|
||||
removeSession(lookupAddr)
|
||||
mutex.Unlock()
|
||||
return
|
||||
}
|
||||
if ok && statechanged == "2" {
|
||||
logging.Notice(moduleName, "Client session shutdown")
|
||||
mutex.Lock()
|
||||
removeSession(lookupAddr)
|
||||
mutex.Unlock()
|
||||
return
|
||||
}
|
||||
|
||||
session, ok := setSessionData(moduleName, addr, sessionId, payload)
|
||||
|
|
@ -76,21 +66,20 @@ func heartbeat(moduleName string, conn net.PacketConn, addr net.Addr, buffer []b
|
|||
if payload["gamename"] == "mariokartwii" && len(unknowns) > 0 {
|
||||
// Try to login using the first unknown as a profile ID
|
||||
// This makes it possible to execute the exploit on the client sooner
|
||||
profileId := unknowns[0]
|
||||
logging.Notice(moduleName, "Attempting to use unknown as profile ID", aurora.Cyan(profileId))
|
||||
|
||||
mutex.Lock()
|
||||
session, sessionExists := sessions[lookupAddr]
|
||||
if !sessionExists {
|
||||
logging.Error(moduleName, "Session not found")
|
||||
} else {
|
||||
} else if session.Login == nil {
|
||||
profileId := unknowns[0]
|
||||
logging.Info(moduleName, "Attempting to use unknown as profile ID", aurora.Cyan(profileId))
|
||||
session.setProfileID(moduleName, profileId)
|
||||
}
|
||||
mutex.Unlock()
|
||||
}
|
||||
|
||||
if !session.Authenticated {
|
||||
logging.Notice(moduleName, "Sending challenge")
|
||||
sendChallenge(conn, addr, session, lookupAddr)
|
||||
} else if !session.ExploitReceived && session.Login != nil && session.Login.NeedsExploit && statechanged == "1" {
|
||||
logging.Notice(moduleName, "Sending SBCM exploit to DNS patcher client")
|
||||
|
|
|
|||
24
qr2/main.go
24
qr2/main.go
|
|
@ -78,11 +78,11 @@ func handleConnection(conn net.PacketConn, addr net.Addr, buffer []byte) {
|
|||
|
||||
switch packetType {
|
||||
case QueryRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("QUERY"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("QUERY"))
|
||||
break
|
||||
|
||||
case ChallengeRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("CHALLENGE"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("CHALLENGE"))
|
||||
|
||||
mutex.Lock()
|
||||
if session.Challenge != "" {
|
||||
|
|
@ -97,28 +97,28 @@ func handleConnection(conn net.PacketConn, addr net.Addr, buffer []byte) {
|
|||
break
|
||||
|
||||
case EchoRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("ECHO"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("ECHO"))
|
||||
break
|
||||
|
||||
case HeartbeatRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("HEARTBEAT"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("HEARTBEAT"))
|
||||
heartbeat(moduleName, conn, addr, buffer)
|
||||
break
|
||||
|
||||
case AddErrorRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("ADDERROR"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("ADDERROR"))
|
||||
break
|
||||
|
||||
case EchoResponseRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("ECHO_RESPONSE"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("ECHO_RESPONSE"))
|
||||
break
|
||||
|
||||
case ClientMessageRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("CLIENT_MESSAGE"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("CLIENT_MESSAGE"))
|
||||
return
|
||||
|
||||
case ClientMessageAckRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("CLIENT_MESSAGE_ACK"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("CLIENT_MESSAGE_ACK"))
|
||||
|
||||
// In case ClientExploitReply is lost, this can be checked as well
|
||||
// This would be sent either after the payload is downloaded, or the client is already patched
|
||||
|
|
@ -126,23 +126,23 @@ func handleConnection(conn net.PacketConn, addr net.Addr, buffer []byte) {
|
|||
return
|
||||
|
||||
case KeepAliveRequest:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("KEEPALIVE"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("KEEPALIVE"))
|
||||
mutex.Lock()
|
||||
session.LastKeepAlive = time.Now().Unix()
|
||||
mutex.Unlock()
|
||||
return
|
||||
|
||||
case AvailableRequest:
|
||||
logging.Notice("QR2", "Command:", aurora.Yellow("AVAILABLE"))
|
||||
logging.Info("QR2", "Command:", aurora.Yellow("AVAILABLE"))
|
||||
conn.WriteTo(createResponseHeader(AvailableRequest, 0), addr)
|
||||
return
|
||||
|
||||
case ClientRegisteredReply:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("CLIENT_REGISTERED"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("CLIENT_REGISTERED"))
|
||||
break
|
||||
|
||||
case ClientExploitReply:
|
||||
logging.Notice(moduleName, "Command:", aurora.Yellow("CLIENT_EXPLOIT_ACK"))
|
||||
logging.Info(moduleName, "Command:", aurora.Yellow("CLIENT_EXPLOIT_ACK"))
|
||||
|
||||
session.ExploitReceived = true
|
||||
break
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ func setSessionData(moduleName string, addr net.Addr, sessionId uint32, payload
|
|||
}
|
||||
|
||||
if !sessionExists {
|
||||
logging.Notice(moduleName, "Creating session", aurora.Cyan(sessionId).String())
|
||||
logging.Info(moduleName, "Creating session", aurora.Cyan(sessionId).String())
|
||||
|
||||
// Set search ID
|
||||
for {
|
||||
|
|
|
|||
|
|
@ -3,11 +3,12 @@ package sake
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/jackc/pgx/v4/pgxpool"
|
||||
"github.com/logrusorgru/aurora/v3"
|
||||
"net/http"
|
||||
"wwfc/common"
|
||||
"wwfc/logging"
|
||||
|
||||
"github.com/jackc/pgx/v4/pgxpool"
|
||||
"github.com/logrusorgru/aurora/v3"
|
||||
)
|
||||
|
||||
var (
|
||||
|
|
@ -35,7 +36,7 @@ func StartServer() {
|
|||
}
|
||||
|
||||
func HandleRequest(w http.ResponseWriter, r *http.Request) {
|
||||
logging.Notice("SAKE", aurora.Yellow(r.Method), aurora.Cyan(r.URL), "via", aurora.Cyan(r.Host), "from", aurora.BrightCyan(r.RemoteAddr))
|
||||
logging.Info("SAKE", aurora.Yellow(r.Method), aurora.Cyan(r.URL), "via", aurora.Cyan(r.Host), "from", aurora.BrightCyan(r.RemoteAddr))
|
||||
|
||||
switch r.URL.String() {
|
||||
case "/SakeStorageServer/StorageServer.asmx":
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ package sake
|
|||
import (
|
||||
"encoding/base64"
|
||||
"encoding/xml"
|
||||
"github.com/logrusorgru/aurora/v3"
|
||||
"io"
|
||||
"net/http"
|
||||
"regexp"
|
||||
|
|
@ -12,6 +11,8 @@ import (
|
|||
"wwfc/common"
|
||||
"wwfc/database"
|
||||
"wwfc/logging"
|
||||
|
||||
"github.com/logrusorgru/aurora/v3"
|
||||
)
|
||||
|
||||
const (
|
||||
|
|
@ -140,7 +141,7 @@ func handleStorageRequest(moduleName string, w http.ResponseWriter, r *http.Requ
|
|||
|
||||
xmlName := soap.Body.Data.XMLName.Space + "/" + soap.Body.Data.XMLName.Local
|
||||
if headerAction == xmlName || headerAction == `"`+xmlName+`"` {
|
||||
logging.Notice(moduleName, "SOAPAction:", aurora.Yellow(soap.Body.Data.XMLName.Local))
|
||||
logging.Info(moduleName, "SOAPAction:", aurora.Yellow(soap.Body.Data.XMLName.Local))
|
||||
|
||||
if profileId, gameInfo, ok := getRequestIdentity(moduleName, soap.Body.Data); ok {
|
||||
switch xmlName {
|
||||
|
|
@ -268,7 +269,7 @@ func getMyRecords(moduleName string, profileId uint32, gameInfo common.GameInfo,
|
|||
}
|
||||
}
|
||||
|
||||
logging.Notice(moduleName, "Wrote", aurora.Cyan(fieldCount), "field(s)")
|
||||
logging.Info(moduleName, "Wrote", aurora.Cyan(fieldCount), "field(s)")
|
||||
return &response
|
||||
}
|
||||
|
||||
|
|
@ -382,6 +383,6 @@ func searchForRecords(moduleName string, gameInfo common.GameInfo, request Stora
|
|||
}
|
||||
}
|
||||
|
||||
logging.Notice(moduleName, "Wrote", aurora.BrightCyan(fieldCount), "field(s) across", aurora.BrightCyan(i), "record(s)")
|
||||
logging.Info(moduleName, "Wrote", aurora.BrightCyan(fieldCount), "field(s) across", aurora.BrightCyan(i), "record(s)")
|
||||
return &response
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,13 +6,14 @@ import (
|
|||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/jackc/pgx/v4/pgxpool"
|
||||
"github.com/logrusorgru/aurora/v3"
|
||||
"io"
|
||||
"net"
|
||||
"os"
|
||||
"wwfc/common"
|
||||
"wwfc/logging"
|
||||
|
||||
"github.com/jackc/pgx/v4/pgxpool"
|
||||
"github.com/logrusorgru/aurora/v3"
|
||||
)
|
||||
|
||||
var (
|
||||
|
|
@ -86,10 +87,10 @@ func handleRequest(conn net.Conn) {
|
|||
|
||||
err := conn.(*net.TCPConn).SetKeepAlive(true)
|
||||
if err != nil {
|
||||
logging.Notice(ModuleName, "Unable to set keepalive", err.Error())
|
||||
logging.Error(ModuleName, "Unable to set keepalive", err.Error())
|
||||
}
|
||||
|
||||
logging.Notice(ModuleName, "Connection established from", aurora.BrightCyan(conn.RemoteAddr()))
|
||||
logging.Info(ModuleName, "Connection established from", aurora.BrightCyan(conn.RemoteAddr()))
|
||||
|
||||
// Here we go into the listening loop
|
||||
bufferSize := 0
|
||||
|
|
@ -119,11 +120,11 @@ func handleRequest(conn net.Conn) {
|
|||
readSize, err := bufio.NewReader(conn).Read(buffer[bufferSize:])
|
||||
if err != nil {
|
||||
if errors.Is(err, io.EOF) {
|
||||
logging.Notice(ModuleName, "Connection closed")
|
||||
logging.Info(ModuleName, "Connection closed")
|
||||
return
|
||||
}
|
||||
|
||||
logging.Error(ModuleName, "Connection error")
|
||||
logging.Error(ModuleName, "Connection error:", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
@ -132,29 +133,29 @@ func handleRequest(conn net.Conn) {
|
|||
|
||||
switch buffer[2] {
|
||||
case ServerListRequest:
|
||||
logging.Notice(ModuleName, "Command:", aurora.Yellow("SERVER_LIST_REQUEST"))
|
||||
logging.Info(ModuleName, "Command:", aurora.Yellow("SERVER_LIST_REQUEST"))
|
||||
handleServerListRequest(conn, buffer[:packetSize])
|
||||
break
|
||||
|
||||
case ServerInfoRequest:
|
||||
logging.Notice(ModuleName, "Command:", aurora.Yellow("SERVER_INFO_REQUEST"))
|
||||
logging.Info(ModuleName, "Command:", aurora.Yellow("SERVER_INFO_REQUEST"))
|
||||
break
|
||||
|
||||
case SendMessageRequest:
|
||||
logging.Notice(ModuleName, "Command:", aurora.Yellow("SEND_MESSAGE_REQUEST"))
|
||||
logging.Info(ModuleName, "Command:", aurora.Yellow("SEND_MESSAGE_REQUEST"))
|
||||
handleSendMessageRequest(conn, buffer[:packetSize])
|
||||
break
|
||||
|
||||
case KeepaliveReply:
|
||||
logging.Notice(ModuleName, "Command:", aurora.Yellow("KEEPALIVE_REPLY"))
|
||||
logging.Info(ModuleName, "Command:", aurora.Yellow("KEEPALIVE_REPLY"))
|
||||
break
|
||||
|
||||
case MapLoopRequest:
|
||||
logging.Notice(ModuleName, "Command:", aurora.Yellow("MAPLOOP_REQUEST"))
|
||||
logging.Info(ModuleName, "Command:", aurora.Yellow("MAPLOOP_REQUEST"))
|
||||
break
|
||||
|
||||
case PlayerSearchRequest:
|
||||
logging.Notice(ModuleName, "Command:", aurora.Yellow("PLAYER_SEARCH_REQUEST"))
|
||||
logging.Info(ModuleName, "Command:", aurora.Yellow("PLAYER_SEARCH_REQUEST"))
|
||||
break
|
||||
|
||||
default:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user