Example #1
0
class Client:

	def importScripts(self):
		self.decEncHelper = DecodingEncodingHelper()
		self.inputHandler = InputHandler(self.output)
		self.fileHelper = FileHelper(self.output)
		self.guiHelper = GUIHelper(self.output)

	def setConfig(self):
		Config = self.fileHelper.getConfig()
		self.ipV4 = Config.ip
		self.port = Config.port

	def inizializeClient(self, username, password):
		self.clientObject = ClientObject(username, None, self.ipV4, self.port, "Welcome_Channel") 
		self.connected = False
		self.password = password

	def tryConnect(self):
		try:
			self.clientObject.socketObject = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
			self.clientObject.socketObject.connect((self.clientObject.ip, self.clientObject.port))
			threading.Thread(target=ServerHandler,args=[self.clientObject,self.windows]).start()
			self.clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("011" + self.clientObject.username + ":" + self.password))
			self.connected = True
		except:
			self.connected = False

	def sendInput(self, message):
		if self.connected:
			if str(message).startswith("/"):
					self.inputHandler.handleInput(str(message[1:]), self.clientObject)
			else:
				self.output.append("you: " + message)
				try:
					
					self.clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("001" + message))
				except:
					self.connected = False
		else:
			self.guiHelper.printOutput("not connected")

	def __init__(self, username, password, windows):
		#Imports
		self.windows = windows
		self.output = self.windows[0].output
		self.importScripts()
		#Config
		self.setConfig()
		#Client initializations
		self.inizializeClient(username, password)
		#Client trying to establish a connection
		self.tryConnect()
		
Example #2
0
class InputHandler:

    commandList = list()

    def importScripts(self):
        self.decEncHelper = DecodingEncodingHelper()
        self.channelManager = ChannelManager()
        self.clientManager = ClientManager()
        self.fileHelper = FileHelper()
        self.logHelper = LogHelper()

        self.mysqlHelper = MysqlHelper()

    def createCommand(self, name, syntax, arguments, description):
        command = Command(name, syntax, arguments, description)
        self.commandList.append(command)
        return command

    def initializeCommands(self):
        self.cmdListClients = self.createCommand(
            "listClients", "/listClients", "NONE",
            "Lists all connected clients with their name, ip and channel their in."
        )
        self.cmdClear = self.createCommand("Clear", "/clear", "NONE",
                                           "Clears your interpreter console.")
        self.cmdHelp = self.createCommand(
            "Help", "/help", "NONE", "Shows a list of available commands.")
        self.cmdKick = self.createCommand(
            "Kick", "/kick <name/ip>", "<NAME/IP>",
            "Kicks the given IP from the server.")
        self.cmdBan = self.createCommand(
            "Ban", "/ban <name/ip> <time>", "<NAME/IP> <TIME>",
            "Bans the specified client for the given amount of time in minutes."
        )
        self.cmdMonitorMode = self.createCommand("monitorMode", "/monitorMode",
                                                 "NONE",
                                                 "Switches to monitor mode.")
        self.cmdChangeRank = self.createCommand(
            "changeRank", "/changeRank <name/ip> <rank>", "<NAME/IP> <RANK>",
            "Changes the rank of the given client.")
        self.cmdListChannel = self.createCommand(
            "listChannel", "/listChannel", "NONE",
            "Lists all channels with their belonging clients.")
        self.cmdCreateChannel = self.createCommand(
            "createChannel",
            "/createChannel <name> <description> <password> <accessLevel>",
            "<NAME/DESCRIPTION/PASSWORD/ACCESSLEVEL>",
            "Creates a temporary Channel.")
        self.cmdRemoveChannel = self.createCommand(
            "removeChannel", "/removeChannel <name>", "<NAME>",
            "Removes the give Channel.")

    def __init__(self, upTime):
        self.upTime = upTime
        #Imports
        self.importScripts()
        #Create Commands
        self.initializeCommands()

    def handleInput(self, command):
        command = command.split()

        if command[0] == self.cmdClear.name:
            os.system('cls' if os.name == 'nt' else 'clear')

        elif command[0] == self.cmdListClients.name:
            if len(self.clientManager.clientList) < 1:
                self.logHelper.log("error", "No clients connected")
            else:
                self.logHelper.log("error", "Connected clients:")
                for clientObject in self.clientManager.clientList:
                    self.logHelper.log(
                        "info", clientObject.ip + " with name " +
                        clientObject.username + " in " +
                        clientObject.channelObject.name)

        elif command[0] == self.cmdHelp.name:
            self.logHelper.log("info", "Commands:")
            self.logHelper.log(
                "info",
                "----------------------------------------------------------")
            for command in self.commandList:
                self.logHelper.log(
                    "info", command.syntax + " : " + command.description)
            self.logHelper.log(
                "info",
                "----------------------------------------------------------")

        elif command[0] == self.cmdKick.name:
            if len(self.clientManager.clientList) < 1:
                self.logHelper.log("error", "No clients connected")
            else:
                client = None
                try:
                    client = command[1]
                except IndexError:
                    self.logHelper.log("error",
                                       "Syntax: " + self.cmdKick.syntax)
                if client != None:
                    if self.clientManager.ipExists(client):
                        for clientObject in self.clientManager.clientList:
                            if clientObject.ip == client:
                                self.logHelper.log(
                                    "info", clientObject.ip + " : " +
                                    clientObject.username + " got kicked")
                                clientObject.socketObject.sendall(
                                    self.decEncHelper.stringToBytes("402"))
                                clientObject.socketObject.close()
                    elif self.clientManager.usernameExists(client):
                        for clientObject in self.clientManager.clientList:
                            if clientObject.username.lower() == client:
                                self.logHelper.log(
                                    "info", clientObject.ip + " : " +
                                    clientObject.username + " got kicked")
                                clientObject.socketObject.sendall(
                                    self.decEncHelper.stringToBytes("402"))
                                clientObject.socketObject.close()
                    else:
                        self.logHelper.log(
                            "error", "Your given Ip/Name doesn't exist.")

        elif command[0] == self.cmdBan.name:
            if len(self.clientManager.clientList) < 1:
                self.logHelper.log("error", "No clients connected")
            else:
                client = None
                banTime = None
                try:
                    client = command[1]
                    banTime = int(command[2])
                except IndexError:
                    if client or banTime == None:
                        self.logHelper.log("error",
                                           "Syntax: " + self.cmdBan.syntax)
                if client != None:
                    if self.clientManager.ipExists(client):
                        for clientObject in self.clientManager.clientList:
                            if clientObject.ip == client:
                                if banTime != None:
                                    if banTime == 0:
                                        self.fileHelper.addClientToBanList(
                                            clientObject.ip)
                                        self.logHelper.log(
                                            "info", clientObject.ip + " : " +
                                            clientObject.username +
                                            " got permanantly banned")
                                        clientObject.socketObject.sendall(
                                            self.decEncHelper.stringToBytes(
                                                "405" +
                                                "You got permanantly banned by the console"
                                            ))
                                        clientObject.socketObject.close()
                                    else:
                                        currentTimeStamp = datetime.datetime.now(
                                        ).timestamp()
                                        self.fileHelper.addClientToBanList(
                                            clientObject.ip + ":" +
                                            str(currentTimeStamp +
                                                int(banTime) * 60))
                                        self.logHelper.log(
                                            "info", clientObject.ip + " : " +
                                            clientObject.username +
                                            " got banned for " + str(banTime) +
                                            "minutes")
                                        clientObject.socketObject.sendall(
                                            self.decEncHelper.stringToBytes(
                                                "405" + "You got banned for " +
                                                str(banTime) +
                                                " minutes by the console"))
                                        clientObject.socketObject.close()
                                else:
                                    self.fileHelper.addClientToBanList(
                                        clientObject.ip)
                                    self.logHelper.log(
                                        "info", clientObject.ip + " : " +
                                        clientObject.username +
                                        " got permanantly banned")
                                    clientObject.socketObject.sendall(
                                        self.decEncHelper.stringToBytes(
                                            "405" +
                                            "You got permanantly banned by the console"
                                        ))
                                    clientObject.socketObject.close()
                    elif self.clientManager.usernameExists(client):
                        for clientObject in self.clientManager.clientList:
                            if clientObject.username.lower() == client:
                                if banTime != None:
                                    if banTime == 0:
                                        self.fileHelper.addClientToBanList(
                                            clientObject.ip)
                                        self.logHelper.log(
                                            "info", clientObject.ip + " : " +
                                            clientObject.username +
                                            " got permanantly banned")
                                        clientObject.socketObject.sendall(
                                            self.decEncHelper.stringToBytes(
                                                "405" +
                                                "You got permanantly banned by the console"
                                            ))
                                        clientObject.socketObject.close()
                                    else:
                                        currentTimeStamp = datetime.datetime.now(
                                        ).timestamp()
                                        self.fileHelper.addClientToBanList(
                                            clientObject.ip + ":" +
                                            str(currentTimeStamp +
                                                int(banTime) * 60))
                                        self.logHelper.log(
                                            "info", clientObject.ip + " : " +
                                            clientObject.username +
                                            " got banned for " + str(banTime) +
                                            "minutes")
                                        clientObject.socketObject.sendall(
                                            self.decEncHelper.stringToBytes(
                                                "405" + "You got banned for " +
                                                str(banTime) +
                                                " minutes by the console"))
                                        clientObject.socketObject.close()
                                else:
                                    self.fileHelper.addClientToBanList(
                                        clientObject.ip)
                                    self.logHelper.log(
                                        "info", clientObject.ip + " : " +
                                        clientObject.username +
                                        " got permanantly banned")
                                    clientObject.socketObject.sendall(
                                        self.decEncHelper.stringToBytes(
                                            "405" +
                                            "You got permanantly banned by the console"
                                        ))
                                    clientObject.socketObject.close()
                    else:
                        print(
                            "[Server/Error] Your given Ip/Name doesn't exist.")

        elif command[0] == self.cmdListChannel.name:
            self.logHelper.log("info", "Channels:")
            self.logHelper.log(
                "info",
                "----------------------------------------------------------")
            for channel in self.channelManager.channelList:
                self.logHelper.log(
                    "info", "-" + channel.name + " : Description:" +
                    channel.description)
                self.logHelper.log("info", " Clients:")
                if len(channel.clientList) < 1:
                    self.logHelper.log("info", " -channel is empty")
                else:
                    for client in channel.clientList:
                        self.logHelper.log(
                            "info", " -" + client.ip + " : " + client.username)
            self.logHelper.log(
                "info",
                "----------------------------------------------------------")

        elif command[
                0] == self.cmdCreateChannel.name:  #TODO: add things to remove user error when acces level isnst int and description contains spaces
            name = None
            description = None
            password = None
            accessLevel = None
            try:
                name = command[1]
                description = command[2]
                password = command[3]
                accessLevel = int(command[4])
                self.channelManager.addChannel(
                    Channel(name, description, password, accessLevel, list()))
                self.logHelper.log("info", "Channel " + name + " created.")
            except:
                if name or description or password or accessLevel == None:
                    self.logHelper.log(
                        "error", "Syntax: " + self.cmdCreateChannel.syntax)

        elif command[0] == self.cmdRemoveChannel.name:
            name = None
            try:
                name = command[1]
                for channel in self.channelManager.channelList:
                    if channel.name == name:
                        self.channelManager.removeChannel(channel)
                self.logHelper.log("info", "Channel " + name + " was removed.")
            except:
                if name == None:
                    self.logHelper.log(
                        "error", "Syntax: " + self.cmdRemoveChannel.syntax)

        elif command[
                0] == self.cmdChangeRank.name:  #TODO: add things to remove user error for rank and check if rank isnt even a rank
            if len(self.clientManager.clientList) < 1:
                self.logHelper.log("error", "No clients connected")
            else:
                client = None
                rank = None
                try:
                    client = command[1]
                    rank = command[2]
                except IndexError:
                    self.logHelper.log("error",
                                       "Syntax: " + self.cmdChangeRank.syntax)
                if client != None:
                    if rank != None:
                        if self.clientManager.ipExists(client):
                            for clientObject in self.clientManager.clientList:
                                if clientObject.ip == client:
                                    prevRank = clientObject.rank
                                    clientObject.rank = rank
                                    self.mysqlHelper.updateAccountRank(
                                        clientObject)
                                    self.logHelper.log(
                                        "info", "Changed " + clientObject.ip +
                                        ":" + str(clientObject.port) + " " +
                                        clientObject.username +
                                        " 's rank from " + prevRank + " to " +
                                        rank)

                        elif self.clientManager.usernameExists(client):
                            for clientObject in self.clientManager.clientList:
                                if clientObject.username.lower() == client:
                                    prevRank = clientObject.rank
                                    clientObject.rank = rank
                                    self.mysqlHelper.updateAccountRank(
                                        clientObject)
                                    #clientObject.sendall(self.decEncHelper.stringToBytes("904" + rank))TODO:
                                    self.logHelper.log(
                                        "info", "Changed " + clientObject.ip +
                                        ":" + str(clientObject.port) + " " +
                                        clientObject.username +
                                        " 's rank from " + prevRank + " to " +
                                        rank)
                        else:
                            self.logHelper.log(
                                "error", "Your given Ip/Name doesn't exist.")

        elif command[0] == self.cmdMonitorMode.name:
            monitor = True
            config = self.fileHelper.getConfig("Server Config")
            ip = config.ip + ":" + str(config.port)
            if len(ip) != 20:
                ip = " " * (20 - len(ip)) + ip
            while monitor:
                clearCount = 0
                connectedClients = str(len(self.clientManager.clientList))
                connectedAdmins = str(len(self.clientManager.getAdmins()))
                if len(connectedClients) != 3:
                    connectedClients = "0" * (
                        3 - len(connectedClients)) + connectedClients
                if len(connectedAdmins) != 3:
                    connectedAdmins = "0" * (
                        3 - len(connectedAdmins)) + connectedAdmins
                os.system('cls' if os.name == 'nt' else 'clear')
                try:
                    print(
                        "##############Monitoring##############\n#Server Ip/Port: "
                        + ip + "#\n#Uptime:                     " +
                        time.strftime(
                            '%H:%M:%S',
                            time.gmtime(int(time.time() - self.upTime))) +
                        "#\n#Connected Clients:               " +
                        connectedClients +
                        "#\n#Connected Admins:                " +
                        connectedAdmins +
                        "#\n##############Monitoring##############")
                    while clearCount != 5:
                        sys.stdout.write("\x1b[1A")
                        sys.stdout.write("\x1b[2K")
                        clearCount = clearCount + 1
                    time.sleep(0.5)
                except KeyboardInterrupt:
                    monitor = False
                    os.system('cls' if os.name == 'nt' else 'clear')
                    self.logHelper.log("info", "Exited monitor mode.")

        else:
            self.logHelper.log("error", "Unknown command: " + command[0])
            self.logHelper.log("error", "type /help for a list of commands")
Example #3
0
class ClientHandler(socketserver.BaseRequestHandler):
    appendClient = True
    tryRecv = False
    loggedIn = False

    def handle(
        self
    ):  #overwrite TODO: find a way to import script only once not once per handle call
        self.decEncHelper = DecodingEncodingHelper()
        self.channelManager = ChannelManager()
        self.clientManager = ClientManager()
        self.mysqlHelper = MysqlHelper()
        self.fileHelper = FileHelper()
        self.logHelper = LogHelper()

        if self.appendClient:
            self.clientObject = Client(self.request, "*NOT_ASSIGNED*",
                                       "*NOT_ASSIGNED*", "*NOT_ASSIGNED*")
            if len(self.fileHelper.readTXTFile("data/", "banList")) > 1:
                for client in self.fileHelper.readTXTFile("data/", "banList"):
                    try:
                        banTime = client.split(":")[1]
                    except IndexError:
                        pass
                    if self.clientObject.ip + "\n" == client:
                        self.logHelper.log(
                            "info", self.clientObject.ip + ":" +
                            str(self.clientObject.port) +
                            " is permanantly banned on the server")
                        self.clientObject.socketObject.sendall(
                            self.decEncHelper.stringToBytes(
                                "405[Client/Info] You are permanantly banned on this server"
                            ))
                        self.clientObject.socketObject.close()
                        self.appendClient = False
                    elif self.clientObject.ip + ":" + banTime == client:
                        currentTimeStamp = datetime.datetime.now().timestamp()
                        banTime = banTime[:-1]
                        if (currentTimeStamp > float(banTime)):
                            self.fileHelper.removeClientFromBanList(
                                self.clientObject.ip)
                            self.clientManager.addClient(self.clientObject)
                            self.logHelper.log(
                                "info",
                                str(self.clientObject.ip) + ":" +
                                str(self.clientObject.port) +
                                " connected to the server")
                            print(
                                self.mysqlHelper.getAccountRank(
                                    self.clientObject))
                            if len(
                                    self.mysqlHelper.getAccountRank(
                                        self.clientObject)) < 3:

                                self.clientObject.rank = "user"
                                self.mysqlHelper.updateAccountRank(
                                    self.clientObject)
                            self.appendClient = False
                            self.tryRecv = True
                        else:
                            self.logHelper.log(
                                "info", self.clientObject.ip + ":" +
                                str(self.clientObject.port) +
                                " is temporary banned on the server. Remaining Time: "
                                + str(
                                    int((float(banTime) - currentTimeStamp) /
                                        60)) + "Minutes")
                            self.clientObject.socketObject.sendall(
                                self.decEncHelper.stringToBytes(
                                    "405[Client/Info] You are temporary banned on this server. Remaining Time: "
                                    + str(
                                        int((float(banTime) -
                                             currentTimeStamp) / 60)) +
                                    " Minutes"))
                            self.channelManager.removeChannelMember(
                                self.clientObject.channelObject,
                                self.clientObject)
                            self.clientObject.socketObject.close()
                            self.appendClient = False
                            break
                    elif "BanList:\n" == client:
                        pass
                    else:
                        self.clientManager.addClient(self.clientObject)
                        self.logHelper.log(
                            "info",
                            str(self.clientObject.ip) + ":" +
                            str(self.clientObject.port) +
                            " connected to the server.")
                        self.appendClient = False
                        self.tryRecv = True
            else:
                self.clientManager.addClient(self.clientObject)
                self.logHelper.log(
                    "info",
                    str(self.clientObject.ip) + ":" +
                    str(self.clientObject.port) + " connected to the server.")
                self.appendClient = False
                self.tryRecv = True

        if self.tryRecv:
            try:
                self.data = self.decEncHelper.bytesToString(
                    self.clientObject.socketObject.recv(1024))
                self.handleRequest(self.data, self.clientObject)
            except:
                for clientObjectInList in self.clientManager.clientList:
                    if clientObjectInList != self.clientObject:
                        if self.loggedIn:
                            if self.channelManager.channelContains(
                                    clientObjectInList,
                                    self.clientObject.channelObject.name):
                                clientObjectInList.socketObject.sendall(
                                    self.decEncHelper.stringToBytes(
                                        "811[Client/Info] " +
                                        self.clientObject.username + " quit."))
                self.logHelper.log(
                    "info", self.clientObject.ip + ":" +
                    str(self.clientObject.port) + " Disconnected")
                self.mysqlHelper.logoutAccount(self.clientObject)
                self.clientManager.removeClient(self.clientObject)
                if self.loggedIn:
                    self.channelManager.removeChannelMember(
                        self.clientObject.channelObject, self.clientObject)

    def handleRequest(self, request, clientObject):

        requestId = request[:3]
        requestdata = request[3:]

        if requestId == "001":  #chatting
            self.logHelper.channelLog(
                "info", clientObject.channelObject.name, clientObject.ip +
                ":" + str(clientObject.port) + " [" + clientObject.rank + "]" +
                clientObject.username + " : " + requestdata)
            for clientObjectFromList in self.clientManager.clientList:
                if clientObjectFromList.channelObject.name == clientObject.channelObject.name:
                    if clientObjectFromList != clientObject:
                        clientObjectFromList.socketObject.sendall(
                            self.decEncHelper.stringToBytes(
                                "001[" + clientObject.rank + "]" +
                                clientObject.username + " : " + requestdata))

        elif requestId == "011":  #try logging in
            requestdata = requestdata.split(":")
            self.logHelper.log(
                "info",
                str(self.clientObject.ip) + ":" + str(self.clientObject.port) +
                " tried logging in.")
            self.clientManager.updateClientUsername(clientObject,
                                                    requestdata[0])
            if self.mysqlHelper.tryLogin(clientObject, requestdata[1]):
                self.loggedIn = True
                self.clientObject.channelObject = self.channelManager.channelList[
                    0]
                self.clientObject.channelObject.clientList.append(
                    self.clientObject)
                self.clientManager.updateClientRank(
                    clientObject,
                    self.mysqlHelper.getAccountRank(clientObject))
                for clientObjectInList in self.clientManager.clientList:
                    if clientObjectInList != clientObject:
                        if self.channelManager.channelContains(
                                clientObjectInList, "Welcome_Channel"):
                            clientObjectInList.socketObject.sendall(
                                self.decEncHelper.stringToBytes(
                                    "811[" + clientObject.rank + "]" +
                                    clientObject.username + " joined."))
                self.logHelper.log(
                    "info",
                    str(self.clientObject.ip) + ":" +
                    str(self.clientObject.port) + " logged in as " +
                    clientObject.username + " succesfully.")
                if len(self.mysqlHelper.getAccountRank(self.clientObject)) < 3:
                    self.clientObject.rank = "user"
                    self.mysqlHelper.updateAccountRank(self.clientObject)
                for clientObjectInList in self.clientManager.clientList:
                    if clientObjectInList != clientObject:
                        if self.channelManager.channelContains(
                                clientObjectInList, "Welcome_Channel"):
                            clientObjectInList.socketObject.sendall(
                                self.decEncHelper.stringToBytes(
                                    "811[" + clientObject.rank + "]" +
                                    clientObject.username + " joined."))
                clientObject.socketObject.sendall(
                    self.decEncHelper.stringToBytes("903"))
            else:
                self.logHelper.log(
                    "info",
                    str(self.clientObject.ip) + ":" +
                    str(self.clientObject.port) + " couldn't log in.")
                self.clientObject.socketObject.sendall(
                    self.decEncHelper.stringToBytes("902"))
                self.clientObject.socketObject.close()

        elif requestId == "611":  #sent current clients in given channel
            self.logHelper.log(
                "info",
                str(self.clientObject.ip) + ":" + str(self.clientObject.port) +
                " " + clientObject.username +
                " requested the clients from channel " + requestdata + ".")
            for channel in self.channelManager.channelList:
                if channel.name == requestdata:
                    if len(channel.clientList) < 1:
                        self.clientObject.socketObject.sendall(
                            self.decEncHelper.stringToBytes("611Empty"))
                    else:
                        clientsInChannel = list()
                        for client in channel.clientList:
                            clientsInChannel.append(client.username)
                        self.clientObject.socketObject.sendall(
                            self.decEncHelper.stringToBytes(
                                "611" + requestdata + ";" +
                                str(clientsInChannel)))
                        break

        elif requestId == "541":  #sent client rank
            self.logHelper.log(
                "info", clientObject.ip + " " + clientObject.username +
                " requested rank.")
            self.clientObject.socketObject.sendall(
                self.decEncHelper.stringToBytes("541" +
                                                str(self.clientObject.rank)))

        elif requestId == "022":  #channel request
            self.logHelper.log(
                "info", clientObject.ip + " " + clientObject.username +
                " requested channel.")
            channelNames = list()
            channelDescriptions = list()
            channelPasswords = list()
            channelAccessLevels = list()
            for channelObject in self.channelManager.channelList:
                channelNames.append(channelObject.name)
                channelDescriptions.append(channelObject.description)
                channelPasswords.append(channelObject.password)
                channelAccessLevels.append(channelObject.accessLevel)
            self.clientObject.socketObject.sendall(
                self.decEncHelper.stringToBytes("022" + str(channelNames) +
                                                ":" +
                                                str(channelDescriptions) +
                                                ":" + str(channelPasswords) +
                                                ":" +
                                                str(channelAccessLevels)))

        elif requestId == "023":  #changing channels
            if self.channelManager.channelExists(requestdata):
                if self.channelManager.channelContains(self.clientObject,
                                                       requestdata):
                    clientObject.socketObject.sendall(
                        self.decEncHelper.stringToBytes(
                            "023[Client/Info] you are already in this channel."
                        ))
                    self.logHelper.log(
                        "info", clientObject.ip + ":" +
                        str(clientObject.port) + " " + clientObject.username +
                        " tried to join a channel which he is already part of."
                    )
                else:
                    for channelObject in self.channelManager.channelList:
                        if channelObject.name == requestdata:
                            oldChannel = clientObject.channelObject.name
                            self.channelManager.removeChannelMember(
                                clientObject.channelObject, clientObject)
                            clientObject.channelObject = channelObject
                            self.channelManager.addChannelMember(
                                channelObject, clientObject)
                            clientObject.socketObject.sendall(
                                self.decEncHelper.stringToBytes(
                                    "023[Client/Info] You succesfully changed to "
                                    + requestdata + "."))
                            self.logHelper.log(
                                "info", clientObject.ip + ":" +
                                str(clientObject.port) + " " +
                                clientObject.username + " changed from " +
                                oldChannel + " to " + requestdata + ".")
                            for clientInList in self.clientManager.clientList:
                                clientInList.socketObject.sendall(
                                    self.decEncHelper.stringToBytes("811"))

            else:
                clientObject.socketObject.sendall(
                    self.decEncHelper.stringToBytes(
                        "023[Client/Info] This Channel doesn't exists."))
                self.logHelper.log(
                    "info", clientObject.ip + " : " + clientObject.username +
                    " tried to join a channel that doesn't exists.")

        elif requestId == "031":  #changing namesFIXME: doesnt work with rank not tested witohut
            if self.clientManager.hasRank(clientObject, "admin"):
                self.fileHelper.removeClientRank(clientObject)
                clientObject.username = requestdata
                self.fileHelper.addClientRank(clientObject, "admin")
                clientObject.socketObject.sendall(
                    self.decEncHelper.stringToBytes(
                        "031[Client/Info] you succesfully changed your name."))
                self.logHelper.log(
                    "info", clientObject.ip + ":" + str(clientObject.port) +
                    " " + clientObject.username + " changed name.")
            else:
                clientObject.socketObject.sendall(
                    self.decEncHelper.stringToBytes(
                        "031[Client/Info] You don't have access to that command."
                    ))
                self.logHelper.log(
                    "info", clientObject.ip + ":" + str(clientObject.port) +
                    " " + clientObject.username +
                    " had no access to that command. Rank:(" +
                    clientObject.rank.strip("\n") + ")")

        elif requestId == "411":  #kicking clients
            if self.clientManager.hasRank(clientObject, "admin"):
                if self.clientManager.usernameExists(requestdata):
                    if requestdata == self.clientObject.username:
                        clientObject.socketObject.sendall(
                            self.decEncHelper.stringToBytes(
                                "411[Client/Info] You can't kick yourself."))
                    else:
                        for clientObjectInList in self.clientManager.clientList:
                            if clientObjectInList.username == requestdata:
                                clientObjectInList.socketObject.sendall(
                                    self.decEncHelper.stringToBytes(
                                        "402[Client/Info] You got kicked by: "
                                        + self.clientObject.username))
                                clientObjectInList.socketObject.close()
                                time.sleep(0.1)
                                self.logHelper.log(
                                    "info", clientObject.ip + ":" +
                                    str(clientObject.port) + " " +
                                    clientObject.username + " kicked : " +
                                    requestdata)
                                clientObject.socketObject.sendall(
                                    self.decEncHelper.stringToBytes(
                                        "411[Client/Info] You sucessfully kicked: "
                                        + requestdata))
                                break

                elif self.clientManager.ipExists(requestdata):
                    if requestdata == self.clientObject.ip:
                        clientObject.socketObject.sendall(
                            self.decEncHelper.stringToBytes(
                                "411[Client/Info] You can't kick yourself."))
                    else:
                        for clientObjectInList in self.clientManager.clientList:
                            if clientObjectInList.ip == requestdata:
                                clientObjectInList.socketObject.sendall(
                                    self.decEncHelper.stringToBytes(
                                        "402[Client/Info] You got kicked by: "
                                        + self.clientObject.username))
                                clientObjectInList.socketObject.close()
                                self.logHelper.log(
                                    "info", clientObject.ip + ":" +
                                    str(clientObject.port) + " " +
                                    clientObject.username + " kicked : " +
                                    requestdata)
                                clientObject.socketObject.sendall(
                                    self.decEncHelper.stringToBytes(
                                        "411[Client/Info] You sucessfully kicked: "
                                        + requestdata))
                                break

                else:
                    clientObject.socketObject.sendall(
                        self.decEncHelper.stringToBytes(
                            "411[Client/Info] Username or ip doesnt exists on the server."
                        ))
            else:
                clientObject.socketObject.sendall(
                    self.decEncHelper.stringToBytes(
                        "031[Client/Info] You don't have access to that command."
                    ))
                self.logHelper.log(
                    "info", clientObject.ip + ":" + str(clientObject.port) +
                    " " + clientObject.username +
                    " had no access to that command. Rank:(" +
                    clientObject.rank.strip("\n") + ")")

        elif requestId == "711":  #banning clients
            if self.clientManager.hasRank(clientObject, "admin"):
                requestdata = requestdata.split()
                client = requestdata[0]
                banTime = requestdata[1]
                if self.clientManager.usernameExists(client):
                    if client == self.clientObject.username:
                        clientObject.socketObject.sendall(
                            self.decEncHelper.stringToBytes(
                                "711[Client/Info] You can't ban yourself."))
                    else:
                        for clientObjectInList in self.clientManager.clientList:
                            if clientObjectInList.username == client:
                                if banTime == 0:
                                    self.fileHelper.addClientToBanList(
                                        clientObjectInList.ip)
                                    self.logHelper.log(
                                        "info", clientObjectInList.ip + ":" +
                                        str(clientObjectInList.port) + " " +
                                        clientObjectInList.username +
                                        " got permanantly banned by " +
                                        clientObject.username)
                                    clientObjectInList.socketObject.sendall(
                                        self.decEncHelper.stringToBytes(
                                            "711" +
                                            "[Client/Info] You got permanantly banned by "
                                            + clientObject.username))
                                    clientObjectInList.socketObject.close()
                                    clientObject.socketObject.sendall(
                                        self.decEncHelper.stringToBytes(
                                            "711[Client/Info] You sucessfully banned: "
                                            + clientObjectInList.username))
                                else:
                                    currentTimeStamp = datetime.datetime.now(
                                    ).timestamp()
                                    self.fileHelper.addClientToBanList(
                                        clientObjectInList.ip + ":" +
                                        str(currentTimeStamp +
                                            int(banTime) * 60))
                                    self.logHelper.log(
                                        "info", clientObjectInList.ip + ":" +
                                        str(clientObjectInList.port) + " " +
                                        clientObjectInList.username +
                                        " got banned for " + str(banTime) +
                                        "minutes by " + clientObject.username)
                                    clientObjectInList.socketObject.sendall(
                                        self.decEncHelper.stringToBytes(
                                            "711" +
                                            "[Client/Info] You got banned for "
                                            + str(banTime) + "Minutes by " +
                                            clientObject.username))
                                    clientObjectInList.socketObject.close()
                                    clientObject.socketObject.sendall(
                                        self.decEncHelper.stringToBytes(
                                            "711[Client/Info] You sucessfully banned: "
                                            + clientObjectInList.username +
                                            " for " + str(banTime)))

                elif self.clientManager.ipExists(client):
                    if client == self.clientObject.ip:
                        clientObject.socketObject.sendall(
                            self.decEncHelper.stringToBytes(
                                "711[Client/Info] You can't ban yourself."))
                    else:
                        for clientObjectInList in self.clientManager.clientList:
                            if clientObjectInList.ip == client:
                                if banTime == 0:
                                    self.fileHelper.addClientToBanList(
                                        clientObjectInList.ip)
                                    self.logHelper.log(
                                        "info", clientObjectInList.ip + ":" +
                                        str(clientObjectInList.port) + " " +
                                        clientObjectInList.username +
                                        " got permanantly banned by " +
                                        clientObject.username)
                                    clientObjectInList.socketObject.sendall(
                                        self.decEncHelper.stringToBytes(
                                            "711" +
                                            "[Client/Info] You got permanantly banned by "
                                            + clientObject.username))
                                    clientObjectInList.socketObject.close()
                                    clientObject.socketObject.sendall(
                                        self.decEncHelper.stringToBytes(
                                            "711[Client/Info] You sucessfully banned: "
                                            + clientObjectInList.username))
                                else:
                                    currentTimeStamp = datetime.datetime.now(
                                    ).timestamp()
                                    self.fileHelper.addClientToBanList(
                                        clientObjectInList.ip + ":" +
                                        str(currentTimeStamp +
                                            int(banTime) * 60))
                                    self.logHelper.log(
                                        "info", clientObjectInList.ip + ":" +
                                        str(clientObjectInList.port) + " " +
                                        clientObjectInList.username +
                                        " got banned for " + str(banTime) +
                                        "minutes by " + clientObject.username)
                                    clientObjectInList.socketObject.sendall(
                                        self.decEncHelper.stringToBytes(
                                            "711" +
                                            "[Client/Info] You got banned for "
                                            + str(banTime) + "Minutes by " +
                                            clientObject.username))
                                    clientObjectInList.socketObject.close()
                                    clientObject.socketObject.sendall(
                                        self.decEncHelper.stringToBytes(
                                            "711[Client/Info] You sucessfully banned: "
                                            + clientObjectInList.username +
                                            " for " + str(banTime)))

                else:
                    clientObject.socketObject.sendall(
                        self.decEncHelper.stringToBytes(
                            "711[Client/Info] Username or ip doesnt exists on the server."
                        ))
            else:
                clientObject.socketObject.sendall(
                    self.decEncHelper.stringToBytes(
                        "031[Client/Info] You don't have access to that command."
                    ))
                self.logHelper.log(
                    "info", clientObject.ip + ":" + str(clientObject.port) +
                    " " + clientObject.username +
                    " had no access to that command. Rank:(" +
                    clientObject.rank.strip("\n") + ")")

        elif requestId == "901":  #GUI get all channel with clients
            channelList = list()
            for channel in self.channelManager.channelList:
                memberList = list()
                for client in channel.clientList:
                    if client.username == clientObject.username:
                        memberList.append(client.username + "(you)")
                    else:
                        memberList.append(client.username)
                channelList.append(channel.name + ":" + str(memberList) + ";")
            clientObject.socketObject.sendall(
                self.decEncHelper.stringToBytes("901" + str(channelList)))

        else:  #any other requestId
            if len(requestId) == 0:
                raise SystemExit()
            else:
                clientObject.socketObject.sendall(
                    self.decEncHelper.stringToBytes(
                        "401[Client/Error] Unknown request ID"))
                self.logHelper.log(
                    "error", clientObject.ip + ":" + str(clientObject.port) +
                    " sent unknown request ID")

        self.handle()
Example #4
0
class Server:

	def importScripts(self):
		self.decEncHelper = DecodingEncodingHelper()
		self.channelManager = ChannelManager()
		self.clientManager = ClientManager()
		self.inputHandler = InputHandler(self.upTime)
		self.fileHelper = FileHelper()
		self.logHelper = LogHelper()

	def setConfig(self):
		config = self.fileHelper.getConfig("Server Config")
		self.port = config.port
		self.ipV4 = config.ip

	def inizializeChannel(self):
		self.welcomeChannel = Channel("Welcome_Channel", "welcome to the server", "No", 0, list())
		self.channel1 = Channel("Channel_1", "Description of channel 1", "No", 0, list())
		self.channel2 = Channel("Channel_2", "Description of channel 1", "No", 0, list())
		self.channel3 = Channel("Channel_3", "Description of channel 1", "No", 0, list())
		self.channelManager.addChannel(self.welcomeChannel)
		self.channelManager.addChannel(self.channel1)
		self.channelManager.addChannel(self.channel2)
		self.channelManager.addChannel(self.channel3)

	def inizializeServer(self):
		self.server = ServerThread((self.ipV4, self.port), ClientHandler)
		serverThread = threading.Thread(target=self.server.serve_forever)
		serverThread.daemon = True
		serverThread.start()
		self.logHelper.log("info" ,"Started server (version: " + self.fileHelper.getConfig("Version") + ") on ip: " + self.ipV4 + " port: " + str(self.port))

	def askForInput(self):
		while True:
			try:
				command = input()
			except KeyboardInterrupt:
				self.logHelper.log("info", "Gracefully stopping server...")
				if len(self.clientManager.clientList) < 1:
					self.logHelper.log("info", "Gracefully stopped server")
					break
				else:
					for clientObject in self.clientManager.clientList:
						clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("403"))
					self.logHelper.log("info", "Gracefully stopped server")
					break
			if str(command).startswith("/"):
				try:
					self.inputHandler.handleInput(str(command[1:]).lower())
				except IndexError:
					self.logHelper.log("info", "type /help for a list of commands.")	
			else:
				self.logHelper.log("info", "Commands always start with (/)")	

	def __init__(self):
		self.upTime = time.time()
		#Imports
		self.importScripts()
		#Config
		self.setConfig()
		#Channel initialization
		self.inizializeChannel()
		#Server initializations
		self.inizializeServer()
		#Console Input
		self.askForInput()
Example #5
0
class InputHandler:
	
	commandList = list()
	
	def initializeCommands(self):
		self.cmdClear = self.createCommand("Clear", "/clear", "NONE", "Clears your interpreter console.")
		self.cmdHelp = self.createCommand("Help", "/help", "NONE", "Shows a list of available commands.")
		self.cmdSetName = self.createCommand("SetName", "/setName <Name>", "NAME", "Changes your name to the specified one.")
		self.cmdListChannel = self.createCommand("ListChannel", "/listChannel", "NONE", "Lists all Channel.")
		self.cmdChangeChannel = self.createCommand("ChangeChannel", "/changeChannel <CHANNEL NAME>", "ChannelName", "Enter the specified channel.")
		self.cmdDisconnect = self.createCommand("Disconnect", "/disconnect", "NONE", "Disconnects you from the server.")
		self.cmdListClients = self.createCommand("ListClients", "/listClients <CHANNEL NAME>", "Channel Name", "Shows you a list of clients connected to the specified channel.")
		self.cmdKick = self.createCommand("Kick", "/kick <name/ip>", "<NAME/IP>", "Kicks the specified client from the server.")
		self.cmdBan = self.createCommand("Ban", "/ban <name/ip> <time>", "<NAME/IP> <TIME>", "Bans the specified client for the given amount of time in minutes.")


	def createCommand(self, name, syntax, arguments, description):
		command = Command(name, syntax, arguments, description)
		self.commandList.append(command)
		return command

	def __init__(self, output):
		#Imports
		self.decEncHelper = DecodingEncodingHelper()
		self.guiHelper = GUIHelper(output)
		#Create Commands
		self.initializeCommands()
	
	def handleInput(self, command, clientObject):
		isCommand = True
		command = command.split()
		try:
			var = command[0]
		except IndexError:
			isCommand = False
			self.guiHelper.printOutput("[Client/Error] type /help for a list of commands")
		if isCommand:

			if str(command[0]).lower() == self.cmdClear.name:
				os.system('cls' if os.name=='nt' else 'clear')

			elif str(command[0]).lower() == self.cmdHelp.name:
				self.guiHelper.printOutput("[Client/Info] Commands:")
				self.guiHelper.printOutput("----------------------------------------------------------")
				for command in self.commandList:
					self.guiHelper.printOutput(command.syntax + " : " + command.description)
				self.guiHelper.printOutput("----------------------------------------------------------")

			elif str(command[0]).lower() == self.cmdListChannel.name:
				clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("022"))

			elif str(command[0]).lower() == self.cmdChangeChannel.name:
				newChannelName = None
				try:
					newChannelName = command[1]
				except IndexError:
					self.guiHelper.printOutput("[Client/Error] Syntax: " + self.cmdChangeChannel.syntax)
				if newChannelName != None:
					clientObject.channel = newChannelName
					clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("023" + newChannelName))
					time.sleep(0.1)
					clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("611" + newChannelName))
					time.sleep(0.1)
					clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("901"))

			elif str(command[0]).lower() == self.cmdSetName.name:
				newUsername = None
				try:
					newUsername = command[1]
				except IndexError:
					self.guiHelper.printOutput("[Client/Error] Syntax: " + self.cmdSetName.syntax)
				if newUsername != None:
					clientObject.username = newUsername
					clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("031" + newUsername))

			elif str(command[0]).lower() == self.cmdDisconnect.name:
				clientObject.socketObject.shutdown(1)
				clientObject.socketObject.close()
			
			elif str(command[0]).lower() == self.cmdListClients.name:
				channel = None
				try:
					channel = command[1]
				except:
					self.guiHelper.printOutput("[Client/Error] Syntax: " + self.cmdListClients.syntax)
				if channel != None:
					clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("611" + channel))

			elif str(command[0]).lower() == self.cmdKick.name:
				client = None
				try:
					client = command[1]
				except:
					self.guiHelper.printOutput("[Client/Error] Syntax: " + self.cmdKick.syntax)
				if client != None:
					clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("411" + client))

			elif str(command[0]).lower() == self.cmdBan.name:
				client = None
				banTime = None
				try:
					client = command[1]
					banTime = command[2]
				except:
					self.guiHelper.printOutput("[Client/Error] Syntax: " + self.cmdBan.syntax)
				if client != None and banTime != None:
					clientObject.socketObject.sendall(self.decEncHelper.stringToBytes("711" + client + " " + banTime))

			else:
				self.guiHelper.printOutput("[Client/Error] Unknown command: " + command[0])
				self.guiHelper.printOutput("[Client/Error] type /help for a list of commands")
Example #6
0
class Client:
    def importScripts(self):
        self.decEncHelper = DecodingEncodingHelper()
        self.inputHandler = InputHandler(self.output)
        self.fileHelper = FileHelper(self.output)
        self.guiHelper = GUIHelper(self.output)

    def setConfig(self):
        Config = self.fileHelper.getConfig()
        self.ipV4 = Config.ip
        self.port = Config.port

    def inizializeClient(self, username, password):
        self.clientObject = ClientObject(username, None, self.ipV4, self.port,
                                         "Welcome_Channel")
        self.connected = False
        self.password = password

    def button(self):
        if self.mainWindow.statusButton.text() != "Offline":
            self.sendInput("/disconnect")
            self.mainWindow.statusButton.setText("Offline")
            self.mainWindow.output.clear()
            self.mainWindow.channelTree.clear()
            self.connected = False
        else:
            data = CustomDialog().getData()
            if data == ":":
                self.mainWindow.close()
            else:
                data = data.split(":")
                self.inizializeClient(data[0], data[1])
                self.tryConnect()

    def tryConnect(self):
        trys = 0
        while not self.connected:
            try:
                self.clientObject.socketObject = socket.socket(
                    socket.AF_INET, socket.SOCK_STREAM)
                self.clientObject.socketObject.connect(
                    (self.clientObject.ip, self.clientObject.port))
                threading.Thread(target=ServerHandler,
                                 args=[self.clientObject,
                                       self.mainWindow]).start()
                self.clientObject.socketObject.sendall(
                    self.decEncHelper.stringToBytes(
                        "011" + self.clientObject.username + ":" +
                        self.password))
                self.connected = True
            except:
                trys = trys + 1
                os.system('cls' if os.name == 'nt' else 'clear')
                self.guiHelper.printOutput(
                    "[Client/Info] Attempting to connect to server with ip: " +
                    self.clientObject.ip + ". Attempts: " + str(trys))
                time.sleep(5)

    def sendInput(self, message):
        if self.connected:
            if str(message).startswith("/"):
                self.inputHandler.handleInput(str(message[1:]),
                                              self.clientObject)
            else:
                self.output.append("you: " + message)
                try:

                    self.clientObject.socketObject.sendall(
                        self.decEncHelper.stringToBytes("001" + message))
                except:
                    self.connected = False
        else:
            self.guiHelper.printOutput("not connected")

    def __init__(self, username, password, mainWindow):
        #Imports
        self.mainWindow = mainWindow
        self.mainWindow.statusButton.clicked.connect(self.button)
        self.output = mainWindow.output
        self.importScripts()
        #Config
        self.setConfig()
        #Client initializations
        self.inizializeClient(username, password)
        #Client trying to establish a connection
        self.tryConnect()