Merge branch 'feature/limitConnections' into dev

This commit is contained in:
HorlogeSkynet
2017-03-09 12:37:13 +01:00
2 changed files with 31 additions and 7 deletions
Client
Server

@ -19,7 +19,7 @@ from tkinter.messagebox import showwarning, showinfo
__author__ = "HorlogeSkynet"
__copyright__ = "Copyright 2017, ACMS"
__license__ = "GPLv3"
__version__ = "0.1.8"
__version__ = "0.1.10"
__status__ = "Development"
__date__ = "02/22/2017"
@ -190,6 +190,10 @@ if __name__ == '__main__':
except ConnectionRefusedError:
showwarning("Connection has failed !", "No server seems running on " + serverIP + ':' + str(serverPort) + "...")
except (ConnectionResetError, OSError):
showwarning("Your IP is blacklisted !", "Too many connections have been received from your IP on " + serverIP + ':' + str(serverPort) + "...")
quit()
finally:
messageBox.destroy()
@ -223,7 +227,9 @@ if __name__ == '__main__':
currentWorkingDir = recvData()
if currentWorkingDir.startswith('NEW_PATH:'):
currentWorkingDir = currentWorkingDir.split(':', 1)[1]
else:
print("Received from server: \"" + currentWorkingDir + '\"\n')
quit()
# Usage procedure

@ -22,11 +22,15 @@ from fileCommands import DATA_PATH, listFiles, changeDirectory, makeDirectory, m
__authors__ = "HorlogeSkynet, Tatiyk"
__copyright__ = "Copyright 2017, ACMS"
__license__ = "GPLv3"
__version__ = "0.1.13"
__version__ = "0.1.16"
__status__ = "Development"
__date__ = "02/22/2017"
MAX_SESSIONS_PER_USER = 2
MAX_NUMBER_CLIENTS_PER_IP = 2
################
# Client class #
################
@ -44,6 +48,8 @@ class ClientThread(threading.Thread):
self.HOME_DIR = DATA_PATH
self.currentWorkingDir = ''
self.username = ''
def run(self):
clients.append(self)
@ -94,8 +100,15 @@ class ClientThread(threading.Thread):
sendData(self.sock, "AUTHENTICATION_ERROR")
continue
self.checkAndSetHomeDir(login[1])
sendData(self.sock, 'NEW_PATH:' + '/' + self.currentWorkingDir.partition(DATA_PATH)[2])
self.username = login[1]
# Contain session number here
if [client.username for client in clients].count(self.username) > MAX_SESSIONS_PER_USER:
sendData(self.sock, 'ERROR: Too many sessions are already opened for this account.')
else:
self.checkAndSetHomeDir()
sendData(self.sock, 'NEW_PATH:' + '/' + self.currentWorkingDir.partition(DATA_PATH)[2])
# Usage procedure #
while True:
@ -113,15 +126,15 @@ class ClientThread(threading.Thread):
clients.remove(self)
def checkAndSetHomeDir(self, login):
def checkAndSetHomeDir(self):
tmp = self.HOME_DIR
self.HOME_DIR += login + '/'
self.HOME_DIR += self.username + '/'
if not os.path.exists(self.HOME_DIR):
try:
os.mkdir(self.HOME_DIR)
except:
print("Cannot create home directory for " + login)
print("Cannot create home directory for " + self.username)
self.currentWorkingDir = tmp
return
self.currentWorkingDir = self.HOME_DIR
@ -233,6 +246,11 @@ if __name__ == '__main__':
# We wait and accept each entering connection
sock, (address, port) = listenSock.accept()
# Limit DDoS here
if [client.address for client in clients].count(address) + 1 > MAX_NUMBER_CLIENTS_PER_IP:
sock.close()
continue
# Creates a SSL socket from the one that has just been set up above
sockSSL = ssl.wrap_socket(sock, server_side=True, certfile="Server/Credentials/server.crt", keyfile="Server/Credentials/server.key")