mirror of
https://github.com/YunoHost-Apps/ffsync_ynh.git
synced 2024-09-03 18:26:38 +02:00
400 lines
12 KiB
PHP
400 lines
12 KiB
PHP
|
<?php
|
||
|
|
||
|
# ***** BEGIN LICENSE BLOCK *****
|
||
|
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||
|
#
|
||
|
# The contents of this file are subject to the Mozilla Public License Version
|
||
|
# 1.1 (the "License"); you may not use this file except in compliance with
|
||
|
# the License. You may obtain a copy of the License at
|
||
|
# http://www.mozilla.org/MPL/
|
||
|
#
|
||
|
# Software distributed under the License is distributed on an "AS IS" basis,
|
||
|
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||
|
# for the specific language governing rights and limitations under the
|
||
|
# License.
|
||
|
#
|
||
|
# The Original Code is Weave Minimal Server
|
||
|
#
|
||
|
# The Initial Developer of the Original Code is
|
||
|
# Stefan Fischer
|
||
|
# Portions created by the Initial Developer are Copyright (C) 2012
|
||
|
# the Initial Developer. All Rights Reserved.
|
||
|
#
|
||
|
# Contributor(s):
|
||
|
# Daniel Triendl <daniel@pew.cc>
|
||
|
# balu
|
||
|
#
|
||
|
# Alternatively, the contents of this file may be used under the terms of
|
||
|
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||
|
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||
|
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||
|
# of those above. If you wish to allow use of your version of this file only
|
||
|
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||
|
# use your version of this file under the terms of the MPL, indicate your
|
||
|
# decision by deleting the provisions above and replace them with the notice
|
||
|
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||
|
# the provisions above, a recipient may use your version of this file under
|
||
|
# the terms of any one of the MPL, the GPL or the LGPL.
|
||
|
#
|
||
|
# ***** END LICENSE BLOCK *****
|
||
|
|
||
|
// --------------------------------------------
|
||
|
// variables start
|
||
|
// --------------------------------------------
|
||
|
$action = null;
|
||
|
$dbType = null;
|
||
|
|
||
|
$dbUser = null;
|
||
|
$dbName = null;
|
||
|
$dbPass = null;
|
||
|
$dbHost = null;
|
||
|
|
||
|
|
||
|
// --------------------------------------------
|
||
|
// variables end
|
||
|
// --------------------------------------------
|
||
|
|
||
|
|
||
|
// --------------------------------------------
|
||
|
// post handling start
|
||
|
// --------------------------------------------
|
||
|
if ( isset( $_POST['action'] ) ) {
|
||
|
$action = check_input($_POST['action']);
|
||
|
}
|
||
|
|
||
|
if ( isset( $_POST['dbType'] ) ) {
|
||
|
$dbType = check_input($_POST['dbType']);
|
||
|
}
|
||
|
|
||
|
if ( isset( $_POST['dbhost'] ) ) {
|
||
|
$dbHost = check_input($_POST['dbhost']);
|
||
|
}
|
||
|
|
||
|
if ( isset( $_POST['dbname'] ) ) {
|
||
|
$dbName = check_input($_POST['dbname']);
|
||
|
}
|
||
|
|
||
|
if ( isset( $_POST['dbuser'] ) ) {
|
||
|
$dbUser = check_input($_POST['dbuser']);
|
||
|
}
|
||
|
|
||
|
if ( isset( $_POST['dbpass'] ) ) {
|
||
|
$dbPass = check_input($_POST['dbpass']);
|
||
|
}
|
||
|
|
||
|
// --------------------------------------------
|
||
|
// post handling end
|
||
|
// --------------------------------------------
|
||
|
|
||
|
|
||
|
// --------------------------------------------
|
||
|
// functions start
|
||
|
// --------------------------------------------
|
||
|
|
||
|
/*
|
||
|
ensure that the input is not total waste
|
||
|
*/
|
||
|
function check_input( $data ) {
|
||
|
$data = trim($data);
|
||
|
$data = stripslashes($data);
|
||
|
$data = htmlspecialchars($data);
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
create the config file with the database type
|
||
|
and the given connection credentials
|
||
|
*/
|
||
|
function write_config_file($dbt, $dbh, $dbn, $dbu, $dbp, $fsRoot) {
|
||
|
|
||
|
// construct the name of config file
|
||
|
//
|
||
|
$path = explode('/', $_SERVER['SCRIPT_FILENAME']);
|
||
|
array_pop($path);
|
||
|
array_push($path, 'settings.php');
|
||
|
$cfg_file_name = implode('/', $path);
|
||
|
|
||
|
if ( file_exists($cfg_file_name) && filesize( $cfg_file_name ) > 0 ) {
|
||
|
echo "<hr>The config file $cfg_file_name is already present</hr>";
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
echo "Creating cfg file: " . $cfg_file_name;
|
||
|
|
||
|
// now build the content of the config file
|
||
|
//
|
||
|
$cfg_content = "<?php\n\n";
|
||
|
$cfg_content .= " // you can disable registration to the firefox sync server here,\n";
|
||
|
$cfg_content .= " // by setting ENABLE_REGISTER to false\n";
|
||
|
$cfg_content .= " // \n";
|
||
|
$cfg_content .= " define(\"ENABLE_REGISTER\", true);\n\n";
|
||
|
|
||
|
$cfg_content .= " // firefox sync server url, this should end with a /\n";
|
||
|
$cfg_content .= " // e.g. https://YourDomain.de/Folder_und_ggf_/index.php/\n";
|
||
|
$cfg_content .= " // \n";
|
||
|
$cfg_content .= " define(\"FSYNCMS_ROOT\", \"$fsRoot\");\n\n";
|
||
|
|
||
|
$cfg_content .= " // Database connection credentials\n";
|
||
|
$cfg_content .= " // \n";
|
||
|
$cfg_content .= " define(\"SQLITE_FILE\", \"weave_db\");\n";
|
||
|
if ( $dbt != "mysql" ) {
|
||
|
$cfg_content .= " define(\"MYSQL_ENABLE\", false);\n";
|
||
|
$cfg_content .= " define(\"MYSQL_HOST\", \"localhost\");\n";
|
||
|
$cfg_content .= " define(\"MYSQL_DB\", \"fsync\");\n";
|
||
|
$cfg_content .= " define(\"MYSQL_USER\", \"fsyncUserName\");\n";
|
||
|
$cfg_content .= " define(\"MYSQL_PASSWORD\", \"fsyncUserPassword\");\n";
|
||
|
} else {
|
||
|
$cfg_content .= " define(\"MYSQL_ENABLE\", true);\n";
|
||
|
$cfg_content .= " define(\"MYSQL_HOST\", \"$dbh\");\n";
|
||
|
$cfg_content .= " define(\"MYSQL_DB\", \"$dbn\");\n";
|
||
|
$cfg_content .= " define(\"MYSQL_USER\", \"$dbu\");\n";
|
||
|
$cfg_content .= " define(\"MYSQL_PASSWORD\", \"$dbp\");\n";
|
||
|
}
|
||
|
$cfg_content .= "\n";
|
||
|
$cfg_content .= " // Use bcrypt instead of MD5 for password hashing\n";
|
||
|
$cfg_content .= " define(\"BCRYPT\", true);\n";
|
||
|
$cfg_content .= " define(\"BCRYPT_ROUNDS\", 12);\n";
|
||
|
|
||
|
$cfg_content .= "\n?>\n";
|
||
|
|
||
|
// now write everything
|
||
|
//
|
||
|
$cfg_file = fopen($cfg_file_name, "a");
|
||
|
fputs($cfg_file, "$cfg_content");
|
||
|
fclose($cfg_file);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
print the html header for the form
|
||
|
*/
|
||
|
function print_header( $title ) {
|
||
|
if ( ! isset( $title ) ) {
|
||
|
$title = "";
|
||
|
}
|
||
|
print '<html><header><title>' . $title . '</title><body>
|
||
|
<h1>Setup FSyncMS</h1>
|
||
|
<form action="setup.php" method="post">';
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
print the html footer
|
||
|
*/
|
||
|
function print_footer() {
|
||
|
print '</form></body></html>';
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
print the html for for the mysql connection credentials
|
||
|
*/
|
||
|
function print_mysql_connection_form() {
|
||
|
print_header("MySQL database connection setup");
|
||
|
print 'MySQL database connection setup
|
||
|
<table>
|
||
|
<tr>
|
||
|
<td>Host</td>
|
||
|
<td><input type="text" name="dbhost" /></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Instance name</td>
|
||
|
<td><input type="text" name="dbname" /></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Username</td>
|
||
|
<td><input type="text" name="dbuser" /></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td>Password</td>
|
||
|
<td><input type="password" name="dbpass" /></td>
|
||
|
</tr>
|
||
|
</table>
|
||
|
|
||
|
<input type="hidden" name="action" value="step2">
|
||
|
<input type="hidden" name="dbType" value="mysql">
|
||
|
<p><input type="submit" value="OK"></p>';
|
||
|
print_footer();
|
||
|
}
|
||
|
// --------------------------------------------
|
||
|
// functions end
|
||
|
// --------------------------------------------
|
||
|
|
||
|
// check if we have no configuration at the moment
|
||
|
//
|
||
|
if ( file_exists("settings.php") && filesize( "settings.php" ) > 0 ) {
|
||
|
echo "<hr><h2>The setup looks like it's completed, please delete settings.php</h2><hr>";
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
|
||
|
// inital page - select the database type
|
||
|
//
|
||
|
if ( ! $action ) {
|
||
|
|
||
|
// first check if we have pdo installed (untested)
|
||
|
//
|
||
|
if ( ! extension_loaded('PDO') ) {
|
||
|
print "ERROR - PDO is missing in the php installation!";
|
||
|
exit();
|
||
|
}
|
||
|
|
||
|
$validPdoDriver = 0;
|
||
|
|
||
|
print_header("Setup FSyncMS - DB Selection");
|
||
|
|
||
|
print 'Which database type should be used?<br>';
|
||
|
if ( extension_loaded('pdo_mysql') ) {
|
||
|
print '<input type="radio" name="dbType" value="mysql" /> MySQL <br>';
|
||
|
$validPdoDriver++;
|
||
|
} else {
|
||
|
print 'MySQL not possible (Driver missing) <br>';
|
||
|
}
|
||
|
|
||
|
if ( extension_loaded('pdo_sqlite') ) {
|
||
|
print '<input type="radio" name="dbType" value="sqlite" checked="checked" /> SQLite ';
|
||
|
$validPdoDriver++;
|
||
|
} else {
|
||
|
print 'SQLite not possible (Driver missing) <br>';
|
||
|
}
|
||
|
|
||
|
if ( $validPdoDriver < 1 ) {
|
||
|
print '<hr> No valid pdo driver found! Please install a valid pdo driver first <hr>';
|
||
|
} else {
|
||
|
print '<input type="hidden" name="action" value="step1">
|
||
|
<p><input type="submit" value="OK" /></p>';
|
||
|
}
|
||
|
|
||
|
// ensure we bail out at this point ;)
|
||
|
exit();
|
||
|
};
|
||
|
|
||
|
|
||
|
// step 2 (connection data) below
|
||
|
//
|
||
|
if ( $action == "step1" ) {
|
||
|
|
||
|
// now check if the database is in place
|
||
|
//
|
||
|
print_header("Setup FSyncMS - DB Setup: $dbType!");
|
||
|
switch ( $dbType ) {
|
||
|
case "sqlite":
|
||
|
$action = "step2";
|
||
|
break;
|
||
|
|
||
|
case "mysql":
|
||
|
print_mysql_connection_form();
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
print "ERROR - This type of database ($dbType) is not valid at the moment!";
|
||
|
exit();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// now generate the database
|
||
|
//
|
||
|
if ( $action == "step2" ) {
|
||
|
|
||
|
$dbInstalled = false;
|
||
|
$dbHandle = null;
|
||
|
try {
|
||
|
|
||
|
if ( $dbType == "sqlite" ) {
|
||
|
|
||
|
$path = explode('/', $_SERVER['SCRIPT_FILENAME']);
|
||
|
$db_name = 'weave_db';
|
||
|
array_pop($path);
|
||
|
array_push($path, $db_name);
|
||
|
$db_name = implode('/', $path);
|
||
|
|
||
|
if ( file_exists($db_name) && filesize( $db_name ) > 0 ) {
|
||
|
$dbInstalled = true;
|
||
|
} else {
|
||
|
echo("Creating sqlite weave storage: ". $db_name ."<br>");
|
||
|
$dbHandle = new PDO('sqlite:' . $db_name);
|
||
|
$dbHandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||
|
}
|
||
|
|
||
|
} else if ( $dbType == "mysql" ) {
|
||
|
|
||
|
$dbHandle = new PDO("mysql:host=". $dbHost .";dbname=". $dbName, $dbUser, $dbPass);
|
||
|
$select_stmt = "show tables like 'wbo'";
|
||
|
$sth = $dbHandle->prepare($select_stmt);
|
||
|
$sth->execute();
|
||
|
$count = $sth->rowCount();
|
||
|
if ( $count > 0 ) {
|
||
|
$dbInstalled = true;
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
} catch ( PDOException $exception ) {
|
||
|
echo("database unavailable " . $exception->getMessage());
|
||
|
throw new Exception("Database unavailable " . $exception->getMessage() , 503);
|
||
|
}
|
||
|
|
||
|
if ( $dbInstalled ) {
|
||
|
echo "DB is already installed!<br>";
|
||
|
|
||
|
} else {
|
||
|
echo "Now going to install the new database! Type is: $dbType<br>";
|
||
|
|
||
|
try {
|
||
|
$create_statement = " create table wbo ( username varchar(100), id varchar(65), collection varchar(100),
|
||
|
parentid varchar(65), predecessorid int, modified real, sortindex int,
|
||
|
payload text, payload_size int, ttl int, primary key (username,collection,id))";
|
||
|
$create_statement2 = " create table users ( username varchar(255), md5 varchar(124), primary key (username)) ";
|
||
|
$index1 = 'create index parentindex on wbo (username, parentid)';
|
||
|
$index2 = 'create index predecessorindex on wbo (username, predecessorid)';
|
||
|
$index3 = 'create index modifiedindex on wbo (username, collection, modified)';
|
||
|
|
||
|
$sth = $dbHandle->prepare($create_statement);
|
||
|
$sth->execute();
|
||
|
$sth = $dbHandle->prepare($create_statement2);
|
||
|
$sth->execute();
|
||
|
$sth = $dbHandle->prepare($index1);
|
||
|
$sth->execute();
|
||
|
$sth = $dbHandle->prepare($index2);
|
||
|
$sth->execute();
|
||
|
$sth = $dbHandle->prepare($index3);
|
||
|
$sth->execute();
|
||
|
echo "Database created <br>";
|
||
|
|
||
|
} catch( PDOException $exception ) {
|
||
|
throw new Exception("Database unavailable", 503);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//guessing fsroot
|
||
|
// get the FSYNC_ROOT url
|
||
|
//
|
||
|
$fsRoot ="https://";
|
||
|
if ( ! isset($_SERVER['HTTPS']) ) {
|
||
|
$fsRoot = "http://";
|
||
|
}
|
||
|
$fsRoot .= $_SERVER['SERVER_NAME'] . dirname($_SERVER['SCRIPT_NAME']) . "/";
|
||
|
if( strpos( $_SERVER['REQUEST_URI'], 'index.php') !== 0 ) {
|
||
|
$fsRoot .= "index.php/";
|
||
|
}
|
||
|
|
||
|
// write settings.php, if not possible, display the needed contant
|
||
|
//
|
||
|
write_config_file($dbType, $dbHost, $dbName, $dbUser, $dbPass, $fsRoot);
|
||
|
|
||
|
echo "<hr><hr> Finished the setup, please delete setup.php and go on with the FFSync<hr><hr>";
|
||
|
echo <<<EOT
|
||
|
<hr><hr>
|
||
|
<h4>This script has guessed the Address of your installation, this might not be accurate,<br/>
|
||
|
Please check if this script can be reached by <a href="$fsRoot">$fsRoot</a> .<br/>
|
||
|
If thats not the case you have to ajust the settings.php<br />
|
||
|
</h4>
|
||
|
EOT;
|
||
|
}
|
||
|
|
||
|
?>
|