Skip to content

Commit

Permalink
Merge 1a8470c into 1eb9503
Browse files Browse the repository at this point in the history
  • Loading branch information
jeabakker committed Jan 9, 2018
2 parents 1eb9503 + 1a8470c commit e5ab353
Show file tree
Hide file tree
Showing 31 changed files with 643 additions and 433 deletions.
29 changes: 29 additions & 0 deletions actions/admin/user/bulk/delete.php
@@ -0,0 +1,29 @@
<?php
/**
* Bulk delete users
*/

$user_guids = (array) get_input('user_guids');
if (empty($user_guids)) {
return elgg_error_response(elgg_echo('error:missing_data'));
}

$hidden = access_show_hidden_entities(true);

foreach ($user_guids as $user_guid) {
$user = get_user($user_guid);
if (empty($user)) {
continue;
}

$name = $user->getDisplayName();
if ($user->delete()) {
system_message(elgg_echo('admin:user:delete:yes', [$name]));
} else {
register_error(elgg_echo('entity:delete:fail', [$name]));
}
}

access_show_hidden_entities($hidden);

return elgg_ok_response();
35 changes: 35 additions & 0 deletions actions/admin/user/bulk/validate.php
@@ -0,0 +1,35 @@
<?php
/**
* Bulk validate users
*/

$user_guids = (array) get_input('user_guids');
if (empty($user_guids)) {
return elgg_error_response(elgg_echo('error:missing_data'));
}

$hidden = access_show_hidden_entities(true);

foreach ($user_guids as $user_guid) {
$user = get_user($user_guid);
if (empty($user)) {
continue;
}

if ($user->isValidated()) {
continue;
}

$user->setValidationStatus(true, 'manual');

if (!$user->isValidated()) {
register_error(elgg_echo('action:user:validate:error', [$user->getDisplayName()]));
continue;
}

system_message(elgg_echo('action:user:validate:success', [$user->getDisplayName()]));
}

access_show_hidden_entities($hidden);

return elgg_ok_response();
2 changes: 1 addition & 1 deletion actions/admin/user/delete.php
Expand Up @@ -31,4 +31,4 @@
$forward = 'admin/users/newest';
}

return elgg_ok_response('', elgg_echo('admin:user:delete:yes'), $forward);
return elgg_ok_response('', elgg_echo('admin:user:delete:yes', [$name]), $forward);
37 changes: 37 additions & 0 deletions actions/admin/user/validate.php
@@ -0,0 +1,37 @@
<?php
/**
* Validate a user
*/

$user_guid = (int) get_input('user_guid');
if (empty($user_guid)) {
return elgg_error_response(elgg_echo('error:missing_data'));
}

$hidden = access_show_hidden_entities(true);

$user = get_user($user_guid);
if (empty($user)) {
access_show_hidden_entities($hidden);

return elgg_error_response(elgg_echo('error:missing_data'));
}

if ($user->isValidated()) {
// already validated
access_show_hidden_entities($hidden);

return elgg_ok_response('', elgg_echo('action:user:validate:already', [$user->getDisplayName()]));
}

$user->setValidationStatus(true, 'manual');

if (!$user->isValidated()) {
access_show_hidden_entities($hidden);

return elgg_error_response(elgg_echo('action:user:validate:error', [$user->getDisplayName()]));
}

access_show_hidden_entities($hidden);

return elgg_ok_response('', elgg_echo('action:user:validate:success', [$user->getDisplayName()]));
2 changes: 1 addition & 1 deletion docs/plugins/index.rst
Expand Up @@ -16,6 +16,7 @@ Elgg comes with a set of plugins. These provide the basic functionality for your
pages
profile
thewire
uservalidationbyemail

The following plugins are also bundled with Elgg, but are not (yet) documented

Expand All @@ -40,5 +41,4 @@ The following plugins are also bundled with Elgg, but are not (yet) documented
- site_notifications
- system_log
- tagcloud
- uservalidationbyemail
- web_services
25 changes: 25 additions & 0 deletions docs/plugins/uservalidationbyemail.rst
@@ -0,0 +1,25 @@
User validation by e-mail
=========================

The uservalidationbyemail plugin adds a step to the user registration process. After the user registered on the site, an e-mail is sent to their
e-mail address in order to validate that the e-mail address belongs to the user. In the e-mail is an verification link, only after the user clicked
on the link will the account of the user be able to login to the site.

The process for the user
------------------------

1. The user creates an account by going to the registration page of your site
2. After the account is created the user lands on a page with instructions to check their e-mail account for the validation e-mail
3. In the validation e-mail is a link to confirm their e-mail address
4. After clicking on the link, the account is validated
5. If possible the user gets logged in

If the user tries to login before validating their account an error is shown to indicate that the user needs to check their e-mail account. Also the
validation e-mail is sent again.

Options for site administrators
-------------------------------

A site administrator can take some actions on unvalidated accounts. Under Administration -> Users -> Unvalidated is a list of unvalidated users.
The administrator can manualy validate or delete the user. Also the option to resend the validation e-mail is present.

8 changes: 7 additions & 1 deletion engine/classes/ElggUser.php
Expand Up @@ -134,7 +134,7 @@ public function unban() {
}

unset($this->ban_reason);
$this->banned = 'yes';
$this->banned = 'no';

$this->invalidateCache();

Expand Down Expand Up @@ -273,6 +273,12 @@ public function setValidationStatus($status, $method = '') {
$this->validated_method = $method;

if ((bool) $status) {
// make sure the user is enabled
if (!$this->isEnabled()) {
$this->enable();
}

// let the system know the user is validated
elgg_trigger_after_event('validate', 'user', $this);
} else {
elgg_trigger_after_event('invalidate', 'user', $this);
Expand Down
77 changes: 76 additions & 1 deletion engine/lib/admin.php
Expand Up @@ -128,13 +128,19 @@ function _elgg_create_notice_of_pending_upgrade($event, $type, $object) {
function _elgg_admin_init() {

elgg_register_css('elgg.admin', elgg_get_simplecache_url('admin.css'));
elgg_register_css('admin/users/unvalidated', elgg_get_simplecache_url('admin/users/unvalidated.css'));

elgg_define_js('admin/users/unvalidated', [
'src' => elgg_get_simplecache_url('admin/users/unvalidated.js'),
]);

elgg_extend_view('admin.css', 'lightbox/elgg-colorbox-theme/colorbox.css');

elgg_register_plugin_hook_handler('register', 'menu:admin_header', '_elgg_admin_header_menu');
elgg_register_plugin_hook_handler('register', 'menu:admin_footer', '_elgg_admin_footer_menu');
elgg_register_plugin_hook_handler('register', 'menu:page', '_elgg_admin_page_menu');
elgg_register_plugin_hook_handler('register', 'menu:page', '_elgg_admin_page_menu_plugin_settings');
elgg_register_plugin_hook_handler('register', 'menu:user:unvalidated:bulk', '_elgg_admin_user_unvalidated_bulk_menu');

// maintenance mode
if (elgg_get_config('elgg_maintenance_mode', null)) {
Expand All @@ -157,6 +163,9 @@ function _elgg_admin_init() {
elgg_register_action('admin/user/resetpassword', '', 'admin');
elgg_register_action('admin/user/makeadmin', '', 'admin');
elgg_register_action('admin/user/removeadmin', '', 'admin');
elgg_register_action('admin/user/validate', '', 'admin');
elgg_register_action('admin/user/bulk/delete', '', 'admin');
elgg_register_action('admin/user/bulk/validate', '', 'admin');

elgg_register_action('admin/site/update_basic', '', 'admin');
elgg_register_action('admin/site/update_advanced', '', 'admin');
Expand All @@ -177,7 +186,7 @@ function _elgg_admin_init() {
elgg_register_action('admin/security/regenerate_site_secret', '', 'admin');

elgg_register_simplecache_view('admin.css');

// widgets
$widgets = ['online_users', 'new_users', 'content_stats', 'banned_users', 'admin_welcome', 'control_panel', 'cron_status'];
foreach ($widgets as $widget) {
Expand Down Expand Up @@ -401,6 +410,15 @@ function _elgg_admin_page_menu(\Elgg\Hook $hook) {
'section' => 'administer',
'parent_name' => 'users',
]);

$return[] = \ElggMenuItem::factory([
'name' => 'users:unvalidated',
'text' => elgg_echo('admin:users:unvalidated'),
'href' => 'admin/users/unvalidated',
'priority' => 50,
'section' => 'administer',
'parent_name' => 'users',
]);
$return[] = \ElggMenuItem::factory([
'name' => 'upgrades',
'href' => 'admin/upgrades',
Expand Down Expand Up @@ -548,6 +566,63 @@ function _elgg_admin_page_menu_plugin_settings(\Elgg\Hook $hook) {
return $return;
}

/**
* Register menu items to the bulk actions for unvalidated users
*
* @elgg_plugin_hook register menu:user:unvalidated:bulk
*
* @param \Elgg\Hook $hook 'register' 'menu:user:unvalidated:bulk'
*
* @return void|ElggMenuItem[]
*
* @since 3.0
* @internal
*/
function _elgg_admin_user_unvalidated_bulk_menu(\Elgg\Hook $hook) {

if (!elgg_is_admin_logged_in()) {
return;
}

$return = $hook->getValue();

$return[] = ElggMenuItem::factory([
'name' => 'select_all',
'text' => elgg_view('input/checkbox', [
'name' => 'select_all',
'label' => elgg_echo('all'),
'id' => 'admin-users-unvalidated-bulk-select',
]),
'href' => false,
'priority' => 100,
'deps' => 'admin/users/unvalidated',
]);

$return[] = ElggMenuItem::factory([
'id' => 'admin-users-unvalidated-bulk-validate',
'name' => 'bulk_validate',
'text' => elgg_echo('validate'),
'href' => 'action/admin/user/bulk/validate',
'confirm' => true,
'priority' => 400,
'section' => 'right',
'deps' => 'admin/users/unvalidated',
]);

$return[] = ElggMenuItem::factory([
'id' => 'admin-users-unvalidated-bulk-delete',
'name' => 'bulk_delete',
'text' => elgg_echo('delete'),
'href' => 'action/admin/user/bulk/delete',
'confirm' => elgg_echo('deleteconfirm:plural'),
'priority' => 500,
'section' => 'right',
'deps' => 'admin/users/unvalidated',
]);

return $return;
}

/**
* Handle admin pages. Expects corresponding views as admin/section/subsection
*
Expand Down
49 changes: 49 additions & 0 deletions engine/lib/users.php
Expand Up @@ -781,6 +781,54 @@ function _elgg_user_prepare_unban_notification($hook, $type, $return_value, $par
return $return_value;
}

/**
* Register menu items to the user:unvalidated menu
*
* @elgg_plugin_hook register menu:user:unvalidated
*
* @param \Elgg\Hook $hook the plugin hook 'register' 'menu:user:unvalidated'
*
* @return void|ElggMenuItem[]
*
* @since 3.0
* @internal
*/
function _elgg_user_unvalidated_menu(\Elgg\Hook $hook) {

if (!elgg_is_admin_logged_in()) {
return;
}

$entity = $hook->getEntityParam();
if (!$entity instanceof ElggUser) {
return;
}

$return = $hook->getValue();

$return[] = ElggMenuItem::factory([
'name' => 'validate',
'text' => elgg_echo('validate'),
'href' => elgg_http_add_url_query_elements('action/admin/user/validate', [
'user_guid' => $entity->guid,
]),
'confirm' => true,
'priority' => 400,
]);

$return[] = ElggMenuItem::factory([
'name' => 'delete',
'text' => elgg_echo('delete'),
'href' => elgg_http_add_url_query_elements('action/admin/user/delete', [
'guid' => $entity->guid,
]),
'confirm' => elgg_echo('deleteconfirm'),
'priority' => 500,
]);

return $return;
}

/**
* Users initialisation function, which establishes the page handler
*
Expand All @@ -799,6 +847,7 @@ function users_init() {
elgg_register_plugin_hook_handler('register', 'menu:user_hover', 'elgg_user_hover_menu');
elgg_register_plugin_hook_handler('register', 'menu:page', '_elgg_user_page_menu');
elgg_register_plugin_hook_handler('register', 'menu:topbar', '_elgg_user_topbar_menu');
elgg_register_plugin_hook_handler('register', 'menu:user:unvalidated', '_elgg_user_unvalidated_menu');

elgg_register_action('login', '', 'public');
elgg_register_action('logout');
Expand Down
26 changes: 26 additions & 0 deletions engine/tests/phpunit/ElggUserUnitTest.php
Expand Up @@ -47,5 +47,31 @@ public function testCanSetNotificationSettings() {
$this->assertFalse($user_settings['registered2']);
$this->assertArrayNotHasKey('unregistered', $user_settings);
}

public function testBanUser() {
$user = $this->createUser();

// should not be banned
$this->assertFalse($user->isBanned());

// ban the user
$this->assertTrue($user->ban());
$this->assertTrue($user->isBanned());
}

public function testUnbanUser() {
$user = $this->createUser();

// should not be banned
$this->assertFalse($user->isBanned());

// ban the user
$this->assertTrue($user->ban());
$this->assertTrue($user->isBanned());

// now unban
$this->assertTrue($user->unban());
$this->assertFalse($user->isBanned());
}

}

0 comments on commit e5ab353

Please sign in to comment.