Check admin or operator privileges
This commit is contained in:
parent
5f47deeb94
commit
bae871a524
15
handlers.go
15
handlers.go
|
@ -88,20 +88,17 @@ func handleCmdJoin(sv *Server, msg *irc.Message) {
|
||||||
sv.sendMsg(msg)
|
sv.sendMsg(msg)
|
||||||
sv.sendReply(msg.Pre, RPL_TOPIC, msg.Args[0], sv.chTopics[msg.Args[0]])
|
sv.sendReply(msg.Pre, RPL_TOPIC, msg.Args[0], sv.chTopics[msg.Args[0]])
|
||||||
sv.channelNames(msg.Pre, msg.Args[0])
|
sv.channelNames(msg.Pre, msg.Args[0])
|
||||||
_, isadm := sv.admins[clid]
|
m, isoper := sv.opers[clid]
|
||||||
if isadm {
|
if isoper {
|
||||||
mode := "o " + clid
|
mode := "o " + clid
|
||||||
sv.chModes[chid][mode] = true
|
sv.chModes[chid][mode] = true
|
||||||
sv.sendMsg(irc.M(sv.host, "MODE", chid+" +o "+clid, ""))
|
sv.sendMsg(irc.M(sv.host, "MODE", chid+" +o "+clid, ""))
|
||||||
|
if m == "a" {
|
||||||
sv.sendMsg(irc.M(sv.host, "PRIVMSG", chid, clid+" is a server administrator"))
|
sv.sendMsg(irc.M(sv.host, "PRIVMSG", chid, clid+" is a server administrator"))
|
||||||
return
|
|
||||||
}
|
}
|
||||||
_, isop := sv.opers[clid]
|
if m == "o" {
|
||||||
if isop {
|
|
||||||
mode := "o " + clid
|
|
||||||
sv.chModes[chid][mode] = true
|
|
||||||
sv.sendMsg(irc.M(sv.host, "MODE", chid+" +o "+clid, ""))
|
|
||||||
sv.sendMsg(irc.M(sv.host, "PRIVMSG", chid, clid+" is a server operator"))
|
sv.sendMsg(irc.M(sv.host, "PRIVMSG", chid, clid+" is a server operator"))
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if first {
|
if first {
|
||||||
|
@ -258,7 +255,7 @@ func handleCmdPing(sv *Server, msg *irc.Message) {
|
||||||
|
|
||||||
func handleCmdRehash(sv *Server, msg *irc.Message) {
|
func handleCmdRehash(sv *Server, msg *irc.Message) {
|
||||||
sv.loadConfig()
|
sv.loadConfig()
|
||||||
sv.sendReply(msg.Pre, RPL_REHASHING, "", "Rehashing.")
|
sv.sendReply(msg.Pre, RPL_REHASHING, "", "Rehashing")
|
||||||
xlog.Info("Rehashing")
|
xlog.Info("Rehashing")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
31
server.go
31
server.go
|
@ -40,8 +40,7 @@ type Server struct {
|
||||||
created string
|
created string
|
||||||
motd string
|
motd string
|
||||||
|
|
||||||
admins map[string]bool
|
opers map[string]string
|
||||||
opers map[string]bool
|
|
||||||
|
|
||||||
clients map[string]Client
|
clients map[string]Client
|
||||||
clModes map[string]string
|
clModes map[string]string
|
||||||
|
@ -70,8 +69,7 @@ func NewServer(configPath, software, version string) *Server {
|
||||||
sv.addq = make(chan Client, 128)
|
sv.addq = make(chan Client, 128)
|
||||||
sv.delq = make(chan Client, 128)
|
sv.delq = make(chan Client, 128)
|
||||||
|
|
||||||
sv.admins = make(map[string]bool)
|
sv.opers = make(map[string]string)
|
||||||
sv.opers = make(map[string]bool)
|
|
||||||
|
|
||||||
sv.clients = make(map[string]Client)
|
sv.clients = make(map[string]Client)
|
||||||
sv.clModes = make(map[string]string)
|
sv.clModes = make(map[string]string)
|
||||||
|
@ -92,11 +90,11 @@ func NewServer(configPath, software, version string) *Server {
|
||||||
|
|
||||||
nicks, _ := sv.config.GetString("control", "a")
|
nicks, _ := sv.config.GetString("control", "a")
|
||||||
for _, nick := range strings.Split(nicks, ",") {
|
for _, nick := range strings.Split(nicks, ",") {
|
||||||
sv.admins[nick] = true
|
sv.opers[nick] = "a"
|
||||||
}
|
}
|
||||||
nicks, _ = sv.config.GetString("control", "o")
|
nicks, _ = sv.config.GetString("control", "o")
|
||||||
for _, nick := range strings.Split(nicks, ",") {
|
for _, nick := range strings.Split(nicks, ",") {
|
||||||
sv.opers[nick] = true
|
sv.opers[nick] = "o"
|
||||||
}
|
}
|
||||||
|
|
||||||
sv.packetsTransferred = 0
|
sv.packetsTransferred = 0
|
||||||
|
@ -268,11 +266,24 @@ func (sv *Server) delClient(cl Client) {
|
||||||
|
|
||||||
func (sv *Server) recvMsg(msg *irc.Message) {
|
func (sv *Server) recvMsg(msg *irc.Message) {
|
||||||
cmd := msg.Cmd
|
cmd := msg.Cmd
|
||||||
|
clid := strings.ToLower(msg.Pre)
|
||||||
hook, exists := svCommandHooks[cmd]
|
hook, exists := svCommandHooks[cmd]
|
||||||
if !exists {
|
if !exists {
|
||||||
sv.sendReply(msg.Pre, ERR_UNKNOWNCOMMAND, cmd, "Unknown command")
|
sv.sendReply(msg.Pre, ERR_UNKNOWNCOMMAND, cmd, "Unknown command")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
nm := hook.NeedMode
|
||||||
|
if nm != "" {
|
||||||
|
if m, isoper := sv.opers[clid]; !isoper {
|
||||||
|
sv.sendReply(msg.Pre, ERR_NOPRIVILEGES, cmd, "Permission denied: You're not a server operator")
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
if strings.Index(nm, m) == -1 {
|
||||||
|
sv.sendReply(msg.Pre, ERR_NOPRIVILEGES, cmd, "Permission denied: You're not a server admin")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
argc := len(msg.Args)
|
argc := len(msg.Args)
|
||||||
if argc < hook.MinArgs {
|
if argc < hook.MinArgs {
|
||||||
sv.sendReply(msg.Pre, ERR_NEEDMOREPARAMS, cmd, "Not enough parameters")
|
sv.sendReply(msg.Pre, ERR_NEEDMOREPARAMS, cmd, "Not enough parameters")
|
||||||
|
@ -342,6 +353,14 @@ func (sv *Server) sendLogon(nick string) {
|
||||||
sv.sendReply(nick, RPL_MOTD, "", fmt.Sprintf("- %s", line))
|
sv.sendReply(nick, RPL_MOTD, "", fmt.Sprintf("- %s", line))
|
||||||
}
|
}
|
||||||
sv.sendReply(nick, RPL_ENDOFMOTD, "", "End of MOTD command")
|
sv.sendReply(nick, RPL_ENDOFMOTD, "", "End of MOTD command")
|
||||||
|
if m, isoper := sv.opers[strings.ToLower(nick)]; isoper {
|
||||||
|
switch m {
|
||||||
|
case "a":
|
||||||
|
sv.sendReply(nick, RPL_YOUREOPER, "", "You are now a server admin")
|
||||||
|
case "o":
|
||||||
|
sv.sendReply(nick, RPL_YOUREOPER, "", "You are now a server operator")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send channel name list to client
|
// Send channel name list to client
|
||||||
|
|
Loading…
Reference in New Issue