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