]> git.mxchange.org Git - friendica.git/blob - mod/admin.php
use to link to queue inspector
[friendica.git] / mod / admin.php
1 <?php
2
3  /**
4   * Friendica admin
5   */
6 require_once("include/remoteupdate.php");
7 require_once("include/enotify.php");
8 require_once("include/text.php");
9
10
11 /**
12  * @param App $a
13  */
14 function admin_post(&$a){
15
16
17         if(!is_site_admin()) {
18                 return;
19         }
20
21         // do not allow a page manager to access the admin panel at all.
22
23         if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
24                 return;
25
26
27
28         // urls
29         if ($a->argc > 1){
30                 switch ($a->argv[1]){
31                         case 'site':
32                                 admin_page_site_post($a);
33                                 break;
34                         case 'users':
35                                 admin_page_users_post($a);
36                                 break;
37                         case 'plugins':
38                                 if ($a->argc > 2 &&
39                                         is_file("addon/".$a->argv[2]."/".$a->argv[2].".php")){
40                                                 @include_once("addon/".$a->argv[2]."/".$a->argv[2].".php");
41                                                 if(function_exists($a->argv[2].'_plugin_admin_post')) {
42                                                         $func = $a->argv[2].'_plugin_admin_post';
43                                                         $func($a);
44                                                 }
45                                 }
46                                 goaway($a->get_baseurl(true) . '/admin/plugins/' . $a->argv[2] );
47                                 return; // NOTREACHED
48                                 break;
49                         case 'themes':
50                                 $theme = $a->argv[2];
51                                 if (is_file("view/theme/$theme/config.php")){
52                                         require_once("view/theme/$theme/config.php");
53                                         if (function_exists("theme_admin_post")){
54                                                 theme_admin_post($a);
55                                         }
56                                 }
57                                 info(t('Theme settings updated.'));
58                                 if(is_ajax()) return;
59
60                                 goaway($a->get_baseurl(true) . '/admin/themes/' . $theme );
61                                 return;
62                                 break;
63                         case 'logs':
64                                 admin_page_logs_post($a);
65                                 break;
66                         case 'dbsync':
67                                 admin_page_dbsync_post($a);
68                                 break;
69                         case 'update':
70                                 admin_page_remoteupdate_post($a);
71                                 break;
72                 }
73         }
74
75         goaway($a->get_baseurl(true) . '/admin' );
76         return; // NOTREACHED
77 }
78
79 /**
80  * @param App $a
81  * @return string
82  */
83 function admin_content(&$a) {
84
85         if(!is_site_admin()) {
86                 return login(false);
87         }
88
89         if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
90                 return "";
91
92         // APC deactivated, since there are problems with PHP 5.5
93         //if (function_exists("apc_delete")) {
94         //      $toDelete = new APCIterator('user', APC_ITER_VALUE);
95         //      apc_delete($toDelete);
96         //}
97
98         /**
99          * Side bar links
100          */
101
102         // array( url, name, extra css classes )
103         $aside = Array(
104                 'site'   =>     Array($a->get_baseurl(true)."/admin/site/", t("Site") , "site"),
105                 'users'  =>     Array($a->get_baseurl(true)."/admin/users/", t("Users") , "users"),
106                 'plugins'=>     Array($a->get_baseurl(true)."/admin/plugins/", t("Plugins") , "plugins"),
107                 'themes' =>     Array($a->get_baseurl(true)."/admin/themes/", t("Themes") , "themes"),
108                 'dbsync' =>     Array($a->get_baseurl(true)."/admin/dbsync/", t('DB updates'), "dbsync"),
109                 'queue'  =>     Array($a->get_baseurl(true)."/admin/queue/", t('Inspect Queue'), "queue"),
110                 //'update' =>   Array($a->get_baseurl(true)."/admin/update/", t("Software Update") , "update")
111         );
112
113         /* get plugins admin page */
114
115         $r = q("SELECT name FROM `addon` WHERE `plugin_admin`=1");
116         $aside['plugins_admin']=Array();
117         foreach ($r as $h){
118                 $plugin =$h['name'];
119                 $aside['plugins_admin'][] = Array($a->get_baseurl(true)."/admin/plugins/".$plugin, $plugin, "plugin");
120                 // temp plugins with admin
121                 $a->plugins_admin[] = $plugin;
122         }
123
124         $aside['logs'] = Array($a->get_baseurl(true)."/admin/logs/", t("Logs"), "logs");
125         $aside['diagnostics_probe'] = Array($a->get_baseurl(true).'/probe/', t('probe address'), 'probe');
126         $aside['diagnostics_webfinger'] = Array($a->get_baseurl(true).'/webfinger/', t('check webfinger'), 'webfinger');
127
128         $t = get_markup_template("admin_aside.tpl");
129         $a->page['aside'] .= replace_macros( $t, array(
130                         '$admin' => $aside,
131                         '$admtxt' => t('Admin'),
132                         '$plugadmtxt' => t('Plugin Features'),
133                         '$logtxt' => t('Logs'),
134                         '$diagnosticstxt' => t('diagnostics'),
135                         '$h_pending' => t('User registrations waiting for confirmation'),
136                         '$admurl'=> $a->get_baseurl(true)."/admin/"
137         ));
138
139
140
141         /**
142          * Page content
143          */
144         $o = '';
145         // urls
146         if ($a->argc > 1){
147                 switch ($a->argv[1]){
148                         case 'site':
149                                 $o = admin_page_site($a);
150                                 break;
151                         case 'users':
152                                 $o = admin_page_users($a);
153                                 break;
154                         case 'plugins':
155                                 $o = admin_page_plugins($a);
156                                 break;
157                         case 'themes':
158                                 $o = admin_page_themes($a);
159                                 break;
160                         case 'logs':
161                                 $o = admin_page_logs($a);
162                                 break;
163                         case 'dbsync':
164                                 $o = admin_page_dbsync($a);
165                                 break;
166                         case 'update':
167                                 $o = admin_page_remoteupdate($a);
168                                 break;
169                         case 'queue':
170                                 $o = admin_page_queue($a);
171                                 break;
172                         default:
173                                 notice( t("Item not found.") );
174                 }
175         } else {
176                 $o = admin_page_summary($a);
177         }
178
179         if(is_ajax()) {
180                 echo $o;
181                 killme();
182                 return '';
183         } else {
184                 return $o;
185         }
186 }
187
188 /**
189  * Admin Inspect Queue Page
190  * @param App $a
191  * return string
192  */
193 function admin_page_queue(&$a) {
194         // get content from the queue table
195         $r = q("SELECT c.name,c.nurl,q.id,q.network,q.created,q.last from queue as q, contact as c where c.id=q.cid order by q.cid, q.created;");
196
197         $t = get_markup_template("admin_queue.tpl");
198         return replace_macros($t, array(
199                 '$title' => t('Administration'),
200                 '$page' => t('Inspect Queue'),
201                 '$count' => sizeof($r),
202                 'id_header' => t('ID'),
203                 '$to_header' => t('Recipient Name'),
204                 '$url_header' => t('Recipient Profile'),
205                 '$network_header' => t('Network'),
206                 '$created_header' => t('Created'),
207                 '$last_header' => t('Last Tried'),
208                 '$info' => t('This page lists the content of the queue for outgoing postings. These are postings the initial delivery failed for. They will be resend later and eventually deleted if the delivery fails permanently.'),
209                 '$entries' => $r,
210         ));
211 }
212 /**
213  * Admin Summary Page
214  * @param App $a
215  * @return string
216  */
217 function admin_page_summary(&$a) {
218         $r = q("SELECT `page-flags`, COUNT(uid) as `count` FROM `user` GROUP BY `page-flags`");
219         $accounts = Array(
220                 Array( t('Normal Account'), 0),
221                 Array( t('Soapbox Account'), 0),
222                 Array( t('Community/Celebrity Account'), 0),
223                 Array( t('Automatic Friend Account'), 0),
224                 Array( t('Blog Account'), 0),
225                 Array( t('Private Forum'), 0)
226         );
227
228         $users=0;
229         foreach ($r as $u){ $accounts[$u['page-flags']][1] = $u['count']; $users+= $u['count']; }
230
231         logger('accounts: ' . print_r($accounts,true),LOGGER_DATA);
232
233         $r = q("SELECT COUNT(id) as `count` FROM `register`");
234         $pending = $r[0]['count'];
235
236         $r = q("select count(*) as total from deliverq where 1");
237         $deliverq = (($r) ? $r[0]['total'] : 0);
238
239         $r = q("select count(*) as total from queue where 1");
240         $queue = (($r) ? $r[0]['total'] : 0);
241
242         // We can do better, but this is a quick queue status
243
244         $queues = array( 'label' => t('Message queues'), 'deliverq' => $deliverq, 'queue' => $queue );
245
246
247         $t = get_markup_template("admin_summary.tpl");
248         return replace_macros($t, array(
249                 '$title' => t('Administration'),
250                 '$page' => t('Summary'),
251                 '$queues' => $queues,
252                 '$users' => Array( t('Registered users'), $users),
253                 '$accounts' => $accounts,
254                 '$pending' => Array( t('Pending registrations'), $pending),
255                 '$version' => Array( t('Version'), FRIENDICA_VERSION),
256                 '$baseurl' => $a->get_baseurl(),
257                 '$platform' => FRIENDICA_PLATFORM,
258                 '$codename' => FRIENDICA_CODENAME,
259                 '$build' =>  get_config('system','build'),
260                 '$plugins' => Array( t('Active plugins'), $a->plugins )
261         ));
262 }
263
264
265 /**
266  * Admin Site Page
267  *  @param App $a
268  */
269 function admin_page_site_post(&$a){
270         if (!x($_POST,"page_site")){
271                 return;
272         }
273
274         check_form_security_token_redirectOnErr('/admin/site', 'admin_site');
275
276         // relocate
277         if (x($_POST,'relocate') && x($_POST,'relocate_url') && $_POST['relocate_url']!=""){
278                 $new_url = $_POST['relocate_url'];
279                 $new_url = rtrim($new_url,"/");
280
281                 $parsed = @parse_url($new_url);
282                 if (!$parsed || (!x($parsed,'host') || !x($parsed,'scheme'))) {
283                         notice(t("Can not parse base url. Must have at least <scheme>://<domain>"));
284                         goaway($a->get_baseurl(true) . '/admin/site' );
285                 }
286
287                 /* steps:
288                  * replace all "baseurl" to "new_url" in config, profile, term, items and contacts
289                  * send relocate for every local user
290                  * */
291
292                 $old_url = $a->get_baseurl(true);
293
294                 function update_table($table_name, $fields, $old_url, $new_url) {
295                         global $db, $a;
296
297                         $dbold = dbesc($old_url);
298                         $dbnew = dbesc($new_url);
299
300                         $upd = array();
301                         foreach ($fields as $f) {
302                                 $upd[] = "`$f` = REPLACE(`$f`, '$dbold', '$dbnew')";
303                         }
304
305                         $upds = implode(", ", $upd);
306
307
308
309                         $q = sprintf("UPDATE %s SET %s;", $table_name, $upds);
310                         $r = q($q);
311                         if (!$r) {
312                                 notice( "Failed updating '$table_name': " . $db->error );
313                                 goaway($a->get_baseurl(true) . '/admin/site' );
314                         }
315                 }
316
317                 // update tables
318                 update_table("profile", array('photo', 'thumb'), $old_url, $new_url);
319                 update_table("term", array('url'), $old_url, $new_url);
320                 update_table("contact", array('photo','thumb','micro','url','nurl','request','notify','poll','confirm','poco'), $old_url, $new_url);
321                 update_table("unique_contacts", array('url'), $old_url, $new_url);
322                 update_table("item", array('owner-link','owner-avatar','author-name','author-link','author-avatar','body','plink','tag'), $old_url, $new_url);
323
324                 // update config
325                 $a->set_baseurl($new_url);
326                 set_config('system','url',$new_url);
327
328                 // send relocate
329                 $users = q("SELECT uid FROM user WHERE account_removed = 0 AND account_expired = 0");
330
331                 foreach ($users as $user) {
332                         proc_run('php', 'include/notifier.php', 'relocate', $user['uid']);
333                 }
334
335                 info("Relocation started. Could take a while to complete.");
336
337                 goaway($a->get_baseurl(true) . '/admin/site' );
338         }
339         // end relocate
340
341         $sitename               =       ((x($_POST,'sitename'))                 ? notags(trim($_POST['sitename']))              : '');
342         $hostname               =       ((x($_POST,'hostname'))                 ? notags(trim($_POST['hostname']))              : '');
343         $sender_email           =       ((x($_POST,'sender_email'))             ? notags(trim($_POST['sender_email']))          : '');
344         $banner                 =       ((x($_POST,'banner'))                   ? trim($_POST['banner'])                        : false);
345         $shortcut_icon          =       ((x($_POST,'shortcut_icon'))            ? notags(trim($_POST['shortcut_icon']))         : '');
346         $touch_icon             =       ((x($_POST,'touch_icon'))               ? notags(trim($_POST['touch_icon']))            : '');
347         $info                   =       ((x($_POST,'info'))                     ? trim($_POST['info'])                  : false);
348         $language               =       ((x($_POST,'language'))                 ? notags(trim($_POST['language']))              : '');
349         $theme                  =       ((x($_POST,'theme'))                    ? notags(trim($_POST['theme']))                 : '');
350         $theme_mobile           =       ((x($_POST,'theme_mobile'))             ? notags(trim($_POST['theme_mobile']))          : '');
351         $maximagesize           =       ((x($_POST,'maximagesize'))             ? intval(trim($_POST['maximagesize']))          :  0);
352         $maximagelength         =       ((x($_POST,'maximagelength'))           ? intval(trim($_POST['maximagelength']))        :  MAX_IMAGE_LENGTH);
353         $jpegimagequality       =       ((x($_POST,'jpegimagequality'))         ? intval(trim($_POST['jpegimagequality']))      :  JPEG_QUALITY);
354
355
356         $register_policy        =       ((x($_POST,'register_policy'))          ? intval(trim($_POST['register_policy']))       :  0);
357         $daily_registrations    =       ((x($_POST,'max_daily_registrations'))  ? intval(trim($_POST['max_daily_registrations']))       :0);
358         $abandon_days           =       ((x($_POST,'abandon_days'))             ? intval(trim($_POST['abandon_days']))          :  0);
359
360         $register_text          =       ((x($_POST,'register_text'))            ? notags(trim($_POST['register_text']))         : '');
361
362         $allowed_sites          =       ((x($_POST,'allowed_sites'))            ? notags(trim($_POST['allowed_sites']))         : '');
363         $allowed_email          =       ((x($_POST,'allowed_email'))            ? notags(trim($_POST['allowed_email']))         : '');
364         $block_public           =       ((x($_POST,'block_public'))             ? True                                          : False);
365         $force_publish          =       ((x($_POST,'publish_all'))              ? True                                          : False);
366         $global_directory       =       ((x($_POST,'directory_submit_url'))     ? notags(trim($_POST['directory_submit_url']))  : '');
367         $thread_allow           =       ((x($_POST,'thread_allow'))             ? True                                          : False);
368         $newuser_private                =       ((x($_POST,'newuser_private'))          ? True                                          : False);
369         $enotify_no_content             =       ((x($_POST,'enotify_no_content'))       ? True                                          : False);
370         $private_addons                 =       ((x($_POST,'private_addons'))           ? True                                          : False);
371         $disable_embedded               =       ((x($_POST,'disable_embedded'))         ? True                                          : False);
372         $allow_users_remote_self        =       ((x($_POST,'allow_users_remote_self'))          ? True                                          : False);
373
374         $no_multi_reg           =       ((x($_POST,'no_multi_reg'))             ? True                                          : False);
375         $no_openid              =       !((x($_POST,'no_openid'))               ? True                                          : False);
376         $no_regfullname         =       !((x($_POST,'no_regfullname'))          ? True                                          : False);
377         $no_utf                 =       !((x($_POST,'no_utf'))                  ? True                                          : False);
378         $community_page_style   =       ((x($_POST,'community_page_style'))     ? intval(trim($_POST['community_page_style']))  : 0);
379         $max_author_posts_community_page        =       ((x($_POST,'max_author_posts_community_page'))  ? intval(trim($_POST['max_author_posts_community_page']))       : 0);
380
381         $verifyssl              =       ((x($_POST,'verifyssl'))                ? True                                          : False);
382         $proxyuser              =       ((x($_POST,'proxyuser'))                ? notags(trim($_POST['proxyuser']))             : '');
383         $proxy                  =       ((x($_POST,'proxy'))                    ? notags(trim($_POST['proxy']))                 : '');
384         $timeout                =       ((x($_POST,'timeout'))                  ? intval(trim($_POST['timeout']))               : 60);
385         $delivery_interval      =       ((x($_POST,'delivery_interval'))        ? intval(trim($_POST['delivery_interval']))     : 0);
386         $poll_interval          =       ((x($_POST,'poll_interval'))            ? intval(trim($_POST['poll_interval']))         : 0);
387         $maxloadavg             =       ((x($_POST,'maxloadavg'))               ? intval(trim($_POST['maxloadavg']))            : 50);
388         $maxloadavg_frontend    =       ((x($_POST,'maxloadavg_frontend'))      ? intval(trim($_POST['maxloadavg_frontend']))   : 50);
389         $poco_completion        =       ((x($_POST,'poco_completion'))          ? intval(trim($_POST['poco_completion']))       : false);
390         $poco_discovery         =       ((x($_POST,'poco_discovery'))           ? intval(trim($_POST['poco_discovery']))        : 0);
391         $poco_discovery_since   =       ((x($_POST,'poco_discovery_since'))     ? intval(trim($_POST['poco_discovery_since']))  : 30);
392         $poco_local_search      =       ((x($_POST,'poco_local_search'))        ? intval(trim($_POST['poco_local_search']))     : false);
393         $dfrn_only              =       ((x($_POST,'dfrn_only'))                ? True                                          : False);
394         $ostatus_disabled       =       !((x($_POST,'ostatus_disabled'))        ? True                                          : False);
395         $ostatus_poll_interval  =       ((x($_POST,'ostatus_poll_interval'))    ? intval(trim($_POST['ostatus_poll_interval'])) :  0);
396         $diaspora_enabled       =       ((x($_POST,'diaspora_enabled'))         ? True                                          : False);
397         $ssl_policy             =       ((x($_POST,'ssl_policy'))               ? intval($_POST['ssl_policy'])                  : 0);
398         $force_ssl              =       ((x($_POST,'force_ssl'))                ? True                                          : False);
399         $old_share              =       ((x($_POST,'old_share'))                ? True                                          : False);
400         $hide_help              =       ((x($_POST,'hide_help'))                ? True                                          : False);
401         $suppress_language      =       ((x($_POST,'suppress_language'))        ? True                                          : False);
402         $suppress_tags          =       ((x($_POST,'suppress_tags'))            ? True                                          : False);
403         $use_fulltext_engine    =       ((x($_POST,'use_fulltext_engine'))      ? True                                          : False);
404         $itemcache              =       ((x($_POST,'itemcache'))                ? notags(trim($_POST['itemcache']))             : '');
405         $itemcache_duration     =       ((x($_POST,'itemcache_duration'))       ? intval($_POST['itemcache_duration'])          : 0);
406         $max_comments           =       ((x($_POST,'max_comments'))             ? intval($_POST['max_comments'])                : 0);
407         $lockpath               =       ((x($_POST,'lockpath'))                 ? notags(trim($_POST['lockpath']))              : '');
408         $temppath               =       ((x($_POST,'temppath'))                 ? notags(trim($_POST['temppath']))              : '');
409         $basepath               =       ((x($_POST,'basepath'))                 ? notags(trim($_POST['basepath']))              : '');
410         $singleuser             =       ((x($_POST,'singleuser'))               ? notags(trim($_POST['singleuser']))            : '');
411         $proxy_disabled         =       ((x($_POST,'proxy_disabled'))           ? True                                          : False);
412         $old_pager              =       ((x($_POST,'old_pager'))                ? True                                          : False);
413         $only_tag_search        =       ((x($_POST,'only_tag_search'))          ? True                                          : False);
414         $rino                   =       ((x($_POST,'rino'))                             ? intval($_POST['rino'])                                : 0);
415
416
417         if($ssl_policy != intval(get_config('system','ssl_policy'))) {
418                 if($ssl_policy == SSL_POLICY_FULL) {
419                         q("update `contact` set
420                                 `url`     = replace(`url`    , 'http:' , 'https:'),
421                                 `photo`   = replace(`photo`  , 'http:' , 'https:'),
422                                 `thumb`   = replace(`thumb`  , 'http:' , 'https:'),
423                                 `micro`   = replace(`micro`  , 'http:' , 'https:'),
424                                 `request` = replace(`request`, 'http:' , 'https:'),
425                                 `notify`  = replace(`notify` , 'http:' , 'https:'),
426                                 `poll`    = replace(`poll`   , 'http:' , 'https:'),
427                                 `confirm` = replace(`confirm`, 'http:' , 'https:'),
428                                 `poco`    = replace(`poco`   , 'http:' , 'https:')
429                                 where `self` = 1"
430                         );
431                         q("update `profile` set
432                                 `photo`   = replace(`photo`  , 'http:' , 'https:'),
433                                 `thumb`   = replace(`thumb`  , 'http:' , 'https:')
434                                 where 1 "
435                         );
436                 }
437                 elseif($ssl_policy == SSL_POLICY_SELFSIGN) {
438                         q("update `contact` set
439                                 `url`     = replace(`url`    , 'https:' , 'http:'),
440                                 `photo`   = replace(`photo`  , 'https:' , 'http:'),
441                                 `thumb`   = replace(`thumb`  , 'https:' , 'http:'),
442                                 `micro`   = replace(`micro`  , 'https:' , 'http:'),
443                                 `request` = replace(`request`, 'https:' , 'http:'),
444                                 `notify`  = replace(`notify` , 'https:' , 'http:'),
445                                 `poll`    = replace(`poll`   , 'https:' , 'http:'),
446                                 `confirm` = replace(`confirm`, 'https:' , 'http:'),
447                                 `poco`    = replace(`poco`   , 'https:' , 'http:')
448                                 where `self` = 1"
449                         );
450                         q("update `profile` set
451                                 `photo`   = replace(`photo`  , 'https:' , 'http:'),
452                                 `thumb`   = replace(`thumb`  , 'https:' , 'http:')
453                                 where 1 "
454                         );
455                 }
456         }
457         set_config('system','ssl_policy',$ssl_policy);
458         set_config('system','delivery_interval',$delivery_interval);
459         set_config('system','poll_interval',$poll_interval);
460         set_config('system','maxloadavg',$maxloadavg);
461         set_config('system','maxloadavg_frontend',$maxloadavg_frontend);
462         set_config('system','poco_completion',$poco_completion);
463         set_config('system','poco_discovery',$poco_discovery);
464         set_config('system','poco_discovery_since',$poco_discovery_since);
465         set_config('system','poco_local_search',$poco_local_search);
466         set_config('config','sitename',$sitename);
467         set_config('config','hostname',$hostname);
468         set_config('config','sender_email', $sender_email);
469         set_config('system','suppress_language',$suppress_language);
470         set_config('system','suppress_tags',$suppress_tags);
471         set_config('system','shortcut_icon',$shortcut_icon);
472         set_config('system','touch_icon',$touch_icon);
473
474         if ($banner==""){
475                 // don't know why, but del_config doesn't work...
476                 q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
477                         dbesc("system"),
478                         dbesc("banner")
479                 );
480         } else {
481                 set_config('system','banner', $banner);
482         }
483         if ($info=="") {
484                 del_config('config','info');
485         } else {
486                 set_config('config','info',$info);
487         }
488         set_config('system','language', $language);
489         set_config('system','theme', $theme);
490         if ( $theme_mobile === '---' ) {
491                 del_config('system','mobile-theme');
492         } else {
493                 set_config('system','mobile-theme', $theme_mobile);
494                 }
495                 if ( $singleuser === '---' ) {
496                         del_config('system','singleuser');
497                 } else {
498                         set_config('system','singleuser', $singleuser);
499                 }
500         set_config('system','maximagesize', $maximagesize);
501         set_config('system','max_image_length', $maximagelength);
502         set_config('system','jpeg_quality', $jpegimagequality);
503
504         set_config('config','register_policy', $register_policy);
505         set_config('system','max_daily_registrations', $daily_registrations);
506         set_config('system','account_abandon_days', $abandon_days);
507         set_config('config','register_text', $register_text);
508         set_config('system','allowed_sites', $allowed_sites);
509         set_config('system','allowed_email', $allowed_email);
510         set_config('system','block_public', $block_public);
511         set_config('system','publish_all', $force_publish);
512         if ($global_directory==""){
513                 // don't know why, but del_config doesn't work...
514                 q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
515                         dbesc("system"),
516                         dbesc("directory_submit_url")
517                 );
518         } else {
519                 set_config('system','directory_submit_url', $global_directory);
520         }
521         set_config('system','thread_allow', $thread_allow);
522         set_config('system','newuser_private', $newuser_private);
523         set_config('system','enotify_no_content', $enotify_no_content);
524         set_config('system','disable_embedded', $disable_embedded);
525         set_config('system','allow_users_remote_self', $allow_users_remote_self);
526
527         set_config('system','block_extended_register', $no_multi_reg);
528         set_config('system','no_openid', $no_openid);
529         set_config('system','no_regfullname', $no_regfullname);
530         set_config('system','community_page_style', $community_page_style);
531         set_config('system','max_author_posts_community_page', $max_author_posts_community_page);
532         set_config('system','no_utf', $no_utf);
533         set_config('system','verifyssl', $verifyssl);
534         set_config('system','proxyuser', $proxyuser);
535         set_config('system','proxy', $proxy);
536         set_config('system','curl_timeout', $timeout);
537         set_config('system','dfrn_only', $dfrn_only);
538         set_config('system','ostatus_disabled', $ostatus_disabled);
539         set_config('system','ostatus_poll_interval', $ostatus_poll_interval);
540         set_config('system','diaspora_enabled', $diaspora_enabled);
541         set_config('config','private_addons', $private_addons);
542
543         set_config('system','force_ssl', $force_ssl);
544         set_config('system','old_share', $old_share);
545         set_config('system','hide_help', $hide_help);
546         set_config('system','use_fulltext_engine', $use_fulltext_engine);
547         set_config('system','itemcache', $itemcache);
548         set_config('system','itemcache_duration', $itemcache_duration);
549         set_config('system','max_comments', $max_comments);
550         set_config('system','lockpath', $lockpath);
551         set_config('system','temppath', $temppath);
552         set_config('system','basepath', $basepath);
553         set_config('system','proxy_disabled', $proxy_disabled);
554         set_config('system','old_pager', $old_pager);
555         set_config('system','only_tag_search', $only_tag_search);
556
557         set_config('system','rino_encrypt', $rino);
558         
559         
560         info( t('Site settings updated.') . EOL);
561         goaway($a->get_baseurl(true) . '/admin/site' );
562         return; // NOTREACHED
563
564 }
565
566 /**
567  * @param  App $a
568  * @return string
569  */
570 function admin_page_site(&$a) {
571
572         /* Installed langs */
573         $lang_choices = array();
574         $langs = glob('view/*/strings.php');
575
576         if(is_array($langs) && count($langs)) {
577                 if(! in_array('view/en/strings.php',$langs))
578                         $langs[] = 'view/en/';
579                 asort($langs);
580                 foreach($langs as $l) {
581                         $t = explode("/",$l);
582                         $lang_choices[$t[1]] = $t[1];
583                 }
584         }
585
586         /* Installed themes */
587         $theme_choices = array();
588         $theme_choices_mobile = array();
589         $theme_choices_mobile["---"] = t("No special theme for mobile devices");
590         $files = glob('view/theme/*');
591         if($files) {
592                 foreach($files as $file) {
593                         $f = basename($file);
594                         $theme_name = ((file_exists($file . '/experimental')) ?  sprintf("%s - \x28Experimental\x29", $f) : $f);
595                         if (file_exists($file . '/mobile')) {
596                                 $theme_choices_mobile[$f] = $theme_name;
597                         }
598                 else {
599                                 $theme_choices[$f] = $theme_name;
600                         }
601                 }
602                 }
603
604                 /* Community page style */
605                 $community_page_style_choices = array(
606                         CP_NO_COMMUNITY_PAGE => t("No community page"),
607                         CP_USERS_ON_SERVER => t("Public postings from users of this site"),
608                         CP_GLOBAL_COMMUNITY => t("Global community page")
609                         );
610
611                 /* OStatus conversation poll choices */
612                 $ostatus_poll_choices = array(
613                         "-2" => t("Never"),
614                         "-1" => t("At post arrival"),
615                         "0" => t("Frequently"),
616                         "60" => t("Hourly"),
617                         "720" => t("Twice daily"),
618                         "1440" => t("Daily")
619                         );
620
621                 $poco_discovery_choices = array(
622                         "0" => t("Disabled"),
623                         "1" => t("Users"),
624                         "2" => t("Users, Global Contacts"),
625                         "3" => t("Users, Global Contacts/fallback"),
626                         );
627
628                 $poco_discovery_since_choices = array(
629                         "30" => t("One month"),
630                         "91" => t("Three months"),
631                         "182" => t("Half a year"),
632                         "365" => t("One year"),
633                         );
634
635                 /* get user names to make the install a personal install of X */
636                 $user_names = array();
637                 $user_names['---'] = t('Multi user instance');
638                 $users = q("SELECT username, nickname FROM `user`");
639                 foreach ($users as $user) {
640                         $user_names[$user['nickname']] = $user['username'];
641                 }
642
643         /* Banner */
644         $banner = get_config('system','banner');
645         if($banner == false)
646                 $banner = '<a href="http://friendica.com"><img id="logo-img" src="images/friendica-32.png" alt="logo" /></a><span id="logo-text"><a href="http://friendica.com">Friendica</a></span>';
647         $banner = htmlspecialchars($banner);
648         $info = get_config('config','info');
649         $info = htmlspecialchars($info);
650
651         // Automatically create temporary paths
652         get_temppath();
653         get_lockpath();
654         get_itemcachepath();
655
656         //echo "<pre>"; var_dump($lang_choices); die("</pre>");
657
658         /* Register policy */
659         $register_choices = Array(
660                 REGISTER_CLOSED => t("Closed"),
661                 REGISTER_APPROVE => t("Requires approval"),
662                 REGISTER_OPEN => t("Open")
663         );
664
665         $ssl_choices = array(
666                 SSL_POLICY_NONE => t("No SSL policy, links will track page SSL state"),
667                 SSL_POLICY_FULL => t("Force all links to use SSL"),
668                 SSL_POLICY_SELFSIGN => t("Self-signed certificate, use SSL for local links only (discouraged)")
669         );
670
671         if ($a->config['hostname'] == "")
672                 $a->config['hostname'] = $a->get_hostname();
673
674         $t = get_markup_template("admin_site.tpl");
675         return replace_macros($t, array(
676                 '$title' => t('Administration'),
677                 '$page' => t('Site'),
678                 '$submit' => t('Save Settings'),
679                 '$registration' => t('Registration'),
680                 '$upload' => t('File upload'),
681                 '$corporate' => t('Policies'),
682                 '$advanced' => t('Advanced'),
683                 '$portable_contacts' => t('Auto Discovered Contact Directory'),
684                 '$performance' => t('Performance'),
685                 '$relocate'=> t('Relocate - WARNING: advanced function. Could make this server unreachable.'),
686                 '$baseurl' => $a->get_baseurl(true),
687                 // name, label, value, help string, extra data...
688                 '$sitename'             => array('sitename', t("Site name"), $a->config['sitename'],'UTF-8'),
689                 '$hostname'             => array('hostname', t("Host name"), $a->config['hostname'], ""),
690                 '$sender_email'         => array('sender_email', t("Sender Email"), $a->config['sender_email'], "The email address your server shall use to send notification emails from.", "", "", "email"),
691                 '$banner'               => array('banner', t("Banner/Logo"), $banner, ""),
692                 '$shortcut_icon'        => array('shortcut_icon', t("Shortcut icon"), get_config('system','shortcut_icon'),  "Link to an icon that will be used for browsers."),
693                 '$touch_icon'           => array('touch_icon', t("Touch icon"), get_config('system','touch_icon'),  "Link to an icon that will be used for tablets and mobiles."),
694                 '$info' => array('info',t('Additional Info'), $info, t('For public servers: you can add additional information here that will be listed at dir.friendica.com/siteinfo.')),
695                 '$language'             => array('language', t("System language"), get_config('system','language'), "", $lang_choices),
696                 '$theme'                => array('theme', t("System theme"), get_config('system','theme'), t("Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"), $theme_choices),
697                 '$theme_mobile'         => array('theme_mobile', t("Mobile system theme"), get_config('system','mobile-theme'), t("Theme for mobile devices"), $theme_choices_mobile),
698                 '$ssl_policy'           => array('ssl_policy', t("SSL link policy"), (string) intval(get_config('system','ssl_policy')), t("Determines whether generated links should be forced to use SSL"), $ssl_choices),
699                 '$force_ssl'            => array('force_ssl', t("Force SSL"), get_config('system','force_ssl'), t("Force all Non-SSL requests to SSL - Attention: on some systems it could lead to endless loops.")),
700                 '$old_share'            => array('old_share', t("Old style 'Share'"), get_config('system','old_share'), t("Deactivates the bbcode element 'share' for repeating items.")),
701                 '$hide_help'            => array('hide_help', t("Hide help entry from navigation menu"), get_config('system','hide_help'), t("Hides the menu entry for the Help pages from the navigation menu. You can still access it calling /help directly.")),
702                 '$singleuser'           => array('singleuser', t("Single user instance"), get_config('system','singleuser'), t("Make this instance multi-user or single-user for the named user"), $user_names),
703                 '$maximagesize'         => array('maximagesize', t("Maximum image size"), get_config('system','maximagesize'), t("Maximum size in bytes of uploaded images. Default is 0, which means no limits.")),
704                 '$maximagelength'               => array('maximagelength', t("Maximum image length"), get_config('system','max_image_length'), t("Maximum length in pixels of the longest side of uploaded images. Default is -1, which means no limits.")),
705                 '$jpegimagequality'             => array('jpegimagequality', t("JPEG image quality"), get_config('system','jpeg_quality'), t("Uploaded JPEGS will be saved at this quality setting [0-100]. Default is 100, which is full quality.")),
706
707                 '$register_policy'      => array('register_policy', t("Register policy"), $a->config['register_policy'], "", $register_choices),
708                 '$daily_registrations'  => array('max_daily_registrations', t("Maximum Daily Registrations"), get_config('system', 'max_daily_registrations'), t("If registration is permitted above, this sets the maximum number of new user registrations to accept per day.  If register is set to closed, this setting has no effect.")),
709                 '$register_text'        => array('register_text', t("Register text"), $a->config['register_text'], t("Will be displayed prominently on the registration page.")),
710                 '$abandon_days'         => array('abandon_days', t('Accounts abandoned after x days'), get_config('system','account_abandon_days'), t('Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit.')),
711                 '$allowed_sites'        => array('allowed_sites', t("Allowed friend domains"), get_config('system','allowed_sites'), t("Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains")),
712                 '$allowed_email'        => array('allowed_email', t("Allowed email domains"), get_config('system','allowed_email'), t("Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains")),
713                 '$block_public'         => array('block_public', t("Block public"), get_config('system','block_public'), t("Check to block public access to all otherwise public personal pages on this site unless you are currently logged in.")),
714                 '$force_publish'        => array('publish_all', t("Force publish"), get_config('system','publish_all'), t("Check to force all profiles on this site to be listed in the site directory.")),
715                 '$global_directory'     => array('directory_submit_url', t("Global directory update URL"), get_config('system','directory_submit_url'), t("URL to update the global directory. If this is not set, the global directory is completely unavailable to the application.")),
716                 '$thread_allow'         => array('thread_allow', t("Allow threaded items"), get_config('system','thread_allow'), t("Allow infinite level threading for items on this site.")),
717                 '$newuser_private'      => array('newuser_private', t("Private posts by default for new users"), get_config('system','newuser_private'), t("Set default post permissions for all new members to the default privacy group rather than public.")),
718                 '$enotify_no_content'   => array('enotify_no_content', t("Don't include post content in email notifications"), get_config('system','enotify_no_content'), t("Don't include the content of a post/comment/private message/etc. in the email notifications that are sent out from this site, as a privacy measure.")),
719                 '$private_addons'       => array('private_addons', t("Disallow public access to addons listed in the apps menu."), get_config('config','private_addons'), t("Checking this box will restrict addons listed in the apps menu to members only.")),
720                 '$disable_embedded'     => array('disable_embedded', t("Don't embed private images in posts"), get_config('system','disable_embedded'), t("Don't replace locally-hosted private photos in posts with an embedded copy of the image. This means that contacts who receive posts containing private photos will have to authenticate and load each image, which may take a while.")),
721                 '$allow_users_remote_self'      => array('allow_users_remote_self', t('Allow Users to set remote_self'), get_config('system','allow_users_remote_self'), t('With checking this, every user is allowed to mark every contact as a remote_self in the repair contact dialog. Setting this flag on a contact causes mirroring every posting of that contact in the users stream.')),
722                 '$no_multi_reg'         => array('no_multi_reg', t("Block multiple registrations"),  get_config('system','block_extended_register'), t("Disallow users to register additional accounts for use as pages.")),
723                 '$no_openid'            => array('no_openid', t("OpenID support"), !get_config('system','no_openid'), t("OpenID support for registration and logins.")),
724                 '$no_regfullname'       => array('no_regfullname', t("Fullname check"), !get_config('system','no_regfullname'), t("Force users to register with a space between firstname and lastname in Full name, as an antispam measure")),
725                 '$no_utf'               => array('no_utf', t("UTF-8 Regular expressions"), !get_config('system','no_utf'), t("Use PHP UTF8 regular expressions")),
726                 '$community_page_style' => array('community_page_style', t("Community Page Style"), get_config('system','community_page_style'), t("Type of community page to show. 'Global community' shows every public posting from an open distributed network that arrived on this server."), $community_page_style_choices),
727                 '$max_author_posts_community_page' => array('max_author_posts_community_page', t("Posts per user on community page"), get_config('system','max_author_posts_community_page'), t("The maximum number of posts per user on the community page. (Not valid for 'Global Community')")),
728                 '$ostatus_disabled'     => array('ostatus_disabled', t("Enable OStatus support"), !get_config('system','ostatus_disabled'), t("Provide built-in OStatus \x28StatusNet, GNU Social etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed.")),
729                 '$ostatus_poll_interval'        => array('ostatus_poll_interval', t("OStatus conversation completion interval"), (string) intval(get_config('system','ostatus_poll_interval')), t("How often shall the poller check for new entries in OStatus conversations? This can be a very ressource task."), $ostatus_poll_choices),
730                 '$diaspora_enabled'     => array('diaspora_enabled', t("Enable Diaspora support"), get_config('system','diaspora_enabled'), t("Provide built-in Diaspora network compatibility.")),
731                 '$dfrn_only'            => array('dfrn_only', t('Only allow Friendica contacts'), get_config('system','dfrn_only'), t("All contacts must use Friendica protocols. All other built-in communication protocols disabled.")),
732                 '$verifyssl'            => array('verifyssl', t("Verify SSL"), get_config('system','verifyssl'), t("If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites.")),
733                 '$proxyuser'            => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
734                 '$proxy'                => array('proxy', t("Proxy URL"), get_config('system','proxy'), ""),
735                 '$timeout'              => array('timeout', t("Network timeout"), (x(get_config('system','curl_timeout'))?get_config('system','curl_timeout'):60), t("Value is in seconds. Set to 0 for unlimited (not recommended).")),
736                 '$delivery_interval'    => array('delivery_interval', t("Delivery interval"), (x(get_config('system','delivery_interval'))?get_config('system','delivery_interval'):2), t("Delay background delivery processes by this many seconds to reduce system load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 for large dedicated servers.")),
737                 '$poll_interval'        => array('poll_interval', t("Poll interval"), (x(get_config('system','poll_interval'))?get_config('system','poll_interval'):2), t("Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval.")),
738                 '$maxloadavg'           => array('maxloadavg', t("Maximum Load Average"), ((intval(get_config('system','maxloadavg')) > 0)?get_config('system','maxloadavg'):50), t("Maximum system load before delivery and poll processes are deferred - default 50.")),
739                 '$maxloadavg_frontend'  => array('maxloadavg_frontend', t("Maximum Load Average (Frontend)"), ((intval(get_config('system','maxloadavg_frontend')) > 0)?get_config('system','maxloadavg_frontend'):50), t("Maximum system load before the frontend quits service - default 50.")),
740
741                 '$poco_completion'      => array('poco_completion', t("Periodical check of global contacts"), get_config('system','poco_completion'), t("If enabled, the global contacts are checked periodically for missing or outdated data and the vitality of the contacts and servers.")),
742                 '$poco_discovery'       => array('poco_discovery', t("Discover contacts from other servers"), (string) intval(get_config('system','poco_discovery')), t("Periodically query other servers for contacts. You can choose between 'users': the users on the remote system, 'Global Contacts': active contacts that are known on the system. The fallback is meant for Redmatrix servers and older friendica servers, where global contacts weren't available. The fallback increases the server load, so the recommened setting is 'Users, Global Contacts'."), $poco_discovery_choices),
743                 '$poco_discovery_since' => array('poco_discovery_since', t("Timeframe for fetching global contacts"), (string) intval(get_config('system','poco_discovery_since')), t("When the discovery is activated, this value defines the timeframe for the activity of the global contacts that are fetched from other servers."), $poco_discovery_since_choices),
744                 '$poco_local_search'    => array('poco_local_search', t("Search the local directory"), get_config('system','poco_local_search'), t("Search the local directory instead of the global directory. When searching locally, every search will be executed on the global directory in the background. This improves the search results when the search is repeated.")),
745
746                 '$use_fulltext_engine'  => array('use_fulltext_engine', t("Use MySQL full text engine"), get_config('system','use_fulltext_engine'), t("Activates the full text engine. Speeds up search - but can only search for four and more characters.")),
747                 '$suppress_language'    => array('suppress_language', t("Suppress Language"), get_config('system','suppress_language'), t("Suppress language information in meta information about a posting.")),
748                 '$suppress_tags'        => array('suppress_tags', t("Suppress Tags"), get_config('system','suppress_tags'), t("Suppress showing a list of hashtags at the end of the posting.")),
749                 '$itemcache'            => array('itemcache', t("Path to item cache"), get_config('system','itemcache'), "The item caches buffers generated bbcode and external images."),
750                 '$itemcache_duration'   => array('itemcache_duration', t("Cache duration in seconds"), get_config('system','itemcache_duration'), t("How long should the cache files be hold? Default value is 86400 seconds (One day). To disable the item cache, set the value to -1.")),
751                 '$max_comments'         => array('max_comments', t("Maximum numbers of comments per post"), get_config('system','max_comments'), t("How much comments should be shown for each post? Default value is 100.")),
752                 '$lockpath'             => array('lockpath', t("Path for lock file"), get_config('system','lockpath'), "The lock file is used to avoid multiple pollers at one time. Only define a folder here."),
753                 '$temppath'             => array('temppath', t("Temp path"), get_config('system','temppath'), "If you have a restricted system where the webserver can't access the system temp path, enter another path here."),
754                 '$basepath'             => array('basepath', t("Base path to installation"), get_config('system','basepath'), "If the system cannot detect the correct path to your installation, enter the correct path here. This setting should only be set if you are using a restricted system and symbolic links to your webroot."),
755                 '$proxy_disabled'       => array('proxy_disabled', t("Disable picture proxy"), get_config('system','proxy_disabled'), t("The picture proxy increases performance and privacy. It shouldn't be used on systems with very low bandwith.")),
756                 '$old_pager'            => array('old_pager', t("Enable old style pager"), get_config('system','old_pager'), t("The old style pager has page numbers but slows down massively the page speed.")),
757                 '$only_tag_search'      => array('only_tag_search', t("Only search in tags"), get_config('system','only_tag_search'), t("On large systems the text search can slow down the system extremely.")),
758
759                 '$relocate_url'     => array('relocate_url', t("New base url"), $a->get_baseurl(), "Change base url for this server. Sends relocate message to all DFRN contacts of all users."),
760                 
761                 '$rino'                 => array('rino', t("RINO Encryption"), intval(get_config('system','rino_encrypt')), t("Encryption layer between nodes."), array("Disabled", "RINO1 (deprecated)", "RINO2")),
762                 
763                 '$form_security_token' => get_form_security_token("admin_site")
764
765         ));
766
767 }
768
769
770 function admin_page_dbsync(&$a) {
771
772         $o = '';
773
774         if($a->argc > 3 && intval($a->argv[3]) && $a->argv[2] === 'mark') {
775                 set_config('database', 'update_' . intval($a->argv[3]), 'success');
776                 $curr = get_config('system','build');
777                 if(intval($curr) == intval($a->argv[3]))
778                         set_config('system','build',intval($curr) + 1);
779                 info( t('Update has been marked successful') . EOL);
780                 goaway($a->get_baseurl(true) . '/admin/dbsync');
781         }
782
783         if(($a->argc > 2) AND (intval($a->argv[2]) OR ($a->argv[2] === 'check'))) {
784                 require_once("include/dbstructure.php");
785                 $retval = update_structure(false, true);
786                 if (!$retval) {
787                         $o .= sprintf(t("Database structure update %s was successfully applied."), DB_UPDATE_VERSION)."<br />";
788                         set_config('database', 'dbupdate_'.DB_UPDATE_VERSION, 'success');
789                 } else
790                         $o .= sprintf(t("Executing of database structure update %s failed with error: %s"),
791                                         DB_UPDATE_VERSION, $retval)."<br />";
792                 if ($a->argv[2] === 'check')
793                         return $o;
794         }
795
796         if ($a->argc > 2 && intval($a->argv[2])) {
797                 require_once('update.php');
798                 $func = 'update_' . intval($a->argv[2]);
799                 if(function_exists($func)) {
800                         $retval = $func();
801                         if($retval === UPDATE_FAILED) {
802                                 $o .= sprintf(t("Executing %s failed with error: %s"), $func, $retval);
803                         }
804                         elseif($retval === UPDATE_SUCCESS) {
805                                 $o .= sprintf(t('Update %s was successfully applied.', $func));
806                                 set_config('database',$func, 'success');
807                         }
808                         else
809                                 $o .= sprintf(t('Update %s did not return a status. Unknown if it succeeded.'), $func);
810                 } else {
811                         $o .= sprintf(t('There was no additional update function %s that needed to be called.'), $func)."<br />";
812                         set_config('database',$func, 'success');
813                 }
814                 return $o;
815         }
816
817         $failed = array();
818         $r = q("select k, v from config where `cat` = 'database' ");
819         if(count($r)) {
820                 foreach($r as $rr) {
821                         $upd = intval(substr($rr['k'],7));
822                         if($upd < 1139 || $rr['v'] === 'success')
823                                 continue;
824                         $failed[] = $upd;
825                 }
826         }
827         if(! count($failed)) {
828                 $o = replace_macros(get_markup_template('structure_check.tpl'),array(
829                         '$base' => $a->get_baseurl(true),
830                         '$banner' => t('No failed updates.'),
831                         '$check' => t('Check database structure'),
832                 ));
833         } else {
834                 $o = replace_macros(get_markup_template('failed_updates.tpl'),array(
835                         '$base' => $a->get_baseurl(true),
836                         '$banner' => t('Failed Updates'),
837                         '$desc' => t('This does not include updates prior to 1139, which did not return a status.'),
838                         '$mark' => t('Mark success (if update was manually applied)'),
839                         '$apply' => t('Attempt to execute this update step automatically'),
840                         '$failed' => $failed
841                 ));
842         }
843
844         return $o;
845
846 }
847
848 /**
849  * Users admin page
850  *
851  * @param App $a
852  */
853 function admin_page_users_post(&$a){
854         $pending = ( x($_POST, 'pending') ? $_POST['pending'] : Array() );
855         $users = ( x($_POST, 'user') ? $_POST['user'] : Array() );
856         $nu_name = ( x($_POST, 'new_user_name') ? $_POST['new_user_name'] : '');
857         $nu_nickname = ( x($_POST, 'new_user_nickname') ? $_POST['new_user_nickname'] : '');
858         $nu_email = ( x($_POST, 'new_user_email') ? $_POST['new_user_email'] : '');
859
860         check_form_security_token_redirectOnErr($a->get_baseurl().'/admin/users', 'admin_users');
861
862         if (!($nu_name==="") && !($nu_email==="") && !($nu_nickname==="")) {
863                 require_once('include/user.php');
864
865                 $result = create_user( array('username'=>$nu_name, 'email'=>$nu_email, 'nickname'=>$nu_nickname, 'verified'=>1)  );
866                 if(! $result['success']) {
867                         notice($result['message']);
868                         return;
869                 }
870                 $nu = $result['user'];
871                 $preamble = deindent(t('
872                         Dear %1$s,
873                                 the administrator of %2$s has set up an account for you.'));
874                 $body = deindent(t('
875                         The login details are as follows:
876
877                         Site Location:  %1$s
878                         Login Name:             %2$s
879                         Password:               %3$s
880
881                         You may change your password from your account "Settings" page after logging
882                         in.
883
884                         Please take a few moments to review the other account settings on that page.
885
886                         You may also wish to add some basic information to your default profile
887                         (on the "Profiles" page) so that other people can easily find you.
888
889                         We recommend setting your full name, adding a profile photo,
890                         adding some profile "keywords" (very useful in making new friends) - and
891                         perhaps what country you live in; if you do not wish to be more specific
892                         than that.
893
894                         We fully respect your right to privacy, and none of these items are necessary.
895                         If you are new and do not know anybody here, they may help
896                         you to make some new and interesting friends.
897
898                         Thank you and welcome to %4$s.'));
899
900                 $preamble = sprintf($preamble, $nu['username'], $a->config['sitename']);
901                 $body = sprintf($body, $a->get_baseurl(), $nu['email'], $result['password'], $a->config['sitename']);
902
903                 notification(array(
904                         'type' => "SYSTEM_EMAIL",
905                         'to_email' => $nu['email'],
906                         'subject'=> sprintf( t('Registration details for %s'), $a->config['sitename']),
907                         'preamble'=> $preamble,
908                         'body' => $body));
909
910         }
911
912         if (x($_POST,'page_users_block')){
913                 foreach($users as $uid){
914                         q("UPDATE `user` SET `blocked`=1-`blocked` WHERE `uid`=%s",
915                                 intval( $uid )
916                         );
917                 }
918                 notice( sprintf( tt("%s user blocked/unblocked", "%s users blocked/unblocked", count($users)), count($users)) );
919         }
920         if (x($_POST,'page_users_delete')){
921                 require_once("include/Contact.php");
922                 foreach($users as $uid){
923                         user_remove($uid);
924                 }
925                 notice( sprintf( tt("%s user deleted", "%s users deleted", count($users)), count($users)) );
926         }
927
928         if (x($_POST,'page_users_approve')){
929                 require_once("mod/regmod.php");
930                 foreach($pending as $hash){
931                         user_allow($hash);
932                 }
933         }
934         if (x($_POST,'page_users_deny')){
935                 require_once("mod/regmod.php");
936                 foreach($pending as $hash){
937                         user_deny($hash);
938                 }
939         }
940         goaway($a->get_baseurl(true) . '/admin/users' );
941         return; // NOTREACHED
942 }
943
944 /**
945  * @param App $a
946  * @return string
947  */
948 function admin_page_users(&$a){
949         if ($a->argc>2) {
950                 $uid = $a->argv[3];
951                 $user = q("SELECT username, blocked FROM `user` WHERE `uid`=%d", intval($uid));
952                 if (count($user)==0){
953                         notice( 'User not found' . EOL);
954                         goaway($a->get_baseurl(true) . '/admin/users' );
955                         return ''; // NOTREACHED
956                 }
957                 switch($a->argv[2]){
958                         case "delete":{
959                                 check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
960                                 // delete user
961                                 require_once("include/Contact.php");
962                                 user_remove($uid);
963
964                                 notice( sprintf(t("User '%s' deleted"), $user[0]['username']) . EOL);
965                         }; break;
966                         case "block":{
967                                 check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
968                                 q("UPDATE `user` SET `blocked`=%d WHERE `uid`=%s",
969                                         intval( 1-$user[0]['blocked'] ),
970                                         intval( $uid )
971                                 );
972                                 notice( sprintf( ($user[0]['blocked']?t("User '%s' unblocked"):t("User '%s' blocked")) , $user[0]['username']) . EOL);
973                         }; break;
974                 }
975                 goaway($a->get_baseurl(true) . '/admin/users' );
976                 return ''; // NOTREACHED
977
978         }
979
980         /* get pending */
981         $pending = q("SELECT `register`.*, `contact`.`name`, `user`.`email`
982                                  FROM `register`
983                                  LEFT JOIN `contact` ON `register`.`uid` = `contact`.`uid`
984                                  LEFT JOIN `user` ON `register`.`uid` = `user`.`uid`;");
985
986
987         /* get users */
988
989         $total = q("SELECT count(*) as total FROM `user` where 1");
990         if(count($total)) {
991                 $a->set_pager_total($total[0]['total']);
992                 $a->set_pager_itemspage(100);
993         }
994
995
996         $users = q("SELECT `user` . * , `contact`.`name` , `contact`.`url` , `contact`.`micro`, `lastitem`.`lastitem_date`, `user`.`account_expired`
997                                 FROM
998                                         (SELECT MAX(`item`.`changed`) as `lastitem_date`, `item`.`uid`
999                                         FROM `item`
1000                                         WHERE `item`.`type` = 'wall'
1001                                         GROUP BY `item`.`uid`) AS `lastitem`
1002                                                  RIGHT OUTER JOIN `user` ON `user`.`uid` = `lastitem`.`uid`,
1003                                            `contact`
1004                                 WHERE
1005                                            `user`.`uid` = `contact`.`uid`
1006                                                 AND `user`.`verified` =1
1007                                         AND `contact`.`self` =1
1008                                 ORDER BY `contact`.`name` LIMIT %d, %d
1009                                 ",
1010                                 intval($a->pager['start']),
1011                                 intval($a->pager['itemspage'])
1012                                 );
1013
1014         $adminlist = explode(",", str_replace(" ", "", $a->config['admin_email']));
1015         $_setup_users = function ($e) use ($adminlist){
1016                 $accounts = Array(
1017                         t('Normal Account'),
1018                         t('Soapbox Account'),
1019                         t('Community/Celebrity Account'),
1020                                                 t('Automatic Friend Account')
1021                 );
1022                 $e['page-flags'] = $accounts[$e['page-flags']];
1023                 $e['register_date'] = relative_date($e['register_date']);
1024                 $e['login_date'] = relative_date($e['login_date']);
1025                 $e['lastitem_date'] = relative_date($e['lastitem_date']);
1026                 //$e['is_admin'] = ($e['email'] === $a->config['admin_email']);
1027                 $e['is_admin'] = in_array($e['email'], $adminlist);
1028                 $e['is_deletable'] = (intval($e['uid']) != local_user());
1029                 $e['deleted'] = ($e['account_removed']?relative_date($e['account_expires_on']):False);
1030                 return $e;
1031         };
1032         $users = array_map($_setup_users, $users);
1033
1034
1035         // Get rid of dashes in key names, Smarty3 can't handle them
1036         // and extracting deleted users
1037
1038         $tmp_users = Array();
1039         $deleted = Array();
1040
1041         while(count($users)) {
1042                 $new_user = Array();
1043                 foreach( array_pop($users) as $k => $v) {
1044                         $k = str_replace('-','_',$k);
1045                         $new_user[$k] = $v;
1046                 }
1047                 if($new_user['deleted']) {
1048                         array_push($deleted, $new_user);
1049                 }
1050                 else {
1051                         array_push($tmp_users, $new_user);
1052                 }
1053         }
1054         //Reversing the two array, and moving $tmp_users to $users
1055         array_reverse($deleted);
1056         while(count($tmp_users)) {
1057                 array_push($users, array_pop($tmp_users));
1058         }
1059
1060         $t = get_markup_template("admin_users.tpl");
1061         $o = replace_macros($t, array(
1062                 // strings //
1063                 '$title' => t('Administration'),
1064                 '$page' => t('Users'),
1065                 '$submit' => t('Add User'),
1066                 '$select_all' => t('select all'),
1067                 '$h_pending' => t('User registrations waiting for confirm'),
1068                 '$h_deleted' => t('User waiting for permanent deletion'),
1069                 '$th_pending' => array( t('Request date'), t('Name'), t('Email') ),
1070                 '$no_pending' =>  t('No registrations.'),
1071                 '$approve' => t('Approve'),
1072                 '$deny' => t('Deny'),
1073                 '$delete' => t('Delete'),
1074                 '$block' => t('Block'),
1075                 '$unblock' => t('Unblock'),
1076                 '$siteadmin' => t('Site admin'),
1077                 '$accountexpired' => t('Account expired'),
1078
1079                 '$h_users' => t('Users'),
1080                 '$h_newuser' => t('New User'),
1081                 '$th_deleted' => array( t('Name'), t('Email'), t('Register date'), t('Last login'), t('Last item'), t('Deleted since') ),
1082                 '$th_users' => array( t('Name'), t('Email'), t('Register date'), t('Last login'), t('Last item'),  t('Account') ),
1083
1084                 '$confirm_delete_multi' => t('Selected users will be deleted!\n\nEverything these users had posted on this site will be permanently deleted!\n\nAre you sure?'),
1085                 '$confirm_delete' => t('The user {0} will be deleted!\n\nEverything this user has posted on this site will be permanently deleted!\n\nAre you sure?'),
1086
1087                 '$form_security_token' => get_form_security_token("admin_users"),
1088
1089                 // values //
1090                 '$baseurl' => $a->get_baseurl(true),
1091
1092                 '$pending' => $pending,
1093                 'deleted' => $deleted,
1094                 '$users' => $users,
1095                 '$newusername'  => array('new_user_name', t("Name"), '', t("Name of the new user.")),
1096                 '$newusernickname'  => array('new_user_nickname', t("Nickname"), '', t("Nickname of the new user.")),
1097                 '$newuseremail'  => array('new_user_email', t("Email"), '', t("Email address of the new user."), '', '', 'email'),
1098         ));
1099         $o .= paginate($a);
1100         return $o;
1101 }
1102
1103
1104 /**
1105  * Plugins admin page
1106  *
1107  * @param App $a
1108  * @return string
1109  */
1110 function admin_page_plugins(&$a){
1111
1112         /**
1113          * Single plugin
1114          */
1115         if ($a->argc == 3){
1116                 $plugin = $a->argv[2];
1117                 if (!is_file("addon/$plugin/$plugin.php")){
1118                         notice( t("Item not found.") );
1119                         return '';
1120                 }
1121
1122                 if (x($_GET,"a") && $_GET['a']=="t"){
1123                         check_form_security_token_redirectOnErr('/admin/plugins', 'admin_themes', 't');
1124
1125                         // Toggle plugin status
1126                         $idx = array_search($plugin, $a->plugins);
1127                         if ($idx !== false){
1128                                 unset($a->plugins[$idx]);
1129                                 uninstall_plugin($plugin);
1130                                 info( sprintf( t("Plugin %s disabled."), $plugin ) );
1131                         } else {
1132                                 $a->plugins[] = $plugin;
1133                                 install_plugin($plugin);
1134                                 info( sprintf( t("Plugin %s enabled."), $plugin ) );
1135                         }
1136                         set_config("system","addon", implode(", ",$a->plugins));
1137                         goaway($a->get_baseurl(true) . '/admin/plugins' );
1138                         return ''; // NOTREACHED
1139                 }
1140                 // display plugin details
1141                 require_once('library/markdown.php');
1142
1143                 if (in_array($plugin, $a->plugins)){
1144                         $status="on"; $action= t("Disable");
1145                 } else {
1146                         $status="off"; $action= t("Enable");
1147                 }
1148
1149                 $readme=Null;
1150                 if (is_file("addon/$plugin/README.md")){
1151                         $readme = file_get_contents("addon/$plugin/README.md");
1152                         $readme = Markdown($readme);
1153                 } else if (is_file("addon/$plugin/README")){
1154                         $readme = "<pre>". file_get_contents("addon/$plugin/README") ."</pre>";
1155                 }
1156
1157                 $admin_form="";
1158                 if (is_array($a->plugins_admin) && in_array($plugin, $a->plugins_admin)){
1159                         @require_once("addon/$plugin/$plugin.php");
1160                         $func = $plugin.'_plugin_admin';
1161                         $func($a, $admin_form);
1162                 }
1163
1164                 $t = get_markup_template("admin_plugins_details.tpl");
1165
1166                 return replace_macros($t, array(
1167                         '$title' => t('Administration'),
1168                         '$page' => t('Plugins'),
1169                         '$toggle' => t('Toggle'),
1170                         '$settings' => t('Settings'),
1171                         '$baseurl' => $a->get_baseurl(true),
1172
1173                         '$plugin' => $plugin,
1174                         '$status' => $status,
1175                         '$action' => $action,
1176                         '$info' => get_plugin_info($plugin),
1177                         '$str_author' => t('Author: '),
1178                         '$str_maintainer' => t('Maintainer: '),
1179
1180                         '$admin_form' => $admin_form,
1181                         '$function' => 'plugins',
1182                         '$screenshot' => '',
1183                         '$readme' => $readme,
1184
1185                         '$form_security_token' => get_form_security_token("admin_themes"),
1186                 ));
1187         }
1188
1189
1190
1191         /**
1192          * List plugins
1193          */
1194
1195         $plugins = array();
1196         $files = glob("addon/*/"); /* */
1197         if($files) {
1198                 foreach($files as $file) {
1199                         if (is_dir($file)){
1200                                 list($tmp, $id)=array_map("trim", explode("/",$file));
1201                                 $info = get_plugin_info($id);
1202                                 $show_plugin = true;
1203
1204                                 // If the addon is unsupported, then only show it, when it is enabled
1205                                 if ((strtolower($info["status"]) == "unsupported") AND !in_array($id,  $a->plugins))
1206                                         $show_plugin = false;
1207
1208                                 // Override the above szenario, when the admin really wants to see outdated stuff
1209                                 if (get_config("system", "show_unsupported_addons"))
1210                                         $show_plugin = true;
1211
1212                                 if ($show_plugin)
1213                                         $plugins[] = array($id, (in_array($id,  $a->plugins)?"on":"off") , $info);
1214                         }
1215                 }
1216         }
1217
1218         $t = get_markup_template("admin_plugins.tpl");
1219         return replace_macros($t, array(
1220                 '$title' => t('Administration'),
1221                 '$page' => t('Plugins'),
1222                 '$submit' => t('Save Settings'),
1223                 '$baseurl' => $a->get_baseurl(true),
1224                 '$function' => 'plugins',
1225                 '$plugins' => $plugins,
1226                 '$form_security_token' => get_form_security_token("admin_themes"),
1227         ));
1228 }
1229
1230 /**
1231  * @param array $themes
1232  * @param string $th
1233  * @param int $result
1234  */
1235 function toggle_theme(&$themes,$th,&$result) {
1236         for($x = 0; $x < count($themes); $x ++) {
1237                 if($themes[$x]['name'] === $th) {
1238                         if($themes[$x]['allowed']) {
1239                                 $themes[$x]['allowed'] = 0;
1240                                 $result = 0;
1241                         }
1242                         else {
1243                                 $themes[$x]['allowed'] = 1;
1244                                 $result = 1;
1245                         }
1246                 }
1247         }
1248 }
1249
1250 /**
1251  * @param array $themes
1252  * @param string $th
1253  * @return int
1254  */
1255 function theme_status($themes,$th) {
1256         for($x = 0; $x < count($themes); $x ++) {
1257                 if($themes[$x]['name'] === $th) {
1258                         if($themes[$x]['allowed']) {
1259                                 return 1;
1260                         }
1261                         else {
1262                                 return 0;
1263                         }
1264                 }
1265         }
1266         return 0;
1267 }
1268
1269
1270 /**
1271  * @param array $themes
1272  * @return string
1273  */
1274 function rebuild_theme_table($themes) {
1275         $o = '';
1276         if(count($themes)) {
1277                 foreach($themes as $th) {
1278                         if($th['allowed']) {
1279                                 if(strlen($o))
1280                                         $o .= ',';
1281                                 $o .= $th['name'];
1282                         }
1283                 }
1284         }
1285         return $o;
1286 }
1287
1288
1289 /**
1290  * Themes admin page
1291  *
1292  * @param App $a
1293  * @return string
1294  */
1295 function admin_page_themes(&$a){
1296
1297         $allowed_themes_str = get_config('system','allowed_themes');
1298         $allowed_themes_raw = explode(',',$allowed_themes_str);
1299         $allowed_themes = array();
1300         if(count($allowed_themes_raw))
1301                 foreach($allowed_themes_raw as $x)
1302                         if(strlen(trim($x)))
1303                                 $allowed_themes[] = trim($x);
1304
1305         $themes = array();
1306         $files = glob('view/theme/*'); /* */
1307         if($files) {
1308                 foreach($files as $file) {
1309                         $f = basename($file);
1310                         $is_experimental = intval(file_exists($file . '/experimental'));
1311                         $is_supported = 1-(intval(file_exists($file . '/unsupported')));
1312                         $is_allowed = intval(in_array($f,$allowed_themes));
1313
1314                         if ($is_allowed OR $is_supported OR get_config("system", "show_unsupported_themes"))
1315                                 $themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed);
1316                 }
1317         }
1318
1319         if(! count($themes)) {
1320                 notice( t('No themes found.'));
1321                 return '';
1322         }
1323
1324         /**
1325          * Single theme
1326          */
1327
1328         if ($a->argc == 3){
1329                 $theme = $a->argv[2];
1330                 if(! is_dir("view/theme/$theme")){
1331                         notice( t("Item not found.") );
1332                         return '';
1333                 }
1334
1335                 if (x($_GET,"a") && $_GET['a']=="t"){
1336                         check_form_security_token_redirectOnErr('/admin/themes', 'admin_themes', 't');
1337
1338                         // Toggle theme status
1339
1340                         toggle_theme($themes,$theme,$result);
1341                         $s = rebuild_theme_table($themes);
1342                         if($result) {
1343                                 install_theme($theme);
1344                                 info( sprintf('Theme %s enabled.',$theme));
1345                         }
1346                         else {
1347                                 uninstall_theme($theme);
1348                                 info( sprintf('Theme %s disabled.',$theme));
1349                         }
1350
1351                         set_config('system','allowed_themes',$s);
1352                         goaway($a->get_baseurl(true) . '/admin/themes' );
1353                         return ''; // NOTREACHED
1354                 }
1355
1356                 // display theme details
1357                 require_once('library/markdown.php');
1358
1359                 if (theme_status($themes,$theme)) {
1360                         $status="on"; $action= t("Disable");
1361                 } else {
1362                         $status="off"; $action= t("Enable");
1363                 }
1364
1365                 $readme=Null;
1366                 if (is_file("view/theme/$theme/README.md")){
1367                         $readme = file_get_contents("view/theme/$theme/README.md");
1368                         $readme = Markdown($readme);
1369                 } else if (is_file("view/theme/$theme/README")){
1370                         $readme = "<pre>". file_get_contents("view/theme/$theme/README") ."</pre>";
1371                 }
1372
1373                 $admin_form="";
1374                 if (is_file("view/theme/$theme/config.php")){
1375                         require_once("view/theme/$theme/config.php");
1376                         if(function_exists("theme_admin")){
1377                                 $admin_form = theme_admin($a);
1378                         }
1379
1380                 }
1381
1382                 $screenshot = array( get_theme_screenshot($theme), t('Screenshot'));
1383                 if(! stristr($screenshot[0],$theme))
1384                         $screenshot = null;
1385
1386                 $t = get_markup_template("admin_plugins_details.tpl");
1387                 return replace_macros($t, array(
1388                         '$title' => t('Administration'),
1389                         '$page' => t('Themes'),
1390                         '$toggle' => t('Toggle'),
1391                         '$settings' => t('Settings'),
1392                         '$baseurl' => $a->get_baseurl(true),
1393
1394                         '$plugin' => $theme,
1395                         '$status' => $status,
1396                         '$action' => $action,
1397                         '$info' => get_theme_info($theme),
1398                         '$function' => 'themes',
1399                         '$admin_form' => $admin_form,
1400                         '$str_author' => t('Author: '),
1401                         '$str_maintainer' => t('Maintainer: '),
1402                         '$screenshot' => $screenshot,
1403                         '$readme' => $readme,
1404
1405                         '$form_security_token' => get_form_security_token("admin_themes"),
1406                 ));
1407         }
1408
1409         /**
1410          * List themes
1411          */
1412
1413         $xthemes = array();
1414         if($themes) {
1415                 foreach($themes as $th) {
1416                         $xthemes[] = array($th['name'],(($th['allowed']) ? "on" : "off"), get_theme_info($th['name']));
1417                 }
1418         }
1419
1420         $t = get_markup_template("admin_plugins.tpl");
1421         return replace_macros($t, array(
1422                 '$title' => t('Administration'),
1423                 '$page' => t('Themes'),
1424                 '$submit' => t('Save Settings'),
1425                 '$baseurl' => $a->get_baseurl(true),
1426                 '$function' => 'themes',
1427                 '$plugins' => $xthemes,
1428                 '$experimental' => t('[Experimental]'),
1429                 '$unsupported' => t('[Unsupported]'),
1430                 '$form_security_token' => get_form_security_token("admin_themes"),
1431         ));
1432 }
1433
1434
1435 /**
1436  * Logs admin page
1437  *
1438  * @param App $a
1439  */
1440
1441 function admin_page_logs_post(&$a) {
1442         if (x($_POST,"page_logs")) {
1443                 check_form_security_token_redirectOnErr('/admin/logs', 'admin_logs');
1444
1445                 $logfile                =       ((x($_POST,'logfile'))          ? notags(trim($_POST['logfile']))       : '');
1446                 $debugging              =       ((x($_POST,'debugging'))        ? true                                                          : false);
1447                 $loglevel               =       ((x($_POST,'loglevel'))         ? intval(trim($_POST['loglevel']))      : 0);
1448
1449                 set_config('system','logfile', $logfile);
1450                 set_config('system','debugging',  $debugging);
1451                 set_config('system','loglevel', $loglevel);
1452
1453
1454         }
1455
1456         info( t("Log settings updated.") );
1457         goaway($a->get_baseurl(true) . '/admin/logs' );
1458         return; // NOTREACHED
1459 }
1460
1461 /**
1462  * @param App $a
1463  * @return string
1464  */
1465 function admin_page_logs(&$a){
1466
1467         $log_choices = Array(
1468                 LOGGER_NORMAL => 'Normal',
1469                 LOGGER_TRACE => 'Trace',
1470                 LOGGER_DEBUG => 'Debug',
1471                 LOGGER_DATA => 'Data',
1472                 LOGGER_ALL => 'All'
1473         );
1474
1475         $t = get_markup_template("admin_logs.tpl");
1476
1477         $f = get_config('system','logfile');
1478
1479         $data = '';
1480
1481         if(!file_exists($f)) {
1482                 $data = t("Error trying to open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f exist and is
1483 readable.");
1484         }
1485         else {
1486                 $fp = fopen($f, 'r');
1487                 if(!$fp) {
1488                         $data = t("Couldn't open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f is readable.");
1489                 }
1490                 else {
1491                         $fstat = fstat($fp);
1492                         $size = $fstat['size'];
1493                         if($size != 0)
1494                         {
1495                                 if($size > 5000000 || $size < 0)
1496                                         $size = 5000000;
1497                                 $seek = fseek($fp,0-$size,SEEK_END);
1498                                 if($seek === 0) {
1499                                         $data = escape_tags(fread($fp,$size));
1500                                         while(! feof($fp))
1501                                                 $data .= escape_tags(fread($fp,4096));
1502                                 }
1503                         }
1504                         fclose($fp);
1505                 }
1506         }
1507
1508         return replace_macros($t, array(
1509                 '$title' => t('Administration'),
1510                 '$page' => t('Logs'),
1511                 '$submit' => t('Save Settings'),
1512                 '$clear' => t('Clear'),
1513                 '$data' => $data,
1514                 '$baseurl' => $a->get_baseurl(true),
1515                 '$logname' =>  get_config('system','logfile'),
1516
1517                                                                         // name, label, value, help string, extra data...
1518                 '$debugging'            => array('debugging', t("Enable Debugging"),get_config('system','debugging'), ""),
1519                 '$logfile'                      => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your Friendica top-level directory.")),
1520                 '$loglevel'             => array('loglevel', t("Log level"), get_config('system','loglevel'), "", $log_choices),
1521
1522                 '$form_security_token' => get_form_security_token("admin_logs"),
1523         ));
1524 }
1525
1526 /**
1527  * @param App $a
1528  */
1529 function admin_page_remoteupdate_post(&$a) {
1530         // this function should be called via ajax post
1531         if(!is_site_admin()) {
1532                 return;
1533         }
1534
1535
1536         if (x($_POST,'remotefile') && $_POST['remotefile']!=""){
1537                 $remotefile = $_POST['remotefile'];
1538                 $ftpdata = (x($_POST['ftphost'])?$_POST:false);
1539                 doUpdate($remotefile, $ftpdata);
1540         } else {
1541                 echo "No remote file to download. Abort!";
1542         }
1543
1544         killme();
1545 }
1546
1547 /**
1548  * @param App $a
1549  * @return string
1550  */
1551 function admin_page_remoteupdate(&$a) {
1552         if(!is_site_admin()) {
1553                 return login(false);
1554         }
1555
1556         $canwrite = canWeWrite();
1557         $canftp = function_exists('ftp_connect');
1558
1559         $needupdate = true;
1560         $u = checkUpdate();
1561         if (!is_array($u)){
1562                 $needupdate = false;
1563                 $u = array('','','');
1564         }
1565
1566         $tpl = get_markup_template("admin_remoteupdate.tpl");
1567         return replace_macros($tpl, array(
1568                 '$baseurl' => $a->get_baseurl(true),
1569                 '$submit' => t("Update now"),
1570                 '$close' => t("Close"),
1571                 '$localversion' => FRIENDICA_VERSION,
1572                 '$remoteversion' => $u[1],
1573                 '$needupdate' => $needupdate,
1574                 '$canwrite' => $canwrite,
1575                 '$canftp'       => $canftp,
1576                 '$ftphost'      => array('ftphost', t("FTP Host"), '',''),
1577                 '$ftppath'      => array('ftppath', t("FTP Path"), '/',''),
1578                 '$ftpuser'      => array('ftpuser', t("FTP User"), '',''),
1579                 '$ftppwd'       => array('ftppwd', t("FTP Password"), '',''),
1580                 '$remotefile'=>array('remotefile','', $u['2'],''),
1581         ));
1582
1583 }