]> git.mxchange.org Git - friendica.git/blobdiff - mod/admin.php
added setting for server's sender email address
[friendica.git] / mod / admin.php
index 5c9395478478ae791dfb9106feff6b40d458df0f..dd188b2ec1ae0dc89ef8c45b0c4872b2d54879d8 100644 (file)
@@ -4,6 +4,8 @@
   * Friendica admin
   */
 require_once("include/remoteupdate.php");
+require_once("include/enotify.php");
+require_once("include/text.php");
 
 
 /**
@@ -33,7 +35,7 @@ function admin_post(&$a){
                                admin_page_users_post($a);
                                break;
                        case 'plugins':
-                               if ($a->argc > 2 && 
+                               if ($a->argc > 2 &&
                                        is_file("addon/".$a->argv[2]."/".$a->argv[2].".php")){
                                                @include_once("addon/".$a->argv[2]."/".$a->argv[2].".php");
                                                if(function_exists($a->argv[2].'_plugin_admin_post')) {
@@ -122,7 +124,7 @@ function admin_content(&$a) {
 
        $t = get_markup_template("admin_aside.tpl");
        $a->page['aside'] .= replace_macros( $t, array(
-                       '$admin' => $aside, 
+                       '$admin' => $aside,
                        '$admtxt' => t('Admin'),
                        '$plugadmtxt' => t('Plugin Features'),
                        '$logtxt' => t('Logs'),
@@ -168,13 +170,13 @@ function admin_content(&$a) {
        }
 
        if(is_ajax()) {
-               echo $o; 
+               echo $o;
                killme();
                return '';
        } else {
                return $o;
        }
-} 
+}
 
 
 /**
@@ -221,6 +223,8 @@ function admin_page_summary(&$a) {
                '$accounts' => $accounts,
                '$pending' => Array( t('Pending registrations'), $pending),
                '$version' => Array( t('Version'), FRIENDICA_VERSION),
+               '$platform' => FRIENDICA_PLATFORM,
+               '$codename' => FRIENDICA_CODENAME,
                '$build' =>  get_config('system','build'),
                '$plugins' => Array( t('Active plugins'), $a->plugins )
        ));
@@ -242,67 +246,70 @@ function admin_page_site_post(&$a){
        if (x($_POST,'relocate') && x($_POST,'relocate_url') && $_POST['relocate_url']!=""){
                $new_url = $_POST['relocate_url'];
                $new_url = rtrim($new_url,"/");
-               
+
                $parsed = @parse_url($new_url);
                if (!$parsed || (!x($parsed,'host') || !x($parsed,'scheme'))) {
                        notice(t("Can not parse base url. Must have at least <scheme>://<domain>"));
                        goaway($a->get_baseurl(true) . '/admin/site' );
                }
-               
+
                /* steps:
                 * replace all "baseurl" to "new_url" in config, profile, term, items and contacts
                 * send relocate for every local user
                 * */
-               
+
                $old_url = $a->get_baseurl(true);
-               
+
                function update_table($table_name, $fields, $old_url, $new_url) {
                        global $db, $a;
-                       
+
                        $dbold = dbesc($old_url);
                        $dbnew = dbesc($new_url);
-                       
+
                        $upd = array();
                        foreach ($fields as $f) {
                                $upd[] = "`$f` = REPLACE(`$f`, '$dbold', '$dbnew')";
                        }
-                       
+
                        $upds = implode(", ", $upd);
-                       
-                       
-                       
+
+
+
                        $q = sprintf("UPDATE %s SET %s;", $table_name, $upds);
                        $r = q($q);
                        if (!$r) {
-                               notice( "Falied updating '$table_name': " . $db->error );
+                               notice( "Failed updating '$table_name': " . $db->error );
                                goaway($a->get_baseurl(true) . '/admin/site' );
                        }
                }
-               
+
                // update tables
                update_table("profile", array('photo', 'thumb'), $old_url, $new_url);
                update_table("term", array('url'), $old_url, $new_url);
                update_table("contact", array('photo','thumb','micro','url','nurl','request','notify','poll','confirm','poco'), $old_url, $new_url);
+               update_table("unique_contacts", array('url'), $old_url, $new_url);
                update_table("item", array('owner-link','owner-avatar','author-name','author-link','author-avatar','body','plink','tag'), $old_url, $new_url);
 
                // update config
                $a->set_baseurl($new_url);
                set_config('system','url',$new_url);
-               
+
                // send relocate
                $users = q("SELECT uid FROM user WHERE account_removed = 0 AND account_expired = 0");
-               
+
                foreach ($users as $user) {
                        proc_run('php', 'include/notifier.php', 'relocate', $user['uid']);
                }
 
                info("Relocation started. Could take a while to complete.");
-               
+
                goaway($a->get_baseurl(true) . '/admin/site' );
        }
        // end relocate
-       
+
        $sitename               =       ((x($_POST,'sitename'))                 ? notags(trim($_POST['sitename']))              : '');
+       $hostname               =       ((x($_POST,'hostname'))                 ? notags(trim($_POST['hostname']))              : '');
+       $sender_email   =       ((x($_POST,'sender_email'))             ? notags(trim($_POST['sender_email']))          : '');
        $banner                 =       ((x($_POST,'banner'))                   ? trim($_POST['banner'])                        : false);
        $info                   =       ((x($_POST,'info'))                     ? trim($_POST['info'])                  : false);
        $language               =       ((x($_POST,'language'))                 ? notags(trim($_POST['language']))              : '');
@@ -349,19 +356,23 @@ function admin_page_site_post(&$a){
        $ostatus_poll_interval  =       ((x($_POST,'ostatus_poll_interval'))    ? intval(trim($_POST['ostatus_poll_interval']))         :  0);
        $diaspora_enabled       =       ((x($_POST,'diaspora_enabled'))         ? True                                          : False);
        $ssl_policy             =       ((x($_POST,'ssl_policy'))               ? intval($_POST['ssl_policy'])                  : 0);
+       $force_ssl              =       ((x($_POST,'force_ssl'))                ? True                                          : False);
        $old_share              =       ((x($_POST,'old_share'))                ? True                                          : False);
        $hide_help              =       ((x($_POST,'hide_help'))                ? True                                          : False);
        $suppress_language      =       ((x($_POST,'suppress_language'))        ? True                                          : False);
        $use_fulltext_engine    =       ((x($_POST,'use_fulltext_engine'))      ? True                                          : False);
        $itemcache              =       ((x($_POST,'itemcache'))                ? notags(trim($_POST['itemcache']))             : '');
        $itemcache_duration     =       ((x($_POST,'itemcache_duration'))       ? intval($_POST['itemcache_duration'])          : 0);
+       $max_comments           =       ((x($_POST,'max_comments'))             ? intval($_POST['max_comments'])                : 0);
        $lockpath               =       ((x($_POST,'lockpath'))                 ? notags(trim($_POST['lockpath']))              : '');
        $temppath               =       ((x($_POST,'temppath'))                 ? notags(trim($_POST['temppath']))              : '');
        $basepath               =       ((x($_POST,'basepath'))                 ? notags(trim($_POST['basepath']))              : '');
        $singleuser             =       ((x($_POST,'singleuser'))               ? notags(trim($_POST['singleuser']))            : '');
+       $proxy_disabled         =       ((x($_POST,'proxy_disabled'))           ? True                                          : False);
+       $disable_noscrape = ((x($_POST,'disable_noscrape')) ? true : false);
        if($ssl_policy != intval(get_config('system','ssl_policy'))) {
                if($ssl_policy == SSL_POLICY_FULL) {
-                       q("update `contact` set 
+                       q("update `contact` set
                                `url`     = replace(`url`    , 'http:' , 'https:'),
                                `photo`   = replace(`photo`  , 'http:' , 'https:'),
                                `thumb`   = replace(`thumb`  , 'http:' , 'https:'),
@@ -373,14 +384,14 @@ function admin_page_site_post(&$a){
                                `poco`    = replace(`poco`   , 'http:' , 'https:')
                                where `self` = 1"
                        );
-                       q("update `profile` set 
+                       q("update `profile` set
                                `photo`   = replace(`photo`  , 'http:' , 'https:'),
                                `thumb`   = replace(`thumb`  , 'http:' , 'https:')
                                where 1 "
                        );
                }
                elseif($ssl_policy == SSL_POLICY_SELFSIGN) {
-                       q("update `contact` set 
+                       q("update `contact` set
                                `url`     = replace(`url`    , 'https:' , 'http:'),
                                `photo`   = replace(`photo`  , 'https:' , 'http:'),
                                `thumb`   = replace(`thumb`  , 'https:' , 'http:'),
@@ -392,7 +403,7 @@ function admin_page_site_post(&$a){
                                `poco`    = replace(`poco`   , 'https:' , 'http:')
                                where `self` = 1"
                        );
-                       q("update `profile` set 
+                       q("update `profile` set
                                `photo`   = replace(`photo`  , 'https:' , 'http:'),
                                `thumb`   = replace(`thumb`  , 'https:' , 'http:')
                                where 1 "
@@ -404,6 +415,8 @@ function admin_page_site_post(&$a){
        set_config('system','poll_interval',$poll_interval);
        set_config('system','maxloadavg',$maxloadavg);
        set_config('config','sitename',$sitename);
+       set_config('config','hostname',$hostname);
+       set_config('config','sender_email', $sender_email);
        set_config('system','suppress_language',$suppress_language);
        if ($banner==""){
                // don't know why, but del_config doesn't work...
@@ -415,9 +428,9 @@ function admin_page_site_post(&$a){
                set_config('system','banner', $banner);
        }
        if ($info=="") {
-           del_config('config','info');
+               del_config('config','info');
        } else {
-           set_config('config','info',$info);
+               set_config('config','info',$info);
        }
        set_config('system','language', $language);
        set_config('system','theme', $theme);
@@ -425,12 +438,12 @@ function admin_page_site_post(&$a){
                del_config('system','mobile-theme');
        } else {
                set_config('system','mobile-theme', $theme_mobile);
-        }
-        if ( $singleuser === '---' ) {
-            del_config('system','singleuser');
-        } else {
-            set_config('system','singleuser', $singleuser);
-        }
+               }
+               if ( $singleuser === '---' ) {
+                       del_config('system','singleuser');
+               } else {
+                       set_config('system','singleuser', $singleuser);
+               }
        set_config('system','maximagesize', $maximagesize);
        set_config('system','max_image_length', $maximagelength);
        set_config('system','jpeg_quality', $jpegimagequality);
@@ -469,18 +482,22 @@ function admin_page_site_post(&$a){
        set_config('system','curl_timeout', $timeout);
        set_config('system','dfrn_only', $dfrn_only);
        set_config('system','ostatus_disabled', $ostatus_disabled);
-        set_config('system','ostatus_poll_interval', $ostatus_poll_interval);
+               set_config('system','ostatus_poll_interval', $ostatus_poll_interval);
        set_config('system','diaspora_enabled', $diaspora_enabled);
        set_config('config','private_addons', $private_addons);
 
+       set_config('system','force_ssl', $force_ssl);
        set_config('system','old_share', $old_share);
        set_config('system','hide_help', $hide_help);
        set_config('system','use_fulltext_engine', $use_fulltext_engine);
        set_config('system','itemcache', $itemcache);
        set_config('system','itemcache_duration', $itemcache_duration);
+       set_config('system','max_comments', $max_comments);
        set_config('system','lockpath', $lockpath);
        set_config('system','temppath', $temppath);
        set_config('system','basepath', $basepath);
+       set_config('system','proxy_disabled', $proxy_disabled);
+       set_config('system','disable_noscrape', $disable_noscrape);
 
        info( t('Site settings updated.') . EOL);
        goaway($a->get_baseurl(true) . '/admin/site' );
@@ -517,41 +534,46 @@ function admin_page_site(&$a) {
                foreach($files as $file) {
                        $f = basename($file);
                        $theme_name = ((file_exists($file . '/experimental')) ?  sprintf("%s - \x28Experimental\x29", $f) : $f);
-            if (file_exists($file . '/mobile')) {
-                $theme_choices_mobile[$f] = $theme_name;
-            }
+                       if (file_exists($file . '/mobile')) {
+                               $theme_choices_mobile[$f] = $theme_name;
+                       }
                else {
-                $theme_choices[$f] = $theme_name;
+                               $theme_choices[$f] = $theme_name;
                        }
                }
-        }
+               }
 
-        /* OStatus conversation poll choices */
-        $ostatus_poll_choices = array(
+               /* OStatus conversation poll choices */
+               $ostatus_poll_choices = array(
                "-2" => t("Never"),
                "-1" => t("At post arrival"),
                "0" => t("Frequently"),
                "60" => t("Hourly"),
                "720" => t("Twice daily"),
                "1440" => t("Daily")
-            );
+                       );
 
-        /* get user names to make the install a personal install of X */
-        $user_names = array();
-        $user_names['---'] = t('Multi user instance');
-        $users = q("SELECT username, nickname FROM `user`");
-        foreach ($users as $user) {
-            $user_names[$user['nickname']] = $user['username'];
-        }
+               /* get user names to make the install a personal install of X */
+               $user_names = array();
+               $user_names['---'] = t('Multi user instance');
+               $users = q("SELECT username, nickname FROM `user`");
+               foreach ($users as $user) {
+                       $user_names[$user['nickname']] = $user['username'];
+               }
 
        /* Banner */
        $banner = get_config('system','banner');
-       if($banner == false) 
+       if($banner == false)
                $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>';
        $banner = htmlspecialchars($banner);
        $info = get_config('config','info');
        $info = htmlspecialchars($info);
 
+       // Automatically create temporary paths
+       get_temppath();
+       get_lockpath();
+       get_itemcachepath();
+
        //echo "<pre>"; var_dump($lang_choices); die("</pre>");
 
        /* Register policy */
@@ -559,7 +581,7 @@ function admin_page_site(&$a) {
                REGISTER_CLOSED => t("Closed"),
                REGISTER_APPROVE => t("Requires approval"),
                REGISTER_OPEN => t("Open")
-       ); 
+       );
 
        $ssl_choices = array(
                SSL_POLICY_NONE => t("No SSL policy, links will track page SSL state"),
@@ -567,6 +589,9 @@ function admin_page_site(&$a) {
                SSL_POLICY_SELFSIGN => t("Self-signed certificate, use SSL for local links only (discouraged)")
        );
 
+       if ($a->config['hostname'] == "")
+               $a->config['hostname'] = $a->get_hostname();
+
        $t = get_markup_template("admin_site.tpl");
        return replace_macros($t, array(
                '$title' => t('Administration'),
@@ -581,12 +606,15 @@ function admin_page_site(&$a) {
                '$baseurl' => $a->get_baseurl(true),
                // name, label, value, help string, extra data...
                '$sitename'             => array('sitename', t("Site name"), htmlentities($a->config['sitename'], ENT_QUOTES), 'UTF-8'),
+               '$hostname'             => array('hostname', t("Host name"), $a->config['hostname'], ""),
+               '$sender_email'         => array('sender_email', t("Sender Email"), $a->config['sender_email'], ""),
                '$banner'               => array('banner', t("Banner/Logo"), $banner, ""),
                '$info' => array('info',t('Additional Info'), $info, t('For public servers: you can add additional information here that will be listed at dir.friendica.com/siteinfo.')),
                '$language'             => array('language', t("System language"), get_config('system','language'), "", $lang_choices),
                '$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),
                '$theme_mobile'         => array('theme_mobile', t("Mobile system theme"), get_config('system','mobile-theme'), t("Theme for mobile devices"), $theme_choices_mobile),
                '$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),
+               '$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.")),
                '$old_share'            => array('old_share', t("Old style 'Share'"), get_config('system','old_share'), t("Deactivates the bbcode element 'share' for repeating items.")),
                '$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.")),
                '$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),
@@ -614,9 +642,9 @@ function admin_page_site(&$a) {
                '$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")),
                '$no_utf'               => array('no_utf', t("UTF-8 Regular expressions"), !get_config('system','no_utf'), t("Use PHP UTF8 regular expressions")),
                '$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.")),
-               '$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.")),     
+               '$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.")),
                '$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),
-               '$diaspora_enabled'     => array('diaspora_enabled', t("Enable Diaspora support"), get_config('system','diaspora_enabled'), t("Provide built-in Diaspora network compatibility.")),     
+               '$diaspora_enabled'     => array('diaspora_enabled', t("Enable Diaspora support"), get_config('system','diaspora_enabled'), t("Provide built-in Diaspora network compatibility.")),
                '$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.")),
                '$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.")),
                '$proxyuser'            => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
@@ -629,14 +657,17 @@ function admin_page_site(&$a) {
                '$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.")),
                '$suppress_language'    => array('suppress_language', t("Suppress Language"), get_config('system','suppress_language'), t("Suppress language information in meta information about a posting.")),
                '$itemcache'            => array('itemcache', t("Path to item cache"), get_config('system','itemcache'), "The item caches buffers generated bbcode and external images."),
-               '$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).")),
+               '$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.")),
+               '$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.")),
                '$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."),
                '$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."),
                '$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."),
-               
+               '$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.")),
+
                '$relocate_url'     => array('relocate_url', t("New base url"), $a->get_baseurl(), "Change base url for this server. Sends relocate message to all DFRN contacts of all users."),
-               
-        '$form_security_token' => get_form_security_token("admin_site"),
+
+               '$disable_noscrape'=> array('disable_noscrape', t("Disable noscrape"), get_config('system','disable_noscrape'), t("The noscrape feature speeds up directory submissions by using JSON data instead of HTML scraping. Disabling it will cause higher load on your server and the directory server.")),
+       '$form_security_token' => get_form_security_token("admin_site")
 
        ));
 
@@ -656,23 +687,37 @@ function admin_page_dbsync(&$a) {
                goaway($a->get_baseurl(true) . '/admin/dbsync');
        }
 
-       if($a->argc > 2 && intval($a->argv[2])) {
+       if(($a->argc > 2) AND (intval($a->argv[2]) OR ($a->argv[2] === 'check'))) {
+               require_once("include/dbstructure.php");
+               $retval = update_structure(false, true);
+               if (!$retval) {
+                       $o .= sprintf(t("Database structure update %s was successfully applied."), DB_UPDATE_VERSION)."<br />";
+                       set_config('database', 'dbupdate_'.DB_UPDATE_VERSION, 'success');
+               } else
+                       $o .= sprintf(t("Executing of database structure update %s failed with error: %s"),
+                                       DB_UPDATE_VERSION, $retval)."<br />";
+               if ($a->argv[2] === 'check')
+                       return $o;
+       }
+
+       if ($a->argc > 2 && intval($a->argv[2])) {
                require_once('update.php');
                $func = 'update_' . intval($a->argv[2]);
                if(function_exists($func)) {
                        $retval = $func();
                        if($retval === UPDATE_FAILED) {
-                               $o .= sprintf( t('Executing %s failed. Check system logs.'), $func); 
+                               $o .= sprintf(t("Executing %s failed with error: %s"), $func, $retval);
                        }
                        elseif($retval === UPDATE_SUCCESS) {
-                               $o .= sprintf( t('Update %s was successfully applied.', $func));
+                               $o .= sprintf(t('Update %s was successfully applied.', $func));
                                set_config('database',$func, 'success');
                        }
                        else
-                               $o .= sprintf( t('Update %s did not return a status. Unknown if it succeeded.'), $func);
+                               $o .= sprintf(t('Update %s did not return a status. Unknown if it succeeded.'), $func);
+               } else {
+                       $o .= sprintf(t('There was no additional update function %s that needed to be called.'), $func)."<br />";
+                       set_config('database',$func, 'success');
                }
-               else
-                       $o .= sprintf( t('Update function %s could not be found.'), $func);
                return $o;
        }
 
@@ -686,17 +731,22 @@ function admin_page_dbsync(&$a) {
                        $failed[] = $upd;
                }
        }
-       if(! count($failed))
-               return '<h3>' . t('No failed updates.') . '</h3>';
-
-       $o = replace_macros(get_markup_template('failed_updates.tpl'),array(
-               '$base' => $a->get_baseurl(true),
-               '$banner' => t('Failed Updates'),
-               '$desc' => t('This does not include updates prior to 1139, which did not return a status.'),
-               '$mark' => t('Mark success (if update was manually applied)'),
-               '$apply' => t('Attempt to execute this update step automatically'),
-               '$failed' => $failed
-       ));
+       if(! count($failed)) {
+               $o = replace_macros(get_markup_template('structure_check.tpl'),array(
+                       '$base' => $a->get_baseurl(true),
+                       '$banner' => t('No failed updates.'),
+                       '$check' => t('Check database structure'),
+               ));
+       } else {
+               $o = replace_macros(get_markup_template('failed_updates.tpl'),array(
+                       '$base' => $a->get_baseurl(true),
+                       '$banner' => t('Failed Updates'),
+                       '$desc' => t('This does not include updates prior to 1139, which did not return a status.'),
+                       '$mark' => t('Mark success (if update was manually applied)'),
+                       '$apply' => t('Attempt to execute this update step automatically'),
+                       '$failed' => $failed
+               ));
+       }
 
        return $o;
 
@@ -710,39 +760,61 @@ function admin_page_dbsync(&$a) {
 function admin_page_users_post(&$a){
        $pending = ( x($_POST, 'pending') ? $_POST['pending'] : Array() );
        $users = ( x($_POST, 'user') ? $_POST['user'] : Array() );
-       $nu_name = ( x($_POST, 'new_user_name') ? $_POST['new_user_name'] : ''); 
-  $nu_nickname = ( x($_POST, 'new_user_nickname') ? $_POST['new_user_nickname'] : ''); 
-  $nu_email = ( x($_POST, 'new_user_email') ? $_POST['new_user_email'] : '');
-
-  check_form_security_token_redirectOnErr('/admin/users', 'admin_users');
-
-  if (!($nu_name==="") && !($nu_email==="") && !($nu_nickname==="")) { 
-      require_once('include/user.php'); 
-      require_once('include/email.php'); 
-      $result = create_user( array('username'=>$nu_name, 'email'=>$nu_email, 'nickname'=>$nu_nickname, 'verified'=>1)  ); 
-      if(! $result['success']) { 
-                   notice($result['message']); 
-                   return; 
-      } 
-      $nu = $result['user']; 
-      $email_tpl = get_intltext_template("register_adminadd_eml.tpl"); 
-      $email_tpl = replace_macros($email_tpl, array( 
-                   '$sitename' => $a->config['sitename'], 
-                   '$siteurl' =>  $a->get_baseurl(), 
-                   '$username' => $nu['username'], 
-                   '$email' => $nu['email'], 
-                   '$password' => $result['password'], 
-                   '$uid' => $nu['uid'] )); 
-      $res = mail($nu['email'], email_header_encode( sprintf( t('Registration details for %s'), $a->config['sitename']),'UTF-8'), 
-                   $email_tpl,  
-                   'From: ' . 'Administrator' . '@' . $_SERVER['SERVER_NAME'] . "\n" 
-                   . 'Content-type: text/plain; charset=UTF-8' . "\n" 
-                   . 'Content-transfer-encoding: 8bit' ); 
-      if ($res) { 
-                   info( t('Registration successful. Email send to user').EOL ); 
-      } 
-  }
+       $nu_name = ( x($_POST, 'new_user_name') ? $_POST['new_user_name'] : '');
+       $nu_nickname = ( x($_POST, 'new_user_nickname') ? $_POST['new_user_nickname'] : '');
+       $nu_email = ( x($_POST, 'new_user_email') ? $_POST['new_user_email'] : '');
+
+       check_form_security_token_redirectOnErr('/admin/users', 'admin_users');
+
+       if (!($nu_name==="") && !($nu_email==="") && !($nu_nickname==="")) {
+               require_once('include/user.php');
+
+               $result = create_user( array('username'=>$nu_name, 'email'=>$nu_email, 'nickname'=>$nu_nickname, 'verified'=>1)  );
+               if(! $result['success']) {
+                       notice($result['message']);
+                       return;
+               }
+               $nu = $result['user'];
+               $preamble = deindent(t('
+                       Dear %1$s,
+                               the administrator of %2$s has set up an account for you.'));
+               $body = deindent(t('
+                       The login details are as follows:
+
+                       Site Location:  %1$s
+                       Login Name:             %2$s
+                       Password:               %3$s
+
+                       You may change your password from your account "Settings" page after logging
+                       in.
+
+                       Please take a few moments to review the other account settings on that page.
+
+                       You may also wish to add some basic information to your default profile
+                       (on the "Profiles" page) so that other people can easily find you.
+
+                       We recommend setting your full name, adding a profile photo,
+                       adding some profile "keywords" (very useful in making new friends) - and
+                       perhaps what country you live in; if you do not wish to be more specific
+                       than that.
+
+                       We fully respect your right to privacy, and none of these items are necessary.
+                       If you are new and do not know anybody here, they may help
+                       you to make some new and interesting friends.
+
+                       Thank you and welcome to %4$s.'));
+
+               $preamble = sprintf($preamble, $nu['username'], $a->config['sitename']);
+               $body = sprintf($body, $a->get_baseurl(), $nu['email'], $result['password'], $a->config['sitename']);
+
+               notification(array(
+                       'type' => "SYSTEM_EMAIL",
+                       'to_email' => $nu['email'],
+                       'subject'=> sprintf( t('Registration details for %s'), $a->config['sitename']),
+                       'preamble'=> $preamble,
+                       'body' => $body));
+
+       }
 
        if (x($_POST,'page_users_block')){
                foreach($users as $uid){
@@ -791,7 +863,7 @@ function admin_page_users(&$a){
                }
                switch($a->argv[2]){
                        case "delete":{
-                check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
+                               check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
                                // delete user
                                require_once("include/Contact.php");
                                user_remove($uid);
@@ -799,7 +871,7 @@ function admin_page_users(&$a){
                                notice( sprintf(t("User '%s' deleted"), $user[0]['username']) . EOL);
                        }; break;
                        case "block":{
-                check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
+                               check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
                                q("UPDATE `user` SET `blocked`=%d WHERE `uid`=%s",
                                        intval( 1-$user[0]['blocked'] ),
                                        intval( $uid )
@@ -855,7 +927,7 @@ function admin_page_users(&$a){
                        t('Normal Account'),
                        t('Soapbox Account'),
                        t('Community/Celebrity Account'),
-                        t('Automatic Friend Account')
+                                               t('Automatic Friend Account')
                );
                $e['page-flags'] = $accounts[$e['page-flags']];
                $e['register_date'] = relative_date($e['register_date']);
@@ -910,9 +982,9 @@ function admin_page_users(&$a){
                '$delete' => t('Delete'),
                '$block' => t('Block'),
                '$unblock' => t('Unblock'),
-        '$siteadmin' => t('Site admin'),
-        '$accountexpired' => t('Account expired'),
-               
+               '$siteadmin' => t('Site admin'),
+               '$accountexpired' => t('Account expired'),
+
                '$h_users' => t('Users'),
                '$h_newuser' => t('New User'),
                '$th_deleted' => array( t('Name'), t('Email'), t('Register date'), t('Last login'), t('Last item'), t('Deleted since') ),
@@ -921,7 +993,7 @@ function admin_page_users(&$a){
                '$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?'),
                '$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?'),
 
-        '$form_security_token' => get_form_security_token("admin_users"),
+               '$form_security_token' => get_form_security_token("admin_users"),
 
                // values //
                '$baseurl' => $a->get_baseurl(true),
@@ -929,9 +1001,9 @@ function admin_page_users(&$a){
                '$pending' => $pending,
                'deleted' => $deleted,
                '$users' => $users,
-               '$newusername'  => array('new_user_name', t("Name"), '', t("Name of the new user.")), 
-    '$newusernickname'  => array('new_user_nickname', t("Nickname"), '', t("Nickname of the new user.")), 
-    '$newuseremail'  => array('new_user_email', t("Email"), '', t("Email address of the new user.")),
+               '$newusername'  => array('new_user_name', t("Name"), '', t("Name of the new user.")),
+               '$newusernickname'  => array('new_user_nickname', t("Nickname"), '', t("Nickname of the new user.")),
+               '$newuseremail'  => array('new_user_email', t("Email"), '', t("Email address of the new user."), '', '', 'email'),
        ));
        $o .= paginate($a);
        return $o;
@@ -1060,7 +1132,7 @@ function admin_page_plugins(&$a){
                '$baseurl' => $a->get_baseurl(true),
                '$function' => 'plugins',
                '$plugins' => $plugins,
-        '$form_security_token' => get_form_security_token("admin_themes"),
+               '$form_security_token' => get_form_security_token("admin_themes"),
        ));
 }
 
@@ -1145,9 +1217,11 @@ function admin_page_themes(&$a){
                foreach($files as $file) {
                        $f = basename($file);
                        $is_experimental = intval(file_exists($file . '/experimental'));
-                       $is_supported = 1-(intval(file_exists($file . '/unsupported'))); // Is not used yet
+                       $is_supported = 1-(intval(file_exists($file . '/unsupported')));
                        $is_allowed = intval(in_array($f,$allowed_themes));
-                       $themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed);
+
+                       if ($is_allowed OR $is_supported OR get_config("system", "show_unsupported_themes"))
+                               $themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed);
                }
        }
 
@@ -1262,7 +1336,7 @@ function admin_page_themes(&$a){
                '$plugins' => $xthemes,
                '$experimental' => t('[Experimental]'),
                '$unsupported' => t('[Unsupported]'),
-        '$form_security_token' => get_form_security_token("admin_themes"),
+               '$form_security_token' => get_form_security_token("admin_themes"),
        ));
 }
 
@@ -1272,10 +1346,10 @@ function admin_page_themes(&$a){
  *
  * @param App $a
  */
+
 function admin_page_logs_post(&$a) {
        if (x($_POST,"page_logs")) {
-        check_form_security_token_redirectOnErr('/admin/logs', 'admin_logs');
+               check_form_security_token_redirectOnErr('/admin/logs', 'admin_logs');
 
                $logfile                =       ((x($_POST,'logfile'))          ? notags(trim($_POST['logfile']))       : '');
                $debugging              =       ((x($_POST,'debugging'))        ? true                                                          : false);
@@ -1314,7 +1388,7 @@ function admin_page_logs(&$a){
        $data = '';
 
        if(!file_exists($f)) {
-               $data = t("Error trying to open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f exist and is 
+               $data = t("Error trying to open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f exist and is
 readable.");
        }
        else {
@@ -1354,7 +1428,7 @@ readable.");
                '$logfile'                      => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your Friendica top-level directory.")),
                '$loglevel'             => array('loglevel', t("Log level"), get_config('system','loglevel'), "", $log_choices),
 
-        '$form_security_token' => get_form_security_token("admin_logs"),
+               '$form_security_token' => get_form_security_token("admin_logs"),
        ));
 }