Blame view
sources/lib/private/setup.php
6.61 KB
|
31b7f2792
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 |
<?php
class DatabaseSetupException extends \OC\HintException
{
}
class OC_Setup {
static $dbSetupClasses = array(
'mysql' => '\OC\Setup\MySQL',
'pgsql' => '\OC\Setup\PostgreSQL',
'oci' => '\OC\Setup\OCI',
'mssql' => '\OC\Setup\MSSQL',
'sqlite' => '\OC\Setup\Sqlite',
'sqlite3' => '\OC\Setup\Sqlite',
);
public static function getTrans(){
return OC_L10N::get('lib');
}
public static function install($options) {
$l = self::getTrans();
$error = array();
$dbtype = $options['dbtype'];
if(empty($options['adminlogin'])) {
$error[] = $l->t('Set an admin username.');
}
if(empty($options['adminpass'])) {
$error[] = $l->t('Set an admin password.');
}
if(empty($options['directory'])) {
$options['directory'] = OC::$SERVERROOT."/data";
}
if (!isset(self::$dbSetupClasses[$dbtype])) {
$dbtype = 'sqlite';
}
$class = self::$dbSetupClasses[$dbtype];
$dbSetup = new $class(self::getTrans(), 'db_structure.xml');
$error = array_merge($error, $dbSetup->validate($options));
if(count($error) != 0) {
return $error;
}
//no errors, good
$username = htmlspecialchars_decode($options['adminlogin']);
$password = htmlspecialchars_decode($options['adminpass']);
$datadir = htmlspecialchars_decode($options['directory']);
if (OC_Util::runningOnWindows()) {
$datadir = rtrim(realpath($datadir), '\\');
}
//use sqlite3 when available, otherise sqlite2 will be used.
if($dbtype=='sqlite' and class_exists('SQLite3')) {
$dbtype='sqlite3';
}
//generate a random salt that is used to salt the local user passwords
$salt = OC_Util::generateRandomBytes(30);
OC_Config::setValue('passwordsalt', $salt);
//write the config file
OC_Config::setValue('datadirectory', $datadir);
OC_Config::setValue('dbtype', $dbtype);
OC_Config::setValue('version', implode('.', OC_Util::getVersion()));
try {
$dbSetup->initialize($options);
$dbSetup->setupDatabase($username);
} catch (DatabaseSetupException $e) {
$error[] = array(
'error' => $e->getMessage(),
'hint' => $e->getHint()
);
return($error);
} catch (Exception $e) {
$error[] = array(
'error' => 'Error while trying to create admin user: ' . $e->getMessage(),
'hint' => ''
);
return($error);
}
//create the user and group
try {
OC_User::createUser($username, $password);
}
catch(Exception $exception) {
$error[] = $exception->getMessage();
}
if(count($error) == 0) {
OC_Appconfig::setValue('core', 'installedat', microtime(true));
OC_Appconfig::setValue('core', 'lastupdatedat', microtime(true));
OC_AppConfig::setValue('core', 'remote_core.css', '/core/minimizer.php');
OC_AppConfig::setValue('core', 'remote_core.js', '/core/minimizer.php');
OC_Group::createGroup('admin');
OC_Group::addToGroup($username, 'admin');
OC_User::login($username, $password);
//guess what this does
OC_Installer::installShippedApps();
//create htaccess files for apache hosts
if (isset($_SERVER['SERVER_SOFTWARE']) && strstr($_SERVER['SERVER_SOFTWARE'], 'Apache')) {
self::createHtaccess();
}
//and we are done
OC_Config::setValue('installed', true);
}
return $error;
}
/**
* create .htaccess files for apache hosts
*/
private static function createHtaccess() {
$content = "<IfModule mod_fcgid.c>
";
$content.= "<IfModule mod_setenvif.c>
";
$content.= "<IfModule mod_headers.c>
";
$content.= "SetEnvIfNoCase ^Authorization$ \"(.+)\" XAUTHORIZATION=$1
";
$content.= "RequestHeader set XAuthorization %{XAUTHORIZATION}e env=XAUTHORIZATION
";
$content.= "</IfModule>
";
$content.= "</IfModule>
";
$content.= "</IfModule>
";
$content.= "ErrorDocument 403 ".OC::$WEBROOT."/core/templates/403.php
";//custom 403 error page
$content.= "ErrorDocument 404 ".OC::$WEBROOT."/core/templates/404.php
";//custom 404 error page
$content.= "<IfModule mod_php5.c>
";
$content.= "php_value upload_max_filesize 512M
";//upload limit
$content.= "php_value post_max_size 512M
";
$content.= "php_value memory_limit 512M
";
$content.= "php_value mbstring.func_overload 0
";
$content.= "<IfModule env_module>
";
$content.= " SetEnv htaccessWorking true
";
$content.= "</IfModule>
";
$content.= "</IfModule>
";
$content.= "<IfModule mod_rewrite.c>
";
$content.= "RewriteEngine on
";
$content.= "RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
";
$content.= "RewriteRule ^.well-known/host-meta /public.php?service=host-meta [QSA,L]
";
$content.= "RewriteRule ^.well-known/carddav /remote.php/carddav/ [R]
";
$content.= "RewriteRule ^.well-known/caldav /remote.php/caldav/ [R]
";
$content.= "RewriteRule ^apps/([^/]*)/(.*\.(css|php))$ index.php?app=$1&getfile=$2 [QSA,L]
";
$content.= "RewriteRule ^remote/(.*) remote.php [QSA,L]
";
$content.= "</IfModule>
";
$content.= "<IfModule mod_mime.c>
";
$content.= "AddType image/svg+xml svg svgz
";
$content.= "AddEncoding gzip svgz
";
$content.= "</IfModule>
";
$content.= "<IfModule dir_module>
";
$content.= "DirectoryIndex index.php index.html
";
$content.= "</IfModule>
";
$content.= "AddDefaultCharset utf-8
";
$content.= "Options -Indexes
";
@file_put_contents(OC::$SERVERROOT.'/.htaccess', $content); //supress errors in case we don't have permissions for it
self::protectDataDirectory();
}
public static function protectDataDirectory() {
//Require all denied
$now = date('Y-m-d H:i:s');
$content = "# Generated by ownCloud on $now
";
$content.= "# line below if for Apache 2.4
";
$content.= "<ifModule mod_authz_core>
";
$content.= "Require all denied
";
$content.= "</ifModule>
";
$content.= "# line below if for Apache 2.2
";
$content.= "<ifModule !mod_authz_core>
";
$content.= "deny from all
";
$content.= "</ifModule>
";
$content.= "# section for Apache 2.2 and 2.4
";
$content.= "IndexIgnore *
";
file_put_contents(OC_Config::getValue('datadirectory', OC::$SERVERROOT.'/data').'/.htaccess', $content);
file_put_contents(OC_Config::getValue('datadirectory', OC::$SERVERROOT.'/data').'/index.html', '');
}
/**
* @brief Post installation checks
*/
public static function postSetupCheck($params) {
// setup was successful -> webdav testing now
$l = self::getTrans();
if (OC_Util::isWebDAVWorking()) {
header("Location: ".OC::$WEBROOT.'/');
} else {
$error = $l->t('Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken.');
$hint = $l->t('Please double check the <a href=\'%s\'>installation guides</a>.',
\OC_Helper::linkToDocs('admin-install'));
OC_Template::printErrorPage($error, $hint);
exit();
}
}
}
|