# l10n
$language = $this->user->getConfigValue('language');
- putenv('LC_ALL=' . $language);
+ @putenv('LC_ALL=' . $language);
setlocale(LC_ALL, $language);
bindtextdomain($language, LOCALE);
textdomain($language);
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;
}
$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 <a href="?logout">logout ?</a>'),$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');
$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);
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());
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);
}
- $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);
+ else {
+ $tag_id = $tag['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::redirect();
break;
case 'remove_tag' :
Tools::redirect();
}
$this->store->removeTagForEntry($id, $tag_id);
+ Tools::logm('tag entry deleted');
+ $this->store->cleanUnusedTags();
+ Tools::logm('old tags cleaned');
+ $this->messages->add('s', _('The tag has been successfully deleted'));
Tools::redirect();
break;
default:
$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,
'token' => $token,
'user_id' => $this->user->getId(),
'http_auth' => $http_auth,
+ 'only_user' => $only_user
);
Tools::logm('config view');
break;
*/
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);
foreach ($html->find($list) as $ul) {
foreach ($ul->find('li') as $li) {
$tmpEntry = array();
- $a = $li->find('a');
- $tmpEntry['url'] = $a[0]->href;
- $tmpEntry['tags'] = $a[0]->tags;
- $tmpEntry['is_read'] = $read;
- if ($tmpEntry['url']) {
- $data[] = $tmpEntry;
- }
+ $a = $li->find('a');
+ $tmpEntry['url'] = $a[0]->href;
+ $tmpEntry['tags'] = $a[0]->tags;
+ $tmpEntry['is_read'] = $read;
+ if ($tmpEntry['url']) {
+ $data[] = $tmpEntry;
+ }
}
# the second <ol/ul> is for read links
$read = ((sizeof($data) && $read)?0:1);
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
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'));
$body = $purifier->purify($body);
$this->store->updateContentAndTitle($item['id'], $title, $body, $this->user->getId());
+ Tools::logm('Article '.$item['id'].' updated.');
}
}
* export poche entries in json
* @return json all poche entries
*/
- public function export()
- {
- $filename = "wallabag-export-".$this->user->getId()."-".date("Y-m-d").".json";
- header('Content-Disposition: attachment; filename='.$filename);
-
- $entries = $this->store->retrieveAll($this->user->getId());
- echo $this->tpl->render('export.twig', array(
- 'export' => Tools::renderJson($entries),
- ));
- Tools::logm('export view');
+ public function export() {
+ $filename = "wallabag-export-".$this->user->getId()."-".date("Y-m-d").".json";
+ header('Content-Disposition: attachment; filename='.$filename);
+
+ $entries = $this->store->retrieveAll($this->user->getId());
+ echo $this->tpl->render('export.twig', array(
+ 'export' => Tools::renderJson($entries),
+ ));
+ Tools::logm('export view');
}
/**
* @param string $which 'prod' or 'dev'
* @return string latest $which version
*/
- private function getPocheVersion($which = 'prod')
- {
- $cache_file = CACHE . '/' . $which;
- $check_time = time();
-
- # checks if the cached version file exists
- if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 86400 ))) {
- $version = file_get_contents($cache_file);
- $check_time = filemtime($cache_file);
- } else {
- $version = file_get_contents('http://static.wallabag.org/versions/' . $which);
- file_put_contents($cache_file, $version, LOCK_EX);
- }
- return array($version, $check_time);
+ private function getPocheVersion($which = 'prod') {
+ $cache_file = CACHE . '/' . $which;
+ $check_time = time();
+
+ # checks if the cached version file exists
+ if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 86400 ))) {
+ $version = file_get_contents($cache_file);
+ $check_time = filemtime($cache_file);
+ } else {
+ $version = file_get_contents('http://static.wallabag.org/versions/' . $which);
+ file_put_contents($cache_file, $version, LOCK_EX);
+ }
+ return array($version, $check_time);
}
public function generateToken()
{
- if (ini_get('open_basedir') === '') {
- if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
- echo 'This is a server using Windows!';
- // alternative to /dev/urandom for Windows
- $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20);
- } else {
- $token = substr(base64_encode(file_get_contents('/dev/urandom', false, null, 0, 20)), 0, 15);
- }
- }
- else {
- $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20);
+ if (ini_get('open_basedir') === '') {
+ if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
+ echo 'This is a server using Windows!';
+ // alternative to /dev/urandom for Windows
+ $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20);
+ } else {
+ $token = substr(base64_encode(file_get_contents('/dev/urandom', false, null, 0, 20)), 0, 15);
}
+ }
+ else {
+ $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20);
+ }
- $token = str_replace('+', '', $token);
- $this->store->updateUserConfig($this->user->getId(), 'token', $token);
- $currentConfig = $_SESSION['poche_user']->config;
- $currentConfig['token'] = $token;
- $_SESSION['poche_user']->setConfig($currentConfig);
- Tools::redirect();
+ $token = str_replace('+', '', $token);
+ $this->store->updateUserConfig($this->user->getId(), 'token', $token);
+ $currentConfig = $_SESSION['poche_user']->config;
+ $currentConfig['token'] = $token;
+ $_SESSION['poche_user']->setConfig($currentConfig);
+ Tools::redirect();
}
public function generateFeeds($token, $user_id, $tag_id, $type = 'home')
foreach ($entries as $entry) {
$newItem = $feed->createNewItem();
$newItem->setTitle($entry['title']);
+ $newItem->setSource(Tools::getPocheUrl() . '?view=view&id=' . $entry['id']);
$newItem->setLink($entry['url']);
$newItem->setDate(time());
$newItem->setDescription($entry['content']);
$this->messages->add('s', _('Cache deleted.'));
Tools::redirect();
}
+
+ /**
+ * return new purifier object with actual config
+ */
+ protected function getPurifier() {
+ $config = HTMLPurifier_Config::createDefault();\r
+ $config->set('Cache.SerializerPath', CACHE);\r
+ $config->set('HTML.SafeIframe', true);\r
+ $config->set('URI.SafeIframeRegexp', '%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/)%'); //allow YouTube and Vimeo$purifier = new HTMLPurifier($config);
+\r
+ return new HTMLPurifier($config);
+ }
}