PageRenderTime 62ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

/src/libraries/controllers/SetupController.php

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