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