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\Database\DBA;
\r
10 use Friendica\Model\Register;
\r
11 use Friendica\Model\User;
\r
12 use Friendica\Module\BaseAdminModule;
\r
13 use Friendica\Util\Strings;
\r
14 use Friendica\Util\Temporal;
\r
16 class Users extends BaseAdminModule
\r
18 public static function post()
\r
22 $a = self::getApp();
\r
24 $pending = defaults($_POST, 'pending' , []);
\r
25 $users = defaults($_POST, 'user' , []);
\r
26 $nu_name = defaults($_POST, 'new_user_name' , '');
\r
27 $nu_nickname = defaults($_POST, 'new_user_nickname', '');
\r
28 $nu_email = defaults($_POST, 'new_user_email' , '');
\r
29 $nu_language = Config::get('system', 'language');
\r
31 parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users');
\r
33 if ($nu_name !== '' && $nu_email !== '' && $nu_nickname !== '') {
\r
35 $result = User::create([
\r
36 'username' => $nu_name,
\r
37 'email' => $nu_email,
\r
38 'nickname' => $nu_nickname,
\r
40 'language' => $nu_language
\r
42 } catch (\Exception $ex) {
\r
43 notice($ex->getMessage());
\r
47 $user = $result['user'];
\r
48 $preamble = Strings::deindent(L10n::t('
\r
50 the administrator of %2$s has set up an account for you.'));
\r
51 $body = Strings::deindent(L10n::t('
\r
52 The login details are as follows:
\r
58 You may change your password from your account "Settings" page after logging
\r
61 Please take a few moments to review the other account settings on that page.
\r
63 You may also wish to add some basic information to your default profile
\r
64 (on the "Profiles" page) so that other people can easily find you.
\r
66 We recommend setting your full name, adding a profile photo,
\r
67 adding some profile "keywords" (very useful in making new friends) - and
\r
68 perhaps what country you live in; if you do not wish to be more specific
\r
71 We fully respect your right to privacy, and none of these items are necessary.
\r
72 If you are new and do not know anybody here, they may help
\r
73 you to make some new and interesting friends.
\r
75 If you ever want to delete your account, you can do so at %1$s/removeme
\r
77 Thank you and welcome to %4$s.'));
\r
79 $preamble = sprintf($preamble, $user['username'], Config::get('config', 'sitename'));
\r
80 $body = sprintf($body, $a->getBaseURL(), $user['nickname'], $result['password'], Config::get('config', 'sitename'));
\r
83 'type' => SYSTEM_EMAIL,
\r
84 'language' => $user['language'],
\r
85 'to_name' => $user['username'],
\r
86 'to_email' => $user['email'],
\r
87 'uid' => $user['uid'],
\r
88 'subject' => L10n::t('Registration details for %s', Config::get('config', 'sitename')),
\r
89 'preamble' => $preamble,
\r
93 if (!empty($_POST['page_users_block'])) {
\r
94 DBA::update('user', ['blocked' => 1], ['uid' => $users]);
\r
95 notice(L10n::tt('%s user blocked', '%s users blocked', count($users)));
\r
98 if (!empty($_POST['page_users_unblock'])) {
\r
99 DBA::update('user', ['blocked' => 0], ['uid' => $users]);
\r
100 notice(L10n::tt('%s user unblocked', '%s users unblocked', count($users)));
\r
103 if (!empty($_POST['page_users_delete'])) {
\r
104 foreach ($users as $uid) {
\r
105 if (local_user() != $uid) {
\r
106 User::remove($uid);
\r
108 notice(L10n::t('You can\'t remove yourself'));
\r
112 notice(L10n::tt('%s user deleted', '%s users deleted', count($users)));
\r
115 if (!empty($_POST['page_users_approve'])) {
\r
116 require_once 'mod/regmod.php';
\r
117 foreach ($pending as $hash) {
\r
122 if (!empty($_POST['page_users_deny'])) {
\r
123 require_once 'mod/regmod.php';
\r
124 foreach ($pending as $hash) {
\r
129 $a->internalRedirect('admin/users');
\r
132 public static function content()
\r
136 $a = self::getApp();
\r
138 if ($a->argc > 3) {
\r
139 // @TODO: Replace with parameter from router
\r
140 $action = $a->argv[2];
\r
141 $uid = $a->argv[3];
\r
142 $user = DBA::selectFirst('user', ['username', 'blocked'], ['uid' => $uid]);
\r
143 if (!DBA::isResult($user)) {
\r
144 notice('User not found' . EOL);
\r
145 $a->internalRedirect('admin/users');
\r
146 return ''; // NOTREACHED
\r
151 if (local_user() != $uid) {
\r
152 parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't');
\r
154 User::remove($uid);
\r
156 notice(L10n::t('User "%s" deleted', $user['username']));
\r
158 notice(L10n::t('You can\'t remove yourself'));
\r
162 parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't');
\r
163 DBA::update('user', ['blocked' => 1], ['uid' => $uid]);
\r
164 notice(L10n::t('User "%s" blocked', $user['username']));
\r
167 parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't');
\r
168 DBA::update('user', ['blocked' => 0], ['uid' => $uid]);
\r
169 notice(L10n::t('User "%s" unblocked', $user['username']));
\r
173 $a->internalRedirect('admin/users');
\r
177 $pending = Register::getPending();
\r
179 $pager = new Pager($a->query_string, 100);
\r
185 'user.register_date',
\r
191 $order = 'contact.name';
\r
192 $order_direction = '+';
\r
193 if (!empty($_GET['o'])) {
\r
194 $new_order = $_GET['o'];
\r
195 if ($new_order[0] === '-') {
\r
196 $order_direction = '-';
\r
197 $new_order = substr($new_order, 1);
\r
200 if (in_array($new_order, $valid_orders)) {
\r
201 $order = $new_order;
\r
204 $sql_order = '`' . str_replace('.', '`.`', $order) . '`';
\r
205 $sql_order_direction = ($order_direction === '+') ? 'ASC' : 'DESC';
\r
207 $usersStmt = DBA::p("SELECT `user`.*, `contact`.`name`, `contact`.`url`, `contact`.`micro`, `user`.`account_expired`, `contact`.`last-item` AS `lastitem_date`
\r
209 INNER JOIN `contact` ON `contact`.`uid` = `user`.`uid` AND `contact`.`self`
\r
210 WHERE `user`.`verified`
\r
211 ORDER BY $sql_order $sql_order_direction LIMIT ?, ?", $pager->getStart(), $pager->getItemsPerPage()
\r
213 $users = DBA::toArray($usersStmt);
\r
215 $adminlist = explode(',', str_replace(' ', '', Config::get('config', 'admin_email')));
\r
216 $_setup_users = function ($e) use ($adminlist) {
\r
218 User::PAGE_FLAGS_NORMAL => L10n::t('Normal Account Page'),
\r
219 User::PAGE_FLAGS_SOAPBOX => L10n::t('Soapbox Page'),
\r
220 User::PAGE_FLAGS_COMMUNITY => L10n::t('Public Forum'),
\r
221 User::PAGE_FLAGS_FREELOVE => L10n::t('Automatic Friend Page'),
\r
222 User::PAGE_FLAGS_PRVGROUP => L10n::t('Private Forum')
\r
225 User::ACCOUNT_TYPE_PERSON => L10n::t('Personal Page'),
\r
226 User::ACCOUNT_TYPE_ORGANISATION => L10n::t('Organisation Page'),
\r
227 User::ACCOUNT_TYPE_NEWS => L10n::t('News Page'),
\r
228 User::ACCOUNT_TYPE_COMMUNITY => L10n::t('Community Forum'),
\r
229 User::ACCOUNT_TYPE_RELAY => L10n::t('Relay'),
\r
232 $e['page_flags_raw'] = $e['page-flags'];
\r
233 $e['page-flags'] = $page_types[$e['page-flags']];
\r
235 $e['account_type_raw'] = ($e['page_flags_raw'] == 0) ? $e['account-type'] : -1;
\r
236 $e['account-type'] = ($e['page_flags_raw'] == 0) ? $account_types[$e['account-type']] : '';
\r
238 $e['register_date'] = Temporal::getRelativeDate($e['register_date']);
\r
239 $e['login_date'] = Temporal::getRelativeDate($e['login_date']);
\r
240 $e['lastitem_date'] = Temporal::getRelativeDate($e['lastitem_date']);
\r
241 $e['is_admin'] = in_array($e['email'], $adminlist);
\r
242 $e['is_deletable'] = (intval($e['uid']) != local_user());
\r
243 $e['deleted'] = ($e['account_removed'] ? Temporal::getRelativeDate($e['account_expires_on']) : False);
\r
248 $tmp_users = array_map($_setup_users, $users);
\r
250 // Get rid of dashes in key names, Smarty3 can't handle them
\r
251 // and extracting deleted users
\r
255 foreach ($tmp_users as $user) {
\r
256 foreach ($user as $k => $v) {
\r
257 $newkey = str_replace('-', '_', $k);
\r
258 $user[$newkey] = $v;
\r
261 if ($user['deleted']) {
\r
262 $deleted[] = $user;
\r
268 $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
270 $t = Renderer::getMarkupTemplate('admin/users.tpl');
\r
271 $o = Renderer::replaceMacros($t, [
\r
273 '$title' => L10n::t('Administration'),
\r
274 '$page' => L10n::t('Users'),
\r
275 '$submit' => L10n::t('Add User'),
\r
276 '$select_all' => L10n::t('select all'),
\r
277 '$h_pending' => L10n::t('User registrations waiting for confirm'),
\r
278 '$h_deleted' => L10n::t('User waiting for permanent deletion'),
\r
279 '$th_pending' => [L10n::t('Request date'), L10n::t('Name'), L10n::t('Email')],
\r
280 '$no_pending' => L10n::t('No registrations.'),
\r
281 '$pendingnotetext' => L10n::t('Note from the user'),
\r
282 '$approve' => L10n::t('Approve'),
\r
283 '$deny' => L10n::t('Deny'),
\r
284 '$delete' => L10n::t('Delete'),
\r
285 '$block' => L10n::t('Block'),
\r
286 '$blocked' => L10n::t('User blocked'),
\r
287 '$unblock' => L10n::t('Unblock'),
\r
288 '$siteadmin' => L10n::t('Site admin'),
\r
289 '$accountexpired' => L10n::t('Account expired'),
\r
291 '$h_users' => L10n::t('Users'),
\r
292 '$h_newuser' => L10n::t('New User'),
\r
293 '$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
294 '$th_users' => $th_users,
\r
295 '$order_users' => $order,
\r
296 '$order_direction_users' => $order_direction,
\r
298 '$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
299 '$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
301 '$form_security_token' => parent::getFormSecurityToken('admin_users'),
\r
304 '$baseurl' => $a->getBaseURL(true),
\r
306 '$pending' => $pending,
\r
307 'deleted' => $deleted,
\r
308 '$users' => $users,
\r
309 '$newusername' => ['new_user_name', L10n::t('Name'), '', L10n::t('Name of the new user.')],
\r
310 '$newusernickname' => ['new_user_nickname', L10n::t('Nickname'), '', L10n::t('Nickname of the new user.')],
\r
311 '$newuseremail' => ['new_user_email', L10n::t('Email'), '', L10n::t('Email address of the new user.'), '', '', 'email'],
\r
314 $o .= $pager->renderFull(DBA::count('user'));
\r