modes: Add TLS umode (+Z)

This commit is contained in:
Daniel Oaks 2016-06-29 01:09:07 +10:00
parent a4236fcddd
commit b820559050
4 changed files with 30 additions and 8 deletions

View File

@ -18,6 +18,7 @@ Initial release of Oragono!
* Added ability to generate certificates from the command line.
* We now advertise the [`RPL_ISUPPORT`](http://modern.ircdocs.horse/#rplisupport-005) numeric.
* Parse new mode change syntax commonly used these days (i.e. `+h-ov dan dan dan`).
* User mode for clients connected via TLS (`+Z`).
### Changed
* Added channel Founder/Admin/Halfops (`qah`) privileges, and removed channel creator (`O`) privilege (from RFC2812, not used in the real world).

View File

@ -44,7 +44,7 @@ type Client struct {
isDestroyed bool
}
func NewClient(server *Server, conn net.Conn) *Client {
func NewClient(server *Server, conn net.Conn, isTLS bool) *Client {
now := time.Now()
socket := NewSocket(conn)
client := &Client{
@ -59,6 +59,9 @@ func NewClient(server *Server, conn net.Conn) *Client {
socket: &socket,
nickString: "*", // * is used until actual nick is given
}
if isTLS {
client.flags[TLS] = true
}
client.Touch()
go client.run()

View File

@ -143,6 +143,7 @@ const (
Operator UserMode = 'o'
Restricted UserMode = 'r'
ServerNotice UserMode = 's' // deprecated
TLS UserMode = 'Z'
WallOps UserMode = 'w'
)
@ -292,11 +293,13 @@ func umodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
applied = append(applied, change)
}
}
// can't do anything to TLS mode
}
}
if len(changes) > 0 {
client.Send(nil, client.nickMaskString, "MODE", target.nickString, changes.String())
if len(applied) > 0 {
client.Send(nil, client.nickMaskString, "MODE", target.nickString, applied.String())
} else if client == target {
client.Send(nil, target.nickMaskString, RPL_UMODEIS, target.nickString, target.ModeString())
}

View File

@ -33,7 +33,7 @@ type Server struct {
motdLines []string
name Name
nameString string // cache for server name string since it's used with almost every reply
newConns chan net.Conn
newConns chan clientConn
operators map[Name][]byte
password []byte
signals chan os.Signal
@ -48,6 +48,11 @@ var (
syscall.SIGTERM, syscall.SIGQUIT}
)
type clientConn struct {
Conn net.Conn
IsTLS bool
}
func NewServer(config *Config) *Server {
server := &Server{
channels: make(ChannelNameMap),
@ -58,7 +63,7 @@ func NewServer(config *Config) *Server {
idle: make(chan *Client),
name: NewName(config.Server.Name),
nameString: NewName(config.Server.Name).String(),
newConns: make(chan net.Conn),
newConns: make(chan clientConn),
operators: config.Operators(),
signals: make(chan os.Signal, len(SERVER_SIGNALS)),
proxyAllowedFrom: config.Server.ProxyAllowedFrom,
@ -180,7 +185,7 @@ func (server *Server) Run() {
done = true
case conn := <-server.newConns:
NewClient(server, conn)
NewClient(server, conn.Conn, conn.IsTLS)
/*TODO(dan): LOOK AT THIS MORE CLOSELY
case cmd := <-server.commands:
@ -221,7 +226,12 @@ func (s *Server) listen(addr string, tlsMap map[Name]*tls.Config) {
}
Log.debug.Printf("%s accept: %s", s, conn.RemoteAddr())
s.newConns <- conn
newConn := clientConn{
Conn: conn,
IsTLS: listenTLS,
}
s.newConns <- newConn
}
}()
}
@ -250,7 +260,11 @@ func (s *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig) {
return
}
s.newConns <- WSContainer{ws}
newConn := clientConn{
Conn: WSContainer{ws},
IsTLS: false, //TODO(dan): track TLS or not here properly
}
s.newConns <- newConn
})
go func() {
config, listenTLS := tlsMap[addr]
@ -294,6 +308,7 @@ func (s *Server) tryRegister(c *Client) {
c.Send(nil, s.nameString, RPL_MYINFO, c.nickString, s.nameString, SEM_VER, supportedUserModesString, supportedChannelModesString)
c.RplISupport()
s.MOTD(c)
c.Send(nil, c.nickMaskString, RPL_UMODEIS, c.nickString, c.ModeString())
}
func (server *Server) MOTD(client *Client) {