]> git.mxchange.org Git - friendica.git/blob - mod/admin.php
Merge pull request #1826 from annando/1508-statistics
[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         $plugins = array();
1200         $files = glob("addon/*/"); /* */
1201         if($files) {
1202                 foreach($files as $file) {
1203                         if (is_dir($file)){
1204                                 list($tmp, $id)=array_map("trim", explode("/",$file));
1205                                 $info = get_plugin_info($id);
1206                                 $show_plugin = true;
1207
1208                                 // If the addon is unsupported, then only show it, when it is enabled
1209                                 if ((strtolower($info["status"]) == "unsupported") AND !in_array($id,  $a->plugins))
1210                                         $show_plugin = false;
1211
1212                                 // Override the above szenario, when the admin really wants to see outdated stuff
1213                                 if (get_config("system", "show_unsupported_addons"))
1214                                         $show_plugin = true;
1215
1216                                 if ($show_plugin)
1217                                         $plugins[] = array($id, (in_array($id,  $a->plugins)?"on":"off") , $info);
1218                         }
1219                 }
1220         }
1221
1222         $t = get_markup_template("admin_plugins.tpl");
1223         return replace_macros($t, array(
1224                 '$title' => t('Administration'),
1225                 '$page' => t('Plugins'),
1226                 '$submit' => t('Save Settings'),
1227                 '$baseurl' => $a->get_baseurl(true),
1228                 '$function' => 'plugins',
1229                 '$plugins' => $plugins,
1230                 '$form_security_token' => get_form_security_token("admin_themes"),
1231         ));
1232 }
1233
1234 /**
1235  * @param array $themes
1236  * @param string $th
1237  * @param int $result
1238  */
1239 function toggle_theme(&$themes,$th,&$result) {
1240         for($x = 0; $x < count($themes); $x ++) {
1241                 if($themes[$x]['name'] === $th) {
1242                         if($themes[$x]['allowed']) {
1243                                 $themes[$x]['allowed'] = 0;
1244                                 $result = 0;
1245                         }
1246                         else {
1247                                 $themes[$x]['allowed'] = 1;
1248                                 $result = 1;
1249                         }
1250                 }
1251         }
1252 }
1253
1254 /**
1255  * @param array $themes
1256  * @param string $th
1257  * @return int
1258  */
1259 function theme_status($themes,$th) {
1260         for($x = 0; $x < count($themes); $x ++) {
1261                 if($themes[$x]['name'] === $th) {
1262                         if($themes[$x]['allowed']) {
1263                                 return 1;
1264                         }
1265                         else {
1266                                 return 0;
1267                         }
1268                 }
1269         }
1270         return 0;
1271 }
1272
1273
1274 /**
1275  * @param array $themes
1276  * @return string
1277  */
1278 function rebuild_theme_table($themes) {
1279         $o = '';
1280         if(count($themes)) {
1281                 foreach($themes as $th) {
1282                         if($th['allowed']) {
1283                                 if(strlen($o))
1284                                         $o .= ',';
1285                                 $o .= $th['name'];
1286                         }
1287                 }
1288         }
1289         return $o;
1290 }
1291
1292
1293 /**
1294  * Themes admin page
1295  *
1296  * @param App $a
1297  * @return string
1298  */
1299 function admin_page_themes(&$a){
1300
1301         $allowed_themes_str = get_config('system','allowed_themes');
1302         $allowed_themes_raw = explode(',',$allowed_themes_str);
1303         $allowed_themes = array();
1304         if(count($allowed_themes_raw))
1305                 foreach($allowed_themes_raw as $x)
1306                         if(strlen(trim($x)))
1307                                 $allowed_themes[] = trim($x);
1308
1309         $themes = array();
1310         $files = glob('view/theme/*'); /* */
1311         if($files) {
1312                 foreach($files as $file) {
1313                         $f = basename($file);
1314                         $is_experimental = intval(file_exists($file . '/experimental'));
1315                         $is_supported = 1-(intval(file_exists($file . '/unsupported')));
1316                         $is_allowed = intval(in_array($f,$allowed_themes));
1317
1318                         if ($is_allowed OR $is_supported OR get_config("system", "show_unsupported_themes"))
1319                                 $themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed);
1320                 }
1321         }
1322
1323         if(! count($themes)) {
1324                 notice( t('No themes found.'));
1325                 return '';
1326         }
1327
1328         /**
1329          * Single theme
1330          */
1331
1332         if ($a->argc == 3){
1333                 $theme = $a->argv[2];
1334                 if(! is_dir("view/theme/$theme")){
1335                         notice( t("Item not found.") );
1336                         return '';
1337                 }
1338
1339                 if (x($_GET,"a") && $_GET['a']=="t"){
1340                         check_form_security_token_redirectOnErr('/admin/themes', 'admin_themes', 't');
1341
1342                         // Toggle theme status
1343
1344                         toggle_theme($themes,$theme,$result);
1345                         $s = rebuild_theme_table($themes);
1346                         if($result) {
1347                                 install_theme($theme);
1348                                 info( sprintf('Theme %s enabled.',$theme));
1349                         }
1350                         else {
1351                                 uninstall_theme($theme);
1352                                 info( sprintf('Theme %s disabled.',$theme));
1353                         }
1354
1355                         set_config('system','allowed_themes',$s);
1356                         goaway($a->get_baseurl(true) . '/admin/themes' );
1357                         return ''; // NOTREACHED
1358                 }
1359
1360                 // display theme details
1361                 require_once('library/markdown.php');
1362
1363                 if (theme_status($themes,$theme)) {
1364                         $status="on"; $action= t("Disable");
1365                 } else {
1366                         $status="off"; $action= t("Enable");
1367                 }
1368
1369                 $readme=Null;
1370                 if (is_file("view/theme/$theme/README.md")){
1371                         $readme = file_get_contents("view/theme/$theme/README.md");
1372                         $readme = Markdown($readme);
1373                 } else if (is_file("view/theme/$theme/README")){
1374                         $readme = "<pre>". file_get_contents("view/theme/$theme/README") ."</pre>";
1375                 }
1376
1377                 $admin_form="";
1378                 if (is_file("view/theme/$theme/config.php")){
1379                         require_once("view/theme/$theme/config.php");
1380                         if(function_exists("theme_admin")){
1381                                 $admin_form = theme_admin($a);
1382                         }
1383
1384                 }
1385
1386                 $screenshot = array( get_theme_screenshot($theme), t('Screenshot'));
1387                 if(! stristr($screenshot[0],$theme))
1388                         $screenshot = null;
1389
1390                 $t = get_markup_template("admin_plugins_details.tpl");
1391                 return replace_macros($t, array(
1392                         '$title' => t('Administration'),
1393                         '$page' => t('Themes'),
1394                         '$toggle' => t('Toggle'),
1395                         '$settings' => t('Settings'),
1396                         '$baseurl' => $a->get_baseurl(true),
1397
1398                         '$plugin' => $theme,
1399                         '$status' => $status,
1400                         '$action' => $action,
1401                         '$info' => get_theme_info($theme),
1402                         '$function' => 'themes',
1403                         '$admin_form' => $admin_form,
1404                         '$str_author' => t('Author: '),
1405                         '$str_maintainer' => t('Maintainer: '),
1406                         '$screenshot' => $screenshot,
1407                         '$readme' => $readme,
1408
1409                         '$form_security_token' => get_form_security_token("admin_themes"),
1410                 ));
1411         }
1412
1413         /**
1414          * List themes
1415          */
1416
1417         $xthemes = array();
1418         if($themes) {
1419                 foreach($themes as $th) {
1420                         $xthemes[] = array($th['name'],(($th['allowed']) ? "on" : "off"), get_theme_info($th['name']));
1421                 }
1422         }
1423
1424         $t = get_markup_template("admin_plugins.tpl");
1425         return replace_macros($t, array(
1426                 '$title' => t('Administration'),
1427                 '$page' => t('Themes'),
1428                 '$submit' => t('Save Settings'),
1429                 '$baseurl' => $a->get_baseurl(true),
1430                 '$function' => 'themes',
1431                 '$plugins' => $xthemes,
1432                 '$experimental' => t('[Experimental]'),
1433                 '$unsupported' => t('[Unsupported]'),
1434                 '$form_security_token' => get_form_security_token("admin_themes"),
1435         ));
1436 }
1437
1438
1439 /**
1440  * Logs admin page
1441  *
1442  * @param App $a
1443  */
1444
1445 function admin_page_logs_post(&$a) {
1446         if (x($_POST,"page_logs")) {
1447                 check_form_security_token_redirectOnErr('/admin/logs', 'admin_logs');
1448
1449                 $logfile                =       ((x($_POST,'logfile'))          ? notags(trim($_POST['logfile']))       : '');
1450                 $debugging              =       ((x($_POST,'debugging'))        ? true                                                          : false);
1451                 $loglevel               =       ((x($_POST,'loglevel'))         ? intval(trim($_POST['loglevel']))      : 0);
1452
1453                 set_config('system','logfile', $logfile);
1454                 set_config('system','debugging',  $debugging);
1455                 set_config('system','loglevel', $loglevel);
1456
1457
1458         }
1459
1460         info( t("Log settings updated.") );
1461         goaway($a->get_baseurl(true) . '/admin/logs' );
1462         return; // NOTREACHED
1463 }
1464
1465 /**
1466  * @param App $a
1467  * @return string
1468  */
1469 function admin_page_logs(&$a){
1470
1471         $log_choices = Array(
1472                 LOGGER_NORMAL => 'Normal',
1473                 LOGGER_TRACE => 'Trace',
1474                 LOGGER_DEBUG => 'Debug',
1475                 LOGGER_DATA => 'Data',
1476                 LOGGER_ALL => 'All'
1477         );
1478
1479         $t = get_markup_template("admin_logs.tpl");
1480
1481         $f = get_config('system','logfile');
1482
1483         $data = '';
1484
1485         if(!file_exists($f)) {
1486                 $data = t("Error trying to open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f exist and is
1487 readable.");
1488         }
1489         else {
1490                 $fp = fopen($f, 'r');
1491                 if(!$fp) {
1492                         $data = t("Couldn't open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f is readable.");
1493                 }
1494                 else {
1495                         $fstat = fstat($fp);
1496                         $size = $fstat['size'];
1497                         if($size != 0)
1498                         {
1499                                 if($size > 5000000 || $size < 0)
1500                                         $size = 5000000;
1501                                 $seek = fseek($fp,0-$size,SEEK_END);
1502                                 if($seek === 0) {
1503                                         $data = escape_tags(fread($fp,$size));
1504                                         while(! feof($fp))
1505                                                 $data .= escape_tags(fread($fp,4096));
1506                                 }
1507                         }
1508                         fclose($fp);
1509                 }
1510         }
1511
1512         return replace_macros($t, array(
1513                 '$title' => t('Administration'),
1514                 '$page' => t('Logs'),
1515                 '$submit' => t('Save Settings'),
1516                 '$clear' => t('Clear'),
1517                 '$data' => $data,
1518                 '$baseurl' => $a->get_baseurl(true),
1519                 '$logname' =>  get_config('system','logfile'),
1520
1521                                                                         // name, label, value, help string, extra data...
1522                 '$debugging'            => array('debugging', t("Enable Debugging"),get_config('system','debugging'), ""),
1523                 '$logfile'                      => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your Friendica top-level directory.")),
1524                 '$loglevel'             => array('loglevel', t("Log level"), get_config('system','loglevel'), "", $log_choices),
1525
1526                 '$form_security_token' => get_form_security_token("admin_logs"),
1527         ));
1528 }
1529
1530 /**
1531  * @param App $a
1532  */
1533 function admin_page_remoteupdate_post(&$a) {
1534         // this function should be called via ajax post
1535         if(!is_site_admin()) {
1536                 return;
1537         }
1538
1539
1540         if (x($_POST,'remotefile') && $_POST['remotefile']!=""){
1541                 $remotefile = $_POST['remotefile'];
1542                 $ftpdata = (x($_POST['ftphost'])?$_POST:false);
1543                 doUpdate($remotefile, $ftpdata);
1544         } else {
1545                 echo "No remote file to download. Abort!";
1546         }
1547
1548         killme();
1549 }
1550
1551 /**
1552  * @param App $a
1553  * @return string
1554  */
1555 function admin_page_remoteupdate(&$a) {
1556         if(!is_site_admin()) {
1557                 return login(false);
1558         }
1559
1560         $canwrite = canWeWrite();
1561         $canftp = function_exists('ftp_connect');
1562
1563         $needupdate = true;
1564         $u = checkUpdate();
1565         if (!is_array($u)){
1566                 $needupdate = false;
1567                 $u = array('','','');
1568         }
1569
1570         $tpl = get_markup_template("admin_remoteupdate.tpl");
1571         return replace_macros($tpl, array(
1572                 '$baseurl' => $a->get_baseurl(true),
1573                 '$submit' => t("Update now"),
1574                 '$close' => t("Close"),
1575                 '$localversion' => FRIENDICA_VERSION,
1576                 '$remoteversion' => $u[1],
1577                 '$needupdate' => $needupdate,
1578                 '$canwrite' => $canwrite,
1579                 '$canftp'       => $canftp,
1580                 '$ftphost'      => array('ftphost', t("FTP Host"), '',''),
1581                 '$ftppath'      => array('ftppath', t("FTP Path"), '/',''),
1582                 '$ftpuser'      => array('ftpuser', t("FTP User"), '',''),
1583                 '$ftppwd'       => array('ftppwd', t("FTP Password"), '',''),
1584                 '$remotefile'=>array('remotefile','', $u['2'],''),
1585         ));
1586
1587 }