]> git.r.bdr.sh - rbdr/mobius/blobdiff - hotline/server.go
Refactor listener setup
[rbdr/mobius] / hotline / server.go
index 768433bc60b253f853c3b944580467e150344fc5..b1d8849032cce8db50159a453f8273ac89f14381 100644 (file)
@@ -1,6 +1,7 @@
 package hotline
 
 import (
 package hotline
 
 import (
+       "bytes"
        "context"
        "encoding/binary"
        "errors"
        "context"
        "encoding/binary"
        "errors"
@@ -31,6 +32,8 @@ const (
        trackerUpdateFrequency = 300 // time in seconds between tracker re-registration
 )
 
        trackerUpdateFrequency = 300 // time in seconds between tracker re-registration
 )
 
+var nostalgiaVersion = []byte{0, 0, 2, 0x2c} // version ID used by the Nostalgia client
+
 type Server struct {
        Port          int
        Accounts      map[string]*Account
 type Server struct {
        Port          int
        Accounts      map[string]*Account
@@ -47,8 +50,6 @@ type Server struct {
        TrackerPassID [4]byte
        Stats         *Stats
 
        TrackerPassID [4]byte
        Stats         *Stats
 
-       APIListener  net.Listener
-       FileListener net.Listener
 
        // newsReader io.Reader
        // newsWriter io.WriteCloser
 
        // newsReader io.Reader
        // newsWriter io.WriteCloser
@@ -74,10 +75,25 @@ func (s *Server) ListenAndServe(ctx context.Context, cancelRoot context.CancelFu
        var wg sync.WaitGroup
 
        wg.Add(1)
        var wg sync.WaitGroup
 
        wg.Add(1)
-       go func() { s.Logger.Fatal(s.Serve(ctx, cancelRoot, s.APIListener)) }()
+       go func() {
+               ln, err := net.Listen("tcp", fmt.Sprintf("%s:%v", "", s.Port))
+               if err != nil {
+                       s.Logger.Fatal(err)
+               }
+
+               s.Logger.Fatal(s.Serve(ctx, cancelRoot, ln))
+       }()
 
        wg.Add(1)
 
        wg.Add(1)
-       go func() { s.Logger.Fatal(s.ServeFileTransfers(s.FileListener)) }()
+       go func() {
+               ln, err := net.Listen("tcp", fmt.Sprintf("%s:%v", "", s.Port+1))
+               if err != nil {
+                       s.Logger.Fatal(err)
+
+               }
+
+               s.Logger.Fatal(s.ServeFileTransfers(ln))
+       }()
 
        wg.Wait()
 
 
        wg.Wait()
 
@@ -187,17 +203,7 @@ func NewServer(configDir, netInterface string, netPort int, logger *zap.SugaredL
                ThreadedNews:  &ThreadedNews{},
        }
 
                ThreadedNews:  &ThreadedNews{},
        }
 
-       ln, err := net.Listen("tcp", fmt.Sprintf("%s:%v", netInterface, netPort))
-       if err != nil {
-               return nil, err
-       }
-       server.APIListener = ln
-
-       ln2, err := net.Listen("tcp", fmt.Sprintf("%s:%v", netInterface, netPort+1))
-       server.FileListener = ln2
-       if err != nil {
-               return nil, err
-       }
+       var err error
 
        // generate a new random passID for tracker registration
        if _, err := rand.Read(server.TrackerPassID[:]); err != nil {
 
        // generate a new random passID for tracker registration
        if _, err := rand.Read(server.TrackerPassID[:]); err != nil {
@@ -362,8 +368,6 @@ func (s *Server) UpdateUser(login, newLogin, name, password string, access []byt
        s.mux.Lock()
        defer s.mux.Unlock()
 
        s.mux.Lock()
        defer s.mux.Unlock()
 
-       fmt.Printf("login: %v, newLogin: %v: ", login, newLogin)
-
        // update renames the user login
        if login != newLogin {
                err := os.Rename(s.ConfigDir+"Users/"+login+".yaml", s.ConfigDir+"Users/"+newLogin+".yaml")
        // update renames the user login
        if login != newLogin {
                err := os.Rename(s.ConfigDir+"Users/"+login+".yaml", s.ConfigDir+"Users/"+newLogin+".yaml")
@@ -571,8 +575,8 @@ func (s *Server) handleNewConnection(conn net.Conn, remoteAddr string) error {
        // Show agreement to client
        c.Server.outbox <- *NewTransaction(tranShowAgreement, c.ID, NewField(fieldData, s.Agreement))
 
        // Show agreement to client
        c.Server.outbox <- *NewTransaction(tranShowAgreement, c.ID, NewField(fieldData, s.Agreement))
 
-       // assume simplified hotline v1.2.3 login flow that does not require agreement
-       if *c.Version == nil {
+       // Used simplified hotline v1.2.3 login flow for clients that do not send login info in tranAgreed
+       if *c.Version == nil || bytes.Equal(*c.Version, nostalgiaVersion) {
                c.Agreed = true
 
                c.notifyOthers(
                c.Agreed = true
 
                c.notifyOthers(