]> git.r.bdr.sh - rbdr/mobius/blobdiff - hotline/server.go
Add option for account-specific file root
[rbdr/mobius] / hotline / server.go
index cfdb6b3a4ce52709c8ca28b1c5bf77e0b32c7f66..c4d8f7f429d22bf27bbd4cca397a56d9b712ce9c 100644 (file)
@@ -241,15 +241,9 @@ const trackerUpdateFrequency = 300
 // registerWithTrackers runs every trackerUpdateFrequency seconds to update the server's tracker entry on all configured
 // trackers.
 func (s *Server) registerWithTrackers(ctx context.Context) {
-       ticker := time.NewTicker(trackerUpdateFrequency * time.Second)
-       defer ticker.Stop()
-
        for {
-               select {
-               case <-ctx.Done():
-                       return
-               case <-ticker.C:
-                       if s.Config.EnableTrackerRegistration {
+               if s.Config.EnableTrackerRegistration {
+                       for _, t := range s.Config.Trackers {
                                tr := &TrackerRegistration{
                                        UserCount:   len(s.ClientMgr.List()),
                                        PassID:      s.TrackerPassID,
@@ -258,15 +252,23 @@ func (s *Server) registerWithTrackers(ctx context.Context) {
                                }
                                binary.BigEndian.PutUint16(tr.Port[:], uint16(s.Port))
 
-                               for _, t := range s.Config.Trackers {
-                                       if err := register(&RealDialer{}, t, tr); err != nil {
-                                               s.Logger.Error(fmt.Sprintf("Unable to register with tracker %v", t), "error", err)
-                                       }
+                               // Check the tracker string for a password.  This is janky but avoids a breaking change to the Config
+                               // Trackers field.
+                               splitAddr := strings.Split(":", t)
+                               if len(splitAddr) == 3 {
+                                       tr.Password = splitAddr[2]
+                               }
+
+                               if err := register(&RealDialer{}, t, tr); err != nil {
+                                       s.Logger.Error(fmt.Sprintf("Unable to register with tracker %v", t), "error", err)
                                }
                        }
                }
+               // Using time.Ticker with for/select would be more idiomatic, but it's super annoying that it doesn't tick on
+               // first pass.  Revist, maybe.
+               // https://github.com/golang/go/issues/17601
+               time.Sleep(trackerUpdateFrequency * time.Second)
        }
-
 }
 
 const (
@@ -524,7 +526,7 @@ func (s *Server) handleFileTransfer(ctx context.Context, rwc io.ReadWriter) erro
                "Name", string(fileTransfer.ClientConn.UserName),
        )
 
-       fullPath, err := ReadPath(s.Config.FileRoot, fileTransfer.FilePath, fileTransfer.FileName)
+       fullPath, err := ReadPath(fileTransfer.FileRoot, fileTransfer.FilePath, fileTransfer.FileName)
        if err != nil {
                return err
        }
@@ -532,7 +534,7 @@ func (s *Server) handleFileTransfer(ctx context.Context, rwc io.ReadWriter) erro
        switch fileTransfer.Type {
        case BannerDownload:
                if _, err := io.Copy(rwc, bytes.NewBuffer(s.Banner)); err != nil {
-                       return fmt.Errorf("error sending Banner: %w", err)
+                       return fmt.Errorf("banner download: %w", err)
                }
        case FileDownload:
                s.Stats.Increment(StatDownloadCounter, StatDownloadsInProgress)
@@ -553,7 +555,7 @@ func (s *Server) handleFileTransfer(ctx context.Context, rwc io.ReadWriter) erro
 
                err = UploadHandler(rwc, fullPath, fileTransfer, s.FS, rLogger, s.Config.PreserveResourceForks)
                if err != nil {
-                       return fmt.Errorf("file upload error: %w", err)
+                       return fmt.Errorf("file upload: %w", err)
                }
 
        case FolderDownload:
@@ -564,7 +566,7 @@ func (s *Server) handleFileTransfer(ctx context.Context, rwc io.ReadWriter) erro
 
                err = DownloadFolderHandler(rwc, fullPath, fileTransfer, s.FS, rLogger, s.Config.PreserveResourceForks)
                if err != nil {
-                       return fmt.Errorf("file upload error: %w", err)
+                       return fmt.Errorf("folder download: %w", err)
                }
 
        case FolderUpload:
@@ -582,7 +584,7 @@ func (s *Server) handleFileTransfer(ctx context.Context, rwc io.ReadWriter) erro
 
                err = UploadFolderHandler(rwc, fullPath, fileTransfer, s.FS, rLogger, s.Config.PreserveResourceForks)
                if err != nil {
-                       return fmt.Errorf("file upload error: %w", err)
+                       return fmt.Errorf("folder upload: %w", err)
                }
        }
        return nil