]> git.mxchange.org Git - friendica.git/blob - mod/admin.php
Merge pull request #1856 from annando/1508-embedly
[friendica.git] / mod / admin.php
1 <?php
2
3  /**
4   * Friendica admin
5   */
6 require_once("include/remoteupdate.php");
7 require_once("include/enotify.php");
8 require_once("include/text.php");
9
10
11 /**
12  * @param App $a
13  */
14 function admin_post(&$a){
15
16
17         if(!is_site_admin()) {
18                 return;
19         }
20
21         // do not allow a page manager to access the admin panel at all.
22
23         if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
24                 return;
25
26
27
28         // urls
29         if ($a->argc > 1){
30                 switch ($a->argv[1]){
31                         case 'site':
32                                 admin_page_site_post($a);
33                                 break;
34                         case 'users':
35                                 admin_page_users_post($a);
36                                 break;
37                         case 'plugins':
38                                 if ($a->argc > 2 &&
39                                         is_file("addon/".$a->argv[2]."/".$a->argv[2].".php")){
40                                                 @include_once("addon/".$a->argv[2]."/".$a->argv[2].".php");
41                                                 if(function_exists($a->argv[2].'_plugin_admin_post')) {
42                                                         $func = $a->argv[2].'_plugin_admin_post';
43                                                         $func($a);
44                                                 }
45                                 }
46                                 goaway($a->get_baseurl(true) . '/admin/plugins/' . $a->argv[2] );
47                                 return; // NOTREACHED
48                                 break;
49                         case 'themes':
50                                 $theme = $a->argv[2];
51                                 if (is_file("view/theme/$theme/config.php")){
52                                         require_once("view/theme/$theme/config.php");
53                                         if (function_exists("theme_admin_post")){
54                                                 theme_admin_post($a);
55                                         }
56                                 }
57                                 info(t('Theme settings updated.'));
58                                 if(is_ajax()) return;
59
60                                 goaway($a->get_baseurl(true) . '/admin/themes/' . $theme );
61                                 return;
62                                 break;
63                         case 'logs':
64                                 admin_page_logs_post($a);
65                                 break;
66                         case 'dbsync':
67                                 admin_page_dbsync_post($a);
68                                 break;
69                         case 'update':
70                                 admin_page_remoteupdate_post($a);
71                                 break;
72                 }
73         }
74
75         goaway($a->get_baseurl(true) . '/admin' );
76         return; // NOTREACHED
77 }
78
79 /**
80  * @param App $a
81  * @return string
82  */
83 function admin_content(&$a) {
84
85         if(!is_site_admin()) {
86                 return login(false);
87         }
88
89         if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
90                 return "";
91
92         // APC deactivated, since there are problems with PHP 5.5
93         //if (function_exists("apc_delete")) {
94         //      $toDelete = new APCIterator('user', APC_ITER_VALUE);
95         //      apc_delete($toDelete);
96         //}
97
98         /**
99          * Side bar links
100          */
101
102         // array( url, name, extra css classes )
103         $aside = Array(
104                 'site'   =>     Array($a->get_baseurl(true)."/admin/site/", t("Site") , "site"),
105                 'users'  =>     Array($a->get_baseurl(true)."/admin/users/", t("Users") , "users"),
106                 'plugins'=>     Array($a->get_baseurl(true)."/admin/plugins/", t("Plugins") , "plugins"),
107                 'themes' =>     Array($a->get_baseurl(true)."/admin/themes/", t("Themes") , "themes"),
108                 'dbsync' =>     Array($a->get_baseurl(true)."/admin/dbsync/", t('DB updates'), "dbsync"),
109                 'queue'  =>     Array($a->get_baseurl(true)."/admin/queue/", t('Inspect Queue'), "queue"),
110                 //'update' =>   Array($a->get_baseurl(true)."/admin/update/", t("Software Update") , "update")
111         );
112
113         /* get plugins admin page */
114
115         $r = q("SELECT name FROM `addon` WHERE `plugin_admin`=1");
116         $aside['plugins_admin']=Array();
117         foreach ($r as $h){
118                 $plugin =$h['name'];
119                 $aside['plugins_admin'][] = Array($a->get_baseurl(true)."/admin/plugins/".$plugin, $plugin, "plugin");
120                 // temp plugins with admin
121                 $a->plugins_admin[] = $plugin;
122         }
123
124         $aside['logs'] = Array($a->get_baseurl(true)."/admin/logs/", t("Logs"), "logs");
125         $aside['diagnostics_probe'] = Array($a->get_baseurl(true).'/probe/', t('probe address'), 'probe');
126         $aside['diagnostics_webfinger'] = Array($a->get_baseurl(true).'/webfinger/', t('check webfinger'), 'webfinger');
127
128         $t = get_markup_template("admin_aside.tpl");
129         $a->page['aside'] .= replace_macros( $t, array(
130                         '$admin' => $aside,
131                         '$admtxt' => t('Admin'),
132                         '$plugadmtxt' => t('Plugin Features'),
133                         '$logtxt' => t('Logs'),
134                         '$diagnosticstxt' => t('diagnostics'),
135                         '$h_pending' => t('User registrations waiting for confirmation'),
136                         '$admurl'=> $a->get_baseurl(true)."/admin/"
137         ));
138
139
140
141         /**
142          * Page content
143          */
144         $o = '';
145         // urls
146         if ($a->argc > 1){
147                 switch ($a->argv[1]){
148                         case 'site':
149                                 $o = admin_page_site($a);
150                                 break;
151                         case 'users':
152                                 $o = admin_page_users($a);
153                                 break;
154                         case 'plugins':
155                                 $o = admin_page_plugins($a);
156                                 break;
157                         case 'themes':
158                                 $o = admin_page_themes($a);
159                                 break;
160                         case 'logs':
161                                 $o = admin_page_logs($a);
162                                 break;
163                         case 'dbsync':
164                                 $o = admin_page_dbsync($a);
165                                 break;
166                         case 'update':
167                                 $o = admin_page_remoteupdate($a);
168                                 break;
169                         case 'queue':
170                                 $o = admin_page_queue($a);
171                                 break;
172                         default:
173                                 notice( t("Item not found.") );
174                 }
175         } else {
176                 $o = admin_page_summary($a);
177         }
178
179         if(is_ajax()) {
180                 echo $o;
181                 killme();
182                 return '';
183         } else {
184                 return $o;
185         }
186 }
187
188 /**
189  * Admin Inspect Queue Page
190  * @param App $a
191  * return string
192  */
193 function admin_page_queue(&$a) {
194         // get content from the queue table
195         $r = q("SELECT c.name,c.nurl,q.id,q.network,q.created,q.last from queue as q, contact as c where c.id=q.cid order by q.cid, q.created;");
196
197         $t = get_markup_template("admin_queue.tpl");
198         return replace_macros($t, array(
199                 '$title' => t('Administration'),
200                 '$page' => t('Inspect Queue'),
201                 '$count' => sizeof($r),
202                 'id_header' => t('ID'),
203                 '$to_header' => t('Recipient Name'),
204                 '$url_header' => t('Recipient Profile'),
205                 '$network_header' => t('Network'),
206                 '$created_header' => t('Created'),
207                 '$last_header' => t('Last Tried'),
208                 '$info' => t('This page lists the content of the queue for outgoing postings. These are postings the initial delivery failed for. They will be resend later and eventually deleted if the delivery fails permanently.'),
209                 '$entries' => $r,
210         ));
211 }
212 /**
213  * Admin Summary Page
214  * @param App $a
215  * @return string
216  */
217 function admin_page_summary(&$a) {
218         $r = q("SELECT `page-flags`, COUNT(uid) as `count` FROM `user` GROUP BY `page-flags`");
219         $accounts = Array(
220                 Array( t('Normal Account'), 0),
221                 Array( t('Soapbox Account'), 0),
222                 Array( t('Community/Celebrity Account'), 0),
223                 Array( t('Automatic Friend Account'), 0),
224                 Array( t('Blog Account'), 0),
225                 Array( t('Private Forum'), 0)
226         );
227
228         $users=0;
229         foreach ($r as $u){ $accounts[$u['page-flags']][1] = $u['count']; $users+= $u['count']; }
230
231         logger('accounts: ' . print_r($accounts,true),LOGGER_DATA);
232
233         $r = q("SELECT COUNT(id) as `count` FROM `register`");
234         $pending = $r[0]['count'];
235
236         $r = q("select count(*) as total from deliverq where 1");
237         $deliverq = (($r) ? $r[0]['total'] : 0);
238
239         $r = q("select count(*) as total from queue where 1");
240         $queue = (($r) ? $r[0]['total'] : 0);
241
242         // We can do better, but this is a quick queue status
243
244         $queues = array( 'label' => t('Message queues'), 'deliverq' => $deliverq, 'queue' => $queue );
245
246
247         $t = get_markup_template("admin_summary.tpl");
248         return replace_macros($t, array(
249                 '$title' => t('Administration'),
250                 '$page' => t('Summary'),
251                 '$queues' => $queues,
252                 '$users' => Array( t('Registered users'), $users),
253                 '$accounts' => $accounts,
254                 '$pending' => Array( t('Pending registrations'), $pending),
255                 '$version' => Array( t('Version'), FRIENDICA_VERSION),
256                 '$baseurl' => $a->get_baseurl(),
257                 '$platform' => FRIENDICA_PLATFORM,
258                 '$codename' => FRIENDICA_CODENAME,
259                 '$build' =>  get_config('system','build'),
260                 '$plugins' => Array( t('Active plugins'), $a->plugins )
261         ));
262 }
263
264
265 /**
266  * Admin Site Page
267  *  @param App $a
268  */
269 function admin_page_site_post(&$a){
270         if (!x($_POST,"page_site")){
271                 return;
272         }
273
274         check_form_security_token_redirectOnErr('/admin/site', 'admin_site');
275
276         // relocate
277         if (x($_POST,'relocate') && x($_POST,'relocate_url') && $_POST['relocate_url']!=""){
278                 $new_url = $_POST['relocate_url'];
279                 $new_url = rtrim($new_url,"/");
280
281                 $parsed = @parse_url($new_url);
282                 if (!$parsed || (!x($parsed,'host') || !x($parsed,'scheme'))) {
283                         notice(t("Can not parse base url. Must have at least <scheme>://<domain>"));
284                         goaway($a->get_baseurl(true) . '/admin/site' );
285                 }
286
287                 /* steps:
288                  * replace all "baseurl" to "new_url" in config, profile, term, items and contacts
289                  * send relocate for every local user
290                  * */
291
292                 $old_url = $a->get_baseurl(true);
293
294                 function update_table($table_name, $fields, $old_url, $new_url) {
295                         global $db, $a;
296
297                         $dbold = dbesc($old_url);
298                         $dbnew = dbesc($new_url);
299
300                         $upd = array();
301                         foreach ($fields as $f) {
302                                 $upd[] = "`$f` = REPLACE(`$f`, '$dbold', '$dbnew')";
303                         }
304
305                         $upds = implode(", ", $upd);
306
307
308
309                         $q = sprintf("UPDATE %s SET %s;", $table_name, $upds);
310                         $r = q($q);
311                         if (!$r) {
312                                 notice( "Failed updating '$table_name': " . $db->error );
313                                 goaway($a->get_baseurl(true) . '/admin/site' );
314                         }
315                 }
316
317                 // update tables
318                 update_table("profile", array('photo', 'thumb'), $old_url, $new_url);
319                 update_table("term", array('url'), $old_url, $new_url);
320                 update_table("contact", array('photo','thumb','micro','url','nurl','request','notify','poll','confirm','poco'), $old_url, $new_url);
321                 update_table("unique_contacts", array('url'), $old_url, $new_url);
322                 update_table("item", array('owner-link','owner-avatar','author-name','author-link','author-avatar','body','plink','tag'), $old_url, $new_url);
323
324                 // update config
325                 $a->set_baseurl($new_url);
326                 set_config('system','url',$new_url);
327
328                 // send relocate
329                 $users = q("SELECT uid FROM user WHERE account_removed = 0 AND account_expired = 0");
330
331                 foreach ($users as $user) {
332                         proc_run('php', 'include/notifier.php', 'relocate', $user['uid']);
333                 }
334
335                 info("Relocation started. Could take a while to complete.");
336
337                 goaway($a->get_baseurl(true) . '/admin/site' );
338         }
339         // end relocate
340
341         $sitename               =       ((x($_POST,'sitename'))                 ? notags(trim($_POST['sitename']))              : '');
342         $hostname               =       ((x($_POST,'hostname'))                 ? notags(trim($_POST['hostname']))              : '');
343         $sender_email           =       ((x($_POST,'sender_email'))             ? notags(trim($_POST['sender_email']))          : '');
344         $banner                 =       ((x($_POST,'banner'))                   ? trim($_POST['banner'])                        : false);
345         $shortcut_icon          =       ((x($_POST,'shortcut_icon'))            ? notags(trim($_POST['shortcut_icon']))         : '');
346         $touch_icon             =       ((x($_POST,'touch_icon'))               ? notags(trim($_POST['touch_icon']))            : '');
347         $info                   =       ((x($_POST,'info'))                     ? trim($_POST['info'])                  : false);
348         $language               =       ((x($_POST,'language'))                 ? notags(trim($_POST['language']))              : '');
349         $theme                  =       ((x($_POST,'theme'))                    ? notags(trim($_POST['theme']))                 : '');
350         $theme_mobile           =       ((x($_POST,'theme_mobile'))             ? notags(trim($_POST['theme_mobile']))          : '');
351         $maximagesize           =       ((x($_POST,'maximagesize'))             ? intval(trim($_POST['maximagesize']))          :  0);
352         $maximagelength         =       ((x($_POST,'maximagelength'))           ? intval(trim($_POST['maximagelength']))        :  MAX_IMAGE_LENGTH);
353         $jpegimagequality       =       ((x($_POST,'jpegimagequality'))         ? intval(trim($_POST['jpegimagequality']))      :  JPEG_QUALITY);
354
355
356         $register_policy        =       ((x($_POST,'register_policy'))          ? intval(trim($_POST['register_policy']))       :  0);
357         $daily_registrations    =       ((x($_POST,'max_daily_registrations'))  ? intval(trim($_POST['max_daily_registrations']))       :0);
358         $abandon_days           =       ((x($_POST,'abandon_days'))             ? intval(trim($_POST['abandon_days']))          :  0);
359
360         $register_text          =       ((x($_POST,'register_text'))            ? notags(trim($_POST['register_text']))         : '');
361
362         $allowed_sites          =       ((x($_POST,'allowed_sites'))            ? notags(trim($_POST['allowed_sites']))         : '');
363         $allowed_email          =       ((x($_POST,'allowed_email'))            ? notags(trim($_POST['allowed_email']))         : '');
364         $block_public           =       ((x($_POST,'block_public'))             ? True                                          : False);
365         $force_publish          =       ((x($_POST,'publish_all'))              ? True                                          : False);
366         $global_directory       =       ((x($_POST,'directory_submit_url'))     ? notags(trim($_POST['directory_submit_url']))  : '');
367         $thread_allow           =       ((x($_POST,'thread_allow'))             ? True                                          : False);
368         $newuser_private                =       ((x($_POST,'newuser_private'))          ? True                                          : False);
369         $enotify_no_content             =       ((x($_POST,'enotify_no_content'))       ? True                                          : False);
370         $private_addons                 =       ((x($_POST,'private_addons'))           ? True                                          : False);
371         $disable_embedded               =       ((x($_POST,'disable_embedded'))         ? True                                          : False);
372         $allow_users_remote_self        =       ((x($_POST,'allow_users_remote_self'))          ? True                                          : False);
373
374         $no_multi_reg           =       ((x($_POST,'no_multi_reg'))             ? True                                          : False);
375         $no_openid              =       !((x($_POST,'no_openid'))               ? True                                          : False);
376         $no_regfullname         =       !((x($_POST,'no_regfullname'))          ? True                                          : False);
377         $no_utf                 =       !((x($_POST,'no_utf'))                  ? True                                          : False);
378         $community_page_style   =       ((x($_POST,'community_page_style'))     ? intval(trim($_POST['community_page_style']))  : 0);
379         $max_author_posts_community_page        =       ((x($_POST,'max_author_posts_community_page'))  ? intval(trim($_POST['max_author_posts_community_page']))       : 0);
380
381         $verifyssl              =       ((x($_POST,'verifyssl'))                ? True                                          : False);
382         $proxyuser              =       ((x($_POST,'proxyuser'))                ? notags(trim($_POST['proxyuser']))             : '');
383         $proxy                  =       ((x($_POST,'proxy'))                    ? notags(trim($_POST['proxy']))                 : '');
384         $timeout                =       ((x($_POST,'timeout'))                  ? intval(trim($_POST['timeout']))               : 60);
385         $delivery_interval      =       ((x($_POST,'delivery_interval'))        ? intval(trim($_POST['delivery_interval']))     : 0);
386         $poll_interval          =       ((x($_POST,'poll_interval'))            ? intval(trim($_POST['poll_interval']))         : 0);
387         $maxloadavg             =       ((x($_POST,'maxloadavg'))               ? intval(trim($_POST['maxloadavg']))            : 50);
388         $maxloadavg_frontend    =       ((x($_POST,'maxloadavg_frontend'))      ? intval(trim($_POST['maxloadavg_frontend']))   : 50);
389         $poco_completion        =       ((x($_POST,'poco_completion'))          ? intval(trim($_POST['poco_completion']))       : false);
390         $poco_discovery         =       ((x($_POST,'poco_discovery'))           ? intval(trim($_POST['poco_discovery']))        : 0);
391         $poco_discovery_since   =       ((x($_POST,'poco_discovery_since'))     ? intval(trim($_POST['poco_discovery_since']))  : 30);
392         $poco_local_search      =       ((x($_POST,'poco_local_search'))        ? intval(trim($_POST['poco_local_search']))     : false);
393         $nodeinfo               =       ((x($_POST,'nodeinfo'))                 ? intval(trim($_POST['nodeinfo']))              : false);
394         $dfrn_only              =       ((x($_POST,'dfrn_only'))                ? True                                          : False);
395         $ostatus_disabled       =       !((x($_POST,'ostatus_disabled'))        ? True                                          : False);
396         $ostatus_poll_interval  =       ((x($_POST,'ostatus_poll_interval'))    ? intval(trim($_POST['ostatus_poll_interval'])) :  0);
397         $diaspora_enabled       =       ((x($_POST,'diaspora_enabled'))         ? True                                          : False);
398         $ssl_policy             =       ((x($_POST,'ssl_policy'))               ? intval($_POST['ssl_policy'])                  : 0);
399         $force_ssl              =       ((x($_POST,'force_ssl'))                ? True                                          : False);
400         $old_share              =       ((x($_POST,'old_share'))                ? True                                          : False);
401         $hide_help              =       ((x($_POST,'hide_help'))                ? True                                          : False);
402         $suppress_language      =       ((x($_POST,'suppress_language'))        ? True                                          : False);
403         $suppress_tags          =       ((x($_POST,'suppress_tags'))            ? True                                          : False);
404         $use_fulltext_engine    =       ((x($_POST,'use_fulltext_engine'))      ? True                                          : False);
405         $itemcache              =       ((x($_POST,'itemcache'))                ? notags(trim($_POST['itemcache']))             : '');
406         $itemcache_duration     =       ((x($_POST,'itemcache_duration'))       ? intval($_POST['itemcache_duration'])          : 0);
407         $max_comments           =       ((x($_POST,'max_comments'))             ? intval($_POST['max_comments'])                : 0);
408         $lockpath               =       ((x($_POST,'lockpath'))                 ? notags(trim($_POST['lockpath']))              : '');
409         $temppath               =       ((x($_POST,'temppath'))                 ? notags(trim($_POST['temppath']))              : '');
410         $basepath               =       ((x($_POST,'basepath'))                 ? notags(trim($_POST['basepath']))              : '');
411         $singleuser             =       ((x($_POST,'singleuser'))               ? notags(trim($_POST['singleuser']))            : '');
412         $proxy_disabled         =       ((x($_POST,'proxy_disabled'))           ? True                                          : False);
413         $old_pager              =       ((x($_POST,'old_pager'))                ? True                                          : False);
414         $only_tag_search        =       ((x($_POST,'only_tag_search'))          ? True                                          : False);
415         $rino                   =       ((x($_POST,'rino'))                             ? intval($_POST['rino'])                                : 0);
416         $embedly                =       ((x($_POST,'embedly'))                  ? notags(trim($_POST['embedly']))               : '');
417
418
419         if($ssl_policy != intval(get_config('system','ssl_policy'))) {
420                 if($ssl_policy == SSL_POLICY_FULL) {
421                         q("update `contact` set
422                                 `url`     = replace(`url`    , 'http:' , 'https:'),
423                                 `photo`   = replace(`photo`  , 'http:' , 'https:'),
424                                 `thumb`   = replace(`thumb`  , 'http:' , 'https:'),
425                                 `micro`   = replace(`micro`  , 'http:' , 'https:'),
426                                 `request` = replace(`request`, 'http:' , 'https:'),
427                                 `notify`  = replace(`notify` , 'http:' , 'https:'),
428                                 `poll`    = replace(`poll`   , 'http:' , 'https:'),
429                                 `confirm` = replace(`confirm`, 'http:' , 'https:'),
430                                 `poco`    = replace(`poco`   , 'http:' , 'https:')
431                                 where `self` = 1"
432                         );
433                         q("update `profile` set
434                                 `photo`   = replace(`photo`  , 'http:' , 'https:'),
435                                 `thumb`   = replace(`thumb`  , 'http:' , 'https:')
436                                 where 1 "
437                         );
438                 }
439                 elseif($ssl_policy == SSL_POLICY_SELFSIGN) {
440                         q("update `contact` set
441                                 `url`     = replace(`url`    , 'https:' , 'http:'),
442                                 `photo`   = replace(`photo`  , 'https:' , 'http:'),
443                                 `thumb`   = replace(`thumb`  , 'https:' , 'http:'),
444                                 `micro`   = replace(`micro`  , 'https:' , 'http:'),
445                                 `request` = replace(`request`, 'https:' , 'http:'),
446                                 `notify`  = replace(`notify` , 'https:' , 'http:'),
447                                 `poll`    = replace(`poll`   , 'https:' , 'http:'),
448                                 `confirm` = replace(`confirm`, 'https:' , 'http:'),
449                                 `poco`    = replace(`poco`   , 'https:' , 'http:')
450                                 where `self` = 1"
451                         );
452                         q("update `profile` set
453                                 `photo`   = replace(`photo`  , 'https:' , 'http:'),
454                                 `thumb`   = replace(`thumb`  , 'https:' , 'http:')
455                                 where 1 "
456                         );
457                 }
458         }
459         set_config('system','ssl_policy',$ssl_policy);
460         set_config('system','delivery_interval',$delivery_interval);
461         set_config('system','poll_interval',$poll_interval);
462         set_config('system','maxloadavg',$maxloadavg);
463         set_config('system','maxloadavg_frontend',$maxloadavg_frontend);
464         set_config('system','poco_completion',$poco_completion);
465         set_config('system','poco_discovery',$poco_discovery);
466         set_config('system','poco_discovery_since',$poco_discovery_since);
467         set_config('system','poco_local_search',$poco_local_search);
468         set_config('system','nodeinfo',$nodeinfo);
469         set_config('config','sitename',$sitename);
470         set_config('config','hostname',$hostname);
471         set_config('config','sender_email', $sender_email);
472         set_config('system','suppress_language',$suppress_language);
473         set_config('system','suppress_tags',$suppress_tags);
474         set_config('system','shortcut_icon',$shortcut_icon);
475         set_config('system','touch_icon',$touch_icon);
476
477         if ($banner==""){
478                 // don't know why, but del_config doesn't work...
479                 q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
480                         dbesc("system"),
481                         dbesc("banner")
482                 );
483         } else {
484                 set_config('system','banner', $banner);
485         }
486         if ($info=="") {
487                 del_config('config','info');
488         } else {
489                 set_config('config','info',$info);
490         }
491         set_config('system','language', $language);
492         set_config('system','theme', $theme);
493         if ( $theme_mobile === '---' ) {
494                 del_config('system','mobile-theme');
495         } else {
496                 set_config('system','mobile-theme', $theme_mobile);
497                 }
498                 if ( $singleuser === '---' ) {
499                         del_config('system','singleuser');
500                 } else {
501                         set_config('system','singleuser', $singleuser);
502                 }
503         set_config('system','maximagesize', $maximagesize);
504         set_config('system','max_image_length', $maximagelength);
505         set_config('system','jpeg_quality', $jpegimagequality);
506
507         set_config('config','register_policy', $register_policy);
508         set_config('system','max_daily_registrations', $daily_registrations);
509         set_config('system','account_abandon_days', $abandon_days);
510         set_config('config','register_text', $register_text);
511         set_config('system','allowed_sites', $allowed_sites);
512         set_config('system','allowed_email', $allowed_email);
513         set_config('system','block_public', $block_public);
514         set_config('system','publish_all', $force_publish);
515         if ($global_directory==""){
516                 // don't know why, but del_config doesn't work...
517                 q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
518                         dbesc("system"),
519                         dbesc("directory_submit_url")
520                 );
521         } else {
522                 set_config('system','directory_submit_url', $global_directory);
523         }
524         set_config('system','thread_allow', $thread_allow);
525         set_config('system','newuser_private', $newuser_private);
526         set_config('system','enotify_no_content', $enotify_no_content);
527         set_config('system','disable_embedded', $disable_embedded);
528         set_config('system','allow_users_remote_self', $allow_users_remote_self);
529
530         set_config('system','block_extended_register', $no_multi_reg);
531         set_config('system','no_openid', $no_openid);
532         set_config('system','no_regfullname', $no_regfullname);
533         set_config('system','community_page_style', $community_page_style);
534         set_config('system','max_author_posts_community_page', $max_author_posts_community_page);
535         set_config('system','no_utf', $no_utf);
536         set_config('system','verifyssl', $verifyssl);
537         set_config('system','proxyuser', $proxyuser);
538         set_config('system','proxy', $proxy);
539         set_config('system','curl_timeout', $timeout);
540         set_config('system','dfrn_only', $dfrn_only);
541         set_config('system','ostatus_disabled', $ostatus_disabled);
542         set_config('system','ostatus_poll_interval', $ostatus_poll_interval);
543         set_config('system','diaspora_enabled', $diaspora_enabled);
544         set_config('config','private_addons', $private_addons);
545
546         set_config('system','force_ssl', $force_ssl);
547         set_config('system','old_share', $old_share);
548         set_config('system','hide_help', $hide_help);
549         set_config('system','use_fulltext_engine', $use_fulltext_engine);
550         set_config('system','itemcache', $itemcache);
551         set_config('system','itemcache_duration', $itemcache_duration);
552         set_config('system','max_comments', $max_comments);
553         set_config('system','lockpath', $lockpath);
554         set_config('system','temppath', $temppath);
555         set_config('system','basepath', $basepath);
556         set_config('system','proxy_disabled', $proxy_disabled);
557         set_config('system','old_pager', $old_pager);
558         set_config('system','only_tag_search', $only_tag_search);
559
560         set_config('system','rino_encrypt', $rino);
561
562         set_config('system','embedly', $embedly);
563
564
565         info( t('Site settings updated.') . EOL);
566         goaway($a->get_baseurl(true) . '/admin/site' );
567         return; // NOTREACHED
568
569 }
570
571 /**
572  * @param  App $a
573  * @return string
574  */
575 function admin_page_site(&$a) {
576
577         /* Installed langs */
578         $lang_choices = array();
579         $langs = glob('view/*/strings.php');
580
581         if(is_array($langs) && count($langs)) {
582                 if(! in_array('view/en/strings.php',$langs))
583                         $langs[] = 'view/en/';
584                 asort($langs);
585                 foreach($langs as $l) {
586                         $t = explode("/",$l);
587                         $lang_choices[$t[1]] = $t[1];
588                 }
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'],'UTF-8'),
694                 '$hostname'             => array('hostname', t("Host name"), $a->config['hostname'], ""),
695                 '$sender_email'         => array('sender_email', t("Sender Email"), $a->config['sender_email'], "The email address your server shall use to send notification emails from.", "", "", "email"),
696                 '$banner'               => array('banner', t("Banner/Logo"), $banner, ""),
697                 '$shortcut_icon'        => array('shortcut_icon', t("Shortcut icon"), get_config('system','shortcut_icon'),  "Link to an icon that will be used for browsers."),
698                 '$touch_icon'           => array('touch_icon', t("Touch icon"), get_config('system','touch_icon'),  "Link to an icon that will be used for tablets and mobiles."),
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_submit_url', t("Global directory update URL"), get_config('system','directory_submit_url'), t("URL to update the global directory. If this is not set, the global directory is completely unavailable to the application.")),
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_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),
748                 '$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),
749                 '$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.")),
750
751                 '$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.")),
752
753                 '$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.")),
754                 '$suppress_language'    => array('suppress_language', t("Suppress Language"), get_config('system','suppress_language'), t("Suppress language information in meta information about a posting.")),
755                 '$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.")),
756                 '$itemcache'            => array('itemcache', t("Path to item cache"), get_config('system','itemcache'), t("The item caches buffers generated bbcode and external images.")),
757                 '$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.")),
758                 '$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.")),
759                 '$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.")),
760                 '$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.")),
761                 '$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.")),
762                 '$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.")),
763                 '$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.")),
764                 '$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.")),
765
766                 '$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.")),
767
768                 '$rino'                 => array('rino', t("RINO Encryption"), intval(get_config('system','rino_encrypt')), t("Encryption layer between nodes."), array("Disabled", "RINO1 (deprecated)", "RINO2")),
769                 '$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.")),
770
771                 '$form_security_token' => get_form_security_token("admin_site")
772
773         ));
774
775 }
776
777
778 function admin_page_dbsync(&$a) {
779
780         $o = '';
781
782         if($a->argc > 3 && intval($a->argv[3]) && $a->argv[2] === 'mark') {
783                 set_config('database', 'update_' . intval($a->argv[3]), 'success');
784                 $curr = get_config('system','build');
785                 if(intval($curr) == intval($a->argv[3]))
786                         set_config('system','build',intval($curr) + 1);
787                 info( t('Update has been marked successful') . EOL);
788                 goaway($a->get_baseurl(true) . '/admin/dbsync');
789         }
790
791         if(($a->argc > 2) AND (intval($a->argv[2]) OR ($a->argv[2] === 'check'))) {
792                 require_once("include/dbstructure.php");
793                 $retval = update_structure(false, true);
794                 if (!$retval) {
795                         $o .= sprintf(t("Database structure update %s was successfully applied."), DB_UPDATE_VERSION)."<br />";
796                         set_config('database', 'dbupdate_'.DB_UPDATE_VERSION, 'success');
797                 } else
798                         $o .= sprintf(t("Executing of database structure update %s failed with error: %s"),
799                                         DB_UPDATE_VERSION, $retval)."<br />";
800                 if ($a->argv[2] === 'check')
801                         return $o;
802         }
803
804         if ($a->argc > 2 && intval($a->argv[2])) {
805                 require_once('update.php');
806                 $func = 'update_' . intval($a->argv[2]);
807                 if(function_exists($func)) {
808                         $retval = $func();
809                         if($retval === UPDATE_FAILED) {
810                                 $o .= sprintf(t("Executing %s failed with error: %s"), $func, $retval);
811                         }
812                         elseif($retval === UPDATE_SUCCESS) {
813                                 $o .= sprintf(t('Update %s was successfully applied.', $func));
814                                 set_config('database',$func, 'success');
815                         }
816                         else
817                                 $o .= sprintf(t('Update %s did not return a status. Unknown if it succeeded.'), $func);
818                 } else {
819                         $o .= sprintf(t('There was no additional update function %s that needed to be called.'), $func)."<br />";
820                         set_config('database',$func, 'success');
821                 }
822                 return $o;
823         }
824
825         $failed = array();
826         $r = q("select k, v from config where `cat` = 'database' ");
827         if(count($r)) {
828                 foreach($r as $rr) {
829                         $upd = intval(substr($rr['k'],7));
830                         if($upd < 1139 || $rr['v'] === 'success')
831                                 continue;
832                         $failed[] = $upd;
833                 }
834         }
835         if(! count($failed)) {
836                 $o = replace_macros(get_markup_template('structure_check.tpl'),array(
837                         '$base' => $a->get_baseurl(true),
838                         '$banner' => t('No failed updates.'),
839                         '$check' => t('Check database structure'),
840                 ));
841         } else {
842                 $o = replace_macros(get_markup_template('failed_updates.tpl'),array(
843                         '$base' => $a->get_baseurl(true),
844                         '$banner' => t('Failed Updates'),
845                         '$desc' => t('This does not include updates prior to 1139, which did not return a status.'),
846                         '$mark' => t('Mark success (if update was manually applied)'),
847                         '$apply' => t('Attempt to execute this update step automatically'),
848                         '$failed' => $failed
849                 ));
850         }
851
852         return $o;
853
854 }
855
856 /**
857  * Users admin page
858  *
859  * @param App $a
860  */
861 function admin_page_users_post(&$a){
862         $pending = ( x($_POST, 'pending') ? $_POST['pending'] : Array() );
863         $users = ( x($_POST, 'user') ? $_POST['user'] : Array() );
864         $nu_name = ( x($_POST, 'new_user_name') ? $_POST['new_user_name'] : '');
865         $nu_nickname = ( x($_POST, 'new_user_nickname') ? $_POST['new_user_nickname'] : '');
866         $nu_email = ( x($_POST, 'new_user_email') ? $_POST['new_user_email'] : '');
867
868         check_form_security_token_redirectOnErr('/admin/users', 'admin_users');
869
870         if (!($nu_name==="") && !($nu_email==="") && !($nu_nickname==="")) {
871                 require_once('include/user.php');
872
873                 $result = create_user( array('username'=>$nu_name, 'email'=>$nu_email, 'nickname'=>$nu_nickname, 'verified'=>1)  );
874                 if(! $result['success']) {
875                         notice($result['message']);
876                         return;
877                 }
878                 $nu = $result['user'];
879                 $preamble = deindent(t('
880                         Dear %1$s,
881                                 the administrator of %2$s has set up an account for you.'));
882                 $body = deindent(t('
883                         The login details are as follows:
884
885                         Site Location:  %1$s
886                         Login Name:             %2$s
887                         Password:               %3$s
888
889                         You may change your password from your account "Settings" page after logging
890                         in.
891
892                         Please take a few moments to review the other account settings on that page.
893
894                         You may also wish to add some basic information to your default profile
895                         (on the "Profiles" page) so that other people can easily find you.
896
897                         We recommend setting your full name, adding a profile photo,
898                         adding some profile "keywords" (very useful in making new friends) - and
899                         perhaps what country you live in; if you do not wish to be more specific
900                         than that.
901
902                         We fully respect your right to privacy, and none of these items are necessary.
903                         If you are new and do not know anybody here, they may help
904                         you to make some new and interesting friends.
905
906                         Thank you and welcome to %4$s.'));
907
908                 $preamble = sprintf($preamble, $nu['username'], $a->config['sitename']);
909                 $body = sprintf($body, $a->get_baseurl(), $nu['email'], $result['password'], $a->config['sitename']);
910
911                 notification(array(
912                         'type' => "SYSTEM_EMAIL",
913                         'to_email' => $nu['email'],
914                         'subject'=> sprintf( t('Registration details for %s'), $a->config['sitename']),
915                         'preamble'=> $preamble,
916                         'body' => $body));
917
918         }
919
920         if (x($_POST,'page_users_block')){
921                 foreach($users as $uid){
922                         q("UPDATE `user` SET `blocked`=1-`blocked` WHERE `uid`=%s",
923                                 intval( $uid )
924                         );
925                 }
926                 notice( sprintf( tt("%s user blocked/unblocked", "%s users blocked/unblocked", count($users)), count($users)) );
927         }
928         if (x($_POST,'page_users_delete')){
929                 require_once("include/Contact.php");
930                 foreach($users as $uid){
931                         user_remove($uid);
932                 }
933                 notice( sprintf( tt("%s user deleted", "%s users deleted", count($users)), count($users)) );
934         }
935
936         if (x($_POST,'page_users_approve')){
937                 require_once("mod/regmod.php");
938                 foreach($pending as $hash){
939                         user_allow($hash);
940                 }
941         }
942         if (x($_POST,'page_users_deny')){
943                 require_once("mod/regmod.php");
944                 foreach($pending as $hash){
945                         user_deny($hash);
946                 }
947         }
948         goaway($a->get_baseurl(true) . '/admin/users' );
949         return; // NOTREACHED
950 }
951
952 /**
953  * @param App $a
954  * @return string
955  */
956 function admin_page_users(&$a){
957         if ($a->argc>2) {
958                 $uid = $a->argv[3];
959                 $user = q("SELECT username, blocked FROM `user` WHERE `uid`=%d", intval($uid));
960                 if (count($user)==0){
961                         notice( 'User not found' . EOL);
962                         goaway($a->get_baseurl(true) . '/admin/users' );
963                         return ''; // NOTREACHED
964                 }
965                 switch($a->argv[2]){
966                         case "delete":{
967                                 check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
968                                 // delete user
969                                 require_once("include/Contact.php");
970                                 user_remove($uid);
971
972                                 notice( sprintf(t("User '%s' deleted"), $user[0]['username']) . EOL);
973                         }; break;
974                         case "block":{
975                                 check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
976                                 q("UPDATE `user` SET `blocked`=%d WHERE `uid`=%s",
977                                         intval( 1-$user[0]['blocked'] ),
978                                         intval( $uid )
979                                 );
980                                 notice( sprintf( ($user[0]['blocked']?t("User '%s' unblocked"):t("User '%s' blocked")) , $user[0]['username']) . EOL);
981                         }; break;
982                 }
983                 goaway($a->get_baseurl(true) . '/admin/users' );
984                 return ''; // NOTREACHED
985
986         }
987
988         /* get pending */
989         $pending = q("SELECT `register`.*, `contact`.`name`, `user`.`email`
990                                  FROM `register`
991                                  LEFT JOIN `contact` ON `register`.`uid` = `contact`.`uid`
992                                  LEFT JOIN `user` ON `register`.`uid` = `user`.`uid`;");
993
994
995         /* get users */
996
997         $total = q("SELECT count(*) as total FROM `user` where 1");
998         if(count($total)) {
999                 $a->set_pager_total($total[0]['total']);
1000                 $a->set_pager_itemspage(100);
1001         }
1002
1003
1004         $users = q("SELECT `user` . * , `contact`.`name` , `contact`.`url` , `contact`.`micro`, `lastitem`.`lastitem_date`, `user`.`account_expired`
1005                                 FROM
1006                                         (SELECT MAX(`item`.`changed`) as `lastitem_date`, `item`.`uid`
1007                                         FROM `item`
1008                                         WHERE `item`.`type` = 'wall'
1009                                         GROUP BY `item`.`uid`) AS `lastitem`
1010                                                  RIGHT OUTER JOIN `user` ON `user`.`uid` = `lastitem`.`uid`,
1011                                            `contact`
1012                                 WHERE
1013                                            `user`.`uid` = `contact`.`uid`
1014                                                 AND `user`.`verified` =1
1015                                         AND `contact`.`self` =1
1016                                 ORDER BY `contact`.`name` LIMIT %d, %d
1017                                 ",
1018                                 intval($a->pager['start']),
1019                                 intval($a->pager['itemspage'])
1020                                 );
1021
1022         $adminlist = explode(",", str_replace(" ", "", $a->config['admin_email']));
1023         $_setup_users = function ($e) use ($adminlist){
1024                 $accounts = Array(
1025                         t('Normal Account'),
1026                         t('Soapbox Account'),
1027                         t('Community/Celebrity Account'),
1028                                                 t('Automatic Friend Account')
1029                 );
1030                 $e['page-flags'] = $accounts[$e['page-flags']];
1031                 $e['register_date'] = relative_date($e['register_date']);
1032                 $e['login_date'] = relative_date($e['login_date']);
1033                 $e['lastitem_date'] = relative_date($e['lastitem_date']);
1034                 //$e['is_admin'] = ($e['email'] === $a->config['admin_email']);
1035                 $e['is_admin'] = in_array($e['email'], $adminlist);
1036                 $e['is_deletable'] = (intval($e['uid']) != local_user());
1037                 $e['deleted'] = ($e['account_removed']?relative_date($e['account_expires_on']):False);
1038                 return $e;
1039         };
1040         $users = array_map($_setup_users, $users);
1041
1042
1043         // Get rid of dashes in key names, Smarty3 can't handle them
1044         // and extracting deleted users
1045
1046         $tmp_users = Array();
1047         $deleted = Array();
1048
1049         while(count($users)) {
1050                 $new_user = Array();
1051                 foreach( array_pop($users) as $k => $v) {
1052                         $k = str_replace('-','_',$k);
1053                         $new_user[$k] = $v;
1054                 }
1055                 if($new_user['deleted']) {
1056                         array_push($deleted, $new_user);
1057                 }
1058                 else {
1059                         array_push($tmp_users, $new_user);
1060                 }
1061         }
1062         //Reversing the two array, and moving $tmp_users to $users
1063         array_reverse($deleted);
1064         while(count($tmp_users)) {
1065                 array_push($users, array_pop($tmp_users));
1066         }
1067
1068         $t = get_markup_template("admin_users.tpl");
1069         $o = replace_macros($t, array(
1070                 // strings //
1071                 '$title' => t('Administration'),
1072                 '$page' => t('Users'),
1073                 '$submit' => t('Add User'),
1074                 '$select_all' => t('select all'),
1075                 '$h_pending' => t('User registrations waiting for confirm'),
1076                 '$h_deleted' => t('User waiting for permanent deletion'),
1077                 '$th_pending' => array( t('Request date'), t('Name'), t('Email') ),
1078                 '$no_pending' =>  t('No registrations.'),
1079                 '$approve' => t('Approve'),
1080                 '$deny' => t('Deny'),
1081                 '$delete' => t('Delete'),
1082                 '$block' => t('Block'),
1083                 '$unblock' => t('Unblock'),
1084                 '$siteadmin' => t('Site admin'),
1085                 '$accountexpired' => t('Account expired'),
1086
1087                 '$h_users' => t('Users'),
1088                 '$h_newuser' => t('New User'),
1089                 '$th_deleted' => array( t('Name'), t('Email'), t('Register date'), t('Last login'), t('Last item'), t('Deleted since') ),
1090                 '$th_users' => array( t('Name'), t('Email'), t('Register date'), t('Last login'), t('Last item'),  t('Account') ),
1091
1092                 '$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?'),
1093                 '$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?'),
1094
1095                 '$form_security_token' => get_form_security_token("admin_users"),
1096
1097                 // values //
1098                 '$baseurl' => $a->get_baseurl(true),
1099
1100                 '$pending' => $pending,
1101                 'deleted' => $deleted,
1102                 '$users' => $users,
1103                 '$newusername'  => array('new_user_name', t("Name"), '', t("Name of the new user.")),
1104                 '$newusernickname'  => array('new_user_nickname', t("Nickname"), '', t("Nickname of the new user.")),
1105                 '$newuseremail'  => array('new_user_email', t("Email"), '', t("Email address of the new user."), '', '', 'email'),
1106         ));
1107         $o .= paginate($a);
1108         return $o;
1109 }
1110
1111
1112 /**
1113  * Plugins admin page
1114  *
1115  * @param App $a
1116  * @return string
1117  */
1118 function admin_page_plugins(&$a){
1119
1120         /**
1121          * Single plugin
1122          */
1123         if ($a->argc == 3){
1124                 $plugin = $a->argv[2];
1125                 if (!is_file("addon/$plugin/$plugin.php")){
1126                         notice( t("Item not found.") );
1127                         return '';
1128                 }
1129
1130                 if (x($_GET,"a") && $_GET['a']=="t"){
1131                         check_form_security_token_redirectOnErr('/admin/plugins', 'admin_themes', 't');
1132
1133                         // Toggle plugin status
1134                         $idx = array_search($plugin, $a->plugins);
1135                         if ($idx !== false){
1136                                 unset($a->plugins[$idx]);
1137                                 uninstall_plugin($plugin);
1138                                 info( sprintf( t("Plugin %s disabled."), $plugin ) );
1139                         } else {
1140                                 $a->plugins[] = $plugin;
1141                                 install_plugin($plugin);
1142                                 info( sprintf( t("Plugin %s enabled."), $plugin ) );
1143                         }
1144                         set_config("system","addon", implode(", ",$a->plugins));
1145                         goaway($a->get_baseurl(true) . '/admin/plugins' );
1146                         return ''; // NOTREACHED
1147                 }
1148                 // display plugin details
1149                 require_once('library/markdown.php');
1150
1151                 if (in_array($plugin, $a->plugins)){
1152                         $status="on"; $action= t("Disable");
1153                 } else {
1154                         $status="off"; $action= t("Enable");
1155                 }
1156
1157                 $readme=Null;
1158                 if (is_file("addon/$plugin/README.md")){
1159                         $readme = file_get_contents("addon/$plugin/README.md");
1160                         $readme = Markdown($readme);
1161                 } else if (is_file("addon/$plugin/README")){
1162                         $readme = "<pre>". file_get_contents("addon/$plugin/README") ."</pre>";
1163                 }
1164
1165                 $admin_form="";
1166                 if (is_array($a->plugins_admin) && in_array($plugin, $a->plugins_admin)){
1167                         @require_once("addon/$plugin/$plugin.php");
1168                         $func = $plugin.'_plugin_admin';
1169                         $func($a, $admin_form);
1170                 }
1171
1172                 $t = get_markup_template("admin_plugins_details.tpl");
1173
1174                 return replace_macros($t, array(
1175                         '$title' => t('Administration'),
1176                         '$page' => t('Plugins'),
1177                         '$toggle' => t('Toggle'),
1178                         '$settings' => t('Settings'),
1179                         '$baseurl' => $a->get_baseurl(true),
1180
1181                         '$plugin' => $plugin,
1182                         '$status' => $status,
1183                         '$action' => $action,
1184                         '$info' => get_plugin_info($plugin),
1185                         '$str_author' => t('Author: '),
1186                         '$str_maintainer' => t('Maintainer: '),
1187
1188                         '$admin_form' => $admin_form,
1189                         '$function' => 'plugins',
1190                         '$screenshot' => '',
1191                         '$readme' => $readme,
1192
1193                         '$form_security_token' => get_form_security_token("admin_themes"),
1194                 ));
1195         }
1196
1197
1198
1199         /**
1200          * List plugins
1201          */
1202
1203     if (x($_GET,"a") && $_GET['a']=="r"){
1204                 check_form_security_token_redirectOnErr($a->get_baseurl().'/admin/plugins', 'admin_themes', 't');
1205                 reload_plugins();
1206                 info("Plugins reloaded");
1207                 goaway($a->get_baseurl().'/admin/plugins');
1208         }
1209
1210         $plugins = array();
1211         $files = glob("addon/*/"); /* */
1212         if($files) {
1213                 foreach($files as $file) {
1214                         if (is_dir($file)){
1215                                 list($tmp, $id)=array_map("trim", explode("/",$file));
1216                                 $info = get_plugin_info($id);
1217                                 $show_plugin = true;
1218
1219                                 // If the addon is unsupported, then only show it, when it is enabled
1220                                 if ((strtolower($info["status"]) == "unsupported") AND !in_array($id,  $a->plugins))
1221                                         $show_plugin = false;
1222
1223                                 // Override the above szenario, when the admin really wants to see outdated stuff
1224                                 if (get_config("system", "show_unsupported_addons"))
1225                                         $show_plugin = true;
1226
1227                                 if ($show_plugin)
1228                                         $plugins[] = array($id, (in_array($id,  $a->plugins)?"on":"off") , $info);
1229                         }
1230                 }
1231         }
1232
1233         $t = get_markup_template("admin_plugins.tpl");
1234         return replace_macros($t, array(
1235                 '$title' => t('Administration'),
1236                 '$page' => t('Plugins'),
1237                 '$submit' => t('Save Settings'),
1238                 '$baseurl' => $a->get_baseurl(true),
1239                 '$function' => 'plugins',
1240                 '$plugins' => $plugins,
1241                 '$form_security_token' => get_form_security_token("admin_themes"),
1242         ));
1243 }
1244
1245 /**
1246  * @param array $themes
1247  * @param string $th
1248  * @param int $result
1249  */
1250 function toggle_theme(&$themes,$th,&$result) {
1251         for($x = 0; $x < count($themes); $x ++) {
1252                 if($themes[$x]['name'] === $th) {
1253                         if($themes[$x]['allowed']) {
1254                                 $themes[$x]['allowed'] = 0;
1255                                 $result = 0;
1256                         }
1257                         else {
1258                                 $themes[$x]['allowed'] = 1;
1259                                 $result = 1;
1260                         }
1261                 }
1262         }
1263 }
1264
1265 /**
1266  * @param array $themes
1267  * @param string $th
1268  * @return int
1269  */
1270 function theme_status($themes,$th) {
1271         for($x = 0; $x < count($themes); $x ++) {
1272                 if($themes[$x]['name'] === $th) {
1273                         if($themes[$x]['allowed']) {
1274                                 return 1;
1275                         }
1276                         else {
1277                                 return 0;
1278                         }
1279                 }
1280         }
1281         return 0;
1282 }
1283
1284
1285 /**
1286  * @param array $themes
1287  * @return string
1288  */
1289 function rebuild_theme_table($themes) {
1290         $o = '';
1291         if(count($themes)) {
1292                 foreach($themes as $th) {
1293                         if($th['allowed']) {
1294                                 if(strlen($o))
1295                                         $o .= ',';
1296                                 $o .= $th['name'];
1297                         }
1298                 }
1299         }
1300         return $o;
1301 }
1302
1303
1304 /**
1305  * Themes admin page
1306  *
1307  * @param App $a
1308  * @return string
1309  */
1310 function admin_page_themes(&$a){
1311
1312         $allowed_themes_str = get_config('system','allowed_themes');
1313         $allowed_themes_raw = explode(',',$allowed_themes_str);
1314         $allowed_themes = array();
1315         if(count($allowed_themes_raw))
1316                 foreach($allowed_themes_raw as $x)
1317                         if(strlen(trim($x)))
1318                                 $allowed_themes[] = trim($x);
1319
1320         $themes = array();
1321         $files = glob('view/theme/*'); /* */
1322         if($files) {
1323                 foreach($files as $file) {
1324                         $f = basename($file);
1325                         $is_experimental = intval(file_exists($file . '/experimental'));
1326                         $is_supported = 1-(intval(file_exists($file . '/unsupported')));
1327                         $is_allowed = intval(in_array($f,$allowed_themes));
1328
1329                         if ($is_allowed OR $is_supported OR get_config("system", "show_unsupported_themes"))
1330                                 $themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed);
1331                 }
1332         }
1333
1334         if(! count($themes)) {
1335                 notice( t('No themes found.'));
1336                 return '';
1337         }
1338
1339         /**
1340          * Single theme
1341          */
1342
1343         if ($a->argc == 3){
1344                 $theme = $a->argv[2];
1345                 if(! is_dir("view/theme/$theme")){
1346                         notice( t("Item not found.") );
1347                         return '';
1348                 }
1349
1350                 if (x($_GET,"a") && $_GET['a']=="t"){
1351                         check_form_security_token_redirectOnErr('/admin/themes', 'admin_themes', 't');
1352
1353                         // Toggle theme status
1354
1355                         toggle_theme($themes,$theme,$result);
1356                         $s = rebuild_theme_table($themes);
1357                         if($result) {
1358                                 install_theme($theme);
1359                                 info( sprintf('Theme %s enabled.',$theme));
1360                         }
1361                         else {
1362                                 uninstall_theme($theme);
1363                                 info( sprintf('Theme %s disabled.',$theme));
1364                         }
1365
1366                         set_config('system','allowed_themes',$s);
1367                         goaway($a->get_baseurl(true) . '/admin/themes' );
1368                         return ''; // NOTREACHED
1369                 }
1370
1371                 // display theme details
1372                 require_once('library/markdown.php');
1373
1374                 if (theme_status($themes,$theme)) {
1375                         $status="on"; $action= t("Disable");
1376                 } else {
1377                         $status="off"; $action= t("Enable");
1378                 }
1379
1380                 $readme=Null;
1381                 if (is_file("view/theme/$theme/README.md")){
1382                         $readme = file_get_contents("view/theme/$theme/README.md");
1383                         $readme = Markdown($readme);
1384                 } else if (is_file("view/theme/$theme/README")){
1385                         $readme = "<pre>". file_get_contents("view/theme/$theme/README") ."</pre>";
1386                 }
1387
1388                 $admin_form="";
1389                 if (is_file("view/theme/$theme/config.php")){
1390                         require_once("view/theme/$theme/config.php");
1391                         if(function_exists("theme_admin")){
1392                                 $admin_form = theme_admin($a);
1393                         }
1394
1395                 }
1396
1397                 $screenshot = array( get_theme_screenshot($theme), t('Screenshot'));
1398                 if(! stristr($screenshot[0],$theme))
1399                         $screenshot = null;
1400
1401                 $t = get_markup_template("admin_plugins_details.tpl");
1402                 return replace_macros($t, array(
1403                         '$title' => t('Administration'),
1404                         '$page' => t('Themes'),
1405                         '$toggle' => t('Toggle'),
1406                         '$settings' => t('Settings'),
1407                         '$baseurl' => $a->get_baseurl(true),
1408
1409                         '$plugin' => $theme,
1410                         '$status' => $status,
1411                         '$action' => $action,
1412                         '$info' => get_theme_info($theme),
1413                         '$function' => 'themes',
1414                         '$admin_form' => $admin_form,
1415                         '$str_author' => t('Author: '),
1416                         '$str_maintainer' => t('Maintainer: '),
1417                         '$screenshot' => $screenshot,
1418                         '$readme' => $readme,
1419
1420                         '$form_security_token' => get_form_security_token("admin_themes"),
1421                 ));
1422         }
1423
1424         /**
1425          * List themes
1426          */
1427
1428         $xthemes = array();
1429         if($themes) {
1430                 foreach($themes as $th) {
1431                         $xthemes[] = array($th['name'],(($th['allowed']) ? "on" : "off"), get_theme_info($th['name']));
1432                 }
1433         }
1434
1435         $t = get_markup_template("admin_plugins.tpl");
1436         return replace_macros($t, array(
1437                 '$title' => t('Administration'),
1438                 '$page' => t('Themes'),
1439                 '$submit' => t('Save Settings'),
1440                 '$baseurl' => $a->get_baseurl(true),
1441                 '$function' => 'themes',
1442                 '$plugins' => $xthemes,
1443                 '$experimental' => t('[Experimental]'),
1444                 '$unsupported' => t('[Unsupported]'),
1445                 '$form_security_token' => get_form_security_token("admin_themes"),
1446         ));
1447 }
1448
1449
1450 /**
1451  * Logs admin page
1452  *
1453  * @param App $a
1454  */
1455
1456 function admin_page_logs_post(&$a) {
1457         if (x($_POST,"page_logs")) {
1458                 check_form_security_token_redirectOnErr('/admin/logs', 'admin_logs');
1459
1460                 $logfile                =       ((x($_POST,'logfile'))          ? notags(trim($_POST['logfile']))       : '');
1461                 $debugging              =       ((x($_POST,'debugging'))        ? true                                                          : false);
1462                 $loglevel               =       ((x($_POST,'loglevel'))         ? intval(trim($_POST['loglevel']))      : 0);
1463
1464                 set_config('system','logfile', $logfile);
1465                 set_config('system','debugging',  $debugging);
1466                 set_config('system','loglevel', $loglevel);
1467
1468
1469         }
1470
1471         info( t("Log settings updated.") );
1472         goaway($a->get_baseurl(true) . '/admin/logs' );
1473         return; // NOTREACHED
1474 }
1475
1476 /**
1477  * @param App $a
1478  * @return string
1479  */
1480 function admin_page_logs(&$a){
1481
1482         $log_choices = Array(
1483                 LOGGER_NORMAL => 'Normal',
1484                 LOGGER_TRACE => 'Trace',
1485                 LOGGER_DEBUG => 'Debug',
1486                 LOGGER_DATA => 'Data',
1487                 LOGGER_ALL => 'All'
1488         );
1489
1490         $t = get_markup_template("admin_logs.tpl");
1491
1492         $f = get_config('system','logfile');
1493
1494         $data = '';
1495
1496         if(!file_exists($f)) {
1497                 $data = t("Error trying to open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f exist and is
1498 readable.");
1499         }
1500         else {
1501                 $fp = fopen($f, 'r');
1502                 if(!$fp) {
1503                         $data = t("Couldn't open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f is readable.");
1504                 }
1505                 else {
1506                         $fstat = fstat($fp);
1507                         $size = $fstat['size'];
1508                         if($size != 0)
1509                         {
1510                                 if($size > 5000000 || $size < 0)
1511                                         $size = 5000000;
1512                                 $seek = fseek($fp,0-$size,SEEK_END);
1513                                 if($seek === 0) {
1514                                         $data = escape_tags(fread($fp,$size));
1515                                         while(! feof($fp))
1516                                                 $data .= escape_tags(fread($fp,4096));
1517                                 }
1518                         }
1519                         fclose($fp);
1520                 }
1521         }
1522
1523         return replace_macros($t, array(
1524                 '$title' => t('Administration'),
1525                 '$page' => t('Logs'),
1526                 '$submit' => t('Save Settings'),
1527                 '$clear' => t('Clear'),
1528                 '$data' => $data,
1529                 '$baseurl' => $a->get_baseurl(true),
1530                 '$logname' =>  get_config('system','logfile'),
1531
1532                                                                         // name, label, value, help string, extra data...
1533                 '$debugging'            => array('debugging', t("Enable Debugging"),get_config('system','debugging'), ""),
1534                 '$logfile'                      => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your Friendica top-level directory.")),
1535                 '$loglevel'             => array('loglevel', t("Log level"), get_config('system','loglevel'), "", $log_choices),
1536
1537                 '$form_security_token' => get_form_security_token("admin_logs"),
1538         ));
1539 }
1540
1541 /**
1542  * @param App $a
1543  */
1544 function admin_page_remoteupdate_post(&$a) {
1545         // this function should be called via ajax post
1546         if(!is_site_admin()) {
1547                 return;
1548         }
1549
1550
1551         if (x($_POST,'remotefile') && $_POST['remotefile']!=""){
1552                 $remotefile = $_POST['remotefile'];
1553                 $ftpdata = (x($_POST['ftphost'])?$_POST:false);
1554                 doUpdate($remotefile, $ftpdata);
1555         } else {
1556                 echo "No remote file to download. Abort!";
1557         }
1558
1559         killme();
1560 }
1561
1562 /**
1563  * @param App $a
1564  * @return string
1565  */
1566 function admin_page_remoteupdate(&$a) {
1567         if(!is_site_admin()) {
1568                 return login(false);
1569         }
1570
1571         $canwrite = canWeWrite();
1572         $canftp = function_exists('ftp_connect');
1573
1574         $needupdate = true;
1575         $u = checkUpdate();
1576         if (!is_array($u)){
1577                 $needupdate = false;
1578                 $u = array('','','');
1579         }
1580
1581         $tpl = get_markup_template("admin_remoteupdate.tpl");
1582         return replace_macros($tpl, array(
1583                 '$baseurl' => $a->get_baseurl(true),
1584                 '$submit' => t("Update now"),
1585                 '$close' => t("Close"),
1586                 '$localversion' => FRIENDICA_VERSION,
1587                 '$remoteversion' => $u[1],
1588                 '$needupdate' => $needupdate,
1589                 '$canwrite' => $canwrite,
1590                 '$canftp'       => $canftp,
1591                 '$ftphost'      => array('ftphost', t("FTP Host"), '',''),
1592                 '$ftppath'      => array('ftppath', t("FTP Path"), '/',''),
1593                 '$ftpuser'      => array('ftpuser', t("FTP User"), '',''),
1594                 '$ftppwd'       => array('ftppwd', t("FTP Password"), '',''),
1595                 '$remotefile'=>array('remotefile','', $u['2'],''),
1596         ));
1597
1598 }