From 5fdec0e012ccd365239332cd650f4a34bff60c01 Mon Sep 17 00:00:00 2001
From: kaiyou <pierre@jaury.eu>
Date: Wed, 18 Mar 2020 11:39:50 +0100
Subject: [PATCH] Constraint profile format with regex, fix #36

---
 hiboo/models.py                               |  1 +
 hiboo/profile/login.py                        |  5 ++++
 hiboo/service/forms.py                        |  1 +
 .../ccae1d6b9c13_add_profile_regex.py         | 26 +++++++++++++++++++
 4 files changed, 33 insertions(+)
 create mode 100644 migrations/versions/ccae1d6b9c13_add_profile_regex.py

diff --git a/hiboo/models.py b/hiboo/models.py
index f4c8f83e..33b7fafd 100644
--- a/hiboo/models.py
+++ b/hiboo/models.py
@@ -164,6 +164,7 @@ class Service(db.Model):
     description = db.Column(db.String())
     policy = db.Column(db.String(255))
     max_profiles = db.Column(db.Integer(), nullable=False, default=1)
+    profile_regex = db.Column(db.String(255))
     same_username = db.Column(db.Boolean(), nullable=False, default=False)
     config = db.Column(mutable.MutableDict.as_mutable(JSONEncoded))
 
diff --git a/hiboo/profile/login.py b/hiboo/profile/login.py
index 298a75e5..3e4b8af2 100644
--- a/hiboo/profile/login.py
+++ b/hiboo/profile/login.py
@@ -2,6 +2,7 @@ from hiboo.profile import blueprint, forms
 from hiboo import models, utils, security
 from hiboo import user as hiboo_user
 from passlib import context, hash
+from wtforms import validators
 
 import flask
 import flask_login
@@ -48,6 +49,10 @@ def create(service_uuid, create_for=False):
             status = models.Profile.REQUEST
     # Actually display the form
     form = forms.ProfileForm()
+    if service.profile_regex:
+        form.username.validators.append(
+            validators.Regexp("^{}$".format(service.profile_regex)),
+        )
     if service.same_username:
         form.username.data = user.username
         form.username.render_kw = {"readonly": True}
diff --git a/hiboo/service/forms.py b/hiboo/service/forms.py
index cd7fafce..86efd823 100644
--- a/hiboo/service/forms.py
+++ b/hiboo/service/forms.py
@@ -16,5 +16,6 @@ class ServiceForm(flask_wtf.FlaskForm):
         choices=list(models.Service.POLICIES.items()))
     max_profiles = fields.IntegerField(_('Maximum profile count'),
         [validators.NumberRange(1, 1000)])
+    profile_regex = fields.StringField(_('Profile usenrame regex'))
     same_username = fields.BooleanField(_('Disable per-profile username'))
     submit = fields.SubmitField(_('Submit'))
diff --git a/migrations/versions/ccae1d6b9c13_add_profile_regex.py b/migrations/versions/ccae1d6b9c13_add_profile_regex.py
new file mode 100644
index 00000000..cd1e6005
--- /dev/null
+++ b/migrations/versions/ccae1d6b9c13_add_profile_regex.py
@@ -0,0 +1,26 @@
+""" Set a regex for constraining profile username
+
+Revision ID: ccae1d6b9c13
+Revises: ebc103f8bc5e
+Create Date: 2020-03-18 11:30:52.611835
+"""
+
+from alembic import op
+import sqlalchemy as sa
+import hiboo
+
+
+revision = 'ccae1d6b9c13'
+down_revision = 'ebc103f8bc5e'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    with op.batch_alter_table('service') as batch_op:    
+        batch_op.add_column(sa.Column('profile_regex', sa.String(length=255), nullable=True))
+
+
+def downgrade():
+    with op.batch_alter_table('service') as batch_op:    
+        batch_op.drop_column('profile_regex')
-- 
GitLab