Add identd
This commit is contained in:
parent
67fe5d263d
commit
e0d2243248
9 changed files with 140 additions and 6 deletions
87
pkg/ident/server.go
Normal file
87
pkg/ident/server.go
Normal file
|
@ -0,0 +1,87 @@
|
|||
package ident
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"net"
|
||||
"strings"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var (
|
||||
DefaultAddr = ":113"
|
||||
)
|
||||
|
||||
type Server struct {
|
||||
Addr string
|
||||
|
||||
idents map[string]string
|
||||
listener net.Listener
|
||||
lock sync.Mutex
|
||||
}
|
||||
|
||||
func NewServer() *Server {
|
||||
return &Server{
|
||||
idents: map[string]string{},
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Server) Listen() error {
|
||||
var err error
|
||||
|
||||
addr := s.Addr
|
||||
if addr == "" {
|
||||
addr = DefaultAddr
|
||||
}
|
||||
|
||||
s.listener, err = net.Listen("tcp", addr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer s.listener.Close()
|
||||
|
||||
for {
|
||||
conn, err := s.listener.Accept()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
go s.handle(conn)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Server) Stop() error {
|
||||
return s.listener.Close()
|
||||
}
|
||||
|
||||
func (s *Server) Add(local, remote, ident string) {
|
||||
s.lock.Lock()
|
||||
s.idents[local+","+remote] = ident
|
||||
s.lock.Unlock()
|
||||
}
|
||||
|
||||
func (s *Server) Remove(local, remote string) {
|
||||
s.lock.Lock()
|
||||
delete(s.idents, local+","+remote)
|
||||
s.lock.Unlock()
|
||||
}
|
||||
|
||||
func (s *Server) handle(conn net.Conn) {
|
||||
defer conn.Close()
|
||||
|
||||
scan := bufio.NewScanner(conn)
|
||||
if !scan.Scan() {
|
||||
return
|
||||
}
|
||||
|
||||
line := scan.Text()
|
||||
ports := strings.ReplaceAll(line, " ", "")
|
||||
|
||||
s.lock.Lock()
|
||||
ident, ok := s.idents[ports]
|
||||
s.lock.Unlock()
|
||||
|
||||
if ok {
|
||||
conn.Write([]byte(fmt.Sprintf("%s : USERID : Dispatch : %s\r\n", line, ident)))
|
||||
}
|
||||
}
|
|
@ -195,6 +195,19 @@ func (c *Client) Host() string {
|
|||
return c.Config.Host
|
||||
}
|
||||
|
||||
func (c *Client) LocalPort() string {
|
||||
c.lock.Lock()
|
||||
defer c.lock.Unlock()
|
||||
|
||||
if c.conn != nil {
|
||||
_, local, err := net.SplitHostPort(c.conn.LocalAddr().String())
|
||||
if err == nil {
|
||||
return local
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (c *Client) MOTD() []string {
|
||||
return c.state.getMOTD()
|
||||
}
|
||||
|
|
|
@ -22,7 +22,6 @@ type Dialer interface {
|
|||
}
|
||||
|
||||
func (c *Client) Connect() {
|
||||
c.connChange(false, nil)
|
||||
go c.run()
|
||||
}
|
||||
|
||||
|
@ -147,7 +146,7 @@ func (c *Client) connect() error {
|
|||
c.scan = bufio.NewScanner(c.conn)
|
||||
c.scan.Buffer(c.recvBuf, cap(c.recvBuf))
|
||||
|
||||
c.register()
|
||||
go c.register()
|
||||
|
||||
c.sendRecv.Add(1)
|
||||
go c.recv()
|
||||
|
@ -185,7 +184,7 @@ func (c *Client) recv() {
|
|||
return
|
||||
|
||||
default:
|
||||
c.connChange(false, nil)
|
||||
c.connChange(false, c.scan.Err())
|
||||
close(c.reconnect)
|
||||
return
|
||||
}
|
||||
|
@ -198,8 +197,8 @@ func (c *Client) recv() {
|
|||
|
||||
msg := ParseMessage(string(b))
|
||||
if msg == nil {
|
||||
close(c.quit)
|
||||
c.connChange(false, ErrBadProtocol)
|
||||
close(c.quit)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue