]> git.mxchange.org Git - friendica.git/blob - mod/admin.php
add 'reload active plugins' button in admin/plugins
[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         $nodeinfo               =       ((x($_POST,'nodeinfo'))                 ? intval(trim($_POST['nodeinfo']))              : false);
394         $dfrn_only              =       ((x($_POST,'dfrn_only'))                ? True                                          : False);
395         $ostatus_disabled       =       !((x($_POST,'ostatus_disabled'))        ? True                                          : False);
396         $ostatus_poll_interval  =       ((x($_POST,'ostatus_poll_interval'))    ? intval(trim($_POST['ostatus_poll_interval'])) :  0);
397         $diaspora_enabled       =       ((x($_POST,'diaspora_enabled'))         ? True                                          : False);
398         $ssl_policy             =       ((x($_POST,'ssl_policy'))               ? intval($_POST['ssl_policy'])                  : 0);
399         $force_ssl              =       ((x($_POST,'force_ssl'))                ? True                                          : False);
400         $old_share              =       ((x($_POST,'old_share'))                ? True                                          : False);
401         $hide_help              =       ((x($_POST,'hide_help'))                ? True                                          : False);
402         $suppress_language      =       ((x($_POST,'suppress_language'))        ? True                                          : False);
403         $suppress_tags          =       ((x($_POST,'suppress_tags'))            ? True                                          : False);
404         $use_fulltext_engine    =       ((x($_POST,'use_fulltext_engine'))      ? True                                          : False);
405         $itemcache              =       ((x($_POST,'itemcache'))                ? notags(trim($_POST['itemcache']))             : '');
406         $itemcache_duration     =       ((x($_POST,'itemcache_duration'))       ? intval($_POST['itemcache_duration'])          : 0);
407         $max_comments           =       ((x($_POST,'max_comments'))             ? intval($_POST['max_comments'])                : 0);
408         $lockpath               =       ((x($_POST,'lockpath'))                 ? notags(trim($_POST['lockpath']))              : '');
409         $temppath               =       ((x($_POST,'temppath'))                 ? notags(trim($_POST['temppath']))              : '');
410         $basepath               =       ((x($_POST,'basepath'))                 ? notags(trim($_POST['basepath']))              : '');
411         $singleuser             =       ((x($_POST,'singleuser'))               ? notags(trim($_POST['singleuser']))            : '');
412         $proxy_disabled         =       ((x($_POST,'proxy_disabled'))           ? True                                          : False);
413         $old_pager              =       ((x($_POST,'old_pager'))                ? True                                          : False);
414         $only_tag_search        =       ((x($_POST,'only_tag_search'))          ? True                                          : False);
415         $rino                   =       ((x($_POST,'rino'))                             ? intval($_POST['rino'])                                : 0);
416
417
418         if($ssl_policy != intval(get_config('system','ssl_policy'))) {
419                 if($ssl_policy == SSL_POLICY_FULL) {
420                         q("update `contact` set
421                                 `url`     = replace(`url`    , 'http:' , 'https:'),
422                                 `photo`   = replace(`photo`  , 'http:' , 'https:'),
423                                 `thumb`   = replace(`thumb`  , 'http:' , 'https:'),
424                                 `micro`   = replace(`micro`  , 'http:' , 'https:'),
425                                 `request` = replace(`request`, 'http:' , 'https:'),
426                                 `notify`  = replace(`notify` , 'http:' , 'https:'),
427                                 `poll`    = replace(`poll`   , 'http:' , 'https:'),
428                                 `confirm` = replace(`confirm`, 'http:' , 'https:'),
429                                 `poco`    = replace(`poco`   , 'http:' , 'https:')
430                                 where `self` = 1"
431                         );
432                         q("update `profile` set
433                                 `photo`   = replace(`photo`  , 'http:' , 'https:'),
434                                 `thumb`   = replace(`thumb`  , 'http:' , 'https:')
435                                 where 1 "
436                         );
437                 }
438                 elseif($ssl_policy == SSL_POLICY_SELFSIGN) {
439                         q("update `contact` set
440                                 `url`     = replace(`url`    , 'https:' , 'http:'),
441                                 `photo`   = replace(`photo`  , 'https:' , 'http:'),
442                                 `thumb`   = replace(`thumb`  , 'https:' , 'http:'),
443                                 `micro`   = replace(`micro`  , 'https:' , 'http:'),
444                                 `request` = replace(`request`, 'https:' , 'http:'),
445                                 `notify`  = replace(`notify` , 'https:' , 'http:'),
446                                 `poll`    = replace(`poll`   , 'https:' , 'http:'),
447                                 `confirm` = replace(`confirm`, 'https:' , 'http:'),
448                                 `poco`    = replace(`poco`   , 'https:' , 'http:')
449                                 where `self` = 1"
450                         );
451                         q("update `profile` set
452                                 `photo`   = replace(`photo`  , 'https:' , 'http:'),
453                                 `thumb`   = replace(`thumb`  , 'https:' , 'http:')
454                                 where 1 "
455                         );
456                 }
457         }
458         set_config('system','ssl_policy',$ssl_policy);
459         set_config('system','delivery_interval',$delivery_interval);
460         set_config('system','poll_interval',$poll_interval);
461         set_config('system','maxloadavg',$maxloadavg);
462         set_config('system','maxloadavg_frontend',$maxloadavg_frontend);
463         set_config('system','poco_completion',$poco_completion);
464         set_config('system','poco_discovery',$poco_discovery);
465         set_config('system','poco_discovery_since',$poco_discovery_since);
466         set_config('system','poco_local_search',$poco_local_search);
467         set_config('system','nodeinfo',$nodeinfo);
468         set_config('config','sitename',$sitename);
469         set_config('config','hostname',$hostname);
470         set_config('config','sender_email', $sender_email);
471         set_config('system','suppress_language',$suppress_language);
472         set_config('system','suppress_tags',$suppress_tags);
473         set_config('system','shortcut_icon',$shortcut_icon);
474         set_config('system','touch_icon',$touch_icon);
475
476         if ($banner==""){
477                 // don't know why, but del_config doesn't work...
478                 q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
479                         dbesc("system"),
480                         dbesc("banner")
481                 );
482         } else {
483                 set_config('system','banner', $banner);
484         }
485         if ($info=="") {
486                 del_config('config','info');
487         } else {
488                 set_config('config','info',$info);
489         }
490         set_config('system','language', $language);
491         set_config('system','theme', $theme);
492         if ( $theme_mobile === '---' ) {
493                 del_config('system','mobile-theme');
494         } else {
495                 set_config('system','mobile-theme', $theme_mobile);
496                 }
497                 if ( $singleuser === '---' ) {
498                         del_config('system','singleuser');
499                 } else {
500                         set_config('system','singleuser', $singleuser);
501                 }
502         set_config('system','maximagesize', $maximagesize);
503         set_config('system','max_image_length', $maximagelength);
504         set_config('system','jpeg_quality', $jpegimagequality);
505
506         set_config('config','register_policy', $register_policy);
507         set_config('system','max_daily_registrations', $daily_registrations);
508         set_config('system','account_abandon_days', $abandon_days);
509         set_config('config','register_text', $register_text);
510         set_config('system','allowed_sites', $allowed_sites);
511         set_config('system','allowed_email', $allowed_email);
512         set_config('system','block_public', $block_public);
513         set_config('system','publish_all', $force_publish);
514         if ($global_directory==""){
515                 // don't know why, but del_config doesn't work...
516                 q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
517                         dbesc("system"),
518                         dbesc("directory_submit_url")
519                 );
520         } else {
521                 set_config('system','directory_submit_url', $global_directory);
522         }
523         set_config('system','thread_allow', $thread_allow);
524         set_config('system','newuser_private', $newuser_private);
525         set_config('system','enotify_no_content', $enotify_no_content);
526         set_config('system','disable_embedded', $disable_embedded);
527         set_config('system','allow_users_remote_self', $allow_users_remote_self);
528
529         set_config('system','block_extended_register', $no_multi_reg);
530         set_config('system','no_openid', $no_openid);
531         set_config('system','no_regfullname', $no_regfullname);
532         set_config('system','community_page_style', $community_page_style);
533         set_config('system','max_author_posts_community_page', $max_author_posts_community_page);
534         set_config('system','no_utf', $no_utf);
535         set_config('system','verifyssl', $verifyssl);
536         set_config('system','proxyuser', $proxyuser);
537         set_config('system','proxy', $proxy);
538         set_config('system','curl_timeout', $timeout);
539         set_config('system','dfrn_only', $dfrn_only);
540         set_config('system','ostatus_disabled', $ostatus_disabled);
541         set_config('system','ostatus_poll_interval', $ostatus_poll_interval);
542         set_config('system','diaspora_enabled', $diaspora_enabled);
543         set_config('config','private_addons', $private_addons);
544
545         set_config('system','force_ssl', $force_ssl);
546         set_config('system','old_share', $old_share);
547         set_config('system','hide_help', $hide_help);
548         set_config('system','use_fulltext_engine', $use_fulltext_engine);
549         set_config('system','itemcache', $itemcache);
550         set_config('system','itemcache_duration', $itemcache_duration);
551         set_config('system','max_comments', $max_comments);
552         set_config('system','lockpath', $lockpath);
553         set_config('system','temppath', $temppath);
554         set_config('system','basepath', $basepath);
555         set_config('system','proxy_disabled', $proxy_disabled);
556         set_config('system','old_pager', $old_pager);
557         set_config('system','only_tag_search', $only_tag_search);
558
559         set_config('system','rino_encrypt', $rino);
560
561
562         info( t('Site settings updated.') . EOL);
563         goaway($a->get_baseurl(true) . '/admin/site' );
564         return; // NOTREACHED
565
566 }
567
568 /**
569  * @param  App $a
570  * @return string
571  */
572 function admin_page_site(&$a) {
573
574         /* Installed langs */
575         $lang_choices = array();
576         $langs = glob('view/*/strings.php');
577
578         if(is_array($langs) && count($langs)) {
579                 if(! in_array('view/en/strings.php',$langs))
580                         $langs[] = 'view/en/';
581                 asort($langs);
582                 foreach($langs as $l) {
583                         $t = explode("/",$l);
584                         $lang_choices[$t[1]] = $t[1];
585                 }
586         }
587
588         /* Installed themes */
589         $theme_choices = array();
590         $theme_choices_mobile = array();
591         $theme_choices_mobile["---"] = t("No special theme for mobile devices");
592         $files = glob('view/theme/*');
593         if($files) {
594                 foreach($files as $file) {
595                         $f = basename($file);
596                         $theme_name = ((file_exists($file . '/experimental')) ?  sprintf("%s - \x28Experimental\x29", $f) : $f);
597                         if (file_exists($file . '/mobile')) {
598                                 $theme_choices_mobile[$f] = $theme_name;
599                         }
600                 else {
601                                 $theme_choices[$f] = $theme_name;
602                         }
603                 }
604                 }
605
606                 /* Community page style */
607                 $community_page_style_choices = array(
608                         CP_NO_COMMUNITY_PAGE => t("No community page"),
609                         CP_USERS_ON_SERVER => t("Public postings from users of this site"),
610                         CP_GLOBAL_COMMUNITY => t("Global community page")
611                         );
612
613                 /* OStatus conversation poll choices */
614                 $ostatus_poll_choices = array(
615                         "-2" => t("Never"),
616                         "-1" => t("At post arrival"),
617                         "0" => t("Frequently"),
618                         "60" => t("Hourly"),
619                         "720" => t("Twice daily"),
620                         "1440" => t("Daily")
621                         );
622
623                 $poco_discovery_choices = array(
624                         "0" => t("Disabled"),
625                         "1" => t("Users"),
626                         "2" => t("Users, Global Contacts"),
627                         "3" => t("Users, Global Contacts/fallback"),
628                         );
629
630                 $poco_discovery_since_choices = array(
631                         "30" => t("One month"),
632                         "91" => t("Three months"),
633                         "182" => t("Half a year"),
634                         "365" => t("One year"),
635                         );
636
637                 /* get user names to make the install a personal install of X */
638                 $user_names = array();
639                 $user_names['---'] = t('Multi user instance');
640                 $users = q("SELECT username, nickname FROM `user`");
641                 foreach ($users as $user) {
642                         $user_names[$user['nickname']] = $user['username'];
643                 }
644
645         /* Banner */
646         $banner = get_config('system','banner');
647         if($banner == false)
648                 $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>';
649         $banner = htmlspecialchars($banner);
650         $info = get_config('config','info');
651         $info = htmlspecialchars($info);
652
653         // Automatically create temporary paths
654         get_temppath();
655         get_lockpath();
656         get_itemcachepath();
657
658         //echo "<pre>"; var_dump($lang_choices); die("</pre>");
659
660         /* Register policy */
661         $register_choices = Array(
662                 REGISTER_CLOSED => t("Closed"),
663                 REGISTER_APPROVE => t("Requires approval"),
664                 REGISTER_OPEN => t("Open")
665         );
666
667         $ssl_choices = array(
668                 SSL_POLICY_NONE => t("No SSL policy, links will track page SSL state"),
669                 SSL_POLICY_FULL => t("Force all links to use SSL"),
670                 SSL_POLICY_SELFSIGN => t("Self-signed certificate, use SSL for local links only (discouraged)")
671         );
672
673         if ($a->config['hostname'] == "")
674                 $a->config['hostname'] = $a->get_hostname();
675
676         $t = get_markup_template("admin_site.tpl");
677         return replace_macros($t, array(
678                 '$title' => t('Administration'),
679                 '$page' => t('Site'),
680                 '$submit' => t('Save Settings'),
681                 '$registration' => t('Registration'),
682                 '$upload' => t('File upload'),
683                 '$corporate' => t('Policies'),
684                 '$advanced' => t('Advanced'),
685                 '$portable_contacts' => t('Auto Discovered Contact Directory'),
686                 '$performance' => t('Performance'),
687                 '$relocate'=> t('Relocate - WARNING: advanced function. Could make this server unreachable.'),
688                 '$baseurl' => $a->get_baseurl(true),
689                 // name, label, value, help string, extra data...
690                 '$sitename'             => array('sitename', t("Site name"), $a->config['sitename'],'UTF-8'),
691                 '$hostname'             => array('hostname', t("Host name"), $a->config['hostname'], ""),
692                 '$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"),
693                 '$banner'               => array('banner', t("Banner/Logo"), $banner, ""),
694                 '$shortcut_icon'        => array('shortcut_icon', t("Shortcut icon"), get_config('system','shortcut_icon'),  "Link to an icon that will be used for browsers."),
695                 '$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."),
696                 '$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.')),
697                 '$language'             => array('language', t("System language"), get_config('system','language'), "", $lang_choices),
698                 '$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),
699                 '$theme_mobile'         => array('theme_mobile', t("Mobile system theme"), get_config('system','mobile-theme'), t("Theme for mobile devices"), $theme_choices_mobile),
700                 '$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),
701                 '$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.")),
702                 '$old_share'            => array('old_share', t("Old style 'Share'"), get_config('system','old_share'), t("Deactivates the bbcode element 'share' for repeating items.")),
703                 '$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.")),
704                 '$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),
705                 '$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.")),
706                 '$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.")),
707                 '$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.")),
708
709                 '$register_policy'      => array('register_policy', t("Register policy"), $a->config['register_policy'], "", $register_choices),
710                 '$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.")),
711                 '$register_text'        => array('register_text', t("Register text"), $a->config['register_text'], t("Will be displayed prominently on the registration page.")),
712                 '$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.')),
713                 '$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")),
714                 '$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")),
715                 '$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.")),
716                 '$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.")),
717                 '$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.")),
718                 '$thread_allow'         => array('thread_allow', t("Allow threaded items"), get_config('system','thread_allow'), t("Allow infinite level threading for items on this site.")),
719                 '$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.")),
720                 '$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.")),
721                 '$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.")),
722                 '$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.")),
723                 '$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.')),
724                 '$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.")),
725                 '$no_openid'            => array('no_openid', t("OpenID support"), !get_config('system','no_openid'), t("OpenID support for registration and logins.")),
726                 '$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")),
727                 '$no_utf'               => array('no_utf', t("UTF-8 Regular expressions"), !get_config('system','no_utf'), t("Use PHP UTF8 regular expressions")),
728                 '$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),
729                 '$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')")),
730                 '$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.")),
731                 '$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),
732                 '$diaspora_enabled'     => array('diaspora_enabled', t("Enable Diaspora support"), get_config('system','diaspora_enabled'), t("Provide built-in Diaspora network compatibility.")),
733                 '$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.")),
734                 '$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.")),
735                 '$proxyuser'            => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
736                 '$proxy'                => array('proxy', t("Proxy URL"), get_config('system','proxy'), ""),
737                 '$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).")),
738                 '$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.")),
739                 '$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.")),
740                 '$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.")),
741                 '$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.")),
742
743                 '$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.")),
744                 '$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),
745                 '$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),
746                 '$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.")),
747
748                 '$nodeinfo'             => array('nodeinfo', t("Publish server information"), get_config('system','nodeinfo'), t("If enabled, general server and usage data will be published. The data contains the name and version of the server, number of users with public profiles, number of posts and the activated protocols and connectors. See <a href='http://the-federation.info/'>the-federation.info</a> for details.")),
749
750                 '$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.")),
751                 '$suppress_language'    => array('suppress_language', t("Suppress Language"), get_config('system','suppress_language'), t("Suppress language information in meta information about a posting.")),
752                 '$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.")),
753                 '$itemcache'            => array('itemcache', t("Path to item cache"), get_config('system','itemcache'), "The item caches buffers generated bbcode and external images."),
754                 '$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.")),
755                 '$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.")),
756                 '$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."),
757                 '$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."),
758                 '$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."),
759                 '$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.")),
760                 '$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.")),
761                 '$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.")),
762
763                 '$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."),
764
765                 '$rino'                 => array('rino', t("RINO Encryption"), intval(get_config('system','rino_encrypt')), t("Encryption layer between nodes."), array("Disabled", "RINO1 (deprecated)", "RINO2")),
766
767                 '$form_security_token' => get_form_security_token("admin_site")
768
769         ));
770
771 }
772
773
774 function admin_page_dbsync(&$a) {
775
776         $o = '';
777
778         if($a->argc > 3 && intval($a->argv[3]) && $a->argv[2] === 'mark') {
779                 set_config('database', 'update_' . intval($a->argv[3]), 'success');
780                 $curr = get_config('system','build');
781                 if(intval($curr) == intval($a->argv[3]))
782                         set_config('system','build',intval($curr) + 1);
783                 info( t('Update has been marked successful') . EOL);
784                 goaway($a->get_baseurl(true) . '/admin/dbsync');
785         }
786
787         if(($a->argc > 2) AND (intval($a->argv[2]) OR ($a->argv[2] === 'check'))) {
788                 require_once("include/dbstructure.php");
789                 $retval = update_structure(false, true);
790                 if (!$retval) {
791                         $o .= sprintf(t("Database structure update %s was successfully applied."), DB_UPDATE_VERSION)."<br />";
792                         set_config('database', 'dbupdate_'.DB_UPDATE_VERSION, 'success');
793                 } else
794                         $o .= sprintf(t("Executing of database structure update %s failed with error: %s"),
795                                         DB_UPDATE_VERSION, $retval)."<br />";
796                 if ($a->argv[2] === 'check')
797                         return $o;
798         }
799
800         if ($a->argc > 2 && intval($a->argv[2])) {
801                 require_once('update.php');
802                 $func = 'update_' . intval($a->argv[2]);
803                 if(function_exists($func)) {
804                         $retval = $func();
805                         if($retval === UPDATE_FAILED) {
806                                 $o .= sprintf(t("Executing %s failed with error: %s"), $func, $retval);
807                         }
808                         elseif($retval === UPDATE_SUCCESS) {
809                                 $o .= sprintf(t('Update %s was successfully applied.', $func));
810                                 set_config('database',$func, 'success');
811                         }
812                         else
813                                 $o .= sprintf(t('Update %s did not return a status. Unknown if it succeeded.'), $func);
814                 } else {
815                         $o .= sprintf(t('There was no additional update function %s that needed to be called.'), $func)."<br />";
816                         set_config('database',$func, 'success');
817                 }
818                 return $o;
819         }
820
821         $failed = array();
822         $r = q("select k, v from config where `cat` = 'database' ");
823         if(count($r)) {
824                 foreach($r as $rr) {
825                         $upd = intval(substr($rr['k'],7));
826                         if($upd < 1139 || $rr['v'] === 'success')
827                                 continue;
828                         $failed[] = $upd;
829                 }
830         }
831         if(! count($failed)) {
832                 $o = replace_macros(get_markup_template('structure_check.tpl'),array(
833                         '$base' => $a->get_baseurl(true),
834                         '$banner' => t('No failed updates.'),
835                         '$check' => t('Check database structure'),
836                 ));
837         } else {
838                 $o = replace_macros(get_markup_template('failed_updates.tpl'),array(
839                         '$base' => $a->get_baseurl(true),
840                         '$banner' => t('Failed Updates'),
841                         '$desc' => t('This does not include updates prior to 1139, which did not return a status.'),
842                         '$mark' => t('Mark success (if update was manually applied)'),
843                         '$apply' => t('Attempt to execute this update step automatically'),
844                         '$failed' => $failed
845                 ));
846         }
847
848         return $o;
849
850 }
851
852 /**
853  * Users admin page
854  *
855  * @param App $a
856  */
857 function admin_page_users_post(&$a){
858         $pending = ( x($_POST, 'pending') ? $_POST['pending'] : Array() );
859         $users = ( x($_POST, 'user') ? $_POST['user'] : Array() );
860         $nu_name = ( x($_POST, 'new_user_name') ? $_POST['new_user_name'] : '');
861         $nu_nickname = ( x($_POST, 'new_user_nickname') ? $_POST['new_user_nickname'] : '');
862         $nu_email = ( x($_POST, 'new_user_email') ? $_POST['new_user_email'] : '');
863
864         check_form_security_token_redirectOnErr('/admin/users', 'admin_users');
865
866         if (!($nu_name==="") && !($nu_email==="") && !($nu_nickname==="")) {
867                 require_once('include/user.php');
868
869                 $result = create_user( array('username'=>$nu_name, 'email'=>$nu_email, 'nickname'=>$nu_nickname, 'verified'=>1)  );
870                 if(! $result['success']) {
871                         notice($result['message']);
872                         return;
873                 }
874                 $nu = $result['user'];
875                 $preamble = deindent(t('
876                         Dear %1$s,
877                                 the administrator of %2$s has set up an account for you.'));
878                 $body = deindent(t('
879                         The login details are as follows:
880
881                         Site Location:  %1$s
882                         Login Name:             %2$s
883                         Password:               %3$s
884
885                         You may change your password from your account "Settings" page after logging
886                         in.
887
888                         Please take a few moments to review the other account settings on that page.
889
890                         You may also wish to add some basic information to your default profile
891                         (on the "Profiles" page) so that other people can easily find you.
892
893                         We recommend setting your full name, adding a profile photo,
894                         adding some profile "keywords" (very useful in making new friends) - and
895                         perhaps what country you live in; if you do not wish to be more specific
896                         than that.
897
898                         We fully respect your right to privacy, and none of these items are necessary.
899                         If you are new and do not know anybody here, they may help
900                         you to make some new and interesting friends.
901
902                         Thank you and welcome to %4$s.'));
903
904                 $preamble = sprintf($preamble, $nu['username'], $a->config['sitename']);
905                 $body = sprintf($body, $a->get_baseurl(), $nu['email'], $result['password'], $a->config['sitename']);
906
907                 notification(array(
908                         'type' => "SYSTEM_EMAIL",
909                         'to_email' => $nu['email'],
910                         'subject'=> sprintf( t('Registration details for %s'), $a->config['sitename']),
911                         'preamble'=> $preamble,
912                         'body' => $body));
913
914         }
915
916         if (x($_POST,'page_users_block')){
917                 foreach($users as $uid){
918                         q("UPDATE `user` SET `blocked`=1-`blocked` WHERE `uid`=%s",
919                                 intval( $uid )
920                         );
921                 }
922                 notice( sprintf( tt("%s user blocked/unblocked", "%s users blocked/unblocked", count($users)), count($users)) );
923         }
924         if (x($_POST,'page_users_delete')){
925                 require_once("include/Contact.php");
926                 foreach($users as $uid){
927                         user_remove($uid);
928                 }
929                 notice( sprintf( tt("%s user deleted", "%s users deleted", count($users)), count($users)) );
930         }
931
932         if (x($_POST,'page_users_approve')){
933                 require_once("mod/regmod.php");
934                 foreach($pending as $hash){
935                         user_allow($hash);
936                 }
937         }
938         if (x($_POST,'page_users_deny')){
939                 require_once("mod/regmod.php");
940                 foreach($pending as $hash){
941                         user_deny($hash);
942                 }
943         }
944         goaway($a->get_baseurl(true) . '/admin/users' );
945         return; // NOTREACHED
946 }
947
948 /**
949  * @param App $a
950  * @return string
951  */
952 function admin_page_users(&$a){
953         if ($a->argc>2) {
954                 $uid = $a->argv[3];
955                 $user = q("SELECT username, blocked FROM `user` WHERE `uid`=%d", intval($uid));
956                 if (count($user)==0){
957                         notice( 'User not found' . EOL);
958                         goaway($a->get_baseurl(true) . '/admin/users' );
959                         return ''; // NOTREACHED
960                 }
961                 switch($a->argv[2]){
962                         case "delete":{
963                                 check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
964                                 // delete user
965                                 require_once("include/Contact.php");
966                                 user_remove($uid);
967
968                                 notice( sprintf(t("User '%s' deleted"), $user[0]['username']) . EOL);
969                         }; break;
970                         case "block":{
971                                 check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
972                                 q("UPDATE `user` SET `blocked`=%d WHERE `uid`=%s",
973                                         intval( 1-$user[0]['blocked'] ),
974                                         intval( $uid )
975                                 );
976                                 notice( sprintf( ($user[0]['blocked']?t("User '%s' unblocked"):t("User '%s' blocked")) , $user[0]['username']) . EOL);
977                         }; break;
978                 }
979                 goaway($a->get_baseurl(true) . '/admin/users' );
980                 return ''; // NOTREACHED
981
982         }
983
984         /* get pending */
985         $pending = q("SELECT `register`.*, `contact`.`name`, `user`.`email`
986                                  FROM `register`
987                                  LEFT JOIN `contact` ON `register`.`uid` = `contact`.`uid`
988                                  LEFT JOIN `user` ON `register`.`uid` = `user`.`uid`;");
989
990
991         /* get users */
992
993         $total = q("SELECT count(*) as total FROM `user` where 1");
994         if(count($total)) {
995                 $a->set_pager_total($total[0]['total']);
996                 $a->set_pager_itemspage(100);
997         }
998
999
1000         $users = q("SELECT `user` . * , `contact`.`name` , `contact`.`url` , `contact`.`micro`, `lastitem`.`lastitem_date`, `user`.`account_expired`
1001                                 FROM
1002                                         (SELECT MAX(`item`.`changed`) as `lastitem_date`, `item`.`uid`
1003                                         FROM `item`
1004                                         WHERE `item`.`type` = 'wall'
1005                                         GROUP BY `item`.`uid`) AS `lastitem`
1006                                                  RIGHT OUTER JOIN `user` ON `user`.`uid` = `lastitem`.`uid`,
1007                                            `contact`
1008                                 WHERE
1009                                            `user`.`uid` = `contact`.`uid`
1010                                                 AND `user`.`verified` =1
1011                                         AND `contact`.`self` =1
1012                                 ORDER BY `contact`.`name` LIMIT %d, %d
1013                                 ",
1014                                 intval($a->pager['start']),
1015                                 intval($a->pager['itemspage'])
1016                                 );
1017
1018         $adminlist = explode(",", str_replace(" ", "", $a->config['admin_email']));
1019         $_setup_users = function ($e) use ($adminlist){
1020                 $accounts = Array(
1021                         t('Normal Account'),
1022                         t('Soapbox Account'),
1023                         t('Community/Celebrity Account'),
1024                                                 t('Automatic Friend Account')
1025                 );
1026                 $e['page-flags'] = $accounts[$e['page-flags']];
1027                 $e['register_date'] = relative_date($e['register_date']);
1028                 $e['login_date'] = relative_date($e['login_date']);
1029                 $e['lastitem_date'] = relative_date($e['lastitem_date']);
1030                 //$e['is_admin'] = ($e['email'] === $a->config['admin_email']);
1031                 $e['is_admin'] = in_array($e['email'], $adminlist);
1032                 $e['is_deletable'] = (intval($e['uid']) != local_user());
1033                 $e['deleted'] = ($e['account_removed']?relative_date($e['account_expires_on']):False);
1034                 return $e;
1035         };
1036         $users = array_map($_setup_users, $users);
1037
1038
1039         // Get rid of dashes in key names, Smarty3 can't handle them
1040         // and extracting deleted users
1041
1042         $tmp_users = Array();
1043         $deleted = Array();
1044
1045         while(count($users)) {
1046                 $new_user = Array();
1047                 foreach( array_pop($users) as $k => $v) {
1048                         $k = str_replace('-','_',$k);
1049                         $new_user[$k] = $v;
1050                 }
1051                 if($new_user['deleted']) {
1052                         array_push($deleted, $new_user);
1053                 }
1054                 else {
1055                         array_push($tmp_users, $new_user);
1056                 }
1057         }
1058         //Reversing the two array, and moving $tmp_users to $users
1059         array_reverse($deleted);
1060         while(count($tmp_users)) {
1061                 array_push($users, array_pop($tmp_users));
1062         }
1063
1064         $t = get_markup_template("admin_users.tpl");
1065         $o = replace_macros($t, array(
1066                 // strings //
1067                 '$title' => t('Administration'),
1068                 '$page' => t('Users'),
1069                 '$submit' => t('Add User'),
1070                 '$select_all' => t('select all'),
1071                 '$h_pending' => t('User registrations waiting for confirm'),
1072                 '$h_deleted' => t('User waiting for permanent deletion'),
1073                 '$th_pending' => array( t('Request date'), t('Name'), t('Email') ),
1074                 '$no_pending' =>  t('No registrations.'),
1075                 '$approve' => t('Approve'),
1076                 '$deny' => t('Deny'),
1077                 '$delete' => t('Delete'),
1078                 '$block' => t('Block'),
1079                 '$unblock' => t('Unblock'),
1080                 '$siteadmin' => t('Site admin'),
1081                 '$accountexpired' => t('Account expired'),
1082
1083                 '$h_users' => t('Users'),
1084                 '$h_newuser' => t('New User'),
1085                 '$th_deleted' => array( t('Name'), t('Email'), t('Register date'), t('Last login'), t('Last item'), t('Deleted since') ),
1086                 '$th_users' => array( t('Name'), t('Email'), t('Register date'), t('Last login'), t('Last item'),  t('Account') ),
1087
1088                 '$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?'),
1089                 '$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?'),
1090
1091                 '$form_security_token' => get_form_security_token("admin_users"),
1092
1093                 // values //
1094                 '$baseurl' => $a->get_baseurl(true),
1095
1096                 '$pending' => $pending,
1097                 'deleted' => $deleted,
1098                 '$users' => $users,
1099                 '$newusername'  => array('new_user_name', t("Name"), '', t("Name of the new user.")),
1100                 '$newusernickname'  => array('new_user_nickname', t("Nickname"), '', t("Nickname of the new user.")),
1101                 '$newuseremail'  => array('new_user_email', t("Email"), '', t("Email address of the new user."), '', '', 'email'),
1102         ));
1103         $o .= paginate($a);
1104         return $o;
1105 }
1106
1107
1108 /**
1109  * Plugins admin page
1110  *
1111  * @param App $a
1112  * @return string
1113  */
1114 function admin_page_plugins(&$a){
1115
1116         /**
1117          * Single plugin
1118          */
1119         if ($a->argc == 3){
1120                 $plugin = $a->argv[2];
1121                 if (!is_file("addon/$plugin/$plugin.php")){
1122                         notice( t("Item not found.") );
1123                         return '';
1124                 }
1125
1126                 if (x($_GET,"a") && $_GET['a']=="t"){
1127                         check_form_security_token_redirectOnErr('/admin/plugins', 'admin_themes', 't');
1128
1129                         // Toggle plugin status
1130                         $idx = array_search($plugin, $a->plugins);
1131                         if ($idx !== false){
1132                                 unset($a->plugins[$idx]);
1133                                 uninstall_plugin($plugin);
1134                                 info( sprintf( t("Plugin %s disabled."), $plugin ) );
1135                         } else {
1136                                 $a->plugins[] = $plugin;
1137                                 install_plugin($plugin);
1138                                 info( sprintf( t("Plugin %s enabled."), $plugin ) );
1139                         }
1140                         set_config("system","addon", implode(", ",$a->plugins));
1141                         goaway($a->get_baseurl(true) . '/admin/plugins' );
1142                         return ''; // NOTREACHED
1143                 }
1144                 // display plugin details
1145                 require_once('library/markdown.php');
1146
1147                 if (in_array($plugin, $a->plugins)){
1148                         $status="on"; $action= t("Disable");
1149                 } else {
1150                         $status="off"; $action= t("Enable");
1151                 }
1152
1153                 $readme=Null;
1154                 if (is_file("addon/$plugin/README.md")){
1155                         $readme = file_get_contents("addon/$plugin/README.md");
1156                         $readme = Markdown($readme);
1157                 } else if (is_file("addon/$plugin/README")){
1158                         $readme = "<pre>". file_get_contents("addon/$plugin/README") ."</pre>";
1159                 }
1160
1161                 $admin_form="";
1162                 if (is_array($a->plugins_admin) && in_array($plugin, $a->plugins_admin)){
1163                         @require_once("addon/$plugin/$plugin.php");
1164                         $func = $plugin.'_plugin_admin';
1165                         $func($a, $admin_form);
1166                 }
1167
1168                 $t = get_markup_template("admin_plugins_details.tpl");
1169
1170                 return replace_macros($t, array(
1171                         '$title' => t('Administration'),
1172                         '$page' => t('Plugins'),
1173                         '$toggle' => t('Toggle'),
1174                         '$settings' => t('Settings'),
1175                         '$baseurl' => $a->get_baseurl(true),
1176
1177                         '$plugin' => $plugin,
1178                         '$status' => $status,
1179                         '$action' => $action,
1180                         '$info' => get_plugin_info($plugin),
1181                         '$str_author' => t('Author: '),
1182                         '$str_maintainer' => t('Maintainer: '),
1183
1184                         '$admin_form' => $admin_form,
1185                         '$function' => 'plugins',
1186                         '$screenshot' => '',
1187                         '$readme' => $readme,
1188
1189                         '$form_security_token' => get_form_security_token("admin_themes"),
1190                 ));
1191         }
1192
1193
1194
1195         /**
1196          * List plugins
1197          */
1198
1199     if (x($_GET,"a") && $_GET['a']=="r"){
1200                 check_form_security_token_redirectOnErr($a->get_baseurl().'/admin/plugins', 'admin_themes', 't');
1201                 reload_plugins();
1202                 info("Plugins reloaded");
1203                 goaway($a->get_baseurl().'/admin/plugins');
1204         }
1205
1206         $plugins = array();
1207         $files = glob("addon/*/"); /* */
1208         if($files) {
1209                 foreach($files as $file) {
1210                         if (is_dir($file)){
1211                                 list($tmp, $id)=array_map("trim", explode("/",$file));
1212                                 $info = get_plugin_info($id);
1213                                 $show_plugin = true;
1214
1215                                 // If the addon is unsupported, then only show it, when it is enabled
1216                                 if ((strtolower($info["status"]) == "unsupported") AND !in_array($id,  $a->plugins))
1217                                         $show_plugin = false;
1218
1219                                 // Override the above szenario, when the admin really wants to see outdated stuff
1220                                 if (get_config("system", "show_unsupported_addons"))
1221                                         $show_plugin = true;
1222
1223                                 if ($show_plugin)
1224                                         $plugins[] = array($id, (in_array($id,  $a->plugins)?"on":"off") , $info);
1225                         }
1226                 }
1227         }
1228
1229         $t = get_markup_template("admin_plugins.tpl");
1230         return replace_macros($t, array(
1231                 '$title' => t('Administration'),
1232                 '$page' => t('Plugins'),
1233                 '$submit' => t('Save Settings'),
1234                 '$baseurl' => $a->get_baseurl(true),
1235                 '$function' => 'plugins',
1236                 '$plugins' => $plugins,
1237                 '$form_security_token' => get_form_security_token("admin_themes"),
1238         ));
1239 }
1240
1241 /**
1242  * @param array $themes
1243  * @param string $th
1244  * @param int $result
1245  */
1246 function toggle_theme(&$themes,$th,&$result) {
1247         for($x = 0; $x < count($themes); $x ++) {
1248                 if($themes[$x]['name'] === $th) {
1249                         if($themes[$x]['allowed']) {
1250                                 $themes[$x]['allowed'] = 0;
1251                                 $result = 0;
1252                         }
1253                         else {
1254                                 $themes[$x]['allowed'] = 1;
1255                                 $result = 1;
1256                         }
1257                 }
1258         }
1259 }
1260
1261 /**
1262  * @param array $themes
1263  * @param string $th
1264  * @return int
1265  */
1266 function theme_status($themes,$th) {
1267         for($x = 0; $x < count($themes); $x ++) {
1268                 if($themes[$x]['name'] === $th) {
1269                         if($themes[$x]['allowed']) {
1270                                 return 1;
1271                         }
1272                         else {
1273                                 return 0;
1274                         }
1275                 }
1276         }
1277         return 0;
1278 }
1279
1280
1281 /**
1282  * @param array $themes
1283  * @return string
1284  */
1285 function rebuild_theme_table($themes) {
1286         $o = '';
1287         if(count($themes)) {
1288                 foreach($themes as $th) {
1289                         if($th['allowed']) {
1290                                 if(strlen($o))
1291                                         $o .= ',';
1292                                 $o .= $th['name'];
1293                         }
1294                 }
1295         }
1296         return $o;
1297 }
1298
1299
1300 /**
1301  * Themes admin page
1302  *
1303  * @param App $a
1304  * @return string
1305  */
1306 function admin_page_themes(&$a){
1307
1308         $allowed_themes_str = get_config('system','allowed_themes');
1309         $allowed_themes_raw = explode(',',$allowed_themes_str);
1310         $allowed_themes = array();
1311         if(count($allowed_themes_raw))
1312                 foreach($allowed_themes_raw as $x)
1313                         if(strlen(trim($x)))
1314                                 $allowed_themes[] = trim($x);
1315
1316         $themes = array();
1317         $files = glob('view/theme/*'); /* */
1318         if($files) {
1319                 foreach($files as $file) {
1320                         $f = basename($file);
1321                         $is_experimental = intval(file_exists($file . '/experimental'));
1322                         $is_supported = 1-(intval(file_exists($file . '/unsupported')));
1323                         $is_allowed = intval(in_array($f,$allowed_themes));
1324
1325                         if ($is_allowed OR $is_supported OR get_config("system", "show_unsupported_themes"))
1326                                 $themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed);
1327                 }
1328         }
1329
1330         if(! count($themes)) {
1331                 notice( t('No themes found.'));
1332                 return '';
1333         }
1334
1335         /**
1336          * Single theme
1337          */
1338
1339         if ($a->argc == 3){
1340                 $theme = $a->argv[2];
1341                 if(! is_dir("view/theme/$theme")){
1342                         notice( t("Item not found.") );
1343                         return '';
1344                 }
1345
1346                 if (x($_GET,"a") && $_GET['a']=="t"){
1347                         check_form_security_token_redirectOnErr('/admin/themes', 'admin_themes', 't');
1348
1349                         // Toggle theme status
1350
1351                         toggle_theme($themes,$theme,$result);
1352                         $s = rebuild_theme_table($themes);
1353                         if($result) {
1354                                 install_theme($theme);
1355                                 info( sprintf('Theme %s enabled.',$theme));
1356                         }
1357                         else {
1358                                 uninstall_theme($theme);
1359                                 info( sprintf('Theme %s disabled.',$theme));
1360                         }
1361
1362                         set_config('system','allowed_themes',$s);
1363                         goaway($a->get_baseurl(true) . '/admin/themes' );
1364                         return ''; // NOTREACHED
1365                 }
1366
1367                 // display theme details
1368                 require_once('library/markdown.php');
1369
1370                 if (theme_status($themes,$theme)) {
1371                         $status="on"; $action= t("Disable");
1372                 } else {
1373                         $status="off"; $action= t("Enable");
1374                 }
1375
1376                 $readme=Null;
1377                 if (is_file("view/theme/$theme/README.md")){
1378                         $readme = file_get_contents("view/theme/$theme/README.md");
1379                         $readme = Markdown($readme);
1380                 } else if (is_file("view/theme/$theme/README")){
1381                         $readme = "<pre>". file_get_contents("view/theme/$theme/README") ."</pre>";
1382                 }
1383
1384                 $admin_form="";
1385                 if (is_file("view/theme/$theme/config.php")){
1386                         require_once("view/theme/$theme/config.php");
1387                         if(function_exists("theme_admin")){
1388                                 $admin_form = theme_admin($a);
1389                         }
1390
1391                 }
1392
1393                 $screenshot = array( get_theme_screenshot($theme), t('Screenshot'));
1394                 if(! stristr($screenshot[0],$theme))
1395                         $screenshot = null;
1396
1397                 $t = get_markup_template("admin_plugins_details.tpl");
1398                 return replace_macros($t, array(
1399                         '$title' => t('Administration'),
1400                         '$page' => t('Themes'),
1401                         '$toggle' => t('Toggle'),
1402                         '$settings' => t('Settings'),
1403                         '$baseurl' => $a->get_baseurl(true),
1404
1405                         '$plugin' => $theme,
1406                         '$status' => $status,
1407                         '$action' => $action,
1408                         '$info' => get_theme_info($theme),
1409                         '$function' => 'themes',
1410                         '$admin_form' => $admin_form,
1411                         '$str_author' => t('Author: '),
1412                         '$str_maintainer' => t('Maintainer: '),
1413                         '$screenshot' => $screenshot,
1414                         '$readme' => $readme,
1415
1416                         '$form_security_token' => get_form_security_token("admin_themes"),
1417                 ));
1418         }
1419
1420         /**
1421          * List themes
1422          */
1423
1424         $xthemes = array();
1425         if($themes) {
1426                 foreach($themes as $th) {
1427                         $xthemes[] = array($th['name'],(($th['allowed']) ? "on" : "off"), get_theme_info($th['name']));
1428                 }
1429         }
1430
1431         $t = get_markup_template("admin_plugins.tpl");
1432         return replace_macros($t, array(
1433                 '$title' => t('Administration'),
1434                 '$page' => t('Themes'),
1435                 '$submit' => t('Save Settings'),
1436                 '$baseurl' => $a->get_baseurl(true),
1437                 '$function' => 'themes',
1438                 '$plugins' => $xthemes,
1439                 '$experimental' => t('[Experimental]'),
1440                 '$unsupported' => t('[Unsupported]'),
1441                 '$form_security_token' => get_form_security_token("admin_themes"),
1442         ));
1443 }
1444
1445
1446 /**
1447  * Logs admin page
1448  *
1449  * @param App $a
1450  */
1451
1452 function admin_page_logs_post(&$a) {
1453         if (x($_POST,"page_logs")) {
1454                 check_form_security_token_redirectOnErr('/admin/logs', 'admin_logs');
1455
1456                 $logfile                =       ((x($_POST,'logfile'))          ? notags(trim($_POST['logfile']))       : '');
1457                 $debugging              =       ((x($_POST,'debugging'))        ? true                                                          : false);
1458                 $loglevel               =       ((x($_POST,'loglevel'))         ? intval(trim($_POST['loglevel']))      : 0);
1459
1460                 set_config('system','logfile', $logfile);
1461                 set_config('system','debugging',  $debugging);
1462                 set_config('system','loglevel', $loglevel);
1463
1464
1465         }
1466
1467         info( t("Log settings updated.") );
1468         goaway($a->get_baseurl(true) . '/admin/logs' );
1469         return; // NOTREACHED
1470 }
1471
1472 /**
1473  * @param App $a
1474  * @return string
1475  */
1476 function admin_page_logs(&$a){
1477
1478         $log_choices = Array(
1479                 LOGGER_NORMAL => 'Normal',
1480                 LOGGER_TRACE => 'Trace',
1481                 LOGGER_DEBUG => 'Debug',
1482                 LOGGER_DATA => 'Data',
1483                 LOGGER_ALL => 'All'
1484         );
1485
1486         $t = get_markup_template("admin_logs.tpl");
1487
1488         $f = get_config('system','logfile');
1489
1490         $data = '';
1491
1492         if(!file_exists($f)) {
1493                 $data = t("Error trying to open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f exist and is
1494 readable.");
1495         }
1496         else {
1497                 $fp = fopen($f, 'r');
1498                 if(!$fp) {
1499                         $data = t("Couldn't open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f is readable.");
1500                 }
1501                 else {
1502                         $fstat = fstat($fp);
1503                         $size = $fstat['size'];
1504                         if($size != 0)
1505                         {
1506                                 if($size > 5000000 || $size < 0)
1507                                         $size = 5000000;
1508                                 $seek = fseek($fp,0-$size,SEEK_END);
1509                                 if($seek === 0) {
1510                                         $data = escape_tags(fread($fp,$size));
1511                                         while(! feof($fp))
1512                                                 $data .= escape_tags(fread($fp,4096));
1513                                 }
1514                         }
1515                         fclose($fp);
1516                 }
1517         }
1518
1519         return replace_macros($t, array(
1520                 '$title' => t('Administration'),
1521                 '$page' => t('Logs'),
1522                 '$submit' => t('Save Settings'),
1523                 '$clear' => t('Clear'),
1524                 '$data' => $data,
1525                 '$baseurl' => $a->get_baseurl(true),
1526                 '$logname' =>  get_config('system','logfile'),
1527
1528                                                                         // name, label, value, help string, extra data...
1529                 '$debugging'            => array('debugging', t("Enable Debugging"),get_config('system','debugging'), ""),
1530                 '$logfile'                      => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your Friendica top-level directory.")),
1531                 '$loglevel'             => array('loglevel', t("Log level"), get_config('system','loglevel'), "", $log_choices),
1532
1533                 '$form_security_token' => get_form_security_token("admin_logs"),
1534         ));
1535 }
1536
1537 /**
1538  * @param App $a
1539  */
1540 function admin_page_remoteupdate_post(&$a) {
1541         // this function should be called via ajax post
1542         if(!is_site_admin()) {
1543                 return;
1544         }
1545
1546
1547         if (x($_POST,'remotefile') && $_POST['remotefile']!=""){
1548                 $remotefile = $_POST['remotefile'];
1549                 $ftpdata = (x($_POST['ftphost'])?$_POST:false);
1550                 doUpdate($remotefile, $ftpdata);
1551         } else {
1552                 echo "No remote file to download. Abort!";
1553         }
1554
1555         killme();
1556 }
1557
1558 /**
1559  * @param App $a
1560  * @return string
1561  */
1562 function admin_page_remoteupdate(&$a) {
1563         if(!is_site_admin()) {
1564                 return login(false);
1565         }
1566
1567         $canwrite = canWeWrite();
1568         $canftp = function_exists('ftp_connect');
1569
1570         $needupdate = true;
1571         $u = checkUpdate();
1572         if (!is_array($u)){
1573                 $needupdate = false;
1574                 $u = array('','','');
1575         }
1576
1577         $tpl = get_markup_template("admin_remoteupdate.tpl");
1578         return replace_macros($tpl, array(
1579                 '$baseurl' => $a->get_baseurl(true),
1580                 '$submit' => t("Update now"),
1581                 '$close' => t("Close"),
1582                 '$localversion' => FRIENDICA_VERSION,
1583                 '$remoteversion' => $u[1],
1584                 '$needupdate' => $needupdate,
1585                 '$canwrite' => $canwrite,
1586                 '$canftp'       => $canftp,
1587                 '$ftphost'      => array('ftphost', t("FTP Host"), '',''),
1588                 '$ftppath'      => array('ftppath', t("FTP Path"), '/',''),
1589                 '$ftpuser'      => array('ftpuser', t("FTP User"), '',''),
1590                 '$ftppwd'       => array('ftppwd', t("FTP Password"), '',''),
1591                 '$remotefile'=>array('remotefile','', $u['2'],''),
1592         ));
1593
1594 }