|
|
- import ldap as l
- from ldap3 import Server, Connection, ALL, MODIFY_REPLACE
- from flask import Flask, g, request, session, redirect, url_for, render_template
- from flask_simpleldap import LDAP
- from flask_bootstrap import Bootstrap
- from email_validator import validate_email, EmailNotValidError
- import os
-
- app = Flask(__name__)
- Bootstrap(app)
- app.secret_key = 'asdf'
- app.debug = True
-
- # Base
- app.config['LDAP_REALM_NAME'] = 'OpenLDAP Authentication'
- app.config['LDAP_HOST'] = os.environ.get('LDAP_HOST')
- app.config['LDAP_BASE_DN'] = os.environ.get('LDAP_BASE_DN')
- app.config['LDAP_USERNAME'] = os.environ.get('LDAP_USERNAME')
- app.config['LDAP_PASSWORD'] = os.environ.get('LDAP_PASSWORD')
-
- # OpenLDAP
- app.config['LDAP_OBJECTS_DN'] = 'dn'
- app.config['LDAP_OPENLDAP'] = True
- app.config['LDAP_USER_OBJECT_FILTER'] = '(&(objectclass=posixAccount)(uid=%s))'
-
- ldap = LDAP(app)
-
- server = Server(app.config['LDAP_HOST'])
- conn = Connection(server, app.config['LDAP_USERNAME'], app.config['LDAP_PASSWORD'], auto_bind=True)
-
- @app.before_request
- def before_request():
- g.user = None
- if 'user_id' in session:
- # This is where you'd query your database to get the user info.
- g.user = {}
-
-
- @app.route('/')
- @ldap.login_required
- def index():
- user_dict = ldap.get_object_details(session['user_id'])
-
- if 'user_id' in session:
- user = {'dn': 'cn={},cn=usergroup,ou=users,dc=technicalincompetence,dc=club'.format(user_dict['cn'][0].decode('ascii')),
- 'firstName': user_dict['givenName'][0].decode('ascii'),
- 'lastName': user_dict['sn'][0].decode('ascii'),
- 'email': user_dict['mail'][0].decode('ascii'),
- 'userName': user_dict['uid'][0].decode('ascii'),
- }
-
-
- return render_template('profile.j2', user = user)
-
-
- @app.route('/login', methods=['GET', 'POST'])
- def login():
- if g.user:
- return redirect(url_for('index'))
- if request.method == 'POST':
- user = request.form['user']
- passwd = request.form['passwd']
- test = ldap.bind_user(user, passwd)
- if test is None or passwd == '':
- return render_template('login.j2', error='Invalid credentials')
- else:
- session['user_id'] = request.form['user']
- session['passwd'] = request.form['passwd']
- return redirect('/')
- return render_template('login.j2')
-
-
- @ldap.login_required
- @app.route('/update/email', methods=['POST'])
- def update_email():
- if request.method == 'POST':
- email = request.form['email']
- dn = request.form['dn']
-
- if email != None and len(email) > 0:
- try:
- # Validate.
- valid = validate_email(email)
-
- # Update with the normalized form.
- conn.modify(dn, {'mail': [(MODIFY_REPLACE, [valid.email])]})
- return 'Success'
- except EmailNotValidError as e:
- # email is not valid, exception message is human-readable
- print(str(e))
- return 'Invalid email address'
- return 'Email cannot be empty'
-
-
- @ldap.login_required
- @app.route('/update/name', methods=['POST'])
- def update_name():
- if request.method == 'POST':
- firstName = request.form['firstName']
- lastName = request.form['lastName']
- dn = request.form['dn']
-
- if (firstName != None and len(firstName) > 0) and (lastName != None and len(lastName) > 0):
- conn.modify(dn, {'givenName': [(MODIFY_REPLACE, [firstName])],
- 'sn': [(MODIFY_REPLACE, [lastName])]})
- return 'Success'
- return 'Name cannot be empty'
-
-
- @ldap.login_required
- @app.route('/update/username', methods=['POST'])
- def update_username():
- if request.method == 'POST':
- userName = request.form['userName']
- dn = request.form['dn']
-
- if userName != None and len(userName) > 0:
- conn.modify(dn, {'uid': [(MODIFY_REPLACE, [userName])]})
- return 'Success'
- return 'Username cannot be empty'
-
-
- @ldap.login_required
- @app.route('/update/password', methods=['POST'])
- def update_password():
- if request.method == 'POST':
- currentPassword = request.form['currentPassword']
- newPassword = request.form['newPassword']
- confirmPassword = request.form['confirmPassword']
- dn = request.form['dn']
-
- if currentPassword == '':
- return 'Please enter your current password'
-
- if newPassword == '':
- return 'Please enter a new password'
-
- if confirmPassword == '':
- return 'Please confirm your new password'
-
- if newPassword != confirmPassword:
- return 'Could not confirm new password, please make sure you typed it correctly'
-
- test = ldap.bind_user(session['user_id'], currentPassword)
- if test is None:
- return 'Current password is incorrect'
- else:
- conn.extend.standard.modify_password(user=dn, new_password=newPassword)
- return 'Success'
- return 'Error'
-
-
- @app.route('/logout')
- def logout():
- session.pop('user_id', None)
- return redirect(url_for('index'))
-
-
- if __name__ == '__main__':
- app.run()
|