INFRA-132 - Put "else" and "catch" on new line
[civicrm-core.git] / install / index.php
1 <?php
2
3 /**
4 * Note that this installer has been based of the SilverStripe installer.
5 * You can get more information from the SilverStripe Website at
6 * http://www.silverstripe.com/. Please check
7 * http://www.silverstripe.com/licensing for licensing details.
8 *
9 * Copyright (c) 2006-7, SilverStripe Limited - www.silverstripe.com
10 * All rights reserved.
11 *
12 * Changes and modifications (c) 2007-8 by CiviCRM LLC
13 *
14 */
15
16 /**
17 * CiviCRM Installer
18 */
19
20 ini_set('max_execution_time', 3000);
21
22 if (stristr(PHP_OS, 'WIN')) {
23 define('CIVICRM_DIRECTORY_SEPARATOR', '/');
24 define('CIVICRM_WINDOWS', 1 );
25 }
26 else {
27 define('CIVICRM_DIRECTORY_SEPARATOR', DIRECTORY_SEPARATOR);
28 define('CIVICRM_WINDOWS', 0 );
29 }
30
31 // set installation type - drupal
32 if (!session_id()) {
33 session_start();
34 }
35
36 // unset civicrm session if any
37 if (array_key_exists('CiviCRM', $_SESSION)) {
38 unset($_SESSION['CiviCRM']);
39 }
40
41 if (isset($_GET['civicrm_install_type'])) {
42 $_SESSION['civicrm_install_type'] = $_GET['civicrm_install_type'];
43 }
44 else {
45 if (!isset($_SESSION['civicrm_install_type'])) {
46 $_SESSION['civicrm_install_type'] = "drupal";
47 }
48 }
49
50 global $installType;
51 $installType = strtolower($_SESSION['civicrm_install_type']);
52
53 if (!in_array($installType, array(
54 'drupal', 'wordpress'))) {
55 $errorTitle = "Oops! Unsupported installation mode";
56 $errorMsg = "";
57 errorDisplayPage($errorTitle, $errorMsg);
58 }
59
60 global $crmPath;
61 global $installDirPath;
62 global $installURLPath;
63 if ($installType == 'drupal') {
64 $crmPath = dirname(dirname($_SERVER['SCRIPT_FILENAME']));
65 $installDirPath = $installURLPath = '';
66 }
67 elseif ($installType == 'wordpress') {
68 $crmPath = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . 'civicrm' . DIRECTORY_SEPARATOR . 'civicrm' . DIRECTORY_SEPARATOR;
69 $installDirPath = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . 'civicrm' . DIRECTORY_SEPARATOR . 'civicrm' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR;
70
71 $installURLPath = WP_PLUGIN_URL . DIRECTORY_SEPARATOR . 'civicrm' . DIRECTORY_SEPARATOR . 'civicrm' . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR;
72 }
73
74 set_include_path(get_include_path() . PATH_SEPARATOR . $crmPath);
75
76 require_once $crmPath . '/CRM/Core/ClassLoader.php';
77 CRM_Core_ClassLoader::singleton()->register();
78
79 $docLink = CRM_Utils_System::docURL2('Installation and Upgrades', FALSE, 'Installation Guide', NULL, NULL, "wiki");
80
81 if ($installType == 'drupal') {
82 //lets check only /modules/.
83 $pattern = '/' . preg_quote(CIVICRM_DIRECTORY_SEPARATOR . 'modules', CIVICRM_DIRECTORY_SEPARATOR) . '/';
84
85 if (!preg_match($pattern,
86 str_replace("\\", "/", $_SERVER['SCRIPT_FILENAME'])
87 )) {
88 $errorTitle = "Oops! Please Correct Your Install Location";
89 $errorMsg = "Please untar (uncompress) your downloaded copy of CiviCRM in the <strong>" . implode(CIVICRM_DIRECTORY_SEPARATOR, array(
90 'sites', 'all', 'modules')) . "</strong> directory below your Drupal root directory. Refer to the online " . $docLink . " for more information.";
91 errorDisplayPage($errorTitle, $errorMsg);
92 }
93 }
94
95 // Load civicrm database config
96 if (isset($_REQUEST['mysql'])) {
97 $databaseConfig = $_REQUEST['mysql'];
98 }
99 else {
100 $databaseConfig = array(
101 "server" => "localhost",
102 "username" => "civicrm",
103 "password" => "",
104 "database" => "civicrm",
105 );
106 }
107
108 if ($installType == 'drupal') {
109 // Load drupal database config
110 if (isset($_REQUEST['drupal'])) {
111 $drupalConfig = $_REQUEST['drupal'];
112 }
113 else {
114 $drupalConfig = array(
115 "server" => "localhost",
116 "username" => "drupal",
117 "password" => "",
118 "database" => "drupal",
119 );
120 }
121 }
122
123 $loadGenerated = 0;
124 if (isset($_REQUEST['loadGenerated'])) {
125 $loadGenerated = 1;
126 }
127
128 require_once dirname(__FILE__) . CIVICRM_DIRECTORY_SEPARATOR . 'langs.php';
129 foreach ($langs as $locale => $_) {
130 if ($locale == 'en_US') {
131 continue;
132 }
133 if (!file_exists(implode(CIVICRM_DIRECTORY_SEPARATOR, array($crmPath, 'sql', "civicrm_data.$locale.mysql")))) { unset($langs[$locale]);
134 }
135 }
136
137 $seedLanguage = 'en_US';
138 if (isset($_REQUEST['seedLanguage']) and isset($langs[$_REQUEST['seedLanguage']])) {
139 $seedLanguage = $_REQUEST['seedLanguage'];
140 }
141
142 global $cmsPath;
143 if ($installType == 'drupal') {
144 //CRM-6840 -don't force to install in sites/all/modules/
145 $object = new CRM_Utils_System_Drupal();
146 $cmsPath = $object->cmsRootPath();
147
148 $siteDir = getSiteDir($cmsPath, $_SERVER['SCRIPT_FILENAME']);
149 $alreadyInstalled = file_exists($cmsPath . CIVICRM_DIRECTORY_SEPARATOR .
150 'sites' . CIVICRM_DIRECTORY_SEPARATOR .
151 $siteDir . CIVICRM_DIRECTORY_SEPARATOR .
152 'civicrm.settings.php'
153 );
154 }
155 elseif ($installType == 'wordpress') {
156 $cmsPath = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . 'civicrm';
157 $alreadyInstalled = file_exists($cmsPath . CIVICRM_DIRECTORY_SEPARATOR .
158 'civicrm.settings.php'
159 );
160 }
161
162 // Exit with error if CiviCRM has already been installed.
163 if ($alreadyInstalled) {
164 $errorTitle = "Oops! CiviCRM is Already Installed";
165 if ($installType == 'drupal') {
166
167 $errorMsg = "CiviCRM has already been installed in this Drupal site. <ul><li>To <strong>start over</strong>, you must delete or rename the existing CiviCRM settings file - <strong>civicrm.settings.php</strong> - from <strong>" . implode(CIVICRM_DIRECTORY_SEPARATOR, array(
168 '[your Drupal root directory]', 'sites', $siteDir)) . "</strong>.</li><li>To <strong>upgrade an existing installation</strong>, refer to the online " . $docLink . ".</li></ul>";
169 }
170 elseif ($installType == 'wordpress') {
171 $errorMsg = "CiviCRM has already been installed in this WordPress site. <ul><li>To <strong>start over</strong>, you must delete or rename the existing CiviCRM settings file - <strong>civicrm.settings.php</strong> - from <strong>" . $cmsPath . "</strong>.</li><li>To <strong>upgrade an existing installation</strong>, refer to the online " . $docLink . ".</li></ul>";
172 }
173 errorDisplayPage($errorTitle, $errorMsg);
174 }
175
176 $versionFile = $crmPath . CIVICRM_DIRECTORY_SEPARATOR . 'civicrm-version.php';
177 if (file_exists($versionFile)) {
178 require_once $versionFile;
179 $civicrm_version = civicrmVersion();
180 }
181 else {
182 $civicrm_version = 'unknown';
183 }
184
185 if ($installType == 'drupal') {
186 // Ensure that they have downloaded the correct version of CiviCRM
187 if ($civicrm_version['cms'] != 'Drupal' &&
188 $civicrm_version['cms'] != 'Drupal6'
189 ) {
190 $errorTitle = "Oops! Incorrect CiviCRM Version";
191 $errorMsg = "This installer can only be used for the Drupal version of CiviCRM. Refer to the online " . $docLink . " for information about installing CiviCRM on PHP4 servers OR installing CiviCRM for Joomla!";
192 errorDisplayPage($errorTitle, $errorMsg);
193 }
194
195 define('DRUPAL_ROOT', $cmsPath);
196 $drupalVersionFiles = array(
197 // D6
198 implode(CIVICRM_DIRECTORY_SEPARATOR, array($cmsPath, 'modules', 'system', 'system.module')),
199 // D7
200 implode(CIVICRM_DIRECTORY_SEPARATOR, array($cmsPath, 'includes', 'bootstrap.inc')),
201 );
202 foreach ($drupalVersionFiles as $drupalVersionFile) {
203 if (file_exists($drupalVersionFile)) {
204 require_once $drupalVersionFile;
205 }
206 }
207
208 if (!defined('VERSION') or version_compare(VERSION, '6.0') < 0) {
209 $errorTitle = "Oops! Incorrect Drupal Version";
210 $errorMsg = "This version of CiviCRM can only be used with Drupal 6.x or 7.x. Please ensure that '" . implode("' or '", $drupalVersionFiles) . "' exists if you are running Drupal 7.0 and over. Refer to the online " . $docLink . " for information about installing CiviCRM.";
211 errorDisplayPage($errorTitle, $errorMsg);
212 }
213 }
214 elseif ($installType == 'wordpress') {
215 //HACK for now
216 $civicrm_version['cms'] = 'WordPress';
217
218 // Ensure that they have downloaded the correct version of CiviCRM
219 if ($civicrm_version['cms'] != 'WordPress') {
220 $errorTitle = "Oops! Incorrect CiviCRM Version";
221 $errorMsg = "This installer can only be used for the WordPress version of CiviCRM. Refer to the online " . $docLink . " for information about installing CiviCRM for Drupal or Joomla!";
222 errorDisplayPage($errorTitle, $errorMsg);
223 }
224 }
225
226 // Check requirements
227 $req = new InstallRequirements();
228 $req->check();
229
230 if ($req->hasErrors()) {
231 $hasErrorOtherThanDatabase = TRUE;
232 }
233
234 if ($databaseConfig) {
235 $dbReq = new InstallRequirements();
236 $dbReq->checkdatabase($databaseConfig, 'CiviCRM');
237 if ($installType == 'drupal') {
238 $dbReq->checkdatabase($drupalConfig, 'Drupal');
239 }
240 }
241
242 // Actual processor
243 if (isset($_REQUEST['go']) && !$req->hasErrors() && !$dbReq->hasErrors()) {
244 // Confirm before reinstalling
245 if (!isset($_REQUEST['force_reinstall']) && $alreadyInstalled) {
246 include $installDirPath . 'template.html';
247 }
248 else {
249 $inst = new Installer();
250 $inst->install($_REQUEST);
251 }
252
253 // Show the config form
254 }
255 else {
256 include $installDirPath . 'template.html';
257 }
258
259 /**
260 * This class checks requirements
261 * Each of the requireXXX functions takes an argument which gives a user description of the test. It's an array
262 * of 3 parts:
263 * $description[0] - The test catetgory
264 * $description[1] - The test title
265 * $description[2] - The test error to show, if it goes wrong
266 */
267 class InstallRequirements {
268 var $errors, $warnings, $tests;
269
270 // @see CRM_Upgrade_Form::MINIMUM_THREAD_STACK
271 const MINIMUM_THREAD_STACK = 192;
272
273 /**
274 * Just check that the database configuration is okay
275 */
276 function checkdatabase($databaseConfig, $dbName) {
277 if ($this->requireFunction('mysql_connect',
278 array(
279 "PHP Configuration",
280 "MySQL support",
281 "MySQL support not included in PHP.",
282 )
283 )) {
284 $this->requireMySQLServer($databaseConfig['server'],
285 array(
286 "MySQL $dbName Configuration",
287 "Does the server exist",
288 "Can't find the a MySQL server on '$databaseConfig[server]'",
289 $databaseConfig['server'],
290 )
291 );
292 if ($this->requireMysqlConnection($databaseConfig['server'],
293 $databaseConfig['username'],
294 $databaseConfig['password'],
295 array(
296 "MySQL $dbName Configuration",
297 "Are the access credentials correct",
298 "That username/password doesn't work",
299 )
300 )) {
301 @$this->requireMySQLVersion("5.1",
302 array(
303 "MySQL $dbName Configuration",
304 "MySQL version at least 5.1",
305 "MySQL version 5.1 or higher is required, you only have ",
306 "MySQL " . mysql_get_server_info(),
307 )
308 );
309 $this->requireMySQLAutoIncrementIncrementOne($databaseConfig['server'],
310 $databaseConfig['username'],
311 $databaseConfig['password'],
312 array(
313 "MySQL $dbName Configuration",
314 "Is auto_increment_increment set to 1",
315 "An auto_increment_increment value greater than 1 is not currently supported. Please see issue CRM-7923 for further details and potential workaround.",
316 )
317 );
318 $this->requireMySQLThreadStack($databaseConfig['server'],
319 $databaseConfig['username'],
320 $databaseConfig['password'],
321 $databaseConfig['database'],
322 self::MINIMUM_THREAD_STACK,
323 array(
324 "MySQL $dbName Configuration",
325 "Does MySQL thread_stack meet minimum (" . self::MINIMUM_THREAD_STACK . "k)",
326 "", // "The MySQL thread_stack does not meet minimum " . CRM_Upgrade_Form::MINIMUM_THREAD_STACK . "k. Please update thread_stack in my.cnf.",
327 )
328 );
329 }
330 $onlyRequire = ($dbName == 'Drupal') ? TRUE : FALSE;
331 $this->requireDatabaseOrCreatePermissions(
332 $databaseConfig['server'],
333 $databaseConfig['username'],
334 $databaseConfig['password'],
335 $databaseConfig['database'],
336 array(
337 "MySQL $dbName Configuration",
338 "Can I access/create the database",
339 "I can't create new databases and the database '$databaseConfig[database]' doesn't exist",
340 ),
341 $onlyRequire
342 );
343 if ($dbName != 'Drupal') {
344 $this->requireMySQLInnoDB($databaseConfig['server'],
345 $databaseConfig['username'],
346 $databaseConfig['password'],
347 $databaseConfig['database'],
348 array(
349 "MySQL $dbName Configuration",
350 "Can I access/create InnoDB tables in the database",
351 "Unable to create InnoDB tables. MySQL InnoDB support is required for CiviCRM but is either not available or not enabled in this MySQL database server.",
352 )
353 );
354 $this->requireMySQLTempTables($databaseConfig['server'],
355 $databaseConfig['username'],
356 $databaseConfig['password'],
357 $databaseConfig['database'],
358 array(
359 "MySQL $dbName Configuration",
360 'Can I create temporary tables in the database',
361 'Unable to create temporary tables. This MySQL user is missing the CREATE TEMPORARY TABLES privilege.',
362 )
363 );
364 $this->requireMySQLLockTables($databaseConfig['server'],
365 $databaseConfig['username'],
366 $databaseConfig['password'],
367 $databaseConfig['database'],
368 array(
369 "MySQL $dbName Configuration",
370 'Can I create lock tables in the database',
371 'Unable to lock tables. This MySQL user is missing the LOCK TABLES privilege.',
372 )
373 );
374 $this->requireMySQLTrigger($databaseConfig['server'],
375 $databaseConfig['username'],
376 $databaseConfig['password'],
377 $databaseConfig['database'],
378 array(
379 "MySQL $dbName Configuration",
380 'Can I create triggers in the database',
381 'Unable to create triggers. This MySQL user is missing the CREATE TRIGGERS privilege.',
382 )
383 );
384 }
385 }
386 }
387
388 /**
389 * Check everything except the database
390 */
391 function check() {
392 global $crmPath, $installType;
393
394 $this->errors = NULL;
395
396 $this->requirePHPVersion('5.3.3', array("PHP Configuration", "PHP5 installed", NULL, "PHP version " . phpversion()));
397
398 // Check that we can identify the root folder successfully
399 $this->requireFile($crmPath . CIVICRM_DIRECTORY_SEPARATOR . 'README.txt',
400 array(
401 "File permissions",
402 "Does the webserver know where files are stored?",
403 "The webserver isn't letting me identify where files are stored.",
404 $this->getBaseDir(),
405 ),
406 TRUE
407 );
408
409 // CRM-6485: make sure the path does not contain PATH_SEPARATOR, as we don’t know how to escape it
410 $this->requireNoPathSeparator(
411 array(
412 'File permissions',
413 'does the CiviCRM path contain PATH_SEPARATOR?',
414 'the ' . $this->getBaseDir() . ' path contains PATH_SEPARATOR (the ' . PATH_SEPARATOR . ' character)',
415 $this->getBaseDir(),
416 )
417 );
418
419 $requiredDirectories = array('CRM', 'packages', 'templates', 'js', 'api', 'i', 'sql');
420 foreach ($requiredDirectories as $dir) {
421 $this->requireFile($crmPath . CIVICRM_DIRECTORY_SEPARATOR . $dir,
422 array(
423 "File permissions", "$dir folder exists", "There is no $dir folder"), TRUE
424 );
425 }
426
427 $configIDSiniDir = NULL;
428 global $cmsPath;
429 $siteDir = getSiteDir($cmsPath, $_SERVER['SCRIPT_FILENAME']);
430 if ($installType == 'drupal') {
431
432 // make sure that we can write to sites/default and files/
433 $writableDirectories = array(
434 $cmsPath . CIVICRM_DIRECTORY_SEPARATOR .
435 'sites' . CIVICRM_DIRECTORY_SEPARATOR .
436 $siteDir . CIVICRM_DIRECTORY_SEPARATOR .
437 'files',
438 $cmsPath . CIVICRM_DIRECTORY_SEPARATOR .
439 'sites' . CIVICRM_DIRECTORY_SEPARATOR .
440 $siteDir,
441 );
442 }
443 elseif ($installType == 'wordpress') {
444 // make sure that we can write to plugins/civicrm and plugins/files/
445 $writableDirectories = array(WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . 'files', $cmsPath);
446 }
447
448 foreach ($writableDirectories as $dir) {
449 $dirName = CIVICRM_WINDOWS ? $dir : CIVICRM_DIRECTORY_SEPARATOR . $dir;
450 $this->requireWriteable($dirName,
451 array("File permissions", "Is the $dir folder writeable?", NULL),
452 TRUE
453 );
454 }
455
456 //check for Config.IDS.ini, file may exist in re-install
457 $configIDSiniDir = array($cmsPath, 'sites', $siteDir, 'files', 'civicrm', 'upload', 'Config.IDS.ini');
458
459 if (is_array($configIDSiniDir) && !empty($configIDSiniDir)) {
460 $configIDSiniFile = implode(CIVICRM_DIRECTORY_SEPARATOR, $configIDSiniDir);
461 if (file_exists($configIDSiniFile)) {
462 unlink($configIDSiniFile);
463 }
464 }
465
466 // Check for rewriting
467 if (isset($_SERVER['SERVER_SOFTWARE'])) {
468 $webserver = strip_tags(trim($_SERVER['SERVER_SOFTWARE']));
469 }
470 elseif (isset($_SERVER['SERVER_SIGNATURE'])) {
471 $webserver = strip_tags(trim($_SERVER['SERVER_SIGNATURE']));
472 }
473
474 if ($webserver == '') {
475 $webserver = "I can't tell what webserver you are running";
476 }
477
478 // Check for $_SERVER configuration
479 $this->requireServerVariables(array('SCRIPT_NAME', 'HTTP_HOST', 'SCRIPT_FILENAME'), array("Webserver config", "Recognised webserver", "You seem to be using an unsupported webserver. The server variables SCRIPT_NAME, HTTP_HOST, SCRIPT_FILENAME need to be set."));
480
481 // Check for MySQL support
482 $this->requireFunction('mysql_connect',
483 array("PHP Configuration", "MySQL support", "MySQL support not included in PHP.")
484 );
485
486 // Check for JSON support
487 $this->requireFunction('json_encode',
488 array("PHP Configuration", "JSON support", "JSON support not included in PHP.")
489 );
490
491 // Check for xcache_isset and emit warning if exists
492 $this->checkXCache(array(
493 "PHP Configuration",
494 "XCache compatibility",
495 "XCache is installed and there are known compatibility issues between XCache and CiviCRM. Consider using an alternative PHP caching mechanism or disable PHP caching altogether.",
496 ));
497
498 // Check memory allocation
499 $this->requireMemory(32 * 1024 * 1024,
500 64 * 1024 * 1024,
501 array(
502 "PHP Configuration",
503 "Memory allocated (PHP config option 'memory_limit')",
504 "CiviCRM needs a minimum of 32M allocated to PHP, but recommends 64M.",
505 ini_get("memory_limit"),
506 )
507 );
508
509 return $this->errors;
510 }
511
512 /**
513 * @param $min
514 * @param $recommended
515 * @param $testDetails
516 */
517 function requireMemory($min, $recommended, $testDetails) {
518 $this->testing($testDetails);
519 $mem = $this->getPHPMemory();
520
521 if ($mem < $min && $mem > 0) {
522 $testDetails[2] .= " You only have " . ini_get("memory_limit") . " allocated";
523 $this->error($testDetails);
524 }
525 elseif ($mem < $recommended && $mem > 0) {
526 $testDetails[2] .= " You only have " . ini_get("memory_limit") . " allocated";
527 $this->warning($testDetails);
528 }
529 elseif ($mem == 0) {
530 $testDetails[2] .= " We can't determine how much memory you have allocated. Install only if you're sure you've allocated at least 20 MB.";
531 $this->warning($testDetails);
532 }
533 }
534
535 /**
536 * @return float
537 */
538 function getPHPMemory() {
539 $memString = ini_get("memory_limit");
540
541 switch (strtolower(substr($memString, -1))) {
542 case "k":
543 return round(substr($memString, 0, -1) * 1024);
544
545 case "m":
546 return round(substr($memString, 0, -1) * 1024 * 1024);
547
548 case "g":
549 return round(substr($memString, 0, -1) * 1024 * 1024 * 1024);
550
551 default:
552 return round($memString);
553 }
554 }
555
556 function listErrors() {
557 if ($this->errors) {
558 echo "<p>The following problems are preventing me from installing CiviCRM:</p>";
559 foreach ($this->errors as $error) {
560 echo "<li>" . htmlentities($error) . "</li>";
561 }
562 }
563 }
564
565 /**
566 * @param null $section
567 */
568 function showTable($section = NULL) {
569 if ($section) {
570 $tests = $this->tests[$section];
571 echo "<table class=\"testResults\" width=\"100%\">";
572 foreach ($tests as $test => $result) {
573 echo "<tr class=\"$result[0]\"><td>$test</td><td>" . nl2br(htmlentities($result[1])) . "</td></tr>";
574 }
575 echo "</table>";
576 }
577 else {
578 foreach ($this->tests as $section => $tests) {
579 echo "<h3>$section</h3>";
580 echo "<table class=\"testResults\" width=\"100%\">";
581
582 foreach ($tests as $test => $result) {
583 echo "<tr class=\"$result[0]\"><td>$test</td><td>" . nl2br(htmlentities($result[1])) . "</td></tr>";
584 }
585 echo "</table>";
586 }
587 }
588 }
589
590 /**
591 * @param string $funcName
592 * @param $testDetails
593 *
594 * @return bool
595 */
596 function requireFunction($funcName, $testDetails) {
597 $this->testing($testDetails);
598
599 if (!function_exists($funcName)) {
600 $this->error($testDetails);
601 return FALSE;
602 }
603 else {
604 return TRUE;
605 }
606 }
607
608 /**
609 * @param $testDetails
610 */
611 function checkXCache($testDetails) {
612 if (function_exists('xcache_isset') &&
613 ini_get('xcache.size') > 0
614 ) {
615 $this->testing($testDetails);
616 $this->warning($testDetails);
617 }
618 }
619
620 /**
621 * @param $minVersion
622 * @param $testDetails
623 * @param null $maxVersion
624 */
625 function requirePHPVersion($minVersion, $testDetails, $maxVersion = NULL) {
626
627 $this->testing($testDetails);
628
629 $phpVersion = phpversion();
630 $aboveMinVersion = version_compare($phpVersion, $minVersion) >= 0;
631 $belowMaxVersion = $maxVersion ? version_compare($phpVersion, $maxVersion) < 0 : TRUE;
632
633 if ($maxVersion && $aboveMinVersion && $belowMaxVersion) {
634 return TRUE;
635 }
636 elseif (!$maxVersion && $aboveMinVersion) {
637 return TRUE;
638 }
639
640 if (!$testDetails[2]) {
641 if (!$aboveMinVersion) {
642 $testDetails[2] = "You need PHP version $minVersion or later, only {$phpVersion} is installed. Please upgrade your server, or ask your web-host to do so.";
643 }
644 else {
645 $testDetails[2] = "PHP version {$phpVersion} is not supported. PHP version earlier than $maxVersion is required. You might want to downgrade your server, or ask your web-host to do so.";
646 }
647 }
648
649 $this->error($testDetails);
650 }
651
652 /**
653 * @param string $filename
654 * @param $testDetails
655 * @param bool $absolute
656 */
657 function requireFile($filename, $testDetails, $absolute = FALSE) {
658 $this->testing($testDetails);
659 if (!$absolute) {
660 $filename = $this->getBaseDir() . $filename;
661 }
662 if (!file_exists($filename)) {
663 $testDetails[2] .= " (file '$filename' not found)";
664 $this->error($testDetails);
665 }
666 }
667
668 /**
669 * @param $testDetails
670 */
671 function requireNoPathSeparator($testDetails) {
672 $this->testing($testDetails);
673 if (substr_count($this->getBaseDir(), PATH_SEPARATOR)) {
674 $this->error($testDetails);
675 }
676 }
677
678 /**
679 * @param string $filename
680 * @param $testDetails
681 */
682 function requireNoFile($filename, $testDetails) {
683 $this->testing($testDetails);
684 $filename = $this->getBaseDir() . $filename;
685 if (file_exists($filename)) {
686 $testDetails[2] .= " (file '$filename' found)";
687 $this->error($testDetails);
688 }
689 }
690
691 /**
692 * @param string $filename
693 * @param $testDetails
694 */
695 function moveFileOutOfTheWay($filename, $testDetails) {
696 $this->testing($testDetails);
697 $filename = $this->getBaseDir() . $filename;
698 if (file_exists($filename)) {
699 if (file_exists("$filename.bak")) {
700 rm("$filename.bak");
701 }
702 rename($filename, "$filename.bak");
703 }
704 }
705
706 /**
707 * @param string $filename
708 * @param $testDetails
709 * @param bool $absolute
710 */
711 function requireWriteable($filename, $testDetails, $absolute = FALSE) {
712 $this->testing($testDetails);
713 if (!$absolute) {
714 $filename = $this->getBaseDir() . $filename;
715 }
716
717 if (!is_writeable($filename)) {
718 $name = NULL;
719 if (function_exists('posix_getpwuid')) {
720 $user = posix_getpwuid(posix_geteuid());
721 $name = '- ' . $user['name'] . ' -';
722 }
723
724 if (!isset($testDetails[2])) {
725 $testDetails[2] = NULL;
726 }
727 $testDetails[2] .= "The user account used by your web-server $name needs to be granted write access to the following directory in order to configure the CiviCRM settings file:\n$filename";
728 $this->error($testDetails);
729 }
730 }
731
732 /**
733 * @param string $moduleName
734 * @param $testDetails
735 */
736 function requireApacheModule($moduleName, $testDetails) {
737 $this->testing($testDetails);
738 if (!in_array($moduleName, apache_get_modules())) {
739 $this->error($testDetails);
740 }
741 }
742
743 /**
744 * @param $server
745 * @param string $username
746 * @param $password
747 * @param $testDetails
748 */
749 function requireMysqlConnection($server, $username, $password, $testDetails) {
750 $this->testing($testDetails);
751 $conn = @mysql_connect($server, $username, $password);
752
753 if ($conn) {
754 return TRUE;
755 }
756 else {
757 $testDetails[2] .= ": " . mysql_error();
758 $this->error($testDetails);
759 }
760 }
761
762 /**
763 * @param $server
764 * @param $testDetails
765 */
766 function requireMySQLServer($server, $testDetails) {
767 $this->testing($testDetails);
768 $conn = @mysql_connect($server, NULL, NULL);
769
770 if ($conn || mysql_errno() < 2000) {
771 return TRUE;
772 }
773 else {
774 $testDetails[2] .= ": " . mysql_error();
775 $this->error($testDetails);
776 }
777 }
778
779 /**
780 * @param $version
781 * @param $testDetails
782 */
783 function requireMySQLVersion($version, $testDetails) {
784 $this->testing($testDetails);
785
786 if (!mysql_get_server_info()) {
787 $testDetails[2] = 'Cannot determine the version of MySQL installed. Please ensure at least version 4.1 is installed.';
788 $this->warning($testDetails);
789 }
790 else {
791 list($majorRequested, $minorRequested) = explode('.', $version);
792 list($majorHas, $minorHas) = explode('.', mysql_get_server_info());
793
794 if (($majorHas > $majorRequested) || ($majorHas == $majorRequested && $minorHas >= $minorRequested)) {
795 return TRUE;
796 }
797 else {
798 $testDetails[2] .= "{$majorHas}.{$minorHas}.";
799 $this->error($testDetails);
800 }
801 }
802 }
803
804 /**
805 * @param $server
806 * @param string $username
807 * @param $password
808 * @param $database
809 * @param $testDetails
810 */
811 function requireMySQLInnoDB($server, $username, $password, $database, $testDetails) {
812 $this->testing($testDetails);
813 $conn = @mysql_connect($server, $username, $password);
814 if (!$conn) {
815 $testDetails[2] .= ' Could not determine if mysql has innodb support. Assuming no';
816 $this->error($testDetails);
817 return;
818 }
819
820 $innodb_support = FALSE;
821 $result = mysql_query("SHOW ENGINES", $conn);
822 while ($values = mysql_fetch_array($result)) {
823 if ($values['Engine'] == 'InnoDB') {
824 if (strtolower($values['Support']) == 'yes' ||
825 strtolower($values['Support']) == 'default'
826 ) {
827 $innodb_support = TRUE;
828 }
829 }
830 }
831 if ($innodb_support) {
832 $testDetails[3] = 'MySQL server does have innodb support';
833 }
834 else {
835 $testDetails[2] .= ' Could not determine if mysql has innodb support. Assuming no';
836 }
837 }
838
839 /**
840 * @param $server
841 * @param string $username
842 * @param $password
843 * @param $database
844 * @param $testDetails
845 */
846 function requireMySQLTempTables($server, $username, $password, $database, $testDetails) {
847 $this->testing($testDetails);
848 $conn = @mysql_connect($server, $username, $password);
849 if (!$conn) {
850 $testDetails[2] = 'Could not login to the database.';
851 $this->error($testDetails);
852 return;
853 }
854
855 if (!@mysql_select_db($database, $conn)) {
856 $testDetails[2] = 'Could not select the database.';
857 $this->error($testDetails);
858 return;
859 }
860
861 $result = mysql_query('CREATE TEMPORARY TABLE civicrm_install_temp_table_test (test text)', $conn);
862 if (!$result) {
863 $testDetails[2] = 'Could not create a temp table.';
864 $this->error($testDetails);
865 }
866 $result = mysql_query('DROP TEMPORARY TABLE civicrm_install_temp_table_test');
867 }
868
869 /**
870 * @param $server
871 * @param string $username
872 * @param $password
873 * @param $database
874 * @param $testDetails
875 */
876 function requireMySQLTrigger($server, $username, $password, $database, $testDetails) {
877 $this->testing($testDetails);
878 $conn = @mysql_connect($server, $username, $password);
879 if (!$conn) {
880 $testDetails[2] = 'Could not login to the database.';
881 $this->error($testDetails);
882 return;
883 }
884
885 if (!@mysql_select_db($database, $conn)) {
886 $testDetails[2] = 'Could not select the database.';
887 $this->error($testDetails);
888 return;
889 }
890
891 $result = mysql_query('CREATE TABLE civicrm_install_temp_table_test (test text)', $conn);
892 if (!$result) {
893 $testDetails[2] = 'Could not create a table.';
894 $this->error($testDetails);
895 }
896
897 $result = mysql_query('CREATE TRIGGER civicrm_install_temp_table_test_trigger BEFORE INSERT ON civicrm_install_temp_table_test FOR EACH ROW BEGIN END');
898 if (!$result) {
899 mysql_query('DROP TABLE civicrm_install_temp_table_test');
900 $testDetails[2] = 'Could not create a trigger.';
901 $this->error($testDetails);
902 }
903
904 mysql_query('DROP TRIGGER civicrm_install_temp_table_test_trigger');
905 mysql_query('DROP TABLE civicrm_install_temp_table_test');
906 }
907
908
909 /**
910 * @param $server
911 * @param string $username
912 * @param $password
913 * @param $database
914 * @param $testDetails
915 */
916 function requireMySQLLockTables($server, $username, $password, $database, $testDetails) {
917 $this->testing($testDetails);
918 $conn = @mysql_connect($server, $username, $password);
919 if (!$conn) {
920 $testDetails[2] = 'Could not login to the database.';
921 $this->error($testDetails);
922 return;
923 }
924
925 if (!@mysql_select_db($database, $conn)) {
926 $testDetails[2] = 'Could not select the database.';
927 $this->error($testDetails);
928 return;
929 }
930
931 $result = mysql_query('CREATE TEMPORARY TABLE civicrm_install_temp_table_test (test text)', $conn);
932 if (!$result) {
933 $testDetails[2] = 'Could not create a table.';
934 $this->error($testDetails);
935 return;
936 }
937
938 $result = mysql_query('LOCK TABLES civicrm_install_temp_table_test WRITE', $conn);
939 if (!$result) {
940 $testDetails[2] = 'Could not obtain a write lock for the table.';
941 $this->error($testDetails);
942 $result = mysql_query('DROP TEMPORARY TABLE civicrm_install_temp_table_test');
943 return;
944 }
945
946 $result = mysql_query('UNLOCK TABLES', $conn);
947 if (!$result) {
948 $testDetails[2] = 'Could not release the lock for the table.';
949 $this->error($testDetails);
950 $result = mysql_query('DROP TEMPORARY TABLE civicrm_install_temp_table_test');
951 return;
952 }
953
954 $result = mysql_query('DROP TEMPORARY TABLE civicrm_install_temp_table_test');
955 return;
956 }
957
958 /**
959 * @param $server
960 * @param string $username
961 * @param $password
962 * @param $testDetails
963 */
964 function requireMySQLAutoIncrementIncrementOne($server, $username, $password, $testDetails) {
965 $this->testing($testDetails);
966 $conn = @mysql_connect($server, $username, $password);
967 if (!$conn) {
968 $testDetails[2] = 'Could not connect to the database server.';
969 $this->error($testDetails);
970 return;
971 }
972
973 $result = mysql_query("SHOW variables like 'auto_increment_increment'", $conn);
974 if (!$result) {
975 $testDetails[2] = 'Could not query database server variables.';
976 $this->error($testDetails);
977 return;
978 }
979 else {
980 $values = mysql_fetch_row($result);
981 if ($values[1] == 1) {
982 $testDetails[3] = 'MySQL server auto_increment_increment is 1';
983 }
984 else {
985 $this->error($testDetails);
986 }
987 }
988 }
989
990 /**
991 * @param $server
992 * @param string $username
993 * @param $password
994 * @param $database
995 * @param $minValueKB
996 * @param $testDetails
997 */
998 function requireMySQLThreadStack($server, $username, $password, $database, $minValueKB, $testDetails) {
999 $this->testing($testDetails);
1000 $conn = @mysql_connect($server, $username, $password);
1001 if (!$conn) {
1002 $testDetails[2] = 'Could not login to the database.';
1003 $this->error($testDetails);
1004 return;
1005 }
1006
1007 if (!@mysql_select_db($database, $conn)) {
1008 $testDetails[2] = 'Could not select the database.';
1009 $this->error($testDetails);
1010 return;
1011 }
1012
1013 $result = mysql_query("SHOW VARIABLES LIKE 'thread_stack'", $conn); // bytes => kb
1014 if (!$result) {
1015 $testDetails[2] = 'Could not query thread_stack.';
1016 $this->error($testDetails);
1017 }
1018 else {
1019 $values = mysql_fetch_row($result);
1020 if ($values[1] < (1024 * $minValueKB)) {
1021 $testDetails[2] = 'MySQL "thread_stack" is ' . ($values[1] / 1024) . 'k';
1022 $this->error($testDetails);
1023 }
1024 }
1025 }
1026
1027 /**
1028 * @param $server
1029 * @param string $username
1030 * @param $password
1031 * @param $database
1032 * @param $testDetails
1033 * @param bool $onlyRequire
1034 */
1035 function requireDatabaseOrCreatePermissions($server,
1036 $username,
1037 $password,
1038 $database,
1039 $testDetails,
1040 $onlyRequire = FALSE
1041 ) {
1042 $this->testing($testDetails);
1043 $conn = @mysql_connect($server, $username, $password);
1044
1045 $okay = NULL;
1046 if (@mysql_select_db($database)) {
1047 $okay = "Database '$database' exists";
1048 }
1049 elseif ($onlyRequire) {
1050 $testDetails[2] = "The database: '$database' does not exist";
1051 $this->error($testDetails);
1052 return;
1053 }
1054 else {
1055 if (@mysql_query("CREATE DATABASE $database")) {
1056 $okay = "Able to create a new database";
1057 }
1058 else {
1059 $testDetails[2] .= " (user '$username' doesn't have CREATE DATABASE permissions.)";
1060 $this->error($testDetails);
1061 return;
1062 }
1063 }
1064
1065 if ($okay) {
1066 $testDetails[3] = $okay;
1067 $this->testing($testDetails);
1068 }
1069 }
1070
1071 /**
1072 * @param $varNames
1073 * @param $errorMessage
1074 */
1075 function requireServerVariables($varNames, $errorMessage) {
1076 //$this->testing($testDetails);
1077 foreach ($varNames as $varName) {
1078 if (!$_SERVER[$varName]) {
1079 $missing[] = '$_SERVER[' . $varName . ']';
1080 }
1081 }
1082 if (!isset($missing)) {
1083 return TRUE;
1084 }
1085 else {
1086 $testDetails[2] = " (the following PHP variables are missing: " . implode(", ", $missing) . ")";
1087 $this->error($testDetails);
1088 }
1089 }
1090
1091 /**
1092 * @param $testDetails
1093 *
1094 * @return bool
1095 */
1096 function isRunningApache($testDetails) {
1097 $this->testing($testDetails);
1098 if (function_exists('apache_get_modules') || stristr($_SERVER['SERVER_SIGNATURE'], 'Apache')) {
1099 return TRUE;
1100 }
1101
1102 $this->warning($testDetails);
1103 return FALSE;
1104 }
1105
1106 /**
1107 * @return string
1108 */
1109 function getBaseDir() {
1110 return dirname($_SERVER['SCRIPT_FILENAME']) . CIVICRM_DIRECTORY_SEPARATOR;
1111 }
1112
1113 /**
1114 * @param $testDetails
1115 */
1116 function testing($testDetails) {
1117 if (!$testDetails) {
1118 return;
1119 }
1120
1121 $section = $testDetails[0];
1122 $test = $testDetails[1];
1123
1124 $message = "OK";
1125 if (isset($testDetails[3])) {
1126 $message .= " ($testDetails[3])";
1127 }
1128
1129 $this->tests[$section][$test] = array("good", $message);
1130 }
1131
1132 /**
1133 * @param $testDetails
1134 */
1135 function error($testDetails) {
1136 $section = $testDetails[0];
1137 $test = $testDetails[1];
1138
1139 $this->tests[$section][$test] = array("error", $testDetails[2]);
1140 $this->errors[] = $testDetails;
1141 }
1142
1143 /**
1144 * @param $testDetails
1145 */
1146 function warning($testDetails) {
1147 $section = $testDetails[0];
1148 $test = $testDetails[1];
1149
1150 $this->tests[$section][$test] = array("warning", $testDetails[2]);
1151 $this->warnings[] = $testDetails;
1152 }
1153
1154 /**
1155 * @return int
1156 */
1157 function hasErrors() {
1158 return sizeof($this->errors);
1159 }
1160
1161 /**
1162 * @return int
1163 */
1164 function hasWarnings() {
1165 return sizeof($this->warnings);
1166 }
1167 }
1168
1169 /**
1170 * Class Installer
1171 */
1172 class Installer extends InstallRequirements {
1173 /**
1174 * @param $server
1175 * @param $username
1176 * @param $password
1177 * @param $database
1178 */
1179 function createDatabaseIfNotExists($server, $username, $password, $database) {
1180 $conn = @mysql_connect($server, $username, $password);
1181
1182 if (@mysql_select_db($database)) {
1183 // skip if database already present
1184 return;
1185 }
1186
1187 if (@mysql_query("CREATE DATABASE $database")) {}
1188 else {
1189 $errorTitle = "Oops! Could not create Database $database";
1190 $errorMsg = "We encountered an error when attempting to create the database. Please check your mysql server permissions and the database name and try again.";
1191 errorDisplayPage($errorTitle, $errorMsg);
1192 }
1193 }
1194
1195 /**
1196 * @param $config
1197 *
1198 * @return mixed
1199 */
1200 function install($config) {
1201 global $installDirPath;
1202
1203 // create database if does not exists
1204 $this->createDatabaseIfNotExists($config['mysql']['server'],
1205 $config['mysql']['username'],
1206 $config['mysql']['password'],
1207 $config['mysql']['database']
1208 );
1209
1210 global $installDirPath;
1211
1212 // Build database
1213 require_once $installDirPath . 'civicrm.php';
1214 civicrm_main($config);
1215
1216 if (!$this->errors) {
1217 global $installType, $installURLPath;
1218
1219 $registerSiteURL = "https://civicrm.org/register-site";
1220 $commonOutputMessage = "
1221 <li>Have you registered this site at CiviCRM.org? If not, please help strengthen the CiviCRM ecosystem by taking a few minutes to <a href='$registerSiteURL' target='_blank'>fill out the site registration form</a>. The information collected will help us prioritize improvements, target our communications and build the community. If you have a technical role for this site, be sure to check Keep in Touch to receive technical updates (a low volume mailing list).</li>
1222 <li>We have integrated KCFinder with CKEditor and TinyMCE. This allows a user to upload images. All uploaded images are public.</li>
1223 ";
1224
1225 $output = NULL;
1226 if (
1227 $installType == 'drupal' &&
1228 version_compare(VERSION, '7.0-rc1') >= 0
1229 ) {
1230
1231 // clean output
1232 @ob_clean();
1233
1234 $output .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
1235 $output .= '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">';
1236 $output .= '<head>';
1237 $output .= '<title>CiviCRM Installed</title>';
1238 $output .= '<link rel="stylesheet" type="text/css" href="template.css" />';
1239 $output .= '</head>';
1240 $output .= '<body>';
1241 $output .= '<div style="padding: 1em;"><p class="good">CiviCRM has been successfully installed</p>';
1242 $output .= '<ul>';
1243 $docLinkConfig = CRM_Utils_System::docURL2('Configuring a New Site', FALSE, 'here', NULL, NULL, "wiki");
1244 if (!function_exists('ts')) {
1245 $docLinkConfig = "<a href=\"{$docLinkConfig}\">here</a>";
1246 }
1247 $drupalURL = civicrm_cms_base();
1248 $drupalPermissionsURL = "{$drupalURL}index.php?q=admin/people/permissions";
1249 $drupalURL .= "index.php?q=civicrm/admin/configtask&reset=1";
1250
1251 $output .= "<li>Drupal user permissions have been automatically set - giving anonymous and authenticated users access to public CiviCRM forms and features. We recommend that you <a target='_blank' href={$drupalPermissionsURL}>review these permissions</a> to ensure that they are appropriate for your requirements (<a target='_blank' href='http://wiki.civicrm.org/confluence/display/CRMDOC/Default+Permissions+and+Roles'>learn more...</a>)</li>
1252 <li>Use the <a target='_blank' href=\"$drupalURL\">Configuration Checklist</a> to review and configure settings for your new site</li>
1253 {$commonOutputMessage}";
1254
1255 // automatically enable CiviCRM module once it is installed successfully.
1256 // so we need to Bootstrap Drupal, so that we can call drupal hooks.
1257 global $cmsPath, $crmPath;
1258
1259 // relative / abosolute paths are not working for drupal, hence using chdir()
1260 chdir($cmsPath);
1261
1262 include_once "./includes/bootstrap.inc";
1263 include_once "./includes/unicode.inc";
1264
1265 drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
1266
1267 // prevent session information from being saved.
1268 drupal_save_session(FALSE);
1269
1270 // Force the current user to anonymous.
1271 $original_user = $GLOBALS['user'];
1272 $GLOBALS['user'] = drupal_anonymous_user();
1273
1274 // explicitly setting error reporting, since we cannot handle drupal related notices
1275 error_reporting(1);
1276
1277 // rebuild modules, so that civicrm is added
1278 system_rebuild_module_data();
1279
1280 // now enable civicrm module.
1281 module_enable(array('civicrm', 'civicrmtheme'));
1282
1283 // clear block, page, theme, and hook caches
1284 drupal_flush_all_caches();
1285
1286 //add basic drupal permissions
1287 civicrm_install_set_drupal_perms();
1288
1289 // restore the user.
1290 $GLOBALS['user'] = $original_user;
1291 drupal_save_session(TRUE);
1292
1293 $output .= '</ul>';
1294 $output .= '</div>';
1295 $output .= '</body>';
1296 $output .= '</html>';
1297 echo $output;
1298 }
1299 elseif ($installType == 'drupal' && version_compare(VERSION, '6.0') >= 0) {
1300 // clean output
1301 @ob_clean();
1302
1303 $output .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
1304 $output .= '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">';
1305 $output .= '<head>';
1306 $output .= '<title>CiviCRM Installed</title>';
1307 $output .= '<link rel="stylesheet" type="text/css" href="template.css" />';
1308 $output .= '</head>';
1309 $output .= '<body>';
1310 $output .= '<div style="padding: 1em;"><p class="good">CiviCRM has been successfully installed</p>';
1311 $output .= '<ul>';
1312 $docLinkConfig = CRM_Utils_System::docURL2('Configuring a New Site', FALSE, 'here', NULL, NULL, "wiki");
1313 if (!function_exists('ts')) {
1314 $docLinkConfig = "<a href=\"{$docLinkConfig}\">here</a>";
1315 }
1316 $drupalURL = civicrm_cms_base();
1317 $drupalPermissionsURL = "{$drupalURL}index.php?q=admin/user/permissions";
1318 $drupalURL .= "index.php?q=civicrm/admin/configtask&reset=1";
1319
1320 $output .= "<li>Drupal user permissions have been automatically set - giving anonymous and authenticated users access to public CiviCRM forms and features. We recommend that you <a target='_blank' href={$drupalPermissionsURL}>review these permissions</a> to ensure that they are appropriate for your requirements (<a target='_blank' href='http://wiki.civicrm.org/confluence/display/CRMDOC/Default+Permissions+and+Roles'>learn more...</a>)</li>
1321 <li>Use the <a target='_blank' href=\"$drupalURL\">Configuration Checklist</a> to review and configure settings for your new site</li>
1322 {$commonOutputMessage}";
1323
1324 // explicitly setting error reporting, since we cannot handle drupal related notices
1325 error_reporting(1);
1326
1327 // automatically enable CiviCRM module once it is installed successfully.
1328 // so we need to Bootstrap Drupal, so that we can call drupal hooks.
1329 global $cmsPath, $crmPath;
1330
1331 // relative / abosolute paths are not working for drupal, hence using chdir()
1332 chdir($cmsPath);
1333
1334 include_once "./includes/bootstrap.inc";
1335 drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
1336
1337 // rebuild modules, so that civicrm is added
1338 module_rebuild_cache();
1339
1340 // now enable civicrm module.
1341 module_enable(array('civicrm'));
1342
1343 // clear block, page, theme, and hook caches
1344 drupal_flush_all_caches();
1345
1346 //add basic drupal permissions
1347 db_query('UPDATE {permission} SET perm = CONCAT( perm, \', access CiviMail subscribe/unsubscribe pages, access all custom data, access uploaded files, make online contributions, profile create, profile edit, profile view, register for events, view event info\') WHERE rid IN (1, 2)');
1348
1349 echo $output;
1350 }
1351 elseif ($installType == 'wordpress') {
1352 echo '<h1>CiviCRM Installed</h1>';
1353 echo '<div style="padding: 1em;"><p style="background-color: #0C0; border: 1px #070 solid; color: white;">CiviCRM has been successfully installed</p>';
1354 echo '<ul>';
1355 $docLinkConfig = CRM_Utils_System::docURL2('Configuring a New Site', FALSE, 'here', NULL, NULL, "wiki");
1356 if (!function_exists('ts')) {
1357 $docLinkConfig = "<a href=\"{$docLinkConfig}\">here</a>";
1358 }
1359
1360 $cmsURL = civicrm_cms_base();
1361 $cmsURL .= "wp-admin/admin.php?page=CiviCRM&q=civicrm/admin/configtask&reset=1";
1362 $wpPermissionsURL = "wp-admin/admin.php?page=CiviCRM&q=civicrm/admin/access/wp-permissions&reset=1";
1363
1364 $output .= "
1365 <li>WordPress user permissions have been automatically set - giving Anonymous and Subscribers access to public CiviCRM forms and features. We recommend that you <a target='_blank' href={$wpPermissionsURL}>review these permissions</a> to ensure that they are appropriate for your requirements (<a target='_blank' href='http://wiki.civicrm.org/confluence/display/CRMDOC/Default+Permissions+and+Roles'>learn more...</a>)</li>
1366 <li>Use the <a target='_blank' href=\"$cmsURL\">Configuration Checklist</a> to review and configure settings for your new site</li>
1367 {$commonOutputMessage}
1368 ";
1369
1370 echo '</ul>';
1371 echo '</div>';
1372 }
1373 }
1374
1375 return $this->errors;
1376 }
1377 }
1378
1379 function civicrm_install_set_drupal_perms() {
1380 if (!function_exists('db_select')) {
1381 db_query('UPDATE {permission} SET perm = CONCAT( perm, \', access CiviMail subscribe/unsubscribe pages, access all custom data, access uploaded files, make online contributions, profile listings and forms, register for events, view event info, view event participants\') WHERE rid IN (1, 2)');
1382 }
1383 else {
1384 $perms = array(
1385 'access all custom data',
1386 'access uploaded files',
1387 'make online contributions',
1388 'profile create',
1389 'profile edit',
1390 'profile view',
1391 'register for events',
1392 'view event info',
1393 'view event participants',
1394 'access CiviMail subscribe/unsubscribe pages',
1395 );
1396
1397 // Adding a permission that has not yet been assigned to a module by
1398 // a hook_permission implementation results in a database error.
1399 // CRM-9042
1400 $allPerms = array_keys(module_invoke_all('permission'));
1401 foreach (array_diff($perms, $allPerms) as $perm) {
1402 watchdog('civicrm',
1403 'Cannot grant the %perm permission because it does not yet exist.',
1404 array(
1405 '%perm' => $perm), WATCHDOG_ERROR
1406 );
1407 }
1408 $perms = array_intersect($perms, $allPerms);
1409 user_role_grant_permissions(DRUPAL_AUTHENTICATED_RID, $perms);
1410 user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, $perms);
1411 }
1412 }
1413
1414 /**
1415 * @param $cmsPath
1416 * @param $str
1417 *
1418 * @return string
1419 */
1420 function getSiteDir($cmsPath, $str) {
1421 static $siteDir = '';
1422
1423 if ($siteDir) {
1424 return $siteDir;
1425 }
1426
1427 $sites = CIVICRM_DIRECTORY_SEPARATOR . 'sites' . CIVICRM_DIRECTORY_SEPARATOR;
1428 $modules = CIVICRM_DIRECTORY_SEPARATOR . 'modules' . CIVICRM_DIRECTORY_SEPARATOR;
1429 preg_match("/" . preg_quote($sites, CIVICRM_DIRECTORY_SEPARATOR) .
1430 "([\-a-zA-Z0-9_.]+)" .
1431 preg_quote($modules, CIVICRM_DIRECTORY_SEPARATOR) . "/",
1432 $_SERVER['SCRIPT_FILENAME'], $matches
1433 );
1434 $siteDir = isset($matches[1]) ? $matches[1] : 'default';
1435
1436 if (strtolower($siteDir) == 'all') {
1437 // For this case - use drupal's way of finding out multi-site directory
1438 $uri = explode(CIVICRM_DIRECTORY_SEPARATOR, $_SERVER['SCRIPT_FILENAME']);
1439 $server = explode('.', implode('.', array_reverse(explode(':', rtrim($_SERVER['HTTP_HOST'], '.')))));
1440 for ($i = count($uri) - 1; $i > 0; $i--) {
1441 for ($j = count($server); $j > 0; $j--) {
1442 $dir = implode('.', array_slice($server, -$j)) . implode('.', array_slice($uri, 0, $i));
1443 if (file_exists($cmsPath . CIVICRM_DIRECTORY_SEPARATOR .
1444 'sites' . CIVICRM_DIRECTORY_SEPARATOR . $dir
1445 )) {
1446 $siteDir = $dir;
1447 return $siteDir;
1448 }
1449 }
1450 }
1451 $siteDir = 'default';
1452 }
1453
1454 return $siteDir;
1455 }
1456
1457 /**
1458 * @param $errorTitle
1459 * @param $errorMsg
1460 */
1461 function errorDisplayPage($errorTitle, $errorMsg) {
1462 include 'error.html';
1463 exit();
1464 }