auth.py 10.58 KiB
import os, ConfigParser
@plugin
class Auth(object):
def __init__(self, server):
self.server = server
self.commands = [ "addowner", "delowner", "addadmin", "addmod", "deladmin", "delmod", "admins", "mods", "owners", "passwd", "identify" ]
self.owners = {}
self.admins = {}
self.mods = {}
self.server.handle("command", self.handle_command, self.commands)
self.server.handle("part", self.handle_part)
self.server.handle("quit", self.handle_quit)
self.server.handle("nick", self.handle_nick)
self.authfile = self.server.config["confdir"] + "auth.cfg"
self._loadusers()
def _checkAuth(self, user):
stillOn = False
for ch in self.server.userlist.keys():
if user in self.server.userlist[ch]:
stillOn = True
if not stillOn:
if user.lower() in self.owners.keys():
self.owners[user.lower()][1] = False
elif user.lower() in self.admins.keys():
self.admins[user.lower()][1] = False
elif user.lower() in self.mods.keys():
self.mods[user.lower()][1] = False
def handle_quit(self, user, message):
self._checkAuth(user)
def handle_part(self, channel, user, message):
self._checkAuth(user)
def handle_nick(self, oldnick, newnick):
if self.isOwner(oldnick):
self.owners[newnick.lower()] = self.owners[oldnick.lower()]
del self.owners[oldnick.lower()]
elif self.isAdmin(oldnick):
self.admins[newnick.lower()] = self.admins[oldnick.lower()]
del self.admins[oldnick.lower()]
elif self.isMod(oldnick):
self.mods[newnick.lower()] = self.mods[oldnick.lower()]
del self.mods[oldnick.lower()]
def handle_command(self, channel, user, cmd, args):
if cmd == "owners":
self.server.doMessage(channel, user+": My owners are: "+" ".join(self.owners))
elif cmd == "admins":
self.server.doMessage(channel, user+": My administrators are: "+" ".join(self.admins))
elif cmd == "mods":
self.server.doMessage(channel, user+": My moderators are: "+" ".join(self.mods))
elif cmd == "passwd":
if channel == user:
if user.lower() in self.owners.keys():
if self.owners[user.lower()][1]:
if len(args) < 1:
self.server.doMessage(channel, user+": Not enough arguments.")
return
if len(args) >= 2:
self.owners[user.lower()][0] = args[1]
self.server.doMessage(channel, user+": Password successfully changed.")
else:
self.owners[user.lower()][0] = args[0]
self.server.doMessage(channel, user+": Password successfully changed.")
elif user.lower() in self.admins.keys():
if self.admins[user.lower()][1]:
if len(args) < 1:
self.server.doMessage(channel, user+": Not enough arguments.")
return
if len(args) >= 2:
self.admins[user.lower()][0] = args[1]
self.server.doMessage(channel, user+": Password successfully changed.")
else:
self.admins[user.lower()][0] = args[0]
self.server.doMessage(channel, user+": Password successfully changed.")
elif user.lower() in self.mods.keys():
if self.mods[user.lower()][1]:
if len(args) < 1:
self.server.doMessage(channel, user+": Not enough arguments.")
return
if len(args) >= 2:
self.mods[user.lower()][0] = args[1]
self.server.doMessage(channel, user+": Password successfully changed.")
else:
self.mods[user.lower()][0] = args[0]
self.server.doMessage(channel, user+": Password successfully changed.")
else:
self.server.doMessage(channel, user+": You are not in the owners/admins/mods lists.")
return
else:
self.server.doMessage(channel, user+": Please do that using private messaging.")
return
elif cmd == "identify":
if len(args) < 1:
self.server.doMessage(channel, user+": Not enough arguments.")
return
if channel == user:
if user.lower() in self.owners.keys():
if self.owners[user.lower()][1]:
self.server.doMessage(channel, user+": You are already identified.")
elif args[0] == self.owners[user.lower()][0]:
self.owners[user.lower()][1] = True
self.server.doMessage(channel, user+": You are now identified for "+user)
else:
self.server.doMessage(channel, user+": Invalid password.")
elif user.lower() in self.admins.keys():
if self.admins[user.lower()][1]:
self.server.doMessage(channel, user+": You are already identified.")
elif args[0] == self.admins[user.lower()][0]:
self.admins[user.lower()][1] = True
self.server.doMessage(channel, user+": You are now identified for "+user)
else:
self.server.doMessage(channel, user+": Invalid password.")
elif user.lower() in self.mods.keys():
if self.mods[user.lower()][1]:
self.server.doMessage(channel, user+": You are already identified.")
elif args[0] == self.mods[user.lower()][0]:
self.mods[user.lower()][1] = True
self.server.doMessage(channel, user+": You are now identified for "+user)
else:
self.server.doMessage(channel, user+": Invalid password.")
else:
self.server.doMessage(channel, user+": Please do that using private messaging.")
return
elif self.isOwner(user):
if len(args) < 1:
self.server.doMessage(channel, user+": Not enough arguments.")
return
if cmd == "addowner":
if args[0].lower() in self.owners.keys(): return
self.owners[args[0].lower()] = ['', True]
elif cmd == "addadmin":
if args[0].lower() in self.admins.keys(): return
self.admins[args[0].lower()] = ['', True]
elif cmd == "addmod":
if args[0].lower() in self.mods.keys(): return
self.mods[args[0].lower()] = ['', True]
elif cmd == "delowner":
if args[0].lower() in self.owners.keys():
del self.admins[args[0].lower()]
elif cmd == "deladmin":
if args[0].lower() in self.admins.keys():
del self.admins[args[0].lower()]
elif cmd == "delmod":
if args[0].lower() in self.mods.keys():
del self.mods[args[0].lower()]
#save users
def destroy(self):
self.configParser = ConfigParser.RawConfigParser()
if os.path.isfile(self.authfile):
self.configParser.read(self.authfile)
fh = open(self.authfile, "w")
network = self.server.config["network"]
if not self.configParser.has_section(network):
self.configParser.add_section(network)
self.configParser.set(self.server.config["network"],"owners",",".join( [k+":"+v[0] for k,v in self.owners.items()] ))
self.configParser.set(self.server.config["network"],"admins",",".join( [k+":"+v[0] for k,v in self.admins.items()] ))
self.configParser.set(self.server.config["network"],"mods",",".join( [k+":"+v[0] for k,v in self.mods.items()] ))
self.configParser.write(fh)
fh.close()
def _loadusers(self):
network = self.server.config["network"]
if os.path.isfile(self.authfile):
self.configParser = ConfigParser.RawConfigParser()
self.configParser.read(self.authfile)
if self.configParser.has_section(network):
if self.configParser.has_option(network, "owners"):
olist = self.configParser.get(network, "owners").lower().split(",")
olist = [o for o in olist if o != '']
for user in olist:
nick, pw = user.split(":")
self.owners[nick] = [pw, pw == '']
if self.configParser.has_option(network, "admins"):
alist = self.configParser.get(network, "admins").lower().split(",")
alist = [a for a in alist if a != '']
for user in alist:
nick, pw = user.split(":")
self.admins[nick] = [pw, pw == '']
if self.configParser.has_option(network, "mods"):
mlist = self.configParser.get(network, "mods").lower().split(",")
mlist = [m for m in mlist if m != '']
for user in mlist:
nick, pw = user.split(":")
self.mods[nick] = [pw, pw == '']
else:
onick = self.server.config["owner_nick"].lower()
self.owners[onick] = ['', True]
def isOwner(self, user):
return user.lower() in self.owners and self.owners[user.lower()][1]
def isAdmin(self, user):
if user.lower() in self.admins and self.admins[user.lower()][1]:
return True
else:
return self.isOwner(user)
def isMod(self, user):
if user.lower() in self.mods and self.mods[user.lower()][1]:
return True
elif self.isAdmin(user):
return True
else:
return self.isOwner(user)