Query a particular login name and create database logins using the DbTool

refs #7163
This commit is contained in:
Johannes Meyer 2014-10-08 15:33:51 +02:00
parent 96ba45d896
commit 89ae05899b
2 changed files with 54 additions and 37 deletions

View File

@ -255,21 +255,20 @@ class WebInstaller implements Installer
$db->reconnect($this->pageData['setup_db_resource']['dbname']); $db->reconnect($this->pageData['setup_db_resource']['dbname']);
} }
$loginIdent = "'" . $this->pageData['setup_db_resource']['username'] . "'@'" . Platform::getFqdn() . "'"; if ($db->hasLogin($this->pageData['setup_db_resource']['username'])) {
if (false === array_search($loginIdent, $db->listLogins())) {
$this->log(sprintf(
t('Creating login "%s"...'),
$this->pageData['setup_db_resource']['username']
));
$db->exec(
"CREATE USER $loginIdent IDENTIFIED BY '" .
$this->pageData['setup_db_resource']['password'] . "'"
);
} else {
$this->log(sprintf( $this->log(sprintf(
t('Login "%s" already exists...'), t('Login "%s" already exists...'),
$this->pageData['setup_db_resource']['username'] $this->pageData['setup_db_resource']['username']
)); ));
} else {
$this->log(sprintf(
t('Creating login "%s"...'),
$this->pageData['setup_db_resource']['username']
));
$db->addLogin(
$this->pageData['setup_db_resource']['username'],
$this->pageData['setup_db_resource']['password']
);
} }
if (array_search('account', $db->listTables()) !== false) { if (array_search('account', $db->listTables()) !== false) {
@ -289,7 +288,7 @@ class WebInstaller implements Installer
"GRANT %s ON %s.* TO %s", "GRANT %s ON %s.* TO %s",
join(',', $privileges), join(',', $privileges),
$this->pageData['setup_db_resource']['dbname'], $this->pageData['setup_db_resource']['dbname'],
$loginIdent $this->pageData['setup_db_resource']['username'] . '@' . Platform::getFqdn()
)); ));
} }
} }
@ -319,21 +318,20 @@ class WebInstaller implements Installer
$db->reconnect($this->pageData['setup_db_resource']['dbname']); $db->reconnect($this->pageData['setup_db_resource']['dbname']);
} }
if (false === array_search($this->pageData['setup_db_resource']['username'], $db->listLogins())) { if ($db->hasLogin($this->pageData['setup_db_resource']['username'])) {
$this->log(sprintf(
t('Creating login "%s"...'),
$this->pageData['setup_db_resource']['username']
));
$db->exec(sprintf(
"CREATE USER %s WITH PASSWORD '%s'",
$this->pageData['setup_db_resource']['username'],
$this->pageData['setup_db_resource']['password']
));
} else {
$this->log(sprintf( $this->log(sprintf(
t('Login "%s" already exists...'), t('Login "%s" already exists...'),
$this->pageData['setup_db_resource']['username'] $this->pageData['setup_db_resource']['username']
)); ));
} else {
$this->log(sprintf(
t('Creating login "%s"...'),
$this->pageData['setup_db_resource']['username']
));
$db->addLogin(
$this->pageData['setup_db_resource']['username'],
$this->pageData['setup_db_resource']['password']
);
} }
if (array_search('account', $db->listTables()) !== false) { if (array_search('account', $db->listTables()) !== false) {

View File

@ -10,6 +10,7 @@ use LogicException;
use Zend_Db_Adapter_Pdo_Mysql; use Zend_Db_Adapter_Pdo_Mysql;
use Zend_Db_Adapter_Pdo_Pgsql; use Zend_Db_Adapter_Pdo_Pgsql;
use Icinga\Util\File; use Icinga\Util\File;
use Icinga\Application\Platform;
use Icinga\Exception\ConfigurationError; use Icinga\Exception\ConfigurationError;
/** /**
@ -294,26 +295,44 @@ class DbTool
} }
/** /**
* Return a list of all available database logins * Return whether the given database login exists
* *
* @return array * @param string $username The username to search
*
* @return bool
*/ */
public function listLogins() public function hasLogin($username)
{ {
$users = array();
if ($this->config['db'] === 'mysql') { if ($this->config['db'] === 'mysql') {
$query = $this->pdoConn->query('SELECT DISTINCT grantee FROM information_schema.user_privileges'); $stmt = $this->pdoConn->prepare(
foreach ($query->fetchAll() as $row) { 'SELECT grantee FROM information_schema.user_privileges WHERE grantee = :ident LIMIT 1'
$users[] = $row['grantee']; );
} $stmt->execute(array(':ident' => "'" . $username . "'@'" . Platform::getFqdn() . "'"));
return $stmt->rowCount() === 1;
} elseif ($this->config['db'] === 'pgsql') { } elseif ($this->config['db'] === 'pgsql') {
$query = $this->pdoConn->query('SELECT usename FROM pg_catalog.pg_user'); $stmt = $this->pdoConn->prepare(
foreach ($query->fetchAll() as $row) { 'SELECT usename FROM pg_catalog.pg_user WHERE usename = :ident LIMIT 1'
$users[] = $row['usename']; );
} $stmt->execute(array(':ident' => $username));
return $stmt->rowCount() === 1;
} }
return $users; return false;
}
/**
* Add a new database login
*
* @param string $username The username of the new login
* @param string $password The password of the new login
*/
public function addLogin($username, $password)
{
if ($this->config['db'] === 'mysql') {
$stmt = $this->pdoConn->prepare('CREATE USER :user@:host IDENTIFIED BY :passw');
$stmt->execute(array(':user' => $username, ':host' => Platform::getFqdn(), ':passw' => $password));
} elseif ($this->config['db'] === 'pgsql') {
$this->pdoConn->exec("CREATE USER $username WITH PASSWORD '$password'");
}
} }
} }