]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/installer.php
Better use of Nickname validation functions
[quix0rs-gnu-social.git] / lib / installer.php
index 1add65ba815a654ffaeab6ba39adaea6f988d26a..bf30d00786261c7f72d48a9263f9f40c0177f30b 100644 (file)
@@ -28,6 +28,7 @@
  * @author   Craig Andrews <candrews@integralblue.com>
  * @author   Eric Helgeson <helfire@Erics-MBP.local>
  * @author   Evan Prodromou <evan@status.net>
+ * @author   Mikael Nordfeldth <mmn@hethane.se>
  * @author   Robin Millette <millette@controlyourself.ca>
  * @author   Sarven Capadisli <csarven@status.net>
  * @author   Tom Adams <tom@holizz.com>
@@ -42,9 +43,9 @@
 abstract class Installer
 {
     /** Web site info */
-    public $sitename, $server, $path, $fancy;
+    public $sitename, $server, $path, $fancy, $siteProfile, $ssl;
     /** DB info */
-    public $host, $dbname, $dbtype, $username, $password, $db;
+    public $host, $database, $dbtype, $username, $password, $db;
     /** Administrator info */
     public $adminNick, $adminPass, $adminEmail, $adminUpdates;
     /** Should we skip writing the configuration file? */
@@ -73,7 +74,7 @@ abstract class Installer
         error_reporting($old);
         return $ok;
     }
-    
+
     /**
      * Check if all is ready for installation
      *
@@ -185,7 +186,7 @@ abstract class Installer
     /**
      * Basic validation on the database paramters
      * Side effects: error output if not valid
-     * 
+     *
      * @return boolean success
      */
     function validateDb()
@@ -218,7 +219,7 @@ abstract class Installer
     /**
      * Basic validation on the administrator user paramters
      * Side effects: error output if not valid
-     * 
+     *
      * @return boolean success
      */
     function validateAdmin()
@@ -234,7 +235,7 @@ abstract class Installer
                          '" is invalid; should be plain letters and numbers no longer than 64 characters.', true);
             $fail = true;
         }
-        // @fixme hardcoded list; should use User::allowed_nickname()
+        // @fixme hardcoded list; should use Nickname::isValid()
         // if/when it's safe to have loaded the infrastructure here
         $blacklist = array('main', 'panel', 'twitter', 'settings', 'rsd.xml', 'favorited', 'featured', 'favoritedrss', 'featuredrss', 'rss', 'getfile', 'api', 'groups', 'group', 'peopletag', 'tag', 'user', 'message', 'conversation', 'bookmarklet', 'notice', 'attachment', 'search', 'index.php', 'doc', 'opensearch', 'robots.txt', 'xd_receiver.html', 'facebook');
         if (in_array($this->adminNick, $blacklist)) {
@@ -251,10 +252,29 @@ abstract class Installer
         return !$fail;
     }
 
+    /**
+     * Make sure a site profile was selected
+     *
+     * @return type boolean success
+     */
+    function validateSiteProfile()
+    {
+        $fail = false;
+
+        $sprofile = $this->siteProfile;
+
+        if (empty($sprofile))  {
+            $this->updateStatus("No site profile selected.", true);
+            $fail = true;
+        }
+
+        return !$fail;
+    }
+
     /**
      * Set up the database with the appropriate function for the selected type...
      * Saves database info into $this->db.
-     * 
+     *
      * @fixme escape things in the connection string in case we have a funny pass etc
      * @return mixed array of database connection params on success, false on failure
      */
@@ -303,7 +323,7 @@ abstract class Installer
             $this->updateStatus(sprintf("Adding %s data to database...", $name));
             $res = $this->runDbScript($scr.'.sql', $conn);
             if ($res === false) {
-                $this->updateStatus(sprintf("Can't run %d script.", $name), true);
+                $this->updateStatus(sprintf("Can't run %s script.", $name), true);
                 return false;
             }
         }
@@ -316,14 +336,12 @@ abstract class Installer
      * Open a connection to the database.
      *
      * @param <type> $dsn
-     * @return <type> 
+     * @return <type>
      */
     function connectDatabase($dsn)
     {
-        // @fixme move this someplace more sensible
-        //set_include_path(INSTALLDIR . '/extlib' . PATH_SEPARATOR . get_include_path());
-        require_once 'DB.php';
-        return DB::connect($dsn);
+        global $_DB;
+        return $_DB->connect($dsn);
     }
 
     /**
@@ -384,7 +402,7 @@ abstract class Installer
      * Write a stock configuration file.
      *
      * @return boolean success
-     * 
+     *
      * @fixme escape variables in output in case we have funny chars, apostrophes etc
      */
     function writeConf()
@@ -393,13 +411,16 @@ abstract class Installer
             'sitename' => $this->sitename,
             'server' => $this->server,
             'path' => $this->path,
+            'ssl' => in_array($this->ssl, array('never', 'sometimes', 'always'))
+                     ? $this->ssl
+                     : 'never',
             'db_database' => $this->db['database'],
-            'db_type' => $this->db['type'],
+            'db_type' => $this->db['type']
         ));
 
         // assemble configuration file in a string
         $cfg =  "<?php\n".
-                "if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }\n\n".
+                "if (!defined('GNUSOCIAL')) { exit(1); }\n\n".
 
                 // site name
                 "\$config['site']['name'] = {$vals['sitename']};\n\n".
@@ -407,6 +428,7 @@ abstract class Installer
                 // site location
                 "\$config['site']['server'] = {$vals['server']};\n".
                 "\$config['site']['path'] = {$vals['path']}; \n\n".
+                "\$config['site']['ssl'] = {$vals['ssl']}; \n\n".
 
                 // checks if fancy URLs are enabled
                 ($this->fancy ? "\$config['site']['fancy'] = true;\n\n":'').
@@ -416,6 +438,16 @@ abstract class Installer
                 ($this->db['type'] == 'pgsql' ? "\$config['db']['quote_identifiers'] = true;\n\n":'').
                 "\$config['db']['type'] = {$vals['db_type']};\n\n";
 
+        // Auto memcache support detection
+        $cfg .= '
+foreach(array("Memcache", "Memcached") as $plugin) :
+    if (class_exists($plugin)) {
+        addPlugin($plugin);
+        break;
+    }
+endforeach;
+';
+
         // Normalize line endings for Windows servers
         $cfg = str_replace("\n", PHP_EOL, $cfg);
 
@@ -425,6 +457,41 @@ abstract class Installer
         return $res;
     }
 
+    /**
+     * Write the site profile. We do this after creating the initial user
+     * in case the site profile is set to single user. This gets around the
+     * 'chicken-and-egg' problem of the system requiring a valid user for
+     * single user mode, before the intial user is actually created. Yeah,
+     * we should probably do this in smarter way.
+     *
+     * @return int res number of bytes written
+     */
+    function writeSiteProfile()
+    {
+        $vals = $this->phpVals(array(
+            'site_profile' => $this->siteProfile,
+            'nickname' => $this->adminNick
+        ));
+
+        $cfg =
+        // site profile
+        "\$config['site']['profile'] = {$vals['site_profile']};\n";
+
+        if ($this->siteProfile == "singleuser") {
+            $cfg .= "\$config['singleuser']['nickname'] = {$vals['nickname']};\n\n";
+        } else {
+            $cfg .= "\n";
+        }
+
+        // Normalize line endings for Windows servers
+        $cfg = str_replace("\n", PHP_EOL, $cfg);
+
+        // write configuration file out to install directory
+        $res = file_put_contents(INSTALLDIR.'/config.php', $cfg, FILE_APPEND);
+
+        return $res;
+    }
+
     /**
      * Install schema into the database
      *
@@ -479,7 +546,7 @@ abstract class Installer
         $user->grantRole('owner');
         $user->grantRole('moderator');
         $user->grantRole('administrator');
-        
+
         // Attempt to do a remote subscribe to update@status.net
         // Will fail if instance is on a private network.
 
@@ -499,9 +566,9 @@ abstract class Installer
     /**
      * The beef of the installer!
      * Create database, config file, and admin user.
-     * 
+     *
      * Prerequisites: validation of input data.
-     * 
+     *
      * @return boolean success
      */
     function doInstall()
@@ -509,7 +576,12 @@ abstract class Installer
         $this->updateStatus("Initializing...");
         ini_set('display_errors', 1);
         error_reporting(E_ALL);
-        define('STATUSNET', 1);
+        if (!defined('GNUSOCIAL')) {
+            define('GNUSOCIAL', true);
+        }
+        if (!defined('STATUSNET')) {
+            define('STATUSNET', true);
+        }
         require_once INSTALLDIR . '/lib/framework.php';
         StatusNet::initDefaults($this->server, $this->path);
 
@@ -525,6 +597,9 @@ abstract class Installer
             return false;
         }
 
+        // Make sure we can write to the file twice
+        $oldUmask = umask(000); 
+
         if (!$this->skipConfig) {
             $this->updateStatus("Writing config file...");
             $res = $this->writeConf();
@@ -550,6 +625,21 @@ abstract class Installer
             }
         }
 
+        if (!$this->skipConfig) {
+            $this->updateStatus("Setting site profile...");
+            $res = $this->writeSiteProfile();
+
+            if (!$res) {
+                $this->updateStatus("Can't write to config file.", true);
+                return false;
+            }
+        }
+
+        // Restore original umask
+        umask($oldUmask);
+        // Set permissions back to something decent
+        chmod(INSTALLDIR.'/config.php', 0644);
+        
         /*
             TODO https needs to be considered
         */