aboutsummaryrefslogtreecommitdiff
path: root/server_conn.go
diff options
context:
space:
mode:
Diffstat (limited to 'server_conn.go')
-rw-r--r--server_conn.go417
1 files changed, 1 insertions, 416 deletions
diff --git a/server_conn.go b/server_conn.go
index c876b1d..6fde1c7 100644
--- a/server_conn.go
+++ b/server_conn.go
@@ -4,11 +4,9 @@ import (
"errors"
"log"
"net"
- "strings"
"sync"
"time"
- "github.com/HimbeerserverDE/srp"
"github.com/anon55555/mt"
"github.com/anon55555/mt/rudp"
)
@@ -138,419 +136,6 @@ func handleSrv(sc *ServerConn) {
continue
}
- clt := sc.client()
- if clt == nil {
- sc.Log("<-", "no client")
- continue
- }
-
- switch cmd := pkt.Cmd.(type) {
- case *mt.ToCltHello:
- if sc.auth.method != 0 {
- sc.Log("<-", "unexpected authentication")
- sc.Close()
- break
- }
-
- sc.setState(sc.state() + 1)
- if cmd.AuthMethods&mt.FirstSRP != 0 {
- sc.auth.method = mt.FirstSRP
- } else {
- sc.auth.method = mt.SRP
- }
-
- if cmd.SerializeVer != latestSerializeVer {
- sc.Log("<-", "invalid serializeVer")
- break
- }
-
- switch sc.auth.method {
- case mt.SRP:
- sc.auth.srpA, sc.auth.a, err = srp.InitiateHandshake()
- if err != nil {
- sc.Log("->", err)
- break
- }
-
- sc.SendCmd(&mt.ToSrvSRPBytesA{
- A: sc.auth.srpA,
- NoSHA1: true,
- })
- case mt.FirstSRP:
- salt, verifier, err := srp.NewClient([]byte(clt.name), []byte{})
- if err != nil {
- sc.Log("->", err)
- break
- }
-
- sc.SendCmd(&mt.ToSrvFirstSRP{
- Salt: salt,
- Verifier: verifier,
- EmptyPasswd: true,
- })
- default:
- sc.Log("<->", "invalid auth method")
- sc.Close()
- }
- case *mt.ToCltSRPBytesSaltB:
- if sc.auth.method != mt.SRP {
- sc.Log("<-", "multiple authentication attempts")
- break
- }
-
- sc.auth.srpK, err = srp.CompleteHandshake(sc.auth.srpA, sc.auth.a, []byte(clt.name), []byte{}, cmd.Salt, cmd.B)
- if err != nil {
- sc.Log("->", err)
- break
- }
-
- M := srp.ClientProof([]byte(clt.name), cmd.Salt, sc.auth.srpA, cmd.B, sc.auth.srpK)
- if M == nil {
- sc.Log("<-", "SRP safety check fail")
- break
- }
-
- sc.SendCmd(&mt.ToSrvSRPBytesM{
- M: M,
- })
- case *mt.ToCltDisco:
- sc.Log("<-", "deny access", cmd)
- ack, _ := clt.SendCmd(cmd)
-
- select {
- case <-clt.Closed():
- case <-ack:
- clt.Close()
-
- sc.mu.Lock()
- sc.clt = nil
- sc.mu.Unlock()
- }
- case *mt.ToCltAcceptAuth:
- sc.auth = struct {
- method mt.AuthMethods
- salt, srpA, a, srpK []byte
- }{}
- sc.SendCmd(&mt.ToSrvInit2{Lang: clt.lang})
- case *mt.ToCltDenySudoMode:
- sc.Log("<-", "deny sudo")
- case *mt.ToCltAcceptSudoMode:
- sc.Log("<-", "accept sudo")
- sc.setState(sc.state() + 1)
- case *mt.ToCltAnnounceMedia:
- sc.SendCmd(&mt.ToSrvReqMedia{})
-
- sc.SendCmd(&mt.ToSrvCltReady{
- Major: clt.major,
- Minor: clt.minor,
- Patch: clt.patch,
- Reserved: clt.reservedVer,
- Version: clt.versionStr,
- Formspec: clt.formspecVer,
- })
-
- sc.Log("<->", "handshake completed")
- sc.setState(sc.state() + 1)
- close(sc.initCh)
- case *mt.ToCltInv:
- var oldInv mt.Inv
- copy(oldInv, sc.inv)
- sc.inv.Deserialize(strings.NewReader(cmd.Inv))
- sc.prependInv(sc.inv)
-
- handStack := mt.Stack{
- Item: mt.Item{
- Name: sc.name + "_hand",
- },
- Count: 1,
- }
-
- hand := sc.inv.List("hand")
- if hand == nil {
- sc.inv = append(sc.inv, mt.NamedInvList{
- Name: "hand",
- InvList: mt.InvList{
- Width: 0,
- Stacks: []mt.Stack{handStack},
- },
- })
- } else if len(hand.Stacks) == 0 {
- hand.Width = 0
- hand.Stacks = []mt.Stack{handStack}
- }
-
- b := &strings.Builder{}
- sc.inv.SerializeKeep(b, oldInv)
-
- clt.SendCmd(&mt.ToCltInv{Inv: b.String()})
- case *mt.ToCltAOMsgs:
- for k := range cmd.Msgs {
- sc.swapAOID(&cmd.Msgs[k].ID)
- sc.handleAOMsg(cmd.Msgs[k].Msg)
- }
-
- clt.SendCmd(cmd)
- case *mt.ToCltAORmAdd:
- resp := &mt.ToCltAORmAdd{}
-
- for _, ao := range cmd.Remove {
- delete(sc.aos, ao)
- resp.Remove = append(resp.Remove, ao)
- }
-
- for _, ao := range cmd.Add {
- if ao.InitData.Name == clt.name {
- clt.currentCAO = ao.ID
-
- if clt.playerCAO == 0 {
- clt.playerCAO = ao.ID
- for _, msg := range ao.InitData.Msgs {
- sc.handleAOMsg(msg)
- }
-
- resp.Add = append(resp.Add, ao)
- } else {
- var msgs []mt.IDAOMsg
- for _, msg := range ao.InitData.Msgs {
- msgs = append(msgs, mt.IDAOMsg{
- ID: ao.ID,
- Msg: msg,
- })
- }
-
- clt.SendCmd(&mt.ToCltAOMsgs{Msgs: msgs})
- }
- } else {
- sc.swapAOID(&ao.ID)
- for _, msg := range ao.InitData.Msgs {
- sc.handleAOMsg(msg)
- }
-
- resp.Add = append(resp.Add, ao)
- sc.aos[ao.ID] = struct{}{}
- }
- }
-
- clt.SendCmd(resp)
- case *mt.ToCltCSMRestrictionFlags:
- if !Conf().DropCSMRF {
- cmd.Flags &= ^mt.NoCSMs
- clt.SendCmd(cmd)
- }
- case *mt.ToCltDetachedInv:
- var inv mt.Inv
- inv.Deserialize(strings.NewReader(cmd.Inv))
- sc.prependInv(inv)
-
- b := &strings.Builder{}
- inv.Serialize(b)
-
- if cmd.Keep {
- sc.detachedInvs = append(sc.detachedInvs, cmd.Name)
- } else {
- for i, name := range sc.detachedInvs {
- if name == cmd.Name {
- sc.detachedInvs = append(sc.detachedInvs[:i], sc.detachedInvs[i+1:]...)
- break
- }
- }
- }
-
- clt.SendCmd(&mt.ToCltDetachedInv{
- Name: cmd.Name,
- Keep: cmd.Keep,
- Len: cmd.Len,
- Inv: b.String(),
- })
- case *mt.ToCltMediaPush:
- var exit bool
- for _, f := range clt.media {
- if f.name == cmd.Filename {
- exit = true
- break
- }
- }
-
- if exit {
- break
- }
-
- prepend(sc.name, &cmd.Filename)
- clt.SendCmd(cmd)
- case *mt.ToCltSkyParams:
- for i := range cmd.Textures {
- prependTexture(sc.name, &cmd.Textures[i])
- }
- clt.SendCmd(cmd)
- case *mt.ToCltSunParams:
- prependTexture(sc.name, &cmd.Texture)
- prependTexture(sc.name, &cmd.ToneMap)
- prependTexture(sc.name, &cmd.Rise)
- clt.SendCmd(cmd)
- case *mt.ToCltMoonParams:
- prependTexture(sc.name, &cmd.Texture)
- prependTexture(sc.name, &cmd.ToneMap)
- clt.SendCmd(cmd)
- case *mt.ToCltSetHotbarParam:
- prependTexture(sc.name, &cmd.Img)
- clt.SendCmd(cmd)
- case *mt.ToCltUpdatePlayerList:
- if !clt.playerListInit {
- clt.playerListInit = true
- } else if cmd.Type == mt.InitPlayers {
- cmd.Type = mt.AddPlayers
- }
-
- if cmd.Type <= mt.AddPlayers {
- for _, player := range cmd.Players {
- sc.playerList[player] = struct{}{}
- }
- } else if cmd.Type == mt.RemovePlayers {
- for _, player := range cmd.Players {
- delete(sc.playerList, player)
- }
- }
-
- clt.SendCmd(cmd)
- case *mt.ToCltSpawnParticle:
- prependTexture(sc.name, &cmd.Texture)
- sc.globalParam0(&cmd.NodeParam0)
- clt.SendCmd(cmd)
- case *mt.ToCltBlkData:
- for i := range cmd.Blk.Param0 {
- sc.globalParam0(&cmd.Blk.Param0[i])
- }
-
- for k := range cmd.Blk.NodeMetas {
- for j, field := range cmd.Blk.NodeMetas[k].Fields {
- if field.Name == "formspec" {
- sc.prependFormspec(&cmd.Blk.NodeMetas[k].Fields[j].Value)
- break
- }
- }
- sc.prependInv(cmd.Blk.NodeMetas[k].Inv)
- }
-
- clt.SendCmd(cmd)
- case *mt.ToCltAddNode:
- sc.globalParam0(&cmd.Node.Param0)
- clt.SendCmd(cmd)
- case *mt.ToCltAddParticleSpawner:
- prependTexture(sc.name, &cmd.Texture)
- sc.swapAOID(&cmd.AttachedAOID)
- sc.globalParam0(&cmd.NodeParam0)
- sc.particleSpawners[cmd.ID] = struct{}{}
-
- clt.SendCmd(cmd)
- case *mt.ToCltDelParticleSpawner:
- delete(sc.particleSpawners, cmd.ID)
- clt.SendCmd(cmd)
- case *mt.ToCltPlaySound:
- prepend(sc.name, &cmd.Name)
- sc.swapAOID(&cmd.SrcAOID)
- if cmd.Loop {
- sc.sounds[cmd.ID] = struct{}{}
- }
-
- clt.SendCmd(cmd)
- case *mt.ToCltFadeSound:
- delete(sc.sounds, cmd.ID)
- clt.SendCmd(cmd)
- case *mt.ToCltStopSound:
- delete(sc.sounds, cmd.ID)
- clt.SendCmd(cmd)
- case *mt.ToCltAddHUD:
- sc.prependHUD(cmd.Type, cmd)
-
- sc.huds[cmd.ID] = cmd.Type
- clt.SendCmd(cmd)
- case *mt.ToCltChangeHUD:
- sc.prependHUD(sc.huds[cmd.ID], cmd)
- clt.SendCmd(cmd)
- case *mt.ToCltRmHUD:
- delete(sc.huds, cmd.ID)
- clt.SendCmd(cmd)
- case *mt.ToCltShowFormspec:
- sc.prependFormspec(&cmd.Formspec)
- clt.SendCmd(cmd)
- case *mt.ToCltFormspecPrepend:
- sc.prependFormspec(&cmd.Prepend)
- clt.SendCmd(cmd)
- case *mt.ToCltInvFormspec:
- sc.prependFormspec(&cmd.Formspec)
- clt.SendCmd(cmd)
- case *mt.ToCltMinimapModes:
- for i := range cmd.Modes {
- prependTexture(sc.name, &cmd.Modes[i].Texture)
- }
- clt.SendCmd(cmd)
- case *mt.ToCltNodeMetasChanged:
- for k := range cmd.Changed {
- for i, field := range cmd.Changed[k].Fields {
- if field.Name == "formspec" {
- sc.prependFormspec(&cmd.Changed[k].Fields[i].Value)
- break
- }
- }
- sc.prependInv(cmd.Changed[k].Inv)
- }
- clt.SendCmd(cmd)
- case *mt.ToCltAddPlayerVel:
- clt.SendCmd(cmd)
- case *mt.ToCltBreath:
- clt.SendCmd(cmd)
- case *mt.ToCltChatMsg:
- clt.SendCmd(cmd)
- case *mt.ToCltCloudParams:
- clt.SendCmd(cmd)
- case *mt.ToCltDeathScreen:
- clt.SendCmd(cmd)
- case *mt.ToCltEyeOffset:
- clt.SendCmd(cmd)
- case *mt.ToCltFOV:
- clt.SendCmd(cmd)
- case *mt.ToCltHP:
- clt.SendCmd(cmd)
- case *mt.ToCltHUDFlags:
- clt.SendCmd(cmd)
- case *mt.ToCltLocalPlayerAnim:
- clt.SendCmd(cmd)
- case *mt.ToCltModChanMsg:
- clt.SendCmd(cmd)
- case *mt.ToCltModChanSig:
- var exit bool
- switch cmd.Signal {
- case mt.JoinOK:
- if _, ok := clt.modChs[cmd.Channel]; ok {
- exit = true
- break
- }
- clt.modChs[cmd.Channel] = struct{}{}
- case mt.JoinFail:
- fallthrough
- case mt.LeaveOK:
- delete(clt.modChs, cmd.Channel)
- }
-
- if exit {
- break
- }
-
- clt.SendCmd(cmd)
- case *mt.ToCltMovePlayer:
- clt.SendCmd(cmd)
- case *mt.ToCltMovement:
- clt.SendCmd(cmd)
- case *mt.ToCltOverrideDayNightRatio:
- clt.SendCmd(cmd)
- case *mt.ToCltPrivs:
- clt.SendCmd(cmd)
- case *mt.ToCltRemoveNode:
- clt.SendCmd(cmd)
- case *mt.ToCltStarParams:
- clt.SendCmd(cmd)
- case *mt.ToCltTimeOfDay:
- clt.SendCmd(cmd)
- }
+ sc.process(pkt)
}
}