]> git.mxchange.org Git - friendica.git/blob - mod/admin.php
Merge pull request #644 from fermionic/20130303-no-embedding-private-images-option
[friendica.git] / mod / admin.php
1 <?php
2
3  /**
4   * Friendica admin
5   */
6 require_once("include/remoteupdate.php");
7
8
9 /**
10  * @param App $a
11  */
12 function admin_post(&$a){
13
14
15         if(!is_site_admin()) {
16                 return;
17         }
18
19         // do not allow a page manager to access the admin panel at all.
20
21         if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
22                 return;
23
24
25
26         // urls
27         if ($a->argc > 1){
28                 switch ($a->argv[1]){
29                         case 'site':
30                                 admin_page_site_post($a);
31                                 break;
32                         case 'users':
33                                 admin_page_users_post($a);
34                                 break;
35                         case 'plugins':
36                                 if ($a->argc > 2 && 
37                                         is_file("addon/".$a->argv[2]."/".$a->argv[2].".php")){
38                                                 @include_once("addon/".$a->argv[2]."/".$a->argv[2].".php");
39                                                 if(function_exists($a->argv[2].'_plugin_admin_post')) {
40                                                         $func = $a->argv[2].'_plugin_admin_post';
41                                                         $func($a);
42                                                 }
43                                 }
44                                 goaway($a->get_baseurl(true) . '/admin/plugins/' . $a->argv[2] );
45                                 return; // NOTREACHED
46                                 break;
47                         case 'themes':
48                                 $theme = $a->argv[2];
49                                 if (is_file("view/theme/$theme/config.php")){
50                                         require_once("view/theme/$theme/config.php");
51                                         if (function_exists("theme_admin_post")){
52                                                 theme_admin_post($a);
53                                         }
54                                 }
55                                 info(t('Theme settings updated.'));
56                                 if(is_ajax()) return;
57
58                                 goaway($a->get_baseurl(true) . '/admin/themes/' . $theme );
59                                 return;
60                                 break;
61                         case 'logs':
62                                 admin_page_logs_post($a);
63                                 break;
64                         case 'dbsync':
65                                 admin_page_dbsync_post($a);
66                                 break;
67                         case 'update':
68                                 admin_page_remoteupdate_post($a);
69                                 break;
70                 }
71         }
72
73         goaway($a->get_baseurl(true) . '/admin' );
74         return; // NOTREACHED   
75 }
76
77 /**
78  * @param App $a
79  * @return string
80  */
81 function admin_content(&$a) {
82
83         if(!is_site_admin()) {
84                 return login(false);
85         }
86
87         if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
88                 return "";
89
90         /**
91          * Side bar links
92          */
93
94         // array( url, name, extra css classes )
95         $aside = Array(
96                 'site'   =>     Array($a->get_baseurl(true)."/admin/site/", t("Site") , "site"),
97                 'users'  =>     Array($a->get_baseurl(true)."/admin/users/", t("Users") , "users"),
98                 'plugins'=>     Array($a->get_baseurl(true)."/admin/plugins/", t("Plugins") , "plugins"),
99                 'themes' =>     Array($a->get_baseurl(true)."/admin/themes/", t("Themes") , "themes"),
100                 'dbsync' => Array($a->get_baseurl(true)."/admin/dbsync/", t('DB updates'), "dbsync"),
101                 //'update' =>   Array($a->get_baseurl(true)."/admin/update/", t("Software Update") , "update")
102         );
103
104         /* get plugins admin page */
105
106         $r = q("SELECT * FROM `addon` WHERE `plugin_admin`=1");
107         $aside['plugins_admin']=Array();
108         foreach ($r as $h){
109                 $plugin =$h['name'];
110                 $aside['plugins_admin'][] = Array($a->get_baseurl(true)."/admin/plugins/".$plugin, $plugin, "plugin");
111                 // temp plugins with admin
112                 $a->plugins_admin[] = $plugin;
113         }
114
115         $aside['logs'] = Array($a->get_baseurl(true)."/admin/logs/", t("Logs"), "logs");
116
117         $t = get_markup_template("admin_aside.tpl");
118         $a->page['aside'] .= replace_macros( $t, array(
119                         '$admin' => $aside, 
120                         '$admtxt' => t('Admin'),
121                         '$plugadmtxt' => t('Plugin Features'),
122                         '$logtxt' => t('Logs'),
123                         '$h_pending' => t('User registrations waiting for confirmation'),
124                         '$admurl'=> $a->get_baseurl(true)."/admin/"
125         ));
126
127
128
129         /**
130          * Page content
131          */
132         $o = '';
133         // urls
134         if ($a->argc > 1){
135                 switch ($a->argv[1]){
136                         case 'site':
137                                 $o = admin_page_site($a);
138                                 break;
139                         case 'users':
140                                 $o = admin_page_users($a);
141                                 break;
142                         case 'plugins':
143                                 $o = admin_page_plugins($a);
144                                 break;
145                         case 'themes':
146                                 $o = admin_page_themes($a);
147                                 break;
148                         case 'logs':
149                                 $o = admin_page_logs($a);
150                                 break;
151                         case 'dbsync':
152                                 $o = admin_page_dbsync($a);
153                                 break;
154                         case 'update':
155                                 $o = admin_page_remoteupdate($a);
156                                 break;
157                         default:
158                                 notice( t("Item not found.") );
159                 }
160         } else {
161                 $o = admin_page_summary($a);
162         }
163
164         if(is_ajax()) {
165                 echo $o; 
166                 killme();
167                 return '';
168         } else {
169                 return $o;
170         }
171
172
173
174 /**
175  * Admin Summary Page
176  * @param App $a
177  * @return string
178  */
179 function admin_page_summary(&$a) {
180         $r = q("SELECT `page-flags`, COUNT(uid) as `count` FROM `user` GROUP BY `page-flags`");
181         $accounts = Array(
182                 Array( t('Normal Account'), 0),
183                 Array( t('Soapbox Account'), 0),
184                 Array( t('Community/Celebrity Account'), 0),
185                 Array( t('Automatic Friend Account'), 0),
186                 Array( t('Blog Account'), 0),
187                 Array( t('Private Forum'), 0)
188         );
189
190         $users=0;
191         foreach ($r as $u){ $accounts[$u['page-flags']][1] = $u['count']; $users+= $u['count']; }
192
193         logger('accounts: ' . print_r($accounts,true),LOGGER_DATA);
194
195         $r = q("SELECT COUNT(id) as `count` FROM `register`");
196         $pending = $r[0]['count'];
197                 
198         $r = q("select count(*) as total from deliverq where 1");
199         $deliverq = (($r) ? $r[0]['total'] : 0);
200
201         $r = q("select count(*) as total from queue where 1");
202         $queue = (($r) ? $r[0]['total'] : 0);
203
204         // We can do better, but this is a quick queue status
205
206         $queues = array( 'label' => t('Message queues'), 'deliverq' => $deliverq, 'queue' => $queue );
207
208
209         $t = get_markup_template("admin_summary.tpl");
210         return replace_macros($t, array(
211                 '$title' => t('Administration'),
212                 '$page' => t('Summary'),
213                 '$queues' => $queues,
214                 '$users' => Array( t('Registered users'), $users),
215                 '$accounts' => $accounts,
216                 '$pending' => Array( t('Pending registrations'), $pending),
217                 '$version' => Array( t('Version'), FRIENDICA_VERSION),
218                 '$build' =>  get_config('system','build'),
219                 '$plugins' => Array( t('Active plugins'), $a->plugins )
220         ));
221 }
222
223
224 /**
225  * Admin Site Page
226  *  @param App $a
227  */
228 function admin_page_site_post(&$a){
229         if (!x($_POST,"page_site")){
230                 return;
231         }
232
233         check_form_security_token_redirectOnErr('/admin/site', 'admin_site');
234
235         $sitename               =       ((x($_POST,'sitename'))                 ? notags(trim($_POST['sitename']))              : '');
236         $banner                 =       ((x($_POST,'banner'))                   ? trim($_POST['banner'])                        : false);
237         $language               =       ((x($_POST,'language'))                 ? notags(trim($_POST['language']))              : '');
238         $theme                  =       ((x($_POST,'theme'))                    ? notags(trim($_POST['theme']))                 : '');
239         $theme_mobile           =       ((x($_POST,'theme_mobile'))             ? notags(trim($_POST['theme_mobile']))          : '');
240         $maximagesize           =       ((x($_POST,'maximagesize'))             ? intval(trim($_POST['maximagesize']))          :  0);
241         $maximagelength         =       ((x($_POST,'maximagelength'))           ? intval(trim($_POST['maximagelength']))        :  MAX_IMAGE_LENGTH);
242         $jpegimagequality       =       ((x($_POST,'jpegimagequality'))         ? intval(trim($_POST['jpegimagequality']))      :  JPEG_QUALITY);
243
244
245         $register_policy        =       ((x($_POST,'register_policy'))          ? intval(trim($_POST['register_policy']))       :  0);
246         $daily_registrations    =       ((x($_POST,'max_daily_registrations'))  ? intval(trim($_POST['max_daily_registrations']))       :0);
247         $abandon_days           =       ((x($_POST,'abandon_days'))             ? intval(trim($_POST['abandon_days']))          :  0);
248
249         $register_text          =       ((x($_POST,'register_text'))            ? notags(trim($_POST['register_text']))         : '');
250
251         $allowed_sites          =       ((x($_POST,'allowed_sites'))            ? notags(trim($_POST['allowed_sites']))         : '');
252         $allowed_email          =       ((x($_POST,'allowed_email'))            ? notags(trim($_POST['allowed_email']))         : '');
253         $block_public           =       ((x($_POST,'block_public'))             ? True                                          : False);
254         $force_publish          =       ((x($_POST,'publish_all'))              ? True                                          : False);
255         $global_directory       =       ((x($_POST,'directory_submit_url'))     ? notags(trim($_POST['directory_submit_url']))  : '');
256         $thread_allow           =       ((x($_POST,'thread_allow'))             ? True                                          : False);
257         $newuser_private                =       ((x($_POST,'newuser_private'))          ? True                                          : False);
258         $enotify_no_content             =       ((x($_POST,'enotify_no_content'))       ? True                                          : False);
259         $private_addons                 =       ((x($_POST,'private_addons'))           ? True                                          : False);
260         $disable_embedded               =       ((x($_POST,'disable_embedded'))         ? True                                          : False);
261         
262         $no_multi_reg           =       ((x($_POST,'no_multi_reg'))             ? True                                          : False);
263         $no_openid              =       !((x($_POST,'no_openid'))               ? True                                          : False);
264         $no_regfullname         =       !((x($_POST,'no_regfullname'))          ? True                                          : False);
265         $no_utf                 =       !((x($_POST,'no_utf'))                  ? True                                          : False);
266         $no_community_page      =       !((x($_POST,'no_community_page'))       ? True                                          : False);
267
268         $verifyssl              =       ((x($_POST,'verifyssl'))                ? True                                          : False);
269         $proxyuser              =       ((x($_POST,'proxyuser'))                ? notags(trim($_POST['proxyuser']))             : '');
270         $proxy                  =       ((x($_POST,'proxy'))                    ? notags(trim($_POST['proxy']))                 : '');
271         $timeout                =       ((x($_POST,'timeout'))                  ? intval(trim($_POST['timeout']))               : 60);
272         $delivery_interval      =       ((x($_POST,'delivery_interval'))        ? intval(trim($_POST['delivery_interval']))     : 0);
273         $poll_interval          =       ((x($_POST,'poll_interval'))            ? intval(trim($_POST['poll_interval']))         : 0);
274         $maxloadavg             =       ((x($_POST,'maxloadavg'))               ? intval(trim($_POST['maxloadavg']))            : 50);
275         $dfrn_only              =       ((x($_POST,'dfrn_only'))                ? True                                          : False);
276         $ostatus_disabled       =       !((x($_POST,'ostatus_disabled'))        ? True                                          : False);
277         $diaspora_enabled       =       ((x($_POST,'diaspora_enabled'))         ? True                                          : False);
278         $ssl_policy             =       ((x($_POST,'ssl_policy'))               ? intval($_POST['ssl_policy'])                  : 0);
279         $new_share              =       ((x($_POST,'new_share'))                ? True                                          : False);
280         $hide_help              =       ((x($_POST,'hide_help'))                ? True                                          : False);
281         $use_fulltext_engine    =       ((x($_POST,'use_fulltext_engine'))      ? True                                          : False);
282         $itemcache              =       ((x($_POST,'itemcache'))                ? notags(trim($_POST['itemcache']))             : '');
283         $itemcache_duration     =       ((x($_POST,'itemcache_duration'))       ? intval($_POST['itemcache_duration'])          : 0);
284         $lockpath               =       ((x($_POST,'lockpath'))                 ? notags(trim($_POST['lockpath']))              : '');
285         $temppath               =       ((x($_POST,'temppath'))                 ? notags(trim($_POST['temppath']))              : '');
286         $basepath               =       ((x($_POST,'basepath'))                 ? notags(trim($_POST['basepath']))              : '');
287         $singleuser             =       ((x($_POST,'singleuser'))               ? notags(trim($_POST['singleuser']))            : '');
288         if($ssl_policy != intval(get_config('system','ssl_policy'))) {
289                 if($ssl_policy == SSL_POLICY_FULL) {
290                         q("update `contact` set 
291                                 `url`     = replace(`url`    , 'http:' , 'https:'),
292                                 `photo`   = replace(`photo`  , 'http:' , 'https:'),
293                                 `thumb`   = replace(`thumb`  , 'http:' , 'https:'),
294                                 `micro`   = replace(`micro`  , 'http:' , 'https:'),
295                                 `request` = replace(`request`, 'http:' , 'https:'),
296                                 `notify`  = replace(`notify` , 'http:' , 'https:'),
297                                 `poll`    = replace(`poll`   , 'http:' , 'https:'),
298                                 `confirm` = replace(`confirm`, 'http:' , 'https:'),
299                                 `poco`    = replace(`poco`   , 'http:' , 'https:')
300                                 where `self` = 1"
301                         );
302                         q("update `profile` set 
303                                 `photo`   = replace(`photo`  , 'http:' , 'https:'),
304                                 `thumb`   = replace(`thumb`  , 'http:' , 'https:')
305                                 where 1 "
306                         );
307                 }
308                 elseif($ssl_policy == SSL_POLICY_SELFSIGN) {
309                         q("update `contact` set 
310                                 `url`     = replace(`url`    , 'https:' , 'http:'),
311                                 `photo`   = replace(`photo`  , 'https:' , 'http:'),
312                                 `thumb`   = replace(`thumb`  , 'https:' , 'http:'),
313                                 `micro`   = replace(`micro`  , 'https:' , 'http:'),
314                                 `request` = replace(`request`, 'https:' , 'http:'),
315                                 `notify`  = replace(`notify` , 'https:' , 'http:'),
316                                 `poll`    = replace(`poll`   , 'https:' , 'http:'),
317                                 `confirm` = replace(`confirm`, 'https:' , 'http:'),
318                                 `poco`    = replace(`poco`   , 'https:' , 'http:')
319                                 where `self` = 1"
320                         );
321                         q("update `profile` set 
322                                 `photo`   = replace(`photo`  , 'https:' , 'http:'),
323                                 `thumb`   = replace(`thumb`  , 'https:' , 'http:')
324                                 where 1 "
325                         );
326                 }
327         }
328         set_config('system','ssl_policy',$ssl_policy);
329         set_config('system','delivery_interval',$delivery_interval);
330         set_config('system','poll_interval',$poll_interval);
331         set_config('system','maxloadavg',$maxloadavg);
332         set_config('config','sitename',$sitename);
333         if ($banner==""){
334                 // don't know why, but del_config doesn't work...
335                 q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
336                         dbesc("system"),
337                         dbesc("banner")
338                 );
339         } else {
340                 set_config('system','banner', $banner);
341         }
342         set_config('system','language', $language);
343         set_config('system','theme', $theme);
344         if ( $theme_mobile === '---' ) {
345                 del_config('system','mobile-theme');
346         } else {
347                 set_config('system','mobile-theme', $theme_mobile);
348         }
349         if ( $singleuser === '---' ) {
350             del_config('system','singleuser');
351         } else {
352             set_config('system','singleuser', $singleuser);
353         }
354         set_config('system','maximagesize', $maximagesize);
355         set_config('system','max_image_length', $maximagelength);
356         set_config('system','jpeg_quality', $jpegimagequality);
357         
358         set_config('config','register_policy', $register_policy);
359         set_config('system','max_daily_registrations', $daily_registrations);
360         set_config('system','account_abandon_days', $abandon_days);
361         set_config('config','register_text', $register_text);
362         set_config('system','allowed_sites', $allowed_sites);
363         set_config('system','allowed_email', $allowed_email);
364         set_config('system','block_public', $block_public);
365         set_config('system','publish_all', $force_publish);
366         if ($global_directory==""){
367                 // don't know why, but del_config doesn't work...
368                 q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
369                         dbesc("system"),
370                         dbesc("directory_submit_url")
371                 );
372         } else {
373                 set_config('system','directory_submit_url', $global_directory);
374         }
375         set_config('system','thread_allow', $thread_allow);
376         set_config('system','newuser_private', $newuser_private);
377         set_config('system','enotify_no_content', $enotify_no_content);
378         set_config('system','disable_embedded', $disable_embedded);
379
380         set_config('system','block_extended_register', $no_multi_reg);
381         set_config('system','no_openid', $no_openid);
382         set_config('system','no_regfullname', $no_regfullname);
383         set_config('system','no_community_page', $no_community_page);
384         set_config('system','no_utf', $no_utf);
385         set_config('system','verifyssl', $verifyssl);
386         set_config('system','proxyuser', $proxyuser);
387         set_config('system','proxy', $proxy);
388         set_config('system','curl_timeout', $timeout);
389         set_config('system','dfrn_only', $dfrn_only);
390         set_config('system','ostatus_disabled', $ostatus_disabled);
391         set_config('system','diaspora_enabled', $diaspora_enabled);
392         set_config('config','private_addons', $private_addons);
393         
394         set_config('system','new_share', $new_share);
395         set_config('system','hide_help', $hide_help);
396         set_config('system','use_fulltext_engine', $use_fulltext_engine);
397         set_config('system','itemcache', $itemcache);
398         set_config('system','itemcache_duration', $itemcache_duration);
399         set_config('system','lockpath', $lockpath);
400         set_config('system','temppath', $temppath);
401         set_config('system','basepath', $basepath);
402         
403         info( t('Site settings updated.') . EOL);
404         goaway($a->get_baseurl(true) . '/admin/site' );
405         return; // NOTREACHED
406
407 }
408
409 /**
410  * @param  App $a
411  * @return string
412  */
413 function admin_page_site(&$a) {
414         
415         /* Installed langs */
416         $lang_choices = array();
417         $langs = glob('view/*/strings.php');
418         
419         if(is_array($langs) && count($langs)) {
420                 if(! in_array('view/en/strings.php',$langs))
421                         $langs[] = 'view/en/';
422                 asort($langs);
423                 foreach($langs as $l) {
424                         $t = explode("/",$l);
425                         $lang_choices[$t[1]] = $t[1];
426                 }
427         }
428         
429         /* Installed themes */
430         $theme_choices = array();
431         $theme_choices_mobile = array();
432         $theme_choices_mobile["---"] = t("No special theme for mobile devices");
433         $files = glob('view/theme/*');
434         if($files) {
435                 foreach($files as $file) {
436                         $f = basename($file);
437                         $theme_name = ((file_exists($file . '/experimental')) ?  sprintf("%s - \x28Experimental\x29", $f) : $f);
438             if (file_exists($file . '/mobile')) {
439                 $theme_choices_mobile[$f] = $theme_name;
440             }
441                 else {
442                 $theme_choices[$f] = $theme_name;
443                         }
444                 }
445         }
446
447         /* get user names to make the install a personal install of X */
448         $user_names = array();
449         $user_names['---'] = t('Multi user instance');
450         $users = q("SELECT username, nickname FROM `user`");
451         foreach ($users as $user) {
452             $user_names[$user['nickname']] = $user['username'];
453         }
454
455         /* Banner */
456         $banner = get_config('system','banner');
457         if($banner == false) 
458                 $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>';
459         $banner = htmlspecialchars($banner);
460
461         //echo "<pre>"; var_dump($lang_choices); die("</pre>");
462
463         /* Register policy */
464         $register_choices = Array(
465                 REGISTER_CLOSED => t("Closed"),
466                 REGISTER_APPROVE => t("Requires approval"),
467                 REGISTER_OPEN => t("Open")
468         ); 
469
470         $ssl_choices = array(
471                 SSL_POLICY_NONE => t("No SSL policy, links will track page SSL state"),
472                 SSL_POLICY_FULL => t("Force all links to use SSL"),
473                 SSL_POLICY_SELFSIGN => t("Self-signed certificate, use SSL for local links only (discouraged)")
474         );
475
476         $t = get_markup_template("admin_site.tpl");
477         return replace_macros($t, array(
478                 '$title' => t('Administration'),
479                 '$page' => t('Site'),
480                 '$submit' => t('Submit'),
481                 '$registration' => t('Registration'),
482                 '$upload' => t('File upload'),
483                 '$corporate' => t('Policies'),
484                 '$advanced' => t('Advanced'),
485                 '$performance' => t('Performance'),
486                 
487                 '$baseurl' => $a->get_baseurl(true),
488                 // name, label, value, help string, extra data...
489                 '$sitename'             => array('sitename', t("Site name"), htmlentities($a->config['sitename'], ENT_QUOTES), 'UTF-8'),
490                 '$banner'               => array('banner', t("Banner/Logo"), $banner, ""),
491                 '$language'             => array('language', t("System language"), get_config('system','language'), "", $lang_choices),
492                 '$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),
493                 '$theme_mobile'         => array('theme_mobile', t("Mobile system theme"), get_config('system','mobile-theme'), t("Theme for mobile devices"), $theme_choices_mobile),
494                 '$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),
495                 '$new_share'            => array('new_share', t("'Share' element"), get_config('system','new_share'), t("Activates the bbcode element 'share' for repeating items.")),
496                 '$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.")),
497                 '$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),
498                 '$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.")),
499                 '$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.")),
500                 '$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.")),
501
502                 '$register_policy'      => array('register_policy', t("Register policy"), $a->config['register_policy'], "", $register_choices),
503                 '$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.")),
504                 '$register_text'        => array('register_text', t("Register text"), htmlentities($a->config['register_text'], ENT_QUOTES, 'UTF-8'), t("Will be displayed prominently on the registration page.")),
505                 '$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.')),
506                 '$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")),
507                 '$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")),
508                 '$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.")),
509                 '$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.")),
510                 '$global_directory'     => array('directory_submit_url', t("Global directory update URL"), get_config('system','directory_submit_url'), t("URL to update the global directory. If this is not set, the global directory is completely unavailable to the application.")),
511                 '$thread_allow'         => array('thread_allow', t("Allow threaded items"), get_config('system','thread_allow'), t("Allow infinite level threading for items on this site.")),
512                 '$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.")),
513                 '$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.")),
514                 '$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.")),
515                 '$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.")),
516                 
517                 '$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.")),
518                 '$no_openid'            => array('no_openid', t("OpenID support"), !get_config('system','no_openid'), t("OpenID support for registration and logins.")),
519                 '$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")),
520                 '$no_utf'               => array('no_utf', t("UTF-8 Regular expressions"), !get_config('system','no_utf'), t("Use PHP UTF8 regular expressions")),
521                 '$no_community_page'    => array('no_community_page', t("Show Community Page"), !get_config('system','no_community_page'), t("Display a Community page showing all recent public postings on this site.")),
522                 '$ostatus_disabled'     => array('ostatus_disabled', t("Enable OStatus support"), !get_config('system','ostatus_disabled'), t("Provide built-in OStatus \x28identi.ca, status.net, etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed.")),    
523                 '$diaspora_enabled'     => array('diaspora_enabled', t("Enable Diaspora support"), get_config('system','diaspora_enabled'), t("Provide built-in Diaspora network compatibility.")),     
524                 '$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.")),
525                 '$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.")),
526                 '$proxyuser'            => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
527                 '$proxy'                => array('proxy', t("Proxy URL"), get_config('system','proxy'), ""),
528                 '$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).")),
529                 '$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.")),
530                 '$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.")),
531                 '$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.")),
532
533                 '$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.")),
534                 '$itemcache'            => array('itemcache', t("Path to item cache"), get_config('system','itemcache'), "The item caches buffers generated bbcode and external images."),
535                 '$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).")),
536                 '$lockpath'             => array('lockpath', t("Path for lock file"), get_config('system','lockpath'), "The lock file is used to avoid multiple pollers at one time. Only define a folder here."),
537                 '$temppath'             => array('temppath', t("Temp path"), get_config('system','temppath'), "If you have a restricted system where the webserver can't access the system temp path, enter another path here."),
538                 '$basepath'             => array('basepath', t("Base path to installation"), get_config('system','basepath'), "If the system cannot detect the correct path to your installation, enter the correct path here. This setting should only be set if you are using a restricted system and symbolic links to your webroot."),
539         '$form_security_token' => get_form_security_token("admin_site"),
540
541         ));
542
543 }
544
545
546 function admin_page_dbsync(&$a) {
547
548         $o = '';
549
550         if($a->argc > 3 && intval($a->argv[3]) && $a->argv[2] === 'mark') {
551                 set_config('database', 'update_' . intval($a->argv[3]), 'success');
552                 $curr = get_config('system','build');
553                 if(intval($curr) == intval($a->argv[3]))
554                         set_config('system','build',intval($curr) + 1);
555                 info( t('Update has been marked successful') . EOL);
556                 goaway($a->get_baseurl(true) . '/admin/dbsync');
557         }
558
559         if($a->argc > 2 && intval($a->argv[2])) {
560                 require_once('update.php');
561                 $func = 'update_' . intval($a->argv[2]);
562                 if(function_exists($func)) {
563                         $retval = $func();
564                         if($retval === UPDATE_FAILED) {
565                                 $o .= sprintf( t('Executing %s failed. Check system logs.'), $func); 
566                         }
567                         elseif($retval === UPDATE_SUCCESS) {
568                                 $o .= sprintf( t('Update %s was successfully applied.', $func));
569                                 set_config('database',$func, 'success');
570                         }
571                         else
572                                 $o .= sprintf( t('Update %s did not return a status. Unknown if it succeeded.'), $func);
573                 }
574                 else
575                         $o .= sprintf( t('Update function %s could not be found.'), $func);
576                 return $o;
577         }
578
579         $failed = array();
580         $r = q("select * from config where `cat` = 'database' ");
581         if(count($r)) {
582                 foreach($r as $rr) {
583                         $upd = intval(substr($rr['k'],7));
584                         if($upd < 1139 || $rr['v'] === 'success')
585                                 continue;
586                         $failed[] = $upd;
587                 }
588         }
589         if(! count($failed))
590                 return '<h3>' . t('No failed updates.') . '</h3>';
591
592         $o = replace_macros(get_markup_template('failed_updates.tpl'),array(
593                 '$base' => $a->get_baseurl(true),
594                 '$banner' => t('Failed Updates'),
595                 '$desc' => t('This does not include updates prior to 1139, which did not return a status.'),
596                 '$mark' => t('Mark success (if update was manually applied)'),
597                 '$apply' => t('Attempt to execute this update step automatically'),
598                 '$failed' => $failed
599         ));     
600
601         return $o;
602
603 }
604
605 /**
606  * Users admin page
607  *
608  * @param App $a
609  */
610 function admin_page_users_post(&$a){
611         $pending = ( x($_POST, 'pending') ? $_POST['pending'] : Array() );
612         $users = ( x($_POST, 'user') ? $_POST['user'] : Array() );
613
614     check_form_security_token_redirectOnErr('/admin/users', 'admin_users');
615
616         if (x($_POST,'page_users_block')){
617                 foreach($users as $uid){
618                         q("UPDATE `user` SET `blocked`=1-`blocked` WHERE `uid`=%s",
619                                 intval( $uid )
620                         );
621                 }
622                 notice( sprintf( tt("%s user blocked/unblocked", "%s users blocked/unblocked", count($users)), count($users)) );
623         }
624         if (x($_POST,'page_users_delete')){
625                 require_once("include/Contact.php");
626                 foreach($users as $uid){
627                         user_remove($uid);
628                 }
629                 notice( sprintf( tt("%s user deleted", "%s users deleted", count($users)), count($users)) );
630         }
631         
632         if (x($_POST,'page_users_approve')){
633                 require_once("mod/regmod.php");
634                 foreach($pending as $hash){
635                         user_allow($hash);
636                 }
637         }
638         if (x($_POST,'page_users_deny')){
639                 require_once("mod/regmod.php");
640                 foreach($pending as $hash){
641                         user_deny($hash);
642                 }
643         }
644         goaway($a->get_baseurl(true) . '/admin/users' );
645         return; // NOTREACHED   
646 }
647
648 /**
649  * @param App $a
650  * @return string
651  */
652 function admin_page_users(&$a){
653         if ($a->argc>2) {
654                 $uid = $a->argv[3];
655                 $user = q("SELECT * FROM `user` WHERE `uid`=%d", intval($uid));
656                 if (count($user)==0){
657                         notice( 'User not found' . EOL);
658                         goaway($a->get_baseurl(true) . '/admin/users' );
659                         return ''; // NOTREACHED
660                 }               
661                 switch($a->argv[2]){
662                         case "delete":{
663                 check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
664                                 // delete user
665                                 require_once("include/Contact.php");
666                                 user_remove($uid);
667                                 
668                                 notice( sprintf(t("User '%s' deleted"), $user[0]['username']) . EOL);
669                         }; break;
670                         case "block":{
671                 check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
672                                 q("UPDATE `user` SET `blocked`=%d WHERE `uid`=%s",
673                                         intval( 1-$user[0]['blocked'] ),
674                                         intval( $uid )
675                                 );
676                                 notice( sprintf( ($user[0]['blocked']?t("User '%s' unblocked"):t("User '%s' blocked")) , $user[0]['username']) . EOL);
677                         }; break;
678                 }
679                 goaway($a->get_baseurl(true) . '/admin/users' );
680                 return ''; // NOTREACHED
681                 
682         }
683         
684         /* get pending */
685         $pending = q("SELECT `register`.*, `contact`.`name`, `user`.`email`
686                                  FROM `register`
687                                  LEFT JOIN `contact` ON `register`.`uid` = `contact`.`uid`
688                                  LEFT JOIN `user` ON `register`.`uid` = `user`.`uid`;");
689         
690         
691         /* get users */
692
693         $total = q("SELECT count(*) as total FROM `user` where 1");
694         if(count($total)) {
695                 $a->set_pager_total($total[0]['total']);
696                 $a->set_pager_itemspage(100);
697         }
698         
699         
700         $users = q("SELECT `user` . * , `contact`.`name` , `contact`.`url` , `contact`.`micro`, `lastitem`.`lastitem_date`, `user`.`account_expired`
701                                 FROM
702                                         (SELECT MAX(`item`.`changed`) as `lastitem_date`, `item`.`uid`
703                                         FROM `item`
704                                         WHERE `item`.`type` = 'wall'
705                                         GROUP BY `item`.`uid`) AS `lastitem`
706                                                  RIGHT OUTER JOIN `user` ON `user`.`uid` = `lastitem`.`uid`,
707                                            `contact`
708                                 WHERE
709                                            `user`.`uid` = `contact`.`uid`
710                                                 AND `user`.`verified` =1
711                                         AND `contact`.`self` =1
712                                 ORDER BY `contact`.`name` LIMIT %d, %d
713                                 ",
714                                 intval($a->pager['start']),
715                                 intval($a->pager['itemspage'])
716                                 );
717                                         
718         function _setup_users($e){
719         $a = get_app();
720                 $accounts = Array(
721                         t('Normal Account'), 
722                         t('Soapbox Account'),
723                         t('Community/Celebrity Account'),
724                         t('Automatic Friend Account')
725                 );
726                 $e['page-flags'] = $accounts[$e['page-flags']];
727                 $e['register_date'] = relative_date($e['register_date']);
728                 $e['login_date'] = relative_date($e['login_date']);
729                 $e['lastitem_date'] = relative_date($e['lastitem_date']);
730         $e['is_admin'] = ($e['email'] === $a->config['admin_email']);
731                 return $e;
732         }
733         $users = array_map("_setup_users", $users);
734         
735         
736         // Get rid of dashes in key names, Smarty3 can't handle them
737         foreach($users as $key => $user) {
738                 $new_user = array();
739                 foreach($user as $k => $v) {
740                         $k = str_replace('-','_',$k);
741                         $new_user[$k] = $v;
742                 }
743                 $users[$key] = $new_user;
744         }
745
746         $t = get_markup_template("admin_users.tpl");
747         $o = replace_macros($t, array(
748                 // strings //
749                 '$title' => t('Administration'),
750                 '$page' => t('Users'),
751                 '$submit' => t('Submit'),
752                 '$select_all' => t('select all'),
753                 '$h_pending' => t('User registrations waiting for confirm'),
754                 '$th_pending' => array( t('Request date'), t('Name'), t('Email') ),
755                 '$no_pending' =>  t('No registrations.'),
756                 '$approve' => t('Approve'),
757                 '$deny' => t('Deny'),
758                 '$delete' => t('Delete'),
759                 '$block' => t('Block'),
760                 '$unblock' => t('Unblock'),
761         '$siteadmin' => t('Site admin'),
762         '$accountexpired' => t('Account expired'),
763                 
764                 '$h_users' => t('Users'),
765                 '$th_users' => array( t('Name'), t('Email'), t('Register date'), t('Last login'), t('Last item'),  t('Account') ),
766
767                 '$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?'),
768                 '$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?'),
769
770         '$form_security_token' => get_form_security_token("admin_users"),
771
772                 // values //
773                 '$baseurl' => $a->get_baseurl(true),
774
775                 '$pending' => $pending,
776                 '$users' => $users,
777         ));
778         $o .= paginate($a);
779         return $o;
780 }
781
782
783 /**
784  * Plugins admin page
785  *
786  * @param App $a
787  * @return string
788  */
789 function admin_page_plugins(&$a){
790
791         /**
792          * Single plugin
793          */
794         if ($a->argc == 3){
795                 $plugin = $a->argv[2];
796                 if (!is_file("addon/$plugin/$plugin.php")){
797                         notice( t("Item not found.") );
798                         return '';
799                 }
800
801                 if (x($_GET,"a") && $_GET['a']=="t"){
802                         check_form_security_token_redirectOnErr('/admin/plugins', 'admin_themes', 't');
803
804                         // Toggle plugin status
805                         $idx = array_search($plugin, $a->plugins);
806                         if ($idx !== false){
807                                 unset($a->plugins[$idx]);
808                                 uninstall_plugin($plugin);
809                                 info( sprintf( t("Plugin %s disabled."), $plugin ) );
810                         } else {
811                                 $a->plugins[] = $plugin;
812                                 install_plugin($plugin);
813                                 info( sprintf( t("Plugin %s enabled."), $plugin ) );
814                         }
815                         set_config("system","addon", implode(", ",$a->plugins));
816                         goaway($a->get_baseurl(true) . '/admin/plugins' );
817                         return ''; // NOTREACHED
818                 }
819                 // display plugin details
820                 require_once('library/markdown.php');
821
822                 if (in_array($plugin, $a->plugins)){
823                         $status="on"; $action= t("Disable");
824                 } else {
825                         $status="off"; $action= t("Enable");
826                 }
827
828                 $readme=Null;
829                 if (is_file("addon/$plugin/README.md")){
830                         $readme = file_get_contents("addon/$plugin/README.md");
831                         $readme = Markdown($readme);
832                 } else if (is_file("addon/$plugin/README")){
833                         $readme = "<pre>". file_get_contents("addon/$plugin/README") ."</pre>";
834                 }
835
836                 $admin_form="";
837                 if (is_array($a->plugins_admin) && in_array($plugin, $a->plugins_admin)){
838                         @require_once("addon/$plugin/$plugin.php");
839                         $func = $plugin.'_plugin_admin';
840                         $func($a, $admin_form);
841                 }
842
843                 $t = get_markup_template("admin_plugins_details.tpl");
844
845                 return replace_macros($t, array(
846                         '$title' => t('Administration'),
847                         '$page' => t('Plugins'),
848                         '$toggle' => t('Toggle'),
849                         '$settings' => t('Settings'),
850                         '$baseurl' => $a->get_baseurl(true),
851
852                         '$plugin' => $plugin,
853                         '$status' => $status,
854                         '$action' => $action,
855                         '$info' => get_plugin_info($plugin),
856                         '$str_author' => t('Author: '),
857                         '$str_maintainer' => t('Maintainer: '),
858
859                         '$admin_form' => $admin_form,
860                         '$function' => 'plugins',
861                         '$screenshot' => '',
862                         '$readme' => $readme,
863
864                         '$form_security_token' => get_form_security_token("admin_themes"),
865                 ));
866         }
867
868
869
870         /**
871          * List plugins
872          */
873
874         $plugins = array();
875         $files = glob("addon/*/");
876         if($files) {
877                 foreach($files as $file) {      
878                         if (is_dir($file)){
879                                 list($tmp, $id)=array_map("trim", explode("/",$file));
880                                 $info = get_plugin_info($id);
881                                 $plugins[] = array( $id, (in_array($id,  $a->plugins)?"on":"off") , $info);
882                         }
883                 }
884         }
885
886         $t = get_markup_template("admin_plugins.tpl");
887         return replace_macros($t, array(
888                 '$title' => t('Administration'),
889                 '$page' => t('Plugins'),
890                 '$submit' => t('Submit'),
891                 '$baseurl' => $a->get_baseurl(true),
892                 '$function' => 'plugins',       
893                 '$plugins' => $plugins,
894         '$form_security_token' => get_form_security_token("admin_themes"),
895         ));
896 }
897
898 /**
899  * @param array $themes
900  * @param string $th
901  * @param int $result
902  */
903 function toggle_theme(&$themes,$th,&$result) {
904         for($x = 0; $x < count($themes); $x ++) {
905                 if($themes[$x]['name'] === $th) {
906                         if($themes[$x]['allowed']) {
907                                 $themes[$x]['allowed'] = 0;
908                                 $result = 0;
909                         }
910                         else {
911                                 $themes[$x]['allowed'] = 1;
912                                 $result = 1;
913                         }
914                 }
915         }
916 }
917
918 /**
919  * @param array $themes
920  * @param string $th
921  * @return int
922  */
923 function theme_status($themes,$th) {
924         for($x = 0; $x < count($themes); $x ++) {
925                 if($themes[$x]['name'] === $th) {
926                         if($themes[$x]['allowed']) {
927                                 return 1;
928                         }
929                         else {
930                                 return 0;
931                         }
932                 }
933         }
934         return 0;
935 }
936
937
938 /**
939  * @param array $themes
940  * @return string
941  */
942 function rebuild_theme_table($themes) {
943         $o = '';
944         if(count($themes)) {
945                 foreach($themes as $th) {
946                         if($th['allowed']) {
947                                 if(strlen($o))
948                                         $o .= ',';
949                                 $o .= $th['name'];
950                         }
951                 }
952         }
953         return $o;
954 }
955
956
957 /**
958  * Themes admin page
959  *
960  * @param App $a
961  * @return string
962  */
963 function admin_page_themes(&$a){
964
965         $allowed_themes_str = get_config('system','allowed_themes');
966         $allowed_themes_raw = explode(',',$allowed_themes_str);
967         $allowed_themes = array();
968         if(count($allowed_themes_raw))
969                 foreach($allowed_themes_raw as $x)
970                         if(strlen(trim($x)))
971                                 $allowed_themes[] = trim($x);
972
973         $themes = array();
974     $files = glob('view/theme/*');
975     if($files) {
976         foreach($files as $file) {
977             $f = basename($file);
978             $is_experimental = intval(file_exists($file . '/experimental'));
979                         $is_supported = 1-(intval(file_exists($file . '/unsupported'))); // Is not used yet
980                         $is_allowed = intval(in_array($f,$allowed_themes));
981                         $themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed);
982         }
983     }
984
985         if(! count($themes)) {
986                 notice( t('No themes found.'));
987                 return '';
988         }
989
990         /**
991          * Single theme
992          */
993
994         if ($a->argc == 3){
995                 $theme = $a->argv[2];
996                 if(! is_dir("view/theme/$theme")){
997                         notice( t("Item not found.") );
998                         return '';
999                 }
1000
1001                 if (x($_GET,"a") && $_GET['a']=="t"){
1002                         check_form_security_token_redirectOnErr('/admin/themes', 'admin_themes', 't');
1003
1004                         // Toggle theme status
1005
1006                         toggle_theme($themes,$theme,$result);
1007                         $s = rebuild_theme_table($themes);
1008                         if($result) {
1009                                 install_theme($theme);
1010                                 info( sprintf('Theme %s enabled.',$theme));
1011                         }
1012                         else {
1013                                 uninstall_theme($theme);
1014                                 info( sprintf('Theme %s disabled.',$theme));
1015                         }
1016
1017                         set_config('system','allowed_themes',$s);
1018                         goaway($a->get_baseurl(true) . '/admin/themes' );
1019                         return ''; // NOTREACHED
1020                 }
1021
1022                 // display theme details
1023                 require_once('library/markdown.php');
1024
1025                 if (theme_status($themes,$theme)) {
1026                         $status="on"; $action= t("Disable");
1027                 } else {
1028                         $status="off"; $action= t("Enable");
1029                 }
1030
1031                 $readme=Null;
1032                 if (is_file("view/theme/$theme/README.md")){
1033                         $readme = file_get_contents("view/theme/$theme/README.md");
1034                         $readme = Markdown($readme);
1035                 } else if (is_file("view/theme/$theme/README")){
1036                         $readme = "<pre>". file_get_contents("view/theme/$theme/README") ."</pre>";
1037                 }
1038
1039                 $admin_form="";
1040                 if (is_file("view/theme/$theme/config.php")){
1041                         require_once("view/theme/$theme/config.php");
1042                         if(function_exists("theme_admin")){
1043                                 $admin_form = theme_admin($a);
1044                         }
1045
1046                 }
1047
1048                 $screenshot = array( get_theme_screenshot($theme), t('Screenshot'));
1049                 if(! stristr($screenshot[0],$theme))
1050                         $screenshot = null;
1051
1052                 $t = get_markup_template("admin_plugins_details.tpl");
1053                 return replace_macros($t, array(
1054                         '$title' => t('Administration'),
1055                         '$page' => t('Themes'),
1056                         '$toggle' => t('Toggle'),
1057                         '$settings' => t('Settings'),
1058                         '$baseurl' => $a->get_baseurl(true),
1059
1060                         '$plugin' => $theme,
1061                         '$status' => $status,
1062                         '$action' => $action,
1063                         '$info' => get_theme_info($theme),
1064                         '$function' => 'themes',
1065                         '$admin_form' => $admin_form,
1066                         '$str_author' => t('Author: '),
1067                         '$str_maintainer' => t('Maintainer: '),
1068                         '$screenshot' => $screenshot,
1069                         '$readme' => $readme,
1070
1071                         '$form_security_token' => get_form_security_token("admin_themes"),
1072                 ));
1073         }
1074
1075         /**
1076          * List themes
1077          */
1078
1079         $xthemes = array();
1080         if($themes) {
1081                 foreach($themes as $th) {
1082                         $xthemes[] = array($th['name'],(($th['allowed']) ? "on" : "off"), get_theme_info($th['name']));
1083                 }
1084         }
1085
1086         $t = get_markup_template("admin_plugins.tpl");
1087         return replace_macros($t, array(
1088                 '$title' => t('Administration'),
1089                 '$page' => t('Themes'),
1090                 '$submit' => t('Submit'),
1091                 '$baseurl' => $a->get_baseurl(true),
1092                 '$function' => 'themes',
1093                 '$plugins' => $xthemes,
1094                 '$experimental' => t('[Experimental]'),
1095                 '$unsupported' => t('[Unsupported]'),
1096         '$form_security_token' => get_form_security_token("admin_themes"),
1097         ));
1098 }
1099
1100
1101 /**
1102  * Logs admin page
1103  *
1104  * @param App $a
1105  */
1106  
1107 function admin_page_logs_post(&$a) {
1108         if (x($_POST,"page_logs")) {
1109         check_form_security_token_redirectOnErr('/admin/logs', 'admin_logs');
1110
1111                 $logfile                =       ((x($_POST,'logfile'))          ? notags(trim($_POST['logfile']))       : '');
1112                 $debugging              =       ((x($_POST,'debugging'))        ? true                                                          : false);
1113                 $loglevel               =       ((x($_POST,'loglevel'))         ? intval(trim($_POST['loglevel']))      : 0);
1114
1115                 set_config('system','logfile', $logfile);
1116                 set_config('system','debugging',  $debugging);
1117                 set_config('system','loglevel', $loglevel);
1118
1119                 
1120         }
1121
1122         info( t("Log settings updated.") );
1123         goaway($a->get_baseurl(true) . '/admin/logs' );
1124         return; // NOTREACHED   
1125 }
1126
1127 /**
1128  * @param App $a
1129  * @return string
1130  */
1131 function admin_page_logs(&$a){
1132         
1133         $log_choices = Array(
1134                 LOGGER_NORMAL => 'Normal',
1135                 LOGGER_TRACE => 'Trace',
1136                 LOGGER_DEBUG => 'Debug',
1137                 LOGGER_DATA => 'Data',
1138                 LOGGER_ALL => 'All'
1139         );
1140         
1141         $t = get_markup_template("admin_logs.tpl");
1142
1143         $f = get_config('system','logfile');
1144
1145         $data = '';
1146
1147         if(!file_exists($f)) {
1148                 $data = t("Error trying to open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f exist and is 
1149 readable.");
1150         }
1151         else {
1152                 $fp = fopen($f, 'r');
1153                 if(!$fp) {
1154                         $data = t("Couldn't open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f is readable.");
1155                 }
1156                 else {
1157                         $fstat = fstat($fp);
1158                         $size = $fstat['size'];
1159                         if($size != 0)
1160                         {
1161                                 if($size > 5000000 || $size < 0)
1162                                         $size = 5000000;
1163                                 $seek = fseek($fp,0-$size,SEEK_END);
1164                                 if($seek === 0) {
1165                                         $data = escape_tags(fread($fp,$size));
1166                                         while(! feof($fp))
1167                                                 $data .= escape_tags(fread($fp,4096));
1168                                 }
1169                         }
1170                         fclose($fp);
1171                 }
1172         }                       
1173
1174         return replace_macros($t, array(
1175                 '$title' => t('Administration'),
1176                 '$page' => t('Logs'),
1177                 '$submit' => t('Submit'),
1178                 '$clear' => t('Clear'),
1179                 '$data' => $data,
1180                 '$baseurl' => $a->get_baseurl(true),
1181                 '$logname' =>  get_config('system','logfile'),
1182                 
1183                                                                         // name, label, value, help string, extra data...
1184                 '$debugging'            => array('debugging', t("Debugging"),get_config('system','debugging'), ""),
1185                 '$logfile'                      => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your Friendica top-level directory.")),
1186                 '$loglevel'             => array('loglevel', t("Log level"), get_config('system','loglevel'), "", $log_choices),
1187
1188         '$form_security_token' => get_form_security_token("admin_logs"),
1189         ));
1190 }
1191
1192 /**
1193  * @param App $a
1194  */
1195 function admin_page_remoteupdate_post(&$a) {
1196         // this function should be called via ajax post
1197         if(!is_site_admin()) {
1198                 return;
1199         }
1200
1201         
1202         if (x($_POST,'remotefile') && $_POST['remotefile']!=""){
1203                 $remotefile = $_POST['remotefile'];
1204                 $ftpdata = (x($_POST['ftphost'])?$_POST:false);
1205                 doUpdate($remotefile, $ftpdata);
1206         } else {
1207                 echo "No remote file to download. Abort!";
1208         }
1209
1210         killme();
1211 }
1212
1213 /**
1214  * @param App $a
1215  * @return string
1216  */
1217 function admin_page_remoteupdate(&$a) {
1218         if(!is_site_admin()) {
1219                 return login(false);
1220         }
1221
1222         $canwrite = canWeWrite();
1223         $canftp = function_exists('ftp_connect');
1224         
1225         $needupdate = true;
1226         $u = checkUpdate();
1227         if (!is_array($u)){
1228                 $needupdate = false;
1229                 $u = array('','','');
1230         }
1231         
1232         $tpl = get_markup_template("admin_remoteupdate.tpl");
1233         return replace_macros($tpl, array(
1234                 '$baseurl' => $a->get_baseurl(true),
1235                 '$submit' => t("Update now"),
1236                 '$close' => t("Close"),
1237                 '$localversion' => FRIENDICA_VERSION,
1238                 '$remoteversion' => $u[1],
1239                 '$needupdate' => $needupdate,
1240                 '$canwrite' => $canwrite,
1241                 '$canftp'       => $canftp,
1242                 '$ftphost'      => array('ftphost', t("FTP Host"), '',''),
1243                 '$ftppath'      => array('ftppath', t("FTP Path"), '/',''),
1244                 '$ftpuser'      => array('ftpuser', t("FTP User"), '',''),
1245                 '$ftppwd'       => array('ftppwd', t("FTP Password"), '',''),
1246                 '$remotefile'=>array('remotefile','', $u['2'],''),
1247         ));
1248         
1249 }