Add log verbosity option

This commit is contained in:
mkwcat 2024-01-06 22:38:57 -05:00
parent 4e14aa8a4c
commit a50ffdd46c
No known key found for this signature in database
GPG Key ID: 7A505679CE9E7AA9
20 changed files with 141 additions and 113 deletions

View File

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

View File

@ -12,4 +12,7 @@
<!-- Database information-->
<databaseAddress>127.0.0.1</databaseAddress>
<databaseName>wwfc</databaseName>
<!-- Log verbosity -->
<logLevel>4</logLevel>
</Config>

View File

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

View File

@ -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.",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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":

View File

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

View File

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