Advertisement
khloi2345

Server.py

May 3rd, 2017
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 14.85 KB | None | 0 0
  1. '''
  2. Created on Apr 22, 2017
  3.  
  4. @author: shammy
  5. '''
  6.  
  7. from Tkinter import *
  8. import socket
  9. import threading
  10. import client
  11. import random
  12. import re
  13. import base64
  14. from SimpleHTTPServer import SimpleHTTPRequestHandler as RH
  15. from SocketServer import TCPServer
  16.  
  17.  
  18. import variables
  19.  
  20.  
  21. dctOnline={}
  22. lstClient=[]
  23. layouts=['image/bg3.gif','image/bg5.gif','image/bg6.gif','image/bg7.gif']
  24. clients=set()
  25.        
  26. class ClientHandler(threading.Thread):
  27.     def __init__(self,client,address):
  28.         threading.Thread.__init__(self)
  29.         self._client = client
  30.         #self._address = address
  31.    
  32.     def run(self):
  33.  
  34.         #self._client.send('Welcome to the chatroom!')
  35.         #self._client.send(str('self._record'))
  36.         try:
  37.             self.code=0
  38.             self.clientMess=""
  39.             prog = re.compile('^(a-zA-Z0-9)+$')
  40.             valid_chars = set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. ")
  41.             emailProg = re.compile(r'[a-zA-Z0-9._-]+@[a-z]+\.{1}[a-z]+')
  42.             #valid_chars2 = set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789")
  43.             num=0
  44.             let=0
  45.             emailFlag=False
  46.             usernameFlag=False
  47.             global dctOnline
  48.             while self.code!=2:
  49.                
  50.                 if self.clientMess=='exit':
  51.                     self.code+=2
  52.                 else:
  53.                     fob = open('files/accounts.txt','a+')
  54.                     fob.write("")
  55.                     fob.close()
  56.                    
  57.                     #print "address: ", self._address
  58.                    
  59.                     self.clientMess=self._client.recv(1024)
  60.                     #print "clientMess: ",self.clientMess
  61.                     self.clientMess=self.clientMess.split("/")
  62.                     #print self.clientMess
  63.                    
  64.                     if(self.clientMess[0]=="signup"):
  65.                         for i in self.clientMess[2]:
  66.                             if(str(i).isdigit()):
  67.                                 num=1
  68.                             else:
  69.                                 let=1
  70.                        
  71.                        
  72.                         if(self.clientMess[1]==""):
  73.                             self._client.send("1")#fullname is null
  74.                         elif(self.clientMess[2]==""):
  75.                             self._client.send("2")#username is null
  76.                         elif(self.clientMess[3]==""):
  77.                             self._client.send("3")#email is null
  78.                         elif(self.clientMess[4]==""):
  79.                             self._client.send("4")#password is null
  80.                         elif emailProg.match(self.clientMess[3])==None:
  81.                             self._client.send("12")#emailpattern
  82.                         elif(self.clientMess[5]==""):
  83.                             self._client.send("5")#confirm is null
  84.                         elif not set(self.clientMess[1]).issubset(valid_chars):
  85.                             self._client.send("6")#invalid name
  86.                         elif not ((len(self.clientMess[2])>=8)  and (len(self.clientMess[2])<=16 )):
  87.                             self._client.send("7")#lenght of username is not valid
  88.                         elif not (num==1 and let==1):
  89.                             self._client.send("8")# username is not alpha numeric
  90.                         elif not self.clientMess[4]==self.clientMess[5]:
  91.                             self._client.send("9")# password does not match
  92.                        
  93.                         else:
  94.                             #validation of username
  95.                             account_file=open("files/accounts.txt", "r")
  96.                             accounts=account_file.readlines()
  97.                             print "account>> ",accounts
  98.                             length=len(accounts)
  99.                             print length
  100.                             if(length!=0):
  101.                                 for i in range(0,length-1):
  102.                                     oneAcct=accounts[i].split()
  103.                                     ind=''.join(oneAcct).split("|")
  104.                                     print ind
  105.                                     if(ind[1]==self.clientMess[2]):
  106.                                         usernameFlag=True
  107.                                         break
  108.                                     else:
  109.                                         usernameFlag=False
  110.                                        
  111.                                     if (ind[2]==self.clientMess[3]):
  112.                                         emailFlag=True
  113.                                         break
  114.                                     else:
  115.                                         emailFlag=False
  116.                                        
  117.                                 if usernameFlag==True:
  118.                                     self._client.send("10")# existing username
  119.                                 else:
  120.                                     #self._client.send("12")# GO na GO
  121.                                     if emailFlag==True:
  122.                                         self._client.send("11")# existing email
  123.                                     else:
  124.                                         self._client.send("13")# GO na GO
  125.                                         self.saveAccount(self.clientMess[1],self.clientMess[2],self.clientMess[3],self.clientMess[4])
  126.                                         print "1"
  127.                                        
  128.                             else:
  129.                                 self._client.send("13")# GO na GO
  130.                                 self.saveAccount(self.clientMess[1],self.clientMess[2],self.clientMess[3],self.clientMess[4])
  131.                                 print "2"
  132.                    
  133.                     elif (self.clientMess[0]=="signin"):
  134.                         if(self.clientMess[1]==""):
  135.                             self._client.send("1")#username is null
  136.                         elif(self.clientMess[2]==""):
  137.                             self._client.send("2")#password is null
  138.                         else:
  139.                             print "acer"
  140.                             uname=False
  141.                             password=False
  142.                             myFile=open("files/accounts.txt","r")
  143.                             account=myFile.readlines()
  144.                             print account
  145.                             print dctOnline
  146.                             online=dctOnline.keys()
  147.                             print online
  148.                             for i in account:
  149.                                 oneAccount=str(i).split("|")
  150.                                 print "password file:",oneAccount[3]
  151.                                 password=oneAccount[3].decode('base64','strict')
  152.                                 print "username: user",self.clientMess[1]
  153.                                 print "password decoded: ",password
  154.                                 print "password user: ",self.clientMess[2]
  155.                                 if(self.clientMess[1] in dctOnline):
  156.                                     print "account is already online"
  157.                                     self._client.send("5")
  158.                                    
  159.                                 else:
  160.                                     if((oneAccount[1]==self.clientMess[1] or oneAccount[2]==self.clientMess[1]) and (password==self.clientMess[2])):
  161.                                         uname=True
  162.                                         password=True
  163.                                         break
  164.                                    
  165.                                 '''for o in range(0,len(online)-1):
  166.                                    if(online[o]==self.clientMess[1]):
  167.                                        print "client is already online."
  168.                                        break
  169.                                    else:'''
  170.                                            
  171.                             if(uname==True and password==True):
  172.                                 print "login"
  173.                                 self._client.send("3")#successfully Login
  174.                                 data=self.retrieveDetails(self.clientMess[1])
  175.                                 data=data.split("|")
  176.                                 dctOnline[data[1]]=data[0]
  177.                                
  178.                                
  179.                             else:
  180.                                 self._client.send("4")#account does not exists
  181.                                
  182.                     elif(self.clientMess[0]=="send"):
  183.                         emailFlage=False
  184.                         if(self.clientMess[3]==""):
  185.                             self._client.send("2")#message is null
  186.                         elif(self.clientMess[4]==""):
  187.                             self._client.send("1")#receiver is null
  188.                         else:
  189.                             account_fileEmail=open("files/accounts.txt", "r")
  190.                             accountsEmail=account_fileEmail.readlines()
  191.                             length=len(accountsEmail)+1
  192.                             for i in range(length-1):
  193.                                 oneAcctEmail=accountsEmail[i].split()
  194.                                 indEmail=''.join(oneAcctEmail).split("|")
  195.                                 if (indEmail[2]==self.clientMess[4]):
  196.                                     emailFlage=True
  197.                                     print "eaual"
  198.                                     break
  199.                                 else:
  200.                                     emailFlage=False
  201.                                
  202.                             if emailFlage!=True:
  203.                                 self._client.send("3")#email not exist
  204.                             else:
  205.                                 self._client.send("4")#Send Email
  206.                                 print "Sender: "+self.clientMess[1]
  207.                                 print "Subject: "+self.clientMess[2]
  208.                                 print "Message: "+self.clientMess[3]
  209.                                 print "Receiver: "+self.clientMess[4]
  210.                                 print "Date and Time: "+self.clientMess[5]
  211.                                 self.saveEmail(self.clientMess[1],self.clientMess[2],self.clientMess[3],self.clientMess[4],self.clientMess[5])
  212.                
  213.                     elif(self.clientMess[0]=="logout"):
  214.                         print "logout"
  215.                         del dctOnline[self.clientMess[1]]
  216.                        
  217.                         print dctOnline
  218.                    
  219.                     elif(self.clientMess[0]=="change"):
  220.                         print "change Layout"
  221.                        
  222.                         num= int(random.randint(0, 3))
  223.                         for u in clients:
  224.                             u.sendall(layouts[num])
  225.                        
  226.                        
  227.                        
  228.                        
  229.                             #for data in account:
  230.                
  231.                             #for i in accounts:
  232.             #server.close()
  233.         except  socket.error as error:
  234.             print error
  235.             if error.errno != 10054:
  236.                 return False
  237.            
  238.  
  239.     def retrieveDetails(self, client):
  240.         fob=open("files/accounts.txt","r")
  241.         details=fob.readlines()
  242.         data=""
  243.         for i in details:
  244.             oneData=i.split("|")
  245.             if(oneData[1]==client or oneData[2]==client ):
  246.                 data=i
  247.                 break
  248.         return data
  249.     def saveAccount(self, fullname, username, email, password):
  250.         myFile=open("files/accounts.txt", "a+")
  251.         password=self.encode(password)
  252.         myFile.write(fullname+ "|"+ username+"|"+email+"|"+str(password).strip()+"\n")
  253.         myFile.close()
  254.        
  255.     def saveEmail(self, sender, subject, message, receiver,dateNtime):
  256.         myFile=open("files/emails.txt", "a+")
  257.         myFile.write(sender+ "|"+ subject+"|"+message+"|"+receiver+"|"+dateNtime+"|"+"unread"+"\n")
  258.         myFile.close()
  259.    
  260.    
  261.     def encode(self, string):
  262.         var= string.encode('base64','strict')
  263.         return var
  264.     def decode(self,string):
  265.         var=string.decode('base64','strict')
  266.         return var
  267.    
  268.     def replaceState(self, username, action):
  269.         if(str(action)=="online"):
  270.             print "change to online"
  271.             repdata=""
  272.             s=""
  273.             f = open("files/accounts.txt",'r')
  274.             filedata = f.read()
  275.             f.close()
  276.             print filedata
  277.             filedata+="\n"
  278.             data=filedata.split("\n")
  279.             #print data
  280.             print data
  281.             for o in range(0,len(data)-1):
  282.                 oneAcct=data[o].split("|")
  283.                 print oneAcct
  284.                 if(oneAcct[1]==username or oneAcct[2]==username ):
  285.                    
  286.                     repdata=oneAcct[0]+ "|"+ oneAcct[1]+"|"+oneAcct[2]+"|"+oneAcct[3]+"|"+"online"+"\n"
  287.                     data[o]=repdata
  288.                     break
  289.            
  290.             for e in data:
  291.                 if(e is not ""):
  292.                     s+=e
  293.            
  294.             print s
  295.             f = open("files/accounts.txt",'w')
  296.             f.write(s)
  297.             f.close()
  298.         elif(str(action)=="offline"):
  299.             print "change to offline"
  300.             repdata=""
  301.             s=""
  302.             f = open("files/accounts.txt",'r')
  303.             filedata = f.read()
  304.             f.close()
  305.             print filedata
  306.             filedata+="\n"
  307.            
  308.             data=filedata.split("\n")
  309.             #print data
  310.            
  311.             for o in range(0,len(data)-1):
  312.                 oneAcct=data[o].split("|")
  313.                
  314.                 if(oneAcct[1]==username or oneAcct[2]==username ):
  315.                    
  316.                     repdata=oneAcct[0]+ "|"+ oneAcct[1]+"|"+oneAcct[2]+"|"+oneAcct[3]+"|"+"offline"+"\n"
  317.                    
  318.                     data[o]=repdata
  319.                     break
  320.            
  321.             for e in data:
  322.                 if(e is not ""):
  323.                     s+=e
  324.            
  325.             print s
  326.             f = open("files/accounts.txt",'w')
  327.             f.write(s)
  328.             f.close()
  329.                
  330. buffer=1024
  331. serveradd=(variables.host,variables.port)
  332. server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  333. server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  334. server.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
  335.  
  336. server.bind(serveradd)
  337. server.listen(5)
  338.  
  339.  
  340. print "Server started on port",variables.port,"\n"
  341.  
  342. while True:
  343.     print "Waiting for connection..."
  344.     client, address = server.accept()
  345.     clients.add(client)
  346.     print('...client connected from: ',address)
  347.     handler = ClientHandler(client,address)
  348.     handler.start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement