Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion backend/pages/admin/administrator.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ module.exports.GET = async function(req, write, server, ctx, params) {
client_version: getClientVersion(),
csrftoken,
global_chat_enabled: getServerSetting("chatGlobalEnabled") == "1",
global_chat_no_anon: getServerSetting("chatGlobalNoAnon") == "1"
global_chat_no_anon: getServerSetting("chatGlobalNoAnon") == "1",
chat_age_restriction: getServerSetting("chatAgeRestriction")
};

write(render("administrator.html", data));
Expand Down Expand Up @@ -143,6 +144,11 @@ module.exports.POST = async function(req, write, server, ctx) {
} else {
updateServerSetting("chatGlobalNoAnon", "0");
}
if("set_chat_age_restriction" in post_data) {
var ageRestrictionHours = parseInt(post_data.set_chat_age_restriction);
if(isNaN(ageRestrictionHours) || ageRestrictionHours < 0) ageRestrictionHours = 0;
updateServerSetting("chatAgeRestriction", ageRestrictionHours.toString());
}
}
if("announcement" in post_data) {
var new_announcement = post_data.announcement;
Expand Down
13 changes: 13 additions & 0 deletions backend/websockets/chat.js
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,19 @@ module.exports = async function(ws, data, send, broadcast, server, ctx) {
return;
}

if(user.authenticated && user.date_joined) {
var ageRestrictionHours = parseInt(getServerSetting("chatAgeRestriction"));
if(ageRestrictionHours > 0) {
var accountAge = Date.now() - user.date_joined;
var minimumAge = ageRestrictionHours * 60 * 60 * 1000;
if(accountAge < minimumAge) {
var timeRemaining = calculateTimeDiff(minimumAge - accountAge);
serverChatResponse("Your account is too new. You must wait " + timeRemaining + " before chatting.", location);
return;
}
}
}

var isTestMessage = false;

var isMuted = (
Expand Down
4 changes: 4 additions & 0 deletions frontend/templates/administrator.html
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,10 @@ <h1>Administrator Panel</h1>
Global chat: prevent anonymous users:
<input type="checkbox" name="set_chat_global_no_anon" id="set_chat_global_no_anon"{%if global_chat_no_anon%} checked{%endif%}>
</div>
<div>
Required account age for chat (hours):
<input type="number" name="set_chat_age_restriction" id="set_chat_age_restriction" value="{{ chat_age_restriction }}" min="0" style="width: 60px;">
</div>
<input type="submit" value="Set">
</form>
</div>
Expand Down
9 changes: 6 additions & 3 deletions runserver.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,8 @@ var sql_edits_init = "./backend/edits.sql";
var serverSettings = {
announcement: "",
chatGlobalEnabled: "1",
chatGlobalNoAnon: "0"
chatGlobalNoAnon: "0",
chatAgeRestriction: "0"
};
var serverSettingsStatus = {};

Expand Down Expand Up @@ -1322,10 +1323,11 @@ async function getUserInfo(cookies, is_websocket, dispatch) {
user = JSON.parse(s_data.session_data);
if(cookies.csrftoken == user.csrftoken) { // verify csrftoken
user.authenticated = true;
var userauth = (await db.get("SELECT level, is_active, email FROM auth_user WHERE id=?", user.id));
var userauth = (await db.get("SELECT level, is_active, email, date_joined FROM auth_user WHERE id=?", user.id));
var level = userauth.level;
user.is_active = !!userauth.is_active;
user.email = userauth.email;
user.date_joined = userauth.date_joined;

user.operator = level == 3;
user.superuser = level == 2 || level == 3;
Expand Down Expand Up @@ -1357,7 +1359,7 @@ async function getUserInfo(cookies, is_websocket, dispatch) {
var session = await uvias.get("SELECT * FROM accounts.get_session($1::bigint, $2::bytea)", [uid, session_id]);
if(session) {
// both guests and users are included
var user_account = await uvias.get("SELECT to_hex(uid) as uid, username, rank_id FROM accounts.users WHERE uid=$1::bigint", uid);
var user_account = await uvias.get("SELECT to_hex(uid) as uid, username, rank_id, created FROM accounts.users WHERE uid=$1::bigint", uid);
if(user_account) {
success = true;
var session_expire = session.expires.getTime();
Expand All @@ -1375,6 +1377,7 @@ async function getUserInfo(cookies, is_websocket, dispatch) {
user.authenticated = true;
user.display_username = user_account.username;
user.uv_rank = user_account.rank_id;
user.date_joined = user_account.created.getTime();
if(links_local) {
user.is_active = links_local.email_verified;
user.email = links_local.email;
Expand Down