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
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)
(|(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):
--- /dev/null
+{% 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 %}
--- /dev/null
+{% 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 %}
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),
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