]> git.mxchange.org Git - friendica.git/blob - src/Module/Admin/Users.php
Move admin/blocklist/contact to src/Module
[friendica.git] / src / Module / Admin / Users.php
1 <?php\r
2 \r
3 namespace Friendica\Module\Admin;\r
4 \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
16 \r
17 class Users extends BaseAdminModule\r
18 {\r
19         public static function post()\r
20         {\r
21                 parent::post();\r
22 \r
23                 $a = self::getApp();\r
24 \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
31 \r
32                 parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users');\r
33 \r
34                 if ($nu_name !== '' && $nu_email !== '' && $nu_nickname !== '') {\r
35                         try {\r
36                                 $result = User::create([\r
37                                         'username' => $nu_name,\r
38                                         'email' => $nu_email,\r
39                                         'nickname' => $nu_nickname,\r
40                                         'verified' => 1,\r
41                                         'language' => $nu_language\r
42                                 ]);\r
43                         } catch (\Exception $ex) {\r
44                                 notice($ex->getMessage());\r
45                                 return;\r
46                         }\r
47 \r
48                         $user = $result['user'];\r
49                         $preamble = Strings::deindent(L10n::t('\r
50                         Dear %1$s,\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
54 \r
55                         Site Location:  %1$s\r
56                         Login Name:             %2$s\r
57                         Password:               %3$s\r
58 \r
59                         You may change your password from your account "Settings" page after logging\r
60                         in.\r
61 \r
62                         Please take a few moments to review the other account settings on that page.\r
63 \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
66 \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
70                         than that.\r
71 \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
75 \r
76                         If you ever want to delete your account, you can do so at %1$s/removeme\r
77 \r
78                         Thank you and welcome to %4$s.'));\r
79 \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
82 \r
83                         notification([\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
91                                 'body'     => $body]);\r
92                 }\r
93 \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
97                 }\r
98 \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
102                 }\r
103 \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
108                                 } else {\r
109                                         notice(L10n::t('You can\'t remove yourself'));\r
110                                 }\r
111                         }\r
112 \r
113                         notice(L10n::tt('%s user deleted', '%s users deleted', count($users)));\r
114                 }\r
115 \r
116                 if (!empty($_POST['page_users_approve'])) {\r
117                         require_once 'mod/regmod.php';\r
118                         foreach ($pending as $hash) {\r
119                                 user_allow($hash);\r
120                         }\r
121                 }\r
122 \r
123                 if (!empty($_POST['page_users_deny'])) {\r
124                         require_once 'mod/regmod.php';\r
125                         foreach ($pending as $hash) {\r
126                                 user_deny($hash);\r
127                         }\r
128                 }\r
129 \r
130                 $a->internalRedirect('admin/users');\r
131         }\r
132 \r
133         public static function content()\r
134         {\r
135                 parent::content();\r
136 \r
137                 $a = self::getApp();\r
138 \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
148                         }\r
149 \r
150                         switch ($action) {\r
151                                 case 'delete':\r
152                                         if (local_user() != $uid) {\r
153                                                 parent::checkFormSecurityTokenRedirectOnError('/admin/users', 'admin_users', 't');\r
154                                                 // delete user\r
155                                                 User::remove($uid);\r
156 \r
157                                                 notice(L10n::t('User "%s" deleted', $user['username']));\r
158                                         } else {\r
159                                                 notice(L10n::t('You can\'t remove yourself'));\r
160                                         }\r
161                                         break;\r
162                                 case 'block':\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
166                                         break;\r
167                                 case 'unblock':\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
171                                         break;\r
172                         }\r
173 \r
174                         $a->internalRedirect('admin/users');\r
175                 }\r
176 \r
177                 /* get pending */\r
178                 $pending = Register::getPending();\r
179 \r
180                 $pager = new Pager($a->query_string, 100);\r
181 \r
182                 /* ordering */\r
183                 $valid_orders = [\r
184                         'contact.name',\r
185                         'user.email',\r
186                         'user.register_date',\r
187                         'user.login_date',\r
188                         'lastitem_date',\r
189                         'user.page-flags'\r
190                 ];\r
191 \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
199                         }\r
200 \r
201                         if (in_array($new_order, $valid_orders)) {\r
202                                 $order = $new_order;\r
203                         }\r
204                 }\r
205                 $sql_order = '`' . str_replace('.', '`.`', $order) . '`';\r
206                 $sql_order_direction = ($order_direction === '+') ? 'ASC' : 'DESC';\r
207 \r
208                 $usersStmt = DBA::p("SELECT `user`.*, `contact`.`name`, `contact`.`url`, `contact`.`micro`, `user`.`account_expired`, `contact`.`last-item` AS `lastitem_date`\r
209                                 FROM `user`\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
213                 );\r
214                 $users = DBA::toArray($usersStmt);\r
215 \r
216                 $adminlist = explode(',', str_replace(' ', '', Config::get('config', 'admin_email')));\r
217                 $_setup_users = function ($e) use ($adminlist) {\r
218                         $page_types = [\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
224                         ];\r
225                         $account_types = [\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
231                         ];\r
232 \r
233                         $e['page_flags_raw'] = $e['page-flags'];\r
234                         $e['page-flags'] = $page_types[$e['page-flags']];\r
235 \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
238 \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
245 \r
246                         return $e;\r
247                 };\r
248 \r
249                 $tmp_users = array_map($_setup_users, $users);\r
250 \r
251                 // Get rid of dashes in key names, Smarty3 can't handle them\r
252                 // and extracting deleted users\r
253 \r
254                 $deleted = [];\r
255                 $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
260                         }\r
261 \r
262                         if ($user['deleted']) {\r
263                                 $deleted[] = $user;\r
264                         } else {\r
265                                 $users[] = $user;\r
266                         }\r
267                 }\r
268 \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
270 \r
271                 $t = Renderer::getMarkupTemplate('admin/users.tpl');\r
272                 $o = Renderer::replaceMacros($t, [\r
273                         // strings //\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
291 \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
298 \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
301 \r
302                         '$form_security_token' => parent::getFormSecurityToken('admin_users'),\r
303 \r
304                         // values //\r
305                         '$baseurl' => $a->getBaseURL(true),\r
306 \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
313                 ]);\r
314 \r
315                 $o .= $pager->renderFull(DBA::count('user'));\r
316 \r
317                 return $o;\r
318         }\r
319 }