PageRenderTime 76ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/src/libraries/controllers/SetupController.php

https://github.com/duggan/frontend
PHP | 782 lines | 624 code | 80 blank | 78 comment | 123 complexity | 676d88374452e29efa9549323f278e44 MD5 | raw file
Possible License(s): Apache-2.0, BSD-3-Clause
  1. <?php
  2. /**
  3. * Setup controller for HTML endpoints
  4. * This controls the setup flow when the software is first installed.
  5. * The main purpose of this flow is to generate settings.ini.
  6. *
  7. * @author Jaisen Mathai <jaisen@jmathai.com>
  8. * @author Kevin Hornschemeier <khornschemeier@gmail.com>
  9. */
  10. class SetupController
  11. {
  12. /**
  13. * Returns the setup step 1 screen markup.
  14. *
  15. * @return string HTML
  16. */
  17. public static function setup()
  18. {
  19. $step = 1;
  20. $appId = 'openphoto-frontend';
  21. getSession('step', 1);
  22. $imageLibs = array();
  23. if(class_exists('Imagick'))
  24. $imageLibs['ImageMagick'] = 'ImageMagick';
  25. if(class_exists('Gmagick'))
  26. $imageLibs['GraphicsMagick'] = 'GraphicsMagick';
  27. if(extension_loaded('gd') && function_exists('gd_info'))
  28. $imageLibs['GD'] = 'GD';
  29. $imageLibrary = '';
  30. if(getConfig()->get('modules') != null)
  31. $imageLibrary = getConfig()->get('modules')->image;
  32. $database = '';
  33. $filesystem = '';
  34. if(getConfig()->get('systems') != null)
  35. {
  36. $database = getConfig()->get('systems')->database;
  37. $filesystem = getConfig()->get('systems')->fileSystem;
  38. }
  39. $theme = getTheme()->getThemeName();
  40. $themes = getTheme()->getThemes();
  41. $warnings = self::verifyRequirements($imageLibs);
  42. $skipConfig = 0;
  43. foreach ($warnings as $error => $message) {
  44. switch ($error)
  45. {
  46. case 'config_not_writable':
  47. $skipConfig = 1;
  48. $step = 1;
  49. break;
  50. case 'cannot_create_generated':
  51. case 'generated_not_writable':
  52. case 'no_image_lib':
  53. default:
  54. $step = 0;
  55. break;
  56. }
  57. }
  58. $email = '';
  59. if(getConfig()->get('user') != null)
  60. $email = getConfig()->get('user')->email;
  61. elseif(User::isLoggedIn())
  62. $email = getSession()->get('email');
  63. $qs = '';
  64. if(isset($_GET['edit']))
  65. $qs = '?edit';
  66. $template = sprintf('%s/setup.php', getConfig()->get('paths')->templates);
  67. $body = getTemplate()->get($template, array('filesystem' => $filesystem, 'database' => $database, 'themes' => $themes, 'theme' => $theme,
  68. 'imageLibs' => $imageLibs, 'imageLibrary' => $imageLibrary, 'appId' => $appId, 'step' => $step, 'email' => $email, 'qs' => $qs, 'errors' => $warnings, 'skipConfig' => $skipConfig));
  69. getTheme()->display('template.php', array('body' => $body, 'page' => 'setup'));
  70. }
  71. /**
  72. * Gets Dropbox info from the user
  73. *
  74. * @return string HTML
  75. */
  76. public static function setupDropbox()
  77. {
  78. extract(self::getDefaultConfigParams());
  79. $secret = self::getSecret();
  80. $credentials = getConfig()->get('credentials');
  81. $dropbox = getConfig()->get('dropbox');
  82. if($credentials !== null)
  83. {
  84. if(isset($credentials->dropboxKey) && !empty($credentials->dropboxKey))
  85. $dropboxKey = Utility::decrypt($credentials->dropboxKey, $secret);
  86. if(isset($credentials->dropboxSecret) && !empty($credentials->dropboxSecret))
  87. $dropboxSecret = Utility::decrypt($credentials->dropboxSecret, $secret);
  88. if(isset($dropbox->dropboxFolder))
  89. $dropboxFolder = $dropbox->dropboxFolder;
  90. }
  91. $qs = '';
  92. if(isset($_GET['edit']))
  93. $qs = '?edit';
  94. $template = sprintf('%s/setupDropbox.php', getConfig()->get('paths')->templates);
  95. $body = getTemplate()->get($template, array('dropboxKey' => $dropboxKey, 'dropboxSecret' => $dropboxSecret, 'dropboxFolder' => $dropboxFolder, 'qs' => $qs));
  96. getTheme()->display('template.php', array('body' => $body, 'page' => 'setup'));
  97. }
  98. /**
  99. * Handles callback from Dropbox oauth flow
  100. *
  101. * @return void HTTP redirect (to dropbox.com)
  102. */
  103. public static function setupDropboxCallback()
  104. {
  105. $secret = self::getSecret();
  106. try
  107. {
  108. $dropboxToken = getSession()->get('dropboxToken');
  109. $dropboxKey = Utility::decrypt(getSession()->get('flowDropboxKey'), $secret);
  110. $dropboxSecret = Utility::decrypt(getSession()->get('flowDropboxSecret'), $secret);
  111. $oauth = new Dropbox_OAuth_PHP($dropboxKey, $dropboxSecret);
  112. $oauth->setToken($dropboxToken);
  113. $accessToken = $oauth->getAccessToken();
  114. getSession()->set('dropboxFolder', getSession()->get('flowDropboxFolder'));
  115. getSession()->set('dropboxKey', getSession()->get('flowDropboxKey'));
  116. getSession()->set('dropboxSecret', getSession()->get('flowDropboxSecret'));
  117. getSession()->set('dropboxToken', Utility::encrypt($accessToken['token'], $secret));
  118. getSession()->set('dropboxTokenSecret', Utility::encrypt($accessToken['token_secret'], $secret));
  119. $qs = '';
  120. if(isset($_GET['edit']))
  121. $qs = '?edit';
  122. getRoute()->redirect(sprintf('%s%s', '/setup/3', $qs));
  123. }
  124. catch(Dropbox_Exception $e)
  125. {
  126. getLogger()->crit(sprintf('An error occured getting the Dropbox authorize url. Message: %s', $e->getMessage()));
  127. getRoute()->run('/error/500');
  128. }
  129. }
  130. /**
  131. * Gets authorize URL and redirects to dropbox
  132. *
  133. * @return void HTTP redirect (to dropbox.com)
  134. */
  135. public static function setupDropboxPost()
  136. {
  137. $qs = '';
  138. if(isset($_GET['edit']))
  139. $qs = '?edit';
  140. $secret = self::getSecret();
  141. try
  142. {
  143. getSession()->set('flowDropboxKey', Utility::encrypt($_POST['dropboxKey'], $secret));
  144. getSession()->set('flowDropboxSecret', Utility::encrypt($_POST['dropboxSecret'], $secret));
  145. getSession()->set('flowDropboxFolder', $_POST['dropboxFolder']);
  146. $callback = urlencode(sprintf('%s://%s%s%s', Utility::getProtocol(false), getenv('HTTP_HOST'), '/setup/dropbox/callback', $qs));
  147. $oauth = new Dropbox_OAuth_PHP($_POST['dropboxKey'], $_POST['dropboxSecret']);
  148. getSession()->set('dropboxToken', $oauth->getRequestToken());
  149. $url = $oauth->getAuthorizeUrl($callback);
  150. getRoute()->redirect($url, null, true);
  151. }
  152. catch(Dropbox_Exception $e)
  153. {
  154. getLogger()->crit(sprintf('An error occured getting the Dropbox authorize url. Message: %s', $e->getMessage()));
  155. getRoute()->run('/error/500', EpiRoute::httpGet);
  156. }
  157. }
  158. /**
  159. * Posts the setup values from step 1 of the form, checks them, and saves in session
  160. *
  161. * @return void HTTP redirect (setup step 2)
  162. */
  163. public static function setupPost()
  164. {
  165. $step = 1;
  166. $appId = isset($_POST['appId']) ? $_POST['appId'] : '';
  167. $email = isset($_POST['email']) ? $_POST['email'] : '';
  168. $theme = isset($_POST['theme']) ? $_POST['theme'] : '';
  169. $skipConfig = isset($_POST['skipConfig']) ? $_POST['skipConfig'] : '';
  170. $input = array(
  171. array('Email', $email, 'required')
  172. );
  173. $errors = getForm()->hasErrors($input);
  174. if($errors === false)
  175. {
  176. getSession()->set('step', 2);
  177. getSession()->set('appId', $appId);
  178. getSession()->set('ownerEmail', $email);
  179. getSession()->set('theme', $theme);
  180. getSession()->set('skipConfig', $skipConfig);
  181. $qs = '';
  182. if(isset($_GET['edit']))
  183. $qs = '?edit';
  184. getRoute()->redirect('/setup/2' . $qs);
  185. }
  186. $template = sprintf('%s/setup.php', getConfig()->get('paths')->templates);
  187. $body = getTemplate()->get($template, array('email' => $email, 'appId' => $appId, 'step' => $step, 'errors' => $errors));
  188. getTheme()->display('template.php', array('body' => $body, 'page' => 'setup'));
  189. }
  190. /**
  191. * Returns the setup step 2 screen markup.
  192. *
  193. * @return string HTML
  194. */
  195. public static function setup2()
  196. {
  197. // make sure the user should be on this step
  198. if(getSession()->get('step') != 2)
  199. getRoute()->redirect('/setup');
  200. $step = 2;
  201. $imageLibs = array();
  202. if(class_exists('Imagick'))
  203. $imageLibs['ImageMagick'] = 'ImageMagick';
  204. if(class_exists('Gmagick'))
  205. $imageLibs['GraphicsMagick'] = 'GraphicsMagick';
  206. if(extension_loaded('gd') && function_exists('gd_info'))
  207. $imageLibs['GD'] = 'GD';
  208. $imageLibrary = '';
  209. if(getConfig()->get('modules') != null)
  210. $imageLibrary = getConfig()->get('modules')->image;
  211. $database = '';
  212. $filesystem = '';
  213. if(getConfig()->get('systems') != null)
  214. {
  215. $database = getConfig()->get('systems')->database;
  216. $filesystem = getConfig()->get('systems')->fileSystem;
  217. }
  218. $qs = '';
  219. if(isset($_GET['edit']))
  220. $qs = '?edit';
  221. $template = sprintf('%s/setup.php', getConfig()->get('paths')->templates);
  222. $body = getTemplate()->get($template, array('themes' => array(), 'imageLibs' => $imageLibs, 'appId' => 'openphoto-frontend', 'imageLibrary' => $imageLibrary, 'database' => $database, 'filesystem' => $filesystem, 'qs' => $qs, 'step' => $step));
  223. getTheme()->display('template.php', array('body' => $body, 'page' => 'setup'));
  224. }
  225. /**
  226. * Posts the setup values from step 2 of the form, checks them, and saves in session
  227. *
  228. * @return void HTTP redirect (setup step 3)
  229. */
  230. public static function setup2Post()
  231. {
  232. getSession()->set('step', 3);
  233. getSession()->set('imageLibrary', $_POST['imageLibrary']);
  234. getSession()->set('database', $_POST['database']);
  235. getSession()->set('fileSystem', $_POST['fileSystem']);
  236. $qs = '';
  237. if(isset($_GET['edit']))
  238. $qs = '?edit';
  239. if(stristr($_POST['fileSystem'], 'Dropbox') !== false)
  240. getRoute()->redirect('/setup/dropbox' . $qs);
  241. else
  242. getRoute()->redirect('/setup/3' . $qs);
  243. }
  244. /**
  245. * Returns the setup step 3 screen markup.
  246. *
  247. * @return string HTML
  248. */
  249. public static function setup3()
  250. {
  251. // make sure the user should be on this step
  252. if(getSession()->get('step') != 3)
  253. {
  254. if(getSession()->get('step') == 2)
  255. getRoute()->redirect('/setup/2');
  256. getRoute()->redirect('/setup');
  257. }
  258. extract(self::getDefaultConfigParams());
  259. $secret = self::getSecret();
  260. $step = 3;
  261. $appId = getSession()->get('appId');
  262. $database = getSession()->get('database');
  263. $filesystem = getSession()->get('filesystem');
  264. $usesAws = (getSession()->get('database') == 'SimpleDb' || stristr(getSession()->get('fileSystem'), 'S3') !== false) ? true : false;
  265. $usesMySql = (getSession()->get('database') == 'MySql') ? true : false;
  266. $usesLocalFs = (stristr(getSession()->get('fileSystem'), 'Local') !== false) ? true : false;
  267. $usesS3 = (stristr(getSession()->get('fileSystem'), 'S3') !== false) ? true : false;
  268. $usesDropbox = (stristr(getSession()->get('fileSystem'), 'Dropbox') !== false) ? true : false;
  269. $usesSimpleDb = (getSession()->get('database') == 'SimpleDb') ? true : false;
  270. $dropboxKey = getSession()->get('dropboxKey');
  271. if(!empty($dropboxKey))
  272. {
  273. $dropboxFolder = getSession()->get('dropboxFolder');
  274. $dropboxKey = Utility::decrypt(getSession()->get('dropboxKey'), $secret);
  275. $dropboxSecret = Utility::decrypt(getSession()->get('dropboxSecret'), $secret);
  276. $dropboxToken = Utility::decrypt(getSession()->get('dropboxToken'), $secret);
  277. $dropboxTokenSecret = Utility::decrypt(getSession()->get('dropboxTokenSecret'), $secret);
  278. }
  279. if(getConfig()->get('credentials') != null)
  280. {
  281. $credentials = getConfig()->get('credentials');
  282. if(isset($credentials->awsKey))
  283. $awsKey = Utility::decrypt($credentials->awsKey, $secret);
  284. if(isset($credentials->awsSecret))
  285. $awsSecret = Utility::decrypt($credentials->awsSecret, $secret);
  286. if(empty($dropboxKey))
  287. {
  288. if(isset($credentials->dropboxKey))
  289. $dropboxKey = Utility::decrypt($credentials->dropboxKey, $secret);
  290. if(isset($credentials->dropboxSecret))
  291. $dropboxSecret = Utility::decrypt($credentials->dropboxSecret, $secret);
  292. if(isset($credentials->dropboxToken))
  293. $dropboxToken = Utility::decrypt($credentials->dropboxToken, $secret);
  294. if(isset($credentials->dropboxTokenSecret))
  295. $dropboxTokenSecret = Utility::decrypt($credentials->dropboxTokenSecret, $secret);
  296. }
  297. }
  298. if(getConfig()->get('aws') != null)
  299. {
  300. $s3Bucket = getConfig()->get('aws')->s3BucketName;
  301. $simpleDbDomain = getConfig()->get('aws')->simpleDbDomain;
  302. }
  303. if(getConfig()->get('mysql') != null)
  304. {
  305. $mysql = getConfig()->get('mysql');
  306. $mySqlHost = $mysql->mySqlHost;
  307. $mySqlUser = $mysql->mySqlUser;
  308. $mySqlPassword = Utility::decrypt($mysql->mySqlPassword, $secret);
  309. $mySqlDb = $mysql->mySqlDb;
  310. $mySqlTablePrefix = $mysql->mySqlTablePrefix;
  311. }
  312. if(getConfig()->get('localfs') != null)
  313. {
  314. $fsRoot = getConfig()->get('localfs')->fsRoot;
  315. $fsHost = getConfig()->get('localfs')->fsHost;
  316. }
  317. if(!isset($dropboxFolder) && getConfig()->get('dropbox') != null)
  318. {
  319. $dropboxFolder = getConfig()->get('dropbox')->dropboxFolder;
  320. }
  321. $qs = '';
  322. if(isset($_GET['edit']))
  323. $qs = '?edit';
  324. $template = sprintf('%s/setup.php', getConfig()->get('paths')->templates);
  325. // copied to/from setup3Post()
  326. $body = getTemplate()->get($template, array('step' => $step, 'themes' => $themes, 'usesAws' => $usesAws, 'usesMySql' => $usesMySql,
  327. 'database' => $database, 'filesystem' => $filesystem, 'usesLocalFs' => $usesLocalFs, 'usesS3' => $usesS3,
  328. 'usesSimpleDb' => $usesSimpleDb, 'awsKey' => $awsKey, 'awsSecret' => $awsSecret, 's3Bucket' => $s3Bucket,
  329. 'simpleDbDomain' => $simpleDbDomain, 'mySqlHost' => $mySqlHost, 'mySqlUser' => $mySqlUser, 'mySqlDb' => $mySqlDb,
  330. 'mySqlPassword' => $mySqlPassword, 'mySqlTablePrefix' => $mySqlTablePrefix, 'fsRoot' => $fsRoot, 'fsHost' => $fsHost,
  331. 'usesDropbox' => $usesDropbox, 'dropboxKey' => $dropboxKey, 'dropboxSecret' => $dropboxSecret, 'dropboxToken' => $dropboxToken,
  332. 'dropboxTokenSecret' => $dropboxTokenSecret, 'dropboxFolder' => $dropboxFolder, 'qs' => $qs, 'appId' => $appId, 'errors' => $errors));
  333. getTheme()->display('template.php', array('body' => $body, 'page' => 'setup'));
  334. }
  335. /**
  336. * Posts the setup values from step 3 of the form, checks them, and saves in session
  337. *
  338. * @return void HTTP redirect (home)
  339. */
  340. public static function setup3Post()
  341. {
  342. extract(self::getDefaultConfigParams());
  343. $step = 3;
  344. $secret = self::getSecret();
  345. $database = getSession()->get('database');
  346. $filesystem = getSession()->get('filesystem');
  347. $appId = getSession()->get('appId');
  348. $usesAws = (getSession()->get('database') == 'SimpleDb' || stristr(getSession()->get('fileSystem'), 'S3') !== false) ? true : false;
  349. $usesMySql = (getSession()->get('database') == 'MySql') ? true : false;
  350. $usesSimpleDb = (getSession()->get('database') == 'SimpleDb') ? true : false;
  351. $usesLocalFs = (stristr(getSession()->get('fileSystem'), 'Local') !== false) ? true : false;
  352. $usesS3 = (stristr(getSession()->get('fileSystem'), 'S3') !== false) ? true : false;
  353. $usesDropbox = (stristr(getSession()->get('fileSystem'), 'Dropbox') !== false) ? true : false;
  354. $awsErrors = false;
  355. $mySqlErrors = false;
  356. $localFsErrors = false;
  357. $fsErrors = false;
  358. $dbErrors = false;
  359. $writeErrors = false;
  360. if($usesAws)
  361. {
  362. $awsKey = $_POST['awsKey'];
  363. $awsSecret = $_POST['awsSecret'];
  364. $input = array(
  365. array('Amazon Access Key ID', $awsKey, 'required'),
  366. array('Amazon Secret Access Key', $awsSecret, 'required')
  367. );
  368. if($usesS3)
  369. {
  370. $s3Bucket = $_POST['s3Bucket'];
  371. $input[] = array('Amazon S3 Bucket Name', $s3Bucket, 'required');
  372. }
  373. if($usesSimpleDb)
  374. {
  375. $simpleDbDomain = $_POST['simpleDbDomain'];
  376. $input[] = array('Amazon SimpleDb Domain', $simpleDbDomain, 'required');
  377. }
  378. $awsErrors = getForm()->hasErrors($input);
  379. }
  380. if($usesMySql)
  381. {
  382. $mySqlHost = $_POST['mySqlHost'];
  383. $mySqlUser = $_POST['mySqlUser'];
  384. $mySqlPassword = $_POST['mySqlPassword'];
  385. $mySqlDb = $_POST['mySqlDb'];
  386. $mySqlTablePrefix = $_POST['mySqlTablePrefix'];
  387. $input = array(
  388. array('MySQL Host', $mySqlHost, 'required'),
  389. array('MySQL Username', $mySqlUser, 'required'),
  390. array('MySQL Password', $mySqlPassword, 'required'),
  391. array('MySQL Database', $mySqlDb, 'required'),
  392. array('MySQL Table Prefix', $mySqlTablePrefix, 'required')
  393. );
  394. $mySqlErrors = getForm()->hasErrors($input);
  395. }
  396. if($usesLocalFs)
  397. {
  398. $fsRoot = $_POST['fsRoot'];
  399. $fsHost = $_POST['fsHost'];
  400. $input = array(
  401. array('File System Root', $fsRoot, 'required'),
  402. array('File System Host', $fsHost, 'required')
  403. );
  404. $localFsErrors = getForm()->hasErrors($input);
  405. }
  406. if($usesDropbox)
  407. {
  408. $dropboxKey = $_POST['dropboxKey'];
  409. $dropboxSecret = $_POST['dropboxSecret'];
  410. $dropboxToken = $_POST['dropboxToken'];
  411. $dropboxTokenSecret = $_POST['dropboxTokenSecret'];
  412. $dropboxFolder = $_POST['dropboxFolder'];
  413. }
  414. if($awsErrors === false && $mySqlErrors === false && $localFsErrors === false)
  415. {
  416. $credentials = new stdClass;
  417. if($usesAws)
  418. {
  419. getSession()->set('awsKey', Utility::encrypt($awsKey, $secret));
  420. getSession()->set('awsSecret', Utility::encrypt($awsSecret, $secret));
  421. $credentials->awsKey = Utility::encrypt($awsKey, $secret);
  422. $credentials->awsSecret = Utility::encrypt($awsSecret, $secret);
  423. $aws = new stdClass;
  424. if($usesS3)
  425. {
  426. getSession()->set('s3BucketName', $s3Bucket);
  427. $aws->s3BucketName = $s3Bucket;
  428. $aws->s3Host = "{$s3Bucket}.s3.amazonaws.com";
  429. }
  430. if($usesSimpleDb)
  431. {
  432. getSession()->set('simpleDbDomain', $simpleDbDomain);
  433. $aws->simpleDbDomain = $simpleDbDomain;
  434. }
  435. }
  436. if($usesMySql)
  437. {
  438. getSession()->set('mySqlHost', $mySqlHost);
  439. getSession()->set('mySqlUser', $mySqlUser);
  440. getSession()->set('mySqlPassword', Utility::encrypt($mySqlPassword, $secret));
  441. getSession()->set('mySqlDb', $mySqlDb);
  442. getSession()->set('mySqlTablePrefix', $mySqlTablePrefix);
  443. $mysql = new stdClass;
  444. $mysql->mySqlHost = $mySqlHost;
  445. $mysql->mySqlUser = $mySqlUser;
  446. $mysql->mySqlPassword = Utility::encrypt($mySqlPassword, $secret);
  447. $mysql->mySqlDb = $mySqlDb;
  448. $mysql->mySqlTablePrefix = $mySqlTablePrefix;
  449. }
  450. if($usesLocalFs)
  451. {
  452. getSession()->set('fsRoot', $fsRoot);
  453. getSession()->set('fsHost', $fsHost);
  454. $fs = new stdClass;
  455. $fs->fsRoot = $fsRoot;
  456. $fs->fsHost = $fsHost;
  457. }
  458. if($usesDropbox)
  459. {
  460. getSession()->set('dropboxKey', Utility::encrypt($dropboxKey, $secret));
  461. getSession()->set('dropboxSecret', Utility::encrypt($dropboxSecret, $secret));
  462. getSession()->set('dropboxToken', Utility::encrypt($dropboxToken, $secret));
  463. getSession()->set('dropboxTokenSecret', Utility::encrypt($dropboxTokenSecret, $secret));
  464. getSession()->set('dropboxFolder', $dropboxFolder);
  465. $credentials->dropboxKey = Utility::encrypt($dropboxKey, $secret);
  466. $credentials->dropboxSecret = Utility::encrypt($dropboxSecret, $secret);
  467. $credentials->dropboxToken = Utility::encrypt($dropboxToken, $secret);
  468. $credentials->dropboxTokenSecret = Utility::encrypt($dropboxTokenSecret, $secret);
  469. $dropbox = new stdClass;
  470. $dropbox->dropboxFolder = $dropboxFolder;
  471. }
  472. $systems = new stdClass;
  473. $systems->database = getSession()->get('database');
  474. $systems->fileSystem = getSession()->get('fileSystem');
  475. $secrets = new stdClass;
  476. $secrets->secret = self::getSecret();
  477. // save the config info
  478. getConfig()->set('credentials', $credentials);
  479. if($usesAws)
  480. getConfig()->set('aws', $aws);
  481. if($usesMySql)
  482. getConfig()->set('mysql', $mysql);
  483. if($usesLocalFs)
  484. getConfig()->set('localfs', $fs);
  485. if($usesDropbox)
  486. getConfig()->set('dropbox', $dropbox);
  487. getConfig()->set('systems', $systems);
  488. getConfig()->set('secrets', $secrets);
  489. $fsObj = getFs();
  490. $dbObj = getDb();
  491. $user = exec("whoami");
  492. if(!$fsObj->initialize())
  493. {
  494. if($usesAws)
  495. $fsErrors[] = 'We were unable to initialize your S3 bucket.<ul><li>Make sure you\'re <a href="http://aws.amazon.com/s3/">signed up for AWS S3</a>.</li><li>Double check your AWS credentials.</li><li>S3 bucket names are globally unique, make sure yours isn\'t already in use by someone else.</li><li>S3 bucket names can\'t have certain special characters. Try using just alpha-numeric characters and periods.</li></ul>';
  496. else if($usesLocalFs)
  497. $fsErrors[] = "We were unable to set up your local file system using <em>{$fsObj->fsRoot}</em>. Make sure that the following user has proper permissions ({$user}).";
  498. else
  499. $fsErrors[] = 'An unknown error occurred while setting up your file system. Check your error logs to see if there\'s more information about the error.';
  500. }
  501. if(!$dbObj->initialize())
  502. {
  503. if($usesAws)
  504. $dbErrors[] = 'We were unable to initialize your SimpleDb domains.<ul><li>Make sure you\'re <a href="http://aws.amazon.com/simpledb/">signed up for AWS SimpleDb</a>.</li><li>Double check your AWS credentials.</li><li>SimpleDb domains cannot contain special characters such as periods.</li><li>Sometimes the SimpleDb create domain API is unstable. Try again later or check the error log if you have access to it.</li></ul>';
  505. else if($usesMySql)
  506. $dbErrors[] = 'We were unable to properly connect to your MySql database server. Please verify that the host, username and password are correct and have proper permissions to create a database.';
  507. else
  508. $dbErrors[] = 'An unknown error occurred while setting up your file system. Check your error logsto see if there\'s more information about the error.';
  509. $dbErrors = array_merge($dbErrors, $dbObj->errors());
  510. }
  511. if($fsErrors === false && $dbErrors === false)
  512. {
  513. $writeError = self::writeConfigFile();
  514. if($writeErrors === false)
  515. getRoute()->redirect('/');
  516. else
  517. $writeErrors[] = "We were unable to save your settings file. Please make sure that the following user has proper permissions to write to src/configs ({$user}).";
  518. }
  519. }
  520. // combine all errors if they exist
  521. $errors = array();
  522. if(is_array($awsErrors))
  523. $errors = array_merge($errors, $awsErrors);
  524. if(is_array($mySqlErrors))
  525. $errors = array_merge($errors, $mySqlErrors);
  526. if(is_array($localFsErrors))
  527. $errors = array_merge($errors, $localFsErrors);
  528. if(is_array($fsErrors))
  529. $errors = array_merge($errors, $fsErrors);
  530. if(is_array($dbErrors))
  531. $errors = array_merge($errors, $dbErrors);
  532. if(is_array($writeErrors))
  533. $errors = array_merge($errors, $writeErrors);
  534. $qs = '';
  535. if(isset($_GET['edit']))
  536. $qs = '?edit';
  537. $template = sprintf('%s/setup.php', getConfig()->get('paths')->templates);
  538. // copied to/from setup3()
  539. $body = getTemplate()->get($template, array('step' => $step, 'themes' => $themes, 'usesAws' => $usesAws, 'usesMySql' => $usesMySql,
  540. 'database' => $database, 'filesystem' => $filesystem, 'usesLocalFs' => $usesLocalFs, 'usesS3' => $usesS3,
  541. 'usesSimpleDb' => $usesSimpleDb, 'awsKey' => $awsKey, 'awsSecret' => $awsSecret, 's3Bucket' => $s3Bucket,
  542. 'simpleDbDomain' => $simpleDbDomain, 'mySqlHost' => $mySqlHost, 'mySqlUser' => $mySqlUser, 'mySqlDb' => $mySqlDb,
  543. 'mySqlPassword' => $mySqlPassword, 'mySqlTablePrefix' => $mySqlTablePrefix, 'fsRoot' => $fsRoot, 'fsHost' => $fsHost,
  544. 'usesDropbox' => $usesDropbox, 'dropboxKey' => $dropboxKey, 'dropboxSecret' => $dropboxSecret, 'dropboxToken' => $dropboxToken,
  545. 'dropboxTokenSecret' => $dropboxTokenSecret, 'dropboxFolder' => $dropboxFolder, 'qs' => $qs, 'appId' => $appId, 'errors' => $errors));
  546. getTheme()->display('template.php', array('body' => $body, 'page' => 'setup'));
  547. }
  548. /**
  549. * Clears out the session data and redirects to step 1
  550. *
  551. * @return void HTTP redirect (setup step 1)
  552. */
  553. public static function setupRestart()
  554. {
  555. getSession()->end();
  556. getRoute()->redirect('/setup');
  557. }
  558. public static function getSecret()
  559. {
  560. if(getConfig()->get('secrets') !== null)
  561. {
  562. $secret = getConfig()->get('secrets')->secret;
  563. getSession()->set('secret', $secret);
  564. return $secret;
  565. }
  566. $secret = getSession()->get('secret');
  567. if(!$secret)
  568. {
  569. $secret = sha1(uniqid(true));
  570. getSession()->set('secret', $secret);
  571. }
  572. return $secret;
  573. }
  574. private static function getDefaultConfigParams()
  575. {
  576. return array('themes' => array(), 'awsKey' => '', 'awsSecret' => '', 's3Bucket' => '', 'simpleDbDomain' => '', 'mySqlHost' => '',
  577. 'mySqlUser' => '', 'mySqlPassword' => '', 'mySqlDb' => '', 'mySqlTablePrefix' => '',
  578. 'fsRoot' => '', 'fsHost' => '', 'dropboxFolder' => '', 'dropboxKey' => '', 'dropboxSecret' => '',
  579. 'dropboxKey' => '', 'dropboxToken' => '', 'dropboxTokenSecret' => '', 'errors' => '');
  580. }
  581. /**
  582. * Verify the server requirements are available on this host.
  583. *
  584. * @return mixed TRUE on success, array on error
  585. */
  586. private static function verifyRequirements($imageLibs)
  587. {
  588. $warnings = array();
  589. $configDir = Utility::getBaseDir() . '/configs';
  590. $generatedDir = "{$configDir}/generated";
  591. if(file_exists($generatedDir) && is_writable($generatedDir) && !empty($imageLibs))
  592. # No errors, return empty array
  593. return $warnings;
  594. $user = exec("whoami");
  595. if(empty($user))
  596. $user = 'Apache user';
  597. if(!is_writable($configDir))
  598. {
  599. $warnings['config_not_writable'] = "<em>{$configDir}</em> is not writable. <ul><li>You can either make the directory writable by <em>{$user}</em> or,</li><li>manually upload the config at the end of the setup.</li></ul>";
  600. }
  601. else
  602. {
  603. if(!file_exists($generatedDir))
  604. {
  605. $createDir = mkdir($generatedDir, 0700);
  606. if(!$createDir)
  607. $warnings['cannot_create_generated'] = "Could not create configuration directory.<ul><li>Make sure the user <em>{$user}</em> can write to <em>{$generatedDir}</em>.</li></ul>";
  608. }
  609. elseif(!is_writable($generatedDir))
  610. {
  611. $warnings['generated_not_writable'] = "Directory exist but is not writable.<ul><li>Make sure the user <em>{$user}</em> can write to <em>{$generatedDir}</em>.</li></ul>";
  612. }
  613. if(empty($imageLibs))
  614. $warnings['no_image_lib'] = 'No suitable image library exists.<ul><li>Make sure that one of the following are installed: <em><a href="http://php.net/imagick">Imagick</a></em>, <em><a href="http://php.net/gmagick">Gmagick</a></em>, or <em><a href="http://php.net/gd">GD</a></em>.</li></ul>';
  615. }
  616. return $warnings;
  617. }
  618. /**
  619. * Write out the settings config file
  620. *
  621. * @return boolean TRUE on success, FALSE on error
  622. */
  623. private static function writeConfigFile()
  624. {
  625. // continue if no errors
  626. $secret = self::getSecret();
  627. $baseDir = Utility::getBaseDir();
  628. $htmlDir = "{$baseDir}/html";
  629. $libDir = "{$baseDir}/libraries";
  630. $configDir = "{$baseDir}/configs";
  631. $replacements = array(
  632. '{adapters}' => "{$libDir}/adapters",
  633. '{configs}' => $configDir,
  634. '{controllers}' => "{$libDir}/controllers",
  635. '{external}' => "{$libDir}/external",
  636. '{libraries}' => "{$libDir}",
  637. '{models}' => "{$libDir}/models",
  638. '{photos}' => "{$htmlDir}/photos",
  639. '{templates}' => "{$baseDir}/templates",
  640. '{themes}' => "{$htmlDir}/assets/themes",
  641. '{exiftran}' => exec('which exiftran'),
  642. '{autoTagWithDate}' => '1',
  643. '{localSecret}' => $secret,
  644. '{awsKey}' => "",
  645. '{awsSecret}' => "",
  646. '{s3Bucket}' => getSession()->get('s3BucketName'),
  647. '{s3Host}' => getSession()->get('s3BucketName') . '.s3.amazonaws.com',
  648. '{simpleDbDomain}' => "",
  649. '{mySqlHost}' => "",
  650. '{mySqlUser}' => "",
  651. '{mySqlPassword}' => "",
  652. '{mySqlDb}' => "",
  653. '{mySqlTablePrefix}' => "",
  654. '{dropboxKey}' => "",
  655. '{dropboxSecret}' => "",
  656. '{dropboxToken}' => "",
  657. '{dropboxTokenSecret}' => "",
  658. '{dropboxFolder}' => "",
  659. '{fsRoot}' => "",
  660. '{fsHost}' => "",
  661. '{temp}' => sys_get_temp_dir(),
  662. '{theme}' => getSession()->get('theme'),
  663. '{email}' => getSession()->get('ownerEmail')
  664. );
  665. $pReplace = array();
  666. $session = getSession()->getAll();
  667. foreach($session as $key => $val)
  668. {
  669. if($key != 'email')
  670. $pReplace["{{$key}}"] = $val;
  671. getLogger()->info(sprintf('Storing %s as %s', $key, $val));
  672. }
  673. $replacements = array_merge($replacements, $pReplace);
  674. $generatedIni = str_replace(
  675. array_keys($replacements),
  676. array_values($replacements),
  677. file_get_contents("{$configDir}/template.ini")
  678. );
  679. if (getSession()->get('skipConfig') == 1)
  680. {
  681. $step = 4;
  682. $iniName = sprintf("%s.ini", getenv('HTTP_HOST'));
  683. $generatedDir = $configDir . '/generated/';
  684. // Output config to a text box for copying.
  685. $template = sprintf('%s/setup.php', getConfig()->get('paths')->templates);
  686. $body = getTemplate()->get($template, array('step' => $step, 'generatedIni' => $generatedIni, 'iniName' => $iniName, 'generatedDir' => $generatedDir));
  687. getTheme()->display('template.php', array('body' => $body, 'page' => 'setup'));
  688. }
  689. else {
  690. $iniWritten = file_put_contents(sprintf("%s/generated/%s.ini", $configDir, getenv('HTTP_HOST')), $generatedIni);
  691. if(!$iniWritten)
  692. return false;
  693. }
  694. // clean up the session
  695. foreach($session as $key => $val)
  696. {
  697. if($key != 'email')
  698. getSession()->set($key, '');
  699. }
  700. return true;
  701. }
  702. }