moth/flagd.py

92 lines
2.3 KiB
Python
Raw Normal View History

#! /usr/bin/env python3
import socketserver
import threading
import queue
import time
import hmac
import optparse
import points
import pointscli
2009-08-21 13:27:17 -06:00
import traceback
key = b'My First Shared Secret (tm)'
def hexdigest(data):
return hmac.new(key, data).hexdigest()
house = 'dirtbags' # House team name
flags = {}
toscore = queue.Queue(50)
class Submitter(threading.Thread):
def run(self):
self.sock = pointscli.makesock('localhost')
while True:
try:
delay = 60 - (time.time() % 60)
cat, team = toscore.get(True, delay)
self.submit(cat, team)
except queue.Empty:
self.once()
def once(self):
global flags
global toscore
for cat, team in flags.items():
self.submit(cat, team)
def submit(self, cat, team):
try:
pointscli.submit(self.sock, cat, team, 1)
except:
2009-08-21 13:27:17 -06:00
traceback.print_exc()
class CategoryHandler(socketserver.StreamRequestHandler):
def handle(self):
global flags
try:
catpass = self.rfile.readline().strip()
cat, passwd = catpass.split(b':::')
passwd = passwd.decode('utf-8')
if passwd != hexdigest(cat):
self.wfile.write(b'ERROR :Closing Link: Invalid password\n')
return
cat = cat.decode('utf-8')
except ValueError as foo:
self.wfile.write(b'ERROR :Closing Link: Invalid command\n')
return
flags[cat] = house
while True:
team = self.rfile.readline().strip().decode('utf-8')
if not team:
break
flags[cat] = team
toscore.put((cat, team)) # score a point immediately
flags[cat] = house
class MyServer(socketserver.ThreadingTCPServer):
allow_reuse_address = True
def main():
p = optparse.OptionParser()
p.add_option('-p', '--genpass', dest='cat', default=None,
help='Generate a password for the given category')
opts, args = p.parse_args()
if opts.cat:
print('%s:::%s' % (opts.cat, hexdigest(opts.cat.encode('utf-8'))))
return
submitter = Submitter()
submitter.start()
server = MyServer(('', 6668), CategoryHandler)
server.serve_forever()
if __name__ == '__main__':
main()