Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- '''
- Created on Apr 22, 2017
- @author: shammy
- '''
- from Tkinter import *
- import socket
- import threading
- import client
- import random
- import re
- import base64
- from SimpleHTTPServer import SimpleHTTPRequestHandler as RH
- from SocketServer import TCPServer
- import variables
- dctOnline={}
- lstClient=[]
- layouts=['image/bg3.gif','image/bg5.gif','image/bg6.gif','image/bg7.gif']
- clients=set()
- class ClientHandler(threading.Thread):
- def __init__(self,client,address):
- threading.Thread.__init__(self)
- self._client = client
- #self._address = address
- def run(self):
- #self._client.send('Welcome to the chatroom!')
- #self._client.send(str('self._record'))
- try:
- self.code=0
- self.clientMess=""
- prog = re.compile('^(a-zA-Z0-9)+$')
- valid_chars = set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. ")
- emailProg = re.compile(r'[a-zA-Z0-9._-]+@[a-z]+\.{1}[a-z]+')
- #valid_chars2 = set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789")
- num=0
- let=0
- emailFlag=False
- usernameFlag=False
- global dctOnline
- while self.code!=2:
- if self.clientMess=='exit':
- self.code+=2
- else:
- fob = open('files/accounts.txt','a+')
- fob.write("")
- fob.close()
- #print "address: ", self._address
- self.clientMess=self._client.recv(1024)
- #print "clientMess: ",self.clientMess
- self.clientMess=self.clientMess.split("/")
- #print self.clientMess
- if(self.clientMess[0]=="signup"):
- for i in self.clientMess[2]:
- if(str(i).isdigit()):
- num=1
- else:
- let=1
- if(self.clientMess[1]==""):
- self._client.send("1")#fullname is null
- elif(self.clientMess[2]==""):
- self._client.send("2")#username is null
- elif(self.clientMess[3]==""):
- self._client.send("3")#email is null
- elif(self.clientMess[4]==""):
- self._client.send("4")#password is null
- elif emailProg.match(self.clientMess[3])==None:
- self._client.send("12")#emailpattern
- elif(self.clientMess[5]==""):
- self._client.send("5")#confirm is null
- elif not set(self.clientMess[1]).issubset(valid_chars):
- self._client.send("6")#invalid name
- elif not ((len(self.clientMess[2])>=8) and (len(self.clientMess[2])<=16 )):
- self._client.send("7")#lenght of username is not valid
- elif not (num==1 and let==1):
- self._client.send("8")# username is not alpha numeric
- elif not self.clientMess[4]==self.clientMess[5]:
- self._client.send("9")# password does not match
- else:
- #validation of username
- account_file=open("files/accounts.txt", "r")
- accounts=account_file.readlines()
- print "account>> ",accounts
- length=len(accounts)
- print length
- if(length!=0):
- for i in range(0,length-1):
- oneAcct=accounts[i].split()
- ind=''.join(oneAcct).split("|")
- print ind
- if(ind[1]==self.clientMess[2]):
- usernameFlag=True
- break
- else:
- usernameFlag=False
- if (ind[2]==self.clientMess[3]):
- emailFlag=True
- break
- else:
- emailFlag=False
- if usernameFlag==True:
- self._client.send("10")# existing username
- else:
- #self._client.send("12")# GO na GO
- if emailFlag==True:
- self._client.send("11")# existing email
- else:
- self._client.send("13")# GO na GO
- self.saveAccount(self.clientMess[1],self.clientMess[2],self.clientMess[3],self.clientMess[4])
- print "1"
- else:
- self._client.send("13")# GO na GO
- self.saveAccount(self.clientMess[1],self.clientMess[2],self.clientMess[3],self.clientMess[4])
- print "2"
- elif (self.clientMess[0]=="signin"):
- if(self.clientMess[1]==""):
- self._client.send("1")#username is null
- elif(self.clientMess[2]==""):
- self._client.send("2")#password is null
- else:
- print "acer"
- uname=False
- password=False
- myFile=open("files/accounts.txt","r")
- account=myFile.readlines()
- print account
- print dctOnline
- online=dctOnline.keys()
- print online
- for i in account:
- oneAccount=str(i).split("|")
- print "password file:",oneAccount[3]
- password=oneAccount[3].decode('base64','strict')
- print "username: user",self.clientMess[1]
- print "password decoded: ",password
- print "password user: ",self.clientMess[2]
- if(self.clientMess[1] in dctOnline):
- print "account is already online"
- self._client.send("5")
- else:
- if((oneAccount[1]==self.clientMess[1] or oneAccount[2]==self.clientMess[1]) and (password==self.clientMess[2])):
- uname=True
- password=True
- break
- '''for o in range(0,len(online)-1):
- if(online[o]==self.clientMess[1]):
- print "client is already online."
- break
- else:'''
- if(uname==True and password==True):
- print "login"
- self._client.send("3")#successfully Login
- data=self.retrieveDetails(self.clientMess[1])
- data=data.split("|")
- dctOnline[data[1]]=data[0]
- else:
- self._client.send("4")#account does not exists
- elif(self.clientMess[0]=="send"):
- emailFlage=False
- if(self.clientMess[3]==""):
- self._client.send("2")#message is null
- elif(self.clientMess[4]==""):
- self._client.send("1")#receiver is null
- else:
- account_fileEmail=open("files/accounts.txt", "r")
- accountsEmail=account_fileEmail.readlines()
- length=len(accountsEmail)+1
- for i in range(length-1):
- oneAcctEmail=accountsEmail[i].split()
- indEmail=''.join(oneAcctEmail).split("|")
- if (indEmail[2]==self.clientMess[4]):
- emailFlage=True
- print "eaual"
- break
- else:
- emailFlage=False
- if emailFlage!=True:
- self._client.send("3")#email not exist
- else:
- self._client.send("4")#Send Email
- print "Sender: "+self.clientMess[1]
- print "Subject: "+self.clientMess[2]
- print "Message: "+self.clientMess[3]
- print "Receiver: "+self.clientMess[4]
- print "Date and Time: "+self.clientMess[5]
- self.saveEmail(self.clientMess[1],self.clientMess[2],self.clientMess[3],self.clientMess[4],self.clientMess[5])
- elif(self.clientMess[0]=="logout"):
- print "logout"
- del dctOnline[self.clientMess[1]]
- print dctOnline
- elif(self.clientMess[0]=="change"):
- print "change Layout"
- num= int(random.randint(0, 3))
- for u in clients:
- u.sendall(layouts[num])
- #for data in account:
- #for i in accounts:
- #server.close()
- except socket.error as error:
- print error
- if error.errno != 10054:
- return False
- def retrieveDetails(self, client):
- fob=open("files/accounts.txt","r")
- details=fob.readlines()
- data=""
- for i in details:
- oneData=i.split("|")
- if(oneData[1]==client or oneData[2]==client ):
- data=i
- break
- return data
- def saveAccount(self, fullname, username, email, password):
- myFile=open("files/accounts.txt", "a+")
- password=self.encode(password)
- myFile.write(fullname+ "|"+ username+"|"+email+"|"+str(password).strip()+"\n")
- myFile.close()
- def saveEmail(self, sender, subject, message, receiver,dateNtime):
- myFile=open("files/emails.txt", "a+")
- myFile.write(sender+ "|"+ subject+"|"+message+"|"+receiver+"|"+dateNtime+"|"+"unread"+"\n")
- myFile.close()
- def encode(self, string):
- var= string.encode('base64','strict')
- return var
- def decode(self,string):
- var=string.decode('base64','strict')
- return var
- def replaceState(self, username, action):
- if(str(action)=="online"):
- print "change to online"
- repdata=""
- s=""
- f = open("files/accounts.txt",'r')
- filedata = f.read()
- f.close()
- print filedata
- filedata+="\n"
- data=filedata.split("\n")
- #print data
- print data
- for o in range(0,len(data)-1):
- oneAcct=data[o].split("|")
- print oneAcct
- if(oneAcct[1]==username or oneAcct[2]==username ):
- repdata=oneAcct[0]+ "|"+ oneAcct[1]+"|"+oneAcct[2]+"|"+oneAcct[3]+"|"+"online"+"\n"
- data[o]=repdata
- break
- for e in data:
- if(e is not ""):
- s+=e
- print s
- f = open("files/accounts.txt",'w')
- f.write(s)
- f.close()
- elif(str(action)=="offline"):
- print "change to offline"
- repdata=""
- s=""
- f = open("files/accounts.txt",'r')
- filedata = f.read()
- f.close()
- print filedata
- filedata+="\n"
- data=filedata.split("\n")
- #print data
- for o in range(0,len(data)-1):
- oneAcct=data[o].split("|")
- if(oneAcct[1]==username or oneAcct[2]==username ):
- repdata=oneAcct[0]+ "|"+ oneAcct[1]+"|"+oneAcct[2]+"|"+oneAcct[3]+"|"+"offline"+"\n"
- data[o]=repdata
- break
- for e in data:
- if(e is not ""):
- s+=e
- print s
- f = open("files/accounts.txt",'w')
- f.write(s)
- f.close()
- buffer=1024
- serveradd=(variables.host,variables.port)
- server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- server.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
- server.bind(serveradd)
- server.listen(5)
- print "Server started on port",variables.port,"\n"
- while True:
- print "Waiting for connection..."
- client, address = server.accept()
- clients.add(client)
- print('...client connected from: ',address)
- handler = ClientHandler(client,address)
- handler.start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement