Skip to content
Snippets Groups Projects
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)