Guest User

Untitled

a guest
Mar 8th, 2013
11,779
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

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×