add possibility to create account without email and token
This commit is contained in:
@@ -114,6 +114,7 @@
|
|||||||
"swf_thumb": "/s/img/swf.png",
|
"swf_thumb": "/s/img/swf.png",
|
||||||
"open_registration": true,
|
"open_registration": true,
|
||||||
"open_registration_web_toggle": false,
|
"open_registration_web_toggle": false,
|
||||||
|
"open_registration_require_mail_andor_token": false,
|
||||||
"private_society": false,
|
"private_society": false,
|
||||||
"private_society_gate": "cloudflare",
|
"private_society_gate": "cloudflare",
|
||||||
"paths": {
|
"paths": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import db from "../sql.mjs";
|
import db from "../sql.mjs";
|
||||||
import lib from "../lib.mjs";
|
import lib from "../lib.mjs";
|
||||||
import security from "../security.mjs";
|
import security from "../security.mjs";
|
||||||
import { getRegistrationOpen, getDefaultLayout } from "../settings.mjs";
|
import { getRegistrationOpen, getRegistrationRequireMailAndorToken, getDefaultLayout } from "../settings.mjs";
|
||||||
import { sendMail } from "../../lib/smtp.mjs";
|
import { sendMail } from "../../lib/smtp.mjs";
|
||||||
import cfg from "../config.mjs";
|
import cfg from "../config.mjs";
|
||||||
import crypto from "crypto";
|
import crypto from "crypto";
|
||||||
@@ -92,22 +92,28 @@ export default (router, tpl) => {
|
|||||||
let activated = true;
|
let activated = true;
|
||||||
let activationToken = null;
|
let activationToken = null;
|
||||||
|
|
||||||
if (!token && !getRegistrationOpen()) {
|
const registrationOpen = getRegistrationOpen();
|
||||||
|
const requireMailOrToken = getRegistrationRequireMailAndorToken();
|
||||||
|
|
||||||
|
if (!registrationOpen && !token) {
|
||||||
|
// Closed registration — invite token is always required
|
||||||
return renderError("Invite token is required for registration.");
|
return renderError("Invite token is required for registration.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (token) {
|
if (token) {
|
||||||
|
// Invite token path — validate and activate immediately
|
||||||
const tokenRow = await db`
|
const tokenRow = await db`
|
||||||
select * from invite_tokens where token = ${token} and is_used = false
|
select * from invite_tokens where token = ${token} and is_used = false
|
||||||
`;
|
`;
|
||||||
if (tokenRow.length === 0) return renderError("Invalid or used invite token");
|
if (tokenRow.length === 0) return renderError("Invalid or used invite token");
|
||||||
// Token used, so it will be activated by default
|
// Token is valid; account activated immediately
|
||||||
} else {
|
} else if (requireMailOrToken) {
|
||||||
// No token, Open Registration
|
// Open registration but email/token required — email path
|
||||||
if (!email || !email.includes('@')) return renderError("A valid email is required for no-token registration.");
|
if (!email || !email.includes('@')) return renderError("A valid email is required for registration.");
|
||||||
activated = false;
|
activated = false;
|
||||||
activationToken = crypto.randomBytes(32).toString('hex');
|
activationToken = crypto.randomBytes(32).toString('hex');
|
||||||
}
|
}
|
||||||
|
// else: open registration, no mail/token required — just username+password, activated immediately
|
||||||
|
|
||||||
// Check user existence
|
// Check user existence
|
||||||
const existing = await db`
|
const existing = await db`
|
||||||
|
|||||||
@@ -49,6 +49,11 @@ export const getRegistrationOpen = () => {
|
|||||||
};
|
};
|
||||||
export const setRegistrationOpen = (val) => registration_open = !!val;
|
export const setRegistrationOpen = (val) => registration_open = !!val;
|
||||||
|
|
||||||
|
// When false (default): open_registration=true means anyone can register with just username+password, activated immediately.
|
||||||
|
// When true: even in open registration, a valid email OR invite token is required.
|
||||||
|
export const getRegistrationRequireMailAndorToken = () => !!cfg.websrv.open_registration_require_mail_andor_token;
|
||||||
|
export const setRegistrationRequireMailAndorToken = (val) => {}; // No-op, strictly config-based
|
||||||
|
|
||||||
export const getTrustedUploads = () => trusted_uploads;
|
export const getTrustedUploads = () => trusted_uploads;
|
||||||
export const setTrustedUploads = (val) => trusted_uploads = Math.max(0, parseInt(val) ?? 3);
|
export const setTrustedUploads = (val) => trusted_uploads = Math.max(0, parseInt(val) ?? 3);
|
||||||
|
|
||||||
|
|||||||
@@ -1075,6 +1075,7 @@ process.on('uncaughtException', err => {
|
|||||||
get min_tags() { return getMinTags(); },
|
get min_tags() { return getMinTags(); },
|
||||||
get registration_open() { return getRegistrationOpen(); },
|
get registration_open() { return getRegistrationOpen(); },
|
||||||
registration_web_toggle_enabled: cfg.websrv.open_registration_web_toggle !== false,
|
registration_web_toggle_enabled: cfg.websrv.open_registration_web_toggle !== false,
|
||||||
|
registration_require_mail_andor_token: !!cfg.websrv.open_registration_require_mail_andor_token,
|
||||||
get trusted_uploads() { return getTrustedUploads(); },
|
get trusted_uploads() { return getTrustedUploads(); },
|
||||||
get shitpost_mode() { return getShitpostMode(); },
|
get shitpost_mode() { return getShitpostMode(); },
|
||||||
shitpost_require_rating: !!cfg.websrv.shitpost_require_rating,
|
shitpost_require_rating: !!cfg.websrv.shitpost_require_rating,
|
||||||
|
|||||||
@@ -23,10 +23,10 @@
|
|||||||
<input type="text" name="username" placeholder="{{ t('auth.username_placeholder') }}" autocomplete="off" required />
|
<input type="text" name="username" placeholder="{{ t('auth.username_placeholder') }}" autocomplete="off" required />
|
||||||
<input type="password" name="password" placeholder="{{ t('auth.password_placeholder') }}" autocomplete="off" required minlength="20" title="{{ t('auth.password_min_hint') }}" />
|
<input type="password" name="password" placeholder="{{ t('auth.password_placeholder') }}" autocomplete="off" required minlength="20" title="{{ t('auth.password_min_hint') }}" />
|
||||||
<input type="password" name="password_confirm" placeholder="{{ t('auth.confirm_password') }}" autocomplete="off" required minlength="20" /><br>
|
<input type="password" name="password_confirm" placeholder="{{ t('auth.confirm_password') }}" autocomplete="off" required minlength="20" /><br>
|
||||||
@if(registration_open)
|
@if(!registration_open)
|
||||||
<input type="email" name="email" placeholder="{{ t('auth.email_placeholder') }}" autocomplete="off" required />
|
|
||||||
@else
|
|
||||||
<input type="text" name="token" placeholder="{{ t('auth.invite_token') }}" autocomplete="off" value="{{ typeof token !== 'undefined' ? token : '' }}" required />
|
<input type="text" name="token" placeholder="{{ t('auth.invite_token') }}" autocomplete="off" value="{{ typeof token !== 'undefined' ? token : '' }}" required />
|
||||||
|
@elseif(registration_require_mail_andor_token)
|
||||||
|
<input type="email" name="email" placeholder="{{ t('auth.email_placeholder') }}" autocomplete="off" required />
|
||||||
@endif
|
@endif
|
||||||
<input type="text" name="email_confirm_field" style="display: none !important;" tabindex="-1" autocomplete="off" />
|
<input type="text" name="email_confirm_field" style="display: none !important;" tabindex="-1" autocomplete="off" />
|
||||||
<p style="text-align: left; font-size: 0.9em; margin: 10px 0; color: #fff;">
|
<p style="text-align: left; font-size: 0.9em; margin: 10px 0; color: #fff;">
|
||||||
|
|||||||
@@ -338,10 +338,10 @@
|
|||||||
<input type="password" name="password" placeholder="{{ t('auth.password_placeholder') }}" autocomplete="off" required minlength="20"
|
<input type="password" name="password" placeholder="{{ t('auth.password_placeholder') }}" autocomplete="off" required minlength="20"
|
||||||
title="Must be at least 20 characters long." />
|
title="Must be at least 20 characters long." />
|
||||||
<input type="password" name="password_confirm" placeholder="{{ t('auth.confirm_password') }}" autocomplete="off" required minlength="20" />
|
<input type="password" name="password_confirm" placeholder="{{ t('auth.confirm_password') }}" autocomplete="off" required minlength="20" />
|
||||||
@if(registration_open)
|
@if(!registration_open)
|
||||||
<input type="email" name="email" placeholder="{{ t('auth.email_placeholder') }}" autocomplete="off" required />
|
|
||||||
@else
|
|
||||||
<input type="text" name="token" placeholder="{{ t('auth.invite_token') }}" autocomplete="off" required />
|
<input type="text" name="token" placeholder="{{ t('auth.invite_token') }}" autocomplete="off" required />
|
||||||
|
@elseif(registration_require_mail_andor_token)
|
||||||
|
<input type="email" name="email" placeholder="{{ t('auth.email_placeholder') }}" autocomplete="off" required />
|
||||||
@endif
|
@endif
|
||||||
<input type="text" name="email_confirm_field" style="display: none !important;" tabindex="-1" autocomplete="off" />
|
<input type="text" name="email_confirm_field" style="display: none !important;" tabindex="-1" autocomplete="off" />
|
||||||
<p style="text-align: left; font-size: 0.9em; margin: 0; color: #fff;">
|
<p style="text-align: left; font-size: 0.9em; margin: 0; color: #fff;">
|
||||||
|
|||||||
Reference in New Issue
Block a user