install.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. <?php
  2. /*
  3. @nom: install
  4. @auteur: Idleman (idleman@idleman.fr)
  5. @description: Page d'installation du script (a supprimer après installation)
  6. */
  7. if (file_exists('constant.php')) {
  8. die('Leed est déjà configuré. Supprimez ou renommez le fichier de configuration.');
  9. }
  10. session_start();
  11. require_once('Functions.class.php');
  12. $_ = array_merge($_GET, $_POST);
  13. $whiteList = array(
  14. /* La liste blanche recense les variables ne devant pas être passées via
  15. la sécurisation, mais simplement échappées pour Php. */
  16. 'mysqlHost', 'mysqlLogin', 'mysqlMdp', 'mysqlBase', 'mysqlPrefix',
  17. );
  18. foreach($_ as $key=>&$val){
  19. $val = in_array($key, $whiteList)
  20. ? str_replace("'", "\'", $val)
  21. : Functions::secure($val);
  22. }
  23. ?>
  24. <!doctype html>
  25. <!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]-->
  26. <!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]-->
  27. <!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]-->
  28. <!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
  29. <head>
  30. <meta charset="utf-8">
  31. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  32. <title></title>
  33. <meta name="description" content="">
  34. <meta name="author" content="">
  35. <meta name="viewport" content="width=device-width">
  36. <link rel="stylesheet" href="templates/marigolds/css/style.css">
  37. <script src="templates/marigolds/js/libs/jqueryAndModernizr.min.js"></script>
  38. </head>
  39. <body>
  40. <div class="global-wrapper">
  41. <div id="header-container">
  42. <header class="wrapper clearfix">
  43. <h1 class="logo" id="title"><a href="./index.php">L<i>eed</i></a></h1>
  44. <nav>
  45. </nav>
  46. </header>
  47. </div>
  48. <div id="main-container">
  49. <div id="main" class="wrapper clearfix">
  50. <?php
  51. //Récuperation et sécurisation de toutes les variables POST et GET
  52. if(isset($_['installButton'])){
  53. if (!Functions::testDb(
  54. $_['mysqlHost'], $_['mysqlLogin'], $_['mysqlMdp'], $_['mysqlBase']
  55. )) {
  56. ///@TODO: faire un retour plus intelligible + tests dans le common.php
  57. echo "<p>Connexion à la base de donnnées impossible :</p>";
  58. echo "<ul>\n";
  59. echo "<li>host: {$_['mysqlHost']}\n";
  60. echo "<li>login: {$_['mysqlLogin']}\n";
  61. echo "<li>password: {$_['mysqlMdp']}\n";
  62. echo "<li>database: {$_['mysqlBase']}\n";
  63. echo "</ul><p><a href=''>Relancer l'installation</a></p>\n";
  64. die();
  65. }
  66. $constant = "<?php
  67. define('VERSION_NUMBER','1.5');
  68. define('VERSION_NAME','Beta');
  69. //Host de Mysql, le plus souvent localhost ou 127.0.0.1
  70. define('MYSQL_HOST','".$_['mysqlHost']."');
  71. //Identifiant MySQL
  72. define('MYSQL_LOGIN','".$_['mysqlLogin']."');
  73. //mot de passe MySQL
  74. define('MYSQL_MDP','".$_['mysqlMdp']."');
  75. //Nom de la base MySQL ou se trouvera leed
  76. define('MYSQL_BDD','".$_['mysqlBase']."');
  77. //Prefix des noms des tables leed pour les bases de données uniques
  78. define('MYSQL_PREFIX','".$_['mysqlPrefix']."');
  79. //Theme graphique
  80. define('DEFAULT_THEME','marigolds');
  81. //Nombre de pages affichées dans la barre de pagination
  82. define('PAGINATION_SCALE',5);
  83. //Nombre de flux mis à jour lors de la synchronisation graduée
  84. define('SYNC_GRAD_COUNT',10);
  85. ?>";
  86. file_put_contents('constant.php', $constant);
  87. require_once('constant.php');
  88. require_once('MysqlEntity.class.php');
  89. require_once('Feed.class.php');
  90. require_once('Event.class.php');
  91. require_once('User.class.php');
  92. require_once('Folder.class.php');
  93. require_once('Configuration.class.php');
  94. $myUser = (isset($_SESSION['currentUser'])?unserialize($_SESSION['currentUser']):false);
  95. $feedManager = new Feed();
  96. $eventManager = new Event();
  97. $userManager = new User();
  98. $folderManager = new Folder();
  99. $configurationManager = new Configuration();
  100. //Création de la base et des tables
  101. $feedManager->create();
  102. $eventManager->create();
  103. $userManager->create();
  104. $folderManager->create();
  105. $configurationManager->create();
  106. //Ajout de l'administrateur
  107. $admin = new User();
  108. $admin->setLogin($_['login']);
  109. $admin->setPassword($_['password']);
  110. $admin->save();
  111. //Identification de l'utilisateur en session
  112. $_SESSION['currentUser'] = serialize($admin);
  113. //Ajout des préférences et reglages
  114. $root = (substr($_['root'], strlen($_['root'])-1)=='/'?$_['root']:$_['root'].'/');
  115. $synchronisationCode = substr(sha1(rand(0,30).time().rand(0,30)),0,10);
  116. $configurationManager->add('root',$root);
  117. //$configurationManager->put('view',$_['view']);
  118. $configurationManager->add('articleView',$_['articleView']);
  119. $configurationManager->add('articleDisplayContent',$_['articleDisplayContent']);
  120. $configurationManager->add('articleDisplayAnonymous',$_['articleDisplayAnonymous']);
  121. $configurationManager->add('articlePerPages',$_['articlePerPages']);
  122. $configurationManager->add('articleDisplayLink',$_['articleDisplayLink']);
  123. $configurationManager->add('articleDisplayDate',$_['articleDisplayDate']);
  124. $configurationManager->add('articleDisplayAuthor',$_['articleDisplayAuthor']);
  125. $configurationManager->add('articleDisplaySort',$_['articleDisplaySort']);
  126. $configurationManager->add('synchronisationType',$_['synchronisationType']);
  127. $configurationManager->add('feedMaxEvents',$_['feedMaxEvents']);
  128. $configurationManager->add('synchronisationCode',$synchronisationCode);
  129. //Création du dossier de base
  130. $folder = $folderManager->load(array('id'=>1));
  131. $folder = (!$folder?new Folder():$folder);
  132. $folder->setName($_['category']);
  133. $folder->setParent(-1);
  134. $folder->setIsopen(1);
  135. $folder->save();
  136. ?>
  137. <article style="width:100%;">
  138. <header>
  139. <h1>Installation de Leed terminée</h1>
  140. <p>L'installation de Leed est terminée !!</p>
  141. <?php if ($_['synchronisationType']=='auto'){ ?>
  142. <p>N'oubliez pas de mettre en place le CRON adapté pour que vos flux se mettent à jour, exemple :</p>
  143. <code>sudo crontab -e</code>
  144. <p>Dans le fichier qui s'ouvre ajoutez la ligne :</p>
  145. <code>0 * * * * wget --no-check-certificate -q -O <?php echo (str_replace(array(basename(__FILE__),'\\'),array('logs/cron.log','/'),__FILE__)); ?> "<?php echo $root ?>action.php?action=synchronize&code=<?php echo $synchronisationCode; ?>" #Commande de mise a jour de leed</code>
  146. <p>Quittez et sauvegardez le fichier.</p>
  147. <p>Cet exemple mettra à jour vos flux toutes les heures et ajoutera le rapport de mise a jour sous le nom "cron.log" dans votre dossier leed</p>
  148. <?php }else if ($_['synchronisationType']=='graduate'){ ?>
  149. <p>N'oubliez pas de mettre en place le CRON adapté pour que vos flux se mettent à jour, exemple :</p>
  150. <code>sudo crontab -e</code>
  151. <p>Dans le fichier qui s'ouvre ajoutez la ligne :</p>
  152. <code>0,5,10,15,20,25,30,35,40,45,50,55 * * * * wget --no-check-certificate -q -O <?php echo (str_replace(array(basename(__FILE__),'\\'),array('logs/cron.log','/'),__FILE__)); ?> "<?php echo $root ?>action.php?action=synchronize&code=<?php echo $synchronisationCode; ?>" #Commande de mise a jour de leed</code>
  153. <p>Quittez et sauvegardez le fichier.</p>
  154. <p>Cet exemple mettra à jour vos flux toutes les 5 minutes(conseillé pour une synchronisation graduée) et ajoutera le rapport de mise a jour sous le nom "cron.log" dans votre dossier leed</p>
  155. <?php } ?>
  156. <p><h3>Important ! </h3>N'oubliez pas de supprimer la <b>page install.php</b> par mesure de sécurité</p>
  157. <p>Cliquez <a style="color:#F16529;" href="index.php">ici</a> pour acceder au script</p>
  158. <?php
  159. }else{
  160. ?>
  161. <div id="menuBar">
  162. <aside>
  163. <h3 class="left">Verifications</h3>
  164. <ul class="clear" style="margin:0">
  165. <?php
  166. if(!is_writable('./')){
  167. $test['Erreur'][]='Écriture impossible dans le répertoire Leed, veuillez ajouter les permissions en écriture sur tout le dossier (sudo chmod 777 -R '.str_replace(basename(__FILE__),'',__FILE__).', pensez à blinder les permissions par la suite)';
  168. }else{
  169. $test['Succès'][]='Permissions sur le dossier courant : OK';
  170. }
  171. if (!@function_exists('file_get_contents')){
  172. $test['Erreur'][] = 'La fonction requise "file_get_contents" est inaccessible sur votre serveur, verifiez votre version de PHP.';
  173. }else{
  174. $test['Succès'][] = 'Fonction requise "file_get_contents" : OK';
  175. }
  176. if (!@function_exists('file_put_contents')){
  177. $test['Erreur'][] = 'La fonction requise "file_put_contents" est inaccessible sur votre serveur, verifiez votre version de PHP.';
  178. }else{
  179. $test['Succès'][] = 'Fonction requise "file_put_contents" : OK';
  180. }
  181. if (@version_compare(PHP_VERSION, '5.1.0') <= 0){
  182. $test['Erreur'][] = 'Votre version de PHP ('.PHP_VERSION.') est trop ancienne, il est possible que certaines fonctionalitees du script comportent des disfonctionnements.';
  183. }else{
  184. $test['Succès'][] = 'Compabilité de version PHP ('.PHP_VERSION.') : OK';
  185. }
  186. // if (!@extension_loaded('sqlite3')){
  187. // $test['Erreur'][] = 'L\'Extension Sqlite3 n\'est pas activée sur votre serveur, merci de bien vouloir l\'installer';
  188. // }else{
  189. // $test['Succès'][] = 'Extension Sqlite3 : OK';
  190. // }
  191. if(ini_get('safe_mode') && ini_get('max_execution_time')!=0){
  192. $test['Erreur'][] = 'Le script ne peux pas gerer le timeout tout seul car votre safe mode est activé,<br/> dans votre fichier de configuration PHP, mettez la variable max_execution_time à 0 ou désactivez le safemode.';
  193. }else{
  194. $test['Succès'][] = 'Gestion du timeout : OK';
  195. }
  196. foreach($test as $type=>$messages){
  197. ?>
  198. <li style="font-size:10px;color:#ffffff;background-color:<?php echo ($type=='Erreur'?'#F16529':'#008000'); ?>"><?php echo $type; ?> :<ul><?php foreach($messages as $message){?><li style="border:1px solid #212121"><?php echo $message; ?></li><?php } ?></ul></li><li>&nbsp;</li>
  199. <?php } ?>
  200. </ul>
  201. </aside>
  202. </div>
  203. <?php if(!isset($test['Erreur'])){ ?>
  204. <form action="install.php" method="POST">
  205. <article>
  206. <header>
  207. <h1>Installation de Leed</h1>
  208. <p>Merci de prendre quelques instants pour vérifier les infos ci dessous :</p>
  209. </header>
  210. <section>
  211. <h2>Général</h2>
  212. <p>Racine du projet : <input type="text" name="root" value="<?php echo str_replace(basename(__FILE__),'','http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); ?>"></p>
  213. <h3 class="articleDetails">Laissez bien un "/" en fin de chaine ex : http://monsite.com/leed/</h3>
  214. </section>
  215. <section>
  216. <h2>Base de données</h2>
  217. <p>Hote MySQL : <input type="text" name="mysqlHost" value=""></p>
  218. <h3 class="articleDetails">Géneralement localhost</h3>
  219. <p>Identifiant MySQL : <input type="text" name="mysqlLogin" value=""></p>
  220. <p>Mot de passe MySQL : <input type="text" autocomplete="off" name="mysqlMdp" value=""></p>
  221. <p>Nom de base MySQL : <input type="text" name="mysqlBase" value=""></p>
  222. <h3 class="articleDetails">Nom de la base de données vouée à Leed (à créer avant d'installer leed)</h3>
  223. <p>Prefixe des tables : <input type="text" name="mysqlPrefix" value="leed_"></p>
  224. </section>
  225. <section>
  226. <h2>Administrateur</h2>
  227. <p>Identifiant de l'administrateur: <input type="text" name="login" placeholder="Identifiant"></p>
  228. <p>Mot de passe de l'administrateur: <input type="text" autocomplete="off" name="password" placeholder="Mot de passe"></p>
  229. </section>
  230. <section>
  231. <h2>Synchronisation</h2>
  232. <p><input type="radio" checked="checked" value="auto" name="synchronisationType"> <strong>Automatique (complet) :</strong> Le script mettra à jour automatiquement tous vos flux en une seule fois, ceci permet la mise à jour en une fois de tous vos flux mais peux faire ramer votre serveur, les appels cron ne doivent pas être trop rapprochés.</p>
  233. <p><input type="radio" value="graduate" name="synchronisationType"> <strong>Automatique (gradué) : </strong>Le script mettra à jour automatiquement les 10 flux les plus vieux en terme de mise à jour, ceci permet d'alléger la charge serveur et d'éviter les timeouts intempestifs mais nécessite un appel de cron plus fréquent afin de mettre à jour le plus de flux possible.</p>
  234. <p><input type="radio" value="manual" name="synchronisationType"> <strong>Manuel (complet) : </strong>Le script ne fait aucune mise à jour automatique, vous devez faire vous même les mises à jour depuis l'espace administration.</p>
  235. </section>
  236. <section>
  237. <h2>Préferences</h2>
  238. <p>Autoriser la lecture anonyme: <input type="radio" checked="checked" value="1" name="articleDisplayAnonymous">Oui <input type="radio" value="0" name="articleDisplayAnonymous">Non</p>
  239. <h3 class="articleDetails">Nb: si vous choisissez cette option, les utilisateurs non authentifiés pourront consulter vos flux (sans pouvoir les marquer comme lu/non lu).</h3>
  240. <p>Nombre d'articles par pages: <input type="text" value="5" name="articlePerPages"></p>
  241. <p>Affichage des articles les plus récents en premier : <input type="radio" checked="checked" value="1" name="articleDisplaySort">Oui <input type="radio" value="0" name="articleDisplaySort">Non</p>
  242. <p>Affichage du lien direct de l'article: <input type="radio" checked="checked" value="1" name="articleDisplayLink">Oui <input type="radio" value="0" name="articleDisplayLink">Non</p>
  243. <p>Affichage de la date de l'article: <input type="radio" checked="checked" value="1" name="articleDisplayDate">Oui <input type="radio" value="0" name="articleDisplayDate">Non</p>
  244. <p>Affichage de l'auteur de l'article: <input type="radio" checked="checked" value="1" name="articleDisplayAuthor">Oui <input type="radio" value="0" name="articleDisplayAuthor">Non</p>
  245. <p>Affichage du contenu de l'article: <input type="radio" checked="checked" value="1" name="articleDisplayContent">Oui <input type="radio" value="0" name="articleDisplayContent">Non</p>
  246. <p>Type d'affichage du contenu: <input type="radio" checked="checked" value="partial" name="articleView">Partiel <input type="radio" value="complete" name="articleView">Complet</p>
  247. <h3 class="articleDetails">Nb: si vous choissisez un affichage partiel des articles, un click sur ces derniers menera à l'article sur le blog de l'auteur.</h3>
  248. <p>Catégorie par defaut: <input type="text" value="Géneral" name="category"></p>
  249. <p>Conserver les <input type="text" value="300" name="feedMaxEvents"> derniers événement d'un flux</p>
  250. <h3 class="articleDetails">Nb: Plus il y aura d'événements à conserver, plus votre base de données sera importante. Nous vous conseillons de garder les 50 derniers événements au maximum pour conserver une performance correcte.<br>Notez que vos événements marqués comme favoris ne seront jamais supprimés.</h3>
  251. </section>
  252. <button name="installButton">Lancer l'installation</button>
  253. </article>
  254. </form>
  255. <?php }else{ ?>
  256. <p>Il vous manque des prérequis pour continuer l'installation, référez vous au panneau de droite.</p>
  257. <?php }?>
  258. <?php } ?>
  259. </div> <!-- #main -->
  260. </div> <!-- #main-container -->
  261. <div id="footer-container">
  262. <footer class="wrapper">
  263. <p>Leed "Light Feed" by <a target="_blank" href="http://blog.idleman.fr">Idleman</a></p>
  264. </footer>
  265. </div>
  266. </div>
  267. <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
  268. <script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.2.min.js"><\/script>')</script>
  269. <script src="templates/marigolds/js/script.js"></script>
  270. </body>
  271. </html>