diff options
Diffstat (limited to 'index.py')
-rwxr-xr-x | index.py | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/index.py b/index.py new file mode 100755 index 0000000..0fd89af --- /dev/null +++ b/index.py @@ -0,0 +1,128 @@ +#!/usr/bin/python +# -*- coding: utf8 -*- + +import sys, os, cgi +appbase = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(appbase) + +import threading +import cherrypy +from tmpl import expose, render +from lxml import etree +from lxml.html import formfill +from StringIO import StringIO +import ldap +import mx.DateTime +from accountservice import accountservice + +class ldapobj(object): + def __init__(s, data): + if len(data) != 1: + raise ValueError, "invalid number of results" + dn, fields = data[0] + s._keys = fields.keys() + for k, v in fields.iteritems(): + s.__dict__[k] = v + s.dn = dn + def __getitem__(s, key): + l = s.__dict__[key] + if len(l) != 1: + raise IndexError, "invalid number of attributes" + return l[0] + def keys(s): + return s._keys + +class SubdapSite(object): + def __init__(s): + cherrypy.config.update({'error_page.404': s.http_404}) + + @expose('error.html') + def http_404(s, status, message, **kwargs): + return render(details = status + ' - ' + message) + + @expose('login.html') + def index(s): + return render(errors = {}) + @expose('login.html') + def login(s, username = None, password = None): + if username == None or password == None: + return render(errors = {'password': 'Login incorrect'}) + if username == '' or password == '': + return render(errors = {'password': 'Login incorrect'}) + + dn = "cn=%s,ou=people,dc=sublab,dc=org" % (username) + try: + l = ldap.initialize('ldaps://taifun.local.sublab.org/') + l.simple_bind_s(dn, password) + except ldap.INVALID_CREDENTIALS: + return render(errors = {'password': 'Login incorrect'}) + except ldap.LDAPError, e: + return render(errors = {'password': 'Login incorrect'}) + # e.message['info'] + + user = ldapobj(l.search_s(dn, ldap.SCOPE_BASE, '(objectclass=*)', [])) + return render('select.html', user = user) + +## x = '' +# for r in data: +# if r[0] != dn: +# continue +## x += '<tr><th>%s</th></tr>\n' % (r[0]) +# for k, v in r[1].iteritems(): +# for value in v: +# details.append([k, value]) +## x += '<tr><td>%s</td><td><pre>%s</pre></td></tr>\n' % (k, "<hr>".join(v)) + + @expose('create.html') + def create(s): + return render(errors = {}, username = '') + @expose('create.html') + def docreate(s, username = None, password = None, password2 = None): + errors = {} + if username == None or username == '': + errors['username'] = 'please specify an user name' + elif accountservice.name_valid(username) != 'valid': + errors['username'] = 'username invalid or taken' + if password == None or len(password) < 6: + errors['password'] = 'please specify a password of at least 6 characters' + if password2 != password: + errors['password2'] = 'passwords did not match' + if len(errors) > 0: + return render(errors = errors, username = username) + + accountservice.name_create(username, password) + return s.login(username, password) + + @cherrypy.expose + def kill(s): + import sys + sys.exit(0) + +config = { + 'global': { + 'server.socket_port': 8080, + 'server.socket_host': '127.0.0.1', +# 'server.socket_host': '::1', + 'tools.staticdir.root': appbase, + }, + '/': { + 'tools.decode.on': True, + 'tools.encode.on': True, + 'tools.gzip.on': True, + 'tools.proxy.on': True, +# 'tools.caching.on': False, +# 'tools.expires.secs': 0, +# 'tools.expires.force': True, + }, + '/static': { + 'tools.staticdir.on': True, + 'tools.staticdir.dir': 'static', + }, +} + +if len(sys.argv) >= 2 and sys.argv[1] == 'standalone': + cherrypy.quickstart(SubdapSite(), "/", config) +else: + cherrypy.config.update({'environment': 'embedded'}) + application = cherrypy.Application(SubdapSite(), script_name = None, config = config) + |