aboutsummaryrefslogtreecommitdiffhomepage
path: root/inc/poche/Poche.class.php
diff options
context:
space:
mode:
Diffstat (limited to 'inc/poche/Poche.class.php')
-rw-r--r--inc/poche/Poche.class.php204
1 files changed, 152 insertions, 52 deletions
diff --git a/inc/poche/Poche.class.php b/inc/poche/Poche.class.php
index 1ba8e7c1..0766cd51 100644
--- a/inc/poche/Poche.class.php
+++ b/inc/poche/Poche.class.php
@@ -20,7 +20,8 @@ class Poche
20 public $pagination; 20 public $pagination;
21 21
22 private $currentTheme = ''; 22 private $currentTheme = '';
23 private $notInstalledMessage = ''; 23 private $currentLanguage = '';
24 private $notInstalledMessage = array();
24 25
25 # @todo make this dynamic (actually install themes and save them in the database including author information et cetera) 26 # @todo make this dynamic (actually install themes and save them in the database including author information et cetera)
26 private $installedThemes = array( 27 private $installedThemes = array(
@@ -33,28 +34,21 @@ class Poche
33 34
34 public function __construct() 35 public function __construct()
35 { 36 {
36 if (! $this->configFileIsAvailable()) { 37 if ($this->configFileIsAvailable()) {
37 return; 38 $this->init();
38 } 39 }
39 40
40 $this->init(); 41 if ($this->themeIsInstalled()) {
41 42 $this->initTpl();
42 if (! $this->themeIsInstalled()) {
43 return;
44 } 43 }
45 44
46 $this->initTpl(); 45 if ($this->systemIsInstalled()) {
47 46 $this->store = new Database();
48 if (! $this->systemIsInstalled()) { 47 $this->messages = new Messages();
49 return; 48 # installation
50 } 49 if (! $this->store->isInstalled()) {
51 50 $this->install();
52 $this->store = new Database(); 51 }
53 $this->messages = new Messages();
54
55 # installation
56 if (! $this->store->isInstalled()) {
57 $this->install();
58 } 52 }
59 } 53 }
60 54
@@ -90,11 +84,20 @@ class Poche
90 } 84 }
91 85
92 $this->currentTheme = $themeDirectory; 86 $this->currentTheme = $themeDirectory;
87
88 # Set up language
89 $languageDirectory = $this->user->getConfigValue('language');
90
91 if ($languageDirectory === false) {
92 $languageDirectory = DEFAULT_THEME;
93 }
94
95 $this->currentLanguage = $languageDirectory;
93 } 96 }
94 97
95 public function configFileIsAvailable() { 98 public function configFileIsAvailable() {
96 if (! self::$configFileAvailable) { 99 if (! self::$configFileAvailable) {
97 $this->notInstalledMessage = 'You have to rename <strong>inc/poche/config.inc.php.new</strong> to <strong>inc/poche/config.inc.php</strong>.'; 100 $this->notInstalledMessage[] = 'You have to rename inc/poche/config.inc.php.new to inc/poche/config.inc.php.';
98 101
99 return false; 102 return false;
100 } 103 }
@@ -103,39 +106,44 @@ class Poche
103 } 106 }
104 107
105 public function themeIsInstalled() { 108 public function themeIsInstalled() {
109 $passTheme = TRUE;
106 # Twig is an absolute requirement for Poche to function. Abort immediately if the Composer installer hasn't been run yet 110 # Twig is an absolute requirement for Poche to function. Abort immediately if the Composer installer hasn't been run yet
107 if (! self::$canRenderTemplates) { 111 if (! self::$canRenderTemplates) {
108 $this->notInstalledMessage = 'Twig does not seem to be installed. Please initialize the Composer installation to automatically fetch dependencies. Have a look at <a href="http://doc.inthepoche.com/doku.php?id=users:begin:install">the documentation.</a>'; 112 $this->notInstalledMessage[] = 'Twig does not seem to be installed. Please initialize the Composer installation to automatically fetch dependencies. Have a look at <a href="http://doc.inthepoche.com/doku.php?id=users:begin:install">the documentation.</a>';
109 113 $passTheme = FALSE;
110 return false;
111 } 114 }
112 115
113 if (! is_writable(CACHE)) { 116 if (! is_writable(CACHE)) {
114 $this->notInstalledMessage = '<h1>error</h1><p>You don\'t have write access on cache directory.</p>'; 117 $this->notInstalledMessage[] = 'You don\'t have write access on cache directory.';
115 118
116 self::$canRenderTemplates = false; 119 self::$canRenderTemplates = false;
117 120
118 return false; 121 $passTheme = FALSE;
119 } 122 }
120 123
121 # Check if the selected theme and its requirements are present 124 # Check if the selected theme and its requirements are present
122 if (! is_dir(THEME . '/' . $this->getTheme())) { 125 if ($this->getTheme() != '' && ! is_dir(THEME . '/' . $this->getTheme())) {
123 $this->notInstalledMessage = 'The currently selected theme (' . $this->getTheme() . ') does not seem to be properly installed (Missing directory: ' . THEME . '/' . $this->getTheme() . ')'; 126 $this->notInstalledMessage[] = 'The currently selected theme (' . $this->getTheme() . ') does not seem to be properly installed (Missing directory: ' . THEME . '/' . $this->getTheme() . ')';
124 127
125 self::$canRenderTemplates = false; 128 self::$canRenderTemplates = false;
126 129
127 return false; 130 $passTheme = FALSE;
128 } 131 }
129 132
130 foreach ($this->installedThemes[$this->getTheme()]['requires'] as $requiredTheme) { 133 foreach ($this->installedThemes[$this->getTheme()]['requires'] as $requiredTheme) {
131 if (! is_dir(THEME . '/' . $requiredTheme)) { 134 if (! is_dir(THEME . '/' . $requiredTheme)) {
132 $this->notInstalledMessage = 'The required "' . $requiredTheme . '" theme is missing for the current theme (' . $this->getTheme() . ')'; 135 $this->notInstalledMessage[] = 'The required "' . $requiredTheme . '" theme is missing for the current theme (' . $this->getTheme() . ')';
133 136
134 self::$canRenderTemplates = false; 137 self::$canRenderTemplates = false;
135 138
136 return false; 139 $passTheme = FALSE;
137 } 140 }
138 } 141 }
142
143 if (!$passTheme) {
144 return FALSE;
145 }
146
139 147
140 return true; 148 return true;
141 } 149 }
@@ -147,25 +155,30 @@ class Poche
147 */ 155 */
148 public function systemIsInstalled() 156 public function systemIsInstalled()
149 { 157 {
150 $msg = ''; 158 $msg = TRUE;
151 159
152 $configSalt = defined('SALT') ? constant('SALT') : ''; 160 $configSalt = defined('SALT') ? constant('SALT') : '';
153 161
154 if (empty($configSalt)) { 162 if (empty($configSalt)) {
155 $msg = '<h1>error</h1><p>You have not yet filled in the SALT value in the config.inc.php file.</p>'; 163 $this->notInstalledMessage[] = 'You have not yet filled in the SALT value in the config.inc.php file.';
156 } else if (STORAGE == 'sqlite' && ! file_exists(STORAGE_SQLITE)) { 164 $msg = FALSE;
165 }
166 if (STORAGE == 'sqlite' && ! file_exists(STORAGE_SQLITE)) {
157 Tools::logm('sqlite file doesn\'t exist'); 167 Tools::logm('sqlite file doesn\'t exist');
158 $msg = '<h1>error</h1><p>sqlite file doesn\'t exist, you can find it in install folder. Copy it in /db folder.</p>'; 168 $this->notInstalledMessage[] = 'sqlite file doesn\'t exist, you can find it in install folder. Copy it in /db folder.';
159 } else if (is_dir(ROOT . '/install') && ! DEBUG_POCHE) { 169 $msg = FALSE;
160 $msg = '<h1>install folder</h1><p>you have to delete the /install folder before using poche.</p>'; 170 }
161 } else if (STORAGE == 'sqlite' && ! is_writable(STORAGE_SQLITE)) { 171 if (is_dir(ROOT . '/install') && ! DEBUG_POCHE) {
172 $this->notInstalledMessage[] = 'you have to delete the /install folder before using poche.';
173 $msg = FALSE;
174 }
175 if (STORAGE == 'sqlite' && ! is_writable(STORAGE_SQLITE)) {
162 Tools::logm('you don\'t have write access on sqlite file'); 176 Tools::logm('you don\'t have write access on sqlite file');
163 $msg = '<h1>error</h1><p>You don\'t have write access on sqlite file.</p>'; 177 $this->notInstalledMessage[] = 'You don\'t have write access on sqlite file.';
178 $msg = FALSE;
164 } 179 }
165 180
166 if (! empty($msg)) { 181 if (! $msg) {
167 $this->notInstalledMessage = $msg;
168
169 return false; 182 return false;
170 } 183 }
171 184
@@ -250,6 +263,10 @@ class Poche
250 public function getTheme() { 263 public function getTheme() {
251 return $this->currentTheme; 264 return $this->currentTheme;
252 } 265 }
266
267 public function getLanguage() {
268 return $this->currentLanguage;
269 }
253 270
254 public function getInstalledThemes() { 271 public function getInstalledThemes() {
255 $handle = opendir(THEME); 272 $handle = opendir(THEME);
@@ -258,7 +275,7 @@ class Poche
258 while (($theme = readdir($handle)) !== false) { 275 while (($theme = readdir($handle)) !== false) {
259 # Themes are stored in a directory, so all directory names are themes 276 # Themes are stored in a directory, so all directory names are themes
260 # @todo move theme installation data to database 277 # @todo move theme installation data to database
261 if (! is_dir(THEME . '/' . $theme) || in_array($theme, array('..', '.', '.git'))) { 278 if (! is_dir(THEME . '/' . $theme) || in_array($theme, array('..', '.'))) {
262 continue; 279 continue;
263 } 280 }
264 281
@@ -271,9 +288,33 @@ class Poche
271 $themes[] = array('name' => $theme, 'current' => $current); 288 $themes[] = array('name' => $theme, 'current' => $current);
272 } 289 }
273 290
291 sort($themes);
274 return $themes; 292 return $themes;
275 } 293 }
276 294
295 public function getInstalledLanguages() {
296 $handle = opendir(LOCALE);
297 $languages = array();
298
299 while (($language = readdir($handle)) !== false) {
300 # Languages are stored in a directory, so all directory names are languages
301 # @todo move language installation data to database
302 if (! is_dir(LOCALE . '/' . $language) || in_array($language, array('..', '.'))) {
303 continue;
304 }
305
306 $current = false;
307
308 if ($language === $this->getLanguage()) {
309 $current = true;
310 }
311
312 $languages[] = array('name' => $language, 'current' => $current);
313 }
314
315 return $languages;
316 }
317
277 public function getDefaultConfig() 318 public function getDefaultConfig()
278 { 319 {
279 return array( 320 return array(
@@ -363,15 +404,19 @@ class Poche
363 case 'config': 404 case 'config':
364 $dev = $this->getPocheVersion('dev'); 405 $dev = $this->getPocheVersion('dev');
365 $prod = $this->getPocheVersion('prod'); 406 $prod = $this->getPocheVersion('prod');
366 $compare_dev = version_compare(POCHE_VERSION, $dev); 407 $compare_dev = version_compare(POCHE, $dev);
367 $compare_prod = version_compare(POCHE_VERSION, $prod); 408 $compare_prod = version_compare(POCHE, $prod);
368 $themes = $this->getInstalledThemes(); 409 $themes = $this->getInstalledThemes();
410 $languages = $this->getInstalledLanguages();
411 $http_auth = (isset($_SERVER['PHP_AUTH_USER']))?true:false;
369 $tpl_vars = array( 412 $tpl_vars = array(
370 'themes' => $themes, 413 'themes' => $themes,
414 'languages' => $languages,
371 'dev' => $dev, 415 'dev' => $dev,
372 'prod' => $prod, 416 'prod' => $prod,
373 'compare_dev' => $compare_dev, 417 'compare_dev' => $compare_dev,
374 'compare_prod' => $compare_prod, 418 'compare_prod' => $compare_prod,
419 'http_auth' => $http_auth,
375 ); 420 );
376 Tools::logm('config view'); 421 Tools::logm('config view');
377 break; 422 break;
@@ -492,6 +537,59 @@ class Poche
492 Tools::redirect('?view=config'); 537 Tools::redirect('?view=config');
493 } 538 }
494 539
540 public function updateLanguage()
541 {
542 # no data
543 if (empty($_POST['language'])) {
544 }
545
546 # we are not going to change it to the current language...
547 if ($_POST['language'] == $this->getLanguage()) {
548 $this->messages->add('w', _('still using the "' . $this->getLanguage() . '" language!'));
549 Tools::redirect('?view=config');
550 }
551
552 $languages = $this->getInstalledLanguages();
553 $actualLanguage = false;
554
555 foreach ($languages as $language) {
556 if ($language['name'] == $_POST['language']) {
557 $actualLanguage = true;
558 break;
559 }
560 }
561
562 if (! $actualLanguage) {
563 $this->messages->add('e', _('that language does not seem to be installed'));
564 Tools::redirect('?view=config');
565 }
566
567 $this->store->updateUserConfig($this->user->getId(), 'language', $_POST['language']);
568 $this->messages->add('s', _('you have changed your language preferences'));
569
570 $currentConfig = $_SESSION['poche_user']->config;
571 $currentConfig['language'] = $_POST['language'];
572
573 $_SESSION['poche_user']->setConfig($currentConfig);
574
575 Tools::redirect('?view=config');
576 }
577
578 /**
579 * get credentials from differents sources
580 * it redirects the user to the $referer link
581 * @return array
582 */
583 private function credentials() {
584 if(isset($_SERVER['PHP_AUTH_USER'])) {
585 return array($_SERVER['PHP_AUTH_USER'],'php_auth');
586 }
587 if(!empty($_POST['login']) && !empty($_POST['password'])) {
588 return array($_POST['login'],$_POST['password']);
589 }
590 return array(false,false);
591 }
592
495 /** 593 /**
496 * checks if login & password are correct and save the user in session. 594 * checks if login & password are correct and save the user in session.
497 * it redirects the user to the $referer link 595 * it redirects the user to the $referer link
@@ -501,11 +599,17 @@ class Poche
501 */ 599 */
502 public function login($referer) 600 public function login($referer)
503 { 601 {
504 if (!empty($_POST['login']) && !empty($_POST['password'])) { 602 list($login,$password)=$this->credentials();
505 $user = $this->store->login($_POST['login'], Tools::encodeString($_POST['password'] . $_POST['login'])); 603 if($login === false || $password === false) {
604 $this->messages->add('e', _('login failed: you have to fill all fields'));
605 Tools::logm('login failed');
606 Tools::redirect();
607 }
608 if (!empty($login) && !empty($password)) {
609 $user = $this->store->login($login, Tools::encodeString($password . $login));
506 if ($user != array()) { 610 if ($user != array()) {
507 # Save login into Session 611 # Save login into Session
508 Session::login($user['username'], $user['password'], $_POST['login'], Tools::encodeString($_POST['password'] . $_POST['login']), array('poche_user' => new User($user))); 612 Session::login($user['username'], $user['password'], $login, Tools::encodeString($password . $login), array('poche_user' => new User($user)));
509 $this->messages->add('s', _('welcome to your poche')); 613 $this->messages->add('s', _('welcome to your poche'));
510 Tools::logm('login successful'); 614 Tools::logm('login successful');
511 Tools::redirect($referer); 615 Tools::redirect($referer);
@@ -513,10 +617,6 @@ class Poche
513 $this->messages->add('e', _('login failed: bad login or password')); 617 $this->messages->add('e', _('login failed: bad login or password'));
514 Tools::logm('login failed'); 618 Tools::logm('login failed');
515 Tools::redirect(); 619 Tools::redirect();
516 } else {
517 $this->messages->add('e', _('login failed: you have to fill all fields'));
518 Tools::logm('login failed');
519 Tools::redirect();
520 } 620 }
521 } 621 }
522 622
@@ -733,4 +833,4 @@ class Poche
733 } 833 }
734 return $version; 834 return $version;
735 } 835 }
736} \ No newline at end of file 836}