#!/usr/bin/env python2 # coding=utf-8 import cgi import cgitb import os import random import re import smtplib import string import time from email.mime.text import MIMEText from subprocess import Popen, PIPE, check_output, CalledProcessError cgitb.enable() KEY_DIR='/home/kasalehlia/keys/' CONTACT_FILE='/home/kasalehlia/contacts.txt' KEY_PATTERN = r'# ([a-zA-Z0-9-_\. äÄöÖüÜß]+) ?#? ?([\S ]+)?\r?\n([0-9a-f]{64})$'; #KEY_PATTERN = r'# ([\w.- ]+) ?#? ?([\S ]+)?\r?\n([0-9a-f]{64})$'; EMAIL_FROM = 'keys@freifunk-bs.de' EMAIL_TO = 'ffbs-admin@stratum0.org' #EMAIL_TO = 'kasa@shakik.de' EMAIL_TEXT = """Key approval request: {name} with key {key}.\n To approve: http://www.freifunk-bs.de/approve_key?name={name}&code={code}\n To deny: http://www.freifunk-bs.de/deny_key?name={name}&code={code}\n \n`{quote}`""" QUOTES = list(open('/home/kasalehlia/portal.quotes')) print "Content-Type: application/json; charset=utf-8" print "" form = cgi.FieldStorage() try: inp = form['key'].value.strip() contact = form.getfirst('contact','').strip() match = re.match(KEY_PATTERN, inp) if match: name,_contact,key = match.groups() name = name.strip() if not contact: contact = _contact code = ''.join(random.choice(string.letters + string.digits) for _ in xrange(64)) if os.path.isfile(KEY_DIR+name): print '{"success":false, "message":"Dieser Name oder dieser Schlüssel ist bereits eingetragen"}' else: try: res = check_output(['/bin/grep','-r','--exclude-dir=codes',key,KEY_DIR]) except CalledProcessError as e: res = e.output if len(res): print '{"success":false, "message":"Dieser Name oder dieser Schlüssel ist bereits eingetragen"}' else: with open(KEY_DIR+name,'w') as f: f.write('key "%s";\n' % key) with open(KEY_DIR+'/codes/'+code,'w') as f: f.write(name) with open(CONTACT_FILE, 'a') as f: f.write('{},{},{},{}\n'.format(time.time(),key,name,contact)) #s = smtplib.SMTP('localhost') if 'NOMAIL' not in name: msg = MIMEText(EMAIL_TEXT.format(name=name.replace(' ', '%20'), key=key, code=code, quote=random.choice(QUOTES)[:-1]),'plain','utf-8') msg['From'] = EMAIL_FROM msg['To'] = EMAIL_TO msg['Subject'] = 'Key approval request for %s' % name #s.sendmail(EMAIL_FROM, [EMAIL_TO], msg.as_string()) #s.quit() p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE) p.communicate(msg.as_string()) print '{"success":true, "message":"Dein Schlüssel wurde eingetragen, muss aber noch von einem Administrator bestätigt werden"}' else: print '{"success":true, "message":"debug input accepted"}' else: print '{"success":false, "message":"Die Eingabe ist fehlerhaft"}' except Exception as e: print '{"success":false, "message":"Die Eingabe ist fehlerhaft", "err":"'+repr(e)+'"}' #raise e