X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=inc%2Fpoche%2FPoche.class.php;h=09a9f5ff85276423a29b505312d2f1cec66ead8a;hb=refs%2Fpull%2F722%2Fhead;hp=613377c629f9711bae29472fe4ac8edf0ca1fde2;hpb=a8ef1f3f43236908fdabebf795cf7de370b538ec;p=github%2Fwallabag%2Fwallabag.git diff --git a/inc/poche/Poche.class.php b/inc/poche/Poche.class.php index 613377c6..09a9f5ff 100755 --- a/inc/poche/Poche.class.php +++ b/inc/poche/Poche.class.php @@ -72,7 +72,7 @@ class Poche # l10n $language = $this->user->getConfigValue('language'); - putenv('LC_ALL=' . $language); + @putenv('LC_ALL=' . $language); setlocale(LC_ALL, $language); bindtextdomain($language, LOCALE); textdomain($language); @@ -101,7 +101,7 @@ class Poche public function configFileIsAvailable() { if (! self::$configFileAvailable) { - $this->notInstalledMessage[] = 'You have to rename inc/poche/config.inc.php.new to inc/poche/config.inc.php.'; + $this->notInstalledMessage[] = 'You have to copy (don\'t just rename!) inc/poche/config.inc.default.php to inc/poche/config.inc.php.'; return false; } @@ -242,6 +242,58 @@ class Poche $this->tpl->addFilter($filter); } + public function createNewUser() { + if (isset($_GET['newuser'])){ + if ($_POST['newusername'] != "" && $_POST['password4newuser'] != ""){ + $newusername = filter_var($_POST['newusername'], FILTER_SANITIZE_STRING); + if (!$this->store->userExists($newusername)){ + if ($this->store->install($newusername, Tools::encodeString($_POST['password4newuser'] . $newusername))) { + Tools::logm('The new user '.$newusername.' has been installed'); + $this->messages->add('s', sprintf(_('The new user %s has been installed. Do you want to logout ?'),$newusername)); + Tools::redirect(); + } + else { + Tools::logm('error during adding new user'); + Tools::redirect(); + } + } + else { + $this->messages->add('e', sprintf(_('Error : An user with the name %s already exists !'),$newusername)); + Tools::logm('An user with the name '.$newusername.' already exists !'); + Tools::redirect(); + } + } + } + } + + public function deleteUser(){ + if (isset($_GET['deluser'])){ + if ($this->store->listUsers() > 1) { + if (Tools::encodeString($_POST['password4deletinguser'].$this->user->getUsername()) == $this->store->getUserPassword($this->user->getId())) { + $username = $this->user->getUsername(); + $this->store->deleteUserConfig($this->user->getId()); + Tools::logm('The configuration for user '. $username .' has been deleted !'); + $this->store->deleteTagsEntriesAndEntries($this->user->getId()); + Tools::logm('The entries for user '. $username .' has been deleted !'); + $this->store->deleteUser($this->user->getId()); + Tools::logm('User '. $username .' has been completely deleted !'); + Session::logout(); + Tools::logm('logout'); + Tools::redirect(); + $this->messages->add('s', sprintf(_('User %s has been successfully deleted !'),$newusername)); + } + else { + Tools::logm('Bad password !'); + $this->messages->add('e', _('Error : The password is wrong !')); + } + } + else { + Tools::logm('Only user !'); + $this->messages->add('e', _('Error : You are the only user, you cannot delete your account !')); + } + } + } + private function install() { Tools::logm('poche still not installed'); @@ -373,9 +425,7 @@ class Poche $body = $content['rss']['channel']['item']['description']; // clean content from prevent xss attack - $config = HTMLPurifier_Config::createDefault(); - $config->set('Cache.SerializerPath', CACHE); - $purifier = new HTMLPurifier($config); + $purifier = $this->getPurifier(); $title = $purifier->purify($title); $body = $purifier->purify($body); @@ -436,12 +486,24 @@ class Poche case 'toggle_fav' : $this->store->favoriteById($id, $this->user->getId()); Tools::logm('mark as favorite link #' . $id); - Tools::redirect(); + if ( Tools::isAjaxRequest() ) { + echo 1; + exit; + } + else { + Tools::redirect(); + } break; case 'toggle_archive' : $this->store->archiveById($id, $this->user->getId()); Tools::logm('archive link #' . $id); - Tools::redirect(); + if ( Tools::isAjaxRequest() ) { + echo 1; + exit; + } + else { + Tools::redirect(); + } break; case 'archive_all' : $this->store->archiveAll($this->user->getId()); @@ -449,42 +511,55 @@ class Poche Tools::redirect(); break; case 'add_tag' : - $tags = explode(',', $_POST['value']); - $entry_id = $_POST['entry_id']; - $entry = $this->store->retrieveOneById($entry_id, $this->user->getId()); - if (!$entry) { - $this->messages->add('e', _('Article not found!')); - Tools::logm('error : article not found'); - Tools::redirect(); - } - //get all already set tags to preven duplicates - $already_set_tags = array(); - $entry_tags = $this->store->retrieveTagsByEntry($entry_id); - foreach ($entry_tags as $tag) { - $already_set_tags[] = $tag['value']; + if (isset($_GET['search'])) { + //when we want to apply a tag to a search + $tags = array($_GET['search']); + $allentry_ids = $this->store->search($tags[0], $this->user->getId()); + $entry_ids = array(); + foreach ($allentry_ids as $eachentry) { + $entry_ids[] = $eachentry[0]; + } + } else { //add a tag to a single article + $tags = explode(',', $_POST['value']); + $entry_ids = array($_POST['entry_id']); } - foreach($tags as $key => $tag_value) { - $value = trim($tag_value); - if ($value && !in_array($value, $already_set_tags)) { - $tag = $this->store->retrieveTagByValue($value); - - if (is_null($tag)) { - # we create the tag - $tag = $this->store->createTag($value); - $sequence = ''; - if (STORAGE == 'postgres') { - $sequence = 'tags_id_seq'; + foreach($entry_ids as $entry_id) { + $entry = $this->store->retrieveOneById($entry_id, $this->user->getId()); + if (!$entry) { + $this->messages->add('e', _('Article not found!')); + Tools::logm('error : article not found'); + Tools::redirect(); + } + //get all already set tags to preven duplicates + $already_set_tags = array(); + $entry_tags = $this->store->retrieveTagsByEntry($entry_id); + foreach ($entry_tags as $tag) { + $already_set_tags[] = $tag['value']; + } + foreach($tags as $key => $tag_value) { + $value = trim($tag_value); + if ($value && !in_array($value, $already_set_tags)) { + $tag = $this->store->retrieveTagByValue($value); + if (is_null($tag)) { + # we create the tag + $tag = $this->store->createTag($value); + $sequence = ''; + if (STORAGE == 'postgres') { + $sequence = 'tags_id_seq'; + } + $tag_id = $this->store->getLastId($sequence); + } + else { + $tag_id = $tag['id']; } - $tag_id = $this->store->getLastId($sequence); - } - else { - $tag_id = $tag['id']; - } - - # we assign the tag to the article - $this->store->setTagToEntry($tag_id, $entry_id); + + # we assign the tag to the article + $this->store->setTagToEntry($tag_id, $entry_id); + } } } + $this->messages->add('s', _('The tag has been applied successfully')); + Tools::logm('The tag has been applied successfully'); Tools::redirect(); break; case 'remove_tag' : @@ -496,6 +571,11 @@ class Poche Tools::redirect(); } $this->store->removeTagForEntry($id, $tag_id); + Tools::logm('tag entry deleted'); + if ($this->store->cleanUnusedTag($tag_id)) { + Tools::logm('tag deleted'); + } + $this->messages->add('s', _('The tag has been successfully deleted')); Tools::redirect(); break; default: @@ -522,6 +602,7 @@ class Poche $languages = $this->getInstalledLanguages(); $token = $this->user->getConfigValue('token'); $http_auth = (isset($_SERVER['PHP_AUTH_USER']) || isset($_SERVER['REMOTE_USER'])) ? true : false; + $only_user = ($this->store->listUsers() > 1) ? false : true; $tpl_vars = array( 'themes' => $themes, 'languages' => $languages, @@ -534,6 +615,7 @@ class Poche 'token' => $token, 'user_id' => $this->user->getId(), 'http_auth' => $http_auth, + 'only_user' => $only_user ); Tools::logm('config view'); break; @@ -824,14 +906,9 @@ class Poche */ public function import() { - if (!defined('IMPORT_LIMIT')) { - define('IMPORT_LIMIT', 5); - } - if (!defined('IMPORT_DELAY')) { - define('IMPORT_DELAY', 5); - } - if ( isset($_FILES['file']) ) { + Tools::logm('Import stated: parsing file'); + // assume, that file is in json format $str_data = file_get_contents($_FILES['file']['tmp_name']); $data = json_decode($str_data, true); @@ -897,6 +974,7 @@ class Poche if ( $i > 0 ) { $this->messages->add('s', _('Articles inserted: ').$i._('. Please note, that some may be marked as "read".')); } + Tools::logm('Import of articles finished: '.$i.' articles added (w/o content if not provided).'); } //file parsing finished here @@ -907,20 +985,21 @@ class Poche if ( $recordsDownloadRequired == 0 ) { //nothing to download $this->messages->add('s', _('Import finished.')); + Tools::logm('Import finished completely'); Tools::redirect(); } else { //if just inserted - don't download anything, download will start in next reload if ( !isset($_FILES['file']) ) { //download next batch + Tools::logm('Fetching next batch of articles...'); $items = $this->store->retrieveUnfetchedEntries($this->user->getId(), IMPORT_LIMIT); - $config = HTMLPurifier_Config::createDefault(); - $config->set('Cache.SerializerPath', CACHE); - $purifier = new HTMLPurifier($config); + $purifier = $this->getPurifier(); foreach ($items as $item) { $url = new Url(base64_encode($item['url'])); + Tools::logm('Fetching article '.$item['id']); $content = Tools::getPageContent($url); $title = (($content['rss']['channel']['item']['title'] != '') ? $content['rss']['channel']['item']['title'] : _('Untitled')); @@ -931,6 +1010,7 @@ class Poche $body = $purifier->purify($body); $this->store->updateContentAndTitle($item['id'], $title, $body, $this->user->getId()); + Tools::logm('Article '.$item['id'].' updated.'); } } @@ -1003,11 +1083,10 @@ class Poche $config = $this->store->getConfigUser($user_id); if ($config == null) { - die(_('User with this id (' . $user_id . ') does not exist.')); + die(sprintf(_('User with this id (%d) does not exist.'), $user_id)); } - if (!in_array($type, $allowed_types) || - $token != $config['token']) { + if (!in_array($type, $allowed_types) || $token != $config['token']) { die(_('Uh, there is a problem while generating feeds.')); } // Check the token @@ -1057,4 +1136,132 @@ class Poche $this->messages->add('s', _('Cache deleted.')); Tools::redirect(); } + + /** + * return new purifier object with actual config + */ + protected function getPurifier() { + $config = HTMLPurifier_Config::createDefault(); + $config->set('Cache.SerializerPath', CACHE); + $config->set('HTML.SafeIframe', true); + + //allow YouTube, Vimeo and dailymotion videos + $config->set('URI.SafeIframeRegexp', '%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/|www\.dailymotion\.com/embed/video/)%'); + + return new HTMLPurifier($config); + } + + /** + * handle epub + */ + public function createEpub() { + + switch ($_GET['method']) { + case 'id': + $entryID = filter_var($_GET['id'],FILTER_SANITIZE_NUMBER_INT); + $entry = $this->store->retrieveOneById($entryID, $this->user->getId()); + $entries = array($entry); + $bookTitle = $entry['title']; + $bookFileName = substr($bookTitle, 0, 200); + break; + case 'all': + $entries = $this->store->retrieveAll($this->user->getId()); + $bookTitle = sprintf(_('All my articles on '), date(_('d.m.y'))); #translatable because each country has it's own date format system + $bookFileName = _('Allarticles') . date(_('dmY')); + break; + case 'tag': + $tag = filter_var($_GET['tag'],FILTER_SANITIZE_STRING); + $tags_id = $this->store->retrieveAllTags($this->user->getId(),$tag); + $tag_id = $tags_id[0]["id"]; // we take the first result, which is supposed to match perfectly. There must be a workaround. + $entries = $this->store->retrieveEntriesByTag($tag_id,$this->user->getId()); + $bookTitle = sprintf(_('Articles tagged %s'),$tag); + $bookFileName = substr(sprintf(_('Tag %s'),$tag), 0, 200); + break; + case 'category': + $category = filter_var($_GET['category'],FILTER_SANITIZE_STRING); + $entries = $this->store->getEntriesByView($category,$this->user->getId()); + $bookTitle = sprintf(_('All articles in category %s'), $category); + $bookFileName = substr(sprintf(_('Category %s'),$category), 0, 200); + break; + case 'search': + $search = filter_var($_GET['search'],FILTER_SANITIZE_STRING); + $entries = $this->store->search($search,$this->user->getId()); + $bookTitle = sprintf(_('All articles for search %s'), $search); + $bookFileName = substr(sprintf(_('Search %s'), $search), 0, 200); + break; + case 'default': + die(_('Uh, there is a problem while generating epub.')); + + } + + $content_start = + "\n" + . "\n" + . "
" + . "\n" + . "' . _('Produced by wallabag with PHPePub') . '
'. _('Please open an issue if you have trouble with the display of this E-Book on your device.') . '