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: 8 additions & 0 deletions src/backend/src/api/APIError.js
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,14 @@ module.exports = class APIError {
status: 403,
message: 'Password does not match.',
},
'temp_users_disabled': {
status: 403,
message: 'Temporary user creation is disabled.',
},
'user_signup_disabled': {
status: 403,
message: 'New user signups are disabled.',
},

// Object Mapping
'field_not_allowed_for_create': {
Expand Down
3 changes: 3 additions & 0 deletions src/backend/src/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ let config = {};
// Static defaults
config.servers = [];

// Will disable new user signups. Users will not be able to create new permanent accounts.
config.disable_user_signup = false;

// Will disable the auto-generated temp users. If a user lands on the site, they will be required to sign up or log in.
config.disable_temp_users = false;

Expand Down
6 changes: 6 additions & 0 deletions src/backend/src/routers/save_account.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ const router = new express.Router();
const {get_taskbar_items, username_exists, send_email_verification_code, send_email_verification_token, invalidate_cached_user, get_user } = require('../helpers');
const auth = require('../middleware/auth.js');
const config = require('../config');
const APIError = require('../api/APIError');
const { DB_WRITE } = require('../services/database/consts');

// -----------------------------------------------------------------------//
Expand All @@ -32,6 +33,11 @@ router.post('/save_account', auth, express.json(), async (req, res, next)=>{
if(require('../helpers').subdomain(req) !== 'api' && require('../helpers').subdomain(req) !== '')
next();

// check if regular user signup is disabled
if(config.disable_user_signup){
return APIError.create('user_signup_disabled').write(res);
}

// modules
const db = req.services.get('database').get(DB_WRITE, 'auth');
const validator = require('validator')
Expand Down
16 changes: 14 additions & 2 deletions src/backend/src/routers/signup.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"use strict"
const {get_taskbar_items, send_email_verification_code, send_email_verification_token, username_exists, invalidate_cached_user_by_id, get_user } = require('../helpers');
const config = require('../config');
const APIError = require('../api/APIError');
const eggspress = require('../api/eggspress');
const { Context } = require('../util/context');
const { DB_WRITE } = require('../services/database/consts');
Expand Down Expand Up @@ -91,6 +92,12 @@ module.exports = eggspress(['/signup'], {
// const decoded = await jwt.verify(token, config.jwt_secret);
// const user = await get_user({ uuid: decoded.uuid });
if ( user ) {
// Check if temp users are disabled and this is a temp user
const is_temp_user = (user.password === null && user.email === null);
if (is_temp_user && config.disable_temp_users) {
return APIError.create('temp_users_disabled').write(res);
}

return res.send({
token: token,
user: {
Expand All @@ -111,8 +118,13 @@ module.exports = eggspress(['/signup'], {
req.body.username = await generate_random_username();
req.body.email = req.body.username + '@gmail.com';
req.body.password = 'sadasdfasdfsadfsa';
}else if(config.disable_temp_users){
return res.status(400).send('Temp users are disabled.');
}else if(req.body.is_temp && config.disable_temp_users){
return APIError.create('temp_users_disabled').write(res);
}

// check if regular user signup is disabled
if(!req.body.is_temp && config.disable_user_signup){
return APIError.create('user_signup_disabled').write(res);
}

// send_confirmation_code
Expand Down
8 changes: 8 additions & 0 deletions src/backend/src/routers/whoami.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ const auth = require('../middleware/auth.js');
const fs = require('../middleware/fs.js');
const _path = require('path');
const eggspress = require('../api/eggspress');
const APIError = require('../api/APIError');
const config = require('../config');
const { Context } = require('../util/context');
const { UserActorType, AppUnderUserActorType } = require('../services/auth/Actor');

Expand All @@ -50,6 +52,12 @@ const WHOAMI_GET = eggspress('/whoami', {

const is_user = actor.type instanceof UserActorType;

// Check if temp users are disabled and this is a temp user
const is_temp_user = (req.user.password === null && req.user.email === null);
if (is_temp_user && config.disable_temp_users) {
return APIError.create('temp_users_disabled').write(res);
}

// send user object
const details = {
username: req.user.username,
Expand Down
4 changes: 3 additions & 1 deletion src/gui/src/UI/UIWindowSignup.js
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,9 @@ function UIWindowSignup(options){
}
},
error: function (err){
$(el_window).find('.signup-error-msg').html(err.responseText);
// Parse JSON error response from APIError
const error_obj = JSON.parse(err.responseText);
$(el_window).find('.signup-error-msg').html(error_obj.message);
$(el_window).find('.signup-error-msg').fadeIn();
// re-enable 'Create Account' button so user can try again
$(el_window).find('.signup-btn').prop('disabled', false);
Expand Down
18 changes: 18 additions & 0 deletions src/gui/src/initgui.js
Original file line number Diff line number Diff line change
Expand Up @@ -458,10 +458,28 @@ window.initgui = async function(options){
try{
whoami = await puter.os.user();
}catch(e){
// Check for 401 or forbidden status
if(e.status === 401){
bad_session_logout();
return;
}
// If temp users are disabled (check the error code)
if(e.code === 'temp_users_disabled'){
bad_session_logout();
if(window.logged_in_users.length > 0){
UIWindowSessionList();
}
else{
await UIWindowLogin({
reload_on_success: true,
send_confirmation_code: false,
window_options:{
has_head: false
}
});
}
return;
}
}
}
// update local user data
Expand Down