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