mirror of
https://github.com/Mezeporta/Erupe.git
synced 2026-03-22 07:32:32 +01:00
refactor: standardize logging on zap across all packages
Replace all fmt.Printf/Println and log.Printf/Fatal with structured zap.Logger calls to eliminate inconsistent logging (anti-pattern #12). - network/crypt_conn: inject logger via NewCryptConn, replace 6 fmt calls - signserver/session: use existing s.logger for debug packet dumps - entranceserver: use s.logger for inbound/outbound debug logging - api/utils: accept logger param in verifyPath, replace fmt.Println - api/endpoints: use s.logger for screenshot path diagnostics - config: replace log.Fatal with error return in getOutboundIP4 - deltacomp: replace log.Printf with zap.L() global logger
This commit is contained in:
@@ -5,8 +5,8 @@ import (
|
||||
"encoding/json"
|
||||
"encoding/xml"
|
||||
"errors"
|
||||
_config "erupe-ce/config"
|
||||
"erupe-ce/common/gametime"
|
||||
_config "erupe-ce/config"
|
||||
"fmt"
|
||||
"image"
|
||||
"image/jpeg"
|
||||
@@ -317,6 +317,7 @@ func (s *APIServer) ExportSave(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Add("Content-Type", "application/json")
|
||||
_ = json.NewEncoder(w).Encode(save)
|
||||
}
|
||||
|
||||
// ScreenShotGet handles GET /api/ss/bbs/{id}, serving a previously uploaded
|
||||
// screenshot image by its token ID.
|
||||
func (s *APIServer) ScreenShotGet(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -331,12 +332,12 @@ func (s *APIServer) ScreenShotGet(w http.ResponseWriter, r *http.Request) {
|
||||
// Open the image file
|
||||
safePath := s.erupeConfig.Screenshots.OutputDir
|
||||
path := filepath.Join(safePath, fmt.Sprintf("%s.jpg", token))
|
||||
result, err := verifyPath(path, safePath)
|
||||
result, err := verifyPath(path, safePath, s.logger)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println("Error " + err.Error())
|
||||
s.logger.Warn("Screenshot path verification failed", zap.Error(err))
|
||||
} else {
|
||||
fmt.Println("Canonical: " + result)
|
||||
s.logger.Debug("Screenshot canonical path", zap.String("path", result))
|
||||
|
||||
file, err := os.Open(result)
|
||||
if err != nil {
|
||||
@@ -353,6 +354,7 @@ func (s *APIServer) ScreenShotGet(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ScreenShot handles POST /api/ss/bbs/upload.php, accepting a JPEG image
|
||||
// upload from the game client and saving it to the configured output directory.
|
||||
func (s *APIServer) ScreenShot(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -402,7 +404,7 @@ func (s *APIServer) ScreenShot(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
safePath := s.erupeConfig.Screenshots.OutputDir
|
||||
path := filepath.Join(safePath, fmt.Sprintf("%s.jpg", token))
|
||||
verified, err := verifyPath(path, safePath)
|
||||
verified, err := verifyPath(path, safePath, s.logger)
|
||||
if err != nil {
|
||||
writeResult("500")
|
||||
return
|
||||
|
||||
@@ -35,13 +35,12 @@ func NewTestConfig() *_config.Config {
|
||||
MaxLauncherHR: false,
|
||||
},
|
||||
GameplayOptions: _config.GameplayOptions{
|
||||
MezFesSoloTickets: 100,
|
||||
MezFesGroupTickets: 50,
|
||||
MezFesDuration: 604800, // 1 week
|
||||
MezFesSwitchMinigame: false,
|
||||
MezFesSoloTickets: 100,
|
||||
MezFesGroupTickets: 50,
|
||||
MezFesDuration: 604800, // 1 week
|
||||
MezFesSwitchMinigame: false,
|
||||
},
|
||||
LoginNotices: []string{"Welcome to Erupe!"},
|
||||
LoginNotices: []string{"Welcome to Erupe!"},
|
||||
HideLoginNotice: false,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,8 +2,9 @@ package api
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
func inTrustedRoot(path string, trustedRoot string) error {
|
||||
@@ -16,20 +17,20 @@ func inTrustedRoot(path string, trustedRoot string) error {
|
||||
return errors.New("path is outside of trusted root")
|
||||
}
|
||||
|
||||
func verifyPath(path string, trustedRoot string) (string, error) {
|
||||
func verifyPath(path string, trustedRoot string, logger *zap.Logger) (string, error) {
|
||||
|
||||
c := filepath.Clean(path)
|
||||
fmt.Println("Cleaned path: " + c)
|
||||
logger.Debug("Cleaned path", zap.String("path", c))
|
||||
|
||||
r, err := filepath.EvalSymlinks(c)
|
||||
if err != nil {
|
||||
fmt.Println("Error " + err.Error())
|
||||
logger.Warn("Path verification failed", zap.Error(err))
|
||||
return c, errors.New("unsafe or invalid path specified")
|
||||
}
|
||||
|
||||
err = inTrustedRoot(r, trustedRoot)
|
||||
if err != nil {
|
||||
fmt.Println("Error " + err.Error())
|
||||
logger.Warn("Path outside trusted root", zap.Error(err))
|
||||
return r, errors.New("unsafe or invalid path specified")
|
||||
} else {
|
||||
return r, nil
|
||||
|
||||
@@ -3,8 +3,10 @@ package api
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
func TestInTrustedRoot(t *testing.T) {
|
||||
@@ -131,7 +133,7 @@ func TestVerifyPath(t *testing.T) {
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
result, err := verifyPath(tt.path, tt.trustedRoot)
|
||||
result, err := verifyPath(tt.path, tt.trustedRoot, zap.NewNop())
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("verifyPath() error = %v, wantErr %v", err, tt.wantErr)
|
||||
}
|
||||
@@ -171,7 +173,7 @@ func TestVerifyPathWithSymlinks(t *testing.T) {
|
||||
}
|
||||
|
||||
// Verify that symlink pointing outside is detected
|
||||
_, err := verifyPath(symlinkPath, safeDir)
|
||||
_, err := verifyPath(symlinkPath, safeDir, zap.NewNop())
|
||||
if err == nil {
|
||||
t.Errorf("verifyPath() should reject symlink pointing outside trusted root")
|
||||
}
|
||||
@@ -188,7 +190,7 @@ func BenchmarkVerifyPath(b *testing.B) {
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
_, _ = verifyPath(testPath, safeDir)
|
||||
_, _ = verifyPath(testPath, safeDir, zap.NewNop())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user