diff --git a/app/Controllers/Http/UserController.js b/app/Controllers/Http/UserController.js index aef7f01f..d730e6c7 100644 --- a/app/Controllers/Http/UserController.js +++ b/app/Controllers/Http/UserController.js @@ -86,6 +86,56 @@ class UserController { }); } + // Register a new user via web + async websignup({ request, response, auth }) { + if (Env.get('IS_REGISTRATION_ENABLED') == 'false') { + // eslint-disable-line eqeqeq + return response.status(401).send( + 'Registration is disabled on this server', + ); + } + + // Validate user input + const validation = await validateAll(request.all(), { + firstname: 'required', + lastname: 'required', + email: 'required|email|unique:users,email', + password: 'required', + }); + + if (validation.fails()) { + return response.redirect('/websignupretry'); + } + + const data = request.only(['firstname', 'lastname', 'email', 'password']); + + // Hash password + const hashedPassword = crypto + .createHash('sha256') + .update(data.password) + .digest('base64'); + + // Create user in DB + let user; + try { + user = await User.create({ + email: data.email, + password: hashedPassword, + username: data.firstname, + lastname: data.lastname, + }); + } catch (e) { + return response.status(401).send( + 'E-Mail Address already in use', + ); + } + + await auth.generate(user); + + // Redirect user to login page, confirmaiton would be nice + return response.redirect('/user/signuplogin'); + } + // Login using an existing user async login({ request, response, auth }) { if (!request.header('Authorization')) { diff --git a/resources/views/dashboard/login.edge b/resources/views/dashboard/login.edge index 23995aee..9cf9bd89 100644 --- a/resources/views/dashboard/login.edge +++ b/resources/views/dashboard/login.edge @@ -59,6 +59,18 @@ Forgot my Password +
+

+
+ Don't have a Ferdium account yet? +
+ + Signup here! + +
+ or +

+
Import your Franz/Ferdi account diff --git a/resources/views/dashboard/signuplogin.edge b/resources/views/dashboard/signuplogin.edge new file mode 100644 index 00000000..8eb177a0 --- /dev/null +++ b/resources/views/dashboard/signuplogin.edge @@ -0,0 +1,69 @@ +@layout('layouts.v2') + +@section('content') +
+
+

+ Signup successful please login +

+ + @if(flashMessage('error')) +
+ {{ flashMessage('error') }} +
+ @endif + @if(old('message')) +
+ {{ old('message') }} +
+ @endif + + {{ csrfField() }} +
+ + +
+
+ + +
+ +

+ By logging in, you accept the terms of service and privacy policy. This website uses cookies to log you in. +

+ + +
+
+@endsection diff --git a/resources/views/others/index.edge b/resources/views/others/index.edge index 5cc57260..3649fad9 100644 --- a/resources/views/others/index.edge +++ b/resources/views/others/index.edge @@ -28,12 +28,16 @@
+

Manage your account

Go to account dashboard + + Register on Ferdium +

Don't have Ferdium yet?

diff --git a/resources/views/others/websignup.edge b/resources/views/others/websignup.edge new file mode 100644 index 00000000..76f98b64 --- /dev/null +++ b/resources/views/others/websignup.edge @@ -0,0 +1,93 @@ +@layout('layouts.v2') + +@section('content') +
+
+

+ Signup for a Ferdium account +

+

+ Please provide your details so your Ferdium account can be created. +

+ + @if(flashMessage('error')) +
+ {{ flashMessage('error') }} +
+ @endif + @if(old('message')) +
+ {{ old('message') }} +
+ @endif + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +

+ By signing up for your Franz/Ferdi account, you accept the terms of service and privacy + policy +

+ +
+
+@endsection diff --git a/resources/views/others/websignupretry.edge b/resources/views/others/websignupretry.edge new file mode 100644 index 00000000..ad3419a6 --- /dev/null +++ b/resources/views/others/websignupretry.edge @@ -0,0 +1,93 @@ +@layout('layouts.v2') + +@section('content') +
+
+

+ Error during signup, please try again +

+

+ Please provide your details so your Ferdium account can be created. +

+ + @if(flashMessage('error')) +
+ {{ flashMessage('error') }} +
+ @endif + @if(old('message')) +
+ {{ old('message') }} +
+ @endif + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +

+ By signing up for your Franz/Ferdi account, you accept the terms of service and privacy + policy +

+ +
+
+@endsection diff --git a/start/routes.js b/start/routes.js index 64a76051..9bd49248 100644 --- a/start/routes.js +++ b/start/routes.js @@ -62,6 +62,7 @@ if (Env.get('IS_DASHBOARD_ENABLED') !== 'false') { Route.group(() => { // Auth Route.get('login', ({ view }) => view.render('dashboard.login')).middleware('guest'); + Route.get('signuplogin', ({ view }) => view.render('dashboard.signuplogin')).middleware('guest'); Route.post('login', 'DashboardController.login').middleware('guest').as('login'); // Reset password @@ -118,6 +119,11 @@ Route.get('new', ({ response, view }) => { Route.post('import', 'UserController.import'); Route.get('import', ({ view }) => view.render('others.import')); +// Ferdium account signup +Route.post('websignup', 'UserController.websignup'); +Route.get('websignup', ({ view }) => view.render('others.websignup')); +Route.get('websignupretry', ({ view }) => view.render('others.websignupretry')); + // Legal documents Route.get('terms', ({ response }) => response.redirect('/terms.html')); Route.get('privacy', ({ response }) => response.redirect('/privacy.html'));