server/users: let administrators add new users
* Added functionality for administrators to directly add users to the application * Added permission users:create:any to handle level that users are allowed to create other users * Moved old permission users:create to users:create:self
This commit is contained in:
parent
a1fbeb91a0
commit
4b3529272e
|
@ -47,10 +47,12 @@ class TopNavigationController {
|
||||||
topNavigation.hide('users');
|
topNavigation.hide('users');
|
||||||
}
|
}
|
||||||
if (api.isLoggedIn()) {
|
if (api.isLoggedIn()) {
|
||||||
topNavigation.hide('register');
|
if (!api.hasPrivilege('users:create:any')) {
|
||||||
|
topNavigation.hide('register');
|
||||||
|
}
|
||||||
topNavigation.hide('login');
|
topNavigation.hide('login');
|
||||||
} else {
|
} else {
|
||||||
if (!api.hasPrivilege('users:create')) {
|
if (!api.hasPrivilege('users:create:self')) {
|
||||||
topNavigation.hide('register');
|
topNavigation.hide('register');
|
||||||
}
|
}
|
||||||
topNavigation.hide('account');
|
topNavigation.hide('account');
|
||||||
|
|
|
@ -10,7 +10,7 @@ const EmptyView = require('../views/empty_view.js');
|
||||||
|
|
||||||
class UserRegistrationController {
|
class UserRegistrationController {
|
||||||
constructor() {
|
constructor() {
|
||||||
if (!api.hasPrivilege('users:create')) {
|
if (!api.hasPrivilege('users:create:self')) {
|
||||||
this._view = new EmptyView();
|
this._view = new EmptyView();
|
||||||
this._view.showError('Registration is closed.');
|
this._view.showError('Registration is closed.');
|
||||||
return;
|
return;
|
||||||
|
@ -29,12 +29,22 @@ class UserRegistrationController {
|
||||||
user.name = e.detail.name;
|
user.name = e.detail.name;
|
||||||
user.email = e.detail.email;
|
user.email = e.detail.email;
|
||||||
user.password = e.detail.password;
|
user.password = e.detail.password;
|
||||||
|
const isLoggedIn = api.isLoggedIn();
|
||||||
user.save().then(() => {
|
user.save().then(() => {
|
||||||
api.forget();
|
if (isLoggedIn) {
|
||||||
return api.login(e.detail.name, e.detail.password, false);
|
return Promise.resolve();
|
||||||
|
} else {
|
||||||
|
api.forget();
|
||||||
|
return api.login(e.detail.name, e.detail.password, false);
|
||||||
|
}
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
const ctx = router.show(uri.formatClientLink());
|
if (isLoggedIn) {
|
||||||
ctx.controller.showSuccess('Welcome aboard!');
|
const ctx = router.show(uri.formatClientLink('users'));
|
||||||
|
ctx.controller.showSuccess('User added!');
|
||||||
|
} else {
|
||||||
|
const ctx = router.show(uri.formatClientLink());
|
||||||
|
ctx.controller.showSuccess('Welcome aboard!');
|
||||||
|
}
|
||||||
}, error => {
|
}, error => {
|
||||||
this._view.showError(error.message);
|
this._view.showError(error.message);
|
||||||
this._view.enableForm();
|
this._view.enableForm();
|
||||||
|
|
|
@ -62,7 +62,8 @@ default_rank: regular
|
||||||
|
|
||||||
|
|
||||||
privileges:
|
privileges:
|
||||||
'users:create': anonymous
|
'users:create:self': anonymous # Registration permission
|
||||||
|
'users:create:any': administrator
|
||||||
'users:list': regular
|
'users:list': regular
|
||||||
'users:view': regular
|
'users:view': regular
|
||||||
'users:edit:any:name': moderator
|
'users:edit:any:name': moderator
|
||||||
|
|
|
@ -26,7 +26,11 @@ def get_users(
|
||||||
@rest.routes.post('/users/?')
|
@rest.routes.post('/users/?')
|
||||||
def create_user(
|
def create_user(
|
||||||
ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response:
|
ctx: rest.Context, _params: Dict[str, str] = {}) -> rest.Response:
|
||||||
auth.verify_privilege(ctx.user, 'users:create')
|
if ctx.user.user_id is None:
|
||||||
|
auth.verify_privilege(ctx.user, 'users:create:self')
|
||||||
|
else:
|
||||||
|
auth.verify_privilege(ctx.user, 'users:create:any')
|
||||||
|
|
||||||
name = ctx.get_param_as_string('name')
|
name = ctx.get_param_as_string('name')
|
||||||
password = ctx.get_param_as_string('password')
|
password = ctx.get_param_as_string('password')
|
||||||
email = ctx.get_param_as_string('email', default='')
|
email = ctx.get_param_as_string('email', default='')
|
||||||
|
@ -40,6 +44,7 @@ def create_user(
|
||||||
ctx.get_file('avatar', default=b''))
|
ctx.get_file('avatar', default=b''))
|
||||||
ctx.session.add(user)
|
ctx.session.add(user)
|
||||||
ctx.session.commit()
|
ctx.session.commit()
|
||||||
|
|
||||||
return _serialize(ctx, user, force_show_email=True)
|
return _serialize(ctx, user, force_show_email=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ from szurubooru.func import users
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def inject_config(config_injector):
|
def inject_config(config_injector):
|
||||||
config_injector({'privileges': {'users:create': 'regular'}})
|
config_injector({'privileges': {'users:create:self': 'regular'}})
|
||||||
|
|
||||||
|
|
||||||
def test_creating_user(user_factory, context_factory, fake_datetime):
|
def test_creating_user(user_factory, context_factory, fake_datetime):
|
||||||
|
|
Loading…
Reference in New Issue