aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--cron.php53
-rwxr-xr-xinc/poche/Poche.class.php316
2 files changed, 46 insertions, 323 deletions
diff --git a/cron.php b/cron.php
deleted file mode 100644
index 8fbf421a..00000000
--- a/cron.php
+++ /dev/null
@@ -1,53 +0,0 @@
1<?php
2error_reporting(E_ALL);
3include_once 'inc/poche/global.inc.php';
4include_once 'inc/poche/config.inc.php';
5
6if (php_sapi_name() === 'cli') {
7 $options_cli = getopt('', array(
8 'limit::',
9 'user-id::',
10 'token::',
11 ));
12}
13else {
14 $options_cli = $_GET;
15}
16
17$limit = ! empty($options_cli['limit']) && ctype_digit($options_cli['limit']) ? (int) $options_cli['limit'] : 10;
18$user_id = ! empty($options_cli['user-id']) && ctype_digit($options_cli['user-id']) ? (int) $options_cli['user-id'] : null;
19$token = ! empty($options_cli['token']) ? $options_cli['token'] : null;
20
21if (is_null($user_id)) {
22 die('You must give a user id');
23}
24
25if (is_null($token)) {
26 die('You must give a token');
27}
28
29$store = new Database();
30$config = $store->getConfigUser($user_id);
31
32if ($token != $config['token']) {
33 die(_('Uh, there is a problem with the cron.'));
34}
35
36$items = $store->retrieveUnfetchedEntries($user_id, $limit);
37
38foreach ($items as $item) {
39 $url = new Url(base64_encode($item['url']));
40 $content = Tools::getPageContent($url);
41
42 $title = ($content['rss']['channel']['item']['title'] != '') ? $content['rss']['channel']['item']['title'] : _('Untitled');
43 $body = $content['rss']['channel']['item']['description'];
44
45 // // clean content from prevent xss attack
46 $config = HTMLPurifier_Config::createDefault();
47 $purifier = new HTMLPurifier($config);
48 $title = $purifier->purify($title);
49 $body = $purifier->purify($body);
50
51
52 $store->updateContentAndTitle($item['id'], $title, $body, $user_id);
53} \ No newline at end of file
diff --git a/inc/poche/Poche.class.php b/inc/poche/Poche.class.php
index ee3b2ac2..a662f695 100755
--- a/inc/poche/Poche.class.php
+++ b/inc/poche/Poche.class.php
@@ -368,31 +368,23 @@ class Poche
368 switch ($action) 368 switch ($action)
369 { 369 {
370 case 'add': 370 case 'add':
371 if (!$import) { 371 $content = Tools::getPageContent($url);
372 $content = Tools::getPageContent($url); 372 $title = ($content['rss']['channel']['item']['title'] != '') ? $content['rss']['channel']['item']['title'] : _('Untitled');
373 $title = ($content['rss']['channel']['item']['title'] != '') ? $content['rss']['channel']['item']['title'] : _('Untitled'); 373 $body = $content['rss']['channel']['item']['description'];
374 $body = $content['rss']['channel']['item']['description']; 374
375 375 // clean content from prevent xss attack
376 // clean content from prevent xss attack 376 $config = HTMLPurifier_Config::createDefault();
377 $config = HTMLPurifier_Config::createDefault(); 377 $config->set('Cache.SerializerPath', CACHE);
378 $config->set('Cache.SerializerPath', CACHE); 378 $purifier = new HTMLPurifier($config);
379 $purifier = new HTMLPurifier($config); 379 $title = $purifier->purify($title);
380 $title = $purifier->purify($title); 380 $body = $purifier->purify($body);
381 $body = $purifier->purify($body);
382 }
383 else {
384 $title = '';
385 $body = '';
386 }
387 381
388 //search for possible duplicate 382 //search for possible duplicate
389 $duplicate = NULL; 383 $duplicate = NULL;
390 if (!$import) { 384 $duplicate = $this->store->retrieveOneByURL($url->getUrl(), $this->user->getId());
391 $duplicate = $this->store->retrieveOneByURL($url->getUrl(), $this->user->getId());
392 }
393 385
394 $last_id = $this->store->add($url->getUrl(), $title, $body, $this->user->getId()); 386 $last_id = $this->store->add($url->getUrl(), $title, $body, $this->user->getId());
395 if ( $last_id && !$import ) { 387 if ( $last_id ) {
396 Tools::logm('add link ' . $url->getUrl()); 388 Tools::logm('add link ' . $url->getUrl());
397 if (DOWNLOAD_PICTURES) { 389 if (DOWNLOAD_PICTURES) {
398 $content = filtre_picture($body, $url->getUrl(), $last_id); 390 $content = filtre_picture($body, $url->getUrl(), $last_id);
@@ -416,18 +408,14 @@ class Poche
416 $this->messages->add('s', _('the link has been added successfully')); 408 $this->messages->add('s', _('the link has been added successfully'));
417 } 409 }
418 else { 410 else {
419 if (!$import) { 411 $this->messages->add('e', _('error during insertion : the link wasn\'t added'));
420 $this->messages->add('e', _('error during insertion : the link wasn\'t added')); 412 Tools::logm('error during insertion : the link wasn\'t added ' . $url->getUrl());
421 Tools::logm('error during insertion : the link wasn\'t added ' . $url->getUrl());
422 }
423 } 413 }
424 414
425 if (!$import) { 415 if ($autoclose == TRUE) {
426 if ($autoclose == TRUE) { 416 Tools::redirect('?view=home');
427 Tools::redirect('?view=home'); 417 } else {
428 } else { 418 Tools::redirect('?view=home&closewin=true');
429 Tools::redirect('?view=home&closewin=true');
430 }
431 } 419 }
432 break; 420 break;
433 case 'delete': 421 case 'delete':
@@ -448,33 +436,21 @@ class Poche
448 case 'toggle_fav' : 436 case 'toggle_fav' :
449 $this->store->favoriteById($id, $this->user->getId()); 437 $this->store->favoriteById($id, $this->user->getId());
450 Tools::logm('mark as favorite link #' . $id); 438 Tools::logm('mark as favorite link #' . $id);
451 if (!$import) { 439 Tools::redirect();
452 Tools::redirect();
453 }
454 break; 440 break;
455 case 'toggle_archive' : 441 case 'toggle_archive' :
456 $this->store->archiveById($id, $this->user->getId()); 442 $this->store->archiveById($id, $this->user->getId());
457 Tools::logm('archive link #' . $id); 443 Tools::logm('archive link #' . $id);
458 if (!$import) { 444 Tools::redirect();
459 Tools::redirect();
460 }
461 break; 445 break;
462 case 'archive_all' : 446 case 'archive_all' :
463 $this->store->archiveAll($this->user->getId()); 447 $this->store->archiveAll($this->user->getId());
464 Tools::logm('archive all links'); 448 Tools::logm('archive all links');
465 if (!$import) { 449 Tools::redirect();
466 Tools::redirect();
467 }
468 break; 450 break;
469 case 'add_tag' : 451 case 'add_tag' :
470 if($import){ 452 $tags = explode(',', $_POST['value']);
471 $entry_id = $id; 453 $entry_id = $_POST['entry_id'];
472 $tags = explode(',', $tags);
473 }
474 else{
475 $tags = explode(',', $_POST['value']);
476 $entry_id = $_POST['entry_id'];
477 }
478 $entry = $this->store->retrieveOneById($entry_id, $this->user->getId()); 454 $entry = $this->store->retrieveOneById($entry_id, $this->user->getId());
479 if (!$entry) { 455 if (!$entry) {
480 $this->messages->add('e', _('Article not found!')); 456 $this->messages->add('e', _('Article not found!'));
@@ -509,9 +485,7 @@ class Poche
509 $this->store->setTagToEntry($tag_id, $entry_id); 485 $this->store->setTagToEntry($tag_id, $entry_id);
510 } 486 }
511 } 487 }
512 if(!$import) { 488 Tools::redirect();
513 Tools::redirect();
514 }
515 break; 489 break;
516 case 'remove_tag' : 490 case 'remove_tag' :
517 $tag_id = $_GET['tag_id']; 491 $tag_id = $_GET['tag_id'];
@@ -845,205 +819,18 @@ class Poche
845 } 819 }
846 820
847 /** 821 /**
848 * import from Instapaper. poche needs a ./instapaper-export.html file
849 * @todo add the return value
850 * @param string $targetFile the file used for importing
851 * @return boolean
852 */
853 private function importFromInstapaper($targetFile)
854 {
855 # TODO gestion des articles favs
856 $html = new simple_html_dom();
857 $html->load_file($targetFile);
858 Tools::logm('starting import from instapaper');
859
860 $read = 0;
861 $errors = array();
862 foreach($html->find('ol') as $ul)
863 {
864 foreach($ul->find('li') as $li)
865 {
866 $a = $li->find('a');
867 $url = new Url(base64_encode($a[0]->href));
868 $this->action('add', $url, 0, TRUE);
869 if ($read == '1') {
870 $sequence = '';
871 if (STORAGE == 'postgres') {
872 $sequence = 'entries_id_seq';
873 }
874 $last_id = $this->store->getLastId($sequence);
875 $this->action('toggle_archive', $url, $last_id, TRUE);
876 }
877 }
878
879 # the second <ol> is for read links
880 $read = 1;
881 }
882
883 $unlink = unlink($targetFile);
884 $this->messages->add('s', _('import from instapaper completed. You have to execute the cron to fetch content.'));
885 Tools::logm('import from instapaper completed');
886 Tools::redirect();
887 }
888
889 /**
890 * import from Pocket. poche needs a ./ril_export.html file
891 * @todo add the return value
892 * @param string $targetFile the file used for importing
893 * @return boolean
894 */
895 private function importFromPocket($targetFile)
896 {
897 # TODO gestion des articles favs
898 $html = new simple_html_dom();
899 $html->load_file($targetFile);
900 Tools::logm('starting import from pocket');
901
902 $read = 0;
903 $errors = array();
904 foreach($html->find('ul') as $ul)
905 {
906 foreach($ul->find('li') as $li)
907 {
908 $a = $li->find('a');
909 $url = new Url(base64_encode($a[0]->href));
910 $this->action('add', $url, 0, TRUE);
911 $sequence = '';
912 if (STORAGE == 'postgres') {
913 $sequence = 'entries_id_seq';
914 }
915 $last_id = $this->store->getLastId($sequence);
916 if ($read == '1') {
917 $this->action('toggle_archive', $url, $last_id, TRUE);
918 }
919 $tags = $a[0]->tags;
920 if(!empty($tags)) {
921 $this->action('add_tag',$url,$last_id,true,false,$tags);
922 }
923 }
924
925 # the second <ul> is for read links
926 $read = 1;
927 }
928
929 $unlink = unlink($targetFile);
930 $this->messages->add('s', _('import from pocket completed. You have to execute the cron to fetch content.'));
931 Tools::logm('import from pocket completed');
932 Tools::redirect();
933 }
934
935 /**
936 * import from Readability. poche needs a ./readability file
937 * @todo add the return value
938 * @param string $targetFile the file used for importing
939 * @return boolean
940 */
941 private function importFromReadability($targetFile)
942 {
943 # TODO gestion des articles lus / favs
944 $str_data = file_get_contents($targetFile);
945 $data = json_decode($str_data,true);
946 Tools::logm('starting import from Readability');
947 $count = 0;
948 foreach ($data as $key => $value) {
949 $url = NULL;
950 $favorite = FALSE;
951 $archive = FALSE;
952 foreach ($value as $item) {
953 foreach ($item as $attr => $value) {
954 if ($attr == 'article__url') {
955 $url = new Url(base64_encode($value));
956 }
957 $sequence = '';
958 if (STORAGE == 'postgres') {
959 $sequence = 'entries_id_seq';
960 }
961 if ($value == 'true') {
962 if ($attr == 'favorite') {
963 $favorite = TRUE;
964 }
965 if ($attr == 'archive') {
966 $archive = TRUE;
967 }
968 }
969 }
970
971 # we can add the url
972 if (!is_null($url) && $url->isCorrect()) {
973 $this->action('add', $url, 0, TRUE);
974 $count++;
975 if ($favorite) {
976 $last_id = $this->store->getLastId($sequence);
977 $this->action('toggle_fav', $url, $last_id, TRUE);
978 }
979 if ($archive) {
980 $last_id = $this->store->getLastId($sequence);
981 $this->action('toggle_archive', $url, $last_id, TRUE);
982 }
983 }
984 }
985 }
986
987 unlink($targetFile);
988 $this->messages->add('s', _('import from Readability completed. You have to execute the cron to fetch content.'));
989 Tools::logm('import from Readability completed');
990 Tools::redirect();
991 }
992
993 /**
994 * import from Poche exported file
995 * @param string $targetFile the file used for importing
996 * @return boolean
997 */
998 private function importFromPoche($targetFile)
999 {
1000 $str_data = file_get_contents($targetFile);
1001 $data = json_decode($str_data,true);
1002 Tools::logm('starting import from Poche');
1003
1004
1005 $sequence = '';
1006 if (STORAGE == 'postgres') {
1007 $sequence = 'entries_id_seq';
1008 }
1009
1010 $count = 0;
1011 foreach ($data as $value) {
1012
1013 $url = new Url(base64_encode($value['url']));
1014 $favorite = ($value['is_fav'] == -1);
1015 $archive = ($value['is_read'] == -1);
1016
1017 # we can add the url
1018 if (!is_null($url) && $url->isCorrect()) {
1019
1020 $this->action('add', $url, 0, TRUE);
1021
1022 $count++;
1023 if ($favorite) {
1024 $last_id = $this->store->getLastId($sequence);
1025 $this->action('toggle_fav', $url, $last_id, TRUE);
1026 }
1027 if ($archive) {
1028 $last_id = $this->store->getLastId($sequence);
1029 $this->action('toggle_archive', $url, $last_id, TRUE);
1030 }
1031 }
1032
1033 }
1034
1035 unlink($targetFile);
1036 $this->messages->add('s', _('import from Poche completed. You have to execute the cron to fetch content.'));
1037 Tools::logm('import from Poche completed');
1038 Tools::redirect();
1039 }
1040
1041 /**
1042 * import datas into your poche 822 * import datas into your poche
1043 * @return boolean 823 * @return boolean
1044 */ 824 */
1045 public function import() { 825 public function import() {
1046 826
827 if (!defined('IMPORT_LIMIT')) {
828 define('IMPORT_LIMIT', 5);
829 }
830 if (!defined('IMPORT_DELAY')) {
831 define('IMPORT_DELAY', 5);
832 }
833
1047 if ( isset($_FILES['file']) ) { 834 if ( isset($_FILES['file']) ) {
1048 // assume, that file is in json format 835 // assume, that file is in json format
1049 $str_data = file_get_contents($_FILES['file']['tmp_name']); 836 $str_data = file_get_contents($_FILES['file']['tmp_name']);
@@ -1073,21 +860,26 @@ class Poche
1073 } 860 }
1074 } 861 }
1075 862
863 //for readability structure
864 foreach ($data as $record) {
865 if (is_array($record)) {
866 $data[] = $record;
867 foreach ($record as $record2) {
868 if (is_array($record2)) {
869 $data[] = $record2;
870 }
871 }
872 }
873 }
874
1076 $i = 0; //counter for articles inserted 875 $i = 0; //counter for articles inserted
1077 foreach ($data as $record) { 876 foreach ($data as $record) {
1078 //echo '<pre>'; 877 $url = trim( isset($record['article__url']) ? $record['article__url'] : (isset($record['url']) ? $record['url'] : '') );
1079 //var_dump($record);
1080 // foreach ($record as $key=>$val) {
1081 // echo "\n=================\n$i: $key: $val\n";
1082 // }
1083 // exit;
1084
1085 $url = trim($record['url']);
1086 if ( $url ) { 878 if ( $url ) {
1087 $title = (isset($record['title']) ? $record['title'] : _('Untitled - Import - ').'</a> <a href="./?import">'._('click to finish import').'</a><a>'); 879 $title = (isset($record['title']) ? $record['title'] : _('Untitled - Import - ').'</a> <a href="./?import">'._('click to finish import').'</a><a>');
1088 $body = (isset($record['content']) ? $record['content'] : ''); 880 $body = (isset($record['content']) ? $record['content'] : '');
1089 $isRead = (isset($record['is_read']) ? intval($record['is_read']) : 0); 881 $isRead = (isset($record['is_read']) ? intval($record['is_read']) : (isset($record['archive'])?intval($record['archive']):0));
1090 $isFavorite = (isset($record['is_fav']) ? intval($record['is_fav']) : 0); 882 $isFavorite = (isset($record['is_fav']) ? intval($record['is_fav']) : (isset($record['favorite'])?intval($record['favorite']):0) );
1091 //insert new record 883 //insert new record
1092 $id = $this->store->add($url, $title, $body, $this->user->getId(), $isFavorite, $isRead); 884 $id = $this->store->add($url, $title, $body, $this->user->getId(), $isFavorite, $isRead);
1093 if ( $id ) { 885 if ( $id ) {
@@ -1146,22 +938,6 @@ class Poche
1146 return array('includeImport'=>true, 'import'=>array('recordsDownloadRequired'=>$recordsDownloadRequired, 'recordsUnderDownload'=> IMPORT_LIMIT, 'delay'=> IMPORT_DELAY * 1000) ); 938 return array('includeImport'=>true, 'import'=>array('recordsDownloadRequired'=>$recordsDownloadRequired, 'recordsUnderDownload'=> IMPORT_LIMIT, 'delay'=> IMPORT_DELAY * 1000) );
1147 } 939 }
1148 940
1149 public function uploadFile() {
1150 if (isset($_FILES['file']))
1151 {
1152 $dir = CACHE . '/';
1153 $file = basename($_FILES['file']['name']);
1154 if(move_uploaded_file($_FILES['file']['tmp_name'], $dir . $file)) {
1155 $this->messages->add('s', _('File uploaded. You can now execute import.'));
1156 }
1157 else {
1158 $this->messages->add('e', _('Error while importing file. Do you have access to upload it?'));
1159 }
1160 }
1161
1162 Tools::redirect('?view=config');
1163 }
1164
1165 /** 941 /**
1166 * export poche entries in json 942 * export poche entries in json
1167 * @return json all poche entries 943 * @return json all poche entries