Guest User

Untitled

a guest
Mar 8th, 2013
11,673
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import sys, socket, threading, time, traceback, random, os
  2.  
  3. class Logger:
  4.     def __init__(self, filename):
  5.         self.filename = filename
  6.        
  7.     def log(self, s):
  8.         t = time.time()
  9.         stime = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(t)) + ".%03d" % (int((t * 1000)) % 1000)
  10.         line = stime + " " + s
  11.        
  12.         of = open(self.filename, "ab")        
  13.         of.write(line + "\r\n")
  14.         of.close()
  15.         print line
  16.    
  17. class Server(threading.Thread):
  18.     def __init__(self, csock, address, clientcounter):
  19.         threading.Thread.__init__(self)
  20.  
  21.         self.logger = Logger("logs/clientlog-%d-%d.txt" % (int(time.time()), clientcounter))
  22.         self.csock = csock
  23.         self.address = address
  24.  
  25.     def logsend(self, s):
  26.         self.logger.log("Sending line: " + repr(s))
  27.         self.csock.sendall(s + "\r\n")
  28.        
  29.     def logrecv(self):
  30.         line = ""
  31.         while not line.endswith("\r\n"):
  32.             try:
  33.                 data = self.csock.recv(1)
  34.                 if len(data) == 0:
  35.                     self.logger.log("Client terminated connection, incomplete line: " + repr(line))
  36.                     return None
  37.             except socket.timeout:
  38.                 self.logger.log("Client timeout, incomplete line: " + repr(line))
  39.                 return None
  40.                
  41.             line += data
  42.            
  43.         self.logger.log("Received line: " + repr(line))
  44.         return line.strip("\r\n")
  45.        
  46.     def handle_rand(self, parts):
  47.         if len(parts) != 2:
  48.             self.logsend("02 Invalid parameters")
  49.             return True
  50.            
  51.         count = 0
  52.         try:
  53.             count = int(parts[1])
  54.         except:
  55.             self.logsend("02 Not an integer")
  56.             return True
  57.            
  58.         self.logsend("01 OK")
  59.         for i in xrange(count):
  60.             s = str(ord(os.urandom(1)))
  61.             self.logsend(s)
  62.         self.logsend(".")
  63.         return True
  64.    
  65.     def send_file(self, filename):
  66.         self.logsend("01 OK")
  67.         for line in open(filename, "rb"):
  68.             line = line.strip("\r\n")
  69.             self.logsend(line)
  70.         self.logsend(".")
  71.         return True
  72.        
  73.     def handle_base29(self, parts):
  74.         if len(parts) != 2:
  75.             self.logsend("02 Invalid parameters")
  76.             return True
  77.            
  78.         n = 0
  79.         try:
  80.             n = int(parts[1])
  81.         except:
  82.             self.logsend("02 Not an integer")
  83.             return True
  84.        
  85.         s = ""
  86.         while n > 0:
  87.             s = "0123456789ABCDEFGHIJKLMNOPQRSTUVXYZ"[n % 29] + s
  88.             n /= 29
  89.            
  90.         if s == "":
  91.             s = "0"
  92.            
  93.         self.logsend("01 OK " + s)
  94.         return True
  95.        
  96.     def recv_file(self):
  97.         self.logsend("01 OK")
  98.        
  99.         count = 1
  100.         while True:
  101.             filename = "received%d.txt" % count
  102.             if not os.path.isfile(filename):
  103.                 break
  104.            
  105.             count += 1
  106.            
  107.         of = open(filename, "wb")
  108.         while True:
  109.             line = self.logrecv()
  110.             if line is None:
  111.                 break
  112.                
  113.             if line == ".":
  114.                 break
  115.                
  116.             of.write(line + "\r\n")
  117.                
  118.         of.close()
  119.        
  120.         self.logsend("01 OK")
  121.         return True
  122.    
  123.     def handle_dh(self, parts):
  124.         if len(parts) != 2:
  125.             self.logsend("02 Invalid parameters")
  126.             return True
  127.            
  128.         p = 0
  129.         try:
  130.             p = int(parts[1])
  131.         except:
  132.             self.logsend("02 Not an integer")
  133.             return True
  134.        
  135.         base = random.randint(2, p)
  136.         a = random.randint(2, p)
  137.         self.logger.log("Selected base %d and secret %d" % (base, a))
  138.        
  139.         A = pow(base, a, p)
  140.        
  141.         self.logsend("01 OK %d %d" % (base, A))
  142.        
  143.         line = self.logrecv()
  144.         B = 0
  145.         try:
  146.             B = int(line)
  147.         except:
  148.             self.logsend("02 Not an integer")
  149.             return True
  150.            
  151.         s = pow(B, a, p)
  152.        
  153.         self.logsend("03 DATA %d" % s)
  154.         return True
  155.    
  156.     def handle_line(self, line):
  157.         parts = line.split()
  158.         if len(parts) == 0:
  159.             self.logsend("02 No command specified")
  160.             return True
  161.            
  162.         cmd = parts[0].lower()
  163.        
  164.         if cmd == "rand": # b
  165.             return self.handle_rand(parts)
  166.            
  167.         elif cmd == "quine": # c
  168.             return self.send_file("quine.py")
  169.            
  170.         elif cmd == "base29": # d
  171.             return self.handle_base29(parts)
  172.            
  173.         elif cmd == "code": # e
  174.             return self.send_file("server.py")
  175.            
  176.         elif cmd == "koan": # f
  177.             return self.send_file("koan.txt")
  178.  
  179.         elif cmd == "dh": # g
  180.             return self.handle_dh(parts)
  181.            
  182.         elif cmd == "next": # i
  183.             return self.recv_file()
  184.            
  185.         elif cmd == "goodbye": # j
  186.             self.logsend("99 GOODBYE")
  187.             return False
  188.            
  189.         else:
  190.             self.logsend("02 No such command")
  191.             return True
  192.            
  193.         return False
  194.            
  195.     def run(self):
  196.         try:
  197.             self.csock.settimeout(60 * 10)
  198.        
  199.             self.logsend("00 WELCOME Python")
  200.             while True:
  201.                 line = self.logrecv()
  202.                 if line is None:
  203.                     break
  204.                
  205.                 res = self.handle_line(line)
  206.                 if res is not True:
  207.                     break
  208.                    
  209.         except:
  210.             self.logger.log("Encountered exception: " + repr(sys.exc_info()[:2]))
  211.             print "Traceback:"
  212.             print traceback.format_exc()
  213.            
  214.         self.logger.log("Closing connection and exiting")
  215.         self.csock.close()
  216.         return
  217.    
  218. def main():
  219.     logger = Logger("logs/mainlog.txt")
  220.    
  221.     clientcounter = 0
  222.    
  223.     ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  224.    
  225.     ssock.bind(("", 31415))
  226.     ssock.listen(5)
  227.     logger.log("Listerer started")
  228.    
  229.     while True:
  230.         csock, address = ssock.accept()
  231.         logger.log("Got connection from address " + repr(address))
  232.         srv = Server(csock, address, clientcounter)
  233.         srv.start()
  234.         clientcounter += 1
  235.        
  236. main()
RAW Paste Data