X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/blobdiff_plain/f22acf38da970aa0d865a9978c9499dad01d235f..0fcfa5d54b166559c0ca31932a71a7eabb79c72c:/hotline/server.go?ds=sidebyside diff --git a/hotline/server.go b/hotline/server.go index 9ffd272..a91e1c8 100644 --- a/hotline/server.go +++ b/hotline/server.go @@ -167,25 +167,31 @@ func (s *Server) sendTransaction(t Transaction) error { return nil } +func (s *Server) processOutbox() { + for { + t := <-s.outbox + go func() { + if err := s.sendTransaction(t); err != nil { + s.Logger.Errorw("error sending transaction", "err", err) + } + }() + } +} + func (s *Server) Serve(ctx context.Context, ln net.Listener) error { + go s.processOutbox() + for { conn, err := ln.Accept() if err != nil { s.Logger.Errorw("error accepting connection", "err", err) } + connCtx := context.WithValue(ctx, contextKeyReq, requestCtx{ + remoteAddr: conn.RemoteAddr().String(), + }) go func() { - for { - t := <-s.outbox - go func() { - if err := s.sendTransaction(t); err != nil { - s.Logger.Errorw("error sending transaction", "err", err) - } - }() - } - }() - go func() { - if err := s.handleNewConnection(ctx, conn, conn.RemoteAddr().String()); err != nil { + if err := s.handleNewConnection(connCtx, conn, conn.RemoteAddr().String()); err != nil { s.Logger.Infow("New client connection established", "RemoteAddr", conn.RemoteAddr()) if err == io.EOF { s.Logger.Infow("Client disconnected", "RemoteAddr", conn.RemoteAddr()) @@ -335,7 +341,7 @@ func (s *Server) writeThreadedNews() error { return err } -func (s *Server) NewClientConn(conn net.Conn, remoteAddr string) *ClientConn { +func (s *Server) NewClientConn(conn io.ReadWriteCloser, remoteAddr string) *ClientConn { s.mux.Lock() defer s.mux.Unlock() @@ -579,7 +585,9 @@ func (s *Server) handleNewConnection(ctx context.Context, conn net.Conn, remoteA *c.Flags = []byte{0, 2} } - s.Logger.Infow("Client connection received", "login", login, "version", *c.Version, "RemoteAddr", remoteAddr) + c.logger = s.Logger.With("remoteAddr", remoteAddr, "login", login) + + c.logger.Infow("Client connection received", "version", fmt.Sprintf("%x", *c.Version)) s.outbox <- c.NewReply(clientLogin, NewField(fieldVersion, []byte{0x00, 0xbe}), @@ -597,6 +605,8 @@ func (s *Server) handleNewConnection(ctx context.Context, conn net.Conn, remoteA if *c.Version == nil || bytes.Equal(*c.Version, nostalgiaVersion) { c.Agreed = true + c.logger = c.logger.With("name", string(c.UserName)) + c.notifyOthers( *NewTransaction( tranNotifyChangeUser, nil, @@ -628,7 +638,7 @@ func (s *Server) handleNewConnection(ctx context.Context, conn net.Conn, remoteA // into a slice of transactions var transactions []Transaction if transactions, tReadlen, err = readTransactions(tranBuff); err != nil { - c.Server.Logger.Errorw("Error handling transaction", "err", err) + c.logger.Errorw("Error handling transaction", "err", err) } // iterate over all the transactions that were parsed from the byte slice and handle them @@ -765,6 +775,9 @@ func (s *Server) handleFileTransfer(ctx context.Context, rwc io.ReadWriter) erro } err = sendFile(wr, rFile, int(dataOffset)) + if err != nil { + return err + } if err := wr.Flush(); err != nil { return err @@ -808,8 +821,6 @@ func (s *Server) handleFileTransfer(ctx context.Context, rwc io.ReadWriter) erro return err } - defer func() { _ = file.Close() }() - s.Logger.Infow("File upload started", "transactionRef", fileTransfer.ReferenceNumber, "dstFile", destinationFile) rForkWriter := io.Discard @@ -830,6 +841,10 @@ func (s *Server) handleFileTransfer(ctx context.Context, rwc io.ReadWriter) erro return err } + if err := file.Close(); err != nil { + return err + } + if err := s.FS.Rename(destinationFile+".incomplete", destinationFile); err != nil { return err } @@ -1002,6 +1017,10 @@ func (s *Server) handleFileTransfer(ctx context.Context, rwc io.ReadWriter) erro return nil }) + if err != nil { + return err + } + case FolderUpload: dstPath, err := readPath(s.Config.FileRoot, fileTransfer.FilePath, fileTransfer.FileName) if err != nil {