diff --git a/ajax/ajax_getContent.php b/ajax/ajax_getContent.php
index f00ae2cf..1a69c8b5 100644
--- a/ajax/ajax_getContent.php
+++ b/ajax/ajax_getContent.php
@@ -3,8 +3,8 @@
/**
* sysPass
*
- * @author nuxsmin
- * @link http://syspass.org
+ * @author nuxsmin
+ * @link http://syspass.org
* @copyright 2012-2015 Rubén Domínguez nuxsmin@syspass.org
*
* This file is part of sysPass.
@@ -320,6 +320,7 @@ switch ($action) {
echo (SP_ACL::checkUserAccess("masterpass")) ? '
' . _('Encriptación') . '' : '';
echo (SP_ACL::checkUserAccess("backup")) ? '' . _('Copia de Seguridad') . '' : '';
echo (SP_ACL::checkUserAccess("config")) ? '' . _('Importar Cuentas') . '' : '';
+ echo (SP_ACL::checkUserAccess("config")) ? '' . _('Información') . '' : '';
echo '';
$tplvars['activeTab'] = 0;
@@ -351,22 +352,33 @@ switch ($action) {
$tplvars['activeTab']++;
echo '';
- SP_Html::getTemplate('migrate', $tplvars);
+ SP_Html::getTemplate('import', $tplvars);
+ echo '
';
+ }
+
+ if (SP_ACL::checkUserAccess("config")) {
+ $tplvars['activeTab']++;
+
+ echo '';
+ SP_Html::getTemplate('info', $tplvars);
echo '
';
}
echo '';
-
- echo '';
+
+ db = new PDO($dsn, $dbuser, $dbpass, array(PDO::ATTR_PERSISTENT => true));
$this->db = new PDO($dsn, $dbuser, $dbpass);
} catch (PDOException $e) {
@@ -85,7 +86,7 @@ class DBConnectionFactory
SP_Config::setValue('installed', '0');
}
- SP_Init::initError(_('No es posible conectar con la BD'), 'Error ' . $this->db->errorCode() . ': ' . $this->db->errorInfo());
+ SP_Init::initError(_('No es posible conectar con la BD'), 'Error ' . $e->getCode() . ': ' . $e->getMessage());
} else {
throw new SPDatabaseException($e->getMessage(), $e->getCode());
}
@@ -204,7 +205,7 @@ class DB
*
* @param string $query con la consulta a realizar
* @param string $querySource con el nombre de la función que realiza la consulta
- * @param array $data con los datos de la consulta
+ * @param array $data con los datos de la consulta
* @return bool|array devuelve bool si hay un error. Devuelve array con el array de registros devueltos
*/
public static function getResults($query, $querySource, &$data = null)
@@ -224,7 +225,7 @@ class DB
return false;
}
- if (self::$unbuffered && is_object($doQuery) && get_class($doQuery) == "PDOStatement"){
+ if (self::$unbuffered && is_object($doQuery) && get_class($doQuery) == "PDOStatement") {
return $doQuery;
}
@@ -244,6 +245,13 @@ class DB
return $db->last_result;
}
+ private static function resetVars()
+ {
+ self::$unbuffered = false;
+ self::$fullRowCount = false;
+ self::$retArray = false;
+ }
+
/**
* Realizar una consulta a la BBDD.
*
@@ -270,7 +278,7 @@ class DB
if (!$unbuffered) {
$this->num_fields = $queryRes->columnCount();
$this->last_result = $queryRes->fetchAll(PDO::FETCH_OBJ);
- } else{
+ } else {
return $queryRes;
}
@@ -318,7 +326,7 @@ class DB
continue;
}
- if ($param == 'blobcontent'){
+ if ($param == 'blobcontent') {
$sth->bindValue($param, $value, PDO::PARAM_LOB);
} elseif (is_int($value)) {
//error_log("INT: " . $param . " -> " . $value);
@@ -347,50 +355,6 @@ class DB
return false;
}
- /**
- * Obtener el número de filas de una consulta realizada
- *
- * @return int Número de files de la consulta
- * @throws SPDatabaseException
- */
- private function getFullRowCount(&$query)
- {
- if (empty($query)) {
- return 0;
- }
-
- $patterns = array(
- '/(LIMIT|ORDER BY|GROUP BY).*/i',
- '/SELECT DISTINCT\s([\w_]+),.* FROM/i',
- '/SELECT [\w_]+,.* FROM/i'
- );
- $replace = array('','SELECT COUNT(DISTINCT \1) FROM', 'SELECT COUNT(*) FROM');
-
- $query = preg_replace($patterns, $replace, $query);
-
- try {
- $db = DBConnectionFactory::getFactory()->getConnection();
-
- if (!is_array($this->stData)) {
- $queryRes = $db->query($query);
- $num = intval($queryRes->fetchColumn());
- } else {
- if ($queryRes = $this->prepareQueryData($query, true)) {
- $num = intval($queryRes->fetchColumn());
- }
- }
-
- $queryRes->closeCursor();
-
- return $num;
- } catch (PDOException $e) {
- error_log("Exception: " . $e->getMessage());
- throw new SPDatabaseException($e->getMessage());
- }
-
- return 0;
- }
-
/**
* Método para registar los eventos de BD en el log
*
@@ -425,6 +389,50 @@ class DB
}
}
+ /**
+ * Obtener el número de filas de una consulta realizada
+ *
+ * @return int Número de files de la consulta
+ * @throws SPDatabaseException
+ */
+ private function getFullRowCount(&$query)
+ {
+ if (empty($query)) {
+ return 0;
+ }
+
+ $patterns = array(
+ '/(LIMIT|ORDER BY|GROUP BY).*/i',
+ '/SELECT DISTINCT\s([\w_]+),.* FROM/i',
+ '/SELECT [\w_]+,.* FROM/i'
+ );
+ $replace = array('', 'SELECT COUNT(DISTINCT \1) FROM', 'SELECT COUNT(*) FROM');
+
+ $query = preg_replace($patterns, $replace, $query);
+
+ try {
+ $db = DBConnectionFactory::getFactory()->getConnection();
+
+ if (!is_array($this->stData)) {
+ $queryRes = $db->query($query);
+ $num = intval($queryRes->fetchColumn());
+ } else {
+ if ($queryRes = $this->prepareQueryData($query, true)) {
+ $num = intval($queryRes->fetchColumn());
+ }
+ }
+
+ $queryRes->closeCursor();
+
+ return $num;
+ } catch (PDOException $e) {
+ error_log("Exception: " . $e->getMessage());
+ throw new SPDatabaseException($e->getMessage());
+ }
+
+ return 0;
+ }
+
/**
* Realizar una consulta y devolver el resultado sin datos
*
@@ -467,11 +475,34 @@ class DB
self::$fullRowCount = true;
}
- private static function resetVars()
+ /**
+ * Obtener la información del servidor de base de datos
+ *
+ * @return array
+ */
+ public static function getDBinfo()
{
- self::$unbuffered = false;
- self::$fullRowCount = false;
- self::$retArray = false;
+ $dbinfo = array();
+
+ try {
+ $db = DBConnectionFactory::getFactory()->getConnection();
+
+ $attributes = array(
+ 'SERVER_VERSION',
+ 'CLIENT_VERSION',
+ 'SERVER_INFO',
+ 'CONNECTION_STATUS',
+ );
+
+ foreach ($attributes as $val) {
+ $dbinfo[$val] = $db->getAttribute(constant('PDO::ATTR_' . $val));
+ }
+
+ } catch (SPDatabaseException $e) {
+ return $dbinfo;
+ }
+
+ return $dbinfo;
}
/**
diff --git a/inc/installer.class.php b/inc/installer.class.php
index f151c2d6..88152512 100644
--- a/inc/installer.class.php
+++ b/inc/installer.class.php
@@ -156,7 +156,14 @@ class SP_Installer
$dbadmin = $options['dbuser'];
$dbpass = $options['dbpass'];
- $dbhost = $options['dbhost'];
+
+ if (preg_match('/(.*):(\d{1,5})/', $options['dbhost'], $match)){
+ $dbhost = $match[1];
+ $dbport = $match[2];
+ } else {
+ $dbhost = $options['dbhost'];
+ $dbport = 3306;
+ }
self::$isHostingMode = (isset($options['hostingmode'])) ? 1 : 0;
@@ -168,7 +175,7 @@ class SP_Installer
SP_Config::setDefaultValues();
try {
- self::checkDatabaseAdmin($dbhost, $dbadmin, $dbpass);
+ self::checkDatabaseAdmin($dbhost, $dbadmin, $dbpass, $dbport);
self::setupMySQLDatabase();
self::createAdminAccount();
} catch (InstallerException $e) {
@@ -194,18 +201,19 @@ class SP_Installer
* @param string $dbhost host de conexión
* @param string $dbadmin usuario de conexión
* @param string $dbpass clave de conexión
+ * @param string $dbport puerto de conexión
* @throws InstallerException
* @return none
*/
- private static function checkDatabaseAdmin($dbhost, $dbadmin, $dbpass)
+ private static function checkDatabaseAdmin($dbhost, $dbadmin, $dbpass, $dbport)
{
try {
- $dsn = 'mysql:host=' . $dbhost . ';charset=utf8';
+ $dsn = 'mysql:host=' . $dbhost . ';dbport=' . $dbport . ';charset=utf8';
self::$dbc = new PDO($dsn, $dbadmin, $dbpass);
} catch (PDOException $e){
throw new InstallerException('critical'
- , _('El usuario/clave de MySQL no es correcto')
- , _('Verifique el usuario de conexión con la Base de Datos'));
+ , _('No es posible conectar con la BD')
+ , _('Compruebe los datos de conexión') . '
' . $e->getMessage());
}
}
diff --git a/inc/migrate.class.php b/inc/migrate.class.php
index 2593d4eb..146fb649 100644
--- a/inc/migrate.class.php
+++ b/inc/migrate.class.php
@@ -63,8 +63,6 @@ class MigrateException extends Exception
class SP_Migrate
{
// private static $dbuser;
- private static $dbname;
- private static $dbhost;
private static $dbc; // Database connection
private static $customersByName;
private static $currentQuery;
@@ -85,15 +83,22 @@ class SP_Migrate
return $result;
}
- self::$dbname = $dbname = $options['dbname'];
- self::$dbhost = $dbhost = $options['dbhost'];
+ $dbname = $options['dbname'];
+
+ if (preg_match('/(.*):(\d{1,5})/', $options['dbhost'], $match)){
+ $dbhost = $match[1];
+ $dbport = $match[2];
+ } else {
+ $dbhost = $options['dbhost'];
+ $dbport = 3306;
+ }
$dbadmin = $options['dbuser'];
$dbpass = $options['dbpass'];
try {
- self::checkDatabaseAdmin($dbhost, $dbadmin, $dbpass, $dbname);
- self::checkDatabaseExist();
+ self::checkDatabaseAdmin($dbhost, $dbadmin, $dbpass, $dbname, $dbport);
+ self::checkDatabaseExist($dbname);
self::checkSourceVersion();
self::cleanCurrentDB();
self::migrateCustomers();
@@ -106,7 +111,11 @@ class SP_Migrate
self::migrateUsersGroups();
self::migrateConfig();
} catch (MigrateException $e) {
- self::$result['error'][] = array('type' => $e->getType(), 'description' => $e->getMessage(), 'hint' => $e->getHint());
+ self::$result['error'][] = array(
+ 'type' => $e->getType(),
+ 'description' => $e->getMessage(),
+ 'hint' => $e->getHint()
+ );
return (self::$result);
}
@@ -123,31 +132,33 @@ class SP_Migrate
* @param string $dbadmin usuario de conexión
* @param string $dbpass clave de conexión
* @param string $dbname nombre de la base de datos
+ * @param string $dbport puerto de conexión
* @throws MigrateException
* @return none
*/
- private static function checkDatabaseAdmin($dbhost, $dbadmin, $dbpass, $dbname)
+ private static function checkDatabaseAdmin($dbhost, $dbadmin, $dbpass, $dbname, $dbport)
{
try {
- $dsn = 'mysql:host=' . $dbhost . ';dbname=' . $dbname . ';charset=utf8';
+ $dsn = 'mysql:host=' . $dbhost . ';dbname=' . $dbname . ';dbport=' . $dbport . ';charset=utf8';
self::$dbc = new PDO($dsn, $dbadmin, $dbpass);
} catch (PDOException $e) {
throw new MigrateException('critical'
- , _('El usuario/clave de MySQL no es correcto')
- , _('Verifique el usuario de conexión con la Base de Datos'));
+ , _('No es posible conectar con la BD')
+ , _('Compruebe los datos de conexión') . '
' . $e->getMessage());
}
}
/**
* Comprobar si la BBDD existe.
*
- * @return int
+ * @param string $dbname nombre de la base de datos
+ * @return bool
*/
- private static function checkDatabaseExist()
+ private static function checkDatabaseExist($dbname)
{
$query = 'SELECT COUNT(*) '
. 'FROM information_schema.tables '
- . 'WHERE table_schema = \'' . self::$dbname . '\' '
+ . 'WHERE table_schema = \'' . $dbname . '\' '
. 'AND table_name = \'usrData\' LIMIT 1';
return (intval(self::$dbc->query($query)->fetchColumn()) === 0);
diff --git a/inc/tpl/migrate.php b/inc/tpl/import.php
similarity index 98%
rename from inc/tpl/migrate.php
rename to inc/tpl/import.php
index 22a4c927..a49334f3 100644
--- a/inc/tpl/migrate.php
+++ b/inc/tpl/import.php
@@ -111,7 +111,7 @@ $onCloseAction = $data['onCloseAction'];
-
diff --git a/inc/tpl/info.php b/inc/tpl/info.php
new file mode 100644
index 00000000..89d8377f
--- /dev/null
+++ b/inc/tpl/info.php
@@ -0,0 +1,78 @@
+.
+ *
+ */
+
+defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo'));
+
+$activeTab = $data['activeTab'];
+$onCloseAction = $data['onCloseAction'];
+?>
+
+
+
+
+
+
+
+ |
+
+ |
+
+
+ |
+
+
+ |
+
+ |
+
+ $infoval) {
+ echo $infoattr, ': ', $infoval, '
';
+ }
+ ?>
+ |
+
+
+ |
+
+ |
+
+ ';
+ echo _('Extensiones'), ': ', wordwrap(implode(', ', get_loaded_extensions()), 75, ' '), '
';
+ echo _('Memoria'), ': ', (memory_get_usage(true) / 1024), ' KB
';
+ echo _('Usuario'), ': ', get_current_user(), '
';
+ ?>
+ |
+
+
+ |
+
+ |
+
+
+ |
+
+
\ No newline at end of file
diff --git a/inc/tpl/install.php b/inc/tpl/install.php
index 800ab67e..f81c16d7 100644
--- a/inc/tpl/install.php
+++ b/inc/tpl/install.php
@@ -2,8 +2,8 @@
/**
* sysPass
*
- * @author nuxsmin
- * @link http://syspass.org
+ * @author nuxsmin
+ * @link http://syspass.org
* @copyright 2012-2015 Rubén Domínguez nuxsmin@syspass.org
*
* This file is part of sysPass.
@@ -25,16 +25,18 @@
$modulesErrors = SP_Util::checkModules();
$versionErrors = SP_Util::checkPhpVersion();
$resInstall = array();
-$isCompleted = 0;
+$isCompleted = false;
-if (isset($_POST['install']) AND $_POST['install'] == 'true') {
+if (isset($_POST['install']) && $_POST['install'] == 'true') {
$resInstall = SP_Installer::install($_POST);
if (count($resInstall) == 0) {
- $resInstall[] = array('type' => 'ok',
+ $resInstall[] = array(
+ 'type' => 'ok',
'description' => _('Instalación finalizada'),
- 'hint' => _('Pulse aquí para acceder'));
- $isCompleted = 1;
+ 'hint' => _('Pulse aquí para acceder')
+ );
+ $isCompleted = true;
}
}
?>
@@ -46,40 +48,42 @@ if (isset($_POST['install']) AND $_POST['install'] == 'true') {
+ 'warning',
+ 'description' => _('La version de PHP es vulnerable al ataque NULL Byte (CVE-2006-7243)'),
+ 'hint' => _('Actualice la versión de PHP para usar sysPass de forma segura'));
+ }
+ if (!SP_Util::secureRNG_available()) {
+ $securityErrors[] = array('type' => 'warning',
+ 'description' => _('No se encuentra el generador de números aleatorios.'),
+ 'hint' => _('Sin esta función un atacante puede utilizar su cuenta al resetear la clave'));
+ }
+
+ $errors = array_merge($modulesErrors, $securityErrors, $resInstall);
+
+ if (count($errors) > 0) {
+ echo '';
+
+ foreach ($errors as $err) {
+ if (is_array($err)) {
+ echo '- ';
+ echo '' . $err['description'] . '';
+ echo ($err['hint']) ? '
' . $err['hint'] . ' ' : '';
+ echo ' ';
+ }
+ }
+ echo ' ';
+ }
+ ?>
+
-
+
|