]> git.ipfire.org Git - ipfire.org.git/commitdiff
people: Implement simple registration process
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 18 Nov 2018 14:29:45 +0000 (14:29 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 18 Nov 2018 14:29:45 +0000 (14:29 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Makefile.am
src/backend/accounts.py
src/templates/auth/register-success.html [new file with mode: 0644]
src/templates/auth/register.html [new file with mode: 0644]
src/web/__init__.py
src/web/auth.py

index 6fe92dd2ffa17e0051a8f4dea1ab0cf57a77fe53..e08b5b397390743795b0ee99c3b57f082839cdf3 100644 (file)
@@ -106,7 +106,9 @@ templates_DATA = \
 templatesdir = $(datadir)/templates
 
 templates_auth_DATA = \
-       src/templates/auth/login.html
+       src/templates/auth/login.html \
+       src/templates/auth/register.html \
+       src/templates/auth/register-success.html
 
 templates_authdir = $(templatesdir)/auth
 
index 229e730adc615c69bd84b52d0b895efff3e0e0ba..0fafce5c2ac11dbb7c4627815c89100e82608a1e 100644 (file)
@@ -85,6 +85,19 @@ class Accounts(Object):
                if result:
                        return result[0]
 
+       def uid_exists(self, uid):
+               if self.get_by_uid(uid):
+                       return True
+
+               res = self.db.get("SELECT 1 FROM account_activations \
+                       WHERE uid = %s AND expires_at > NOW()", uid)
+
+               if res:
+                       return True
+
+               # Account with uid does not exist, yet
+               return False
+
        def get_by_uid(self, uid):
                return self._search_one("(&(objectClass=person)(uid=%s))" % uid)
 
@@ -109,6 +122,33 @@ class Accounts(Object):
                        (|(sipAuthenticationUser=%s)(telephoneNumber=%s)(homePhone=%s)(mobile=%s)))" \
                        % (number, number, number, number))
 
+       # Registration
+
+       def create(self, uid, email, first_name, last_name):
+               # Check if UID is unique
+               if self.get_by_uid(uid):
+                       raise ValueError("UID exists: %s" % uid)
+
+               activation_code = util.random_string(24)
+
+               # Account Parameters
+               account = {
+                       "objectClass"  : [b"top", b"person", b"inetOrgPerson"],
+                       "userPassword" : activation_code.encode(),
+                       "mail"         : email.encode(),
+
+                       # Name
+                       "cn"           : b"%s %s" % (first_name.encode(), last_name.encode()),
+                       "sn"           : last_name.encode(),
+                       "givenName"    : first_name.encode(),
+               }
+
+               # Create account on LDAP
+               self.ldap.add_s("uid=%s,ou=People,dc=mcfly,dc=local" % uid, ldap.modlist.addModlist(account))
+
+               # TODO Send email with activation code
+               pass
+
        # Session stuff
 
        def _cleanup_expired_sessions(self):
diff --git a/src/templates/auth/register-success.html b/src/templates/auth/register-success.html
new file mode 100644 (file)
index 0000000..e8b1b20
--- /dev/null
@@ -0,0 +1,20 @@
+{% extends "../base.html" %}
+
+{% block title %}{{ _("Thank You") }}{% end block %}
+
+{% block content %}
+       <div class="row justify-content-center my-5">
+               <div class="col-12 col-md-6">
+                       <div class="card bg-success text-white p-md-5">
+                               <div class="card-body text-center">
+                                       <span class="fas fa-check fa-5x my-4"></span>
+
+                                       <p class="lead">
+                                               {{ _("Your account has been created.") }}
+                                               {{ _("Please check your email for next steps.") }}
+                                       </p>
+                               </div>
+                       </div>
+               </div>
+       </div>
+{% end block %}
diff --git a/src/templates/auth/register.html b/src/templates/auth/register.html
new file mode 100644 (file)
index 0000000..f8a0f19
--- /dev/null
@@ -0,0 +1,51 @@
+{% extends "../base.html" %}
+
+{% block title %}{{ _("Register") }}{% end block %}
+
+{% block content %}
+       <div class="row justify-content-center my-5">
+               <div class="col col-md-6">
+                       <h4 class="mb-4">{{ _("Register New Account") }}</h4>
+
+                       <p class="lead">
+                               {{ _("Become a part of our community by registering an account!") }}
+                       </p>
+
+                       <form action="" method="POST">
+                               {% raw xsrf_form_html() %}
+
+                               <input type="hidden" name="next" value="{{ next or "" }}">
+
+                               <div class="form-group">
+                                       <input type="text" class="form-control form-control-lg"
+                                               name="uid" placeholder="{{ _("Username") }}" required autofocus>
+                               </div>
+
+                               <div class="form-row mb-3">
+                                       <div class="col">
+                                               <label>{{ _("First Name") }}</label>
+               
+                                               <input type="text" class="form-control" name="first_name"
+                                                       placeholder="{{ _("First Name") }}" required>
+                                       </div>
+               
+                                       <div class="col">
+                                               <label>{{ _("Last Name") }}</label>
+               
+                                               <input type="text" class="form-control" name="last_name"
+                                                       placeholder="{{ _("Last Name") }}" required>
+                                       </div>
+                               </div>
+
+                               <div class="form-group">
+                                       <input type="email" class="form-control"
+                                               name="email" placeholder="{{ _("Email Address") }}" required>
+                               </div>
+
+                               <button type="submit" class="btn btn-primary btn-block">
+                                       {{ _("Register") }}
+                               </button>
+                       </form>
+               </div>
+       </div>
+{% end block %}
index 8ea161286c52a2802308f8b53f51737ddc206be9..e4855b4fbd93f28e8c133d437dff3ecad5607ece 100644 (file)
@@ -266,6 +266,7 @@ class Application(tornado.web.Application):
                self.add_handlers(r"people(\.dev)?\.ipfire\.org", [
                        (r"/", people.IndexHandler),
                        (r"/conferences", people.ConferencesHandler),
+                       (r"/register", auth.RegisterHandler),
                        (r"/search", people.SearchHandler),
                        (r"/users", people.UsersHandler),
                        (r"/users/(\w+)", people.UserHandler),
index 82e6f0d8a8877339f444f0334eaba805bb748287..eaaec4631bec407702671ecbea38b8a091cf1995 100644 (file)
@@ -68,6 +68,27 @@ class LogoutHandler(AuthenticationMixin, base.BaseHandler):
                self.redirect("/")
 
 
+class RegisterHandler(base.BaseHandler):
+       @base.blacklisted
+       def get(self):
+               self.render("auth/register.html")
+
+       @base.blacklisted
+       def post(self):
+               uid   = self.get_argument("uid")
+               email = self.get_argument("email")
+
+               first_name = self.get_argument("first_name")
+               last_name  = self.get_argument("last_name")
+
+               # Register account
+               with self.db.transaction():
+                       self.backend.accounts.create(uid, email,
+                               first_name=first_name, last_name=last_name)
+
+               self.render("auth/register-success.html")
+
+
 class CacheMixin(object):
        def prepare(self):
                # Mark this as private when someone is logged in