| 
<?php
 /**
 *
 * Simple password manager written in PHP with Bootstrap and PDO database connections
 *
 *  File name: step2.php
 *  Last Modified: 4.01.23 ?., 23:56 ?.
 *
 *  @link          https://blacktiehost.com
 *  @since         1.0.0
 *  @version       2.4.0
 *  @author        Milen Karaganski <[email protected]>
 *
 *  @license       GPL-3.0+
 *  @license       http://www.gnu.org/licenses/gpl-3.0.txt
 *  @copyright     Copyright (c)  2020 - 2022 blacktiehost.com
 *
 */
 
 /**
 * \file        step2.php
 * \ingroup     Password Manager
 * \brief       Create database tables
 */
 
 declare(strict_types=1);
 
 $allow_continue = 0;
 
 try {
 include_once('inc.php');
 } catch (Exception $e) {
 $error = $e->getMessage();
 print 'File "inc.php" not found!';
 die();
 }
 
 $lockerror = '';
 //Check for lock file
 $lockfile = '../../docs/install.lock';
 if (file_exists($lockfile)) {
 $lockerror = 1;
 }
 
 /*
 * Actions
 */
 if (!$lockerror) {
 $error = '';
 
 include_once('../../conf/conf.php');
 
 define('PM_MAIN_DB_PREFIX', $db_prefix);
 
 $main_db_character_set = str_replace('-', '', $main_db_character_set);
 
 $conn = new PDO("mysql:host=$db_host;dbname=$db_name;port=$port", $db_user, $db_pass);
 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
 $requestnb = 0;
 
 /***************************************************************************************
 *
 * Create database tables from *.sql files
 * Must be done before *.key.sql files
 *
 ***************************************************************************************/
 
 $dir = 'tables/';
 $ok = 0;
 $handle = opendir($dir) or die($langs->trans('Cannot open dir'));
 $tablefound = 0;
 $tabledata = [];
 if (is_resource($handle)) {
 while (($file = readdir($handle)) !== false) {
 if (preg_match('/\.sql$/i', $file) && preg_match('/^pm_/i', $file) && !preg_match('/\.key\.sql$/i', $file)) {
 $tablefound++;
 $tabledata[] = $file;
 }
 }
 closedir($handle);
 }
 
 // Sort list of sql files on alphabetical order (load order is important)
 sort($tabledata);
 
 foreach ($tabledata as $file) {
 $name = substr($file, 0, strlen($file) - 4);
 $buffer = '';
 $fp = fopen($dir . $file, 'r');
 if ($fp) {
 while (!feof($fp)) {
 $buf = fgets($fp, 4096);
 if (substr($buf, 0, 2) <> '--') {
 $buf = preg_replace('/--(.+)*/', '', $buf);
 $buf = trim($buf, "\xEF\xBB\xBF");
 $buffer .= $buf;
 }
 }
 fclose($fp);
 
 $buffer = trim($buffer);
 
 // Replace the prefix tables
 if (PM_MAIN_DB_PREFIX != 'pm_') {
 $buffer = preg_replace('/pm_/i', PM_MAIN_DB_PREFIX, $buffer);
 }
 
 $buffer = preg_replace('/table_collation/i', $main_db_collation, $buffer);
 $buffer = preg_replace('/table_character_set/i', $main_db_character_set, $buffer);
 
 $requestnb++;
 
 if (!$conn->inTransaction()) {
 $conn->beginTransaction();
 }
 
 try {
 $conn->exec($buffer);
 } catch (PDOException $e) {
 $error = $langs->trans('Cannot create database tables from file') . ' ' . $file . '. ' . $e->getMessage();
 }
 } else {
 $error = $langs->trans('Failed to open file') . ' ' . $file;
 }
 
 if ($tablefound) {
 if ($error == 0) {
 $ok = 1;
 }
 } else {
 $error = $langs->trans('Failed to find files to create database in directory!');
 }
 }
 $buffer = '';
 
 /***************************************************************************************
 *
 * Create database tables from *key.sql files
 * Must be done after *.sql files
 *
 ***************************************************************************************/
 $ok = 0;
 $okkeys = 0;
 $handle = opendir($dir) or die('Cannot open dir');
 $tablefound = 0;
 $tabledata = [];
 if (is_resource($handle)) {
 while (($file = readdir($handle)) !== false) {
 if (preg_match('/\.sql$/i', $file) && preg_match('/^pm_/i', $file) && preg_match('/\.key\.sql$/i', $file)) {
 $tablefound++;
 $tabledata[] = $file;
 }
 }
 closedir($handle);
 }
 
 // Sort list of sql files on alphabetical order (load order is important)
 sort($tabledata);
 foreach ($tabledata as $file) {
 $name = substr($file, 0, strlen($file) - 4);
 $buffer = '';
 $fp = fopen($dir . $file, 'r');
 if ($fp) {
 while (!feof($fp)) {
 $buf = fgets($fp, 4096);
 $buf = preg_replace('/--(.+)*/', '', $buf);
 $buf = trim($buf, "\xEF\xBB\xBF");
 $buffer .= $buf;
 }
 fclose($fp);
 
 $listesql = explode(';', $buffer);
 foreach ($listesql as $req) {
 $buffer = trim($req);
 if ($buffer) {
 // Replace the prefix tables
 if (PM_MAIN_DB_PREFIX != 'pm_') {
 $buffer = preg_replace('/pm_/i', PM_MAIN_DB_PREFIX, $buffer);
 }
 
 $buffer = preg_replace('/table_collation/i', $main_db_collation, $buffer);
 $buffer = preg_replace('/table_character_set/i', $main_db_character_set, $buffer);
 
 $requestnb++;
 
 if (!$conn->inTransaction()) {
 $conn->beginTransaction();
 }
 
 try {
 $conn->exec($buffer);
 } catch (PDOException $e) {
 $error = $langs->trans('Cannot create database tables from file') . ' ' . $file . '. ' . $e->getMessage();
 }
 }
 }
 } else {
 $error = $langs->trans('Failed to find files to create database in directory!');
 }
 
 if ($tablefound) {
 if ($error == 0) {
 $ok = 1;
 }
 } else {
 $error = 'Failed to find files to create database in directory!';
 }
 }
 }
 
 if (!$error) {
 $con = null;
 
 $fileconf = '../../conf/conf.php';
 //Set conf file to read only
 if (isset($_SERVER['WINDIR'])) {
 // Host OS is Windows
 $fileconf = str_replace('/', '\\', $fileconf);
 unset($res);
 exec('attrib +R ' . escapeshellarg($fileconf), $res);
 $res = $res[0];
 } else {
 // Host OS is *nix
 $res = chmod($fileconf, 0644);
 }
 
 $allow_continue = 1;
 }
 
 /*
 * View
 */
 
 print $twig->render(
 'step2.body.html.twig',
 [
 'langs'        => $langs,
 'main_url'     => PM_INSTALL_MAIN_URL,
 'root_folder'  => PM_INSTALL_APP_ROOT_FOLDER,
 'lockerror'    => $lockerror,
 'installerror' => $installerror,
 'title'        => $langs->trans('InstallingTables'),
 'db_error'     => $error,
 ]
 );
 
 if ($lockerror) {
 print $langs->trans('InstallLockfileError');
 }
 
 if ($allow_continue == 1) {
 header('Refresh: 3;url=step3.php');
 }
 
 print $twig->render(
 'install.footer.html.twig',
 [
 'langs'    => $langs,
 'main_url' => PM_INSTALL_MAIN_URL,
 'error'    => $errors,
 'message'  => $messages,
 ]
 );
 
 |