abstract class Installer
{
/** Web site info */
- public $sitename, $server, $path, $fancy;
+ public $sitename, $server, $path, $fancy, $siteProfile;
/** 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? */
error_reporting($old);
return $ok;
}
-
+
/**
* Check if all is ready for installation
*
/**
* Basic validation on the database paramters
* Side effects: error output if not valid
- *
+ *
* @return boolean success
*/
function validateDb()
/**
* Basic validation on the administrator user paramters
* Side effects: error output if not valid
- *
+ *
* @return boolean success
*/
function validateAdmin()
}
// @fixme hardcoded list; should use User::allowed_nickname()
// if/when it's safe to have loaded the infrastructure here
- $blacklist = array('main', 'admin', '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');
+ $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)) {
$this->updateStatus('The user nickname "' . htmlspecialchars($this->adminNick) .
'" is reserved.', true);
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
*/
* Open a connection to the database.
*
* @param <type> $dsn
- * @return <type>
+ * @return <type>
*/
function connectDatabase($dsn)
{
}
$schema->ensureTable($name, $def);
}
+ return true;
}
/**
* Write a stock configuration file.
*
* @return boolean success
- *
+ *
* @fixme escape variables in output in case we have funny chars, apostrophes etc
*/
function writeConf()
'server' => $this->server,
'path' => $this->path,
'db_database' => $this->db['database'],
- 'db_type' => $this->db['type'],
+ 'db_type' => $this->db['type']
));
// assemble configuration file in a string
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
*
if (!mb_strlen($stmt)) {
continue;
}
- $res = $conn->execute($stmt);
- if (DB::isError($res)) {
- $error = $result->getMessage();
+ try {
+ $res = $conn->simpleQuery($stmt);
+ } catch (Exception $e) {
+ $error = $e->getMessage();
$this->updateStatus("ERROR ($error) for SQL '$stmt'");
- return $res;
+ return false;
}
}
return true;
*/
function registerInitialUser()
{
- define('STATUSNET', true);
- define('LACONICA', true); // compatibility
-
require_once INSTALLDIR . '/lib/common.php';
$data = array('nickname' => $this->adminNick,
$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.
/**
* The beef of the installer!
* Create database, config file, and admin user.
- *
+ *
* Prerequisites: validation of input data.
- *
+ *
* @return boolean success
*/
function doInstall()
$this->updateStatus("Initializing...");
ini_set('display_errors', 1);
error_reporting(E_ALL);
- define('STATUSNET', 1);
+ if (!defined('STATUSNET')) {
+ define('STATUSNET', 1);
+ }
require_once INSTALLDIR . '/lib/framework.php';
StatusNet::initDefaults($this->server, $this->path);
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();
}
}
+ 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
*/