diff --git a/lumi2/__init__.py b/lumi2/__init__.py
index d615a31..f9f63c3 100644
--- a/lumi2/__init__.py
+++ b/lumi2/__init__.py
@@ -24,6 +24,7 @@ def create_app(test_config=None):
LDAP_GROUPS_OU='ou=groups,dc=example,dc=com',
LDAP_USER_OBJECT_CLASS='inetOrgPerson',
LDAP_GROUP_OBJECT_CLASS='groupOfUniqueNames',
+ MAX_CONTENT_LENGTH=8_000_000,
)
if test_config is None:
diff --git a/lumi2/templates/usermanager/user_detail.html b/lumi2/templates/usermanager/user_detail.html
index 36d059b..87e298a 100644
--- a/lumi2/templates/usermanager/user_detail.html
+++ b/lumi2/templates/usermanager/user_detail.html
@@ -14,6 +14,8 @@
+
+
{% endblock content %}
diff --git a/lumi2/usermanager.py b/lumi2/usermanager.py
index 98d7d61..1781752 100644
--- a/lumi2/usermanager.py
+++ b/lumi2/usermanager.py
@@ -1,8 +1,12 @@
"""Views for lumi2."""
+from pathlib import Path
+from tempfile import TemporaryDirectory
+
from flask import (
Blueprint, render_template, abort, request, flash
)
+from PIL import Image, UnidentifiedImageError
import lumi2.ldap as ldap
from lumi2.usermodel import User, Group
@@ -22,6 +26,14 @@ def index():
def user_detail(username: str):
"""Detail view for a specific User."""
+ def _file_extension_is_valid(filename: str):
+ allowed_extensions = ["jpg", "jpeg"]
+ if '.' not in filename:
+ return False
+ if filename.rsplit('.', 1)[1].lower() not in allowed_extensions:
+ return False
+ return True
+
try:
conn = ldap.get_connection()
except Exception:
@@ -65,9 +77,33 @@ def user_detail(username: str):
if request.form['password']:
user.password_hash = User.generate_password_hash(request.form['password'])
+ picture_updated = False
+ if 'picture' in request.files:
+ file = request.files['picture']
+ if len(file.filename):
+ if _file_extension_is_valid(file.filename):
+ with TemporaryDirectory() as tempdir:
+ path_to_file = Path(tempdir) / "upload.jpg"
+ file.save(path_to_file)
+ try:
+ picture = Image.open(path_to_file, formats=['JPEG'])
+ user.picture = picture
+ picture_updated = True
+ except UnidentifiedImageError:
+ flash(
+ "There was a problem with the provided picture " \
+ "(it may be corrupted)."
+ )
+ form_is_valid = False
+ else:
+ flash("Invalid file extension for picture.")
+ form_is_valid = False
+
if form_is_valid:
ldap.update_user(conn, user)
flash("User information was updated!")
+ if picture_updated:
+ ldap.get_user(conn, user.username)._generate_static_images(force=True)
conn.unbind()
return render_template('usermanager/user_detail.html', user=user)