aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--README.md33
-rw-r--r--inc/poche/Poche.class.php115
-rw-r--r--inc/poche/Tools.class.php5
-rw-r--r--index.php34
-rw-r--r--tpl/_footer.twig2
-rw-r--r--tpl/config.twig6
-rw-r--r--tpl/export.twig2
-rw-r--r--tpl/js/poche.js2
-rw-r--r--tpl/login.twig4
9 files changed, 107 insertions, 96 deletions
diff --git a/README.md b/README.md
index b44e7d36..09f48b17 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
1# poche 1# poche
2Abandon Pocket, Instapaper and other Readability service : adopt poche. It is the same, but it is open source. 2Abandon Pocket, Instapaper and other Readability service : adopt poche. It is the same, but it is open source. Moreover, you can migrate from Pocket & Readability.
3 3
4![poche](http://inthepoche.com/img/logo.png) 4![poche](http://inthepoche.com/img/logo.png)
5 5
@@ -11,23 +11,23 @@ To get news from poche, [follow us on twitter](http://twitter.com/getpoche) or [
11 11
12[![flattr](http://api.flattr.com/button/flattr-badge-large.png)](http://flattr.com/thing/1265480/poche-a-read-it-later-open-source-system) 12[![flattr](http://api.flattr.com/button/flattr-badge-large.png)](http://flattr.com/thing/1265480/poche-a-read-it-later-open-source-system)
13 13
14## Usage
15You can easily add a "poched" page with the bookmarklet.
16
17poche save the entire content of a poched links : text and pictures are stored on your server.
18
19You can :
20* read a page in a comfortable reading view
21* archive a link
22* put a link in favorite
23* delete a link
24
25## Requirements & installation 14## Requirements & installation
26You have to install [sqlite for php](http://www.php.net/manual/en/book.sqlite.php) on your server. 15You have to install [sqlite for php](http://www.php.net/manual/en/book.sqlite.php) on your server.
27 16
17[PHP cURL](http://www.php.net/manual/en/book.curl.php) & [tidy_parse_string](http://www.php.net/manual/en/tidy.parsestring.php) are recommended.
18
28Get the [latest version](https://github.com/inthepoche/poche) of poche on github. Unzip it and upload it on your server. poche must have write access on assets, cache and db directories. 19Get the [latest version](https://github.com/inthepoche/poche) of poche on github. Unzip it and upload it on your server. poche must have write access on assets, cache and db directories.
29 20
30That's all, **poche works** ! 21Install composer in your project :
22```bash
23curl -s http://getcomposer.org/installer | php
24```
25Install via composer :
26```bash
27php composer.phar install
28```
29
30That's all, you can use poche !
31 31
32## Security 32## Security
33You **have** to protect your db/poche.sqlite file. Modify the virtual host of your website to add this condition : 33You **have** to protect your db/poche.sqlite file. Modify the virtual host of your website to add this condition :
@@ -46,12 +46,11 @@ location ~ /(db) {
46} 46}
47``` 47```
48 48
49## Import from Pocket 49## Usage
50 50See the documentation on our website : [inthepoche.com](http://inthepoche.com).
51If you want to import your Pocket datas, [export them here](https://getpocket.com/export). Put the HTML file in your poche directory, execute import.php file locally by following instructions. Be careful, the script can take a very long time.
52 51
53## License 52## License
54Copyright © 2010-2013 Nicolas Lœuillet <nicolas@loeuillet.org> 53Copyright © 2010-2013 Nicolas Lœuillet <nicolas@loeuillet.org>
55This work is free. You can redistribute it and/or modify it under the 54This work is free. You can redistribute it and/or modify it under the
56terms of the Do What The Fuck You Want To Public License, Version 2, 55terms of the Do What The Fuck You Want To Public License, Version 2,
57as published by Sam Hocevar. See the COPYING file for more details. 56as published by Sam Hocevar. See the COPYING file for more details. \ No newline at end of file
diff --git a/inc/poche/Poche.class.php b/inc/poche/Poche.class.php
index 9e407d41..5c3eda80 100644
--- a/inc/poche/Poche.class.php
+++ b/inc/poche/Poche.class.php
@@ -118,8 +118,6 @@ class Poche
118 $this->store->archiveById($id); 118 $this->store->archiveById($id);
119 Tools::logm('archive link #' . $id); 119 Tools::logm('archive link #' . $id);
120 break; 120 break;
121 case 'import':
122 break;
123 default: 121 default:
124 break; 122 break;
125 } 123 }
@@ -131,18 +129,6 @@ class Poche
131 129
132 switch ($view) 130 switch ($view)
133 { 131 {
134 case 'install':
135 Tools::logm('install mode');
136 break;
137 case 'import';
138 Tools::logm('import mode');
139 break;
140 case 'export':
141 $entries = $this->store->retrieveAll();
142 // $tpl->assign('export', Tools::renderJson($entries));
143 // $tpl->draw('export');
144 Tools::logm('export view');
145 break;
146 case 'config': 132 case 'config':
147 Tools::logm('config view'); 133 Tools::logm('config view');
148 break; 134 break;
@@ -224,59 +210,80 @@ class Poche
224 Tools::redirect(); 210 Tools::redirect();
225 } 211 }
226 212
227 public function import($from) 213 private function importFromInstapaper()
228 { 214 {
229 if ($from == 'pocket') { 215 Tools::logm('import from instapaper completed');
230 $html = new simple_html_dom(); 216 Tools::redirect();
231 $html->load_file('./ril_export.html'); 217 }
232 218
233 $read = 0; 219 private function importFromPocket()
234 $errors = array(); 220 {
235 foreach($html->find('ul') as $ul) 221 $html = new simple_html_dom();
222 $html->load_file('./ril_export.html');
223
224 $read = 0;
225 $errors = array();
226 foreach($html->find('ul') as $ul)
227 {
228 foreach($ul->find('li') as $li)
236 { 229 {
237 foreach($ul->find('li') as $li) 230 $a = $li->find('a');
238 { 231 $url = new Url(base64_encode($a[0]->href));
239 $a = $li->find('a'); 232 $this->action('add', $url);
240 $url = new Url($a[0]->href); 233 if ($read == '1') {
241 $this->action('add', $url); 234 $last_id = $this->store->getLastId();
242 if ($read == '1') { 235 $this->store->archiveById($last_id);
243 $last_id = $this->store->lastInsertId();
244 $sql_update = "UPDATE entries SET is_read=~is_read WHERE id=?";
245 $params_update = array($last_id);
246 $query_update = $this->store->prepare($sql_update);
247 $query_update->execute($params_update);
248 }
249 } 236 }
250 # Pocket génère un fichier HTML avec deux <ul>
251 # Le premier concerne les éléments non lus
252 # Le second concerne les éléments archivés
253 $read = 1;
254 } 237 }
255 logm('import from pocket completed'); 238 # Pocket génère un fichier HTML avec deux <ul>
256 Tools::redirect(); 239 # Le premier concerne les éléments non lus
240 # Le second concerne les éléments archivés
241 $read = 1;
257 } 242 }
258 else if ($from == 'readability') { 243 Tools::logm('import from pocket completed');
259 # TODO finaliser tout ça ici 244 Tools::redirect();
260 $str_data = file_get_contents("readability"); 245 }
261 $data = json_decode($str_data,true);
262 246
263 foreach ($data as $key => $value) { 247 private function importFromReadability()
264 $url = ''; 248 {
265 foreach ($value as $key2 => $value2) { 249 # TODO finaliser tout ça ici
266 if ($key2 == 'article__url') { 250 # noms des variables + gestion des articles lus
267 $url = new Url($value2); 251 $str_data = file_get_contents("./readability");
268 } 252 $data = json_decode($str_data,true);
253
254 foreach ($data as $key => $value) {
255 $url = '';
256 foreach ($value as $key2 => $value2) {
257 if ($key2 == 'article__url') {
258 $url = new Url(base64_encode($value2));
269 } 259 }
270 if ($url != '')
271 action_to_do('add', $url);
272 } 260 }
273 logm('import from Readability completed'); 261 if ($url->isCorrect())
274 Tools::redirect(); 262 $this->action('add', $url);
275 } 263 }
264 Tools::logm('import from Readability completed');
265 Tools::redirect();
276 } 266 }
277 267
278 public function export() 268 public function import($from)
279 { 269 {
270 if ($from == 'pocket') {
271 $this->importFromPocket();
272 }
273 else if ($from == 'readability') {
274 $this->importFromReadability();
275 }
276 else if ($from == 'instapaper') {
277 $this->importFromInstapaper();
278 }
279 }
280 280
281 public function export()
282 {
283 $entries = $this->store->retrieveAll();
284 echo $this->tpl->render('export.twig', array(
285 'export' => Tools::renderJson($entries),
286 ));
287 Tools::logm('export view');
281 } 288 }
282} \ No newline at end of file 289} \ No newline at end of file
diff --git a/inc/poche/Tools.class.php b/inc/poche/Tools.class.php
index c277035f..1ff4ba55 100644
--- a/inc/poche/Tools.class.php
+++ b/inc/poche/Tools.class.php
@@ -205,4 +205,9 @@ class Tools
205 { 205 {
206 return sha1($string . SALT); 206 return sha1($string . SALT);
207 } 207 }
208
209 public static function checkVar($var)
210 {
211 return ((isset ($_REQUEST["$var"])) ? htmlentities($_REQUEST["$var"]) : '');
212 }
208} \ No newline at end of file 213} \ No newline at end of file
diff --git a/index.php b/index.php
index 1554c0a6..381b8ccc 100644
--- a/index.php
+++ b/index.php
@@ -10,16 +10,21 @@
10 10
11include dirname(__FILE__).'/inc/poche/config.inc.php'; 11include dirname(__FILE__).'/inc/poche/config.inc.php';
12 12
13# XSRF protection with token 13#XSRF protection with token
14// if (!empty($_POST)) { 14if (!empty($_POST)) {
15// if (!Session::isToken($_POST['token'])) { 15 if (!Session::isToken($_POST['token'])) {
16// die(_('Wrong token')); 16 die(_('Wrong token'));
17// // TODO remettre le test 17 // TODO remettre le test
18// } 18 }
19// unset($_SESSION['tokens']); 19 unset($_SESSION['tokens']);
20// } 20}
21 21
22$referer = empty($_SERVER['HTTP_REFERER']) ? '' : $_SERVER['HTTP_REFERER']; 22$referer = empty($_SERVER['HTTP_REFERER']) ? '' : $_SERVER['HTTP_REFERER'];
23$view = Tools::checkVar('view');
24$action = Tools::checkVar('action');
25$id = Tools::checkVar('id');
26$_SESSION['sort'] = Tools::checkVar('sort');
27$url = new Url((isset ($_GET['url'])) ? $_GET['url'] : '');
23 28
24if (isset($_GET['login'])) { 29if (isset($_GET['login'])) {
25 # hello you 30 # hello you
@@ -36,15 +41,9 @@ elseif (isset($_GET['config'])) {
36elseif (isset($_GET['import'])) { 41elseif (isset($_GET['import'])) {
37 $poche->import($_GET['from']); 42 $poche->import($_GET['from']);
38} 43}
39 44elseif (isset($_GET['export'])) {
40# Aaaaaaand action ! 45 $poche->export();
41$view = (isset ($_REQUEST['view'])) ? htmlentities($_REQUEST['view']) : 'home'; 46}
42$full_head = (isset ($_REQUEST['full_head'])) ? htmlentities($_REQUEST['full_head']) : 'yes';
43$action = (isset ($_REQUEST['action'])) ? htmlentities($_REQUEST['action']) : '';
44$_SESSION['sort'] = (isset ($_REQUEST['sort'])) ? htmlentities($_REQUEST['sort']) : 'id';
45$id = (isset ($_REQUEST['id'])) ? htmlspecialchars($_REQUEST['id']) : '';
46
47$url = new Url((isset ($_GET['url'])) ? $_GET['url'] : '');
48 47
49$tpl_vars = array( 48$tpl_vars = array(
50 'referer' => $referer, 49 'referer' => $referer,
@@ -64,4 +63,5 @@ else {
64 $tpl_file = 'login.twig'; 63 $tpl_file = 'login.twig';
65} 64}
66 65
66# Aaaaaaand action !
67echo $poche->tpl->render($tpl_file, $tpl_vars); \ No newline at end of file 67echo $poche->tpl->render($tpl_file, $tpl_vars); \ No newline at end of file
diff --git a/tpl/_footer.twig b/tpl/_footer.twig
index 59b58fa5..b1d7b8d4 100644
--- a/tpl/_footer.twig
+++ b/tpl/_footer.twig
@@ -1,3 +1,3 @@
1 <footer class="mr2 mt3 smaller"> 1 <footer class="mr2 mt3 smaller">
2 <p>powered by <a href="http://inthepoche.com">poche</a></p> 2 <p>{% trans "powered by" %} <a href="http://inthepoche.com">poche</a></p>
3 </footer> \ No newline at end of file 3 </footer> \ No newline at end of file
diff --git a/tpl/config.twig b/tpl/config.twig
index 9a51e566..c18806bc 100644
--- a/tpl/config.twig
+++ b/tpl/config.twig
@@ -40,11 +40,11 @@
40 <p>{% trans "Please execute the import script locally, it can take a very long time." %}</p> 40 <p>{% trans "Please execute the import script locally, it can take a very long time." %}</p>
41 <p>{% trans "More infos in the official doc:" %} <a href="http://inthepoche.com/?pages/Documentation">inthepoche.com</a></p> 41 <p>{% trans "More infos in the official doc:" %} <a href="http://inthepoche.com/?pages/Documentation">inthepoche.com</a></p>
42 <p><ul> 42 <p><ul>
43 <li><a href="/?import&from=pocket">{% trans "import from Pocket" %}</a> (you must have a "ril_export.html" file on your server)</li> 43 <li><a href="./?import&from=pocket">{% trans "import from Pocket" %}</a> (you must have a "ril_export.html" file on your server)</li>
44 <li><a href="/?import&from=readability">{% trans "import from Readability" %}</a> (you must have a "readability" file on your server)</li> 44 <li><a href="./?import&from=readability">{% trans "import from Readability" %}</a> (you must have a "readability" file on your server)</li>
45 </ul></p> 45 </ul></p>
46 46
47 <h2>{% trans "Export your poche datas" %}</h2> 47 <h2>{% trans "Export your poche datas" %}</h2>
48 <p><a href="?view=export" target="_blank">{% trans "Click here" %}</a> {% trans "to export your poche datas." %}</p> 48 <p><a href="./?export" target="_blank">{% trans "Click here" %}</a> {% trans "to export your poche datas." %}</p>
49 </div> 49 </div>
50{% endblock %} \ No newline at end of file 50{% endblock %} \ No newline at end of file
diff --git a/tpl/export.twig b/tpl/export.twig
index d22d05fc..4adb9540 100644
--- a/tpl/export.twig
+++ b/tpl/export.twig
@@ -1 +1 @@
export {$export} \ No newline at end of file {{ export }} \ No newline at end of file
diff --git a/tpl/js/poche.js b/tpl/js/poche.js
index 97d9911d..b4eac11c 100644
--- a/tpl/js/poche.js
+++ b/tpl/js/poche.js
@@ -23,7 +23,7 @@ function toggle_archive(element, id, view_article) {
23} 23}
24 24
25function sort_links(view, sort) { 25function sort_links(view, sort) {
26 $.get('index.php', { view: view, sort: sort, full_head: 'no' }, function(data) { 26 $.get('index.php', { view: view, sort: sort }, function(data) {
27 $('#content').html(data); 27 $('#content').html(data);
28 }); 28 });
29} 29}
diff --git a/tpl/login.twig b/tpl/login.twig
index 70c2190c..c3028795 100644
--- a/tpl/login.twig
+++ b/tpl/login.twig
@@ -16,9 +16,9 @@
16 <input class="col" type="password" id="password" name="password" placeholder="Password" tabindex="2" {% if demo == 1 %}value="poche"{% endif %} /> 16 <input class="col" type="password" id="password" name="password" placeholder="Password" tabindex="2" {% if demo == 1 %}value="poche"{% endif %} />
17 </div> 17 </div>
18 <div class="row"> 18 <div class="row">
19 <label class="col w150p">{% trans "Stay signed in" %}</label> 19 <label class="col w150p" for="longlastingsession">{% trans "Stay signed in" %}</label>
20 <div class="col"> 20 <div class="col">
21 <input type="checkbox" name="longlastingsession" tabindex="3"> 21 <input type="checkbox" id="longlastingsession" name="longlastingsession" tabindex="3">
22 <small class="inbl">{% trans "(Do not check on public computers)" %}</small> 22 <small class="inbl">{% trans "(Do not check on public computers)" %}</small>
23 </div> 23 </div>
24 </div> 24 </div>