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 ''; + } + ?> +
    '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 ''; - } - - if ($isCompleted === 0): + if ($isCompleted === false): ?>
    @@ -173,17 +177,19 @@ if (isset($_POST['install']) AND $_POST['install'] == 'true') {
    - +