codiad/install/index.php

349 lines
No EOL
8.3 KiB
PHP

<?php
ini_set( 'display_errors', 1 );
ini_set( 'display_startup_errors', 1 );
error_reporting( E_ALL );
if( is_file( __DIR__ . "/../config.php" ) ) {
echo "Codiad is already installed.";
exit();
}
require_once( __DIR__ . "/../components/initialize/class.initialize.php" );
require_once( __DIR__ . "/../components/user/class.user.php" );
Initialize::get_instance();
$check_paths = Initialize::PATHS;
$checks_html = "";
$extensions = Initialize::EXTENSIONS;
$extensions_html = "";
$paths_html = "";
if( isset( $_POST["storage"] ) && ! isset( $_POST["username"] ) ) {
$pass = true;
$return = Common::get_default_return();
$storage = $_POST["storage"];
if( $pass && ! Initialize::check_extensions() ) {
$return["status"] = "error";
$return["message"] = "Required PHP extensions are not enabled.";
$return["value"] = false;
$pass = false;
}
if( $pass && ! Initialize::check_paths() ) {
$return["status"] = "error";
$return["message"] = "Unable to get write permissions for required paths.";
$return["value"] = false;
$pass = false;
}
if( $pass && ! in_array( $storage, array_values( Data::DB_TYPES ), true ) ) {
$return["status"] = "error";
$return["message"] = "Storage type is not supported.";
$return["value"] = false;
$pass = false;
}
if( $pass ) {
if( $storage === "filesystem" ) {
if( isset( $_POST["override"] ) && $_POST["override"] === "true" ) {
$dir = realpath( __DIR__ . "/../data" );
$files = scandir( $dir );
foreach( $files as $file ) {
if( $file == "." || $file == ".." || strpos( $file, ".inc" ) === false ) {
continue;
}
unlink( "$dir/$file" );
}
}
define( "DBTYPE", $_POST["storage"] );
$data = Data::get_instance();
$return = $data->install( $_POST["storage"] );
} else {
$requirements = array(
"dbhost",
"dbname",
"dbuser",
"dbpass",
"dbpass1"
);
foreach( $requirements as $r ) {
if( ! isset( $_POST["$r"] ) ) {
$return["status"] = "error";
$return["message"] = "$r variable is required but was not provided.";
$return["value"] = false;
$pass = false;
break;
}
}
if( $pass && $_POST["dbpass"] !== $_POST["dbpass1"] ) {
$return["status"] = "error";
$return["message"] = "Database passwords do not match.";
$return["value"] = false;
$pass = false;
}
if( $pass ) {
try {
define( "DBHOST", $_POST["dbhost"] );
define( "DBTYPE", $_POST["storage"] );
define( "DBNAME", $_POST["dbname"] );
define( "DBUSER", $_POST["dbuser"] );
define( "DBPASS", $_POST["dbpass"] );
$data = Data::get_instance();
$connection = $data->connect();
} catch( Throwable $e ) {
$return["status"] = "error";
$return["message"] = "Unable to connect to database.";
$return["value"] = $e->getMessage();
$pass = false;
}
if( $pass && isset( $_POST["override"] ) && $_POST["override"] === "true" ) {
try {
$data->query( "DROP TABLE access;" );
} catch( Throwable $e ) {}
try {
$data->query( "DROP TABLE active;" );
} catch( Throwable $e ) {}
try {
$data->query( "DROP TABLE options;" );
} catch( Throwable $e ) {}
try {
$data->query( "DROP TABLE projects;" );
} catch( Throwable $e ) {}
try {
$data->query( "DROP TABLE users;" );
} catch( Throwable $e ) {}
try {
$data->query( "DROP TABLE user_options;" );
} catch( Throwable $e ) {}
}
}
if( $pass ) {
$return = $data->install( $_POST["storage"] );
}
}
}
exit( json_encode( $return ) );
}
if( isset( $_POST["username"] ) ) {
define( "DBTYPE", $_POST["storage"] );
if( isset( $_POST["dbhost"] ) ) {
define( "DBHOST", $_POST["dbhost"] );
define( "DBNAME", $_POST["dbname"] );
define( "DBUSER", $_POST["dbuser"] );
define( "DBPASS", $_POST["dbpass"] );
}
$return = Common::get_default_return();
$User = User::get_instance();
$return = $User->create_user( array(
"username" => $_POST["username"],
"password" => $_POST["password"],
"password1" => $_POST["password1"],
"access" => Permissions::SYSTEM_LEVELS["admin"],
));
if( $return["status"] !== "error" ) {
$users = $User->get_users();
$created = false;
foreach( $users["value"] as $row => $data ) {
if( $data["username"] == $_POST["username"] ) {
$created = true;
break;
}
}
if( $created ) {
copy( __DIR__ . "/../config.example.php", __DIR__ . "/../config.php" );
$Options = Options::get_instance();
$Options->update_config( "BASE_PATH", "'" . Common::strip_trailing_slash( realpath( __DIR__ . "/../" ) ) . "'" );
$Options->update_config( "BASE_URL", "'" . Common::strip_trailing_slash( str_replace( "/install/index.php", "", Common::get_url() ) ) . "'" );
$Options->update_config( "DBTYPE", "'" . $_POST["storage"] . "'" );
if( isset( $_POST["dbname"] ) ) {
$Options->update_config( "DBNAME", "'" . $_POST["dbname"] . "'" );
$Options->update_config( "DBUSER", "'" . $_POST["dbuser"] . "'" );
$Options->update_config( "DBPASS", "'" . $_POST["dbpass"] . "'" );
}
} else {
$return["status"] = "error";
$return["message"] = "User could not be found in data storage system.";
}
}
exit( json_encode( $return ) );
}
$components = scandir( COMPONENTS );
unset( $components["."], $components[".."] );
// Theme
$theme = THEME;
if( isset( $_SESSION['theme'] ) ) {
$theme = $_SESSION['theme'];
}
if( Common::is_ssl() ) {
$ssl_html = "<span style='color:green;'>SSL is enabled</span><br>";
} else {
$ssl_html = "<span style='color:gold;'>SSL is not enabled. This is highly insecure and is not reccommended.</span><br>";
}
$checks_html .= "SSL:<br>$ssl_html<br><br>";
foreach( $extensions as $extension ) {
if( extension_loaded( $extension ) ) {
$extensions_html .= "<span style='color:green;'>$extension</span><br>";
} else {
$extensions_html .= "<span style='color:red;'>$extension</span><br>";
}
}
$checks_html .= "Requirements:<br>$extensions_html<br><br>";
foreach( $check_paths as $path ) {
if( is_writable( constant( $path ) ) ) {
$paths_html .= "<span style='color:green;'>" . basename( constant( $path ) ) . "</span><br>";
} else {
$paths_html .= "<span style='color:red;'>" . basename( constant( $path ) ) . "</span><br>";
}
}
$checks_html .= "Path Permissions:<br>$paths_html";
$checks_html .= "<span id='data_status'></span>";
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="
width=device-width,
initial-scale=1.0,
maximum-scale=1.0,
user-scalable=no">
<title><?php echo SITE_NAME;?></title>
<?php
// Load System CSS Files
$stylesheets = array(
"jquery.toastmessage.css",
"reset.css",
"fonts.css",
"screen.css"
);
foreach( $stylesheets as $sheet ) {
if( file_exists( THEMES . "/". $theme . "/" . $sheet ) ) {
echo( '<link rel="stylesheet" href="../themes/' . $theme . '/' . $sheet . '?v=' . Update::get_version() . '">' );
}
}
if( file_exists( THEMES . "/". $theme . "/favicon.ico" ) ) {
echo( '<link rel="icon" href="' . THEMES . '/' . $theme . '/favicon.ico" type="image/x-icon" />' );
} else {
echo( '<link rel="icon" href="../assets/images/favicon.ico" type="image/x-icon" />' );
}
?>
<style>
#container {
overflow-y: auto;
position: fixed;
right: 50%;
top: 50%;
transform: translate( 50%,-50% );
width: 50%;
}
@media only screen and (max-width: 650px) {
#container {
width: 80%;
}
}
</style>
<script src="../assets/js/jquery-3.5.1.js"></script>
<script src="../assets/js/jquery.toastmessage.js"></script>
<script src="../assets/js/codiad.js"></script>
<script src="../assets/js/message.js"></script>
<script src="../assets/js/events.js"></script>
<script src="../assets/js/loading.js"></script>
<script src="../assets/js/common.js"></script>
<script src="../assets/js/forms.js"></script>
</head>
<body>
<div id="container">
<div>
<p>Checks:</p>
<pre id="status"><?php echo $checks_html;?></pre>
</div>
<div id="installation"></div>
</div>
<script src="./install.js"></script>
</body>
</html>