Skip to content
Snippets Groups Projects
newkey 3.18 KiB
Newer Older
chrissi^'s avatar
chrissi^ committed
#!/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})$';
chrissi^'s avatar
chrissi^ committed
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()
chrissi^'s avatar
chrissi^ committed
        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:
Kasalehlia's avatar
Kasalehlia committed
                    msg = MIMEText(EMAIL_TEXT.format(name=name.replace(' ', '%20'), key=key, code=code, quote=random.choice(QUOTES)[:-1]),'plain','utf-8')
chrissi^'s avatar
chrissi^ committed
                    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
chrissi^'s avatar
chrissi^ committed