3 namespace Friendica\Module\Admin;
\r
5 use Friendica\Content\Pager;
\r
6 use Friendica\Core\Config;
\r
7 use Friendica\Core\L10n;
\r
8 use Friendica\Core\Renderer;
\r
9 use Friendica\Core\System;
\r
10 use Friendica\Database\DBA;
\r
11 use Friendica\Model\Register;
\r
12 use Friendica\Model\User;
\r
13 use Friendica\Module\BaseAdminModule;
\r
14 use Friendica\Util\Strings;
\r
15 use Friendica\Util\Temporal;
\r
17 class Users extends BaseAdminModule
\r
19 public static function post()
\r
23 $a = self::getApp();
\r
25 $pending = defaults($_POST, 'pending' , []);
\r
26 $users = defaults($_POST, 'user' , []);
\r
27 $nu_name = defaults($_POST, 'new_user_name' , '');
\r
28 $nu_nickname = defaults($_POST, 'new_user_nickname', '');
\r
29 $nu_email = defaults($_POST, 'new_user_email' , '');
\r
30 $nu_language = Config::get('system', 'language');
\r
32 parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users');
\r
34 if ($nu_name !== '' && $nu_email !== '' && $nu_nickname !== '') {
\r
36 $result = User::create([
\r
37 'username' => $nu_name,
\r
38 'email' => $nu_email,
\r
39 'nickname' => $nu_nickname,
\r
41 'language' => $nu_language
\r
43 } catch (\Exception $ex) {
\r
44 notice($ex->getMessage());
\r
48 $user = $result['user'];
\r
49 $preamble = Strings::deindent(L10n::t('
\r
51 the administrator of %2$s has set up an account for you.'));
\r
52 $body = Strings::deindent(L10n::t('
\r
53 The login details are as follows:
\r
59 You may change your password from your account "Settings" page after logging
\r
62 Please take a few moments to review the other account settings on that page.
\r
64 You may also wish to add some basic information to your default profile
\r
65 (on the "Profiles" page) so that other people can easily find you.
\r
67 We recommend setting your full name, adding a profile photo,
\r
68 adding some profile "keywords" (very useful in making new friends) - and
\r
69 perhaps what country you live in; if you do not wish to be more specific
\r
72 We fully respect your right to privacy, and none of these items are necessary.
\r
73 If you are new and do not know anybody here, they may help
\r
74 you to make some new and interesting friends.
\r
76 If you ever want to delete your account, you can do so at %1$s/removeme
\r
78 Thank you and welcome to %4$s.'));
\r
80 $preamble = sprintf($preamble, $user['username'], Config::get('config', 'sitename'));
\r
81 $body = sprintf($body, System::baseUrl(), $user['nickname'], $result['password'], Config::get('config', 'sitename'));
\r
84 'type' => SYSTEM_EMAIL,
\r
85 'language' => $user['language'],
\r
86 'to_name' => $user['username'],
\r
87 'to_email' => $user['email'],
\r
88 'uid' => $user['uid'],
\r
89 'subject' => L10n::t('Registration details for %s', Config::get('config', 'sitename')),
\r
90 'preamble' => $preamble,
\r
94 if (!empty($_POST['page_users_block'])) {
\r
95 DBA::update('user', ['blocked' => 1], ['uid' => $users]);
\r
96 notice(L10n::tt('%s user blocked', '%s users blocked', count($users)));
\r
99 if (!empty($_POST['page_users_unblock'])) {
\r
100 DBA::update('user', ['blocked' => 0], ['uid' => $users]);
\r
101 notice(L10n::tt('%s user unblocked', '%s users unblocked', count($users)));
\r
104 if (!empty($_POST['page_users_delete'])) {
\r
105 foreach ($users as $uid) {
\r
106 if (local_user() != $uid) {
\r
107 User::remove($uid);
\r
109 notice(L10n::t('You can\'t remove yourself'));
\r
113 notice(L10n::tt('%s user deleted', '%s users deleted', count($users)));
\r
116 if (!empty($_POST['page_users_approve'])) {
\r
117 require_once 'mod/regmod.php';
\r
118 foreach ($pending as $hash) {
\r
123 if (!empty($_POST['page_users_deny'])) {
\r
124 require_once 'mod/regmod.php';
\r
125 foreach ($pending as $hash) {
\r
130 $a->internalRedirect('admin/users');
\r
133 public static function content()
\r
137 $a = self::getApp();
\r
139 if ($a->argc > 3) {
\r
140 // @TODO: Replace with parameter from router
\r
141 $action = $a->argv[2];
\r
142 $uid = $a->argv[3];
\r
143 $user = DBA::selectFirst('user', ['username', 'blocked'], ['uid' => $uid]);
\r
144 if (!DBA::isResult($user)) {
\r
145 notice('User not found' . EOL);
\r
146 $a->internalRedirect('admin/users');
\r
147 return ''; // NOTREACHED
\r
152 if (local_user() != $uid) {
\r
153 parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't');
\r
155 User::remove($uid);
\r
157 notice(L10n::t('User "%s" deleted', $user['username']));
\r
159 notice(L10n::t('You can\'t remove yourself'));
\r
163 parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't');
\r
164 DBA::update('user', ['blocked' => 1], ['uid' => $uid]);
\r
165 notice(L10n::t('User "%s" blocked', $user['username']));
\r
168 parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't');
\r
169 DBA::update('user', ['blocked' => 0], ['uid' => $uid]);
\r
170 notice(L10n::t('User "%s" unblocked', $user['username']));
\r
174 $a->internalRedirect('admin/users');
\r
178 $pending = Register::getPending();
\r
180 $pager = new Pager($a->query_string, 100);
\r
186 'user.register_date',
\r
192 $order = 'contact.name';
\r
193 $order_direction = '+';
\r
194 if (!empty($_GET['o'])) {
\r
195 $new_order = $_GET['o'];
\r
196 if ($new_order[0] === '-') {
\r
197 $order_direction = '-';
\r
198 $new_order = substr($new_order, 1);
\r
201 if (in_array($new_order, $valid_orders)) {
\r
202 $order = $new_order;
\r
205 $sql_order = '`' . str_replace('.', '`.`', $order) . '`';
\r
206 $sql_order_direction = ($order_direction === '+') ? 'ASC' : 'DESC';
\r
208 $usersStmt = DBA::p("SELECT `user`.*, `contact`.`name`, `contact`.`url`, `contact`.`micro`, `user`.`account_expired`, `contact`.`last-item` AS `lastitem_date`
\r
210 INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self`
\r
211 WHERE `user`.`verified`
\r
212 ORDER BY $sql_order $sql_order_direction LIMIT ?, ?", $pager->getStart(), $pager->getItemsPerPage()
\r
214 $users = DBA::toArray($usersStmt);
\r
216 $adminlist = explode(',', str_replace(' ', '', Config::get('config', 'admin_email')));
\r
217 $_setup_users = function ($e) use ($adminlist) {
\r
219 User::PAGE_FLAGS_NORMAL => L10n::t('Normal Account Page'),
\r
220 User::PAGE_FLAGS_SOAPBOX => L10n::t('Soapbox Page'),
\r
221 User::PAGE_FLAGS_COMMUNITY => L10n::t('Public Forum'),
\r
222 User::PAGE_FLAGS_FREELOVE => L10n::t('Automatic Friend Page'),
\r
223 User::PAGE_FLAGS_PRVGROUP => L10n::t('Private Forum')
\r
226 User::ACCOUNT_TYPE_PERSON => L10n::t('Personal Page'),
\r
227 User::ACCOUNT_TYPE_ORGANISATION => L10n::t('Organisation Page'),
\r
228 User::ACCOUNT_TYPE_NEWS => L10n::t('News Page'),
\r
229 User::ACCOUNT_TYPE_COMMUNITY => L10n::t('Community Forum'),
\r
230 User::ACCOUNT_TYPE_RELAY => L10n::t('Relay'),
\r
233 $e['page_flags_raw'] = $e['page-flags'];
\r
234 $e['page-flags'] = $page_types[$e['page-flags']];
\r
236 $e['account_type_raw'] = ($e['page_flags_raw'] == 0) ? $e['account-type'] : -1;
\r
237 $e['account-type'] = ($e['page_flags_raw'] == 0) ? $account_types[$e['account-type']] : '';
\r
239 $e['register_date'] = Temporal::getRelativeDate($e['register_date']);
\r
240 $e['login_date'] = Temporal::getRelativeDate($e['login_date']);
\r
241 $e['lastitem_date'] = Temporal::getRelativeDate($e['lastitem_date']);
\r
242 $e['is_admin'] = in_array($e['email'], $adminlist);
\r
243 $e['is_deletable'] = (intval($e['uid']) != local_user());
\r
244 $e['deleted'] = ($e['account_removed'] ? Temporal::getRelativeDate($e['account_expires_on']) : False);
\r
249 $tmp_users = array_map($_setup_users, $users);
\r
251 // Get rid of dashes in key names, Smarty3 can't handle them
\r
252 // and extracting deleted users
\r
256 foreach ($tmp_users as $user) {
\r
257 foreach ($user as $k => $v) {
\r
258 $newkey = str_replace('-', '_', $k);
\r
259 $user[$newkey] = $v;
\r
262 if ($user['deleted']) {
\r
263 $deleted[] = $user;
\r
269 $th_users = array_map(null, [L10n::t('Name'), L10n::t('Email'), L10n::t('Register date'), L10n::t('Last login'), L10n::t('Last item'), L10n::t('Type')], $valid_orders);
\r
271 $t = Renderer::getMarkupTemplate('admin/users.tpl');
\r
272 $o = Renderer::replaceMacros($t, [
\r
274 '$title' => L10n::t('Administration'),
\r
275 '$page' => L10n::t('Users'),
\r
276 '$submit' => L10n::t('Add User'),
\r
277 '$select_all' => L10n::t('select all'),
\r
278 '$h_pending' => L10n::t('User registrations waiting for confirm'),
\r
279 '$h_deleted' => L10n::t('User waiting for permanent deletion'),
\r
280 '$th_pending' => [L10n::t('Request date'), L10n::t('Name'), L10n::t('Email')],
\r
281 '$no_pending' => L10n::t('No registrations.'),
\r
282 '$pendingnotetext' => L10n::t('Note from the user'),
\r
283 '$approve' => L10n::t('Approve'),
\r
284 '$deny' => L10n::t('Deny'),
\r
285 '$delete' => L10n::t('Delete'),
\r
286 '$block' => L10n::t('Block'),
\r
287 '$blocked' => L10n::t('User blocked'),
\r
288 '$unblock' => L10n::t('Unblock'),
\r
289 '$siteadmin' => L10n::t('Site admin'),
\r
290 '$accountexpired' => L10n::t('Account expired'),
\r
292 '$h_users' => L10n::t('Users'),
\r
293 '$h_newuser' => L10n::t('New User'),
\r
294 '$th_deleted' => [L10n::t('Name'), L10n::t('Email'), L10n::t('Register date'), L10n::t('Last login'), L10n::t('Last item'), L10n::t('Permanent deletion')],
\r
295 '$th_users' => $th_users,
\r
296 '$order_users' => $order,
\r
297 '$order_direction_users' => $order_direction,
\r
299 '$confirm_delete_multi' => L10n::t('Selected users will be deleted!\n\nEverything these users had posted on this site will be permanently deleted!\n\nAre you sure?'),
\r
300 '$confirm_delete' => L10n::t('The user {0} will be deleted!\n\nEverything this user has posted on this site will be permanently deleted!\n\nAre you sure?'),
\r
302 '$form_security_token' => parent::getFormSecurityToken('admin_users'),
\r
305 '$baseurl' => $a->getBaseURL(true),
\r
307 '$pending' => $pending,
\r
308 'deleted' => $deleted,
\r
309 '$users' => $users,
\r
310 '$newusername' => ['new_user_name', L10n::t('Name'), '', L10n::t('Name of the new user.')],
\r
311 '$newusernickname' => ['new_user_nickname', L10n::t('Nickname'), '', L10n::t('Nickname of the new user.')],
\r
312 '$newuseremail' => ['new_user_email', L10n::t('Email'), '', L10n::t('Email address of the new user.'), '', '', 'email'],
\r
315 $o .= $pager->renderFull(DBA::count('user'));
\r